diff options
286 files changed, 28547 insertions, 13583 deletions
diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index cf3e91eb118..a443f5e090a 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -1461,7 +1461,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', @@ -1620,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', @@ -2580,6 +2582,31 @@ LOCK TABLES `item_instance` WRITE; 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/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_01.sql b/sql/updates/characters/2016_xx_xx_xx_characters_legion_01.sql new file mode 100644 index 00000000000..3cc4003e724 --- /dev/null +++ b/sql/updates/characters/2016_xx_xx_xx_characters_legion_01.sql @@ -0,0 +1,4 @@ +ALTER TABLE `characters` + ADD `customDisplay1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `facialStyle`, + ADD `customDisplay2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `customDisplay1`, + ADD `customDisplay3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `customDisplay2`; 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/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/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/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/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/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/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/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/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..b5a3512b1e1 --- /dev/null +++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql @@ -0,0 +1,2432 @@ +-- +-- 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_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 `PlayerModelScale` float NOT NULL DEFAULT '0' AFTER `CreatureModelScale`, + DROP `TextureVariation1`, + DROP `TextureVariation2`, + DROP `TextureVariation3`, + MODIFY `PortraitTextureName` text AFTER `PlayerModelScale`, + 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 `PlayerModelScale`, + 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 `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`, + 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`; + +-- +-- 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_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` + 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 (`SpellPowerID`); + +-- +-- 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`, + 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/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/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/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/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/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/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/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/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/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/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_11.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_11.sql new file mode 100644 index 00000000000..ac0e9d5a81b --- /dev/null +++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_11.sql @@ -0,0 +1,13 @@ +ALTER TABLE `item_upgrade` + CHANGE `CurrencyCost` `CurrencyCost` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + CHANGE `PrevItemUpgradeID` `PrevItemUpgradeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyCost`, + CHANGE `CurrencyID` `CurrencyID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PrevItemUpgradeID`, + CHANGE `ItemUpgradePathID` `ItemUpgradePathID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyID`, + CHANGE `ItemLevelBonus` `ItemLevelBonus` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemUpgradePathID`; + +ALTER TABLE `ruleset_item_upgrade` + CHANGE `ItemID` `ItemID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + CHANGE `ItemUpgradeID` `ItemUpgradeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemID`, + DROP `RulesetID`; + +ALTER TABLE `skill_line_ability` CHANGE `AquireMethod` `AcquireMethod` tinyint(3) unsigned NOT NULL DEFAULT '0'; 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/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..5614bf76476 --- /dev/null +++ b/sql/updates/world/2016_xx_xx_xx_world_legion_01.sql @@ -0,0 +1,6 @@ +ALTER TABLE `page_text` + ADD `PlayerConditionID` int(11) NOT NULL DEFAULT '0' AFTER `NextPageID`, + ADD `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PlayerConditionID`; + +UPDATE `gameobject_template` SET `Data8`=`Data8`^1 WHERE `type`=0; +UPDATE `gameobject_template` SET `flags`=`flags`|0x00100000 WHERE `type`=15; diff --git a/sql/updates/world/2016_xx_xx_xx_world_legion_02.sql b/sql/updates/world/2016_xx_xx_xx_world_legion_02.sql new file mode 100644 index 00000000000..c4b7fca6d19 --- /dev/null +++ b/sql/updates/world/2016_xx_xx_xx_world_legion_02.sql @@ -0,0 +1,14 @@ +ALTER TABLE `quest_template` + CHANGE `RewardDisplaySpell` `RewardDisplaySpell1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardBonusMoney`, + ADD `RewardDisplaySpell2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardDisplaySpell1`, + ADD `RewardDisplaySpell3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardDisplaySpell2`, + ADD `RewardArtifactXPDifficulty` int(10) unsigned NOT NULL DEFAULT '0' AFTER `StartItem`, + ADD `RewardArtifactXPMultiplier` float NOT NULL DEFAULT '1' AFTER `RewardArtifactXPDifficulty`, + ADD `RewardArtifactCategoryID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardArtifactXPMultiplier`, + DROP `RewardTalents`, + ADD `RewardFactionCapIn1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardFactionOverride1`, + ADD `RewardFactionCapIn2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardFactionOverride2`, + ADD `RewardFactionCapIn3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardFactionOverride3`, + ADD `RewardFactionCapIn4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardFactionOverride4`, + ADD `RewardFactionCapIn5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RewardFactionOverride5`, + ADD `QuestRewardID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AllowableRaces`; diff --git a/src/common/Define.h b/src/common/Define.h index 35a4dad3e1b..784bb4dd8ca 100644 --- a/src/common/Define.h +++ b/src/common/Define.h @@ -159,18 +159,12 @@ 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_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_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 580243f0d51..8ca023b1856 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" +#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.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); @@ -44,20 +48,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,11 +79,11 @@ 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, " + "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); @@ -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 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); @@ -126,8 +130,10 @@ 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_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); @@ -136,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 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 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); @@ -159,11 +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 = ?, 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, 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, " + "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); @@ -195,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", 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 (?, ?, ?, ?, ?) " @@ -261,6 +274,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) " @@ -386,20 +407,20 @@ 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, " + "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); - PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,skin=?,face=?,hairStyle=?,hairColor=?,facialStyle=?,bankSlots=?,restState=?,playerFlags=?," + "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); @@ -429,7 +450,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); @@ -443,7 +463,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 +486,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, entranceId 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); @@ -549,9 +569,9 @@ 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_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); @@ -575,12 +595,11 @@ 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); 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 459b0dfe98d..e58debb7939 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -109,8 +109,8 @@ 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_GLYPHS, CHAR_SEL_CHARACTER_TALENTS, CHAR_SEL_CHARACTER_SKILLS, CHAR_SEL_CHARACTER_RANDOMBG, @@ -144,6 +144,12 @@ 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_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, @@ -217,6 +223,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, @@ -346,7 +356,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, @@ -465,9 +474,9 @@ 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_GLYPHS, CHAR_DEL_CHAR_TALENT, CHAR_DEL_CHAR_SKILLS, CHAR_UPD_CHAR_MONEY, @@ -494,7 +503,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 c6b03dbf385..beff06ff757 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -31,132 +31,253 @@ 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 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 + 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); + // 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, " + "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 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); + // 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); + + // 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, Type, DisplayName, Description, CostModifier, 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); // 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 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 - 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); + + // 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, 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, 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); + // 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); + + // CharTitles.db2 + 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 + 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 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 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, 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 + 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); + // 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, " + "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, " + "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 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, 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 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, 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, 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, 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, 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 - 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); + + // 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, 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); + + // 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); + // Emotes.db2 + 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, 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, " + "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 + 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, 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 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); - // 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); + // GameobjectDisplayInfo.db2 + 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); // GarrAbility.db2 - PrepareStatement(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Flags, Name, Description, IconFileDataID, 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, 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, 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, GarrBuildingID, UiTextureAtlasMemberID, GarrSiteLevelPlotInstID, " - "LandmarkOffsetX, LandmarkOffsetY 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" + 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, FollowerTypeID, HordeCreatureID, AllianceCreatureID, 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); + 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 @@ -164,43 +285,55 @@ 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, SiteID, UpgradeResourceCost, UpgradeMoneyCost, Level, " + "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); + // GemProperties.db2 + 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); + + // 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 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 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 - 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,123 +348,212 @@ 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, 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, " + "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); + // 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); + // 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, 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`" + 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 - 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); + 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); + + // 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" + " 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); // 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, 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); // 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 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); - // ItemUpgrade.db2 - PrepareStatement(HOTFIX_SEL_ITEM_UPGRADE, "SELECT ID, ItemUpgradePathID, ItemLevelBonus, PrevItemUpgradeID, CurrencyID, CurrencyCost" + PrepareStatement(HOTFIX_SEL_ITEM_UPGRADE, "SELECT ID, CurrencyCost, PrevItemUpgradeID, CurrencyID, ItemUpgradePathID, ItemLevelBonus" " FROM item_upgrade 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); // 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); + + // LfgDungeons.db2 + 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 + 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, 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 + 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); + // Map.db2 + 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 + 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, 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 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, Flags, RequiredRidingSkill, RequiredArea, RequiredAura, RequiredSpell, SpeedModSpell, " - "RequiredMap 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, 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); @@ -347,38 +569,53 @@ 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); + + // 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); // 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, 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, 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, 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 + 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, " + "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); + 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 @@ -387,119 +624,216 @@ 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); + // RulesetItemUpgrade.db2 - PrepareStatement(HOTFIX_SEL_RULESET_ITEM_UPGRADE, "SELECT ID, RulesetID, ItemUpgradeID, ItemID FROM ruleset_item_upgrade ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_RULESET_ITEM_UPGRADE, "SELECT ID, ItemID, ItemUpgradeID FROM ruleset_item_upgrade 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); - // 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); + // 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, SupercedesSpell, Unknown703, SkillLine, MinSkillLineRank, " + "TrivialSkillLineRankHigh, TrivialSkillLineRankLow, UniqueBit, TradeSkillCategoryID, AcquireMethod, NumSkillUps, ClassMask" + " FROM skill_line_ability ORDER BY ID DESC", CONNECTION_SYNCH); + + // SkillRaceClassInfo.db2 + 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 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, SpecID, OrderIndex, SpellID, OverridesSpellID, Description" + 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); - // 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 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); - // 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, 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, 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, " + "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" + " 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 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" + " 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); + + // SpellItemEnchantment.db2 + PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, EffectSpellID1, EffectSpellID2, EffectSpellID3, Name, EffectScalingPoints1, " + "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); + // SpellLevels.db2 + 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, " - "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 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); // 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 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" - " ORDER BY ID DESC", CONNECTION_SYNCH); + // SpellScaling.db2 + 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, " + "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, 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, TargetCreatureType, DifficultyID, " + "MaxAffectedTargets, MaxTargetLevel 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, " - "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); + + // 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, 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 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, 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 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, 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 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 @@ -510,15 +844,53 @@ 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, RegenerationPeace, RegenerationCombat, FileDataID1, FileDataID2, FileDataID3, " + "FileDataID4, FileDataID5, FileDataID6, Color1, Color2, Color3, Color4, Color5, Color6, Name, Cost, OutOfError, ToolTip, StartInset, " + "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); + // 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, 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 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 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, MapAreaID, AreaID1, AreaID2, AreaID3, AreaID4, TextureName, TextureWidth, " - "TextureHeight, OffsetX, OffsetY, HitRectTop, HitRectLeft, HitRectBottom, HitRectRight, PlayerConditionID 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); - 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, 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); + 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 cb45187e275..4fc4d796f58 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -35,11 +35,24 @@ enum HotfixDatabaseStatements HOTFIX_SEL_ACHIEVEMENT, HOTFIX_SEL_ACHIEVEMENT_LOCALE, + HOTFIX_SEL_ANIM_KIT, + 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, HOTFIX_SEL_AUCTION_HOUSE_LOCALE, + HOTFIX_SEL_BANK_BAG_SLOT_PRICES, + + HOTFIX_SEL_BANNED_ADDONS, + HOTFIX_SEL_BARBER_SHOP_STYLE, HOTFIX_SEL_BARBER_SHOP_STYLE_LOCALE, @@ -52,17 +65,43 @@ 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, + HOTFIX_SEL_CHAR_TITLES_LOCALE, + + 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, + HOTFIX_SEL_CHR_RACES_LOCALE, + + HOTFIX_SEL_CHR_SPECIALIZATION, + HOTFIX_SEL_CHR_SPECIALIZATION_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_FAMILY, + HOTFIX_SEL_CREATURE_FAMILY_LOCALE, + + HOTFIX_SEL_CREATURE_MODEL_DATA, HOTFIX_SEL_CREATURE_TYPE, HOTFIX_SEL_CREATURE_TYPE_LOCALE, @@ -79,13 +118,32 @@ 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_FACTION, + HOTFIX_SEL_FACTION_LOCALE, + + HOTFIX_SEL_FACTION_TEMPLATE, + HOTFIX_SEL_GAMEOBJECTS, HOTFIX_SEL_GAMEOBJECTS_LOCALE, - HOTFIX_SEL_GAME_TABLES, - HOTFIX_SEL_GAME_TABLES_LOCALE, + HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO, HOTFIX_SEL_GARR_ABILITY, HOTFIX_SEL_GARR_ABILITY_LOCALE, @@ -115,7 +173,15 @@ enum HotfixDatabaseStatements HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST, - HOTFIX_SEL_GLYPH_SLOT, + HOTFIX_SEL_GEM_PROPERTIES, + + HOTFIX_SEL_GLYPH_PROPERTIES, + + HOTFIX_SEL_GUILD_COLOR_BACKGROUND, + + HOTFIX_SEL_GUILD_COLOR_BORDER, + + HOTFIX_SEL_GUILD_COLOR_EMBLEM, HOTFIX_SEL_GUILD_PERK_SPELLS, @@ -123,7 +189,6 @@ enum HotfixDatabaseStatements HOTFIX_SEL_HEIRLOOM_LOCALE, HOTFIX_SEL_HOLIDAYS, - HOTFIX_SEL_HOLIDAYS_LOCALE, HOTFIX_SEL_IMPORT_PRICE_ARMOR, @@ -133,8 +198,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, @@ -142,14 +218,24 @@ 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, + + 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 +251,14 @@ 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, + + HOTFIX_SEL_ITEM_SET_SPELL, + HOTFIX_SEL_ITEM_SPARSE, HOTFIX_SEL_ITEM_SPARSE_LOCALE, @@ -172,17 +266,31 @@ enum HotfixDatabaseStatements HOTFIX_SEL_ITEM_SPEC_OVERRIDE, - HOTFIX_SEL_ITEM_TO_BATTLE_PET_SPECIES, - HOTFIX_SEL_ITEM_UPGRADE, 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, HOTFIX_SEL_MAIL_TEMPLATE_LOCALE, + HOTFIX_SEL_MAP, + HOTFIX_SEL_MAP_LOCALE, + + HOTFIX_SEL_MAP_DIFFICULTY, + HOTFIX_SEL_MAP_DIFFICULTY_LOCALE, + HOTFIX_SEL_MODIFIER_TREE, HOTFIX_SEL_MOUNT, @@ -192,6 +300,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY, + HOTFIX_SEL_MOVIE, + HOTFIX_SEL_NAME_GEN, HOTFIX_SEL_NAME_GEN_LOCALE, @@ -203,11 +313,19 @@ enum HotfixDatabaseStatements HOTFIX_SEL_OVERRIDE_SPELL_DATA, + HOTFIX_SEL_PHASE, + HOTFIX_SEL_PHASE_X_PHASE_GROUP, HOTFIX_SEL_PLAYER_CONDITION, HOTFIX_SEL_PLAYER_CONDITION_LOCALE, + HOTFIX_SEL_POWER_DISPLAY, + + HOTFIX_SEL_PVP_DIFFICULTY, + + HOTFIX_SEL_QUEST_FACTION_REWARD, + HOTFIX_SEL_QUEST_MONEY_REWARD, HOTFIX_SEL_QUEST_PACKAGE_ITEM, @@ -219,30 +337,67 @@ enum HotfixDatabaseStatements HOTFIX_SEL_QUEST_XP, + HOTFIX_SEL_RAND_PROP_POINTS, + HOTFIX_SEL_RULESET_ITEM_UPGRADE, 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, + HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_LOCALE, + HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION, HOTFIX_SEL_SPELL_LEARN_SPELL, + HOTFIX_SEL_SPELL_LEVELS, + HOTFIX_SEL_SPELL_MISC, HOTFIX_SEL_SPELL_POWER, @@ -260,12 +415,24 @@ 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, HOTFIX_SEL_SPELL_X_SPELL_VISUAL, + HOTFIX_SEL_SUMMON_PROPERTIES, + + HOTFIX_SEL_TALENT, + HOTFIX_SEL_TALENT_LOCALE, + HOTFIX_SEL_TAXI_NODES, HOTFIX_SEL_TAXI_NODES_LOCALE, @@ -286,8 +453,21 @@ 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_OVERLAY_LOCALE, + + HOTFIX_SEL_WORLD_MAP_TRANSFORMS, + + HOTFIX_SEL_WORLD_SAFE_LOCS, + HOTFIX_SEL_WORLD_SAFE_LOCS_LOCALE, MAX_HOTFIXDATABASE_STATEMENTS }; 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/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/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.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/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 0a8f9d95871..1d0d061a6db 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; 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 8f2dfcda625..c8acd18671e 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; @@ -1501,6 +1500,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; @@ -2259,3 +2266,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 91bedbab44f..adabca54ac9 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/Addons/AddonMgr.cpp b/src/server/game/Addons/AddonMgr.cpp deleted file mode 100644 index c9aa3a7966a..00000000000 --- a/src/server/game/Addons/AddonMgr.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "AddonMgr.h" -#include "DatabaseEnv.h" -#include "DBCStores.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<SavedAddon> 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<uint8 const*>(name.c_str()), name.length(), addon.NameMD5); - MD5(reinterpret_cast<uint8 const*>(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 <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef _ADDONMGR_H -#define _ADDONMGR_H - -#include "Define.h" -#include <string> -#include <list> -#include <openssl/md5.h> - -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<BannedAddon> BannedAddonList; - BannedAddonList const* GetBannedAddons(); -} - -#endif diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index 9fcb66da1ce..bc764a33659 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" @@ -513,7 +512,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 +549,9 @@ AuctionHouseEntry const* AuctionHouseMgr::GetAuctionHouseEntry(uint32 factionTem } } + if (houseId) + *houseId = houseid; + return sAuctionHouseStore.LookupEntry(houseid); } @@ -658,8 +660,7 @@ void AuctionHouseObject::BuildListOwnerItems(WorldPackets::AuctionHouse::Auction } void AuctionHouseObject::BuildListAuctionItems(WorldPackets::AuctionHouse::AuctionListItemsResult& packet, Player* player, - std::wstring const& wsearchedname, uint32 listfrom, uint8 levelmin, uint8 levelmax, uint8 usable, - uint32 inventoryType, uint32 itemClass, uint32 itemSubClass, uint32 quality, uint32& totalcount) + std::wstring const& searchedname, uint32 listfrom, uint8 levelmin, uint8 levelmax, bool usable, Optional<AuctionSearchFilters> const& filters, uint32 quality) { time_t curTime = sWorld->GetGameTime(); @@ -675,15 +676,24 @@ void AuctionHouseObject::BuildListAuctionItems(WorldPackets::AuctionHouse::Aucti continue; ItemTemplate const* proto = item->GetTemplate(); + if (filters) + { + // if we dont want any class filters, Optional is not initialized + // if we dont want this class included, SubclassMask is set to FILTER_SKIP_CLASS + // if we want this class and did not specify and subclasses, its set to FILTER_SKIP_SUBCLASS + // otherwise full restrictions apply + if (filters->Classes[proto->GetClass()].SubclassMask == AuctionSearchFilters::FILTER_SKIP_CLASS) + continue; - if (itemClass != 0xffffffff && proto->GetClass() != itemClass) - continue; - - if (itemSubClass != 0xffffffff && proto->GetSubClass() != itemSubClass) - continue; + if (filters->Classes[proto->GetClass()].SubclassMask != AuctionSearchFilters::FILTER_SKIP_SUBCLASS) + { + if (!(filters->Classes[proto->GetClass()].SubclassMask & (1 << proto->GetSubClass()))) + continue; - if (inventoryType != 0xffffffff && proto->GetInventoryType() != InventoryType(inventoryType)) - continue; + if (!(filters->Classes[proto->GetClass()].InvTypes[proto->GetSubClass()] & (1 << proto->GetInventoryType()))) + continue; + } + } if (quality != 0xffffffff && proto->GetQuality() != quality) continue; @@ -691,12 +701,12 @@ void AuctionHouseObject::BuildListAuctionItems(WorldPackets::AuctionHouse::Aucti if (levelmin != 0 && (proto->GetBaseRequiredLevel() < levelmin || (levelmax != 0 && proto->GetBaseRequiredLevel() > levelmax))) continue; - if (usable != 0 && player->CanUseItem(item) != EQUIP_ERR_OK) + if (usable && player->CanUseItem(item) != EQUIP_ERR_OK) continue; // Allow search by suffix (ie: of the Monkey) or partial name (ie: Monkey) // No need to do any of this if no search term was entered - if (!wsearchedname.empty()) + if (!searchedname.empty()) { std::string name = proto->GetName(player->GetSession()->GetSessionDbcLocale()); if (name.empty()) @@ -739,15 +749,15 @@ void AuctionHouseObject::BuildListAuctionItems(WorldPackets::AuctionHouse::Aucti } // Perform the search (with or without suffix) - if (!Utf8FitTo(name, wsearchedname)) + if (!Utf8FitTo(name, searchedname)) continue; } // Add the item if no search term or if entered search term was found - if (packet.Items.size() < 50 && totalcount >= listfrom) + if (packet.Items.size() < 50 && packet.TotalCount >= listfrom) Aentry->BuildAuctionInfo(packet.Items, true, item); - ++totalcount; + ++packet.TotalCount; } } @@ -835,6 +845,19 @@ void AuctionEntry::BuildAuctionInfo(std::vector<WorldPackets::AuctionHouse::Auct auctionItem.Enchantments.emplace_back(item->GetEnchantmentId((EnchantmentSlot) i), item->GetEnchantmentDuration((EnchantmentSlot) i), item->GetEnchantmentCharges((EnchantmentSlot) i), i); } + uint8 i = 0; + for (ItemDynamicFieldGems const& gemData : item->GetGems()) + { + if (gemData.ItemId) + { + WorldPackets::Item::ItemGemInstanceData gem; + gem.Slot = i; + gem.Item.Initialize(&gemData); + auctionItem.Gems.push_back(gem); + } + ++i; + } + items.emplace_back(auctionItem); } @@ -904,7 +927,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..3b8862b05c7 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 <set> @@ -79,11 +78,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; @@ -96,6 +96,24 @@ struct TC_GAME_API AuctionEntry }; +struct AuctionSearchFilters +{ + enum FilterType : uint32 + { + FILTER_SKIP_CLASS = 0, + FILTER_SKIP_SUBCLASS = 0xFFFFFFFF, + FILTER_SKIP_INVTYPE = 0xFFFFFFFF + }; + + struct SubclassFilter + { + uint32 SubclassMask = FILTER_SKIP_CLASS; + std::array<uint32, MAX_ITEM_SUBCLASS_TOTAL> InvTypes; + }; + + std::array<SubclassFilter, MAX_ITEM_CLASS> Classes; +}; + //this class is used as auctionhouse instance class TC_GAME_API AuctionHouseObject { @@ -140,8 +158,7 @@ class TC_GAME_API AuctionHouseObject void BuildListBidderItems(WorldPackets::AuctionHouse::AuctionListBidderItemsResult& packet, Player* player, uint32& totalcount); void BuildListOwnerItems(WorldPackets::AuctionHouse::AuctionListOwnerItemsResult& packet, Player* player, uint32& totalcount); void BuildListAuctionItems(WorldPackets::AuctionHouse::AuctionListItemsResult& packet, Player* player, - std::wstring const& searchedname, uint32 listfrom, uint8 levelmin, uint8 levelmax, uint8 usable, - uint32 inventoryType, uint32 itemClass, uint32 itemSubClass, uint32 quality, uint32& totalcount); + std::wstring const& searchedname, uint32 listfrom, uint8 levelmin, uint8 levelmax, bool usable, Optional<AuctionSearchFilters> const& filters, uint32 quality); void BuildReplicate(WorldPackets::AuctionHouse::AuctionReplicateResponse& auctionReplicateResult, Player* player, uint32 global, uint32 cursor, uint32 tombstone, uint32 count); @@ -188,7 +205,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..0ba27b1b7ce 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" @@ -304,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<int32>(value)) @@ -428,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)); @@ -444,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)); @@ -460,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)); @@ -476,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)); @@ -492,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)); @@ -508,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); @@ -524,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); @@ -542,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)); @@ -598,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)); @@ -1026,6 +1025,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/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 8b5622331a8..147070f98af 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -546,7 +546,7 @@ inline void Battleground::_ProcessJoin(uint32 diff) player->SendDirectMessage(battlefieldStatus.Write()); // Correctly display EnemyUnitFrame - player->SetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_ARENA_FACTION, player->GetBGTeam()); + player->SetByteValue(PLAYER_BYTES_4, PLAYER_BYTES_4_OFFSET_ARENA_FACTION, player->GetBGTeam()); player->RemoveAurasDueToSpell(SPELL_ARENA_PREPARATION); player->ResetAllPowers(); @@ -1095,7 +1095,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/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/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/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<ChatCommand> 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/Chat/ChatLink.cpp b/src/server/game/Chat/ChatLink.cpp index 3e523cad4fb..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) @@ -348,18 +347,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/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/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 76e065f8ddc..dcc18fdf64a 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -381,7 +381,7 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const case CONDITION_HP_VAL: { if (Unit* unit = object->ToUnit()) - condMeets = CompareValues(static_cast<ComparisionType>(ConditionValue2), unit->GetHealth(), static_cast<uint32>(ConditionValue1)); + condMeets = CompareValues(static_cast<ComparisionType>(ConditionValue2), unit->GetHealth(), static_cast<uint64>(ConditionValue1)); break; } case CONDITION_HP_PCT: @@ -2397,7 +2397,7 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditio 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; @@ -2621,8 +2621,15 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditio std::array<bool, AuraCount::value> 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 const* player, PlayerConditio 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/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/DB2Metadata.h b/src/server/game/DataStores/DB2Metadata.h new file mode 100644 index 00000000000..e510bfc23bb --- /dev/null +++ b/src/server/game/DataStores/DB2Metadata.h @@ -0,0 +1,6282 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef 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, 0x057D1672, 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, 0x5F7AFA62, 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, 0xA6E97BED, 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, 0x1BFEDEA5, 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, 0x2BD42EF8, 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, 0x9A2DD037, 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, 0xD2683E5C, 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, 0xAB996914, 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, 0xC8D4518B, 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, 0xF32FA71F, 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, 0x8E562093, 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, 0x2E145FA3, 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, 0xAAFA7852, 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, 0x541FCB2C, 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, 0x61DEFC72, 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, 0xF56B4ECA, 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, 0x9ACE5A2C, 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, 0xFCC856E3, 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, 0x33CB66C0, 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, 0x62C25555, 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, 0x5727C7CE, 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, 0x32D70665, 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, 0xF3855A07, 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, 0x7D19CBE6, 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, 0x0B635E27, 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, 0x269F6469, types, arraySizes); + return &instance; + } +}; + +struct ArtifactAppearanceSetMeta +{ + static DB2Meta const* Instance() + { + 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; + } +}; + +struct ArtifactCategoryMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hh"; + static uint8 const arraySizes[2] = { 1, 1 }; + static DB2Meta instance(-1, 2, 0x015DF345, 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, 0xDF650D3E, 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, 0x01233BBC, 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, 0xB4D8591A, 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, 0x24504CBE, 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, 0x5F27F07F, 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, 0x554432EF, 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, 0x10058492, 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, 0xC0BBE91D, 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, 0x39C1F86E, 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, 0x5B7B567E, 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, 0x3273A2ED, 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, 0xD2BE6D5C, 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, 0x39FDB23F, 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, 0xC3D0125D, 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, 0x4AC36A1D, 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, 0x891BD229, 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, 0x67818447, 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, 0xA44A31E4, 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, 0x0D345864, 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, 0x563A7D2A, 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, 0xDE5B505E, 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, 0x8DAD67C6, 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, 0xF61E6A94, 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, 0x784E6052, 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, 0x305E43BE, 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, 0x0478B1B1, 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, 0x664666E1, 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, 0x4B97C103, 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, 0xA898408A, 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, 0x82BF9A49, 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, 0x1D6DC577, 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, 0x83DE01F4, 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, 0x9CAA85E8, 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, 0xBAB445D5, 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, 0x4622933F, 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, 0x63F4A5AD, 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, 0x16E3FA38, 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, 0x6B5EEA0B, 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, 0xF1760594, 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, 0xABDEFA33, 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, 0xC269B9B2, 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, 0x9B7A7C33, 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, 0x268EC200, 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, 0x45AF32E1, 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, 0xB96E2E2C, types, arraySizes); + return &instance; + } +}; + +struct CharTitlesMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "sshb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, 0xECCBDBF9, 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, 0x87BC82E6, 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, 0xC8DFD1F8, 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, 0xEA2447D5, 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, 0x89C0A3E9, 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, 0x23043EC6, 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, 0x589CBD66, 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, 0x8AAD17A1, 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, 0xBFB19B72, 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, 0x1AFA49DF, 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, 0x0EFF13C2, 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, 0xCFEFCD72, 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, 0x8BB8B9A3, types, arraySizes); + return &instance; + } +}; + +struct ChrRacesMeta +{ + static DB2Meta const* Instance() + { + 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; + } +}; + +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, 0xFC72AC38, 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, 0xB2B4798C, 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, 0xD671C191, 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, 0x2ABC2F82, 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, 0x97F7A9AD, 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, 0x8CF8A102, types, arraySizes); + return &instance; + } +}; + +struct CloakDampeningMeta +{ + static DB2Meta const* Instance() + { + 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; + } +}; + +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, 0x01A085BE, 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, 0x9174BFE7, 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, 0x45CD0227, 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, 0x39FCD24B, 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, 0xAA6999A9, 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, 0x6EF17698, 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, 0x5A17D4B5, 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, 0x4E3ED532, 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, 0x227D7C8A, 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, 0x780B4996, 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, 0xDB9A44C4, types, arraySizes); + return &instance; + } +}; + +struct CreatureFamilyMeta +{ + static DB2Meta const* Instance() + { + 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; + } +}; + +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, 0x4AFCE8AB, 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, 0x676B5D95, 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, 0xF569713B, 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, 0x386F5FBB, 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, 0x62B41D78, 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, 0x02F8C797, 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, 0xB46EE452, 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, 0xFA3C1BDE, 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, 0x3948FA3E, 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, 0xDEBE9278, 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, 0xE07382D4, 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, 0xFBC72093, 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, 0xFD6ACECC, 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, 0xD7E2B520, 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, 0xCA0EA44E, 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, 0x3DFEB231, 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, 0x08773F4F, 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, 0xCC3C554D, 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, 0xC0EFD6F4, 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, 0x7F62CC40, 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, 0x4CDA6220, 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, 0x024A28A5, 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, 0x96AD5F03, 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, 0x5E653BAE, 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, 0x681635FF, 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, 0x07F62CCA, 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, 0x26FFB6E5, 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, 0x83E5CA94, 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, 0xAF8BBDFD, 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, 0x290CA5E0, 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, 0x00659303, 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, 0x8729AA2E, 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, 0xFAB902E4, 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, 0xE3D4EEF5, 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, 0x5807F583, 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, 0xECF45BCB, 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, 0x433A9F1D, 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, 0x45942CAD, 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, 0xA482F51E, 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, 0x873670B3, 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, 0x83EDDC57, 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, 0x3C821CD4, 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, 0xDA87352E, 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, 0x1B969F47, 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, 0x729BB194, 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, 0xE62BB37A, 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, 0x36033AFB, 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, 0xE26ABF27, 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, 0xDD4432B9, 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, 0x3D787E0A, 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, 0x1A493E93, 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, 0xE0D1CAFF, 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, 0x4E5A1C8D, 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, 0x67818447, 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, 0xF0251DA9, 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, 0xF387E4CE, 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, 0xA06217A7, 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, 0xB4E9CCFF, 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, 0xD5AAD8F5, 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, 0x3F748D06, 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, 0xE0A164CC, 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, 0xC8270155, 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, 0x61A32627, 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, 0x332DC097, 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, 0x26A653E1, 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, 0x0708BDE8, 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, 0x84E433B2, 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, 0xA47EFC96, 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, 0xAAC9B70B, 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, 0x83347E98, types, arraySizes); + return &instance; + } +}; + +struct GarrFollowerUICreatureMeta +{ + static DB2Meta const* Instance() + { + 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; + } +}; + +struct GarrFollowerXAbilityMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, 0x55374D4B, 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, 0x79C84299, 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, 0x965A35A3, 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, 0x201D5CC7, 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, 0x1FFD19BB, 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, 0x2CFA96FC, 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, 0xCFFD0036, 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, 0xEDE238C4, 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, 0xE2A30EE5, 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, 0x28358C8A, 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, 0x4F7D215C, 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, 0x31EE8F1A, 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, 0x0CE6FE07, 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, 0x784D025A, 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, 0xE57CCEA0, 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, 0xBC111CF1, 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, 0x30FB6FE9, 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, 0x6414DFFF, 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, 0x8C8B99B4, 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, 0x8BB9D1A2, 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, 0x45DE3C50, 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, 0xCEB08F4E, 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, 0x55DD4EA6, 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, 0x623B3533, 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, 0xBFF68C36, 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, 0xB164611A, 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, 0x67818447, 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, 0xBDD76E49, 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, 0xF2A8C5FC, 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, 0xB9D8F312, 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, 0x3F1F321A, 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, 0x89499D40, 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, 0x7F0F0A99, 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, 0x8CD5AB4A, 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, 0xC6D20079, 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, 0xC6D20079, 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, 0xC6D20079, 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, 0xC7D74917, 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, 0xF07281BE, 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, 0x41EDD5DA, 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, 0xDB3E9871, 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, 0x42A52A5B, 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, 0x8E1D98D8, 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, 0x67818447, 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, 0x41A15068, 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, 0xD00C26AF, 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, 0x26FFB6E5, 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, 0x26FFB6E5, 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, 0x26FFB6E5, types, arraySizes); + return &instance; + } +}; + +struct InvasionClientDataMeta +{ + static DB2Meta const* Instance() + { + 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; + } +}; + +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, 0xBAB9954D, 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, 0xD203A3E9, 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, 0x4A8796B5, 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, 0xC3CD05A0, 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, 0xA38C0C55, 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, 0x12D739A5, 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, 0x67818447, 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, 0x7D937400, 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, 0xCB953E49, 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, 0xE2ED6BA0, 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, 0x5E08B8E2, 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, 0xFC2CE47C, 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, 0x41FD05DE, 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, 0x48C57690, 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, 0xA38C0C55, 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, 0xA38C0C55, 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, 0xA38C0C55, 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, 0xA38C0C55, 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, 0xA38C0C55, 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, 0x9E738C93, 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, 0x07D2E6CF, 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, 0xAC466DE7, 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, 0x6EEE8622, 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, 0x131233D4, 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, 0x56C5664F, 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, 0x22B7B75A, 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, 0xDFE88B15, 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, 0x66B27D0B, 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, 0x89E44FCB, 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, 0xA44269EE, 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, 0xB914CD84, 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, 0x47B62FA7, 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, 0x79EFBA2F, 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, 0x17DC5118, types, arraySizes); + return &instance; + } +}; + +struct ItemRandomSuffixMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "shh"; + static uint8 const arraySizes[3] = { 1, 5, 5 }; + static DB2Meta instance(-1, 3, 0x20CC67CD, 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, 0x99013BB1, 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, 0xE3F1487C, 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, 0x5089F4A2, 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, 0x939730D0, 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, 0x27909DB0, 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, 0x9AE2EA46, 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, 0x85832A2E, 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, 0xB94F4659, 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, 0x82EEF3E8, 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, 0x196B9A4F, 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, 0x12126A7B, 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, 0xD4015649, 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, 0xEB27B98B, 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, 0x02224293, 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, 0xDEB5EEB8, 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, 0x2B6945A8, 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, 0xF08A57BF, 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, 0x911A7222, 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, 0xDFF1896D, 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, 0x3DD3BD11, 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, 0x084FB517, 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, 0x67818447, 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, 0xC5F39D3A, 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, 0xD27482EA, 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, 0xF165D122, 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, 0x04C0BC5D, 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, 0x2CF66B24, 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, 0x0BDD9F25, 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, 0xC5A0B877, types, arraySizes); + return &instance; + } +}; + +struct LfgDungeonsMeta +{ + static DB2Meta const* Instance() + { + 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; + } +}; + +struct LfgDungeonsGroupingMapMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhb"; + static uint8 const arraySizes[3] = { 1, 1, 1 }; + static DB2Meta instance(-1, 3, 0x4A7FA59C, 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, 0x7F56023F, 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, 0x35A3D54B, 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, 0xA89E1596, 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, 0xDB514597, 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, 0x62B41D78, 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, 0x5AA70B00, 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, 0x551D907E, 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, 0x28B44DCB, 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, 0xBE26AA7B, 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, 0x0C18B360, 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, 0x0BE3B70B, 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, 0x6F5C6A8A, 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, 0x8501126F, 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, 0x4064FF07, 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, 0xA17E9956, 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, 0xA1D9C984, 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, 0x38F4113F, 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, 0xBDA49B69, 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, 0x38F4113F, 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, 0x6B30F325, 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, 0x38F4113F, types, arraySizes); + return &instance; + } +}; + +struct MapMeta +{ + static DB2Meta const* Instance() + { + 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; + } +}; + +struct MapChallengeModeMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "hhb"; + static uint8 const arraySizes[3] = { 1, 3, 1 }; + static DB2Meta instance(-1, 3, 0xB9D43326, 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, 0x7ADE1C7B, 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, 0x726559D6, 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, 0xBDC16D0F, 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, 0xB0DC1034, 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, 0xD8110E92, 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, 0xAA3A793B, 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, 0x5EF4BA08, 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, 0x18636F99, 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, 0x060C2D1C, 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, 0x86A9FD37, 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, 0xB62CA122, 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, 0xADB0EE4D, 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, 0xCAE1BC8B, 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, 0x41B84017, 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, 0x87300FEE, 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, 0x48506E87, 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, 0xD7C1FC25, 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, 0x4C7F576E, 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, 0x47B62FA7, 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, 0x813B40C3, 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, 0xA22F8680, 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, 0xDD9C935E, 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, 0x67818447, 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, 0x02A080A3, 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, 0x67818447, 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, 0x041FFE7D, 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, 0xB5DB9B94, 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, 0x401AC574, 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, 0x67818447, 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, 0x15BA10F3, 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, 0xF1BF0CA9, 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, 0xE6C80767, 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, 0x57D19E50, 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, 0x9D908771, 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, 0x7353B599, 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, 0x12961644, 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, 0x1A5C14A8, 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, 0xC5DECA36, types, arraySizes); + return &instance; + } +}; + +struct PlayerConditionMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "iiiiiiiiiiiiiishhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbiiiiiiiiiiiiiii"; + 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, 0xBAA3CA64, 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, 0x3E7693C1, 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, 0x0EA8C354, 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, 0x6CF8DBB6, 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, 0x996B7B03, 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, 0x042B76A1, 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, 0x85DC9691, 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, 0x15D5D38F, 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, 0x987332DF, 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, 0xBCA228D1, 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, 0x8D746A4E, 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, 0x46E787AF, 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, 0xDA321AC4, 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, 0x90E2CCC9, 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, 0x15232667, 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, 0x134A3185, 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, 0x67818447, 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, 0xE6F65F4F, 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, 0xE39F507A, 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, 0xFBAC2A6D, types, arraySizes); + return &instance; + } +}; + +struct QuestPOIBlobMeta +{ + static DB2Meta const* Instance() + { + 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; + } +}; + +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, 0x356F39B9, types, arraySizes); + return &instance; + } +}; + +struct QuestPOIPointCliTaskMeta +{ + static DB2Meta const* Instance() + { + 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; + } +}; + +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, 0x9B308EDF, 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, 0xCD4A8256, 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, 0xA33E0F53, 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, 0xB92018B7, 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, 0x4346D258, 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, 0xD4825187, 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, 0xBB6728B0, 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, 0xC54288AC, 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, 0x3C4783A7, 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, 0xF188A6B0, 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, 0x53309323, 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, 0x8B169B16, 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, 0x2804996B, 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, 0x5AD7107A, 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, 0x648BC961, 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, 0x689AB407, 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, 0xF434A1F0, 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, 0x883E80FE, 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, 0xE71EFDEA, 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, 0x4E0E3AC5, 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, 0xACF5556A, 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, 0xE564690A, 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, 0x67818447, 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, 0x122FCD3F, 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, 0x861AEB4E, 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, 0x39E4B20A, 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, 0xDBCC318B, 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, 0x6E0F3FC1, 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, 0xDD021285, 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, 0x67818447, 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, 0x2FE47A1B, 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, 0x9599555F, 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, 0x091E9D1A, 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, 0xF1CDEABF, 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, 0xC3E8E26F, 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, 0xEDA3A4D4, 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, 0x6F03BA39, 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, 0x917AB671, 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, 0x3A647CAE, 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, 0x24A008CB, 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, 0xAED6FA80, 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, 0x67818447, 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, 0x700BC63F, 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, 0x45160162, 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, 0x27606F57, 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, 0x8C2AEA75, 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, 0xD29B5B47, 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, 0x751D6B9F, 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, 0xAAFD0E26, 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, 0x85F511FC, 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, 0x796AD8C7, 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, 0x6414DFFF, 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, 0x9FC404CF, 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, 0x15C9999E, 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, 0xB1F8D61B, 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, 0x2FD43517, 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, 0xE99ACF7D, 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, 0xCC928C2D, 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, 0x19C6D5BC, 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, 0xD4FFE0FE, 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, 0xB44CBB5C, 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, 0x91AFF9C5, 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, 0xF7721E4A, 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, 0x5A212A44, 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, 0x89DAFC72, 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, 0x23C0B83A, 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, 0xC44BCFEE, 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, 0xE37F5F23, 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, 0xE8FCFE59, 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, 0xC40857BC, 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, 0xD5324B6A, 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, 0x6F5E87B0, 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, 0x744EB0EB, 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, 0x6C6B6B5B, 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, 0xBAC40B9B, 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, 0x9C6390C6, 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, 0xB35D88A2, 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, 0x60E17715, 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, 0x67818447, 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, 0x88B46898, 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, 0xFCE2DF7C, 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, 0xA21E7644, 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, 0xFE2C26F5, 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, 0x4C31B87C, 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, 0x2A4CDECC, 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, 0x8C7EE18E, 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, 0xCFBB94B1, 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, 0x8B096444, 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, 0x2B8ABAC3, 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, 0xF88FAB97, 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, 0x398CF976, 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, 0x719D619B, 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, 0x8CDC380E, 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, 0x0117F40F, 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, 0xEC43FF27, 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, 0xEFCFD31B, 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, 0xA339D9A5, 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, 0xE948EB40, 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, 0x78704E1A, 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, 0x86B17A70, 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, 0x01173DCA, types, arraySizes); + return &instance; + } +}; + +struct SpellScalingMeta +{ + static DB2Meta const* Instance() + { + static char const* types = "ihiii"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, 0x47D87C91, 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, 0x28AA9C0D, 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, 0x11AFAB53, 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, 0xB7AAD4C5, 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, 0xD496481C, 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, 0x752DCE9E, 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, 0xA2B85016, 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, 0x0B1038D1, 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, 0xD64D320E, 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, 0x4552DDC5, 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, 0xC3D97636, 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, 0xE63E62E3, 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, 0x2323470B, 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, 0x2CD44B15, 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, 0xA538BBD9, 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, 0x462EF5F7, 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, 0x1BE9FD87, 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, 0xB7A33B6A, 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, 0x2A21A5F9, 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, 0x0013EE84, 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, 0xE980B1CA, 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, 0x72063202, 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, 0xE408A87C, 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, 0x970E4A17, 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, 0xE194AB65, 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, 0xF8DBC1E7, 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, 0x8DB3D50D, 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, 0x6F34AF2D, 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, 0x47B62FA7, 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, 0x6FF19F2C, 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, 0xD01C9708, 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, 0x52AA4462, 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, 0xF0409D8D, 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, 0x8795B715, 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, 0xD99B4F6A, 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, 0xCD652C09, 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, 0x64CA0A37, 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, 0x36FF3392, 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, 0x8F3D2D53, 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, 0x8A98A638, 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, 0x27FC8611, 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, 0xB217955D, 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, 0xCC9066D0, 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, 0x23AEBF37, 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, 0xB26544DC, 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, 0x69F34A26, 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, 0xCEED00B2, 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, 0x6D5738D2, 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, 0xFDF0C65B, 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, 0xC336C8DA, 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, 0x0C19FB60, 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, 0x24D51F50, 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, 0x3F2E499C, 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, 0x4413ED21, 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, 0x2AC865D9, 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, 0x78C29525, 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, 0xAD2E69CE, 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, 0xC76F0AED, 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, 0x28102E83, 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, 0xB2E8B652, 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, 0x7552ABFD, 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, 0xBCABACED, 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, 0xE9DAEF18, 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, 0xFF4C7C92, 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, 0x38D49A50, 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, 0x3DE53946, 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, 0xA75127FA, 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, 0x0F38699B, 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, 0x0D505BC8, 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, 0x1C6502AA, 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, 0x30130FBE, 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, 0x651F8E28, 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, 0xABCC7A7C, 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, 0x10897820, 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, 0x3E48DAA1, 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, 0xFEFA6C76, 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, 0x9594D9DD, 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, 0xB57F2FF6, 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, 0x40BE2B6B, 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, 0x35915CEF, 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, 0x638A31A5, types, arraySizes); + return &instance; + } +}; + +struct WorldMapTransformsMeta +{ + static DB2Meta const* Instance() + { + 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; + } +}; + +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, 0xD3E152D4, 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, 0x702F537A, 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, 0x41F0EDEA, 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, 0xB746727D, 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, 0xD070A163, 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, 0x6BF0DF5D, 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, 0xFD2DACC3, 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, 0xA2F676B8, 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, 0x56448249, types, arraySizes); + return &instance; + } +}; + +#endif // DB2Metadata_h__ diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index f706e52330d..40eeae312f8 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -18,122 +18,200 @@ #include "DB2Stores.h" #include "Common.h" #include "Containers.h" -#include "DBCStores.h" -#include "DB2fmt.h" +#include "DatabaseEnv.h" +#include "DB2Metadata.h" #include "Log.h" #include "TransportMgr.h" #include "World.h" -DB2Storage<AchievementEntry> sAchievementStore("Achievement.db2", AchievementFormat, HOTFIX_SEL_ACHIEVEMENT); -DB2Storage<AreaGroupMemberEntry> sAreaGroupMemberStore("AreaGroupMember.db2", AreaGroupMemberFormat, HOTFIX_SEL_AREA_GROUP_MEMBER); -DB2Storage<AuctionHouseEntry> sAuctionHouseStore("AuctionHouse.db2", AuctionHouseFormat, HOTFIX_SEL_AUCTION_HOUSE); -DB2Storage<BarberShopStyleEntry> sBarberShopStyleStore("BarberShopStyle.db2", BarberShopStyleFormat, HOTFIX_SEL_BARBER_SHOP_STYLE); -DB2Storage<BattlePetBreedQualityEntry> sBattlePetBreedQualityStore("BattlePetBreedQuality.db2", BattlePetBreedQualityFormat, HOTFIX_SEL_BATTLE_PET_BREED_QUALITY); -DB2Storage<BattlePetBreedStateEntry> sBattlePetBreedStateStore("BattlePetBreedState.db2", BattlePetBreedStateFormat, HOTFIX_SEL_BATTLE_PET_BREED_STATE); -DB2Storage<BattlePetSpeciesEntry> sBattlePetSpeciesStore("BattlePetSpecies.db2", BattlePetSpeciesFormat, HOTFIX_SEL_BATTLE_PET_SPECIES); -DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore("BattlePetSpeciesState.db2", BattlePetSpeciesStateFormat, HOTFIX_SEL_BATTLE_PET_SPECIES_STATE); -DB2Storage<BroadcastTextEntry> sBroadcastTextStore("BroadcastText.db2", BroadcastTextFormat, HOTFIX_SEL_BROADCAST_TEXT); -DB2Storage<CharStartOutfitEntry> sCharStartOutfitStore("CharStartOutfit.db2", CharStartOutfitFormat, HOTFIX_SEL_CHAR_START_OUTFIT); -DB2Storage<ChrClassesXPowerTypesEntry> sChrClassesXPowerTypesStore("ChrClassesXPowerTypes.db2", ChrClassesXPowerTypesFormat, HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES); -DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore("CinematicSequences.db2", CinematicSequencesFormat, HOTFIX_SEL_CINEMATIC_SEQUENCES); -DB2Storage<CreatureDisplayInfoEntry> sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", CreatureDisplayInfoFormat, HOTFIX_SEL_CREATURE_DISPLAY_INFO); -DB2Storage<CreatureTypeEntry> sCreatureTypeStore("CreatureType.db2", CreatureTypeFormat, HOTFIX_SEL_CREATURE_TYPE); -DB2Storage<CriteriaEntry> sCriteriaStore("Criteria.db2", CriteriaFormat, HOTFIX_SEL_CRITERIA); -DB2Storage<CriteriaTreeEntry> sCriteriaTreeStore("CriteriaTree.db2", CriteriaTreeFormat, HOTFIX_SEL_CRITERIA_TREE); -DB2Storage<CurrencyTypesEntry> sCurrencyTypesStore("CurrencyTypes.db2", CurrencyTypesFormat, HOTFIX_SEL_CURRENCY_TYPES); -DB2Storage<CurvePointEntry> sCurvePointStore("CurvePoint.db2", CurvePointFormat, HOTFIX_SEL_CURVE_POINT); -DB2Storage<DestructibleModelDataEntry> sDestructibleModelDataStore("DestructibleModelData.db2", DestructibleModelDataFormat, HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA); -DB2Storage<DurabilityQualityEntry> sDurabilityQualityStore("DurabilityQuality.db2", DurabilityQualityFormat, HOTFIX_SEL_DURABILITY_QUALITY); -DB2Storage<GameObjectsEntry> sGameObjectsStore("GameObjects.db2", GameObjectsFormat, HOTFIX_SEL_GAMEOBJECTS); -DB2Storage<GameTablesEntry> sGameTablesStore("GameTables.db2", GameTablesFormat, HOTFIX_SEL_GAME_TABLES); -DB2Storage<GarrAbilityEntry> sGarrAbilityStore("GarrAbility.db2", GarrAbilityFormat, HOTFIX_SEL_GARR_ABILITY); -DB2Storage<GarrBuildingEntry> sGarrBuildingStore("GarrBuilding.db2", GarrBuildingFormat, HOTFIX_SEL_GARR_BUILDING); -DB2Storage<GarrBuildingPlotInstEntry> sGarrBuildingPlotInstStore("GarrBuildingPlotInst.db2", GarrBuildingPlotInstFormat, HOTFIX_SEL_GARR_BUILDING_PLOT_INST); -DB2Storage<GarrClassSpecEntry> sGarrClassSpecStore("GarrClassSpec.db2", GarrClassSpecFormat, HOTFIX_SEL_GARR_CLASS_SPEC); -DB2Storage<GarrFollowerEntry> sGarrFollowerStore("GarrFollower.db2", GarrFollowerFormat, HOTFIX_SEL_GARR_FOLLOWER); -DB2Storage<GarrFollowerXAbilityEntry> sGarrFollowerXAbilityStore("GarrFollowerXAbility.db2", GarrFollowerXAbilityFormat, HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY); -DB2Storage<GarrPlotBuildingEntry> sGarrPlotBuildingStore("GarrPlotBuilding.db2", GarrPlotBuildingFormat, HOTFIX_SEL_GARR_PLOT_BUILDING); -DB2Storage<GarrPlotEntry> sGarrPlotStore("GarrPlot.db2", GarrPlotFormat, HOTFIX_SEL_GARR_PLOT); -DB2Storage<GarrPlotInstanceEntry> sGarrPlotInstanceStore("GarrPlotInstance.db2", GarrPlotInstanceFormat, HOTFIX_SEL_GARR_PLOT_INSTANCE); -DB2Storage<GarrSiteLevelEntry> sGarrSiteLevelStore("GarrSiteLevel.db2", GarrSiteLevelFormat, HOTFIX_SEL_GARR_SITE_LEVEL); -DB2Storage<GarrSiteLevelPlotInstEntry> sGarrSiteLevelPlotInstStore("GarrSiteLevelPlotInst.db2", GarrSiteLevelPlotInstFormat, HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST); -DB2Storage<GlyphSlotEntry> sGlyphSlotStore("GlyphSlot.db2", GlyphSlotFormat, HOTFIX_SEL_GLYPH_SLOT); -DB2Storage<GuildPerkSpellsEntry> sGuildPerkSpellsStore("GuildPerkSpells.db2", GuildPerkSpellsFormat, HOTFIX_SEL_GUILD_PERK_SPELLS); -DB2Storage<HeirloomEntry> sHeirloomStore("Heirloom.db2", HeirloomFormat, HOTFIX_SEL_HEIRLOOM); -DB2Storage<HolidaysEntry> sHolidaysStore("Holidays.db2", HolidaysEntryFormat, HOTFIX_SEL_HOLIDAYS); -DB2Storage<ImportPriceArmorEntry> sImportPriceArmorStore("ImportPriceArmor.db2", ImportPriceArmorFormat, HOTFIX_SEL_IMPORT_PRICE_ARMOR); -DB2Storage<ImportPriceQualityEntry> sImportPriceQualityStore("ImportPriceQuality.db2", ImportPriceQualityFormat, HOTFIX_SEL_IMPORT_PRICE_QUALITY); -DB2Storage<ImportPriceShieldEntry> sImportPriceShieldStore("ImportPriceShield.db2", ImportPriceShieldFormat, HOTFIX_SEL_IMPORT_PRICE_SHIELD); -DB2Storage<ImportPriceWeaponEntry> sImportPriceWeaponStore("ImportPriceWeapon.db2", ImportPriceWeaponFormat, HOTFIX_SEL_IMPORT_PRICE_WEAPON); -DB2Storage<ItemAppearanceEntry> sItemAppearanceStore("ItemAppearance.db2", ItemAppearanceFormat, HOTFIX_SEL_ITEM_APPEARANCE); -DB2Storage<ItemBonusEntry> sItemBonusStore("ItemBonus.db2", ItemBonusFormat, HOTFIX_SEL_ITEM_BONUS); -DB2Storage<ItemBonusTreeNodeEntry> sItemBonusTreeNodeStore("ItemBonusTreeNode.db2", ItemBonusTreeNodeFormat, HOTFIX_SEL_ITEM_BONUS_TREE_NODE); -DB2Storage<ItemClassEntry> sItemClassStore("ItemClass.db2", ItemClassFormat, HOTFIX_SEL_ITEM_CLASS); -DB2Storage<ItemCurrencyCostEntry> sItemCurrencyCostStore("ItemCurrencyCost.db2", ItemCurrencyCostFormat, HOTFIX_SEL_ITEM_CURRENCY_COST); -DB2Storage<ItemDisenchantLootEntry> sItemDisenchantLootStore("ItemDisenchantLoot.db2", ItemDisenchantLootFormat, HOTFIX_SEL_ITEM_DISENCHANT_LOOT); -DB2Storage<ItemEffectEntry> sItemEffectStore("ItemEffect.db2", ItemEffectFormat, HOTFIX_SEL_ITEM_EFFECT); -DB2Storage<ItemEntry> sItemStore("Item.db2", ItemFormat, HOTFIX_SEL_ITEM); -DB2Storage<ItemExtendedCostEntry> sItemExtendedCostStore("ItemExtendedCost.db2", ItemExtendedCostFormat, HOTFIX_SEL_ITEM_EXTENDED_COST); -DB2Storage<ItemLimitCategoryEntry> sItemLimitCategoryStore("ItemLimitCategory.db2", ItemLimitCategoryFormat, HOTFIX_SEL_ITEM_LIMIT_CATEGORY); -DB2Storage<ItemModifiedAppearanceEntry> sItemModifiedAppearanceStore("ItemModifiedAppearance.db2", ItemModifiedAppearanceFormat, HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE); -DB2Storage<ItemPriceBaseEntry> sItemPriceBaseStore("ItemPriceBase.db2", ItemPriceBaseFormat, HOTFIX_SEL_ITEM_PRICE_BASE); -DB2Storage<ItemRandomPropertiesEntry> sItemRandomPropertiesStore("ItemRandomProperties.db2", ItemRandomPropertiesFormat, HOTFIX_SEL_ITEM_RANDOM_PROPERTIES); -DB2Storage<ItemRandomSuffixEntry> sItemRandomSuffixStore("ItemRandomSuffix.db2", ItemRandomSuffixFormat, HOTFIX_SEL_ITEM_RANDOM_SUFFIX); -DB2Storage<ItemSparseEntry> sItemSparseStore("Item-sparse.db2", ItemSparseFormat, HOTFIX_SEL_ITEM_SPARSE); -DB2Storage<ItemSpecEntry> sItemSpecStore("ItemSpec.db2", ItemSpecFormat, HOTFIX_SEL_ITEM_SPEC); -DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore("ItemSpecOverride.db2", ItemSpecOverrideFormat, HOTFIX_SEL_ITEM_SPEC_OVERRIDE); -DB2Storage<ItemToBattlePetSpeciesEntry> sItemToBattlePetSpeciesStore("ItemToBattlePetSpecies.db2", ItemToBattlePetSpeciesFormat, HOTFIX_SEL_ITEM_TO_BATTLE_PET_SPECIES); -DB2Storage<ItemUpgradeEntry> sItemUpgradeStore("ItemUpgrade.db2", ItemUpgradeEntryFormat, HOTFIX_SEL_ITEM_UPGRADE); -DB2Storage<ItemXBonusTreeEntry> sItemXBonusTreeStore("ItemXBonusTree.db2", ItemXBonusTreeFormat, HOTFIX_SEL_ITEM_X_BONUS_TREE); -DB2Storage<KeyChainEntry> sKeyChainStore("KeyChain.db2", KeyChainFormat, HOTFIX_SEL_KEY_CHAIN); -DB2Storage<MailTemplateEntry> sMailTemplateStore("MailTemplate.db2", MailTemplateFormat, HOTFIX_SEL_MAIL_TEMPLATE); -DB2Storage<ModifierTreeEntry> sModifierTreeStore("ModifierTree.db2", ModifierTreeFormat, HOTFIX_SEL_MODIFIER_TREE); -DB2Storage<MountCapabilityEntry> sMountCapabilityStore("MountCapability.db2", MountCapabilityFormat, HOTFIX_SEL_MOUNT_CAPABILITY); -DB2Storage<MountEntry> sMountStore("Mount.db2", MountFormat, HOTFIX_SEL_MOUNT); -DB2Storage<MountTypeXCapabilityEntry> sMountTypeXCapabilityStore("MountTypeXCapability.db2", MountTypeXCapabilityFormat, HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY); -DB2Storage<NameGenEntry> sNameGenStore("NameGen.db2", NameGenFormat, HOTFIX_SEL_NAME_GEN); -DB2Storage<NamesProfanityEntry> sNamesProfanityStore("NamesProfanity.db2", NamesProfanityFormat, HOTFIX_SEL_NAMES_PROFANITY); -DB2Storage<NamesReservedEntry> sNamesReservedStore("NamesReserved.db2", NamesReservedFormat, HOTFIX_SEL_NAMES_RESERVED); -DB2Storage<NamesReservedLocaleEntry> sNamesReservedLocaleStore("NamesReservedLocale.db2", NamesReservedLocaleFormat, HOTFIX_SEL_NAMES_RESERVED_LOCALE); -DB2Storage<OverrideSpellDataEntry> sOverrideSpellDataStore("OverrideSpellData.db2", OverrideSpellDataFormat, HOTFIX_SEL_OVERRIDE_SPELL_DATA); -DB2Storage<PhaseXPhaseGroupEntry> sPhaseXPhaseGroupStore("PhaseXPhaseGroup.db2", PhaseXPhaseGroupFormat, HOTFIX_SEL_PHASE_X_PHASE_GROUP); -DB2Storage<PlayerConditionEntry> sPlayerConditionStore("PlayerCondition.db2", PlayerConditionFormat, HOTFIX_SEL_PLAYER_CONDITION); -DB2Storage<QuestMoneyRewardEntry> sQuestMoneyRewardStore("QuestMoneyReward.db2", QuestMoneyRewardFormat, HOTFIX_SEL_QUEST_MONEY_REWARD); -DB2Storage<QuestPackageItemEntry> sQuestPackageItemStore("QuestPackageItem.db2", QuestPackageItemfmt, HOTFIX_SEL_QUEST_PACKAGE_ITEM); -DB2Storage<QuestSortEntry> sQuestSortStore("QuestSort.db2", QuestSortFormat, HOTFIX_SEL_QUEST_SORT); -DB2Storage<QuestV2Entry> sQuestV2Store("QuestV2.db2", QuestV2Format, HOTFIX_SEL_QUEST_V2); -DB2Storage<QuestXPEntry> sQuestXPStore("QuestXP.db2", QuestXPFormat, HOTFIX_SEL_QUEST_XP); -DB2Storage<RulesetItemUpgradeEntry> sRulesetItemUpgradeStore("RulesetItemUpgrade.db2", RulesetItemUpgradeEntryFormat, HOTFIX_SEL_RULESET_ITEM_UPGRADE); -DB2Storage<ScalingStatDistributionEntry> sScalingStatDistributionStore("ScalingStatDistribution.db2", ScalingStatDistributionFormat, HOTFIX_SEL_SCALING_STAT_DISTRIBUTION); -DB2Storage<SoundEntriesEntry> sSoundEntriesStore("SoundEntries.db2", SoundEntriesFormat, HOTFIX_SEL_SOUND_ENTRIES); -DB2Storage<SpecializationSpellsEntry> sSpecializationSpellsStore("SpecializationSpells.db2", SpecializationSpellsFormat, HOTFIX_SEL_SPECIALIZATION_SPELLS); -DB2Storage<SpellAuraRestrictionsEntry> sSpellAuraRestrictionsStore("SpellAuraRestrictions.db2", SpellAuraRestrictionsFormat, HOTFIX_SEL_SPELL_AURA_RESTRICTIONS); -DB2Storage<SpellCastTimesEntry> sSpellCastTimesStore("SpellCastTimes.db2", SpellCastTimesFormat, HOTFIX_SEL_SPELL_CAST_TIMES); -DB2Storage<SpellCastingRequirementsEntry> sSpellCastingRequirementsStore("SpellCastingRequirements.db2", SpellCastingRequirementsFormat, HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS); -DB2Storage<SpellClassOptionsEntry> sSpellClassOptionsStore("SpellClassOptions.db2", SpellClassOptionsFormat, HOTFIX_SEL_SPELL_CLASS_OPTIONS); -DB2Storage<SpellDurationEntry> sSpellDurationStore("SpellDuration.db2", SpellDurationFormat, HOTFIX_SEL_SPELL_DURATION); -DB2Storage<SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore("SpellItemEnchantmentCondition.db2", SpellItemEnchantmentConditionFormat, HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION); -DB2Storage<SpellLearnSpellEntry> sSpellLearnSpellStore("SpellLearnSpell.db2", SpellLearnSpellFormat, HOTFIX_SEL_SPELL_LEARN_SPELL); -DB2Storage<SpellMiscEntry> sSpellMiscStore("SpellMisc.db2", SpellMiscFormat, HOTFIX_SEL_SPELL_MISC); -DB2Storage<SpellPowerEntry> sSpellPowerStore("SpellPower.db2", SpellPowerFormat, HOTFIX_SEL_SPELL_POWER); -DB2Storage<SpellPowerDifficultyEntry> sSpellPowerDifficultyStore("SpellPowerDifficulty.db2", SpellPowerDifficultyFormat, HOTFIX_SEL_SPELL_POWER_DIFFICULTY); -DB2Storage<SpellProcsPerMinuteEntry> sSpellProcsPerMinuteStore("SpellProcsPerMinute.db2", SpellProcsPerMinuteFormat, HOTFIX_SEL_SPELL_PROCS_PER_MINUTE); -DB2Storage<SpellProcsPerMinuteModEntry> sSpellProcsPerMinuteModStore("SpellProcsPerMinuteMod.db2", SpellProcsPerMinuteModFormat, HOTFIX_SEL_SPELL_PROCS_PER_MINUTE_MOD); -DB2Storage<SpellRadiusEntry> sSpellRadiusStore("SpellRadius.db2", SpellRadiusFormat, HOTFIX_SEL_SPELL_RADIUS); -DB2Storage<SpellRangeEntry> sSpellRangeStore("SpellRange.db2", SpellRangeFormat, HOTFIX_SEL_SPELL_RANGE); -DB2Storage<SpellReagentsEntry> sSpellReagentsStore("SpellReagents.db2", SpellReagentsFormat, HOTFIX_SEL_SPELL_REAGENTS); -DB2Storage<SpellRuneCostEntry> sSpellRuneCostStore("SpellRuneCost.db2", SpellRuneCostFormat, HOTFIX_SEL_SPELL_RUNE_COST); -DB2Storage<SpellTotemsEntry> sSpellTotemsStore("SpellTotems.db2", SpellTotemsFormat, HOTFIX_SEL_SPELL_TOTEMS); -DB2Storage<SpellXSpellVisualEntry> sSpellXSpellVisualStore("SpellXSpellVisual.db2", SpellXSpellVisualFormat, HOTFIX_SEL_SPELL_X_SPELL_VISUAL); -DB2Storage<TaxiNodesEntry> sTaxiNodesStore("TaxiNodes.db2", TaxiNodesFormat, HOTFIX_SEL_TAXI_NODES); -DB2Storage<TaxiPathEntry> sTaxiPathStore("TaxiPath.db2", TaxiPathFormat, HOTFIX_SEL_TAXI_PATH); -DB2Storage<TaxiPathNodeEntry> sTaxiPathNodeStore("TaxiPathNode.db2", TaxiPathNodeFormat, HOTFIX_SEL_TAXI_PATH_NODE); -DB2Storage<TotemCategoryEntry> sTotemCategoryStore("TotemCategory.db2", TotemCategoryFormat, HOTFIX_SEL_TOTEM_CATEGORY); -DB2Storage<ToyEntry> sToyStore("Toy.db2", ToyFormat, HOTFIX_SEL_TOY); -DB2Storage<TransportAnimationEntry> sTransportAnimationStore("TransportAnimation.db2", TransportAnimationFormat, HOTFIX_SEL_TRANSPORT_ANIMATION); -DB2Storage<TransportRotationEntry> sTransportRotationStore("TransportRotation.db2", TransportRotationFormat, HOTFIX_SEL_TRANSPORT_ROTATION); -DB2Storage<UnitPowerBarEntry> sUnitPowerBarStore("UnitPowerBar.db2", UnitPowerBarFormat, HOTFIX_SEL_UNIT_POWER_BAR); -DB2Storage<WorldMapOverlayEntry> sWorldMapOverlayStore("WorldMapOverlay.db2", WorldMapOverlayFormat, HOTFIX_SEL_WORLD_MAP_OVERLAY); +DB2Storage<AchievementEntry> sAchievementStore("Achievement.db2", AchievementMeta::Instance(), HOTFIX_SEL_ACHIEVEMENT); +DB2Storage<AnimKitEntry> sAnimKitStore("AnimKit.db2", AnimKitMeta::Instance(), HOTFIX_SEL_ANIM_KIT); +DB2Storage<AreaGroupMemberEntry> sAreaGroupMemberStore("AreaGroupMember.db2", AreaGroupMemberMeta::Instance(), HOTFIX_SEL_AREA_GROUP_MEMBER); +DB2Storage<AreaTableEntry> sAreaTableStore("AreaTable.db2", AreaTableMeta::Instance(), HOTFIX_SEL_AREA_TABLE); +DB2Storage<AreaTriggerEntry> sAreaTriggerStore("AreaTrigger.db2", AreaTriggerMeta::Instance(), HOTFIX_SEL_AREA_TRIGGER); +DB2Storage<ArmorLocationEntry> sArmorLocationStore("ArmorLocation.db2", ArmorLocationMeta::Instance(), HOTFIX_SEL_ARMOR_LOCATION); +DB2Storage<AuctionHouseEntry> sAuctionHouseStore("AuctionHouse.db2", AuctionHouseMeta::Instance(), HOTFIX_SEL_AUCTION_HOUSE); +DB2Storage<BankBagSlotPricesEntry> sBankBagSlotPricesStore("BankBagSlotPrices.db2", BankBagSlotPricesMeta::Instance(), HOTFIX_SEL_BANK_BAG_SLOT_PRICES); +DB2Storage<BannedAddOnsEntry> sBannedAddOnsStore("BannedAddOns.db2", BannedAddOnsMeta::Instance(), HOTFIX_SEL_BANNED_ADDONS); +DB2Storage<BarberShopStyleEntry> sBarberShopStyleStore("BarberShopStyle.db2", BarberShopStyleMeta::Instance(), HOTFIX_SEL_BARBER_SHOP_STYLE); +DB2Storage<BattlePetBreedQualityEntry> sBattlePetBreedQualityStore("BattlePetBreedQuality.db2", BattlePetBreedQualityMeta::Instance(), HOTFIX_SEL_BATTLE_PET_BREED_QUALITY); +DB2Storage<BattlePetBreedStateEntry> sBattlePetBreedStateStore("BattlePetBreedState.db2", BattlePetBreedStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_BREED_STATE); +DB2Storage<BattlePetSpeciesEntry> sBattlePetSpeciesStore("BattlePetSpecies.db2", BattlePetSpeciesMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES); +DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore("BattlePetSpeciesState.db2", BattlePetSpeciesStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES_STATE); +DB2Storage<BattlemasterListEntry> sBattlemasterListStore("BattlemasterList.db2", BattlemasterListMeta::Instance(), HOTFIX_SEL_BATTLEMASTER_LIST); +DB2Storage<BroadcastTextEntry> sBroadcastTextStore("BroadcastText.db2", BroadcastTextMeta::Instance(), HOTFIX_SEL_BROADCAST_TEXT); +DB2Storage<CharSectionsEntry> sCharSectionsStore("CharSections.db2", CharSectionsMeta::Instance(), HOTFIX_SEL_CHAR_SECTIONS); +DB2Storage<CharStartOutfitEntry> sCharStartOutfitStore("CharStartOutfit.db2", CharStartOutfitMeta::Instance(), HOTFIX_SEL_CHAR_START_OUTFIT); +DB2Storage<CharTitlesEntry> sCharTitlesStore("CharTitles.db2", CharTitlesMeta::Instance(), HOTFIX_SEL_CHAR_TITLES); +DB2Storage<ChatChannelsEntry> sChatChannelsStore("ChatChannels.db2", ChatChannelsMeta::Instance(), HOTFIX_SEL_CHAT_CHANNELS); +DB2Storage<ChrClassesEntry> sChrClassesStore("ChrClasses.db2", ChrClassesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES); +DB2Storage<ChrClassesXPowerTypesEntry> sChrClassesXPowerTypesStore("ChrClassesXPowerTypes.db2", ChrClassesXPowerTypesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES); +DB2Storage<ChrRacesEntry> sChrRacesStore("ChrRaces.db2", ChrRacesMeta::Instance(), HOTFIX_SEL_CHR_RACES); +DB2Storage<ChrSpecializationEntry> sChrSpecializationStore("ChrSpecialization.db2", ChrSpecializationMeta::Instance(), HOTFIX_SEL_CHR_SPECIALIZATION); +DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore("CinematicSequences.db2", CinematicSequencesMeta::Instance(), HOTFIX_SEL_CINEMATIC_SEQUENCES); +DB2Storage<CreatureDisplayInfoEntry> sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", CreatureDisplayInfoMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO); +DB2Storage<CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore("CreatureDisplayInfoExtra.db2", CreatureDisplayInfoExtraMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA); +DB2Storage<CreatureFamilyEntry> sCreatureFamilyStore("CreatureFamily.db2", CreatureFamilyMeta::Instance(), HOTFIX_SEL_CREATURE_FAMILY); +DB2Storage<CreatureModelDataEntry> sCreatureModelDataStore("CreatureModelData.db2", CreatureModelDataMeta::Instance(), HOTFIX_SEL_CREATURE_MODEL_DATA); +DB2Storage<CreatureTypeEntry> sCreatureTypeStore("CreatureType.db2", CreatureTypeMeta::Instance(), HOTFIX_SEL_CREATURE_TYPE); +DB2Storage<CriteriaEntry> sCriteriaStore("Criteria.db2", CriteriaMeta::Instance(), HOTFIX_SEL_CRITERIA); +DB2Storage<CriteriaTreeEntry> sCriteriaTreeStore("CriteriaTree.db2", CriteriaTreeMeta::Instance(), HOTFIX_SEL_CRITERIA_TREE); +DB2Storage<CurrencyTypesEntry> sCurrencyTypesStore("CurrencyTypes.db2", CurrencyTypesMeta::Instance(), HOTFIX_SEL_CURRENCY_TYPES); +DB2Storage<CurvePointEntry> sCurvePointStore("CurvePoint.db2", CurvePointMeta::Instance(), HOTFIX_SEL_CURVE_POINT); +DB2Storage<DestructibleModelDataEntry> sDestructibleModelDataStore("DestructibleModelData.db2", DestructibleModelDataMeta::Instance(), HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA); +DB2Storage<DifficultyEntry> sDifficultyStore("Difficulty.db2", DifficultyMeta::Instance(), HOTFIX_SEL_DIFFICULTY); +DB2Storage<DungeonEncounterEntry> sDungeonEncounterStore("DungeonEncounter.db2", DungeonEncounterMeta::Instance(), HOTFIX_SEL_DUNGEON_ENCOUNTER); +DB2Storage<DurabilityCostsEntry> sDurabilityCostsStore("DurabilityCosts.db2", DurabilityCostsMeta::Instance(), HOTFIX_SEL_DURABILITY_COSTS); +DB2Storage<DurabilityQualityEntry> sDurabilityQualityStore("DurabilityQuality.db2", DurabilityQualityMeta::Instance(), HOTFIX_SEL_DURABILITY_QUALITY); +DB2Storage<EmotesEntry> sEmotesStore("Emotes.db2", EmotesMeta::Instance(), HOTFIX_SEL_EMOTES); +DB2Storage<EmotesTextEntry> sEmotesTextStore("EmotesText.db2", EmotesTextMeta::Instance(), HOTFIX_SEL_EMOTES_TEXT); +DB2Storage<EmotesTextSoundEntry> sEmotesTextSoundStore("EmotesTextSound.db2", EmotesTextSoundMeta::Instance(), HOTFIX_SEL_EMOTES_TEXT_SOUND); +DB2Storage<FactionEntry> sFactionStore("Faction.db2", FactionMeta::Instance(), HOTFIX_SEL_FACTION); +DB2Storage<FactionTemplateEntry> sFactionTemplateStore("FactionTemplate.db2", FactionTemplateMeta::Instance(), HOTFIX_SEL_FACTION_TEMPLATE); +DB2Storage<GameObjectsEntry> sGameObjectsStore("GameObjects.db2", GameObjectsMeta::Instance(), HOTFIX_SEL_GAMEOBJECTS); +DB2Storage<GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore("GameObjectDisplayInfo.db2", GameObjectDisplayInfoMeta::Instance(), HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO); +DB2Storage<GarrAbilityEntry> sGarrAbilityStore("GarrAbility.db2", GarrAbilityMeta::Instance(), HOTFIX_SEL_GARR_ABILITY); +DB2Storage<GarrBuildingEntry> sGarrBuildingStore("GarrBuilding.db2", GarrBuildingMeta::Instance(), HOTFIX_SEL_GARR_BUILDING); +DB2Storage<GarrBuildingPlotInstEntry> sGarrBuildingPlotInstStore("GarrBuildingPlotInst.db2", GarrBuildingPlotInstMeta::Instance(), HOTFIX_SEL_GARR_BUILDING_PLOT_INST); +DB2Storage<GarrClassSpecEntry> sGarrClassSpecStore("GarrClassSpec.db2", GarrClassSpecMeta::Instance(), HOTFIX_SEL_GARR_CLASS_SPEC); +DB2Storage<GarrFollowerEntry> sGarrFollowerStore("GarrFollower.db2", GarrFollowerMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER); +DB2Storage<GarrFollowerXAbilityEntry> sGarrFollowerXAbilityStore("GarrFollowerXAbility.db2", GarrFollowerXAbilityMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY); +DB2Storage<GarrPlotBuildingEntry> sGarrPlotBuildingStore("GarrPlotBuilding.db2", GarrPlotBuildingMeta::Instance(), HOTFIX_SEL_GARR_PLOT_BUILDING); +DB2Storage<GarrPlotEntry> sGarrPlotStore("GarrPlot.db2", GarrPlotMeta::Instance(), HOTFIX_SEL_GARR_PLOT); +DB2Storage<GarrPlotInstanceEntry> sGarrPlotInstanceStore("GarrPlotInstance.db2", GarrPlotInstanceMeta::Instance(), HOTFIX_SEL_GARR_PLOT_INSTANCE); +DB2Storage<GarrSiteLevelEntry> sGarrSiteLevelStore("GarrSiteLevel.db2", GarrSiteLevelMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL); +DB2Storage<GarrSiteLevelPlotInstEntry> sGarrSiteLevelPlotInstStore("GarrSiteLevelPlotInst.db2", GarrSiteLevelPlotInstMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST); +DB2Storage<GemPropertiesEntry> sGemPropertiesStore("GemProperties.db2", GemPropertiesMeta::Instance(), HOTFIX_SEL_GEM_PROPERTIES); +DB2Storage<GlyphPropertiesEntry> sGlyphPropertiesStore("GlyphProperties.db2", GlyphPropertiesMeta::Instance(), HOTFIX_SEL_GLYPH_PROPERTIES); +DB2Storage<GuildColorBackgroundEntry> sGuildColorBackgroundStore("GuildColorBackground.db2", GuildColorBackgroundMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BACKGROUND); +DB2Storage<GuildColorBorderEntry> sGuildColorBorderStore("GuildColorBorder.db2", GuildColorBorderMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BORDER); +DB2Storage<GuildColorEmblemEntry> sGuildColorEmblemStore("GuildColorEmblem.db2", GuildColorEmblemMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_EMBLEM); +DB2Storage<GuildPerkSpellsEntry> sGuildPerkSpellsStore("GuildPerkSpells.db2", GuildPerkSpellsMeta::Instance(), HOTFIX_SEL_GUILD_PERK_SPELLS); +DB2Storage<HeirloomEntry> sHeirloomStore("Heirloom.db2", HeirloomMeta::Instance(), HOTFIX_SEL_HEIRLOOM); +DB2Storage<HolidaysEntry> sHolidaysStore("Holidays.db2", HolidaysMeta::Instance(), HOTFIX_SEL_HOLIDAYS); +DB2Storage<ImportPriceArmorEntry> sImportPriceArmorStore("ImportPriceArmor.db2", ImportPriceArmorMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_ARMOR); +DB2Storage<ImportPriceQualityEntry> sImportPriceQualityStore("ImportPriceQuality.db2", ImportPriceQualityMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_QUALITY); +DB2Storage<ImportPriceShieldEntry> sImportPriceShieldStore("ImportPriceShield.db2", ImportPriceShieldMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_SHIELD); +DB2Storage<ImportPriceWeaponEntry> sImportPriceWeaponStore("ImportPriceWeapon.db2", ImportPriceWeaponMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_WEAPON); +DB2Storage<ItemAppearanceEntry> sItemAppearanceStore("ItemAppearance.db2", ItemAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_APPEARANCE); +DB2Storage<ItemArmorQualityEntry> sItemArmorQualityStore("ItemArmorQuality.db2", ItemArmorQualityMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_QUALITY); +DB2Storage<ItemArmorShieldEntry> sItemArmorShieldStore("ItemArmorShield.db2", ItemArmorShieldMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_SHIELD); +DB2Storage<ItemArmorTotalEntry> sItemArmorTotalStore("ItemArmorTotal.db2", ItemArmorTotalMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_TOTAL); +DB2Storage<ItemBagFamilyEntry> sItemBagFamilyStore("ItemBagFamily.db2", ItemBagFamilyMeta::Instance(), HOTFIX_SEL_ITEM_BAG_FAMILY); +DB2Storage<ItemBonusEntry> sItemBonusStore("ItemBonus.db2", ItemBonusMeta::Instance(), HOTFIX_SEL_ITEM_BONUS); +DB2Storage<ItemBonusTreeNodeEntry> sItemBonusTreeNodeStore("ItemBonusTreeNode.db2", ItemBonusTreeNodeMeta::Instance(), HOTFIX_SEL_ITEM_BONUS_TREE_NODE); +DB2Storage<ItemClassEntry> sItemClassStore("ItemClass.db2", ItemClassMeta::Instance(), HOTFIX_SEL_ITEM_CLASS); +DB2Storage<ItemChildEquipmentEntry> sItemChildEquipmentStore("ItemChildEquipment.db2", ItemChildEquipmentMeta::Instance(), HOTFIX_SEL_ITEM_CHILD_EQUIPMENT); +DB2Storage<ItemCurrencyCostEntry> sItemCurrencyCostStore("ItemCurrencyCost.db2", ItemCurrencyCostMeta::Instance(), HOTFIX_SEL_ITEM_CURRENCY_COST); +DB2Storage<ItemDamageAmmoEntry> sItemDamageAmmoStore("ItemDamageAmmo.db2", ItemDamageAmmoMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_AMMO); +DB2Storage<ItemDamageOneHandEntry> sItemDamageOneHandStore("ItemDamageOneHand.db2", ItemDamageOneHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND); +DB2Storage<ItemDamageOneHandCasterEntry> sItemDamageOneHandCasterStore("ItemDamageOneHandCaster.db2", ItemDamageOneHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER); +DB2Storage<ItemDamageTwoHandEntry> sItemDamageTwoHandStore("ItemDamageTwoHand.db2", ItemDamageTwoHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND); +DB2Storage<ItemDamageTwoHandCasterEntry> sItemDamageTwoHandCasterStore("ItemDamageTwoHandCaster.db2", ItemDamageTwoHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER); +DB2Storage<ItemDisenchantLootEntry> sItemDisenchantLootStore("ItemDisenchantLoot.db2", ItemDisenchantLootMeta::Instance(), HOTFIX_SEL_ITEM_DISENCHANT_LOOT); +DB2Storage<ItemEffectEntry> sItemEffectStore("ItemEffect.db2", ItemEffectMeta::Instance(), HOTFIX_SEL_ITEM_EFFECT); +DB2Storage<ItemEntry> sItemStore("Item.db2", ItemMeta::Instance(), HOTFIX_SEL_ITEM); +DB2Storage<ItemExtendedCostEntry> sItemExtendedCostStore("ItemExtendedCost.db2", ItemExtendedCostMeta::Instance(), HOTFIX_SEL_ITEM_EXTENDED_COST); +DB2Storage<ItemLimitCategoryEntry> sItemLimitCategoryStore("ItemLimitCategory.db2", ItemLimitCategoryMeta::Instance(), HOTFIX_SEL_ITEM_LIMIT_CATEGORY); +DB2Storage<ItemModifiedAppearanceEntry> sItemModifiedAppearanceStore("ItemModifiedAppearance.db2", ItemModifiedAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE); +DB2Storage<ItemPriceBaseEntry> sItemPriceBaseStore("ItemPriceBase.db2", ItemPriceBaseMeta::Instance(), HOTFIX_SEL_ITEM_PRICE_BASE); +DB2Storage<ItemRandomPropertiesEntry> sItemRandomPropertiesStore("ItemRandomProperties.db2", ItemRandomPropertiesMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_PROPERTIES); +DB2Storage<ItemRandomSuffixEntry> sItemRandomSuffixStore("ItemRandomSuffix.db2", ItemRandomSuffixMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_SUFFIX); +DB2Storage<ItemSearchNameEntry> sItemSearchNameStore("ItemSearchName.db2", ItemSearchNameMeta::Instance(), HOTFIX_SEL_ITEM_SEARCH_NAME); +DB2Storage<ItemSetEntry> sItemSetStore("ItemSet.db2", ItemSetMeta::Instance(), HOTFIX_SEL_ITEM_SET); +DB2Storage<ItemSetSpellEntry> sItemSetSpellStore("ItemSetSpell.db2", ItemSetSpellMeta::Instance(), HOTFIX_SEL_ITEM_SET_SPELL); +DB2SparseStorage<ItemSparseEntry> sItemSparseStore("Item-sparse.db2", ItemSparseMeta::Instance(), HOTFIX_SEL_ITEM_SPARSE); +DB2Storage<ItemSpecEntry> sItemSpecStore("ItemSpec.db2", ItemSpecMeta::Instance(), HOTFIX_SEL_ITEM_SPEC); +DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore("ItemSpecOverride.db2", ItemSpecOverrideMeta::Instance(), HOTFIX_SEL_ITEM_SPEC_OVERRIDE); +DB2Storage<ItemUpgradeEntry> sItemUpgradeStore("ItemUpgrade.db2", ItemUpgradeMeta::Instance(), HOTFIX_SEL_ITEM_UPGRADE); +DB2Storage<ItemXBonusTreeEntry> sItemXBonusTreeStore("ItemXBonusTree.db2", ItemXBonusTreeMeta::Instance(), HOTFIX_SEL_ITEM_X_BONUS_TREE); +DB2Storage<KeyChainEntry> sKeyChainStore("KeyChain.db2", KeyChainMeta::Instance(), HOTFIX_SEL_KEY_CHAIN); +DB2Storage<LfgDungeonsEntry> sLfgDungeonsStore("LfgDungeons.db2", LfgDungeonsMeta::Instance(), HOTFIX_SEL_LFG_DUNGEONS); +DB2Storage<LightEntry> sLightStore("Light.db2", LightMeta::Instance(), HOTFIX_SEL_LIGHT); +DB2Storage<LiquidTypeEntry> sLiquidTypeStore("LiquidType.db2", LiquidTypeMeta::Instance(), HOTFIX_SEL_LIQUID_TYPE); +DB2Storage<LockEntry> sLockStore("Lock.db2", LockMeta::Instance(), HOTFIX_SEL_LOCK); +DB2Storage<MailTemplateEntry> sMailTemplateStore("MailTemplate.db2", MailTemplateMeta::Instance(), HOTFIX_SEL_MAIL_TEMPLATE); +DB2Storage<MapEntry> sMapStore("Map.db2", MapMeta::Instance(), HOTFIX_SEL_MAP); +DB2Storage<MapDifficultyEntry> sMapDifficultyStore("MapDifficulty.db2", MapDifficultyMeta::Instance(), HOTFIX_SEL_MAP_DIFFICULTY); +DB2Storage<ModifierTreeEntry> sModifierTreeStore("ModifierTree.db2", ModifierTreeMeta::Instance(), HOTFIX_SEL_MODIFIER_TREE); +DB2Storage<MountCapabilityEntry> sMountCapabilityStore("MountCapability.db2", MountCapabilityMeta::Instance(), HOTFIX_SEL_MOUNT_CAPABILITY); +DB2Storage<MountEntry> sMountStore("Mount.db2", MountMeta::Instance(), HOTFIX_SEL_MOUNT); +DB2Storage<MountTypeXCapabilityEntry> sMountTypeXCapabilityStore("MountTypeXCapability.db2", MountTypeXCapabilityMeta::Instance(), HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY); +DB2Storage<MovieEntry> sMovieStore("Movie.db2", MovieMeta::Instance(), HOTFIX_SEL_MOVIE); +DB2Storage<NameGenEntry> sNameGenStore("NameGen.db2", NameGenMeta::Instance(), HOTFIX_SEL_NAME_GEN); +DB2Storage<NamesProfanityEntry> sNamesProfanityStore("NamesProfanity.db2", NamesProfanityMeta::Instance(), HOTFIX_SEL_NAMES_PROFANITY); +DB2Storage<NamesReservedEntry> sNamesReservedStore("NamesReserved.db2", NamesReservedMeta::Instance(), HOTFIX_SEL_NAMES_RESERVED); +DB2Storage<NamesReservedLocaleEntry> sNamesReservedLocaleStore("NamesReservedLocale.db2", NamesReservedLocaleMeta::Instance(), HOTFIX_SEL_NAMES_RESERVED_LOCALE); +DB2Storage<OverrideSpellDataEntry> sOverrideSpellDataStore("OverrideSpellData.db2", OverrideSpellDataMeta::Instance(), HOTFIX_SEL_OVERRIDE_SPELL_DATA); +DB2Storage<PhaseEntry> sPhaseStore("Phase.db2", PhaseMeta::Instance(), HOTFIX_SEL_PHASE); +DB2Storage<PhaseXPhaseGroupEntry> sPhaseXPhaseGroupStore("PhaseXPhaseGroup.db2", PhaseXPhaseGroupMeta::Instance(), HOTFIX_SEL_PHASE_X_PHASE_GROUP); +DB2Storage<PlayerConditionEntry> sPlayerConditionStore("PlayerCondition.db2", PlayerConditionMeta::Instance(), HOTFIX_SEL_PLAYER_CONDITION); +DB2Storage<PowerDisplayEntry> sPowerDisplayStore("PowerDisplay.db2", PowerDisplayMeta::Instance(), HOTFIX_SEL_POWER_DISPLAY); +DB2Storage<PvPDifficultyEntry> sPvpDifficultyStore("PvpDifficulty.db2", PvpDifficultyMeta::Instance(), HOTFIX_SEL_PVP_DIFFICULTY); +DB2Storage<QuestFactionRewardEntry> sQuestFactionRewardStore("QuestFactionReward.db2", QuestFactionRewardMeta::Instance(), HOTFIX_SEL_QUEST_FACTION_REWARD); +DB2Storage<QuestMoneyRewardEntry> sQuestMoneyRewardStore("QuestMoneyReward.db2", QuestMoneyRewardMeta::Instance(), HOTFIX_SEL_QUEST_MONEY_REWARD); +DB2Storage<QuestPackageItemEntry> sQuestPackageItemStore("QuestPackageItem.db2", QuestPackageItemMeta::Instance(), HOTFIX_SEL_QUEST_PACKAGE_ITEM); +DB2Storage<QuestSortEntry> sQuestSortStore("QuestSort.db2", QuestSortMeta::Instance(), HOTFIX_SEL_QUEST_SORT); +DB2Storage<QuestV2Entry> sQuestV2Store("QuestV2.db2", QuestV2Meta::Instance(), HOTFIX_SEL_QUEST_V2); +DB2Storage<QuestXPEntry> sQuestXPStore("QuestXP.db2", QuestXPMeta::Instance(), HOTFIX_SEL_QUEST_XP); +DB2Storage<RandPropPointsEntry> sRandPropPointsStore("RandPropPoints.db2", RandPropPointsMeta::Instance(), HOTFIX_SEL_RAND_PROP_POINTS); +DB2Storage<RulesetItemUpgradeEntry> sRulesetItemUpgradeStore("RulesetItemUpgrade.db2", RulesetItemUpgradeMeta::Instance(), HOTFIX_SEL_RULESET_ITEM_UPGRADE); +DB2Storage<ScalingStatDistributionEntry> sScalingStatDistributionStore("ScalingStatDistribution.db2", ScalingStatDistributionMeta::Instance(), HOTFIX_SEL_SCALING_STAT_DISTRIBUTION); +DB2Storage<SkillLineEntry> sSkillLineStore("SkillLine.db2", SkillLineMeta::Instance(), HOTFIX_SEL_SKILL_LINE); +DB2Storage<SkillLineAbilityEntry> sSkillLineAbilityStore("SkillLineAbility.db2", SkillLineAbilityMeta::Instance(), HOTFIX_SEL_SKILL_LINE_ABILITY); +DB2Storage<SkillRaceClassInfoEntry> sSkillRaceClassInfoStore("SkillRaceClassInfo.db2", SkillRaceClassInfoMeta::Instance(), HOTFIX_SEL_SKILL_RACE_CLASS_INFO); +DB2Storage<SoundKitEntry> sSoundKitStore("SoundKit.db2", SoundKitMeta::Instance(), HOTFIX_SEL_SOUND_KIT); +DB2Storage<SpecializationSpellsEntry> sSpecializationSpellsStore("SpecializationSpells.db2", SpecializationSpellsMeta::Instance(), HOTFIX_SEL_SPECIALIZATION_SPELLS); +DB2Storage<SpellEntry> sSpellStore("Spell.db2", SpellMeta::Instance(), HOTFIX_SEL_SPELL); +DB2Storage<SpellAuraOptionsEntry> sSpellAuraOptionsStore("SpellAuraOptions.db2", SpellAuraOptionsMeta::Instance(), HOTFIX_SEL_SPELL_AURA_OPTIONS); +DB2Storage<SpellAuraRestrictionsEntry> sSpellAuraRestrictionsStore("SpellAuraRestrictions.db2", SpellAuraRestrictionsMeta::Instance(), HOTFIX_SEL_SPELL_AURA_RESTRICTIONS); +DB2Storage<SpellCastTimesEntry> sSpellCastTimesStore("SpellCastTimes.db2", SpellCastTimesMeta::Instance(), HOTFIX_SEL_SPELL_CAST_TIMES); +DB2Storage<SpellCastingRequirementsEntry> sSpellCastingRequirementsStore("SpellCastingRequirements.db2", SpellCastingRequirementsMeta::Instance(), HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS); +DB2Storage<SpellCategoriesEntry> sSpellCategoriesStore("SpellCategories.db2", SpellCategoriesMeta::Instance(), HOTFIX_SEL_SPELL_CATEGORIES); +DB2Storage<SpellCategoryEntry> sSpellCategoryStore("SpellCategory.db2", SpellCategoryMeta::Instance(), HOTFIX_SEL_SPELL_CATEGORY); +DB2Storage<SpellClassOptionsEntry> sSpellClassOptionsStore("SpellClassOptions.db2", SpellClassOptionsMeta::Instance(), HOTFIX_SEL_SPELL_CLASS_OPTIONS); +DB2Storage<SpellCooldownsEntry> sSpellCooldownsStore("SpellCooldowns.db2", SpellCooldownsMeta::Instance(), HOTFIX_SEL_SPELL_COOLDOWNS); +DB2Storage<SpellDurationEntry> sSpellDurationStore("SpellDuration.db2", SpellDurationMeta::Instance(), HOTFIX_SEL_SPELL_DURATION); +DB2Storage<SpellEffectEntry> sSpellEffectStore("SpellEffect.db2", SpellEffectMeta::Instance(), HOTFIX_SEL_SPELL_EFFECT); +DB2Storage<SpellEffectScalingEntry> sSpellEffectScalingStore("SpellEffectScaling.db2", SpellEffectScalingMeta::Instance(), HOTFIX_SEL_SPELL_EFFECT_SCALING); +DB2Storage<SpellEquippedItemsEntry> sSpellEquippedItemsStore("SpellEquippedItems.db2", SpellEquippedItemsMeta::Instance(), HOTFIX_SEL_SPELL_EQUIPPED_ITEMS); +DB2Storage<SpellFocusObjectEntry> sSpellFocusObjectStore("SpellFocusObject.db2", SpellFocusObjectMeta::Instance(), HOTFIX_SEL_SPELL_FOCUS_OBJECT); +DB2Storage<SpellInterruptsEntry> sSpellInterruptsStore("SpellInterrupts.db2", SpellInterruptsMeta::Instance(), HOTFIX_SEL_SPELL_INTERRUPTS); +DB2Storage<SpellItemEnchantmentEntry> sSpellItemEnchantmentStore("SpellItemEnchantment.db2", SpellItemEnchantmentMeta::Instance(), HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT); +DB2Storage<SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore("SpellItemEnchantmentCondition.db2", SpellItemEnchantmentConditionMeta::Instance(), HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION); +DB2Storage<SpellLearnSpellEntry> sSpellLearnSpellStore("SpellLearnSpell.db2", SpellLearnSpellMeta::Instance(), HOTFIX_SEL_SPELL_LEARN_SPELL); +DB2Storage<SpellLevelsEntry> sSpellLevelsStore("SpellLevels.db2", SpellLevelsMeta::Instance(), HOTFIX_SEL_SPELL_LEVELS); +DB2Storage<SpellMiscEntry> sSpellMiscStore("SpellMisc.db2", SpellMiscMeta::Instance(), HOTFIX_SEL_SPELL_MISC); +DB2Storage<SpellPowerEntry> sSpellPowerStore("SpellPower.db2", SpellPowerMeta::Instance(), HOTFIX_SEL_SPELL_POWER); +DB2Storage<SpellPowerDifficultyEntry> sSpellPowerDifficultyStore("SpellPowerDifficulty.db2", SpellPowerDifficultyMeta::Instance(), HOTFIX_SEL_SPELL_POWER_DIFFICULTY); +DB2Storage<SpellProcsPerMinuteEntry> sSpellProcsPerMinuteStore("SpellProcsPerMinute.db2", SpellProcsPerMinuteMeta::Instance(), HOTFIX_SEL_SPELL_PROCS_PER_MINUTE); +DB2Storage<SpellProcsPerMinuteModEntry> sSpellProcsPerMinuteModStore("SpellProcsPerMinuteMod.db2", SpellProcsPerMinuteModMeta::Instance(), HOTFIX_SEL_SPELL_PROCS_PER_MINUTE_MOD); +DB2Storage<SpellRadiusEntry> sSpellRadiusStore("SpellRadius.db2", SpellRadiusMeta::Instance(), HOTFIX_SEL_SPELL_RADIUS); +DB2Storage<SpellRangeEntry> sSpellRangeStore("SpellRange.db2", SpellRangeMeta::Instance(), HOTFIX_SEL_SPELL_RANGE); +DB2Storage<SpellReagentsEntry> sSpellReagentsStore("SpellReagents.db2", SpellReagentsMeta::Instance(), HOTFIX_SEL_SPELL_REAGENTS); +DB2Storage<SpellScalingEntry> sSpellScalingStore("SpellScaling.db2", SpellScalingMeta::Instance(), HOTFIX_SEL_SPELL_SCALING); +DB2Storage<SpellShapeshiftEntry> sSpellShapeshiftStore("SpellShapeshift.db2", SpellShapeshiftMeta::Instance(), HOTFIX_SEL_SPELL_SHAPESHIFT); +DB2Storage<SpellShapeshiftFormEntry> sSpellShapeshiftFormStore("SpellShapeshiftForm.db2", SpellShapeshiftFormMeta::Instance(), HOTFIX_SEL_SPELL_SHAPESHIFT_FORM); +DB2Storage<SpellTargetRestrictionsEntry> sSpellTargetRestrictionsStore("SpellTargetRestrictions.db2", SpellTargetRestrictionsMeta::Instance(), HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS); +DB2Storage<SpellTotemsEntry> sSpellTotemsStore("SpellTotems.db2", SpellTotemsMeta::Instance(), HOTFIX_SEL_SPELL_TOTEMS); +DB2Storage<SpellXSpellVisualEntry> sSpellXSpellVisualStore("SpellXSpellVisual.db2", SpellXSpellVisualMeta::Instance(), HOTFIX_SEL_SPELL_X_SPELL_VISUAL); +DB2Storage<SummonPropertiesEntry> sSummonPropertiesStore("SummonProperties.db2", SummonPropertiesMeta::Instance(), HOTFIX_SEL_SUMMON_PROPERTIES); +DB2Storage<TalentEntry> sTalentStore("Talent.db2", TalentMeta::Instance(), HOTFIX_SEL_TALENT); +DB2Storage<TaxiNodesEntry> sTaxiNodesStore("TaxiNodes.db2", TaxiNodesMeta::Instance(), HOTFIX_SEL_TAXI_NODES); +DB2Storage<TaxiPathEntry> sTaxiPathStore("TaxiPath.db2", TaxiPathMeta::Instance(), HOTFIX_SEL_TAXI_PATH); +DB2Storage<TaxiPathNodeEntry> sTaxiPathNodeStore("TaxiPathNode.db2", TaxiPathNodeMeta::Instance(), HOTFIX_SEL_TAXI_PATH_NODE); +DB2Storage<TotemCategoryEntry> sTotemCategoryStore("TotemCategory.db2", TotemCategoryMeta::Instance(), HOTFIX_SEL_TOTEM_CATEGORY); +DB2Storage<ToyEntry> sToyStore("Toy.db2", ToyMeta::Instance(), HOTFIX_SEL_TOY); +DB2Storage<TransportAnimationEntry> sTransportAnimationStore("TransportAnimation.db2", TransportAnimationMeta::Instance(), HOTFIX_SEL_TRANSPORT_ANIMATION); +DB2Storage<TransportRotationEntry> sTransportRotationStore("TransportRotation.db2", TransportRotationMeta::Instance(), HOTFIX_SEL_TRANSPORT_ROTATION); +DB2Storage<UnitPowerBarEntry> sUnitPowerBarStore("UnitPowerBar.db2", UnitPowerBarMeta::Instance(), HOTFIX_SEL_UNIT_POWER_BAR); +DB2Storage<VehicleEntry> sVehicleStore("Vehicle.db2", VehicleMeta::Instance(), HOTFIX_SEL_VEHICLE); +DB2Storage<VehicleSeatEntry> sVehicleSeatStore("VehicleSeat.db2", VehicleSeatMeta::Instance(), HOTFIX_SEL_VEHICLE_SEAT); +DB2Storage<WMOAreaTableEntry> sWMOAreaTableStore("WMOAreaTable.db2", WMOAreaTableMeta::Instance(), HOTFIX_SEL_WMO_AREA_TABLE); +DB2Storage<WorldMapAreaEntry> sWorldMapAreaStore("WorldMapArea.db2", WorldMapAreaMeta::Instance(), HOTFIX_SEL_WORLD_MAP_AREA); +DB2Storage<WorldMapOverlayEntry> sWorldMapOverlayStore("WorldMapOverlay.db2", WorldMapOverlayMeta::Instance(), HOTFIX_SEL_WORLD_MAP_OVERLAY); +DB2Storage<WorldMapTransformsEntry> sWorldMapTransformsStore("WorldMapTransforms.db2", WorldMapTransformsMeta::Instance(), HOTFIX_SEL_WORLD_MAP_TRANSFORMS); +DB2Storage<WorldSafeLocsEntry> sWorldSafeLocsStore("WorldSafeLocs.db2", WorldSafeLocsMeta::Instance(), HOTFIX_SEL_WORLD_SAFE_LOCS); TaxiMask sTaxiNodesMask; TaxiMask sOldContinentsNodesMask; @@ -142,17 +220,17 @@ TaxiMask sAllianceTaxiNodesMask; TaxiPathSetBySource sTaxiPathSetBySource; TaxiPathNodesByPath sTaxiPathNodesByPath; -typedef std::list<std::string> DB2StoreProblemList; +typedef std::vector<std::string> DB2StoreProblemList; uint32 DB2FilesCount = 0; -template<class T> -inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, DB2Manager::StorageMap& stores, DB2Storage<T>* storage, std::string const& db2Path, uint32 defaultLocale) +template<class T, template<class> class DB2> +inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, DB2Manager::StorageMap& stores, DB2StorageBase* storage, std::string const& db2Path, uint32 defaultLocale, DB2<T> 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; @@ -175,10 +253,10 @@ 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()) + 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); @@ -188,7 +266,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() @@ -206,42 +284,70 @@ 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(sAreaGroupMemberStore); - LOAD_DB2(sBattlePetBreedQualityStore); - LOAD_DB2(sBattlePetBreedStateStore); + 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(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); LOAD_DB2(sCinematicSequencesStore); LOAD_DB2(sCreatureDisplayInfoStore); + LOAD_DB2(sCreatureDisplayInfoExtraStore); + LOAD_DB2(sCreatureFamilyStore); + LOAD_DB2(sCreatureModelDataStore); 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(sFactionStore); + LOAD_DB2(sFactionTemplateStore); LOAD_DB2(sGameObjectsStore); - LOAD_DB2(sGameTablesStore); + LOAD_DB2(sGameObjectDisplayInfoStore); 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(sGlyphSlotStore); + LOAD_DB2(sGarrSiteLevelPlotInstStore); + LOAD_DB2(sGemPropertiesStore); + LOAD_DB2(sGlyphPropertiesStore); + LOAD_DB2(sGuildColorBackgroundStore); + LOAD_DB2(sGuildColorBorderStore); + LOAD_DB2(sGuildColorEmblemStore); LOAD_DB2(sGuildPerkSpellsStore); LOAD_DB2(sHeirloomStore); LOAD_DB2(sHolidaysStore); @@ -250,54 +356,93 @@ 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(sItemChildEquipmentStore); LOAD_DB2(sItemCurrencyCostStore); + LOAD_DB2(sItemDamageAmmoStore); + LOAD_DB2(sItemDamageOneHandStore); + 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); LOAD_DB2(sItemPriceBaseStore); LOAD_DB2(sItemRandomPropertiesStore); LOAD_DB2(sItemRandomSuffixStore); + LOAD_DB2(sItemSearchNameStore); + 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(sItemUpgradeStore); 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); LOAD_DB2(sMountTypeXCapabilityStore); + LOAD_DB2(sMovieStore); LOAD_DB2(sNameGenStore); LOAD_DB2(sNamesProfanityStore); LOAD_DB2(sNamesReservedStore); LOAD_DB2(sNamesReservedLocaleStore); LOAD_DB2(sOverrideSpellDataStore); + LOAD_DB2(sPhaseStore); LOAD_DB2(sPhaseXPhaseGroupStore); LOAD_DB2(sPlayerConditionStore); + LOAD_DB2(sPowerDisplayStore); + LOAD_DB2(sPvpDifficultyStore); + LOAD_DB2(sQuestFactionRewardStore); LOAD_DB2(sQuestMoneyRewardStore); LOAD_DB2(sQuestPackageItemStore); LOAD_DB2(sQuestSortStore); LOAD_DB2(sQuestV2Store); LOAD_DB2(sQuestXPStore); + LOAD_DB2(sRandPropPointsStore); LOAD_DB2(sRulesetItemUpgradeStore); 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(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); LOAD_DB2(sSpellMiscStore); LOAD_DB2(sSpellPowerStore); LOAD_DB2(sSpellPowerDifficultyStore); @@ -306,45 +451,143 @@ 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(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); + std::unordered_map<uint32, std::set<std::pair<uint8, uint8>>> addedSections; + for (CharSectionsEntry const* charSection : sCharSectionsStore) + { + if (!charSection->Race || !((1 << (charSection->Race - 1)) & RACEMASK_ALL_PLAYABLE)) //ignore Nonplayable races + continue; + + // Not all sections are used for low-res models but we need to get all sections for validation since its viewer dependent + uint8 baseSection = charSection->GenType; + switch (baseSection) + { + case SECTION_TYPE_SKIN_LOW_RES: + case SECTION_TYPE_FACE_LOW_RES: + case SECTION_TYPE_FACIAL_HAIR_LOW_RES: + case SECTION_TYPE_HAIR_LOW_RES: + case SECTION_TYPE_UNDERWEAR_LOW_RES: + baseSection = baseSection + SECTION_TYPE_SKIN; + break; + case SECTION_TYPE_SKIN: + case SECTION_TYPE_FACE: + case SECTION_TYPE_FACIAL_HAIR: + case SECTION_TYPE_HAIR: + case SECTION_TYPE_UNDERWEAR: + break; + case SECTION_TYPE_CUSTOM_DISPLAY_1_LOW_RES: + case SECTION_TYPE_CUSTOM_DISPLAY_2_LOW_RES: + case SECTION_TYPE_CUSTOM_DISPLAY_3_LOW_RES: + ++baseSection; + break; + case SECTION_TYPE_CUSTOM_DISPLAY_1: + case SECTION_TYPE_CUSTOM_DISPLAY_2: + case SECTION_TYPE_CUSTOM_DISPLAY_3: + break; + default: + break; + } + + uint32 sectionKey = baseSection | (charSection->Gender << 8) | (charSection->Race << 16); + std::pair<uint8, uint8> sectionCombination{ charSection->Type, charSection->Color }; + if (addedSections[sectionKey].count(sectionCombination)) + continue; + + addedSections[sectionKey].insert(sectionCombination); + _charSections.insert({ sectionKey, charSection }); + } + for (CharStartOutfitEntry const* outfit : sCharStartOutfitStore) _charStartOutfits[outfit->RaceID | (outfit->ClassID << 8) | (outfit->GenderID << 16)] = outfit; - sChrClassesXPowerTypesStore.Sort(&ChrClassesXPowerTypesEntryComparator::Compare); - for (uint32 i = 0; i < MAX_CLASSES; ++i) - for (uint32 j = 0; j < MAX_POWERS; ++j) - _powersByClass[i][j] = MAX_POWERS; + { + std::set<ChrClassesXPowerTypesEntry const*, ChrClassesXPowerTypesEntryComparator> powers; + for (ChrClassesXPowerTypesEntry const* power : sChrClassesXPowerTypesStore) + powers.insert(power); - for (ChrClassesXPowerTypesEntry const* power : sChrClassesXPowerTypesStore) + 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; + + ASSERT(power->PowerType < MAX_POWERS); + _powersByClass[power->ClassID][power->PowerType] = index; + } + } + + memset(_chrSpecializationsByIndex, 0, sizeof(_chrSpecializationsByIndex)); + for (ChrSpecializationEntry const* chrSpec : sChrSpecializationStore) { - uint32 index = 0; - for (uint32 j = 0; j < MAX_POWERS; ++j) - if (_powersByClass[power->ClassID][j] != MAX_POWERS) - ++index; + ASSERT(chrSpec->ClassID < MAX_CLASSES); + ASSERT(chrSpec->OrderIndex < MAX_SPECIALIZATIONS); + + uint32 storageIndex = chrSpec->ClassID; + if (chrSpec->Flags & CHR_SPECIALIZATION_FLAG_PET_OVERRIDE_SPEC) + { + ASSERT(!chrSpec->ClassID); + storageIndex = PET_SPEC_OVERRIDE_CLASS_INDEX; + } - _powersByClass[power->ClassID][power->PowerType] = index; + _chrSpecializationsByIndex[storageIndex][chrSpec->OrderIndex] = chrSpec; } - for (GlyphSlotEntry const* glyphSlot : sGlyphSlotStore) - if (glyphSlot->Type == GLYPH_SLOT_MAJOR || glyphSlot->Type == GLYPH_SLOT_MINOR) - _glyphSlots.insert(glyphSlot); + 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; + + 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) + 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 (HeirloomEntry const* heirloom : sHeirloomStore) + _heirlooms[heirloom->ItemID] = heirloom; for (ItemBonusEntry const* bonus : sItemBonusStore) _itemBonusLists[bonus->BonusListID].push_back(bonus); @@ -359,12 +602,27 @@ 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); + for (ItemModifiedAppearanceEntry const* appearanceMod : sItemModifiedAppearanceStore) - if (ItemAppearanceEntry const* appearance = sItemAppearanceStore.LookupEntry(appearanceMod->AppearanceID)) - _itemDisplayIDs[appearanceMod->ItemID | (appearanceMod->AppearanceModID << 24)] = appearance->DisplayID; + { + ASSERT(appearanceMod->ItemID <= 0xFFFFFF); + ASSERT(appearanceMod->AppearanceModID <= 0xFF); + _itemModifiedAppearancesByItem[appearanceMod->ItemID | (appearanceMod->AppearanceModID << 24)] = appearanceMod; + } + + 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 }); @@ -379,14 +637,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) { @@ -423,14 +685,22 @@ 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) + { + 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); for (RulesetItemUpgradeEntry const* rulesetItemUpgrade : sRulesetItemUpgradeStore) - if (rulesetItemUpgrade->RulesetID == 1) // xref to Cfg_Regions.db2, RulesetID column. 1 is the value for EU region we send hardcoded in SMSG_INITIAL_SETUP, possible other value for RulesetID is 2 in korean region - _rulesetItemUpgrade[rulesetItemUpgrade->ItemID] = rulesetItemUpgrade->ItemUpgradeID; + _rulesetItemUpgrade[rulesetItemUpgrade->ItemID] = rulesetItemUpgrade->ItemUpgradeID; + + 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); @@ -458,6 +728,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", 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); + } + for (TaxiPathEntry const* entry : sTaxiPathStore) sTaxiPathSetBySource[entry->From][entry->To] = TaxiPathBySourceAndDestination(entry->ID, entry->Cost); @@ -467,8 +746,8 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) std::vector<uint32> 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 @@ -524,8 +803,11 @@ 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; + 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) @@ -536,7 +818,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) else if (!bad_db2_files.empty()) { std::string str; - for (std::list<std::string>::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()); @@ -544,8 +826,13 @@ 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 (!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); @@ -638,6 +925,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)); @@ -647,11 +944,74 @@ CharStartOutfitEntry const* DB2Manager::GetCharStartOutfitEntry(uint8 race, uint return itr->second; } +char const* DB2Manager::GetClassName(uint8 class_, LocaleConstant locale /*= DEFAULT_LOCALE*/) +{ + 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 { 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]; +} + +ChrSpecializationEntry const* DB2Manager::GetChrSpecializationByIndex(uint32 class_, uint32 index) const +{ + return _chrSpecializationsByIndex[class_][index]; +} + +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_)); + 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; +} + +std::vector<uint32> 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 @@ -710,21 +1070,48 @@ std::set<uint32> 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 { - auto itr = _itemDisplayIDs.find(itemId | (appearanceModId << 24)); - if (itr != _itemDisplayIDs.end()) + if (ItemModifiedAppearanceEntry const* modifiedAppearance = GetItemModifiedAppearance(itemId, appearanceModId)) + if (ItemAppearanceEntry const* itemAppearance = sItemAppearanceStore.LookupEntry(modifiedAppearance->AppearanceID)) + return itemAppearance->DisplayID; + + return 0; +} + +ItemModifiedAppearanceEntry const* DB2Manager::GetItemModifiedAppearance(uint32 itemId, uint32 appearanceModId) const +{ + auto itr = _itemModifiedAppearancesByItem.find(itemId | (appearanceModId << 24)); + if (itr != _itemModifiedAppearancesByItem.end()) return itr->second; // Fall back to unmodified appearance if (appearanceModId) { - itr = _itemDisplayIDs.find(itemId); - if (itr != _itemDisplayIDs.end()) + itr = _itemModifiedAppearancesByItem.find(itemId); + if (itr != _itemModifiedAppearancesByItem.end()) return itr->second; } - return 0; + return nullptr; +} + +std::vector<ItemSetSpellEntry const*> const* DB2Manager::GetItemSetSpells(uint32 itemSetId) const +{ + auto itr = _itemSetSpells.find(itemSetId); + if (itr != _itemSetSpells.end()) + return &itr->second; + + return nullptr; } std::vector<ItemSpecOverrideEntry const*> const* DB2Manager::GetItemSpecOverrides(uint32 itemId) const @@ -736,21 +1123,102 @@ std::vector<ItemSpecOverrideEntry const*> 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 @@ -776,6 +1244,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]) @@ -790,6 +1275,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<QuestPackageItemEntry const*> const* DB2Manager::GetQuestPackageItems(uint32 questPackageID) const { auto itr = _questPackages.find(questPackageID); @@ -826,6 +1345,22 @@ uint32 DB2Manager::GetRulesetItemUpgrade(uint32 itemId) const return 0; } +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<SpecializationSpellsEntry const*> const* DB2Manager::GetSpecializationSpells(uint32 specId) const { auto itr = _specializationSpellsBySpec.find(specId); @@ -886,11 +1421,128 @@ std::vector<SpellProcsPerMinuteModEntry const*> DB2Manager::GetSpellProcsPerMinu return std::vector<SpellProcsPerMinuteModEntry const*>(); } +std::vector<TalentEntry const*> 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) + 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; } +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); + 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) @@ -898,16 +1550,9 @@ 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) 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 b7201f7d47d..fdf3b744c4c 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -25,24 +25,46 @@ #include <array> TC_GAME_API extern DB2Storage<AchievementEntry> sAchievementStore; +TC_GAME_API extern DB2Storage<AnimKitEntry> sAnimKitStore; +TC_GAME_API extern DB2Storage<AreaTableEntry> sAreaTableStore; +TC_GAME_API extern DB2Storage<AreaTriggerEntry> sAreaTriggerStore; +TC_GAME_API extern DB2Storage<ArmorLocationEntry> sArmorLocationStore; TC_GAME_API extern DB2Storage<AuctionHouseEntry> sAuctionHouseStore; +TC_GAME_API extern DB2Storage<BankBagSlotPricesEntry> sBankBagSlotPricesStore; +TC_GAME_API extern DB2Storage<BannedAddOnsEntry> sBannedAddOnsStore; TC_GAME_API extern DB2Storage<BarberShopStyleEntry> sBarberShopStyleStore; TC_GAME_API extern DB2Storage<BattlePetBreedQualityEntry> sBattlePetBreedQualityStore; TC_GAME_API extern DB2Storage<BattlePetBreedStateEntry> sBattlePetBreedStateStore; TC_GAME_API extern DB2Storage<BattlePetSpeciesEntry> sBattlePetSpeciesStore; TC_GAME_API extern DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore; +TC_GAME_API extern DB2Storage<BattlemasterListEntry> sBattlemasterListStore; TC_GAME_API extern DB2Storage<BroadcastTextEntry> sBroadcastTextStore; TC_GAME_API extern DB2Storage<CharStartOutfitEntry> sCharStartOutfitStore; +TC_GAME_API extern DB2Storage<CharTitlesEntry> sCharTitlesStore; +TC_GAME_API extern DB2Storage<ChatChannelsEntry> sChatChannelsStore; +TC_GAME_API extern DB2Storage<ChrClassesEntry> sChrClassesStore; +TC_GAME_API extern DB2Storage<ChrRacesEntry> sChrRacesStore; +TC_GAME_API extern DB2Storage<ChrSpecializationEntry> sChrSpecializationStore; TC_GAME_API extern DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore; TC_GAME_API extern DB2Storage<CreatureDisplayInfoEntry> sCreatureDisplayInfoStore; +TC_GAME_API extern DB2Storage<CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore; +TC_GAME_API extern DB2Storage<CreatureFamilyEntry> sCreatureFamilyStore; +TC_GAME_API extern DB2Storage<CreatureModelDataEntry> sCreatureModelDataStore; TC_GAME_API extern DB2Storage<CreatureTypeEntry> sCreatureTypeStore; TC_GAME_API extern DB2Storage<CriteriaEntry> sCriteriaStore; TC_GAME_API extern DB2Storage<CriteriaTreeEntry> sCriteriaTreeStore; TC_GAME_API extern DB2Storage<CurrencyTypesEntry> sCurrencyTypesStore; TC_GAME_API extern DB2Storage<DestructibleModelDataEntry> sDestructibleModelDataStore; +TC_GAME_API extern DB2Storage<DifficultyEntry> sDifficultyStore; +TC_GAME_API extern DB2Storage<DungeonEncounterEntry> sDungeonEncounterStore; +TC_GAME_API extern DB2Storage<DurabilityCostsEntry> sDurabilityCostsStore; TC_GAME_API extern DB2Storage<DurabilityQualityEntry> sDurabilityQualityStore; +TC_GAME_API extern DB2Storage<EmotesEntry> sEmotesStore; +TC_GAME_API extern DB2Storage<EmotesTextEntry> sEmotesTextStore; +TC_GAME_API extern DB2Storage<FactionEntry> sFactionStore; +TC_GAME_API extern DB2Storage<FactionTemplateEntry> sFactionTemplateStore; TC_GAME_API extern DB2Storage<GameObjectsEntry> sGameObjectsStore; -TC_GAME_API extern DB2Storage<GameTablesEntry> sGameTablesStore; +TC_GAME_API extern DB2Storage<GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore; TC_GAME_API extern DB2Storage<GarrAbilityEntry> sGarrAbilityStore; TC_GAME_API extern DB2Storage<GarrBuildingEntry> sGarrBuildingStore; TC_GAME_API extern DB2Storage<GarrBuildingPlotInstEntry> sGarrBuildingPlotInstStore; @@ -54,61 +76,123 @@ TC_GAME_API extern DB2Storage<GarrPlotEntry> sGarrPlotSto TC_GAME_API extern DB2Storage<GarrPlotInstanceEntry> sGarrPlotInstanceStore; TC_GAME_API extern DB2Storage<GarrSiteLevelEntry> sGarrSiteLevelStore; TC_GAME_API extern DB2Storage<GarrSiteLevelPlotInstEntry> sGarrSiteLevelPlotInstStore; -TC_GAME_API extern DB2Storage<GlyphSlotEntry> sGlyphSlotStore; +TC_GAME_API extern DB2Storage<GemPropertiesEntry> sGemPropertiesStore; +TC_GAME_API extern DB2Storage<GlyphPropertiesEntry> sGlyphPropertiesStore; +TC_GAME_API extern DB2Storage<GuildColorBackgroundEntry> sGuildColorBackgroundStore; +TC_GAME_API extern DB2Storage<GuildColorBorderEntry> sGuildColorBorderStore; +TC_GAME_API extern DB2Storage<GuildColorEmblemEntry> sGuildColorEmblemStore; TC_GAME_API extern DB2Storage<GuildPerkSpellsEntry> sGuildPerkSpellsStore; -TC_GAME_API extern DB2Storage<HeirloomEntry> sHeirloomStore; TC_GAME_API extern DB2Storage<HolidaysEntry> sHolidaysStore; TC_GAME_API extern DB2Storage<ImportPriceArmorEntry> sImportPriceArmorStore; TC_GAME_API extern DB2Storage<ImportPriceQualityEntry> sImportPriceQualityStore; TC_GAME_API extern DB2Storage<ImportPriceShieldEntry> sImportPriceShieldStore; TC_GAME_API extern DB2Storage<ImportPriceWeaponEntry> sImportPriceWeaponStore; +TC_GAME_API extern DB2Storage<ItemArmorQualityEntry> sItemArmorQualityStore; +TC_GAME_API extern DB2Storage<ItemArmorShieldEntry> sItemArmorShieldStore; +TC_GAME_API extern DB2Storage<ItemArmorTotalEntry> sItemArmorTotalStore; +TC_GAME_API extern DB2Storage<ItemBagFamilyEntry> sItemBagFamilyStore; TC_GAME_API extern DB2Storage<ItemClassEntry> sItemClassStore; -TC_GAME_API extern DB2Storage<ItemCurrencyCostEntry> sItemCurrencyCostStore; +TC_GAME_API extern DB2Storage<ItemDamageAmmoEntry> sItemDamageAmmoStore; +TC_GAME_API extern DB2Storage<ItemDamageOneHandEntry> sItemDamageOneHandStore; +TC_GAME_API extern DB2Storage<ItemDamageOneHandCasterEntry> sItemDamageOneHandCasterStore; +TC_GAME_API extern DB2Storage<ItemDamageTwoHandEntry> sItemDamageTwoHandStore; +TC_GAME_API extern DB2Storage<ItemDamageTwoHandCasterEntry> sItemDamageTwoHandCasterStore; TC_GAME_API extern DB2Storage<ItemDisenchantLootEntry> sItemDisenchantLootStore; TC_GAME_API extern DB2Storage<ItemEffectEntry> sItemEffectStore; TC_GAME_API extern DB2Storage<ItemEntry> sItemStore; TC_GAME_API extern DB2Storage<ItemExtendedCostEntry> sItemExtendedCostStore; TC_GAME_API extern DB2Storage<ItemLimitCategoryEntry> sItemLimitCategoryStore; +TC_GAME_API extern DB2Storage<ItemModifiedAppearanceEntry> sItemModifiedAppearanceStore; TC_GAME_API extern DB2Storage<ItemPriceBaseEntry> sItemPriceBaseStore; TC_GAME_API extern DB2Storage<ItemRandomPropertiesEntry> sItemRandomPropertiesStore; TC_GAME_API extern DB2Storage<ItemRandomSuffixEntry> sItemRandomSuffixStore; -TC_GAME_API extern DB2Storage<ItemSparseEntry> sItemSparseStore; +TC_GAME_API extern DB2Storage<ItemSearchNameEntry> sItemSearchNameStore; +TC_GAME_API extern DB2Storage<ItemSetEntry> sItemSetStore; +TC_GAME_API extern DB2Storage<ItemSetSpellEntry> sItemSetSpellStore; +TC_GAME_API extern DB2SparseStorage<ItemSparseEntry> sItemSparseStore; TC_GAME_API extern DB2Storage<ItemSpecEntry> sItemSpecStore; TC_GAME_API extern DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore; -TC_GAME_API extern DB2Storage<ItemToBattlePetSpeciesEntry> sItemToBattlePetSpeciesStore; TC_GAME_API extern DB2Storage<ItemUpgradeEntry> sItemUpgradeStore; +TC_GAME_API extern DB2Storage<LfgDungeonsEntry> sLfgDungeonsStore; +TC_GAME_API extern DB2Storage<LiquidTypeEntry> sLiquidTypeStore; +TC_GAME_API extern DB2Storage<LockEntry> sLockStore; TC_GAME_API extern DB2Storage<MailTemplateEntry> sMailTemplateStore; +TC_GAME_API extern DB2Storage<MapEntry> sMapStore; TC_GAME_API extern DB2Storage<ModifierTreeEntry> sModifierTreeStore; TC_GAME_API extern DB2Storage<MountCapabilityEntry> sMountCapabilityStore; +TC_GAME_API extern DB2Storage<MovieEntry> sMovieStore; TC_GAME_API extern DB2Storage<OverrideSpellDataEntry> sOverrideSpellDataStore; +TC_GAME_API extern DB2Storage<PhaseEntry> sPhaseStore; TC_GAME_API extern DB2Storage<PlayerConditionEntry> sPlayerConditionStore; +TC_GAME_API extern DB2Storage<PowerDisplayEntry> sPowerDisplayStore; +TC_GAME_API extern DB2Storage<QuestFactionRewardEntry> sQuestFactionRewardStore; TC_GAME_API extern DB2Storage<QuestMoneyRewardEntry> sQuestMoneyRewardStore; TC_GAME_API extern DB2Storage<QuestSortEntry> sQuestSortStore; TC_GAME_API extern DB2Storage<QuestXPEntry> sQuestXPStore; +TC_GAME_API extern DB2Storage<RandPropPointsEntry> sRandPropPointsStore; TC_GAME_API extern DB2Storage<ScalingStatDistributionEntry> sScalingStatDistributionStore; -TC_GAME_API extern DB2Storage<SoundEntriesEntry> sSoundEntriesStore; +TC_GAME_API extern DB2Storage<SkillLineEntry> sSkillLineStore; +TC_GAME_API extern DB2Storage<SkillLineAbilityEntry> sSkillLineAbilityStore; +TC_GAME_API extern DB2Storage<SkillRaceClassInfoEntry> sSkillRaceClassInfoStore; +TC_GAME_API extern DB2Storage<SoundKitEntry> sSoundKitStore; +TC_GAME_API extern DB2Storage<SpellEntry> sSpellStore; +TC_GAME_API extern DB2Storage<SpellAuraOptionsEntry> sSpellAuraOptionsStore; TC_GAME_API extern DB2Storage<SpellAuraRestrictionsEntry> sSpellAuraRestrictionsStore; TC_GAME_API extern DB2Storage<SpellCastTimesEntry> sSpellCastTimesStore; TC_GAME_API extern DB2Storage<SpellCastingRequirementsEntry> sSpellCastingRequirementsStore; +TC_GAME_API extern DB2Storage<SpellCategoriesEntry> sSpellCategoriesStore; +TC_GAME_API extern DB2Storage<SpellCategoryEntry> sSpellCategoryStore; TC_GAME_API extern DB2Storage<SpellClassOptionsEntry> sSpellClassOptionsStore; +TC_GAME_API extern DB2Storage<SpellCooldownsEntry> sSpellCooldownsStore; TC_GAME_API extern DB2Storage<SpellDurationEntry> sSpellDurationStore; +TC_GAME_API extern DB2Storage<SpellEffectEntry> sSpellEffectStore; +TC_GAME_API extern DB2Storage<SpellEffectScalingEntry> sSpellEffectScalingStore; +TC_GAME_API extern DB2Storage<SpellEquippedItemsEntry> sSpellEquippedItemsStore; +TC_GAME_API extern DB2Storage<SpellFocusObjectEntry> sSpellFocusObjectStore; +TC_GAME_API extern DB2Storage<SpellInterruptsEntry> sSpellInterruptsStore; +TC_GAME_API extern DB2Storage<SpellItemEnchantmentEntry> sSpellItemEnchantmentStore; TC_GAME_API extern DB2Storage<SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore; TC_GAME_API extern DB2Storage<SpellLearnSpellEntry> sSpellLearnSpellStore; +TC_GAME_API extern DB2Storage<SpellLevelsEntry> sSpellLevelsStore; TC_GAME_API extern DB2Storage<SpellMiscEntry> sSpellMiscStore; TC_GAME_API extern DB2Storage<SpellPowerEntry> sSpellPowerStore; TC_GAME_API extern DB2Storage<SpellProcsPerMinuteEntry> sSpellProcsPerMinuteStore; TC_GAME_API extern DB2Storage<SpellRadiusEntry> sSpellRadiusStore; TC_GAME_API extern DB2Storage<SpellRangeEntry> sSpellRangeStore; TC_GAME_API extern DB2Storage<SpellReagentsEntry> sSpellReagentsStore; -TC_GAME_API extern DB2Storage<SpellRuneCostEntry> sSpellRuneCostStore; +TC_GAME_API extern DB2Storage<SpellScalingEntry> sSpellScalingStore; +TC_GAME_API extern DB2Storage<SpellShapeshiftEntry> sSpellShapeshiftStore; +TC_GAME_API extern DB2Storage<SpellShapeshiftFormEntry> sSpellShapeshiftFormStore; +TC_GAME_API extern DB2Storage<SpellTargetRestrictionsEntry> sSpellTargetRestrictionsStore; TC_GAME_API extern DB2Storage<SpellTotemsEntry> sSpellTotemsStore; TC_GAME_API extern DB2Storage<SpellXSpellVisualEntry> sSpellXSpellVisualStore; +TC_GAME_API extern DB2Storage<SummonPropertiesEntry> sSummonPropertiesStore; +TC_GAME_API extern DB2Storage<TalentEntry> sTalentStore; TC_GAME_API extern DB2Storage<TaxiNodesEntry> sTaxiNodesStore; TC_GAME_API extern DB2Storage<TaxiPathEntry> sTaxiPathStore; -TC_GAME_API extern DB2Storage<TotemCategoryEntry> sTotemCategoryStore; -TC_GAME_API extern DB2Storage<ToyEntry> sToyStore; TC_GAME_API extern DB2Storage<UnitPowerBarEntry> sUnitPowerBarStore; +TC_GAME_API extern DB2Storage<VehicleEntry> sVehicleStore; +TC_GAME_API extern DB2Storage<VehicleSeatEntry> sVehicleSeatStore; TC_GAME_API extern DB2Storage<WorldMapOverlayEntry> sWorldMapOverlayStore; +TC_GAME_API extern DB2Storage<WorldSafeLocsEntry> sWorldSafeLocsStore; + +struct TaxiPathBySourceAndDestination +{ + TaxiPathBySourceAndDestination() : ID(0), price(0) { } + TaxiPathBySourceAndDestination(uint32 _id, uint32 _price) : ID(_id), price(_price) { } + + uint32 ID; + uint32 price; +}; + +typedef std::map<uint32, TaxiPathBySourceAndDestination> TaxiPathSetForSource; +typedef std::map<uint32, TaxiPathSetForSource> TaxiPathSetBySource; + +typedef std::vector<TaxiPathNodeEntry const*> TaxiPathNodeList; +typedef std::vector<TaxiPathNodeList> TaxiPathNodesByPath; + +#define TaxiMaskSize 236 +typedef std::array<uint8, TaxiMaskSize> TaxiMask; TC_GAME_API extern TaxiMask sTaxiNodesMask; TC_GAME_API extern TaxiMask sOldContinentsNodesMask; @@ -137,21 +221,26 @@ class TC_GAME_API DB2Manager { public: DEFINE_DB2_SET_COMPARATOR(ChrClassesXPowerTypesEntry); - DEFINE_DB2_SET_COMPARATOR(GlyphSlotEntry); DEFINE_DB2_SET_COMPARATOR(MountTypeXCapabilityEntry); typedef std::map<uint32 /*hash*/, DB2StorageBase*> StorageMap; typedef std::unordered_map<uint32 /*areaGroupId*/, std::vector<uint32/*areaId*/>> AreaGroupMemberContainer; + typedef std::unordered_multimap<uint32, CharSectionsEntry const*> CharSectionsContainer; typedef std::unordered_map<uint32, CharStartOutfitEntry const*> CharStartOutfitContainer; - typedef std::set<GlyphSlotEntry const*, GlyphSlotEntryComparator> GlyphSlotContainer; + typedef ChrSpecializationEntry const* ChrSpecializationByIndexContainer[MAX_CLASSES + 1][MAX_SPECIALIZATIONS]; + typedef std::map<std::tuple<uint32, uint8, uint8, uint8>, EmotesTextSoundEntry const*> EmotesTextSoundContainer; + typedef std::unordered_map<uint32, std::vector<uint32>> FactionTeamContainer; typedef std::map<uint32 /*curveID*/, std::map<uint32/*index*/, CurvePointEntry const*, std::greater<uint32>>> HeirloomCurvesContainer; typedef std::unordered_map<uint32, HeirloomEntry const*> HeirloomItemsContainer; typedef std::vector<ItemBonusEntry const*> ItemBonusList; typedef std::unordered_map<uint32 /*bonusListId*/, ItemBonusList> ItemBonusListContainer; typedef std::unordered_multimap<uint32 /*itemId*/, uint32 /*bonusTreeId*/> ItemToBonusTreeContainer; - typedef std::unordered_map<uint32 /*itemId | appearanceMod << 24*/, uint32> ItemDisplayIdContainer; + typedef std::unordered_map<uint32 /*itemId*/, ItemChildEquipmentEntry const*> ItemChildEquipmentContainer; + typedef std::unordered_map<uint32 /*itemId | appearanceMod << 24*/, ItemModifiedAppearanceEntry const*> ItemModifiedAppearanceByItemContainer; typedef std::unordered_map<uint32, std::set<ItemBonusTreeNodeEntry const*>> ItemBonusTreeContainer; + typedef std::unordered_map<uint32, std::vector<ItemSetSpellEntry const*>> ItemSetSpellContainer; typedef std::unordered_map<uint32, std::vector<ItemSpecOverrideEntry const*>> ItemSpecOverridesContainer; + typedef std::unordered_map<uint32, std::unordered_map<uint32, MapDifficultyEntry const*>> MapDifficultyContainer; typedef std::unordered_map<uint32, MountEntry const*> MountContainer; typedef std::set<MountTypeXCapabilityEntry const*, MountTypeXCapabilityEntryComparator> MountTypeXCapabilitySet; typedef std::unordered_map<uint32, MountTypeXCapabilitySet> MountCapabilitiesByTypeContainer; @@ -160,11 +249,16 @@ public: typedef std::unordered_map<uint32, std::set<uint32>> PhaseGroupContainer; typedef std::unordered_map<uint32, std::vector<QuestPackageItemEntry const*>> QuestPackageItemContainer; typedef std::unordered_map<uint32, uint32> RulesetItemUpgradeContainer; + typedef std::unordered_multimap<uint32, SkillRaceClassInfoEntry const*> SkillRaceClassInfoContainer; typedef std::unordered_map<uint32, std::vector<SpecializationSpellsEntry const*>> SpecializationSpellsContainer; typedef std::unordered_map<uint32, std::vector<SpellPowerEntry const*>> SpellPowerContainer; typedef std::unordered_map<uint32, std::unordered_map<uint32, std::vector<SpellPowerEntry const*>>> SpellPowerDifficultyContainer; typedef std::unordered_map<uint32, std::vector<SpellProcsPerMinuteModEntry const*>> SpellProcsPerMinuteModContainer; + typedef std::vector<TalentEntry const*> TalentsByPosition[MAX_CLASSES][MAX_TALENT_TIERS][MAX_TALENT_COLUMNS]; typedef std::unordered_set<uint32> ToyItemIdsContainer; + typedef std::tuple<int16, int8, int32> WMOAreaTableKey; + typedef std::map<WMOAreaTableKey, WMOAreaTableEntry const*> WMOAreaTableLookupContainer; + typedef std::unordered_map<uint32, WorldMapAreaEntry const*> WorldMapAreaByAreaIDContainer; static DB2Manager& Instance(); @@ -177,56 +271,93 @@ public: std::vector<uint32> 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; + static char const* GetClassName(uint8 class_, LocaleConstant locale = DEFAULT_LOCALE); uint32 GetPowerIndexByClass(uint32 powerType, uint32 classId) const; - GlyphSlotContainer const& GetGlyphSlots() const { return _glyphSlots; } + 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<uint32> const* GetFactionTeamList(uint32 faction) const; uint32 GetHeirloomItemLevel(uint32 curveId, uint32 level) const; HeirloomEntry const* GetHeirloomByItemId(uint32 itemId) const; ItemBonusList const* GetItemBonusList(uint32 bonusListId) const; std::set<uint32> 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; + std::vector<ItemSetSpellEntry const*> const* GetItemSetSpells(uint32 itemSetId) const; std::vector<ItemSpecOverrideEntry const*> 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; MountTypeXCapabilitySet const* GetMountCapabilities(uint32 mountType) const; ResponseCodes ValidateName(std::string const& name, LocaleConstant locale) const; + std::set<uint32> GetPhasesForGroup(uint32 group) const; + static PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level); + static PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id); std::vector<QuestPackageItemEntry const*> const* GetQuestPackageItems(uint32 questPackageID) const; uint32 GetQuestUniqueBitFlag(uint32 questId); - std::set<uint32> GetPhasesForGroup(uint32 group) const; uint32 GetRulesetItemUpgrade(uint32 itemId) const; - std::vector<SpecializationSpellsEntry const*> const* GetSpecializationSpells(uint32 specId) const; + SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_); std::vector<SpecializationSpellsEntry const*> const* GetSpecializationSpells(uint32 specId) const; std::vector<SpellPowerEntry const*> GetSpellPowers(uint32 spellId, Difficulty difficulty = DIFFICULTY_NONE, bool* hasDifficultyPowers = nullptr) const; std::vector<SpellProcsPerMinuteModEntry const*> GetSpellProcsPerMinuteMods(uint32 spellprocsPerMinuteId) const; + std::vector<TalentEntry const*> 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: StorageMap _stores; HotfixData _hotfixData; AreaGroupMemberContainer _areaGroupMembers; + CharSectionsContainer _charSections; CharStartOutfitContainer _charStartOutfits; uint32 _powersByClass[MAX_CLASSES][MAX_POWERS]; - GlyphSlotContainer _glyphSlots; + ChrSpecializationByIndexContainer _chrSpecializationsByIndex; + EmotesTextSoundContainer _emoteTextSounds; + FactionTeamContainer _factionTeams; HeirloomItemsContainer _heirlooms; HeirloomCurvesContainer _heirloomCurvePoints; ItemBonusListContainer _itemBonusLists; ItemBonusTreeContainer _itemBonusTrees; - ItemDisplayIdContainer _itemDisplayIDs; + ItemChildEquipmentContainer _itemChildEquipment; + std::unordered_set<uint32> _itemsWithCurrencyCost; + ItemModifiedAppearanceByItemContainer _itemModifiedAppearancesByItem; ItemToBonusTreeContainer _itemToBonusTree; + ItemSetSpellContainer _itemSetSpells; ItemSpecOverridesContainer _itemSpecOverrides; + MapDifficultyContainer _mapDifficulties; MountContainer _mountsBySpellId; MountCapabilitiesByTypeContainer _mountCapabilitiesByType; NameGenContainer _nameGenData; NameValidationRegexContainer _nameValidators; PhaseGroupContainer _phasesByGroup; - RulesetItemUpgradeContainer _rulesetItemUpgrade; QuestPackageItemContainer _questPackages; + RulesetItemUpgradeContainer _rulesetItemUpgrade; + SkillRaceClassInfoContainer _skillRaceClassInfoBySkill; SpecializationSpellsContainer _specializationSpellsBySpec; 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 685b186f92d..2101661912a 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -26,85 +26,188 @@ 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 + 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) + uint32 ID; +}; + +struct AnimKitEntry +{ + uint32 ID; + uint32 OneShotDuration; + uint16 OneShotStopAnimKitID; + uint16 LowDefAnimKitID; }; struct AreaGroupMemberEntry { - uint32 ID; // 0 - uint32 AreaGroupID; // 1 - uint32 AreaID; // 2 + uint32 ID; + uint16 AreaGroupID; + uint16 AreaID; +}; + +struct AreaTableEntry +{ + uint32 ID; + 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 PvPCombatWorldStateID; + uint8 SoundProviderPref; + uint8 SoundProviderPrefUnderwater; + uint8 ExplorationLevel; + uint8 FactionGroupMask; + uint8 MountFlags; + uint8 WildBattlePetLevelMin; + uint8 WildBattlePetLevelMax; + uint8 WindSettingsID; + uint32 UWIntroSound; + + // helpers + bool IsSanctuary() const + { + if (MapID == 609) + return true; + return (Flags[0] & AREA_FLAG_SANCTUARY) != 0; + } +}; + +struct AreaTriggerEntry +{ + 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; + uint32 ID; +}; + +struct ArmorLocationEntry +{ + uint32 ID; + 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 + uint32 ID; + LocalizedString* Name; + uint16 FactionID; // id of faction.dbc for player factions associated with city + uint8 DepositRate; + uint8 ConsignmentRate; +}; + +struct BankBagSlotPricesEntry +{ + uint32 ID; + uint32 Cost; +}; + +struct BannedAddOnsEntry +{ + uint32 ID; + char const* Name; + char const* Version; + uint8 Flags; }; 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) + 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 + uint32 ID; }; struct BattlePetBreedQualityEntry { - uint32 ID; // 0 - uint32 Quality; // 1 - float Modifier; // 2 + uint32 ID; + 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 CreatureID; + uint32 IconFileID; + uint32 SummonSpellID; + LocalizedString* SourceText; + LocalizedString* Description; + uint16 Flags; + uint8 PetType; + int8 Source; + uint32 ID; }; struct BattlePetSpeciesStateEntry { - uint32 ID; // 0 - uint32 SpeciesID; // 1 - uint32 State; // 2 - int32 Value; // 3 + uint32 ID; + int32 Value; + uint16 SpeciesID; + 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 @@ -112,79 +215,261 @@ struct BattlePetSpeciesStateEntry 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 UnkEmoteID; + uint8 Language; + uint8 Type; + uint32 SoundID[2]; + uint32 PlayerConditionID; +}; + +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; // 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 + uint32 ID; + 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 CharTitlesEntry +{ + uint32 ID; + LocalizedString* NameMale; + LocalizedString* NameFemale; + uint16 MaskID; + uint8 Flags; +}; + +struct ChatChannelsEntry +{ + uint32 ID; + uint32 Flags; + LocalizedString* Name; + LocalizedString* Shortcut; + uint8 FactionGroup; +}; + +struct ChrClassesEntry +{ + 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 PowerType; + uint8 SpellClassSet; + uint8 AttackPowerPerStrength; + uint8 AttackPowerPerAgility; + uint8 RangedAttackPowerPerAgility; + uint8 IconFileDataID; + uint8 Unk1; + uint32 ID; }; struct ChrClassesXPowerTypesEntry { - uint32 ID; // 0 - uint32 ClassID; // 1 - uint32 PowerType; // 2 + uint32 ID; + 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; + uint8 BaseLanguage; + uint8 CreatureType; + uint8 TeamID; + uint8 RaceRelated; + uint8 UnalteredVisualRaceID; + uint8 CharComponentTextureLayoutID; + uint8 DefaultClassID; + uint8 NeutralRaceID; + uint8 ItemAppearanceFrameRaceID; + uint8 CharComponentTexLayoutHiResID; + uint32 HighResMaleDisplayID; + uint32 HighResFemaleDisplayID; + uint32 Unk[3]; +}; + +#define MAX_MASTERY_SPELLS 2 + +struct ChrSpecializationEntry +{ + uint32 MasterySpellID[MAX_MASTERY_SPELLS]; + LocalizedString* Name; + LocalizedString* Name2; + LocalizedString* Description; + char* BackgroundFile; + uint16 SpellIconID; + uint8 ClassID; + uint8 OrderIndex; + uint8 PetTalentType; + uint8 Role; + uint8 PrimaryStatOrder; + uint32 ID; + uint32 Flags; + uint32 AnimReplacementSetID; }; struct CinematicSequencesEntry { - uint32 ID; // 0 - uint32 SoundID; // 1 - uint32 Camera[8]; // 2-9 + uint32 ID; + 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; + float InstanceOtherPlayerPetScale; // scale of not own player pets inside dungeons/raids/scenarios + 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 ID; + 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 CreatureFamilyEntry +{ + uint32 ID; + float MinScale; + float MaxScale; + LocalizedString* Name; + char const* IconFile; + uint16 SkillLine[2]; + uint16 PetFoodMask; + uint8 MinScaleLevel; + uint8 MaxScaleLevel; + uint8 PetTalentType; +}; + +struct CreatureModelDataEntry +{ + uint32 ID; + 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; + 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 { - uint32 ID; // 0 - LocalizedString* Name; // 1 - uint32 Flags; // 2 no exp? critters, non-combat pets, gas cloud. + uint32 ID; + LocalizedString* Name; + uint8 Flags; // no exp? critters, non-combat pets, gas cloud. }; struct CriteriaEntry { - uint32 ID; // 0 - uint32 Type; // 1 + uint32 ID; union { uint32 ID; @@ -303,297 +588,484 @@ 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 ID; + uint32 CriteriaID; + uint32 Amount; + LocalizedString* Description; + uint16 Parent; + uint16 Flags; + uint8 Operator; + uint32 OrderIndex; }; 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 SpellCategory; + uint8 Quality; + uint32 SpellWeight; }; struct CurvePointEntry { - uint32 ID; // 0 - uint32 CurveID; // 1 - uint32 Index; // 2 - float X; // 3 - float Y; // 4 + uint32 ID; + 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 + uint32 ID; + 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 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 +{ + uint32 ID; + LocalizedString* Name; + uint32 CreatureDisplayID; + uint16 MapID; + uint16 SpellIconID; + uint8 DifficultyID; + uint8 Bit; + uint8 Flags; + uint32 OrderIndex; +}; + +struct DurabilityCostsEntry +{ + uint32 ID; + uint16 WeaponSubClassCost[21]; + uint16 ArmorSubClassCost[8]; }; struct DurabilityQualityEntry { - uint32 ID; // 0 - float QualityMod; // 1 + uint32 ID; + float QualityMod; +}; + +struct EmotesEntry +{ + uint32 ID; + char const* EmoteSlashCommand; + uint32 SpellVisualKitID; + uint32 EmoteFlags; + uint16 AnimID; + uint8 EmoteSpecProc; + uint32 EmoteSpecProcParam; + uint32 EmoteSoundID; + uint32 ClassMask; + uint32 RaceMask; +}; + +struct EmotesTextEntry +{ + uint32 ID; + LocalizedString* Name; + uint16 EmoteID; +}; + +struct EmotesTextSoundEntry +{ + uint32 ID; + uint16 EmotesTextId; + uint8 RaceId; + uint8 SexId; + uint8 ClassId; + uint32 SoundId; +}; + +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; + uint32 ReputationMax[4]; + 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; // 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 + 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; + uint32 ID; }; -struct GameTablesEntry +struct GameObjectDisplayInfoEntry { - uint32 ID; // 0 - LocalizedString* Name; // 1 - uint32 NumRows; // 2 - uint32 NumColumns; // 3 + uint32 ID; + uint32 FileDataID; + DBCPosition3D GeoBoxMin; + DBCPosition3D GeoBoxMax; + float OverrideLootEffectScale; + float OverrideNameScale; + uint16 ObjectEffectPackageID; }; 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 + LocalizedString* Name; + LocalizedString* Description; + uint32 IconFileDataID; + uint16 Flags; + uint16 OtherFactionGarrAbilityID; + uint8 GarrAbilityCategoryID; + uint8 FollowerTypeID; + uint32 ID; }; 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 ID; + uint32 HordeGameObjectID; + uint32 AllianceGameObjectID; + LocalizedString* NameAlliance; + LocalizedString* NameHorde; + LocalizedString* Description; + LocalizedString* Tooltip; + uint32 IconFileDataID; + uint16 CostCurrencyID; + uint16 HordeTexPrefixKitID; + uint16 AllianceTexPrefixKitID; + uint16 AllianceActivationScenePackageID; + uint16 HordeActivationScenePackageID; + uint16 FollowerRequiredGarrAbilityID; + uint16 FollowerGarrAbilityEffectID; + int16 CostMoney; + uint8 Unknown; + uint8 Type; + uint8 Level; + uint8 Flags; + uint8 MaxShipments; + uint8 GarrTypeID; + uint32 BuildDuration; + int32 CostCurrencyAmount; + uint32 BonusAmount; }; struct GarrBuildingPlotInstEntry { - uint32 ID; // 0 - uint32 GarrBuildingID; // 1 - uint32 UiTextureAtlasMemberID; // 2 - uint32 GarrSiteLevelPlotInstID; // 3 - DBCPosition2D LandmarkOffset; // 4-5 + DBCPosition2D LandmarkOffset; + uint16 UiTextureAtlasMemberID; + uint16 GarrSiteLevelPlotInstID; + uint8 GarrBuildingID; + uint32 ID; }; struct GarrClassSpecEntry { - uint32 ID; // 0 - LocalizedString* NameMale; // 1 - LocalizedString* NameFemale; // 2 - LocalizedString* NameGenderless; // 3 - uint32 ClassAtlasID; // 4 UiTextureAtlasMember.db2 ref - uint32 GarrFollItemSetID; // 5 + LocalizedString* NameMale; + LocalizedString* NameFemale; + LocalizedString* NameGenderless; + uint16 ClassAtlasID; // UiTextureAtlasMember.db2 ref + uint8 GarrFollItemSetID; + uint8 Limit; + uint8 Flags; + uint32 ID; }; 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; + 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 Level; + uint8 Unknown1; + uint8 Flags; + int8 Unknown2; + int8 Unknown3; + uint8 GarrTypeID; + uint8 MaxDurability; + uint8 Class; + uint8 HordeFlavorTextGarrStringID; + uint8 AllianceFlavorTextGarrStringID; + uint32 ID; }; struct GarrFollowerXAbilityEntry { - uint32 ID; // 0 - uint32 GarrFollowerID; // 1 - uint32 GarrAbilityID; // 2 - uint32 FactionIndex; // 3 + uint32 ID; + 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 + uint32 ID; + LocalizedString* Name; + uint32 AllianceConstructionGameObjectID; + uint32 HordeConstructionGameObjectID; + uint8 GarrPlotUICategoryID; + uint8 PlotType; + uint8 Flags; + uint32 MinCount; + uint32 MaxCount; }; struct GarrPlotBuildingEntry { - uint32 ID; // 0 - uint32 GarrPlotID; // 1 - uint32 GarrBuildingID; // 2 + uint32 ID; + uint8 GarrPlotID; + uint8 GarrBuildingID; }; struct GarrPlotInstanceEntry { - uint32 ID; // 0 - uint32 GarrPlotID; // 1 - LocalizedString* Name; // 2 + uint32 ID; + 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 + uint32 ID; + DBCPosition2D TownHall; + uint16 MapID; + uint16 SiteID; + uint16 UpgradeResourceCost; + uint16 UpgradeMoneyCost; + uint8 Level; + uint8 UITextureKitID; + uint8 MovieID; + uint8 Level2; }; struct GarrSiteLevelPlotInstEntry { - uint32 ID; // 0 - uint32 GarrSiteLevelID; // 1 - uint32 GarrPlotInstanceID; // 2 - DBCPosition2D Landmark; // 3-4 - uint32 Unknown; // 5 + uint32 ID; + DBCPosition2D Landmark; + uint16 GarrSiteLevelID; + uint8 GarrPlotInstanceID; + uint8 Unknown; +}; + +struct GemPropertiesEntry +{ + uint32 ID; + uint32 Type; + uint16 EnchantID; + uint16 MinItemLevel; +}; + +struct GlyphPropertiesEntry +{ + uint32 ID; + uint32 SpellID; + uint16 SpellIconID; + uint8 Type; + uint8 GlyphExclusiveCategoryID; +}; + +struct GuildColorBackgroundEntry +{ + uint32 ID; + uint8 Red; + uint8 Green; + uint8 Blue; +}; + +struct GuildColorBorderEntry +{ + uint32 ID; + uint8 Red; + uint8 Green; + uint8 Blue; }; -struct GlyphSlotEntry +struct GuildColorEmblemEntry { - uint32 ID; // 0 - uint32 Type; // 1 - uint32 Tooltip; // 2 + uint32 ID; + uint8 Red; + uint8 Green; + uint8 Blue; }; struct GuildPerkSpellsEntry { - uint32 ID; // 0 - uint32 GuildLevel; // 1 - uint32 SpellID; // 2 + uint32 ID; + uint32 SpellID; }; 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 ItemID; + LocalizedString* SourceText; + uint32 OldItem[2]; + uint32 NextDifficultyItemID; + uint32 UpgradeItemID[2]; + uint16 ItemBonusListID[2]; + uint8 Flags; + uint8 Source; + uint32 ID; }; #define MAX_HOLIDAY_DURATIONS 10 @@ -602,122 +1074,194 @@ 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 ID; + 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 + uint32 ID; + float ClothFactor; + float LeatherFactor; + float MailFactor; + float PlateFactor; }; struct ImportPriceQualityEntry { - uint32 ID; // 0 - float Factor; // 1 + uint32 ID; + float Factor; }; struct ImportPriceShieldEntry { - uint32 ID; // 0 - float Factor; // 1 + uint32 ID; + float Factor; }; struct ImportPriceWeaponEntry { - uint32 ID; // 0 - float Factor; // 1 + uint32 ID; + float Factor; +}; + +struct ItemEntry +{ + uint32 ID; + 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 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; }; 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 + uint32 ID; + uint16 BonusTreeID; + uint16 SubTreeID; + uint16 BonusListID; + uint8 BonusTreeModID; +}; + +struct ItemChildEquipmentEntry +{ + uint32 ID; + uint32 ItemID; + uint32 AltItemID; + uint8 AltEquipmentSlot; }; struct ItemClassEntry { - uint32 ID; // 0 - uint32 Flags; // 1 - float PriceMod; // 2 - LocalizedString* Name; // 3 + uint32 ID; + float PriceMod; + LocalizedString* Name; + uint8 Flags; }; struct ItemCurrencyCostEntry { - uint32 ID; // 0 - uint32 ItemId; // 1 + uint32 ID; + 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 + uint32 ID; + 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 + uint32 ID; + float DPS[7]; + uint16 ItemLevel; }; -struct ItemEntry +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; + 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 ID; + 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 +1269,99 @@ 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 ID; + uint32 RequiredItem[MAX_ITEM_EXT_COST_ITEMS]; // required item id + uint32 RequiredCurrencyCount[MAX_ITEM_EXT_COST_CURRENCIES]; // required curency count + 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 + uint32 ID; + 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 ItemID; + uint16 AppearanceID; + uint8 AppearanceModID; + uint8 Index; + uint8 SourceType; + uint32 ID; }; 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 + uint32 ID; + 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 + uint32 ID; + 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 + uint32 ID; + LocalizedString* Name; + uint16 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; + 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 +{ + uint32 ID; + LocalizedString* Name; + uint32 ItemID[MAX_ITEM_SET_ITEMS]; + uint16 RequiredSkillRank; + uint32 RequiredSkill; + uint32 Flags; +}; + +struct ItemSetSpellEntry +{ + uint32 ID; + uint32 SpellID; + uint16 ItemSetID; + uint16 ChrSpecID; + uint8 Threshold; }; #define MAX_ITEM_PROTO_FLAGS 3 @@ -791,699 +1370,1352 @@ 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 ID; + 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; + uint8 RequiredExpansion; }; struct ItemSpecEntry { - uint32 ID; // 0 - uint32 MinLevel; // 1 - uint32 MaxLevel; // 2 - uint32 ItemType; // 3 - uint32 PrimaryStat; // 4 - uint32 SecondaryStat; // 5 - uint32 SpecID; // 6 + uint32 ID; + uint16 SpecID; + uint8 MinLevel; + uint8 MaxLevel; + uint8 ItemType; + uint8 PrimaryStat; + uint8 SecondaryStat; }; struct ItemSpecOverrideEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 SpecID; // 2 -}; - -struct ItemToBattlePetSpeciesEntry -{ - uint32 ID; // 0 - uint32 BattlePetSpeciesID; // 1 + uint32 ID; + uint32 ItemID; + uint16 SpecID; }; struct ItemUpgradeEntry { - uint32 ID; // 0 - uint32 ItemUpgradePathID; // 1 - uint32 ItemLevelBonus; // 2 - uint32 PrevItemUpgradeID; // 3 - uint32 CurrencyID; // 4 - uint32 CurrencyCost; // 5 + uint32 ID; + uint32 CurrencyCost; + uint16 PrevItemUpgradeID; + uint16 CurrencyID; + uint8 ItemUpgradePathID; + uint8 ItemLevelBonus; }; struct ItemXBonusTreeEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 BonusTreeID; // 2 + uint32 ID; + uint32 ItemID; + uint16 BonusTreeID; }; #define KEYCHAIN_SIZE 32 struct KeyChainEntry { - uint32 Id; - uint8 Key[KEYCHAIN_SIZE]; + uint32 ID; + uint8 Key[KEYCHAIN_SIZE]; +}; + +struct LfgDungeonsEntry +{ + LocalizedString* Name; + uint32 Flags; + char const* TextureFilename; + LocalizedString* Description; + uint32 PlayerConditionID; + 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; + uint32 ID; + + // 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 LightID; + uint8 Type; + uint8 ParticleMovement; + uint8 ParticleTexSlots; + uint8 MaterialID; + uint8 DepthTexCount[6]; + uint32 SoundID; +}; + +#define MAX_LOCK_CASE 8 + +struct LockEntry +{ + uint32 ID; + uint32 Index[MAX_LOCK_CASE]; + uint16 Skill[MAX_LOCK_CASE]; + uint8 Type[MAX_LOCK_CASE]; + uint8 Action[MAX_LOCK_CASE]; }; struct MailTemplateEntry { - uint32 ID; // 0 - LocalizedString* Body; // 1 + uint32 ID; + LocalizedString* Body; +}; + +struct MapEntry +{ + uint32 ID; + char* Directory; + uint32 Flags[2]; + float MinimapIconScale; + DBCPosition2D CorpsePos; // entrance coordinates in ghost mode (in most cases = normal entrance) + 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; + uint16 WindSettingsID; + 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[0] & MAP_FLAG_CAN_TOGGLE_DIFFICULTY) != 0; } + bool IsGarrison() const { return (Flags[0] & MAP_FLAG_GARRISON) != 0; } +}; + +struct MapDifficultyEntry +{ + uint32 ID; + LocalizedString* Message_lang; // m_message_lang (text showed when transfer to map failed) + 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 + { + if (RaidDurationType == 1) + return 86400; + if (RaidDurationType == 2) + return 604800; + return 0; + } }; struct ModifierTreeEntry { - uint32 ID; // 0 - uint32 Type; // 1 - uint32 Asset[2]; // 2-3 - uint32 Operator; // 4 - uint32 Amount; // 5 - uint32 Parent; // 6 + uint32 ID; + uint32 Asset[2]; + uint16 Parent; + uint8 Type; + uint8 Unk700; + uint8 Operator; + uint8 Amount; }; struct MountEntry { - uint32 Id; uint32 SpellId; - uint32 MountTypeId; uint32 DisplayId; - uint32 Flags; LocalizedString* Name; LocalizedString* Description; LocalizedString* SourceDescription; - uint32 Source; - uint32 PlayerConditionId; + float CameraPivotMultiplier; + uint16 MountTypeId; + uint16 Flags; + uint16 PlayerConditionId; + uint8 Source; + uint32 ID; }; 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 RequiredSpell; + uint32 SpeedModSpell; + uint16 RequiredRidingSkill; + uint16 RequiredArea; + int16 RequiredMap; + uint8 Flags; + uint32 ID; + uint32 RequiredAura; }; struct MountTypeXCapabilityEntry { - uint32 ID; // 0 - uint32 MountTypeID; // 1 - uint32 OrderIndex; // 2 - uint32 MountCapabilityID; // 3 + uint32 ID; + uint16 MountTypeID; + uint16 MountCapabilityID; + uint8 OrderIndex; +}; + +struct MovieEntry +{ + uint32 ID; + uint32 AudioFileDataID; + uint32 SubtitleFileDataID; + uint8 Volume; + uint8 KeyID; }; struct NameGenEntry { - uint32 ID; // 0 - LocalizedString* Name; // 1 - uint32 Race; // 2 - uint32 Sex; // 3 + uint32 ID; + LocalizedString* Name; + uint8 Race; + uint8 Sex; }; struct NamesProfanityEntry { - uint32 ID; // 0 - char const* Name; // 1 - int32 Language; // 2 + uint32 ID; + char const* Name; + int8 Language; }; struct NamesReservedEntry { - uint32 ID; // 0 - char const* Name; // 1 + uint32 ID; + char const* Name; }; struct NamesReservedLocaleEntry { - uint32 ID; // 0 - char const* Name; // 1 - uint32 LocaleMask; // 2 + uint32 ID; + 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 ID; + uint32 SpellID[MAX_OVERRIDE_SPELL]; + uint32 PlayerActionbarFileDataID; + uint8 Flags; +}; + +struct PhaseEntry +{ + uint32 ID; + uint16 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 ID; + uint32 RaceMask; + uint32 SkillLogic; + uint32 ReputationLogic; + uint32 PrevQuestLogic; + uint32 CurrQuestLogic; + uint32 CurrentCompletedQuestLogic; + uint32 SpellLogic; + uint32 ItemLogic; + uint32 Time[2]; + uint32 AuraSpellLogic; + uint32 AuraSpellID[4]; + uint32 AchievementLogic; + uint32 AreaLogic; + uint32 QuestKillLogic; + LocalizedString* FailureDescription; + uint16 MinLevel; + uint16 MaxLevel; + uint16 SkillID[4]; + int16 MinSkill[4]; + int16 MaxSkill[4]; + 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 MinAvgEquippedItemLevel; + uint16 MaxAvgEquippedItemLevel; + uint16 ModifierTreeID; + uint8 Flags; + int8 Gender; + int8 NativeGender; + uint8 MinLanguage; + uint8 MaxLanguage; + uint8 MinReputation[3]; + uint8 MaxReputation; + uint8 Unknown1; + uint8 MinPVPRank; + uint8 MaxPVPRank; + uint8 PvpMedal; + uint8 ItemFlags; + uint8 AuraCount[4]; + uint8 WeatherID; + uint8 PartyStatus; + uint8 LifetimeMaxPVPRank; + uint8 LfgStatus[4]; + uint8 LfgCompare[4]; + uint8 CurrencyCount[4]; + int8 MinExpansionLevel; + int8 MaxExpansionLevel; + int8 MinExpansionTier; + int8 MaxExpansionTier; + uint8 MinGuildLevel; + uint8 MaxGuildLevel; + uint8 PhaseUseFlags; + 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 +{ + uint32 ID; + char const* GlobalStringBaseTag; + uint8 PowerType; + uint8 Red; + uint8 Green; + uint8 Blue; +}; + +struct PvPDifficultyEntry +{ + uint32 ID; + uint16 MapID; + uint8 BracketID; + uint8 MinLevel; + uint8 MaxLevel; + + // helpers + BattlegroundBracketId GetBracketId() const { return BattlegroundBracketId(BracketID); } +}; + +struct QuestFactionRewardEntry +{ + uint32 ID; + int16 QuestRewFactionValue[10]; }; struct QuestMoneyRewardEntry { - uint32 Level; // 0 - uint32 Money[10]; // 1 + uint32 ID; + uint32 Money[10]; }; struct QuestPackageItemEntry { - uint32 ID; // 0 - uint32 QuestPackageID; // 1 - uint32 ItemID; // 2 - uint32 ItemCount; // 3 - uint32 FilterType; // 4 + uint32 ID; + uint32 ItemID; + uint16 QuestPackageID; + uint8 ItemCount; + uint8 FilterType; }; struct QuestSortEntry { - uint32 ID; // 0 - LocalizedString* SortName; // 1 + uint32 ID; + LocalizedString* SortName; + uint8 SortOrder; }; struct QuestV2Entry { - uint32 ID; // 0 - uint32 UniqueBitFlag; // 1 + uint32 ID; + uint16 UniqueBitFlag; }; struct QuestXPEntry { - uint32 ID; // 0 - uint32 Exp[10]; // 1 + uint32 ID; + uint16 Exp[10]; +}; + +struct RandPropPointsEntry +{ + uint32 ID; + uint32 EpicPropertiesPoints[5]; + uint32 RarePropertiesPoints[5]; + uint32 UncommonPropertiesPoints[5]; }; struct RulesetItemUpgradeEntry { - uint32 ID; // 0 - uint32 RulesetID; // 1 - uint32 ItemUpgradeID; // 2 - uint32 ItemID; // 3 + uint32 ID; + uint32 ItemID; + uint16 ItemUpgradeID; }; 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 + uint32 ID; + uint16 ItemLevelCurveID; + uint32 MinLevel; + uint32 MaxLevel; +}; + +struct SkillLineEntry +{ + uint32 ID; + LocalizedString* DisplayName; + LocalizedString* Description; + LocalizedString* AlternateVerb; + uint16 SpellIconID; + uint16 Flags; + uint8 CategoryID; + uint8 CanLink; + uint32 ParentSkillLineID; +}; + +struct SkillLineAbilityEntry +{ + uint32 ID; + uint32 SpellID; + uint32 RaceMask; + uint32 SupercedesSpell; + uint32 Unknown703; + uint16 SkillLine; + uint16 MinSkillLineRank; + uint16 TrivialSkillLineRankHigh; + uint16 TrivialSkillLineRankLow; + uint16 UniqueBit; + uint16 TradeSkillCategoryID; + uint8 AcquireMethod; + uint8 NumSkillUps; + uint32 ClassMask; +}; + +struct SkillRaceClassInfoEntry +{ + uint32 ID; + int32 RaceMask; + uint16 SkillID; + uint16 Flags; + uint16 SkillTierID; + uint8 Availability; + uint8 MinLevel; + int32 ClassMask; +}; + +struct SoundKitEntry +{ + LocalizedString* Name; + float VolumeFloat; + float MinDistance; + float DistanceCutoff; + float VolumeVariationPlus; + float VolumeVariationMinus; + float PitchVariationPlus; + float PitchVariationMinus; + float PitchAdjust; + uint16 Flags; + uint16 SoundEntriesAdvancedID; + uint16 BusOverwriteID; + uint8 SoundType; + uint8 EAXDef; + uint8 DialogType; + uint8 Unk700; + uint32 ID; }; struct SpecializationSpellsEntry { - uint32 ID; // 0 - uint32 SpecID; // 1 - uint32 OrderIndex; // 2 - uint32 SpellID; // 3 - uint32 OverridesSpellID; // 4 - LocalizedString* Description; // 5 + uint32 SpellID; + uint32 OverridesSpellID; + LocalizedString* Description; + uint16 SpecID; + uint8 OrderIndex; + uint32 ID; +}; + +struct SpellEntry +{ + LocalizedString* Name; + LocalizedString* NameSubtext; + LocalizedString* Description; + LocalizedString* AuraDescription; + uint32 MiscID; + uint32 ID; + uint32 DescriptionVariablesID; +}; + +struct SpellAuraOptionsEntry +{ + uint32 ID; + 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 ID; + uint32 SpellID; + uint32 CasterAuraSpell; + uint32 TargetAuraSpell; + uint32 ExcludeCasterAuraSpell; + uint32 ExcludeTargetAuraSpell; + uint8 DifficultyID; + uint8 CasterAuraState; + uint8 TargetAuraState; + uint8 ExcludeCasterAuraState; + uint8 ExcludeTargetAuraState; +}; + +struct SpellCastTimesEntry +{ + uint32 ID; + 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 ID; + uint32 SpellID; + uint16 MinFactionID; + uint16 RequiredAreasID; + uint16 RequiresSpellFocus; + uint8 FacingCasterFlags; + uint8 MinReputation; + uint8 RequiredAuraVision; }; -struct SpellCastTimesEntry +struct SpellCategoriesEntry +{ + uint32 ID; + 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 + uint32 ID; + LocalizedString* Name; + int32 ChargeRecoveryTime; + uint8 Flags; + uint8 UsesPerWeek; + uint8 MaxCharges; + uint32 Unk703; }; struct SpellClassOptionsEntry { - uint32 ID; // 0 - uint32 ModalNextSpell; // 1 - flag128 SpellClassMask; // 2-5 - uint32 SpellClassSet; // 6 + uint32 ID; + uint32 SpellID; + flag128 SpellClassMask; + uint8 SpellClassSet; + uint32 ModalNextSpell; +}; + +struct SpellCooldownsEntry +{ + uint32 ID; + uint32 SpellID; + uint32 CategoryRecoveryTime; + uint32 RecoveryTime; + uint32 StartRecoveryTime; + uint8 DifficultyID; }; struct SpellDurationEntry { - uint32 ID; // 0 - int32 Duration[3]; // 1-3 + uint32 ID; + int32 Duration; + int32 MaxDuration; + int16 DurationPerLevel; +}; + +struct SpellEffectEntry +{ + float EffectAmplitude; + 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; + uint32 EffectRadiusIndex; + uint32 EffectRadiusMaxIndex; + uint32 EffectTriggerSpell; + uint32 ImplicitTarget[2]; + uint32 SpellID; + uint32 EffectIndex; + uint32 EffectAttributes; +}; + +#define MAX_SPELL_EFFECTS 32 +#define MAX_EFFECT_MASK 0xFFFFFFFF + +struct SpellEffectScalingEntry +{ + uint32 ID; + float Coefficient; + float Variance; + float ResourceCoefficient; + uint32 SpellEffectID; +}; + +struct SpellEquippedItemsEntry +{ + uint32 ID; + uint32 SpellID; + int32 EquippedItemInventoryTypeMask; + int32 EquippedItemSubClassMask; + int8 EquippedItemClass; +}; + +struct SpellFocusObjectEntry +{ + uint32 ID; + LocalizedString* Name; +}; + +struct SpellInterruptsEntry +{ + uint32 ID; + uint32 SpellID; + uint32 AuraInterruptFlags[2]; + uint32 ChannelInterruptFlags[2]; + uint16 InterruptFlags; + 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 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; + uint32 PlayerConditionID; }; 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 + uint32 ID; + uint8 LTOperandType[5]; + uint8 Operator[5]; + uint8 RTOperandType[5]; + uint8 RTOperand[5]; + uint8 Logic[5]; + uint32 LTOperand[5]; }; struct SpellLearnSpellEntry { - uint32 ID; // 0 - uint32 LearnSpellID; // 1 - uint32 SpellID; // 2 - uint32 OverridesSpellID; // 3 + uint32 ID; + uint32 LearnSpellID; + uint32 SpellID; + uint32 OverridesSpellID; +}; + +struct SpellLevelsEntry +{ + uint32 ID; + uint32 SpellID; + uint16 BaseLevel; + uint16 MaxLevel; + uint16 SpellLevel; + uint8 DifficultyID; + uint8 MaxUsableLevel; }; 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 ID; + 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 SpellID; + uint32 ManaCost; + float ManaCostPercentage; + float ManaCostPercentagePerSecond; + uint32 RequiredAura; + float HealthCostPercentage; + uint8 PowerIndex; + uint8 PowerType; + 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; // 8 - uint32 UnitPowerBarID; // 9 - float ManaCostPercentage; // 10 - float ManaCostPercentagePerSecond; // 11 - uint32 RequiredAura; // 12 - float HealthCostPercentage; // 13 + uint32 PowerDisplayID; + uint32 UnitPowerBarID; }; struct SpellPowerDifficultyEntry { - uint32 SpellPowerID; // 0 - uint32 DifficultyID; // 1 - uint32 PowerIndex; // 2 + uint8 DifficultyID; + uint8 PowerIndex; + uint32 ID; }; 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 { - uint32 ID; // 0 - float Radius; // 1 - float RadiusPerLevel; // 2 - float RadiusMin; // 3 - float RadiusMax; // 4 + uint32 ID; + 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 + uint32 ID; + 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 ID; + uint32 SpellID; + int32 Reagent[MAX_SPELL_REAGENTS]; + uint16 ReagentCount[MAX_SPELL_REAGENTS]; }; -struct SpellRuneCostEntry +struct SpellScalingEntry { - uint32 ID; // 0 - uint32 RuneCost[4]; // 1-4 (0=blood, 1=unholy, 2=frost, 3=death) - uint32 RunicPower; // 5 + uint32 ID; + uint32 SpellID; + uint16 ScalesFromItemLevel; + int32 ScalingClass; + uint32 MinScalingLevel; + uint32 MaxScalingLevel; +}; + +struct SpellShapeshiftEntry +{ + uint32 ID; + uint32 SpellID; + uint32 ShapeshiftExclude[2]; + uint32 ShapeshiftMask[2]; + uint8 StanceBarOrder; +}; + +#define MAX_SHAPESHIFT_SPELLS 8 + +struct SpellShapeshiftFormEntry +{ + uint32 ID; + LocalizedString* Name; + float WeaponDamageVariance; + uint32 Flags; + uint16 AttackIconID; + uint16 CombatRoundTime; + uint16 CreatureDisplayID[4]; + uint16 PresetSpellID[MAX_SHAPESHIFT_SPELLS]; + uint16 MountTypeID; + int8 CreatureType; + 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 ID; + uint32 SpellID; + float ConeAngle; + float Width; + uint32 Targets; + uint16 TargetCreatureType; + uint8 DifficultyID; + uint8 MaxAffectedTargets; + uint32 MaxTargetLevel; }; #define MAX_SPELL_TOTEMS 2 struct SpellTotemsEntry { - uint32 ID; // 0 - uint32 RequiredTotemCategoryID[MAX_SPELL_TOTEMS]; // 1 - uint32 Totem[MAX_SPELL_TOTEMS]; // 2 + uint32 ID; + uint32 SpellID; + uint32 Totem[MAX_SPELL_TOTEMS]; + uint16 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 SpellID; + float Unk620; + uint16 SpellVisualID[2]; + uint16 PlayerConditionID; + uint8 DifficultyID; + uint8 Flags; + uint32 ID; +}; + +struct SummonPropertiesEntry +{ + uint32 ID; + uint32 Category; + uint32 Faction; + uint32 Type; + int32 Slot; + 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; // 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 + DBCPosition3D Pos; + LocalizedString* Name; + uint32 MountCreatureID[2]; + DBCPosition2D MapOffset; + uint16 MapID; + uint16 ConditionID; + uint16 LearnableIndex; + uint8 Flags; + uint32 ID; }; struct TaxiPathEntry { - uint32 ID; // 0 - uint32 From; // 1 - uint32 To; // 2 - uint32 Cost; // 3 + uint16 From; + uint16 To; + uint32 ID; + uint32 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 + DBCPosition3D Loc; + uint32 Delay; + uint16 PathID; + uint16 MapID; + uint16 ArrivalEventID; + uint16 DepartureEventID; + uint8 NodeIndex; + uint8 Flags; + uint32 ID; }; struct TotemCategoryEntry { - uint32 ID; // 0 - LocalizedString* Name; // 1 - uint32 CategoryType; // 2 - uint32 CategoryMask; // 3 + uint32 ID; + LocalizedString* Name; + uint32 CategoryMask; + uint8 CategoryType; }; struct ToyEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 Flags; // 2 - LocalizedString* Description; // 3 - uint32 CategoryFilter; // 4 + uint32 ItemID; + LocalizedString* Description; + uint8 Flags; + uint8 CategoryFilter; + uint32 ID; }; struct TransportAnimationEntry { - uint32 ID; // 0 - uint32 TransportID; // 1 - uint32 TimeIndex; // 2 - DBCPosition3D Pos; // 3-5 - uint32 SequenceID; // 6 + uint32 ID; + 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 ID; + 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 ID; + 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 CenterPower; + uint8 BarType; + uint32 MinPower; + uint32 MaxPower; }; -#define MAX_WORLD_MAP_OVERLAY_AREA_IDX 4 +#define MAX_VEHICLE_SEATS 8 -struct WorldMapOverlayEntry +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; // 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 + uint32 ID; + 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 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; + uint32 EnterUISoundID; + uint32 ExitUISoundID; + + 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; } +}; + +struct WMOAreaTableEntry +{ + 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; + uint32 ID; + uint32 UWZoneMusic; +}; + +struct WorldMapAreaEntry +{ + char const* AreaName; + float LocLeft; + float LocRight; + float LocTop; + float LocBottom; + uint16 MapID; + uint16 AreaID; + int16 DisplayMapID; + int16 DefaultDungeonFloor; + uint16 ParentWorldMapID; + uint16 Flags; + uint8 LevelRangeMin; + uint8 LevelRangeMax; + uint8 BountySetID; + uint8 BountyBoardLocation; + uint32 ID; + uint32 PlayerConditionID; }; -#pragma pack(pop) +#define MAX_WORLD_MAP_OVERLAY_AREA_IDX 4 -struct TaxiPathBySourceAndDestination +struct WorldMapOverlayEntry { - TaxiPathBySourceAndDestination() : ID(0), price(0) { } - TaxiPathBySourceAndDestination(uint32 _id, uint32 _price) : ID(_id), price(_price) { } - uint32 ID; - uint32 price; + char const* TextureName; + uint16 TextureWidth; + uint16 TextureHeight; + 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; }; -typedef std::map<uint32, TaxiPathBySourceAndDestination> TaxiPathSetForSource; -typedef std::map<uint32, TaxiPathSetForSource> TaxiPathSetBySource; - -typedef std::vector<TaxiPathNodeEntry const*> TaxiPathNodeList; -typedef std::vector<TaxiPathNodeList> TaxiPathNodesByPath; +struct WorldMapTransformsEntry +{ + uint32 ID; + DBCPosition3D RegionMin; + DBCPosition3D RegionMax; + DBCPosition2D RegionOffset; + float RegionScale; + uint16 MapID; + uint16 AreaID; + uint16 NewMapID; + uint16 NewDungeonMapID; + uint16 NewAreaID; + uint8 Flags; +}; -#define TaxiMaskSize 217 -typedef std::array<uint8, TaxiMaskSize> TaxiMask; +struct WorldSafeLocsEntry +{ + uint32 ID; + DBCPosition3D Loc; + float Facing; + LocalizedString* AreaName; + uint16 MapID; +}; +#pragma pack(pop) #endif diff --git a/src/server/game/DataStores/DB2fmt.h b/src/server/game/DataStores/DB2fmt.h deleted file mode 100644 index ea5ef297b3c..00000000000 --- a/src/server/game/DataStores/DB2fmt.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef 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 ItemUpgradeEntryFormat[] = "niiiii"; -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 RulesetItemUpgradeEntryFormat[] = "niii"; -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"; - -#endif diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 3501dbc55c9..3159039d6cd 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 @@ -428,29 +428,59 @@ enum CriteriaTreeOperator : uint8 CRITERIA_TREE_OPERATOR_ANY = 8 }; +enum CharSectionFlags +{ + SECTION_FLAG_PLAYER = 0x01, + SECTION_FLAG_DEATH_KNIGHT = 0x04, + SECTION_FLAG_DEMON_HUNTER = 0x20 +}; + +enum CharSectionType +{ + SECTION_TYPE_SKIN_LOW_RES = 0, + SECTION_TYPE_FACE_LOW_RES = 1, + SECTION_TYPE_FACIAL_HAIR_LOW_RES = 2, + SECTION_TYPE_HAIR_LOW_RES = 3, + SECTION_TYPE_UNDERWEAR_LOW_RES = 4, + SECTION_TYPE_SKIN = 5, + SECTION_TYPE_FACE = 6, + SECTION_TYPE_FACIAL_HAIR = 7, + SECTION_TYPE_HAIR = 8, + SECTION_TYPE_UNDERWEAR = 9, + SECTION_TYPE_CUSTOM_DISPLAY_1_LOW_RES = 10, + SECTION_TYPE_CUSTOM_DISPLAY_1 = 11, + SECTION_TYPE_CUSTOM_DISPLAY_2_LOW_RES = 12, + SECTION_TYPE_CUSTOM_DISPLAY_2 = 13, + SECTION_TYPE_CUSTOM_DISPLAY_3_LOW_RES = 14, + SECTION_TYPE_CUSTOM_DISPLAY_3 = 15 +}; + 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_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 }; @@ -578,6 +608,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, @@ -608,8 +643,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/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp deleted file mode 100644 index 79c42c4fc7b..00000000000 --- a/src/server/game/DataStores/DBCStores.cpp +++ /dev/null @@ -1,921 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "DBCStores.h" -#include "Log.h" -#include "SharedDefines.h" -#include "SpellInfo.h" -#include "DBCfmt.h" -#include "Timer.h" -#include "DB2Stores.h" - -#include <map> - - -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<uint32, CharSectionsEntry const*> CharSectionsMap; -typedef std::map<uint32, std::vector<uint32>> FactionTeamMap; -typedef std::map<WMOAreaTableTripple, WMOAreaTableEntry const*> WMOAreaInfoByTripple; - -DBCStorage<AnimKitEntry> sAnimKitStore(AnimKitfmt); -DBCStorage<AreaTableEntry> sAreaTableStore(AreaTablefmt); -DBCStorage<AreaTriggerEntry> sAreaTriggerStore(AreaTriggerfmt); -DBCStorage<ArmorLocationEntry> sArmorLocationStore(ArmorLocationfmt); - -DBCStorage<BankBagSlotPricesEntry> sBankBagSlotPricesStore(BankBagSlotPricesfmt); -DBCStorage<BannedAddOnsEntry> sBannedAddOnsStore(BannedAddOnsfmt); -DBCStorage<BattlemasterListEntry> sBattlemasterListStore(BattlemasterListfmt); - -DBCStorage<CharSectionsEntry> sCharSectionsStore(CharSectionsfmt); -CharSectionsMap sCharSectionMap; -DBCStorage<CharTitlesEntry> sCharTitlesStore(CharTitlesfmt); -DBCStorage<ChatChannelsEntry> sChatChannelsStore(ChatChannelsfmt); -DBCStorage<ChrClassesEntry> sChrClassesStore(ChrClassesfmt); -DBCStorage<ChrRacesEntry> sChrRacesStore(ChrRacesfmt); -DBCStorage<ChrSpecializationEntry> sChrSpecializationStore(ChrSpecializationfmt); -ChrSpecializationByIndexArray sChrSpecializationByIndexStore; -DBCStorage<CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore(CreatureDisplayInfoExtrafmt); -DBCStorage<CreatureFamilyEntry> sCreatureFamilyStore(CreatureFamilyfmt); -DBCStorage<CreatureModelDataEntry> sCreatureModelDataStore(CreatureModelDatafmt); - -DBCStorage<DifficultyEntry> sDifficultyStore(DifficultyFmt); -DBCStorage<DungeonEncounterEntry> sDungeonEncounterStore(DungeonEncounterfmt); -DBCStorage<DurabilityCostsEntry> sDurabilityCostsStore(DurabilityCostsfmt); - -DBCStorage<EmotesEntry> sEmotesStore(Emotesfmt); -DBCStorage<EmotesTextEntry> sEmotesTextStore(EmotesTextfmt); -typedef std::tuple<uint32, uint32, uint32> EmotesTextSoundKey; -static std::map<EmotesTextSoundKey, EmotesTextSoundEntry const*> sEmotesTextSoundMap; -DBCStorage <EmotesTextSoundEntry> sEmotesTextSoundStore(EmotesTextSoundEntryfmt); - -DBCStorage<FactionEntry> sFactionStore(Factionfmt); -static FactionTeamMap sFactionTeamMap; -DBCStorage<FactionTemplateEntry> sFactionTemplateStore(FactionTemplatefmt); - -DBCStorage<GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore(GameObjectDisplayInfofmt); -DBCStorage<GemPropertiesEntry> sGemPropertiesStore(GemPropertiesfmt); -DBCStorage<GlyphPropertiesEntry> sGlyphPropertiesStore(GlyphPropertiesfmt); -DBCStorage<GuildColorBackgroundEntry> sGuildColorBackgroundStore(GuildColorBackgroundfmt); -DBCStorage<GuildColorBorderEntry> sGuildColorBorderStore(GuildColorBorderfmt); -DBCStorage<GuildColorEmblemEntry> sGuildColorEmblemStore(GuildColorEmblemfmt); -DBCStorage<ItemArmorQualityEntry> sItemArmorQualityStore(ItemArmorQualityfmt); -DBCStorage<ItemArmorShieldEntry> sItemArmorShieldStore(ItemArmorShieldfmt); -DBCStorage<ItemArmorTotalEntry> sItemArmorTotalStore(ItemArmorTotalfmt); -DBCStorage<ItemBagFamilyEntry> sItemBagFamilyStore(ItemBagFamilyfmt); -DBCStorage<ItemDamageEntry> sItemDamageAmmoStore(ItemDamagefmt); -DBCStorage<ItemDamageEntry> sItemDamageOneHandCasterStore(ItemDamagefmt); -DBCStorage<ItemDamageEntry> sItemDamageOneHandStore(ItemDamagefmt); -DBCStorage<ItemDamageEntry> sItemDamageRangedStore(ItemDamagefmt); -DBCStorage<ItemDamageEntry> sItemDamageThrownStore(ItemDamagefmt); -DBCStorage<ItemDamageEntry> sItemDamageTwoHandCasterStore(ItemDamagefmt); -DBCStorage<ItemDamageEntry> sItemDamageTwoHandStore(ItemDamagefmt); -DBCStorage<ItemDamageEntry> sItemDamageWandStore(ItemDamagefmt); -DBCStorage<ItemSetEntry> sItemSetStore(ItemSetfmt); -DBCStorage<ItemSetSpellEntry> sItemSetSpellStore(ItemSetSpellfmt); -ItemSetSpellsStore sItemSetSpellsStore; - -DBCStorage<LFGDungeonEntry> sLFGDungeonStore(LFGDungeonfmt); -DBCStorage<LightEntry> sLightStore(Lightfmt); -DBCStorage<LiquidTypeEntry> sLiquidTypeStore(LiquidTypefmt); -DBCStorage<LockEntry> sLockStore(Lockfmt); - -DBCStorage<MapEntry> sMapStore(Mapfmt); -DBCStorage<MapDifficultyEntry> sMapDifficultyStore(MapDifficultyfmt); // only for loading -MapDifficultyMap sMapDifficultyMap; -DBCStorage<MovieEntry> sMovieStore(Moviefmt); - -DBCStorage<PhaseEntry> sPhaseStore(Phasefmt); -DBCStorage<PowerDisplayEntry> sPowerDisplayStore(PowerDisplayfmt); -DBCStorage<PvPDifficultyEntry> sPvpDifficultyStore(PvpDifficultyfmt); - -DBCStorage<QuestFactionRewEntry> sQuestFactionRewardStore(QuestFactionRewardfmt); - -DBCStorage<RandomPropertiesPointsEntry> sRandomPropertiesPointsStore(RandPropPointsfmt); - -DBCStorage<SkillLineAbilityEntry> sSkillLineAbilityStore(SkillLineAbilityfmt); -DBCStorage<SkillLineEntry> sSkillLineStore(SkillLinefmt); -DBCStorage<SkillRaceClassInfoEntry> sSkillRaceClassInfoStore(SkillRaceClassInfofmt); -SkillRaceClassInfoMap SkillRaceClassInfoBySkill; -DBCStorage<SpellAuraOptionsEntry> sSpellAuraOptionsStore(SpellAuraOptionsfmt); -DBCStorage<SpellCategoriesEntry> sSpellCategoriesStore(SpellCategoriesfmt); -DBCStorage<SpellCategoryEntry> sSpellCategoryStore(SpellCategoryfmt); -DBCStorage<SpellCooldownsEntry> sSpellCooldownsStore(SpellCooldownsfmt); -DBCStorage<SpellEffectEntry> sSpellEffectStore(SpellEffectfmt); -DBCStorage<SpellEffectScalingEntry> sSpellEffectScalingStore(SpellEffectScalingfmt); -SpellEffectScallingByEffectId sSpellEffectScallingByEffectId; -DBCStorage<SpellEntry> sSpellStore(Spellfmt); -DBCStorage<SpellEquippedItemsEntry> sSpellEquippedItemsStore(SpellEquippedItemsfmt); -DBCStorage<SpellFocusObjectEntry> sSpellFocusObjectStore(SpellFocusObjectfmt); -DBCStorage<SpellInterruptsEntry> sSpellInterruptsStore(SpellInterruptsfmt); -DBCStorage<SpellItemEnchantmentEntry> sSpellItemEnchantmentStore(SpellItemEnchantmentfmt); -DBCStorage<SpellLevelsEntry> sSpellLevelsStore(SpellLevelsfmt); -DBCStorage<SpellScalingEntry> sSpellScalingStore(SpellScalingfmt); -DBCStorage<SpellShapeshiftEntry> sSpellShapeshiftStore(SpellShapeshiftfmt); -DBCStorage<SpellShapeshiftFormEntry> sSpellShapeshiftFormStore(SpellShapeshiftFormfmt); -DBCStorage<SpellTargetRestrictionsEntry> sSpellTargetRestrictionsStore(SpellTargetRestrictionsfmt); -DBCStorage<SummonPropertiesEntry> sSummonPropertiesStore(SummonPropertiesfmt); - -DBCStorage<TalentEntry> sTalentStore(Talentfmt); -TalentsByPosition sTalentByPos; - -DBCStorage<VehicleEntry> sVehicleStore(Vehiclefmt); -DBCStorage<VehicleSeatEntry> sVehicleSeatStore(VehicleSeatfmt); - -DBCStorage<WMOAreaTableEntry> sWMOAreaTableStore(WMOAreaTablefmt); -static WMOAreaInfoByTripple sWMOAreaInfoByTripple; -DBCStorage<WorldMapAreaEntry> sWorldMapAreaStore(WorldMapAreafmt); -DBCStorage<WorldMapTransformsEntry> sWorldMapTransformsStore(WorldMapTransformsfmt); -DBCStorage<WorldSafeLocsEntry> sWorldSafeLocsStore(WorldSafeLocsfmt); - -GameTable<GtArmorMitigationByLvlEntry> sGtArmorMitigationByLvlStore(GtArmorMitigationByLvlfmt); -GameTable<GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore(GtBarberShopCostBasefmt); -GameTable<GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore(GtChanceToMeleeCritBasefmt); -GameTable<GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore(GtChanceToMeleeCritfmt); -GameTable<GtChanceToSpellCritBaseEntry> sGtChanceToSpellCritBaseStore(GtChanceToSpellCritBasefmt); -GameTable<GtChanceToSpellCritEntry> sGtChanceToSpellCritStore(GtChanceToSpellCritfmt); -GameTable<GtCombatRatingsEntry> sGtCombatRatingsStore(GtCombatRatingsfmt); -GameTable<GtItemSocketCostPerLevelEntry> sGtItemSocketCostPerLevelStore(GtItemSocketCostPerLevelfmt); -GameTable<GtNPCManaCostScalerEntry> sGtNPCManaCostScalerStore(GtNPCManaCostScalerfmt); -GameTable<GtNpcTotalHpEntry> sGtNpcTotalHpStore(GtNpcTotalHpfmt); -GameTable<GtNpcTotalHpExp1Entry> sGtNpcTotalHpExp1Store(GtNpcTotalHpExp1fmt); -GameTable<GtNpcTotalHpExp2Entry> sGtNpcTotalHpExp2Store(GtNpcTotalHpExp2fmt); -GameTable<GtNpcTotalHpExp3Entry> sGtNpcTotalHpExp3Store(GtNpcTotalHpExp3fmt); -GameTable<GtNpcTotalHpExp4Entry> sGtNpcTotalHpExp4Store(GtNpcTotalHpExp4fmt); -GameTable<GtNpcTotalHpExp5Entry> sGtNpcTotalHpExp5Store(GtNpcTotalHpExp5fmt); -GameTable<GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore(GtOCTBaseHPByClassfmt); -GameTable<GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore(GtOCTBaseMPByClassfmt); -GameTable<GtOCTHpPerStaminaEntry> sGtOCTHpPerStaminaStore(GtOCTHpPerStaminafmt); -GameTable<GtOCTLevelExperienceEntry> sGtOCTLevelExperienceStore(GtOCTLevelExperiencefmt); -GameTable<GtRegenMPPerSptEntry> sGtRegenMPPerSptStore(GtRegenMPPerSptfmt); -GameTable<GtSpellScalingEntry> sGtSpellScalingStore(GtSpellScalingfmt); - -typedef std::list<std::string> StoreProblemList; - -uint32 DBCFileCount = 0; -uint32 GameTableCount = 0; - -template<class T> -inline void LoadDBC(uint32& availableDbcLocales, StoreProblemList& errors, DBCStorage<T>& 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<<i); // mark as not available for speedup next checks - } - } - 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); - } - - delete sql; -} - -template<class T> -inline void LoadGameTable(StoreProblemList& errors, std::string const& tableName, GameTable<T>& 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(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(sWorldMapAreaStore, "WorldMapArea.dbc");//20444 - LOAD_DBC(sWorldMapTransformsStore, "WorldMapTransforms.dbc");//20444 - LOAD_DBC(sWorldSafeLocsStore, "WorldSafeLocs.dbc"); // 20444 - -#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 }); - - 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) - { - 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 < 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); - if (faction && faction->ParentFactionID) - { - std::vector<uint32> &flist = sFactionTeamMap[faction->ParentFactionID]; - flist.push_back(i); - } - } - - 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)) - 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 < 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)) - { - 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); - } - - // 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) - { - 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)); -} - -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("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 - -#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<uint32> const* GetFactionTeamList(uint32 faction) -{ - FactionTeamMap::const_iterator itr = sFactionTeamMap.find(faction); - if (itr != sFactionTeamMap.end()) - return &itr->second; - - 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; -} - -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)); - if (i == sWMOAreaInfoByTripple.end()) - return NULL; - 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_); - 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; - 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 - 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); - - // 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; -} - -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)) - return 1 << liq->Type; - - return 0; -} - -CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSectionType genType, uint8 gender, uint8 type, uint8 color) -{ - std::pair<CharSectionsMap::const_iterator, CharSectionsMap::const_iterator> 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; -} - -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 deleted file mode 100644 index 4ab1769c69f..00000000000 --- a/src/server/game/DataStores/DBCStores.h +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef 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); - -// 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]; - -// 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<uint32> const* GetFactionTeamList(uint32 faction); - -// ItemSetSpells -typedef std::vector<ItemSetSpellEntry const*> ItemSetSpells; -typedef std::unordered_map<uint32, ItemSetSpells> ItemSetSpellsStore; - -// 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<uint32, std::unordered_map<uint32, MapDifficultyEntry const*>> 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); - -// PvpDifficulty -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<uint32, SkillRaceClassInfoEntry const*> SkillRaceClassInfoMap; -typedef std::pair<SkillRaceClassInfoMap::iterator, SkillRaceClassInfoMap::iterator> SkillRaceClassInfoBounds; -TC_GAME_API SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_); - -// SpellEffectScaling -typedef std::unordered_map<uint32, uint32> SpellEffectScallingByEffectId; - -// Talent -typedef std::vector<TalentEntry const*> 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); - -// 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); - -// 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); - -template<class T> -class GameTable -{ -public: - GameTable(char const* format) : _storage(format), _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<T> _storage; - GameTablesEntry const* _gtEntry; -}; - -TC_GAME_API extern DBCStorage<AnimKitEntry> sAnimKitStore; -TC_GAME_API extern DBCStorage<AreaTableEntry> sAreaTableStore; -TC_GAME_API extern DBCStorage<AreaTriggerEntry> sAreaTriggerStore; -TC_GAME_API extern DBCStorage<ArmorLocationEntry> sArmorLocationStore; -TC_GAME_API extern DBCStorage<BankBagSlotPricesEntry> sBankBagSlotPricesStore; -TC_GAME_API extern DBCStorage<BannedAddOnsEntry> sBannedAddOnsStore; -TC_GAME_API extern DBCStorage<BattlemasterListEntry> sBattlemasterListStore; -TC_GAME_API extern DBCStorage<CharSectionsEntry> sCharSectionsStore; -TC_GAME_API extern DBCStorage<CharTitlesEntry> sCharTitlesStore; -TC_GAME_API extern DBCStorage<ChatChannelsEntry> sChatChannelsStore; -TC_GAME_API extern DBCStorage<ChrClassesEntry> sChrClassesStore; -TC_GAME_API extern DBCStorage<ChrRacesEntry> sChrRacesStore; -TC_GAME_API extern DBCStorage<ChrSpecializationEntry> sChrSpecializationStore; -TC_GAME_API extern ChrSpecializationByIndexArray sChrSpecializationByIndexStore; -TC_GAME_API extern DBCStorage<CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore; -TC_GAME_API extern DBCStorage<CreatureFamilyEntry> sCreatureFamilyStore; -TC_GAME_API extern DBCStorage<CreatureModelDataEntry> sCreatureModelDataStore; -TC_GAME_API extern DBCStorage<DifficultyEntry> sDifficultyStore; -TC_GAME_API extern DBCStorage<DungeonEncounterEntry> sDungeonEncounterStore; -TC_GAME_API extern DBCStorage<DurabilityCostsEntry> sDurabilityCostsStore; -TC_GAME_API extern DBCStorage<EmotesEntry> sEmotesStore; -TC_GAME_API extern DBCStorage<EmotesTextEntry> sEmotesTextStore; -TC_GAME_API extern DBCStorage<FactionEntry> sFactionStore; -TC_GAME_API extern DBCStorage<FactionTemplateEntry> sFactionTemplateStore; -TC_GAME_API extern DBCStorage<GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore; -TC_GAME_API extern DBCStorage<GemPropertiesEntry> sGemPropertiesStore; -TC_GAME_API extern DBCStorage<GlyphPropertiesEntry> sGlyphPropertiesStore; -TC_GAME_API extern DBCStorage<GuildColorBackgroundEntry> sGuildColorBackgroundStore; -TC_GAME_API extern DBCStorage<GuildColorBorderEntry> sGuildColorBorderStore; -TC_GAME_API extern DBCStorage<GuildColorEmblemEntry> sGuildColorEmblemStore; -TC_GAME_API extern DBCStorage<ItemArmorQualityEntry> sItemArmorQualityStore; -TC_GAME_API extern DBCStorage<ItemArmorShieldEntry> sItemArmorShieldStore; -TC_GAME_API extern DBCStorage<ItemArmorTotalEntry> sItemArmorTotalStore; -TC_GAME_API extern DBCStorage<ItemBagFamilyEntry> sItemBagFamilyStore; -TC_GAME_API extern DBCStorage<ItemDamageEntry> sItemDamageAmmoStore; -TC_GAME_API extern DBCStorage<ItemDamageEntry> sItemDamageOneHandCasterStore; -TC_GAME_API extern DBCStorage<ItemDamageEntry> sItemDamageOneHandStore; -TC_GAME_API extern DBCStorage<ItemDamageEntry> sItemDamageRangedStore; -TC_GAME_API extern DBCStorage<ItemDamageEntry> sItemDamageThrownStore; -TC_GAME_API extern DBCStorage<ItemDamageEntry> sItemDamageTwoHandCasterStore; -TC_GAME_API extern DBCStorage<ItemDamageEntry> sItemDamageTwoHandStore; -TC_GAME_API extern DBCStorage<ItemDamageEntry> sItemDamageWandStore; -TC_GAME_API extern DBCStorage<ItemSetEntry> sItemSetStore; -TC_GAME_API extern DBCStorage<ItemSetSpellEntry> sItemSetSpellStore; -TC_GAME_API extern ItemSetSpellsStore sItemSetSpellsStore; -TC_GAME_API extern DBCStorage<LFGDungeonEntry> sLFGDungeonStore; -TC_GAME_API extern DBCStorage<LiquidTypeEntry> sLiquidTypeStore; -TC_GAME_API extern DBCStorage<LockEntry> sLockStore; -TC_GAME_API extern DBCStorage<MapEntry> sMapStore; -TC_GAME_API extern MapDifficultyMap sMapDifficultyMap; -TC_GAME_API extern DBCStorage<MovieEntry> sMovieStore; -TC_GAME_API extern DBCStorage<PhaseEntry> sPhaseStore; -TC_GAME_API extern DBCStorage<PowerDisplayEntry> sPowerDisplayStore; -TC_GAME_API extern DBCStorage<QuestFactionRewEntry> sQuestFactionRewardStore; -TC_GAME_API extern DBCStorage<RandomPropertiesPointsEntry> sRandomPropertiesPointsStore; -TC_GAME_API extern DBCStorage<SkillLineAbilityEntry> sSkillLineAbilityStore; -TC_GAME_API extern DBCStorage<SkillLineEntry> sSkillLineStore; -TC_GAME_API extern DBCStorage<SkillRaceClassInfoEntry> sSkillRaceClassInfoStore; -TC_GAME_API extern DBCStorage<SpellAuraOptionsEntry> sSpellAuraOptionsStore; -TC_GAME_API extern DBCStorage<SpellCategoriesEntry> sSpellCategoriesStore; -TC_GAME_API extern DBCStorage<SpellCategoryEntry> sSpellCategoryStore; -TC_GAME_API extern DBCStorage<SpellCooldownsEntry> sSpellCooldownsStore; -TC_GAME_API extern DBCStorage<SpellEffectEntry> sSpellEffectStore; -TC_GAME_API extern DBCStorage<SpellEffectScalingEntry> sSpellEffectScalingStore; -TC_GAME_API extern SpellEffectScallingByEffectId sSpellEffectScallingByEffectId; -TC_GAME_API extern DBCStorage<SpellEntry> sSpellStore; -TC_GAME_API extern DBCStorage<SpellEquippedItemsEntry> sSpellEquippedItemsStore; -TC_GAME_API extern DBCStorage<SpellFocusObjectEntry> sSpellFocusObjectStore; -TC_GAME_API extern DBCStorage<SpellInterruptsEntry> sSpellInterruptsStore; -TC_GAME_API extern DBCStorage<SpellItemEnchantmentEntry> sSpellItemEnchantmentStore; -TC_GAME_API extern DBCStorage<SpellLevelsEntry> sSpellLevelsStore; -TC_GAME_API extern DBCStorage<SpellScalingEntry> sSpellScalingStore; -TC_GAME_API extern DBCStorage<SpellShapeshiftEntry> sSpellShapeshiftStore; -TC_GAME_API extern DBCStorage<SpellShapeshiftFormEntry> sSpellShapeshiftFormStore; -TC_GAME_API extern DBCStorage<SpellTargetRestrictionsEntry> sSpellTargetRestrictionsStore; -TC_GAME_API extern DBCStorage<SummonPropertiesEntry> sSummonPropertiesStore; -TC_GAME_API extern DBCStorage<TalentEntry> sTalentStore; -TC_GAME_API extern TalentsByPosition sTalentByPos; -TC_GAME_API extern DBCStorage<VehicleEntry> sVehicleStore; -TC_GAME_API extern DBCStorage<VehicleSeatEntry> sVehicleSeatStore; -TC_GAME_API extern DBCStorage<WMOAreaTableEntry> sWMOAreaTableStore; -TC_GAME_API extern DBCStorage<WorldSafeLocsEntry> sWorldSafeLocsStore; - -TC_GAME_API extern GameTable<GtArmorMitigationByLvlEntry> sGtArmorMitigationByLvlStore; -TC_GAME_API extern GameTable<GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore; -TC_GAME_API extern GameTable<GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore; -TC_GAME_API extern GameTable<GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore; -TC_GAME_API extern GameTable<GtChanceToSpellCritBaseEntry> sGtChanceToSpellCritBaseStore; -TC_GAME_API extern GameTable<GtChanceToSpellCritEntry> sGtChanceToSpellCritStore; -TC_GAME_API extern GameTable<GtCombatRatingsEntry> sGtCombatRatingsStore; -TC_GAME_API extern GameTable<GtItemSocketCostPerLevelEntry> sGtItemSocketCostPerLevelStore; -TC_GAME_API extern GameTable<GtNPCManaCostScalerEntry> sGtNPCManaCostScalerStore; -TC_GAME_API extern GameTable<GtNpcTotalHpEntry> sGtNpcTotalHpStore; -TC_GAME_API extern GameTable<GtNpcTotalHpExp1Entry> sGtNpcTotalHpExp1Store; -TC_GAME_API extern GameTable<GtNpcTotalHpExp2Entry> sGtNpcTotalHpExp2Store; -TC_GAME_API extern GameTable<GtNpcTotalHpExp3Entry> sGtNpcTotalHpExp3Store; -TC_GAME_API extern GameTable<GtNpcTotalHpExp4Entry> sGtNpcTotalHpExp4Store; -TC_GAME_API extern GameTable<GtNpcTotalHpExp5Entry> sGtNpcTotalHpExp5Store; -TC_GAME_API extern GameTable<GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore; -TC_GAME_API extern GameTable<GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore; -TC_GAME_API extern GameTable<GtOCTLevelExperienceEntry> sGtOCTLevelExperienceStore; -TC_GAME_API extern GameTable<GtRegenMPPerSptEntry> sGtRegenMPPerSptStore; -TC_GAME_API extern GameTable<GtSpellScalingEntry> sGtSpellScalingStore; -TC_GAME_API extern GameTable<GtOCTHpPerStaminaEntry> 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 f9968a7378c..00000000000 --- a/src/server/game/DataStores/DBCStructure.h +++ /dev/null @@ -1,1488 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef 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 AnimKitEntry -{ - uint32 ID; // 0 - //uint32 OneShotDuration; // 1 - //uint32 OneShotStopAnimKitID; // 2 - //uint32 LowDefAnimKitID; // 3 -}; - -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 WorldPvPID; // 24 World_PVP_Area.dbc - //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 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 - //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 -}; - -enum CharSectionType -{ - SECTION_TYPE_SKIN = 0, - SECTION_TYPE_FACE = 1, - SECTION_TYPE_FACIAL_HAIR = 2, - SECTION_TYPE_HAIR = 3, - SECTION_TYPE_UNDERWEAR = 4 -}; - -struct CharSectionsEntry -{ - //uint32 Id; - uint32 Race; - uint32 Gender; - uint32 GenType; - //char* TexturePath[3]; - uint32 Flags; - uint32 Type; - 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<<index in PLAYER__FIELD_KNOWN_TITLES - //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 - 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 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 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[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 -}; - -struct CreatureFamilyEntry -{ - uint32 ID; // 0 - float MinScale; // 1 - uint32 MinScaleLevel; // 2 - float MaxScale; // 3 - uint32 MaxScaleLevel; // 4 - uint32 SkillLine[2]; // 5-6 - uint32 PetFoodMask; // 7 - uint32 PetTalentType; // 8 - //uint32 CategoryEnumID; // 9 - char* Name_lang; // 10 - //char* IconFile; // 11 -}; - -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 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 -}; - -/* 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 DifficultyEntry -{ - uint32 ID; // 0 - uint32 FallbackDifficultyID; // 1 - uint32 InstanceType; // 2 - uint32 MinPlayers; // 3 - uint32 MaxPlayers; // 4 - //int32 OldEnumValue; // 5 - uint32 Flags; // 6 - uint32 ToggleDifficultyID; // 7 - //uint32 GroupSizeHealthCurveID; // 8 - //uint32 GroupSizeDmgCurveID; // 9 - //uint32 GroupSizeSpellPointsCurveID; // 10 - //char const* NameLang; // 11 - uint32 ItemBonusTreeModID; // 12 - //uint32 OrderIndex; // 13 -}; - -struct DungeonEncounterEntry -{ - uint32 ID; // 0 - uint32 MapID; // 1 - uint32 DifficultyID; // 2 - uint32 OrderIndex; // 3 - //uint32 Bit; // 4 - char* Name_lang; // 5 - //uint32 CreatureDisplayID; // 6 - //uint32 Flags; // 7 - //uint32 Unk; // 8 Flags2? -}; - -struct DurabilityCostsEntry -{ - uint32 ID; // 0 - uint32 WeaponSubClassCost[21]; // 1-22 - uint32 ArmorSubClassCost[8]; // 23-30 -}; - -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 - //char* Name_lang; // 1 - uint32 EmoteID; // 2 - //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 - 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 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 - 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; - 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 GtNpcTotalHpEntry -{ - float HP; -}; - -struct GtNpcTotalHpExp1Entry -{ - float HP; -}; - -struct GtNpcTotalHpExp2Entry -{ - float HP; -}; - -struct GtNpcTotalHpExp3Entry -{ - float HP; -}; - -struct GtNpcTotalHpExp4Entry -{ - float HP; -}; - -struct GtNpcTotalHpExp5Entry -{ - 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; -}; - -// 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 - //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 -}; - -#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 ItemSetSpellEntry -{ - uint32 ID; // 0 - uint32 ItemSetID; // 1 - uint32 SpellID; // 2 - uint32 Threshold; // 3 - uint32 ChrSpecID; // 4 -}; - -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 -}; - -#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 - uint32 Flags; // 1 -}; - -struct MapEntry -{ - uint32 ID; // 0 - //char* Directory; // 1 - uint32 InstanceType; // 2 - uint32 Flags; // 3 - //uint32 MapType; // 4 - //uint32 unk5; // 5 - char* MapName_lang; // 6 - uint32 AreaTableID; // 7 - //char* MapDescription0_lang; // 8 Horde - //char* MapDescription1_lang; // 9 Alliance - uint32 LoadingScreenID; // 10 LoadingScreens.dbc - //float MinimapIconScale; // 11 - int32 CorpseMapID; // 12 map_id of entrance map in ghost mode (continent always and in most cases = normal entrance) - DBCPosition2D CorpsePos; // 13 entrance coordinates in ghost mode (in most cases = normal entrance) - //uint32 TimeOfDayOverride; // 15 - uint32 ExpansionID; // 16 - uint32 RaidOffset; // 17 - uint32 MaxPlayers; // 18 - int32 ParentMapID; // 19 related to phasing - int32 CosmeticParentMapID; // 20 - //uint32 TimeOffset // 21 - - // Helpers - uint32 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 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'; } -}; - -struct MinorTalentEntry -{ - uint32 ID; // 0 - uint32 SpecID; // 1 - uint32 SpellID; // 2 - 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 - uint32 MapID; // 1 - uint32 BracketID; // 2 m_rangeIndex - uint32 MinLevel; // 3 - uint32 MaxLevel; // 4 - - // helpers - 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 AcquireMethod; // 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 -{ - 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 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 -}; - -struct StableSlotPricesEntry -{ - uint32 Slot; - 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 - -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 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 - 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 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 - 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<uint32, uint32> TalentSpellPosMap; -#endif diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h deleted file mode 100644 index 171eec94266..00000000000 --- a/src/server/game/DataStores/DBCfmt.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef TRINITY_DBCSFRM_H -#define TRINITY_DBCSFRM_H - -// x - skip<uint32>, X - skip<uint8>, 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 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 CreatureFamilyfmt[] = "nfifiiiiixsx"; -char const CreatureModelDatafmt[] = "niixxxxxxxxxxxxffxxxxxxxxxxxxxxxxx"; -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"; -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 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/DataStores/GameTables.cpp b/src/server/game/DataStores/GameTables.cpp new file mode 100644 index 00000000000..69637914b0e --- /dev/null +++ b/src/server/game/DataStores/GameTables.cpp @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "GameTables.h" +#include "Timer.h" +#include "Log.h" +#include "Util.h" +#include <boost/filesystem/path.hpp> +#include <fstream> + +GameTable<GtArmorMitigationByLvlEntry> sArmorMitigationByLvlGameTable; +GameTable<GtBarberShopCostBaseEntry> sBarberShopCostBaseGameTable; +GameTable<GtBaseMPEntry> sBaseMPGameTable; +GameTable<GtCombatRatingsEntry> sCombatRatingsGameTable; +GameTable<GtHpPerStaEntry> sHpPerStaGameTable; +GameTable<GtItemSocketCostPerLevelEntry> sItemSocketCostPerLevelGameTable; +GameTable<GtNpcDamageByClassEntry> sNpcDamageByClassGameTable[MAX_EXPANSIONS]; +GameTable<GtNpcManaCostScalerEntry> sNpcManaCostScalerGameTable; +GameTable<GtNpcTotalHpEntry> sNpcTotalHpGameTable[MAX_EXPANSIONS]; +GameTable<GtSpellScalingEntry> sSpellScalingGameTable; +GameTable<GtXpEntry> sXpGameTable; + +template<class T> +inline uint32 LoadGameTable(std::vector<std::string>& errors, GameTable<T>& 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', 0, false); + + 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<T> data; + data.emplace_back(); // row id 0, unused + + std::string line; + while (std::getline(stream, line)) + { + Tokenizer values(line, '\t', columnDefs.size()); + if (!values.size()) + break; + + // make end point just after last nonempty token + auto end = values.begin() + values.size() - 1; + while (!strlen(*end) && end != values.begin()) + --end; + + 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<float*>(&data.back()); + for (auto itr = values.begin() + 1; itr != end; ++itr) + *row++ = strtof(*itr, 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<std::string> bad_gt_files; + uint32 gameTableCount = 0; + +#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"); + 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..c9b9547847c --- /dev/null +++ b/src/server/game/DataStores/GameTables.h @@ -0,0 +1,281 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef GameTables_h__ +#define GameTables_h__ + +#include "SharedDefines.h" +#include "Common.h" + +struct GtArmorMitigationByLvlEntry +{ + float Mitigation = 0.0f; +}; + +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 T> +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<T> data) { _data = std::move(data); } + +private: + std::vector<T> _data; +}; + +TC_GAME_API extern GameTable<GtArmorMitigationByLvlEntry> sArmorMitigationByLvlGameTable; +TC_GAME_API extern GameTable<GtBarberShopCostBaseEntry> sBarberShopCostBaseGameTable; +TC_GAME_API extern GameTable<GtBaseMPEntry> sBaseMPGameTable; +TC_GAME_API extern GameTable<GtCombatRatingsEntry> sCombatRatingsGameTable; +TC_GAME_API extern GameTable<GtHpPerStaEntry> sHpPerStaGameTable; +TC_GAME_API extern GameTable<GtItemSocketCostPerLevelEntry> sItemSocketCostPerLevelGameTable; +TC_GAME_API extern GameTable<GtNpcDamageByClassEntry> sNpcDamageByClassGameTable[MAX_EXPANSIONS]; +TC_GAME_API extern GameTable<GtNpcManaCostScalerEntry> sNpcManaCostScalerGameTable; +TC_GAME_API extern GameTable<GtNpcTotalHpEntry> sNpcTotalHpGameTable[MAX_EXPANSIONS]; +TC_GAME_API extern GameTable<GtSpellScalingEntry> sSpellScalingGameTable; +TC_GAME_API extern GameTable<GtXpEntry> sXpGameTable; + +TC_GAME_API void LoadGameTables(std::string const& dataPath); + +template<class T> +inline float GetGameTableColumnForClass(T const* row, int32 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; +} + +inline float GetSpellScalingColumnForClass(GtSpellScalingEntry const* row, int32 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; + case -1: + return row->Item; + case -2: + return row->Consumable; + case -3: + return row->Gem1; + case -4: + return row->Gem2; + case -5: + return row->Gem3; + case -6: + return row->Health; + 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/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 7b8467f83bf..ab5db4c0b04 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; @@ -1059,7 +1054,7 @@ void Creature::SaveToDB() return; } - uint32 mapId = GetTransport() ? GetTransport()->GetGOInfo()->moTransport.mapID : GetMapId(); + uint32 mapId = GetTransport() ? GetTransport()->GetGOInfo()->moTransport.SpawnMap : GetMapId(); SaveToDB(mapId, data->spawnMask, GetPhaseMask()); } diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 449e9e2f35f..a69f8edda04 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -180,12 +180,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/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index 911517982c2..a5a0f53aaf6 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -365,8 +365,9 @@ void PlayerMenu::SendQuestGiverQuestList(ObjectGuid guid) AddQuestLevelToTitle(title, quest->GetQuestLevel()); bool repeatable = false; // NYI + bool ignored = false; // NYI - questList.GossipTexts.push_back(WorldPackets::Quest::GossipTextData(questID, questMenuItem.QuestIcon, quest->GetQuestLevel(), quest->GetFlags(), quest->GetFlagsEx(), repeatable, title)); + questList.GossipTexts.push_back(WorldPackets::Quest::GossipTextData(questID, questMenuItem.QuestIcon, quest->GetQuestLevel(), quest->GetFlags(), quest->GetFlagsEx(), repeatable, ignored, title)); } } @@ -510,17 +511,22 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const packet.Info.RewardMoneyDifficulty = quest->GetRewMoneyDifficulty(); packet.Info.RewardMoneyMultiplier = quest->GetMoneyMultiplier(); packet.Info.RewardBonusMoney = quest->GetRewMoneyMaxLevel(); - packet.Info.RewardDisplaySpell = quest->GetRewDisplaySpell(); + for (uint8 i = 0; i < QUEST_REWARD_DISPLAY_SPELL_COUNT; ++i) + packet.Info.RewardDisplaySpell[i] = quest->RewardDisplaySpell[i]; + packet.Info.RewardSpell = quest->GetRewSpell(); packet.Info.RewardHonor = quest->GetRewHonor(); packet.Info.RewardKillHonor = quest->GetRewKillHonor(); + packet.Info.RewardArtifactXPDifficulty = quest->GetArtifactXPDifficulty(); + packet.Info.RewardArtifactXPMultiplier = quest->GetArtifactXPMultiplier(); + packet.Info.RewardArtifactCategoryID = quest->GetArtifactCategoryId(); + packet.Info.StartItem = quest->GetSrcItemId(); packet.Info.Flags = quest->GetFlags(); packet.Info.FlagsEx = quest->GetFlagsEx(); packet.Info.RewardTitle = quest->GetRewTitle(); - packet.Info.RewardTalents = quest->GetBonusTalents(); packet.Info.RewardArenaPoints = quest->GetRewArenaPoints(); packet.Info.RewardSkillLineID = quest->GetRewardSkillId(); packet.Info.RewardNumSkillUps = quest->GetRewardSkillPoints(); @@ -553,6 +559,7 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const packet.Info.RewardFactionID[i] = quest->RewardFactionId[i]; packet.Info.RewardFactionValue[i] = quest->RewardFactionValue[i]; packet.Info.RewardFactionOverride[i] = quest->RewardFactionOverride[i]; + packet.Info.RewardFactionCapIn[i] = quest->RewardFactionCapIn[i]; } packet.Info.POIContinent = quest->GetPOIContinent(); @@ -569,6 +576,7 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const packet.Info.AreaDescription = areaDescription; packet.Info.QuestCompletionLog = questCompletionLog; packet.Info.AllowableRaces = quest->GetAllowableRaces(); + packet.Info.QuestRewardID = quest->GetRewardId(); for (QuestObjective const& questObjective : quest->GetObjectives()) { @@ -720,7 +728,7 @@ void PlayerMenu::SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGU switch (obj.Type) { case QUEST_OBJECTIVE_ITEM: - packet.Collect.push_back(WorldPackets::Quest::QuestObjectiveCollect(obj.ObjectID, obj.Amount)); + packet.Collect.push_back(WorldPackets::Quest::QuestObjectiveCollect(obj.ObjectID, obj.Amount, obj.Flags)); break; case QUEST_OBJECTIVE_CURRENCY: packet.Currency.push_back(WorldPackets::Quest::QuestCurrency(obj.ObjectID, obj.Amount)); diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index b26839aade6..eb7b3ec9d85 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -1037,6 +1037,9 @@ bool GameObject::IsNeverVisible() const if (GetGoType() == GAMEOBJECT_TYPE_SPELL_FOCUS && GetGOInfo()->spellFocus.serverOnly == 1) return true; + if (!GetUInt32Value(GAMEOBJECT_DISPLAYID)) + return true; + return false; } @@ -2058,8 +2061,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) @@ -2086,8 +2089,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) @@ -2105,8 +2108,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/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 07d1ae7acd6..a26d0fac250 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -57,7 +57,7 @@ struct GameObjectTemplate uint32 closeTextID; // 5 closeTextID, References: BroadcastText, NoValue = 0 uint32 IgnoredByPathing; // 6 Ignored By Pathing, enum { false, true, }; Default: false uint32 conditionID1; // 7 conditionID1, References: PlayerCondition, NoValue = 0 - uint32 EnablePortalsonopen; // 8 Enable Portals on open, enum { false, true, }; Default: false + uint32 DoorisOpaque; // 8 Door is Opaque (Disable portal on close), enum { false, true, }; Default: true uint32 GiganticAOI; // 9 Gigantic AOI, enum { false, true, }; Default: false uint32 InfiniteAOI; // 10 Infinite AOI, enum { false, true, }; Default: false } door; @@ -112,9 +112,9 @@ struct GameObjectTemplate uint32 usegrouplootrules; // 15 use group loot rules, enum { false, true, }; Default: false uint32 floatingTooltip; // 16 floatingTooltip, enum { false, true, }; Default: false uint32 conditionID1; // 17 conditionID1, References: PlayerCondition, NoValue = 0 - int32 xpLevel; // 18 xpLevel, int, Min value: -1, Max value: 100, Default value: 0 - uint32 xpDifficulty; // 19 xpDifficulty, enum { No Exp, Trivial, Very Small, Small, Substandard, Standard, High, Epic, Dungeon, Placeholder2, }; Default: No Exp - uint32 lootLevel; // 20 lootLevel, int, Min value: 0, Max value: 100, Default value: 0 + int32 xpLevel; // 18 xpLevel, int, Min value: -1, Max value: 123, Default value: 0 + uint32 xpDifficulty; // 19 xpDifficulty, enum { No Exp, Trivial, Very Small, Small, Substandard, Standard, High, Epic, Dungeon, 5, }; Default: No Exp + uint32 lootLevel; // 20 lootLevel, int, Min value: 0, Max value: 123, Default value: 0 uint32 GroupXP; // 21 Group XP, enum { false, true, }; Default: false uint32 DamageImmuneOK; // 22 Damage Immune OK, enum { false, true, }; Default: false uint32 trivialSkillLow; // 23 trivialSkillLow, int, Min value: 0, Max value: 65535, Default value: 0 @@ -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 @@ -222,7 +223,7 @@ struct GameObjectTemplate uint32 allowMounted; // 17 allowMounted, enum { false, true, }; Default: false uint32 floatingTooltip; // 18 floatingTooltip, enum { false, true, }; Default: false uint32 gossipID; // 19 gossipID, References: Gossip, NoValue = 0 - uint32 WorldStateSetsState; // 20 WorldStateSetsState, enum { false, true, }; Default: false + uint32 AllowMultiInteract; // 20 Allow Multi-Interact, enum { false, true, }; Default: false uint32 floatOnWater; // 21 floatOnWater, enum { false, true, }; Default: false uint32 conditionID1; // 22 conditionID1, References: PlayerCondition, NoValue = 0 uint32 playerCast; // 23 playerCast, enum { false, true, }; Default: false @@ -233,6 +234,7 @@ struct GameObjectTemplate uint32 NeverUsableWhileMounted; // 28 Never Usable While Mounted, enum { false, true, }; Default: false uint32 SortFarZ; // 29 Sort Far Z, enum { false, true, }; Default: false uint32 SyncAnimationtoObjectLifetime; // 30 Sync Animation to Object Lifetime (global track only), enum { false, true, }; Default: false + uint32 NoFuzzyHit; // 31 No Fuzzy Hit, enum { false, true, }; Default: false } goober; // 11 GAMEOBJECT_TYPE_TRANSPORT struct @@ -242,7 +244,7 @@ struct GameObjectTemplate uint32 autoClose; // 2 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 Reached1stfloor; // 3 Reached 1st floor, References: GameEvents, NoValue = 0 uint32 Reached2ndfloor; // 4 Reached 2nd floor, References: GameEvents, NoValue = 0 - int32 mapID; // 5 mapID, References: Map, NoValue = -1 + int32 SpawnMap; // 5 Spawn Map, References: Map, NoValue = -1 uint32 Timeto3rdfloor; // 6 Time to 3rd floor (ms), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 Reached3rdfloor; // 7 Reached 3rd floor, References: GameEvents, NoValue = 0 uint32 Timeto4thfloor; // 8 Time to 4th floor (ms), int, Min value: 0, Max value: 2147483647, Default value: 0 @@ -296,7 +298,7 @@ struct GameObjectTemplate uint32 startEventID; // 3 startEventID, References: GameEvents, NoValue = 0 uint32 stopEventID; // 4 stopEventID, References: GameEvents, NoValue = 0 uint32 transportPhysics; // 5 transportPhysics, References: TransportPhysics, NoValue = 0 - int32 mapID; // 6 mapID, References: Map, NoValue = -1 + int32 SpawnMap; // 6 Spawn Map, References: Map, NoValue = -1 uint32 worldState1; // 7 worldState1, References: WorldState, NoValue = 0 uint32 allowstopping; // 8 allow stopping, enum { false, true, }; Default: false uint32 InitStopped; // 9 Init Stopped, enum { false, true, }; Default: false @@ -504,10 +506,11 @@ struct GameObjectTemplate // 35 GAMEOBJECT_TYPE_TRAPDOOR struct { - int32 Unused; // 0 Unused, int, Min value: -2147483648, Max value: 2147483647, Default value: 0 + uint32 AutoLink; // 0 Auto Link, enum { false, true, }; Default: false uint32 startOpen; // 1 startOpen, enum { false, true, }; Default: false uint32 autoClose; // 2 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 BlocksPathsDown; // 3 Blocks Paths Down, enum { false, true, }; Default: false + uint32 PathBlockerBump; // 4 Path Blocker Bump (ft), int, Min value: -2147483648, Max value: 2147483647, Default value: 0 } trapdoor; // 36 GAMEOBJECT_TYPE_NEW_FLAG struct @@ -534,13 +537,13 @@ struct GameObjectTemplate // 38 GAMEOBJECT_TYPE_GARRISON_BUILDING struct { - int32 mapID; // 0 mapID, References: Map, NoValue = -1 + int32 SpawnMap; // 0 Spawn Map, References: Map, NoValue = -1 } garrisonBuilding; // 39 GAMEOBJECT_TYPE_GARRISON_PLOT struct { uint32 PlotInstance; // 0 Plot Instance, References: GarrPlotInstance, NoValue = 0 - int32 mapID; // 1 mapID, References: Map, NoValue = -1 + int32 SpawnMap; // 1 Spawn Map, References: Map, NoValue = -1 } garrisonPlot; // 40 GAMEOBJECT_TYPE_CLIENT_CREATURE struct @@ -583,10 +586,10 @@ struct GameObjectTemplate // 43 GAMEOBJECT_TYPE_PHASEABLE_MO struct { - int32 mapID; // 0 mapID, References: Map, NoValue = -1 - int32 namedset; // 1 named set (Area Names), int, Min value: -2147483648, Max value: 2147483647, Default value: 0 - uint32 Primarydoodadset; // 2 Primary doodad set, int, Min value: -2147483648, Max value: 2147483647, Default value: 0 - uint32 Secondarydoodadset; // 3 Secondary doodad set, int, Min value: -2147483648, Max value: 2147483647, Default value: 0 + int32 SpawnMap; // 0 Spawn Map, References: Map, NoValue = -1 + uint32 AreaNameSet; // 1 Area Name Set (Index), int, Min value: -2147483648, Max value: 2147483647, Default value: 0 + uint32 DoodadSetA; // 2 Doodad Set A, int, Min value: 0, Max value: 2147483647, Default value: 0 + uint32 DoodadSetB; // 3 Doodad Set B, int, Min value: 0, Max value: 2147483647, Default value: 0 } phaseableMO; // 44 GAMEOBJECT_TYPE_GARRISON_MONUMENT struct @@ -606,15 +609,59 @@ struct GameObjectTemplate { uint32 TrophyInstanceID; // 0 Trophy Instance ID, References: TrophyInstance, NoValue = 0 } garrisonMonumentPlaque; - // 47 GAMEOBJECT_TYPE_DO_NOT_USE_3 + // 47 GAMEOBJECT_TYPE_ARTIFACT_FORGE struct { - } DONOTUSE3; + uint32 conditionID1; // 0 conditionID1, References: PlayerCondition, NoValue = 0 + uint32 LargeAOI; // 1 Large AOI, enum { false, true, }; Default: false + uint32 IgnoreBoundingBox; // 2 Ignore Bounding Box, enum { false, true, }; Default: false + uint32 CameraMode; // 3 Camera Mode, References: CameraMode, NoValue = 0 + uint32 FadeRegionRadius; // 4 Fade Region Radius, int, Min value: 0, Max value: 2147483647, Default value: 0 + } artifactForge; // 48 GAMEOBJECT_TYPE_UI_LINK struct { - uint32 UILinkType; // 0 UI Link Type, Type id: 10 + uint32 UILinkType; // 0 UI Link Type, enum { Adventure Journal, Obliterum Forge, }; Default: Adventure Journal + uint32 allowMounted; // 1 allowMounted, enum { false, true, }; Default: false + uint32 GiganticAOI; // 2 Gigantic AOI, enum { false, true, }; Default: false + uint32 spellFocusType; // 3 spellFocusType, References: SpellFocusObject, NoValue = 0 + uint32 radius; // 4 radius, int, Min value: 0, Max value: 50, Default value: 10 } UILink; + // 49 GAMEOBJECT_TYPE_KEYSTONE_RECEPTACLE + struct + { + } KeystoneReceptacle; + // 50 GAMEOBJECT_TYPE_GATHERING_NODE + struct + { + uint32 open; // 0 open, References: Lock_, NoValue = 0 + uint32 chestLoot; // 1 chestLoot, References: Treasure, NoValue = 0 + uint32 level; // 2 level, int, Min value: 0, Max value: 65535, Default value: 0 + uint32 notInCombat; // 3 notInCombat, enum { false, true, }; Default: false + uint32 trivialSkillLow; // 4 trivialSkillLow, int, Min value: 0, Max value: 65535, Default value: 0 + uint32 trivialSkillHigh; // 5 trivialSkillHigh, int, Min value: 0, Max value: 65535, Default value: 0 + uint32 ObjectDespawnDelay; // 6 Object Despawn Delay, int, Min value: 0, Max value: 600, Default value: 15 + uint32 triggeredEvent; // 7 triggeredEvent, References: GameEvents, NoValue = 0 + uint32 requireLOS; // 8 require LOS, enum { false, true, }; Default: false + uint32 openTextID; // 9 openTextID, References: BroadcastText, NoValue = 0 + uint32 floatingTooltip; // 10 floatingTooltip, enum { false, true, }; Default: false + uint32 conditionID1; // 11 conditionID1, References: PlayerCondition, NoValue = 0 + uint32 xpLevel; // 12 xpLevel, int, Min value: -1, Max value: 123, Default value: 0 + uint32 xpDifficulty; // 13 xpDifficulty, enum { No Exp, Trivial, Very Small, Small, Substandard, Standard, High, Epic, Dungeon, 5, }; Default: No Exp + uint32 spell; // 14 spell, References: Spell, NoValue = 0 + uint32 GiganticAOI; // 15 Gigantic AOI, enum { false, true, }; Default: false + uint32 LargeAOI; // 16 Large AOI, enum { false, true, }; Default: false + uint32 SpawnVignette; // 17 Spawn Vignette, References: vignette, NoValue = 0 + uint32 MaxNumberofLoots; // 18 Max Number of Loots, int, Min value: 1, Max value: 40, Default value: 10 + uint32 logloot; // 19 log loot, enum { false, true, }; Default: false + uint32 linkedTrap; // 20 linkedTrap, References: GameObjects, NoValue = 0 + } gatheringNode; + // 51 GAMEOBJECT_TYPE_CHALLENGE_MODE_REWARD + struct + { + uint32 chestLoot; // 0 chestLoot, References: Treasure, NoValue = 0 + uint32 WhenAvailable; // 1 When Available, References: GameObjectDisplayInfo, NoValue = 0 + } challengeModeReward; struct { uint32 data[MAX_GAMEOBJECT_DATA]; @@ -1073,10 +1120,10 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject> Transport* ToTransport() { if (GetGOInfo()->type == GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT) return reinterpret_cast<Transport*>(this); else return NULL; } Transport const* ToTransport() const { if (GetGOInfo()->type == GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT) return reinterpret_cast<Transport const*>(this); else return NULL; } - float GetStationaryX() const override { if (GetGOInfo()->type != GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT) return m_stationaryPosition.GetPositionX(); return GetPositionX(); } - float GetStationaryY() const override { if (GetGOInfo()->type != GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT) return m_stationaryPosition.GetPositionY(); return GetPositionY(); } - float GetStationaryZ() const override { if (GetGOInfo()->type != GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT) return m_stationaryPosition.GetPositionZ(); return GetPositionZ(); } - float GetStationaryO() const override { if (GetGOInfo()->type != GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT) return m_stationaryPosition.GetOrientation(); return GetOrientation(); } + float GetStationaryX() const override { return m_stationaryPosition.GetPositionX(); } + float GetStationaryY() const override { return m_stationaryPosition.GetPositionY(); } + float GetStationaryZ() const override { return m_stationaryPosition.GetPositionZ(); } + float GetStationaryO() const override { return m_stationaryPosition.GetOrientation(); } void RelocateStationaryPosition(float x, float y, float z, float o) { m_stationaryPosition.Relocate(x, y, z, o); } float GetInteractionDistance() const; diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index fd4558fd718..f45f14eb427 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -31,6 +31,8 @@ #include "WorldSession.h" #include "ItemPackets.h" #include "TradeData.h" +#include "GameTables.h" +#include "CollectionMgr.h" void AddItemsSetItem(Player* player, Item* item) { @@ -48,6 +50,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) @@ -78,28 +83,29 @@ void AddItemsSetItem(Player* player, Item* item) ++eff->EquippedItemCount; - ItemSetSpells& spells = sItemSetSpellsStore[setid]; - - for (ItemSetSpellEntry const* itemSetSpell : spells) + if (std::vector<ItemSetSpellEntry const*> 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 +138,20 @@ void RemoveItemsSetItem(Player* player, ItemTemplate const* proto) --eff->EquippedItemCount; - ItemSetSpells const& spells = sItemSetSpellsStore[setid]; - for (ItemSetSpellEntry const* itemSetSpell : spells) + if (std::vector<ItemSetSpellEntry const*> 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 @@ -227,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; @@ -348,9 +384,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)); @@ -372,6 +406,81 @@ void Item::SaveToDB(SQLTransaction& trans) stmt->setUInt64(1, 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 (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 * MAX_GEM_SOCKETS, 0); + stmt->setString(2 + i * MAX_GEM_SOCKETS, ""); + stmt->setUInt8(3 + i * MAX_GEM_SOCKETS, 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: @@ -380,6 +489,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); @@ -409,10 +522,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 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 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 @@ -432,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<HighGuid::Player>(creator)); + { + if (!(itemFlags & ITEM_FIELD_FLAG_CHILD)) + SetGuidValue(ITEM_FIELD_CREATOR, ObjectGuid::Create<HighGuid::Player>(creator)); + else + SetGuidValue(ITEM_FIELD_CREATOR, ObjectGuid::Create<HighGuid::Item>(creator)); + } if (uint64 giftCreator = fields[3].GetUInt64()) SetGuidValue(ITEM_FIELD_GIFTCREATOR, ObjectGuid::Create<HighGuid::Player>(giftCreator)); SetCount(fields[4].GetUInt32()); @@ -453,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) { @@ -480,12 +605,7 @@ 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_TRANSMOG_APPEARANCE_MOD, (transmogEntry >> 24) & 0xFF); - SetModifier(ITEM_MODIFIER_TRANSMOG_ITEM_ID, transmogEntry & 0xFFFFFF); - } - + SetModifier(ITEM_MODIFIER_BATTLE_PET_DISPLAY_ID, fields[19].GetUInt32()); uint32 upgradeId = fields[14].GetUInt32(); ItemUpgradeEntry const* rulesetUpgrade = sItemUpgradeStore.LookupEntry(sDB2Manager.GetRulesetItemUpgrade(entry)); ItemUpgradeEntry const* upgrade = sItemUpgradeStore.LookupEntry(upgradeId); @@ -502,19 +622,46 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie } SetModifier(ITEM_MODIFIER_UPGRADE_ID, upgradeId); - 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()); + 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[20].GetString(), ' '); + Tokenizer bonusListIDs(fields[18].GetString(), ' '); for (char const* token : bonusListIDs) { uint32 bonusListID = atoul(token); AddBonuses(bonusListID); } + 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()); + + ItemDynamicFieldGems gemData[MAX_GEM_SOCKETS]; + memset(gemData, 0, sizeof(gemData)); + for (uint32 i = 0; i < MAX_GEM_SOCKETS; ++i) + { + 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 { uint8 index = 0; @@ -599,27 +746,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); } } @@ -630,12 +775,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) @@ -647,10 +792,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()); } @@ -939,38 +1083,43 @@ void Item::ClearEnchantment(EnchantmentSlot slot) SetState(ITEM_CHANGED, GetOwner()); } +DynamicFieldStructuredView<ItemDynamicFieldGems> Item::GetGems() const +{ + return GetDynamicStructuredValues<ItemDynamicFieldGems>(ITEM_DYNAMIC_FIELD_GEMS); +} + +ItemDynamicFieldGems const* Item::GetGem(uint16 slot) const +{ + ASSERT(slot < MAX_GEM_SOCKETS); + return GetDynamicStructuredValue<ItemDynamicFieldGems>(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 { - for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+MAX_GEM_SOCKETS; ++enchant_slot) + uint32 gemSlot = 0; + for (ItemDynamicFieldGems const& gemData : GetGems()) { - 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(gemData.ItemId); + 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; @@ -978,44 +1127,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(GetGems().begin(), GetGems().end(), [GemID](ItemDynamicFieldGems const& gemData) { - 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 gemData.ItemId == 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(GetGems().begin(), GetGems().end(), [limitCategory](ItemDynamicFieldGems const& gemData) { - 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(gemData.ItemId); 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 @@ -1028,11 +1155,6 @@ void Item::SendUpdateSockets() { WorldPackets::Item::SocketGemsResult socketGems; socketGems.Item = GetGUID(); - for (uint32 i = 0; i < MAX_GEM_SOCKETS; ++i) - socketGems.Sockets[i] = int32(GetEnchantmentId(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT + i))); - - socketGems.SocketMatch = int32(GetEnchantmentId(BONUS_ENCHANTMENT_SLOT)); - GetOwner()->GetSession()->SendPacket(socketGems.Write()); } @@ -1145,9 +1267,9 @@ void Item::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player* UpdateMask::SetUpdateBit(data->contents() + maskPos, index); std::size_t arrayBlockCount = UpdateMask::GetBlockCount(values.size()); - *data << uint8(UpdateMask::EncodeDynamicFieldChangeType(arrayBlockCount, _dynamicChangesMask[index], updateType)); + *data << uint16(UpdateMask::EncodeDynamicFieldChangeType(arrayBlockCount, _dynamicChangesMask[index], updateType)); if (updateType == UPDATETYPE_VALUES && _dynamicChangesMask[index] == UpdateMask::VALUE_AND_SIZE_CHANGED) - *data << uint16(values.size()); + *data << uint32(values.size()); std::size_t arrayMaskPos = data->wpos(); data->resize(data->size() + arrayBlockCount * sizeof(UpdateMask::BlockType)); @@ -1164,7 +1286,7 @@ void Item::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player* } else { - uint16 m = 0; + uint32 m = 0; // work around stupid item modifier field requirements - push back values mask by sizeof(m) bytes if size was not appended yet if (updateType == UPDATETYPE_VALUES && _dynamicChangesMask[index] != UpdateMask::VALUE_AND_SIZE_CHANGED && _changesMask[ITEM_FIELD_MODIFIERS_MASK]) @@ -1232,7 +1354,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; @@ -1252,6 +1374,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) @@ -1306,6 +1430,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); @@ -1331,9 +1456,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; @@ -1350,34 +1472,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) @@ -1437,6 +1531,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; @@ -1483,27 +1578,25 @@ 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()) 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 || @@ -1512,11 +1605,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()) @@ -1886,8 +1987,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)); } @@ -1895,14 +1996,23 @@ 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()); } +ItemModifiedAppearanceEntry const* Item::GetItemModifiedAppearance() const +{ + return sDB2Manager.GetItemModifiedAppearance(GetEntry(), _bonusData.AppearanceModID); +} + uint32 Item::GetModifier(ItemModifier modifier) const { return GetDynamicValue(ITEM_DYNAMIC_FIELD_MODIFIERS, modifier); @@ -1914,33 +2024,46 @@ void Item::SetModifier(ItemModifier modifier, uint32 value) SetDynamicValue(ITEM_DYNAMIC_FIELD_MODIFIERS, modifier, value); } -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; @@ -1953,6 +2076,7 @@ void Item::AddBonuses(uint32 bonusListID) AddDynamicValue(ITEM_DYNAMIC_FIELD_BONUSLIST_IDS, bonusListID); for (ItemBonusEntry const* bonus : *bonuses) _bonusData.AddBonus(bonus->Type, bonus->Value); + SetUInt32Value(ITEM_FIELD_APPEARANCE_MOD_ID, _bonusData.AppearanceModID); } } diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 6f96ef670ba..683353a7fe3 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 @@ -205,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 @@ -221,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 }; @@ -236,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 { @@ -256,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: @@ -351,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<ItemDynamicFieldGems> 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; } @@ -394,12 +429,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; } @@ -425,23 +461,25 @@ 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); 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; @@ -457,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/ItemEnchantmentMgr.cpp b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp index 7b30480df35..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 <list> #include <vector> @@ -178,7 +177,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 e513c2f26dc..77848112014 100644 --- a/src/server/game/Entities/Item/ItemTemplate.cpp +++ b/src/server/game/Entities/Item/ItemTemplate.cpp @@ -16,12 +16,34 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "DBCStores.h" #include "DB2Stores.h" #include "World.h" #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])) @@ -57,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 }; @@ -137,21 +159,21 @@ void ItemTemplate::GetDamage(uint32 itemLevel, float& minDamage, float& maxDamag if (GetClass() != ITEM_CLASS_WEAPON || quality > ITEM_QUALITY_ARTIFACT) return; - DBCStorage<ItemDamageEntry>* 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 +181,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 +199,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)); @@ -199,7 +214,7 @@ void ItemTemplate::GetDamage(uint32 itemLevel, float& minDamage, float& maxDamag bool ItemTemplate::IsUsableBySpecialization(Player const* player) const { - 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/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index 3ad9189c6aa..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 @@ -218,7 +216,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, @@ -318,15 +316,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 { @@ -373,7 +385,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, @@ -381,10 +393,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 { @@ -396,10 +410,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 { @@ -429,7 +444,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 @@ -451,20 +466,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 { @@ -473,7 +489,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, @@ -486,10 +502,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 { @@ -519,16 +536,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 { @@ -551,10 +584,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 { @@ -592,16 +624,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 { @@ -614,10 +645,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 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_GLYPH 12 +#define MAX_ITEM_SUBCLASS_WOW_TOKEN 1 const uint32 MaxItemSubclassValues[MAX_ITEM_CLASS] = { @@ -629,17 +676,21 @@ 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 + #define MIN_ITEM_LEVEL 1 #define MAX_ITEM_LEVEL 1000 @@ -660,7 +711,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<uint32>(ExtendedData->BuyCount, 1u); } uint32 GetBuyPrice() const { return ExtendedData->BuyPrice; } uint32 GetSellPrice() const { return ExtendedData->SellPrice; } InventoryType GetInventoryType() const { return InventoryType(ExtendedData->InventoryType); } @@ -719,6 +770,7 @@ struct TC_GAME_API ItemTemplate uint32 FlagsCu; float SpellPPMRate; std::bitset<MAX_CLASSES * MAX_SPECIALIZATIONS> Specializations[2]; // one set for 1-40 level range and another for 41-100 + uint32 ItemSpecClassMask; // helpers bool CanChangeEquipStateInCombat() const; @@ -735,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/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 9f3b50c3d62..d6157b43dde 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -338,7 +338,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; @@ -350,9 +349,9 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const bool HasAreaTrigger = false; bool HasGameObject = false; bool ThisIsYou = (flags & UPDATEFLAG_SELF) != 0; - bool ReplaceActive = false; + bool SmoothPhasing = false; bool SceneObjCreate = false; - bool ScenePendingInstances = false; + bool PlayerCreateData = false; uint32 PauseTimesCount = 0; if (GameObject const* go = ToGameObject()) if (go->GetGoType() == GAMEOBJECT_TYPE_TRANSPORT) @@ -361,7 +360,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); @@ -372,11 +370,11 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const data->WriteBit(Rotation); data->WriteBit(HasAreaTrigger); data->WriteBit(HasGameObject); + data->WriteBit(SmoothPhasing); data->WriteBit(ThisIsYou); - data->WriteBit(ReplaceActive); data->WriteBit(SceneObjCreate); - data->WriteBit(ScenePendingInstances); - *data << uint32(PauseTimesCount); + data->WriteBit(PlayerCreateData); + data->FlushBits(); if (HasMovementUpdate) { @@ -387,7 +385,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const *data << GetPackGUID(); // MoverGUID - *data << uint32(unit->m_movementInfo.time); // MoveIndex + *data << uint32(unit->m_movementInfo.time); // MoveTime *data << float(unit->GetPositionX()); *data << float(unit->GetPositionY()); *data << float(unit->GetPositionZ()); @@ -396,15 +394,14 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const *data << float(unit->m_movementInfo.pitch); // Pitch *data << float(unit->m_movementInfo.splineElevation); // StepUpStartElevation - uint32 removeMovementForcesCount = 0; - *data << uint32(removeMovementForcesCount); // Count of RemoveForcesIDs - *data << uint32(0); // Unknown + *data << uint32(0); // RemoveForcesIDs.size() + *data << uint32(0); // MoveIndex - //for (uint32 i = 0; i < removeMovementForcesCount; ++i) + //for (std::size_t i = 0; i < RemoveForcesIDs.size(); ++i) // *data << ObjectGuid(RemoveForcesIDs); data->WriteBits(unit->GetUnitMovementFlags(), 30); - data->WriteBits(unit->GetExtraUnitMovementFlags(), 16); + data->WriteBits(unit->GetExtraUnitMovementFlags(), 18); data->WriteBit(!unit->m_movementInfo.transport.guid.IsEmpty()); // HasTransport data->WriteBit(HasFall); // HasFall data->WriteBit(HasSpline); // HasSpline - marks that the unit uses spline movement @@ -437,29 +434,26 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const *data << float(unit->GetSpeed(MOVE_TURN_RATE)); *data << float(unit->GetSpeed(MOVE_PITCH_RATE)); - uint32 MovementForceCount = 0; - *data << uint32(MovementForceCount); + *data << uint32(0); // unit->m_movementInfo.forces.size() - //for (uint32 i = 0; i < MovementForceCount; ++i) + data->WriteBit(HasSpline); + data->FlushBits(); + + //for (std::size_t i = 0; i < unit->m_movementInfo.forces.size(); ++i) //{ // *data << ObjectGuid(ID); + // *data << Vector3(Origin); // *data << Vector3(Direction); - // *data << Vector3(force.TransportPosition); // *data << int32(TransportID); // *data << float(Magnitude); - // *data << uint8(Type); + // data->WriteBits(Type, 2); //} - // HasMovementSpline - marks that spline data is present in packet - if (data->WriteBit(HasSpline)) + if (HasSpline) WorldPackets::Movement::CommonMovement::WriteCreateObjectSplineDataBlock(*unit->movespline, *data); } - if (HasMovementTransport) - { - WorldObject const* self = static_cast<WorldObject const*>(this); - *data << self->m_movementInfo.transport; - } + *data << uint32(PauseTimesCount); if (Stationary) { @@ -505,243 +499,263 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const if (Rotation) *data << uint64(ToGameObject()->GetRotation()); // Rotation + if (GameObject const* go = ToGameObject()) + for (uint32 i = 0; i < PauseTimesCount; ++i) + *data << uint32(go->GetGOValue()->Transport.StopFrames->at(i)); + + if (HasMovementTransport) + { + WorldObject const* self = static_cast<WorldObject const*>(this); + *data << self->m_movementInfo.transport; + } + //if (AreaTrigger) //{ - // packet.ReadInt32("ElapsedMs", index); - - // packet.ReadVector3("RollPitchYaw1", index); - - // packet.ResetBitReader(); - - // var HasAbsoluteOrientation = packet.ReadBit("HasAbsoluteOrientation", index); - // var HasDynamicShape = packet.ReadBit("HasDynamicShape", index); - // var HasAttached = packet.ReadBit("HasAttached", index); - // var HasFaceMovementDir = packet.ReadBit("HasFaceMovementDir", index); - // var HasFollowsTerrain = packet.ReadBit("HasFollowsTerrain", index); - // var HasTargetRollPitchYaw = packet.ReadBit("HasTargetRollPitchYaw", index); - // var HasScaleCurveID = packet.ReadBit("HasScaleCurveID", index); - // var HasMorphCurveID = packet.ReadBit("HasMorphCurveID", index); - // var HasFacingCurveID = packet.ReadBit("HasFacingCurveID", index); - // var HasMoveCurveID = packet.ReadBit("HasMoveCurveID", index); - // var HasAreaTriggerSphere = packet.ReadBit("HasAreaTriggerSphere", index); - // var HasAreaTriggerBox = packet.ReadBit("HasAreaTriggerBox", index); - // var HasAreaTriggerPolygon = packet.ReadBit("HasAreaTriggerPolygon", index); - // var HasAreaTriggerCylinder = packet.ReadBit("HasAreaTriggerCylinder", index); - // var HasAreaTriggerSpline = packet.ReadBit("HasAreaTriggerSpline", index); + // *data << uint32(ElapsedMs); + // *data << Vector3(RollPitchYaw); + // data->WriteBit(HasAbsoluteOrientation); + // data->WriteBit(HasDynamicShape); + // data->WriteBit(HasAttached); + // data->WriteBit(HasFaceMovementDir); + // data->WriteBit(HasFollowsTerrain); + // data->WriteBit(Unknown_1); + // data->WriteBit(HasTargetRollPitchYaw); + // data->WriteBit(HasScaleCurveID); + // data->WriteBit(HasMorphCurveID); + // data->WriteBit(HasFacingCurveID); + // data->WriteBit(HasMoveCurveID); + // data->WriteBit(HasAreaTriggerSphere); + // data->WriteBit(HasAreaTriggerBox); + // data->WriteBit(HasAreaTriggerPolygon); + // data->WriteBit(HasAreaTriggerCylinder); + // data->WriteBit(HasAreaTriggerSpline); + // data->WriteBit(HasAreaTriggerUnkType); + + // if (HasAreaTriggerUnkType) + // { + // data->WriteBit(Unk_1); + // data->WriteBit(HasCenter); + // data->WriteBit(Unk_3); + // data->WriteBit(Unk_4); + + // *data << uint32(); + // *data << int32(); + // *data << uint32(); + // *data << float(Radius); + // *data << float(BlendFromRadius); + // *data << float(InitialAngel); + // *data << float(ZOffset); + + // if (Unk_1) + // *data << ObjectGuid(); + + // if (HasCenter) + // *data << Vector3(Center); + // } // if (HasTargetRollPitchYaw) - // packet.ReadVector3("TargetRollPitchYaw", index); + // *data << Vector3(TargetRollPitchYaw); // if (HasScaleCurveID) - // packet.ReadInt32("ScaleCurveID, index"); + // *data << uint32(ScaleCurveID); // if (HasMorphCurveID) - // packet.ReadInt32("MorphCurveID", index); + // *data << uint32(MorphCurveID); // if (HasFacingCurveID) - // packet.ReadInt32("FacingCurveID", index); + // *data << uint32(FacingCurveID); // if (HasMoveCurveID) - // packet.ReadInt32("MoveCurveID", index); + // *data << uint32(MoveCurveID); // if (HasAreaTriggerSphere) // { - // packet.ReadSingle("Radius", index); - // packet.ReadSingle("RadiusTarget", index); + // *data << float(Radius); + // *data << float(RadiusTarget); // } // if (HasAreaTriggerBox) // { - // packet.ReadVector3("Extents", index); - // packet.ReadVector3("ExtentsTarget", index); + // *data << Vector3(Extents); + // *data << Vector3(ExtentsTarget); // } // if (HasAreaTriggerPolygon) // { - // var VerticesCount = packet.ReadInt32("VerticesCount", index); - // var VerticesTargetCount = packet.ReadInt32("VerticesTargetCount", index); - // packet.ReadSingle("Height", index); - // packet.ReadSingle("HeightTarget", index); + // *data << uint32(Vertices.size()); + // *data << uint32(VerticesTarget.size()); + // *data << float(Height); + // *data << float(HeightTarget); - // for (var i = 0; i < VerticesCount; ++i) - // packet.ReadVector2("Vertices", index, i); + // for (std::size_t i = 0; i < Vertices.size(); ++i) + // *data << Vector2(Vertices[i]); - // for (var i = 0; i < VerticesTargetCount; ++i) - // packet.ReadVector2("VerticesTarget", index, i); + // for (std::size_t i = 0; i < VerticesTarget.size(); ++i) + // *data << Vector2(VerticesTarget[i]); // } // if (HasAreaTriggerCylinder) // { - // packet.ReadSingle("Radius", index); - // packet.ReadSingle("RadiusTarget", index); - // packet.ReadSingle("Height", index); - // packet.ReadSingle("HeightTarget", index); - // packet.ReadSingle("Float4", index); - // packet.ReadSingle("Float5", index); + // *data << float(Radius); + // *data << float(RadiusTarget); + // *data << float(Height); + // *data << float(HeightTarget); + // *data << float(LocationZOffset); + // *data << float(LocationZOffsetTarget); // } // if (HasAreaTriggerSpline) // { - // packet.ReadInt32("TimeToTarget", index); - // packet.ReadInt32("ElapsedTimeForMovement", index); - // var int8 = packet.ReadInt32("VerticesCount", index); + // *data << uint32(TimeToTarget); + // *data << uint32(ElapsedTimeForMovement); + // *data << uint32(Points.size()); - // for (var i = 0; i < int8; ++i) - // packet.ReadVector3("Points", index, i); + // for (std::size_t i = 0; i < Points.size(); ++i) + // *data << Vector3(Points[i]); // } //} //if (GameObject) //{ - // packet.ReadInt32("WorldEffectID", index); - - // packet.ResetBitReader(); + // *data << uint32(WorldEffectID); - // var bit8 = packet.ReadBit("bit8", index); + // data->WriteBit(bit8); // if (bit8) - // packet.ReadInt32("Int1", index); + // *data << uint32(Int1); //} - //if (SceneObjCreate) + //if (SmoothPhasing) //{ - // packet.ResetBitReader(); + // data->WriteBit(ReplaceActive); + // data->WriteBit(HasReplaceObjectt); + // if (HasReplaceObject) + // *data << ObjectGuid(ReplaceObject); + //} - // var CliSceneLocalScriptData = packet.ReadBit("CliSceneLocalScriptData", index); - // var PetBattleFullUpdate = packet.ReadBit("PetBattleFullUpdate", index); + //if (SceneObjCreate) + //{ + // data->WriteBit(HasLocalScriptData); + // data->WriteBit(HasPetBattleFullUpdate); - // if (CliSceneLocalScriptData) + // if (HasLocalScriptData) // { - // packet.ResetBitReader(); - // var DataLength = packet.ReadBits(7); - // packet.ReadWoWString("Data", DataLength, index); + // data->WriteBits(Data.length(), 7); + // data->WriteString(Data); // } - // if (PetBattleFullUpdate) + // if (HasPetBattleFullUpdate) // { - // for (var i = 0; i < 2; ++i) + // for (std::size_t i = 0; i < 2; ++i) // { - // packet.ReadPackedGuid128("CharacterID", index, i); - - // packet.ReadInt32("TrapAbilityID", index, i); - // packet.ReadInt32("TrapStatus", index, i); - - // packet.ReadInt16("RoundTimeSecs", index, i); - - // packet.ReadByte("FrontPet", index, i); - // packet.ReadByte("InputFlags", index, i); - - // packet.ResetBitReader(); - - // var PetBattlePetUpdateCount = packet.ReadBits("PetBattlePetUpdateCount", 2, index, i); - - // for (var j = 0; j < PetBattlePetUpdateCount; ++j) + // *data << ObjectGuid(Players[i].CharacterID); + // *data << int32(Players[i].TrapAbilityID); + // *data << int32(Players[i].TrapStatus); + // *data << uint16(Players[i].RoundTimeSecs); + // *data << int8(Players[i].FrontPet); + // *data << uint8(Players[i].InputFlags); + + // data->WriteBits(Players[i].Pets.size(), 2); + // for (std::size_t j = 0; j < Players[i].Pets.size(); ++j) // { - // packet.ReadPackedGuid128("BattlePetGUID", index, i, j); - - // packet.ReadInt32("SpeciesID", index, i, j); - // packet.ReadInt32("DisplayID", index, i, j); - // packet.ReadInt32("CollarID", index, i, j); - - // packet.ReadInt16("Level", index, i, j); - // packet.ReadInt16("Xp", index, i, j); - - - // packet.ReadInt32("CurHealth", index, i, j); - // packet.ReadInt32("MaxHealth", index, i, j); - // packet.ReadInt32("Power", index, i, j); - // packet.ReadInt32("Speed", index, i, j); - // packet.ReadInt32("NpcTeamMemberID", index, i, j); - - // packet.ReadInt16("BreedQuality", index, i, j); - // packet.ReadInt16("StatusFlags", index, i, j); - - // packet.ReadByte("Slot", index, i, j); - - // var PetBattleActiveAbility = packet.ReadInt32("PetBattleActiveAbility", index, i, j); - // var PetBattleActiveAura = packet.ReadInt32("PetBattleActiveAura", index, i, j); - // var PetBattleActiveState = packet.ReadInt32("PetBattleActiveState", index, i, j); - - // for (var k = 0; k < PetBattleActiveAbility; ++k) + // *data << ObjectGuid(Players[i].Pets[j].BattlePetGUID); + // *data << int32(Players[i].Pets[j].SpeciesID); + // *data << int32(Players[i].Pets[j].DisplayID); + // *data << int32(Players[i].Pets[j].CollarID); + // *data << int16(Players[i].Pets[j].Level); + // *data << int16(Players[i].Pets[j].Xp); + // *data << int32(Players[i].Pets[j].CurHealth); + // *data << int32(Players[i].Pets[j].MaxHealth); + // *data << int32(Players[i].Pets[j].Power); + // *data << int32(Players[i].Pets[j].Speed); + // *data << int32(Players[i].Pets[j].NpcTeamMemberID); + // *data << uint16(Players[i].Pets[j].BreedQuality); + // *data << uint16(Players[i].Pets[j].StatusFlags); + // *data << int8(Players[i].Pets[j].Slot); + + // *data << uint32(Players[i].Pets[j].Abilities.size()); + // *data << uint32(Players[i].Pets[j].Auras.size()); + // *data << uint32(Players[i].Pets[j].States.size()); + // for (std::size_t k = 0; k < Players[i].Pets[j].Abilities.size(); ++k) // { - // packet.ReadInt32("AbilityID", index, i, j, k); - // packet.ReadInt16("CooldownRemaining", index, i, j, k); - // packet.ReadInt16("LockdownRemaining", index, i, j, k); - // packet.ReadByte("AbilityIndex", index, i, j, k); - // packet.ReadByte("Pboid", index, i, j, k); + // *data << int32(Players[i].Pets[j].Abilities[k].AbilityID); + // *data << int16(Players[i].Pets[j].Abilities[k].CooldownRemaining); + // *data << int16(Players[i].Pets[j].Abilities[k].LockdownRemaining); + // *data << int8(Players[i].Pets[j].Abilities[k].AbilityIndex); + // *data << uint8(Players[i].Pets[j].Abilities[k].Pboid); // } - // for (var k = 0; k < PetBattleActiveAura; ++k) + // for (std::size_t k = 0; k < Players[i].Pets[j].Auras.size(); ++k) // { - // packet.ReadInt32("AbilityID", index, i, j, k); - // packet.ReadInt32("InstanceID", index, i, j, k); - // packet.ReadInt32("RoundsRemaining", index, i, j, k); - // packet.ReadInt32("CurrentRound", index, i, j, k); - // packet.ReadByte("CasterPBOID", index, i, j, k); + // *data << int32(Players[i].Pets[j].Auras[k].AbilityID); + // *data << uint32(Players[i].Pets[j].Auras[k].InstanceID); + // *data << int32(Players[i].Pets[j].Auras[k].RoundsRemaining); + // *data << int32(Players[i].Pets[j].Auras[k].CurrentRound); + // *data << uint8(Players[i].Pets[j].Auras[k].CasterPBOID); // } - // for (var k = 0; k < PetBattleActiveState; ++k) + // for (std::size_t k = 0; k < Players[i].Pets[j].States.size(); ++k) // { - // packet.ReadInt32("StateID", index, i, j, k); - // packet.ReadInt32("StateValue", index, i, j, k); + // *data << uint32(Players[i].Pets[j].States[k].StateID); + // *data << int32(Players[i].Pets[j].States[k].StateValue); // } - // packet.ResetBitReader(); - // var bits57 = packet.ReadBits(7); - // packet.ReadWoWString("CustomName", bits57, index, i, j); + // data->WriteBits(Players[i].Pets[j].CustomName.length(), 7); + // data->WriteString(Players[i].Pets[j].CustomName); // } // } - // for (var i = 0; i < 3; ++i) + // for (std::size_t i = 0; i < 3; ++i) // { - // var PetBattleActiveAura = packet.ReadInt32("PetBattleActiveAura", index, i); - // var PetBattleActiveState = packet.ReadInt32("PetBattleActiveState", index, i); - - // for (var j = 0; j < PetBattleActiveAura; ++j) + // *data << uint32(Enviros[j].Auras.size()); + // *data << uint32(Enviros[j].States.size()); + // for (std::size_t j = 0; j < Enviros[j].Auras.size(); ++j) // { - // packet.ReadInt32("AbilityID", index, i, j); - // packet.ReadInt32("InstanceID", index, i, j); - // packet.ReadInt32("RoundsRemaining", index, i, j); - // packet.ReadInt32("CurrentRound", index, i, j); - // packet.ReadByte("CasterPBOID", index, i, j); + // *data << int32(Enviros[j].Auras[j].AbilityID); + // *data << uint32(Enviros[j].Auras[j].InstanceID); + // *data << int32(Enviros[j].Auras[j].RoundsRemaining); + // *data << int32(Enviros[j].Auras[j].CurrentRound); + // *data << uint8(Enviros[j].Auras[j].CasterPBOID); // } - // for (var j = 0; j < PetBattleActiveState; ++j) + // for (std::size_t j = 0; j < Enviros[j].States.size(); ++j) // { - // packet.ReadInt32("StateID", index, i, j); - // packet.ReadInt32("StateValue", index, i, j); + // *data << uint32(Enviros[i].States[j].StateID); + // *data << int32(Enviros[i].States[j].StateValue); // } // } - // packet.ReadInt16("WaitingForFrontPetsMaxSecs", index); - // packet.ReadInt16("PvpMaxRoundTime", index); - - // packet.ReadInt32("CurRound", index); - // packet.ReadInt32("NpcCreatureID", index); - // packet.ReadInt32("NpcDisplayID", index); - - // packet.ReadByte("CurPetBattleState"); - // packet.ReadByte("ForfeitPenalty"); - - // packet.ReadPackedGuid128("InitialWildPetGUID"); - - // packet.ReadBit("IsPVP"); - // packet.ReadBit("CanAwardXP"); + // *data << uint16(WaitingForFrontPetsMaxSecs); + // *data << uint16(PvpMaxRoundTime); + // *data << int32(CurRound); + // *data << uint32(NpcCreatureID); + // *data << uint32(NpcDisplayID); + // *data << int8(CurPetBattleState); + // *data << uint8(ForfeitPenalty); + // *data << ObjectGuid(InitialWildPetGUID); + // data->WriteBit(IsPVP); + // data->WriteBit(CanAwardXP); // } //} - //if (ScenePendingInstances) + //if (PlayerCreateData) //{ - // var SceneInstanceIDs = packet.ReadInt32("SceneInstanceIDsCount"); - - // for (var i = 0; i < SceneInstanceIDs; ++i) - // packet.ReadInt32("SceneInstanceIDs", index, i); + // data->WriteBit(HasSceneInstanceIDs); + // data->WriteBit(HasRuneState); + // if (HasSceneInstanceIDs) + // { + // *data << uint32(SceneInstanceIDs.size()); + // for (std::size_t i = 0; i < SceneInstanceIDs.size(); ++i) + // *data << uint32(SceneInstanceIDs[i]); + // } + // if (HasRuneState) + // { + // *data << uint8(RechargingRuneMask); + // *data << uint8(UsableRuneMask); + // *data << uint32(ToUnit()->GetMaxPower(POWER_RUNES)); + // for (uint32 i = 0; i < ToUnit()->GetMaxPower(POWER_RUNES); ++i) + // *data << uint8(255 - (ToUnit()->ToPlayer()->GetRuneCooldown(i) * 51)); + // } //} - - if (GameObject const* go = ToGameObject()) - for (uint32 i = 0; i < PauseTimesCount; ++i) - *data << uint32(go->GetGOValue()->Transport.StopFrames->at(i)); - - data->FlushBits(); } void Object::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) const @@ -793,9 +807,9 @@ void Object::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player UpdateMask::SetUpdateBit(data->contents() + maskPos, index); std::size_t arrayBlockCount = UpdateMask::GetBlockCount(values.size()); - *data << uint8(UpdateMask::EncodeDynamicFieldChangeType(arrayBlockCount, _dynamicChangesMask[index], updateType)); + *data << uint16(UpdateMask::EncodeDynamicFieldChangeType(arrayBlockCount, _dynamicChangesMask[index], updateType)); if (_dynamicChangesMask[index] == UpdateMask::VALUE_AND_SIZE_CHANGED && updateType == UPDATETYPE_VALUES) - *data << uint16(values.size()); + *data << uint32(values.size()); std::size_t arrayMaskPos = data->wpos(); data->resize(data->size() + arrayBlockCount * sizeof(UpdateMask::BlockType)); @@ -1335,7 +1349,7 @@ std::vector<uint32> const& Object::GetDynamicValues(uint16 index) const return _dynamicValues[index]; } -uint32 Object::GetDynamicValue(uint16 index, uint8 offset) const +uint32 Object::GetDynamicValue(uint16 index, uint16 offset) const { ASSERT(index < _dynamicValuesCount || PrintIndexError(index, false)); if (offset >= _dynamicValues[index].size()) @@ -1349,10 +1363,23 @@ void Object::AddDynamicValue(uint16 index, uint32 value) SetDynamicValue(index, _dynamicValues[index].size(), value); } -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<uint32>& values = _dynamicValues[index]; + for (std::size_t i = 0; i < values.size(); ++i) + { + if (values[i] == value) + { + values[i] = 0; + _dynamicChangesMask[index] = UpdateMask::VALUE_CHANGED; + _dynamicChangesArrayMask[index][i] = 1; + + AddToObjectUpdateIfNeeded(); + } + } } void Object::ClearDynamicValue(uint16 index) @@ -1369,7 +1396,7 @@ void Object::ClearDynamicValue(uint16 index) } } -void Object::SetDynamicValue(uint16 index, uint8 offset, uint32 value) +void Object::SetDynamicValue(uint16 index, uint16 offset, 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 36c5b8c5937..b4cc81dd735 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -96,10 +96,10 @@ namespace UpdateMask { typedef uint32 BlockType; - enum DynamicFieldChangeType : uint8 + enum DynamicFieldChangeType : uint16 { - VALUE_CHANGED = 0x7F, - VALUE_AND_SIZE_CHANGED = 0x80 + VALUE_CHANGED = 0x7FFF, + VALUE_AND_SIZE_CHANGED = 0x8000 }; inline std::size_t GetBlockCount(std::size_t bitCount) @@ -122,6 +122,33 @@ namespace UpdateMask } } +// Helper class used to iterate object dynamic fields while interpreting them as a structure instead of raw int array +template<class T> +class DynamicFieldStructuredView +{ +public: + explicit DynamicFieldStructuredView(std::vector<uint32> const& data) : _data(data) { } + + T const* begin() const + { + return reinterpret_cast<T const*>(_data.data()); + } + + T const* end() const + { + return reinterpret_cast<T const*>(_data.data() + _data.size()); + } + + std::size_t size() const + { + using BlockCount = std::integral_constant<uint16, sizeof(T) / sizeof(uint32)>; + return _data.size() / BlockCount::value; + } + +private: + std::vector<uint32> const& _data; +}; + class TC_GAME_API Object { public: @@ -198,11 +225,45 @@ class TC_GAME_API Object void ApplyModFlag64(uint16 index, uint64 flag, bool apply); std::vector<uint32> const& GetDynamicValues(uint16 index) const; - uint32 GetDynamicValue(uint16 index, uint8 offset) const; + uint32 GetDynamicValue(uint16 index, uint16 offset) const; void AddDynamicValue(uint16 index, uint32 value); void RemoveDynamicValue(uint16 index, uint32 value); void ClearDynamicValue(uint16 index); - void SetDynamicValue(uint16 index, uint8 offset, uint32 value); + void SetDynamicValue(uint16 index, uint16 offset, uint32 value); + + template<class T> + DynamicFieldStructuredView<T> GetDynamicStructuredValues(uint16 index) const + { + static_assert(std::is_pod<T>::value, "T used for Object::SetDynamicStructuredValue<T> is not a POD type"); + using BlockCount = std::integral_constant<uint16, sizeof(T) / sizeof(uint32)>; + ASSERT(index < _dynamicValuesCount || PrintIndexError(index, false)); + std::vector<uint32> const& values = _dynamicValues[index]; + ASSERT((values.size() % BlockCount::value) == 0, "Dynamic field value count must exactly fit into structure"); + return DynamicFieldStructuredView<T>(values); + } + + template<class T> + T const* GetDynamicStructuredValue(uint16 index, uint16 offset) const + { + static_assert(std::is_pod<T>::value, "T used for Object::SetDynamicStructuredValue<T> is not a POD type"); + using BlockCount = std::integral_constant<uint16, sizeof(T) / sizeof(uint32)>; + ASSERT(index < _dynamicValuesCount || PrintIndexError(index, false)); + std::vector<uint32> 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<T const*>(&values[offset * BlockCount::value]); + } + + template<class T> + void SetDynamicStructuredValue(uint16 index, uint16 offset, T const* value) + { + static_assert(std::is_pod<T>::value, "T used for Object::SetDynamicStructuredValue<T> is not a POD type"); + using BlockCount = std::integral_constant<uint16, sizeof(T) / sizeof(uint32)>; + 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<uint32 const*>(value) + i)); + } void ClearUpdateMask(bool remove); diff --git a/src/server/game/Entities/Object/ObjectGuid.cpp b/src/server/game/Entities/Object/ObjectGuid.cpp index 55151f576dd..830307e931b 100644 --- a/src/server/game/Entities/Object/ObjectGuid.cpp +++ b/src/server/game/Entities/Object/ObjectGuid.cpp @@ -82,6 +82,7 @@ namespace SET_GUID_NAME(BattlePet); SET_GUID_NAME(CommerceObj); SET_GUID_NAME(ClientSession); + SET_GUID_NAME(Cast); #undef SET_GUID_NAME } @@ -221,3 +222,4 @@ GUID_TRAIT_INSTANTIATE_GUID(HighGuid::CallForHelp) GUID_TRAIT_INSTANTIATE_GUID(HighGuid::AIResource) GUID_TRAIT_INSTANTIATE_GUID(HighGuid::AILock) GUID_TRAIT_INSTANTIATE_GUID(HighGuid::AILockTicket) +GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Cast) diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h index 86593a7c211..aa7b4a4a23e 100644 --- a/src/server/game/Entities/Object/ObjectGuid.h +++ b/src/server/game/Entities/Object/ObjectGuid.h @@ -106,6 +106,7 @@ enum class HighGuid BattlePet = 44, CommerceObj = 45, ClientSession = 46, + Cast = 47, Count, }; @@ -179,6 +180,7 @@ GUID_TRAIT_MAP_SPECIFIC(HighGuid::CallForHelp) GUID_TRAIT_MAP_SPECIFIC(HighGuid::AIResource) GUID_TRAIT_MAP_SPECIFIC(HighGuid::AILock) GUID_TRAIT_MAP_SPECIFIC(HighGuid::AILockTicket) +GUID_TRAIT_MAP_SPECIFIC(HighGuid::Cast) // Special case // Global transports are loaded from `transports` table, RealmSpecific part is used for them. @@ -219,6 +221,9 @@ class TC_GAME_API ObjectGuid template<HighGuid type> static typename std::enable_if<ObjectGuidTraits<type>::MapSpecific && type != HighGuid::Transport, ObjectGuid>::type Create(uint16 mapId, uint32 entry, LowType counter) { return MapSpecific(type, 0, mapId, 0, entry, counter); } + template<HighGuid type> + static typename std::enable_if<ObjectGuidTraits<type>::MapSpecific, ObjectGuid>::type Create(uint8 subType, uint16 mapId, uint32 entry, LowType counter) { return MapSpecific(type, subType, mapId, 0, entry, counter); } + ObjectGuid() : _low(0), _high(0) { } std::vector<uint8> GetRawValue() const; @@ -271,6 +276,7 @@ class TC_GAME_API ObjectGuid bool IsGuild() const { return GetHigh() == HighGuid::Guild; } bool IsSceneObject() const { return GetHigh() == HighGuid::SceneObject; } bool IsConversation() const { return GetHigh() == HighGuid::Conversation; } + bool IsCast() const { return GetHigh() == HighGuid::Cast; } static TypeID GetTypeId(HighGuid high) { diff --git a/src/server/game/Entities/Object/Updates/UpdateData.cpp b/src/server/game/Entities/Object/Updates/UpdateData.cpp index 2d5ffc85c50..0d9c4cd94af 100644 --- a/src/server/game/Entities/Object/Updates/UpdateData.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateData.cpp @@ -50,7 +50,7 @@ bool UpdateData::BuildPacket(WorldPacket* packet) if (packet->WriteBit(!m_outOfRangeGUIDs.empty())) { - *packet << uint16(0); + *packet << uint16(0); // object limit to instantly destroy - objects before this index on m_outOfRangeGUIDs list get "smoothly phased out" *packet << uint32(m_outOfRangeGUIDs.size()); for (GuidSet::const_iterator i = m_outOfRangeGUIDs.begin(); i != m_outOfRangeGUIDs.end(); ++i) diff --git a/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp index b2696c1f915..57d7964c9c3 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp @@ -101,6 +101,8 @@ uint32 ItemUpdateFieldFlags[CONTAINER_END] = UF_FLAG_PUBLIC, // ITEM_FIELD_CREATE_PLAYED_TIME UF_FLAG_OWNER, // ITEM_FIELD_MODIFIERS_MASK UF_FLAG_PUBLIC, // ITEM_FIELD_CONTEXT + UF_FLAG_OWNER, // ITEM_FIELD_ARTIFACT_XP + UF_FLAG_OWNER, // ITEM_FIELD_APPEARANCE_MOD_ID UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1 UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+1 UF_FLAG_PUBLIC, // CONTAINER_FIELD_SLOT_1+2 @@ -252,6 +254,8 @@ uint32 ItemDynamicUpdateFieldFlags[CONTAINER_DYNAMIC_END] = { UF_FLAG_OWNER, // ITEM_DYNAMIC_FIELD_MODIFIERS UF_FLAG_OWNER | UF_FLAG_0x100, // ITEM_DYNAMIC_FIELD_BONUSLIST_IDS + UF_FLAG_OWNER, // ITEM_DYNAMIC_FIELD_ARTIFACT_POWERS + UF_FLAG_OWNER, // ITEM_DYNAMIC_FIELD_GEMS }; uint32 UnitUpdateFieldFlags[PLAYER_END] = @@ -317,6 +321,7 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PUBLIC, // UNIT_FIELD_DISPLAY_POWER UF_FLAG_PUBLIC, // UNIT_FIELD_OVERRIDE_DISPLAY_POWER_ID UF_FLAG_PUBLIC, // UNIT_FIELD_HEALTH + UF_FLAG_PUBLIC, // UNIT_FIELD_HEALTH+1 UF_FLAG_PUBLIC | UF_FLAG_URGENT_SELF_ONLY, // UNIT_FIELD_POWER UF_FLAG_PUBLIC | UF_FLAG_URGENT_SELF_ONLY, // UNIT_FIELD_POWER+1 UF_FLAG_PUBLIC | UF_FLAG_URGENT_SELF_ONLY, // UNIT_FIELD_POWER+2 @@ -324,6 +329,7 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PUBLIC | UF_FLAG_URGENT_SELF_ONLY, // UNIT_FIELD_POWER+4 UF_FLAG_PUBLIC | UF_FLAG_URGENT_SELF_ONLY, // UNIT_FIELD_POWER+5 UF_FLAG_PUBLIC, // UNIT_FIELD_MAXHEALTH + UF_FLAG_PUBLIC, // UNIT_FIELD_MAXHEALTH+1 UF_FLAG_PUBLIC, // UNIT_FIELD_MAXPOWER UF_FLAG_PUBLIC, // UNIT_FIELD_MAXPOWER+1 UF_FLAG_PUBLIC, // UNIT_FIELD_MAXPOWER+2 @@ -344,6 +350,9 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PRIVATE | UF_FLAG_OWNER | UF_FLAG_UNIT_ALL, // UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER+5 UF_FLAG_PUBLIC, // UNIT_FIELD_LEVEL UF_FLAG_PUBLIC, // UNIT_FIELD_EFFECTIVE_LEVEL + UF_FLAG_PUBLIC, // UNIT_FIELD_SCALING_LEVEL_MIN + UF_FLAG_PUBLIC, // UNIT_FIELD_SCALING_LEVEL_MAX + UF_FLAG_PUBLIC, // UNIT_FIELD_SCALING_LEVEL_DELTA UF_FLAG_PUBLIC, // UNIT_FIELD_FACTIONTEMPLATE UF_FLAG_PUBLIC, // UNIT_VIRTUAL_ITEM_SLOT_ID UF_FLAG_PUBLIC, // UNIT_VIRTUAL_ITEM_SLOT_ID+1 @@ -351,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 @@ -377,6 +386,7 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PUBLIC, // UNIT_FIELD_MOD_HASTE UF_FLAG_PUBLIC, // UNIT_FIELD_MOD_RANGED_HASTE UF_FLAG_PUBLIC, // UNIT_FIELD_MOD_HASTE_REGEN + UF_FLAG_PUBLIC, // UNIT_FIELD_MOD_TIME_RATE UF_FLAG_PUBLIC, // UNIT_CREATED_BY_SPELL UF_FLAG_PUBLIC | UF_FLAG_DYNAMIC, // UNIT_NPC_FLAGS UF_FLAG_PUBLIC | UF_FLAG_DYNAMIC, // UNIT_NPC_FLAGS+1 @@ -385,17 +395,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 @@ -429,6 +436,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 @@ -488,6 +496,7 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PUBLIC, // PLAYER_BYTES UF_FLAG_PUBLIC, // PLAYER_BYTES_2 UF_FLAG_PUBLIC, // PLAYER_BYTES_3 + UF_FLAG_PUBLIC, // PLAYER_BYTES_4 UF_FLAG_PUBLIC, // PLAYER_DUEL_TEAM UF_FLAG_PUBLIC, // PLAYER_GUILD_TIMESTAMP UF_FLAG_PARTY_MEMBER, // PLAYER_QUEST_LOG @@ -1240,6 +1249,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 @@ -1288,6 +1347,8 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PUBLIC, // PLAYER_FIELD_AVG_ITEM_LEVEL+2 UF_FLAG_PUBLIC, // PLAYER_FIELD_AVG_ITEM_LEVEL+3 UF_FLAG_PUBLIC, // PLAYER_FIELD_CURRENT_BATTLE_PET_BREED_QUALITY + UF_FLAG_PUBLIC, // PLAYER_FIELD_PRESTIGE + UF_FLAG_PUBLIC, // PLAYER_FIELD_HONOR_LEVEL UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+1 UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+2 @@ -2024,10 +2085,26 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+733 UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+734 UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+735 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+736 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+737 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+738 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+739 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+740 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+741 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+742 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+743 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+744 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+745 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+746 + UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+747 UF_FLAG_PRIVATE, // PLAYER_FARSIGHT 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 @@ -2507,24 +2584,13 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PRIVATE, // PLAYER_RANGED_CRIT_PERCENTAGE UF_FLAG_PRIVATE, // PLAYER_OFFHAND_CRIT_PERCENTAGE UF_FLAG_PRIVATE, // PLAYER_SPELL_CRIT_PERCENTAGE1 - UF_FLAG_PRIVATE, // PLAYER_SPELL_CRIT_PERCENTAGE1+1 - UF_FLAG_PRIVATE, // PLAYER_SPELL_CRIT_PERCENTAGE1+2 - UF_FLAG_PRIVATE, // PLAYER_SPELL_CRIT_PERCENTAGE1+3 - UF_FLAG_PRIVATE, // PLAYER_SPELL_CRIT_PERCENTAGE1+4 - UF_FLAG_PRIVATE, // PLAYER_SPELL_CRIT_PERCENTAGE1+5 - UF_FLAG_PRIVATE, // PLAYER_SPELL_CRIT_PERCENTAGE1+6 UF_FLAG_PRIVATE, // PLAYER_SHIELD_BLOCK UF_FLAG_PRIVATE, // PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE UF_FLAG_PRIVATE, // PLAYER_MASTERY - UF_FLAG_PRIVATE, // PLAYER_AMPLIFY - UF_FLAG_PRIVATE, // PLAYER_MULTISTRIKE - UF_FLAG_PRIVATE, // PLAYER_MULTISTRIKE_EFFECT - UF_FLAG_PRIVATE, // PLAYER_READINESS UF_FLAG_PRIVATE, // PLAYER_SPEED UF_FLAG_PRIVATE, // PLAYER_LIFESTEAL UF_FLAG_PRIVATE, // PLAYER_AVOIDANCE UF_FLAG_PRIVATE, // PLAYER_STURDINESS - UF_FLAG_PRIVATE, // PLAYER_CLEAVE UF_FLAG_PRIVATE, // PLAYER_VERSATILITY UF_FLAG_PRIVATE, // PLAYER_VERSATILITY_BONUS UF_FLAG_PRIVATE, // PLAYER_FIELD_PVP_POWER_DAMAGE @@ -2785,7 +2851,10 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+253 UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+254 UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+255 - UF_FLAG_PRIVATE, // PLAYER_REST_STATE_EXPERIENCE + UF_FLAG_PRIVATE, // PLAYER_FIELD_REST_INFO + UF_FLAG_PRIVATE, // PLAYER_FIELD_REST_INFO+1 + UF_FLAG_PRIVATE, // PLAYER_FIELD_REST_INFO+2 + UF_FLAG_PRIVATE, // PLAYER_FIELD_REST_INFO+3 UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_POS UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_POS+1 UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_POS+2 @@ -2923,27 +2992,12 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+34 UF_FLAG_PRIVATE, // PLAYER_FIELD_ARENA_TEAM_INFO_1_1+35 UF_FLAG_PRIVATE, // PLAYER_FIELD_MAX_LEVEL - UF_FLAG_PRIVATE, // PLAYER_RUNE_REGEN_1 - UF_FLAG_PRIVATE, // PLAYER_RUNE_REGEN_1+1 - UF_FLAG_PRIVATE, // PLAYER_RUNE_REGEN_1+2 - UF_FLAG_PRIVATE, // PLAYER_RUNE_REGEN_1+3 + 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 UF_FLAG_PRIVATE, // PLAYER_NO_REAGENT_COST_1+3 - UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPH_SLOTS_1 - UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPH_SLOTS_1+1 - UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPH_SLOTS_1+2 - UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPH_SLOTS_1+3 - UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPH_SLOTS_1+4 - UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPH_SLOTS_1+5 - UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPHS_1 - UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPHS_1+1 - UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPHS_1+2 - UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPHS_1+3 - UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPHS_1+4 - UF_FLAG_PRIVATE, // PLAYER_FIELD_GLYPHS_1+5 - UF_FLAG_PRIVATE, // PLAYER_GLYPHS_ENABLED UF_FLAG_PRIVATE, // PLAYER_PET_SPELL_POWER UF_FLAG_PRIVATE, // PLAYER_FIELD_RESEARCHING_1 UF_FLAG_PRIVATE, // PLAYER_FIELD_RESEARCHING_1+1 @@ -2961,15 +3015,10 @@ 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 UF_FLAG_PRIVATE | UF_FLAG_URGENT_SELF_ONLY, // PLAYER_FIELD_OVERRIDE_ZONE_PVP_TYPE - UF_FLAG_PRIVATE, // PLAYER_FIELD_ITEM_LEVEL_DELTA UF_FLAG_PRIVATE, // PLAYER_FIELD_BAG_SLOT_FLAGS UF_FLAG_PRIVATE, // PLAYER_FIELD_BAG_SLOT_FLAGS+1 UF_FLAG_PRIVATE, // PLAYER_FIELD_BAG_SLOT_FLAGS+2 @@ -3857,6 +3906,8 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+872 UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+873 UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+874 + UF_FLAG_PRIVATE, // PLAYER_FIELD_HONOR + UF_FLAG_PRIVATE, // PLAYER_FIELD_HONOR_NEXT_LEVEL }; uint32 UnitDynamicUpdateFieldFlags[PLAYER_DYNAMIC_END] = @@ -3870,6 +3921,9 @@ uint32 UnitDynamicUpdateFieldFlags[PLAYER_DYNAMIC_END] = UF_FLAG_PRIVATE, // PLAYER_DYNAMIC_FIELD_HEIRLOOMS UF_FLAG_PRIVATE, // PLAYER_DYNAMIC_FIELD_HEIRLOOM_FLAGS 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] = @@ -3985,6 +4039,7 @@ uint32 CorpseUpdateFieldFlags[CORPSE_END] = UF_FLAG_PUBLIC, // CORPSE_FIELD_FLAGS UF_FLAG_DYNAMIC, // CORPSE_FIELD_DYNAMIC_FLAGS UF_FLAG_PUBLIC, // CORPSE_FIELD_FACTIONTEMPLATE + UF_FLAG_PUBLIC, // CORPSE_FIELD_CUSTOM_DISPLAY_OPTION }; uint32 AreaTriggerUpdateFieldFlags[AREATRIGGER_END] = @@ -4008,16 +4063,25 @@ uint32 AreaTriggerUpdateFieldFlags[AREATRIGGER_END] = UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_OVERRIDE_SCALE_CURVE+4 UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_OVERRIDE_SCALE_CURVE+5 UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_OVERRIDE_SCALE_CURVE+6 + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_EXTRA_SCALE_CURVE + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_EXTRA_SCALE_CURVE+1 + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_EXTRA_SCALE_CURVE+2 + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_EXTRA_SCALE_CURVE+3 + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_EXTRA_SCALE_CURVE+4 + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_EXTRA_SCALE_CURVE+5 + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_EXTRA_SCALE_CURVE+6 UF_FLAG_PUBLIC, // AREATRIGGER_CASTER UF_FLAG_PUBLIC, // AREATRIGGER_CASTER+1 UF_FLAG_PUBLIC, // AREATRIGGER_CASTER+2 UF_FLAG_PUBLIC, // AREATRIGGER_CASTER+3 UF_FLAG_PUBLIC, // AREATRIGGER_DURATION + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_TIME_TO_TARGET UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_TIME_TO_TARGET_SCALE + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_TIME_TO_TARGET_EXTRA_SCALE UF_FLAG_PUBLIC, // AREATRIGGER_SPELLID UF_FLAG_DYNAMIC, // AREATRIGGER_SPELLVISUALID UF_FLAG_DYNAMIC | UF_FLAG_URGENT, // AREATRIGGER_BOUNDS_RADIUS_2D - UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_EXPLICIT_SCALE + UF_FLAG_PUBLIC, // AREATRIGGER_DECAL_PROPERTIES_ID }; uint32 SceneObjectUpdateFieldFlags[SCENEOBJECT_END] = @@ -4057,7 +4121,7 @@ uint32 ConversationUpdateFieldFlags[CONVERSATION_END] = UF_FLAG_DYNAMIC, // OBJECT_FIELD_ENTRY UF_FLAG_DYNAMIC | UF_FLAG_URGENT, // OBJECT_DYNAMIC_FLAGS UF_FLAG_PUBLIC, // OBJECT_FIELD_SCALE_X - UF_FLAG_PRIVATE, // CONVERSATION_FIELD_DUMMY + UF_FLAG_DYNAMIC, // CONVERSATION_FIELD_LAST_LINE_DURATION }; uint32 ConversationDynamicUpdateFieldFlags[CONVERSATION_DYNAMIC_END] = diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 4f9b91837ac..5b906584df1 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 6, 2, 3, 20726 +// Auto generated for version 7, 0, 3, 22210 enum ObjectFields { @@ -55,14 +55,18 @@ enum ItemFields ITEM_FIELD_CREATE_PLAYED_TIME = OBJECT_END + 0x043, // Size: 1, Flags: PUBLIC ITEM_FIELD_MODIFIERS_MASK = OBJECT_END + 0x044, // Size: 1, Flags: OWNER ITEM_FIELD_CONTEXT = OBJECT_END + 0x045, // Size: 1, Flags: PUBLIC - ITEM_END = OBJECT_END + 0x046, + ITEM_FIELD_ARTIFACT_XP = OBJECT_END + 0x046, // Size: 1, Flags: OWNER + ITEM_FIELD_APPEARANCE_MOD_ID = OBJECT_END + 0x047, // Size: 1, Flags: OWNER + ITEM_END = OBJECT_END + 0x048, }; enum ItemDynamicFields { ITEM_DYNAMIC_FIELD_MODIFIERS = OBJECT_DYNAMIC_END + 0x000, // Flags: OWNER ITEM_DYNAMIC_FIELD_BONUSLIST_IDS = OBJECT_DYNAMIC_END + 0x001, // Flags: OWNER, 0x100 - ITEM_DYNAMIC_END = OBJECT_DYNAMIC_END + 0x002, + ITEM_DYNAMIC_FIELD_ARTIFACT_POWERS = OBJECT_DYNAMIC_END + 0x002, // Flags: OWNER + ITEM_DYNAMIC_FIELD_GEMS = OBJECT_DYNAMIC_END + 0x003, // Flags: OWNER + ITEM_DYNAMIC_END = OBJECT_DYNAMIC_END + 0x004, }; enum ContainerFields @@ -96,84 +100,89 @@ enum UnitFields UNIT_FIELD_BYTES_0 = OBJECT_END + 0x02D, // Size: 1, Flags: PUBLIC UNIT_FIELD_DISPLAY_POWER = OBJECT_END + 0x02E, // Size: 1, Flags: PUBLIC UNIT_FIELD_OVERRIDE_DISPLAY_POWER_ID = OBJECT_END + 0x02F, // Size: 1, Flags: PUBLIC - UNIT_FIELD_HEALTH = OBJECT_END + 0x030, // Size: 1, Flags: PUBLIC - UNIT_FIELD_POWER = OBJECT_END + 0x031, // Size: 6, Flags: PUBLIC, URGENT_SELF_ONLY - UNIT_FIELD_MAXHEALTH = OBJECT_END + 0x037, // Size: 1, Flags: PUBLIC - UNIT_FIELD_MAXPOWER = OBJECT_END + 0x038, // Size: 6, Flags: PUBLIC - UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER = OBJECT_END + 0x03E, // Size: 6, Flags: PRIVATE, OWNER, UNIT_ALL - UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER = OBJECT_END + 0x044, // Size: 6, Flags: PRIVATE, OWNER, UNIT_ALL - UNIT_FIELD_LEVEL = OBJECT_END + 0x04A, // Size: 1, Flags: PUBLIC - UNIT_FIELD_EFFECTIVE_LEVEL = OBJECT_END + 0x04B, // Size: 1, Flags: PUBLIC - UNIT_FIELD_FACTIONTEMPLATE = OBJECT_END + 0x04C, // Size: 1, Flags: PUBLIC - UNIT_VIRTUAL_ITEM_SLOT_ID = OBJECT_END + 0x04D, // Size: 6, Flags: PUBLIC - UNIT_FIELD_FLAGS = OBJECT_END + 0x053, // Size: 1, Flags: PUBLIC - UNIT_FIELD_FLAGS_2 = OBJECT_END + 0x054, // Size: 1, Flags: PUBLIC - UNIT_FIELD_FLAGS_3 = OBJECT_END + 0x055, // Size: 1, Flags: PUBLIC - UNIT_FIELD_AURASTATE = OBJECT_END + 0x056, // Size: 1, Flags: PUBLIC - UNIT_FIELD_BASEATTACKTIME = OBJECT_END + 0x057, // Size: 2, Flags: PUBLIC - UNIT_FIELD_RANGEDATTACKTIME = OBJECT_END + 0x059, // Size: 1, Flags: PRIVATE - UNIT_FIELD_BOUNDINGRADIUS = OBJECT_END + 0x05A, // Size: 1, Flags: PUBLIC - UNIT_FIELD_COMBATREACH = OBJECT_END + 0x05B, // Size: 1, Flags: PUBLIC - UNIT_FIELD_DISPLAYID = OBJECT_END + 0x05C, // Size: 1, Flags: DYNAMIC, URGENT - UNIT_FIELD_NATIVEDISPLAYID = OBJECT_END + 0x05D, // Size: 1, Flags: PUBLIC, URGENT - UNIT_FIELD_MOUNTDISPLAYID = OBJECT_END + 0x05E, // Size: 1, Flags: PUBLIC, URGENT - UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x05F, // Size: 1, Flags: PRIVATE, OWNER, SPECIAL_INFO - UNIT_FIELD_MAXDAMAGE = OBJECT_END + 0x060, // Size: 1, Flags: PRIVATE, OWNER, SPECIAL_INFO - UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x061, // Size: 1, Flags: PRIVATE, OWNER, SPECIAL_INFO - UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x062, // Size: 1, Flags: PRIVATE, OWNER, SPECIAL_INFO - UNIT_FIELD_BYTES_1 = OBJECT_END + 0x063, // Size: 1, Flags: PUBLIC - UNIT_FIELD_PETNUMBER = OBJECT_END + 0x064, // Size: 1, Flags: PUBLIC - UNIT_FIELD_PET_NAME_TIMESTAMP = OBJECT_END + 0x065, // Size: 1, Flags: PUBLIC - UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x066, // Size: 1, Flags: OWNER - UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x067, // Size: 1, Flags: OWNER - UNIT_MOD_CAST_SPEED = OBJECT_END + 0x068, // Size: 1, Flags: PUBLIC - UNIT_MOD_CAST_HASTE = OBJECT_END + 0x069, // Size: 1, Flags: PUBLIC - UNIT_FIELD_MOD_HASTE = OBJECT_END + 0x06A, // Size: 1, Flags: PUBLIC - UNIT_FIELD_MOD_RANGED_HASTE = OBJECT_END + 0x06B, // Size: 1, Flags: PUBLIC - UNIT_FIELD_MOD_HASTE_REGEN = OBJECT_END + 0x06C, // Size: 1, Flags: PUBLIC - UNIT_CREATED_BY_SPELL = OBJECT_END + 0x06D, // Size: 1, Flags: PUBLIC - UNIT_NPC_FLAGS = OBJECT_END + 0x06E, // Size: 2, Flags: PUBLIC, DYNAMIC - UNIT_NPC_EMOTESTATE = OBJECT_END + 0x070, // Size: 1, Flags: PUBLIC - UNIT_FIELD_STAT = OBJECT_END + 0x071, // Size: 5, Flags: PRIVATE, OWNER - UNIT_FIELD_POSSTAT = OBJECT_END + 0x076, // Size: 5, Flags: PRIVATE, OWNER - UNIT_FIELD_NEGSTAT = OBJECT_END + 0x07B, // Size: 5, Flags: PRIVATE, OWNER - UNIT_FIELD_RESISTANCES = OBJECT_END + 0x080, // Size: 7, Flags: PRIVATE, OWNER, SPECIAL_INFO - UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x087, // Size: 7, Flags: PRIVATE, OWNER - UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x08E, // Size: 7, Flags: PRIVATE, OWNER - UNIT_FIELD_MOD_BONUS_ARMOR = OBJECT_END + 0x095, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_BASE_MANA = OBJECT_END + 0x096, // Size: 1, Flags: PUBLIC - UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x097, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_BYTES_2 = OBJECT_END + 0x098, // Size: 1, Flags: PUBLIC - UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x099, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_ATTACK_POWER_MOD_POS = OBJECT_END + 0x09A, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_ATTACK_POWER_MOD_NEG = OBJECT_END + 0x09B, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x09C, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x09D, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_RANGED_ATTACK_POWER_MOD_POS = OBJECT_END + 0x09E, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_RANGED_ATTACK_POWER_MOD_NEG = OBJECT_END + 0x09F, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x0A0, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x0A1, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x0A2, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x0A3, // Size: 7, Flags: PRIVATE, OWNER - UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x0AA, // Size: 7, Flags: PRIVATE, OWNER - UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x0B1, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_HOVERHEIGHT = OBJECT_END + 0x0B2, // Size: 1, Flags: PUBLIC - UNIT_FIELD_MIN_ITEM_LEVEL_CUTOFF = OBJECT_END + 0x0B3, // Size: 1, Flags: PUBLIC - UNIT_FIELD_MIN_ITEM_LEVEL = OBJECT_END + 0x0B4, // Size: 1, Flags: PUBLIC - UNIT_FIELD_MAXITEMLEVEL = OBJECT_END + 0x0B5, // Size: 1, Flags: PUBLIC - UNIT_FIELD_WILD_BATTLEPET_LEVEL = OBJECT_END + 0x0B6, // Size: 1, Flags: PUBLIC - UNIT_FIELD_BATTLEPET_COMPANION_NAME_TIMESTAMP = OBJECT_END + 0x0B7, // Size: 1, Flags: PUBLIC - UNIT_FIELD_INTERACT_SPELLID = OBJECT_END + 0x0B8, // Size: 1, Flags: PUBLIC - UNIT_FIELD_STATE_SPELL_VISUAL_ID = OBJECT_END + 0x0B9, // Size: 1, Flags: DYNAMIC, URGENT - UNIT_FIELD_STATE_ANIM_ID = OBJECT_END + 0x0BA, // Size: 1, Flags: DYNAMIC, URGENT - UNIT_FIELD_STATE_ANIM_KIT_ID = OBJECT_END + 0x0BB, // Size: 1, Flags: DYNAMIC, URGENT - UNIT_FIELD_STATE_WORLD_EFFECT_ID = OBJECT_END + 0x0BC, // Size: 4, Flags: DYNAMIC, URGENT - UNIT_FIELD_SCALE_DURATION = OBJECT_END + 0x0C0, // Size: 1, Flags: PUBLIC - UNIT_FIELD_LOOKS_LIKE_MOUNT_ID = OBJECT_END + 0x0C1, // Size: 1, Flags: PUBLIC - UNIT_FIELD_LOOKS_LIKE_CREATURE_ID = OBJECT_END + 0x0C2, // Size: 1, Flags: PUBLIC - UNIT_FIELD_LOOK_AT_CONTROLLER_ID = OBJECT_END + 0x0C3, // Size: 1, Flags: PUBLIC - UNIT_FIELD_LOOK_AT_CONTROLLER_TARGET = OBJECT_END + 0x0C4, // Size: 4, Flags: PUBLIC - UNIT_END = OBJECT_END + 0x0C8, + UNIT_FIELD_HEALTH = OBJECT_END + 0x030, // Size: 2, Flags: PUBLIC + UNIT_FIELD_POWER = OBJECT_END + 0x032, // Size: 6, Flags: PUBLIC, URGENT_SELF_ONLY + UNIT_FIELD_MAXHEALTH = OBJECT_END + 0x038, // Size: 2, Flags: PUBLIC + UNIT_FIELD_MAXPOWER = OBJECT_END + 0x03A, // Size: 6, Flags: PUBLIC + UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER = OBJECT_END + 0x040, // Size: 6, Flags: PRIVATE, OWNER, UNIT_ALL + UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER = OBJECT_END + 0x046, // Size: 6, Flags: PRIVATE, OWNER, UNIT_ALL + UNIT_FIELD_LEVEL = OBJECT_END + 0x04C, // Size: 1, Flags: PUBLIC + UNIT_FIELD_EFFECTIVE_LEVEL = OBJECT_END + 0x04D, // Size: 1, Flags: PUBLIC + UNIT_FIELD_SCALING_LEVEL_MIN = OBJECT_END + 0x04E, // Size: 1, Flags: PUBLIC + UNIT_FIELD_SCALING_LEVEL_MAX = OBJECT_END + 0x04F, // Size: 1, Flags: PUBLIC + 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, 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 + UNIT_FIELD_BOUNDINGRADIUS = OBJECT_END + 0x05F, // Size: 1, Flags: PUBLIC + UNIT_FIELD_COMBATREACH = OBJECT_END + 0x060, // Size: 1, Flags: PUBLIC + UNIT_FIELD_DISPLAYID = OBJECT_END + 0x061, // Size: 1, Flags: DYNAMIC, URGENT + UNIT_FIELD_NATIVEDISPLAYID = OBJECT_END + 0x062, // Size: 1, Flags: PUBLIC, URGENT + UNIT_FIELD_MOUNTDISPLAYID = OBJECT_END + 0x063, // Size: 1, Flags: PUBLIC, URGENT + UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x064, // Size: 1, Flags: PRIVATE, OWNER, SPECIAL_INFO + UNIT_FIELD_MAXDAMAGE = OBJECT_END + 0x065, // Size: 1, Flags: PRIVATE, OWNER, SPECIAL_INFO + UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x066, // Size: 1, Flags: PRIVATE, OWNER, SPECIAL_INFO + UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x067, // Size: 1, Flags: PRIVATE, OWNER, SPECIAL_INFO + UNIT_FIELD_BYTES_1 = OBJECT_END + 0x068, // Size: 1, Flags: PUBLIC + UNIT_FIELD_PETNUMBER = OBJECT_END + 0x069, // Size: 1, Flags: PUBLIC + UNIT_FIELD_PET_NAME_TIMESTAMP = OBJECT_END + 0x06A, // Size: 1, Flags: PUBLIC + UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x06B, // Size: 1, Flags: OWNER + UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x06C, // Size: 1, Flags: OWNER + UNIT_MOD_CAST_SPEED = OBJECT_END + 0x06D, // Size: 1, Flags: PUBLIC + UNIT_MOD_CAST_HASTE = OBJECT_END + 0x06E, // Size: 1, Flags: PUBLIC + UNIT_FIELD_MOD_HASTE = OBJECT_END + 0x06F, // Size: 1, Flags: PUBLIC + UNIT_FIELD_MOD_RANGED_HASTE = OBJECT_END + 0x070, // Size: 1, Flags: PUBLIC + UNIT_FIELD_MOD_HASTE_REGEN = OBJECT_END + 0x071, // Size: 1, Flags: PUBLIC + UNIT_FIELD_MOD_TIME_RATE = OBJECT_END + 0x072, // Size: 1, Flags: PUBLIC + UNIT_CREATED_BY_SPELL = OBJECT_END + 0x073, // Size: 1, Flags: PUBLIC + UNIT_NPC_FLAGS = OBJECT_END + 0x074, // Size: 2, Flags: PUBLIC, DYNAMIC + UNIT_NPC_EMOTESTATE = OBJECT_END + 0x076, // Size: 1, Flags: PUBLIC + UNIT_FIELD_STAT = OBJECT_END + 0x077, // Size: 4, Flags: PRIVATE, OWNER + UNIT_FIELD_POSSTAT = OBJECT_END + 0x07B, // Size: 4, Flags: PRIVATE, OWNER + UNIT_FIELD_NEGSTAT = OBJECT_END + 0x07F, // Size: 4, Flags: PRIVATE, OWNER + UNIT_FIELD_RESISTANCES = OBJECT_END + 0x083, // Size: 7, Flags: PRIVATE, OWNER, SPECIAL_INFO + UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x08A, // Size: 7, Flags: PRIVATE, OWNER + UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x091, // Size: 7, Flags: PRIVATE, OWNER + UNIT_FIELD_MOD_BONUS_ARMOR = OBJECT_END + 0x098, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_BASE_MANA = OBJECT_END + 0x099, // Size: 1, Flags: PUBLIC + UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x09A, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_BYTES_2 = OBJECT_END + 0x09B, // Size: 1, Flags: PUBLIC + UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x09C, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_ATTACK_POWER_MOD_POS = OBJECT_END + 0x09D, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_ATTACK_POWER_MOD_NEG = OBJECT_END + 0x09E, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x09F, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x0A0, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_RANGED_ATTACK_POWER_MOD_POS = OBJECT_END + 0x0A1, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_RANGED_ATTACK_POWER_MOD_NEG = OBJECT_END + 0x0A2, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x0A3, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_ATTACK_SPEED_AURA = 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, }; enum UnitDynamicFields @@ -196,108 +205,105 @@ enum PlayerFields PLAYER_BYTES = UNIT_END + 0x011, // Size: 1, Flags: PUBLIC PLAYER_BYTES_2 = UNIT_END + 0x012, // Size: 1, Flags: PUBLIC PLAYER_BYTES_3 = UNIT_END + 0x013, // Size: 1, Flags: PUBLIC - PLAYER_DUEL_TEAM = UNIT_END + 0x014, // Size: 1, Flags: PUBLIC - PLAYER_GUILD_TIMESTAMP = UNIT_END + 0x015, // Size: 1, Flags: PUBLIC - PLAYER_QUEST_LOG = UNIT_END + 0x016, // Size: 750, Flags: PARTY_MEMBER - PLAYER_VISIBLE_ITEM = UNIT_END + 0x304, // Size: 38, Flags: PUBLIC - PLAYER_CHOSEN_TITLE = UNIT_END + 0x32A, // Size: 1, Flags: PUBLIC - PLAYER_FAKE_INEBRIATION = UNIT_END + 0x32B, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_VIRTUAL_PLAYER_REALM = UNIT_END + 0x32C, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_CURRENT_SPEC_ID = UNIT_END + 0x32D, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_TAXI_MOUNT_ANIM_KIT_ID = UNIT_END + 0x32E, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_AVG_ITEM_LEVEL = UNIT_END + 0x32F, // Size: 4, Flags: PUBLIC - PLAYER_FIELD_CURRENT_BATTLE_PET_BREED_QUALITY = UNIT_END + 0x333, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x334, // Size: 736, Flags: PRIVATE - PLAYER_FIELD_END_NOT_SELF = UNIT_END + 0x334, - PLAYER_FARSIGHT = UNIT_END + 0x614, // Size: 4, Flags: PRIVATE - PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x618, // Size: 12, Flags: PRIVATE - PLAYER_FIELD_COINAGE = UNIT_END + 0x624, // Size: 2, Flags: PRIVATE - PLAYER_XP = UNIT_END + 0x626, // Size: 1, Flags: PRIVATE - PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x627, // Size: 1, Flags: PRIVATE - PLAYER_SKILL_LINEID = UNIT_END + 0x628, // Size: 448, Flags: PRIVATE - PLAYER_CHARACTER_POINTS = UNIT_END + 0x7E8, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MAX_TALENT_TIERS = UNIT_END + 0x7E9, // Size: 1, Flags: PRIVATE - PLAYER_TRACK_CREATURES = UNIT_END + 0x7EA, // Size: 1, Flags: PRIVATE - PLAYER_TRACK_RESOURCES = UNIT_END + 0x7EB, // Size: 1, Flags: PRIVATE - PLAYER_EXPERTISE = UNIT_END + 0x7EC, // Size: 1, Flags: PRIVATE - PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x7ED, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_RANGED_EXPERTISE = UNIT_END + 0x7EE, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_COMBAT_RATING_EXPERTISE = UNIT_END + 0x7EF, // Size: 1, Flags: PRIVATE - PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x7F0, // Size: 1, Flags: PRIVATE - PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x7F1, // Size: 1, Flags: PRIVATE - PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x7F2, // Size: 1, Flags: PRIVATE - PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x7F3, // Size: 1, Flags: PRIVATE - PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x7F4, // Size: 1, Flags: PRIVATE - PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x7F5, // Size: 1, Flags: PRIVATE - PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x7F6, // Size: 7, Flags: PRIVATE - PLAYER_SHIELD_BLOCK = UNIT_END + 0x7FD, // Size: 1, Flags: PRIVATE - PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x7FE, // Size: 1, Flags: PRIVATE - PLAYER_MASTERY = UNIT_END + 0x7FF, // Size: 1, Flags: PRIVATE - PLAYER_AMPLIFY = UNIT_END + 0x800, // Size: 1, Flags: PRIVATE - PLAYER_MULTISTRIKE = UNIT_END + 0x801, // Size: 1, Flags: PRIVATE - PLAYER_MULTISTRIKE_EFFECT = UNIT_END + 0x802, // Size: 1, Flags: PRIVATE - PLAYER_READINESS = UNIT_END + 0x803, // Size: 1, Flags: PRIVATE - PLAYER_SPEED = UNIT_END + 0x804, // Size: 1, Flags: PRIVATE - PLAYER_LIFESTEAL = UNIT_END + 0x805, // Size: 1, Flags: PRIVATE - PLAYER_AVOIDANCE = UNIT_END + 0x806, // Size: 1, Flags: PRIVATE - PLAYER_STURDINESS = UNIT_END + 0x807, // Size: 1, Flags: PRIVATE - PLAYER_CLEAVE = UNIT_END + 0x808, // Size: 1, Flags: PRIVATE - PLAYER_VERSATILITY = UNIT_END + 0x809, // Size: 1, Flags: PRIVATE - PLAYER_VERSATILITY_BONUS = UNIT_END + 0x80A, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_PVP_POWER_DAMAGE = UNIT_END + 0x80B, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_PVP_POWER_HEALING = UNIT_END + 0x80C, // Size: 1, Flags: PRIVATE - PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x80D, // Size: 256, Flags: PRIVATE - PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x90D, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x90E, // Size: 7, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x915, // Size: 7, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x91C, // Size: 7, Flags: PRIVATE - PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x923, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_HEALING_PCT = UNIT_END + 0x924, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_HEALING_DONE_PCT = UNIT_END + 0x925, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_PERIODIC_HEALING_DONE_PERCENT = UNIT_END + 0x926, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_WEAPON_DMG_MULTIPLIERS = UNIT_END + 0x927, // Size: 3, Flags: PRIVATE - PLAYER_FIELD_WEAPON_ATK_SPEED_MULTIPLIERS = UNIT_END + 0x92A, // Size: 3, Flags: PRIVATE - PLAYER_FIELD_MOD_SPELL_POWER_PCT = UNIT_END + 0x92D, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_RESILIENCE_PERCENT = UNIT_END + 0x92E, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_OVERRIDE_SPELL_POWER_BY_AP_PCT = UNIT_END + 0x92F, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_OVERRIDE_AP_BY_SPELL_POWER_PERCENT = UNIT_END + 0x930, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x931, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x932, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_LOCAL_FLAGS = UNIT_END + 0x933, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_BYTES = UNIT_END + 0x934, // Size: 1, Flags: PRIVATE - PLAYER_SELF_RES_SPELL = UNIT_END + 0x935, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x936, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x937, // Size: 12, Flags: PRIVATE - PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x943, // Size: 12, Flags: PRIVATE - PLAYER_FIELD_KILLS = UNIT_END + 0x94F, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_LIFETIME_HONORABLE_KILLS = UNIT_END + 0x950, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x951, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x952, // Size: 32, Flags: PRIVATE - PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x972, // Size: 36, Flags: PRIVATE - PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x996, // Size: 1, Flags: PRIVATE - PLAYER_RUNE_REGEN_1 = UNIT_END + 0x997, // Size: 4, Flags: PRIVATE - PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x99B, // Size: 4, Flags: PRIVATE - PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x99F, // Size: 6, Flags: PRIVATE - PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x9A5, // Size: 6, Flags: PRIVATE - PLAYER_GLYPHS_ENABLED = UNIT_END + 0x9AB, // Size: 1, Flags: PRIVATE - PLAYER_PET_SPELL_POWER = UNIT_END + 0x9AC, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_RESEARCHING_1 = UNIT_END + 0x9AD, // Size: 10, Flags: PRIVATE - PLAYER_PROFESSION_SKILL_LINE_1 = UNIT_END + 0x9B7, // Size: 2, Flags: PRIVATE - PLAYER_FIELD_UI_HIT_MODIFIER = UNIT_END + 0x9B9, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_UI_SPELL_HIT_MODIFIER = UNIT_END + 0x9BA, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_HOME_REALM_TIME_OFFSET = UNIT_END + 0x9BB, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_PET_HASTE = UNIT_END + 0x9BC, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_SUMMONED_BATTLE_PET_ID = UNIT_END + 0x9BD, // Size: 4, Flags: PRIVATE - PLAYER_FIELD_BYTES2 = UNIT_END + 0x9C1, // Size: 1, Flags: PRIVATE, URGENT_SELF_ONLY - PLAYER_FIELD_LFG_BONUS_FACTION_ID = UNIT_END + 0x9C2, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_LOOT_SPEC_ID = UNIT_END + 0x9C3, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_OVERRIDE_ZONE_PVP_TYPE = UNIT_END + 0x9C4, // Size: 1, Flags: PRIVATE, URGENT_SELF_ONLY - PLAYER_FIELD_ITEM_LEVEL_DELTA = UNIT_END + 0x9C5, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_BAG_SLOT_FLAGS = UNIT_END + 0x9C6, // Size: 4, Flags: PRIVATE - PLAYER_FIELD_BANK_BAG_SLOT_FLAGS = UNIT_END + 0x9CA, // Size: 7, Flags: PRIVATE - PLAYER_FIELD_INSERT_ITEMS_LEFT_TO_RIGHT = UNIT_END + 0x9D1, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_QUEST_COMPLETED = UNIT_END + 0x9D2, // Size: 875, Flags: PRIVATE - PLAYER_END = UNIT_END + 0xD3D, + 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: 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 @@ -309,7 +315,10 @@ enum PlayerDynamicFields PLAYER_DYNAMIC_FIELD_HEIRLOOMS = UNIT_DYNAMIC_END + 0x004, // Flags: PRIVATE PLAYER_DYNAMIC_FIELD_HEIRLOOM_FLAGS = UNIT_DYNAMIC_END + 0x005, // Flags: PRIVATE PLAYER_DYNAMIC_FIELD_TOYS = UNIT_DYNAMIC_END + 0x006, // Flags: PRIVATE - PLAYER_DYNAMIC_END = UNIT_DYNAMIC_END + 0x007, + PLAYER_DYNAMIC_FIELD_TRANSMOG = UNIT_DYNAMIC_END + 0x007, // Flags: PRIVATE + PLAYER_DYNAMIC_FIELD_CONDITIONAL_TRANSMOG = UNIT_DYNAMIC_END + 0x008, // Flags: PRIVATE + PLAYER_DYNAMIC_FIELD_CHARACTER_RESTRICTIONS = UNIT_DYNAMIC_END + 0x009, // Flags: PRIVATE + PLAYER_DYNAMIC_END = UNIT_DYNAMIC_END + 0x00A, }; enum GameObjectFields @@ -361,7 +370,8 @@ enum CorpseFields CORPSE_FIELD_FLAGS = OBJECT_END + 0x01E, // Size: 1, Flags: PUBLIC CORPSE_FIELD_DYNAMIC_FLAGS = OBJECT_END + 0x01F, // Size: 1, Flags: DYNAMIC CORPSE_FIELD_FACTIONTEMPLATE = OBJECT_END + 0x020, // Size: 1, Flags: PUBLIC - CORPSE_END = OBJECT_END + 0x021, + CORPSE_FIELD_CUSTOM_DISPLAY_OPTION = OBJECT_END + 0x021, // Size: 1, Flags: PUBLIC + CORPSE_END = OBJECT_END + 0x022, }; enum CorpseDynamicFields @@ -372,14 +382,17 @@ enum CorpseDynamicFields enum AreaTriggerFields { AREATRIGGER_OVERRIDE_SCALE_CURVE = OBJECT_END + 0x000, // Size: 7, Flags: PUBLIC, URGENT - AREATRIGGER_CASTER = OBJECT_END + 0x007, // Size: 4, Flags: PUBLIC - AREATRIGGER_DURATION = OBJECT_END + 0x00B, // Size: 1, Flags: PUBLIC - AREATRIGGER_TIME_TO_TARGET_SCALE = OBJECT_END + 0x00C, // Size: 1, Flags: PUBLIC, URGENT - AREATRIGGER_SPELLID = OBJECT_END + 0x00D, // Size: 1, Flags: PUBLIC - AREATRIGGER_SPELLVISUALID = OBJECT_END + 0x00E, // Size: 1, Flags: DYNAMIC - AREATRIGGER_BOUNDS_RADIUS_2D = OBJECT_END + 0x00F, // Size: 1, Flags: DYNAMIC, URGENT - AREATRIGGER_EXPLICIT_SCALE = OBJECT_END + 0x010, // Size: 1, Flags: PUBLIC, URGENT - AREATRIGGER_END = OBJECT_END + 0x011, + AREATRIGGER_EXTRA_SCALE_CURVE = OBJECT_END + 0x007, // Size: 7, Flags: PUBLIC, URGENT + AREATRIGGER_CASTER = OBJECT_END + 0x00E, // Size: 4, Flags: PUBLIC + AREATRIGGER_DURATION = OBJECT_END + 0x012, // Size: 1, Flags: PUBLIC + AREATRIGGER_TIME_TO_TARGET = OBJECT_END + 0x013, // Size: 1, Flags: PUBLIC, URGENT + AREATRIGGER_TIME_TO_TARGET_SCALE = OBJECT_END + 0x014, // Size: 1, Flags: PUBLIC, URGENT + AREATRIGGER_TIME_TO_TARGET_EXTRA_SCALE = OBJECT_END + 0x015, // Size: 1, Flags: PUBLIC, URGENT + AREATRIGGER_SPELLID = OBJECT_END + 0x016, // Size: 1, Flags: PUBLIC + 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, }; enum AreaTriggerDynamicFields @@ -403,7 +416,7 @@ enum SceneObjectDynamicFields enum ConversationFields { - CONVERSATION_FIELD_DUMMY = OBJECT_END + 0x000, // Size: 1, Flags: PRIVATE + CONVERSATION_FIELD_LAST_LINE_DURATION = OBJECT_END + 0x000, // Size: 1, Flags: DYNAMIC CONVERSATION_END = OBJECT_END + 0x001, }; diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 4678d3d0455..06036f5cbf7 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -331,7 +331,7 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c uint16 specId = fields[16].GetUInt16(); if (ChrSpecializationEntry const* petSpec = sChrSpecializationStore.LookupEntry(specId)) - specId = sChrSpecializationByIndexStore[owner->HasAuraType(SPELL_AURA_OVERRIDE_PET_SPECS) ? PET_SPEC_OVERRIDE_CLASS_INDEX : 0][petSpec->OrderIndex]->ID; + specId = sDB2Manager.GetChrSpecializationByIndex(owner->HasAuraType(SPELL_AURA_OVERRIDE_PET_SPECS) ? PET_SPEC_OVERRIDE_CLASS_INDEX : 0, petSpec->OrderIndex)->ID; SetSpecialization(specId); @@ -747,7 +747,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())); @@ -760,7 +760,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()); @@ -878,7 +878,6 @@ bool Guardian::InitStatsForLevel(uint8 petlevel) SetCreateStat(STAT_AGILITY, 22); SetCreateStat(STAT_STAMINA, 25); SetCreateStat(STAT_INTELLECT, 28); - SetCreateStat(STAT_SPIRIT, 27); } SetBonusDamage(0); @@ -1234,7 +1233,8 @@ void Pet::_LoadAuras(uint32 timediff) remainCharges = 0; AuraLoadEffectInfo& info = effectInfo[key]; - if (Aura* aura = Aura::TryCreate(spellInfo, key.EffectMask, this, NULL, info.BaseAmounts.data(), NULL, casterGuid)) + ObjectGuid castId = ObjectGuid::Create<HighGuid::Cast>(SPELL_CAST_SOURCE_NORMAL, GetMapId(), spellInfo->Id, GetMap()->GenerateLowGuid<HighGuid::Cast>()); + if (Aura* aura = Aura::TryCreate(spellInfo, castId, key.EffectMask, this, NULL, info.BaseAmounts.data(), NULL, casterGuid)) { if (!aura->CanBeSaved()) { @@ -1678,7 +1678,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 @@ -1817,7 +1817,7 @@ void Pet::RemoveSpecializationSpells(bool clearActionBar) for (uint32 i = 0; i < MAX_SPECIALIZATIONS; ++i) { - if (ChrSpecializationEntry const* specialization = sChrSpecializationByIndexStore[0][i]) + if (ChrSpecializationEntry const* specialization = sDB2Manager.GetChrSpecializationByIndex(0, i)) { if (std::vector<SpecializationSpellsEntry const*> const* specSpells = sDB2Manager.GetSpecializationSpells(specialization->ID)) { @@ -1829,7 +1829,7 @@ void Pet::RemoveSpecializationSpells(bool clearActionBar) } } - if (ChrSpecializationEntry const* specialization = sChrSpecializationByIndexStore[PET_SPEC_OVERRIDE_CLASS_INDEX][i]) + if (ChrSpecializationEntry const* specialization = sDB2Manager.GetChrSpecializationByIndex(PET_SPEC_OVERRIDE_CLASS_INDEX, i)) { if (std::vector<SpecializationSpellsEntry const*> const* specSpells = sDB2Manager.GetSpecializationSpells(specialization->ID)) { diff --git a/src/server/game/Entities/Player/CollectionMgr.cpp b/src/server/game/Entities/Player/CollectionMgr.cpp index 2def446ccfb..45d893f8c95 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<std::output_iterator_tag, void, void, void, void> +{ + explicit DynamicBitsetBlockOutputIterator(std::function<void(uint32)>&& action) : _action(std::forward<std::function<void(uint32)>>(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<void(uint32)> _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<uint32> 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, uint32 appearanceModId /*= 0*/) +{ + ItemModifiedAppearanceEntry const* itemModifiedAppearance = sDB2Manager.GetItemModifiedAppearance(itemId, appearanceModId); + 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<ObjectGuid>& 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<bool, bool> 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<ObjectGuid> 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..6547bea5b71 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 <boost/dynamic_bitset.hpp> enum HeirloomPlayerFlags { @@ -48,7 +49,7 @@ typedef std::map<uint32, HeirloomData> 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, uint32 appearanceModId = 0); + void RemoveTemporaryAppearance(Item* item); + // returns pair<hasAppearance, isTemporary> + std::pair<bool, bool> HasItemAppearance(uint32 itemModifiedAppearanceId) const; + std::unordered_set<ObjectGuid> 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<uint32> _appearances; + std::unordered_map<uint32, std::unordered_set<ObjectGuid>> _temporaryAppearances; + std::unordered_map<uint32, FavoriteAppearanceState> _favoriteAppearances; }; #endif // CollectionMgr_h__ diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 83577b00283..8c804f0d94e 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -89,6 +89,7 @@ #include "SpellMgr.h" #include "SpellPackets.h" #include "TalentPackets.h" +#include "TransmogrificationPackets.h" #include "ToyPackets.h" #include "Transport.h" #include "UpdateData.h" @@ -101,7 +102,6 @@ #include "WorldPacket.h" #include "WorldSession.h" #include "WorldStatePackets.h" -#include "DBCStructure.h" #define ZONE_UPDATE_INTERVAL (1*IN_MILLISECONDS) @@ -420,7 +420,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()); @@ -463,9 +463,11 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac SetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_STYLE_ID, createInfo->HairStyle); SetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_COLOR_ID, createInfo->HairColor); SetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_FACIAL_STYLE, createInfo->FacialHairStyle); - SetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_REST_STATE, (GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0) ? REST_STATE_RAF_LINKED : REST_STATE_NOT_RAF_LINKED); + for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) + SetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_CUSTOM_DISPLAY_OPTION + i, createInfo->CustomDisplay[i]); + SetUInt32Value(PLAYER_FIELD_REST_INFO + REST_STATE_XP, (GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0) ? REST_STATE_RAF_LINKED : REST_STATE_NOT_RAF_LINKED); SetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_GENDER, createInfo->Sex); - SetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_ARENA_FACTION, 0); + SetByteValue(PLAYER_BYTES_4, PLAYER_BYTES_4_OFFSET_ARENA_FACTION, 0); SetGuidValue(OBJECT_FIELD_DATA, ObjectGuid::Empty); SetUInt32Value(PLAYER_GUILDRANK, 0); @@ -559,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 @@ -665,6 +666,12 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac } // all item positions resolved + if (ChrSpecializationEntry const* defaultSpec = sChrSpecializationStore.LookupEntry(cEntry->DefaultSpec)) + { + SetActiveTalentGroup(defaultSpec->OrderIndex); + SetPrimarySpecialization(defaultSpec->ID); + } + return true; } @@ -1805,20 +1812,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 +2063,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; @@ -2401,12 +2409,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) @@ -2443,12 +2451,11 @@ 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(); InitTaxiNodesForLevel(); - InitGlyphsForLevel(); UpdateAllStats(); @@ -2512,16 +2519,10 @@ 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) - for (TalentEntry const* talent : sTalentByPos[getClass()][t][c]) + for (TalentEntry const* talent : sDB2Manager.GetTalentsByPosition(getClass(), t, c)) RemoveTalent(talent); } @@ -2536,8 +2537,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); @@ -2556,6 +2557,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); @@ -2567,7 +2569,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); @@ -2621,8 +2623,7 @@ void Player::InitStatsForLevel(bool reapplyMods) SetFloatValue(PLAYER_RANGED_CRIT_PERCENTAGE, 0.0f); // Init spell schools (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset - for (uint8 i = 0; i < 7; ++i) - SetFloatValue(PLAYER_SPELL_CRIT_PERCENTAGE1+i, 0.0f); + SetFloatValue(PLAYER_SPELL_CRIT_PERCENTAGE1, 0.0f); SetFloatValue(PLAYER_PARRY_PERCENTAGE, 0.0f); SetFloatValue(PLAYER_BLOCK_PERCENTAGE, 0.0f); @@ -2662,7 +2663,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); @@ -3143,12 +3144,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->AcquireMethod == 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->AcquireMethod == 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); } } @@ -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()))) + 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; @@ -3583,6 +3584,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); @@ -3609,6 +3626,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); + } } } @@ -3969,6 +4002,14 @@ 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_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); @@ -4009,16 +4050,16 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TRANSMOG_OUTFITS); stmt->setUInt64(0, guid); - stmt->setUInt64(1, guid); trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER); stmt->setUInt64(0, guid); + stmt->setUInt64(1, guid); trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GLYPHS); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER); stmt->setUInt64(0, guid); trans->Append(stmt); @@ -4218,7 +4259,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 @@ -4351,7 +4392,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); @@ -4723,11 +4764,11 @@ 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_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) @@ -4740,7 +4781,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; @@ -4827,111 +4868,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 - }; - - uint8 level = getLevel(); - uint32 pclass = getClass(); - - 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; + //// 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(); + + //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; - /// @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; } @@ -4951,24 +5032,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) { m_baseRatingValue[combatRating] += (apply ? value : -value); @@ -5000,7 +5063,7 @@ void Player::UpdateRating(CombatRating cr) switch (cr) { - case CR_UNUSED_1: + case CR_AMPLIFY: case CR_DEFENSE_SKILL: break; case CR_DODGE: @@ -5039,7 +5102,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; @@ -5075,8 +5138,8 @@ void Player::UpdateRating(CombatRating cr) 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) @@ -5092,8 +5155,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; @@ -5214,7 +5277,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); @@ -5334,7 +5396,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; @@ -5371,7 +5433,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; @@ -6088,7 +6150,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(); } @@ -6137,7 +6199,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]; @@ -6306,6 +6368,7 @@ bool Player::RewardHonor(Unit* victim, uint32 groupsize, int32 honor, bool pvpto // victim_rank [0, 20+] HK: <> WorldPackets::Combat::PvPCredit data; data.Honor = honor; + data.OriginalHonor = honor; data.Target = victim_guid; data.Rank = victim_rank; @@ -6909,9 +6972,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); } @@ -7187,10 +7250,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); @@ -7238,7 +7301,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); @@ -7273,7 +7336,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); @@ -7726,7 +7789,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; } @@ -7758,7 +7821,7 @@ void Player::CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 } } -void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 castCount, int32* misc) +void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, ObjectGuid castCount, int32* misc) { ItemTemplate const* proto = item->GetTemplate(); // special learning case @@ -7778,8 +7841,13 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 } Spell* spell = new Spell(this, spellInfo, TRIGGERED_NONE); + + WorldPackets::Spells::SpellPrepare spellPrepare; + spellPrepare.ClientCastID = castCount; + spellPrepare.ServerCastID = spell->m_castId; + SendDirectMessage(spellPrepare.Write()); + spell->m_CastItem = item; - spell->m_cast_count = castCount; //set count of casts spell->SetSpellValue(SPELLVALUE_BASE_POINT0, learning_spell_id); spell->prepare(&targets); return; @@ -7803,8 +7871,13 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 } Spell* spell = new Spell(this, spellInfo, TRIGGERED_NONE); + + WorldPackets::Spells::SpellPrepare spellPrepare; + spellPrepare.ClientCastID = castCount; + spellPrepare.ServerCastID = spell->m_castId; + SendDirectMessage(spellPrepare.Write()); + spell->m_CastItem = item; - spell->m_cast_count = castCount; // set count of casts spell->m_misc.Raw.Data[0] = misc[0]; spell->m_misc.Raw.Data[1] = misc[1]; spell->prepare(&targets); @@ -7826,13 +7899,18 @@ 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; } Spell* spell = new Spell(this, spellInfo, TRIGGERED_NONE); + + WorldPackets::Spells::SpellPrepare spellPrepare; + spellPrepare.ClientCastID = castCount; + spellPrepare.ServerCastID = spell->m_castId; + SendDirectMessage(spellPrepare.Write()); + spell->m_CastItem = item; - spell->m_cast_count = castCount; // set count of casts spell->m_misc.Raw.Data[0] = misc[0]; spell->m_misc.Raw.Data[1] = misc[1]; spell->prepare(&targets); @@ -9287,6 +9365,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) @@ -9339,6 +9435,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; } @@ -9367,6 +9485,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; } @@ -9377,7 +9509,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; @@ -9408,7 +9550,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); @@ -9485,6 +9627,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) @@ -9503,6 +9660,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; } @@ -9537,6 +9698,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 @@ -9648,6 +9814,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; } @@ -9798,7 +9986,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; } @@ -9811,12 +9999,26 @@ 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; } } } + 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; } @@ -9830,8 +10032,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) @@ -9897,8 +10108,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) @@ -10081,6 +10298,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) { @@ -10128,6 +10381,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) { @@ -10176,6 +10470,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) { @@ -10256,6 +10586,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) @@ -10653,6 +11024,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 @@ -10932,9 +11343,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; } } @@ -10948,6 +11356,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; @@ -10975,6 +11386,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) @@ -10996,17 +11410,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; @@ -11023,10 +11428,10 @@ 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) + 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) { @@ -11062,7 +11467,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<int32> const& bonusListIDs /*= std::vector<int32>()*/) +Item* Player::StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool update, int32 randomPropertyId /*= 0*/, GuidSet const& allowedLooters /*= GuidSet()*/, std::vector<int32> const& bonusListIDs /*= std::vector<int32>()*/, bool addToCollection /*= true*/) { uint32 count = 0; for (ItemPosCountVec::const_iterator itr = pos.begin(); itr != pos.end(); ++itr) @@ -11075,9 +11480,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); @@ -11107,6 +11509,23 @@ Item* Player::StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool updat stmt->setString(1, ss.str()); CharacterDatabase.Execute(stmt); } + + 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; } @@ -11132,6 +11551,9 @@ Item* Player::StoreItem(ItemPosCountVec const& dest, Item* pItem, bool update) lastItem = _StoreItem(pos, pItem, count, true, update); } + + AutoUnequipChildItem(pItem); + return lastItem; } @@ -11365,6 +11787,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) @@ -11390,9 +11911,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 { @@ -11408,7 +11929,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()); @@ -11509,6 +12033,8 @@ void Player::RemoveItem(uint8 bag, uint8 slot, bool update) pItem->SetSlot(NULL_SLOT); if (IsInWorld() && update) pItem->SendUpdateToPlayer(this); + + AutoUnequipChildItem(pItem); } } @@ -11519,8 +12045,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(); @@ -11818,6 +12345,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) @@ -11894,6 +12478,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; } @@ -11926,6 +12515,11 @@ std::vector<Item*> 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; } @@ -12084,6 +12678,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()); @@ -12122,7 +12743,6 @@ void Player::SwapItem(uint16 src, uint16 dst) } // DST checks - if (pDstItem) { // check unequip potability for equipped items and bank bags @@ -12206,6 +12826,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) { @@ -12220,6 +12843,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(); } } @@ -12277,6 +12903,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); @@ -12360,7 +12989,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)) @@ -12800,20 +13433,24 @@ 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 (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()) @@ -12884,15 +13521,15 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool uint8 minLevel = pEnchant->Flags & 0x20 ? 1 : 60; uint8 scalingLevel = getLevel(); - uint8 maxLevel = uint8(pEnchant->MaxLevel ? pEnchant->MaxLevel : sGtSpellScalingStore.GetTableRowCount()); + uint8 maxLevel = uint8(pEnchant->MaxLevel ? pEnchant->MaxLevel : sSpellScalingGameTable.GetTableRowCount() - 1); if (minLevel > getLevel()) scalingLevel = minLevel; else if (maxLevel < getLevel()) scalingLevel = maxLevel; - if (GtSpellScalingEntry const* spellScaling = sGtSpellScalingStore.EvaluateTable(scalingLevel - 1, MAX_CLASSES - 1 - scalingClass)) - enchant_amount = uint32(pEnchant->EffectScalingPoints[s] * spellScaling->value); + if (GtSpellScalingEntry const* spellScaling = sSpellScalingGameTable.GetRow(scalingLevel)) + enchant_amount = uint32(pEnchant->EffectScalingPoints[s] * GetSpellScalingColumnForClass(spellScaling, scalingClass)); } if (!enchant_amount) @@ -12923,15 +13560,15 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool uint8 minLevel = pEnchant->Flags & 0x20 ? 1 : 60; uint8 scalingLevel = getLevel(); - uint8 maxLevel = uint8(pEnchant->MaxLevel ? pEnchant->MaxLevel : sGtSpellScalingStore.GetTableRowCount()); + uint8 maxLevel = uint8(pEnchant->MaxLevel ? pEnchant->MaxLevel : sSpellScalingGameTable.GetTableRowCount() - 1); if (minLevel > getLevel()) scalingLevel = minLevel; else if (maxLevel < getLevel()) scalingLevel = maxLevel; - if (GtSpellScalingEntry const* spellScaling = sGtSpellScalingStore.EvaluateTable(scalingLevel - 1, (MAX_CLASSES - 1 /*ChrClasses->MaxIndex*/) - scalingClass - 1)) - enchant_amount = uint32(pEnchant->EffectScalingPoints[s] * spellScaling->value); + if (GtSpellScalingEntry const* spellScaling = sSpellScalingGameTable.GetRow(scalingLevel)) + enchant_amount = uint32(pEnchant->EffectScalingPoints[s] * GetSpellScalingColumnForClass(spellScaling, scalingClass)); } if (!enchant_amount) @@ -12976,11 +13613,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); @@ -13078,7 +13715,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: @@ -13167,7 +13804,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) { @@ -13340,8 +13977,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)) @@ -13545,16 +14181,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(); @@ -14446,22 +15072,28 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpell()); if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_CREATE_ITEM) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_APPLY_AURA)) { - if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID())) - creature->CastSpell(this, quest->GetRewSpell(), true); + if (Unit* unit = questGiver->ToUnit()) + unit->CastSpell(this, quest->GetRewSpell(), true); } else CastSpell(this, quest->GetRewSpell(), true); } - else if (quest->GetRewDisplaySpell() > 0) + else { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewDisplaySpell()); - if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_CREATE_ITEM)) + for (uint32 i = 0; i < QUEST_REWARD_DISPLAY_SPELL_COUNT; ++i) { - if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID())) - creature->CastSpell(this, quest->GetRewDisplaySpell(), true); + if (quest->RewardDisplaySpell[i] > 0) + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->RewardDisplaySpell[i]); + if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(DIFFICULTY_NONE, SPELL_EFFECT_CREATE_ITEM)) + { + if (Unit* unit = questGiver->ToUnit()) + unit->CastSpell(this, quest->RewardDisplaySpell[i], true); + } + else + CastSpell(this, quest->RewardDisplaySpell[i], true); + } } - else - CastSpell(this, quest->GetRewDisplaySpell(), true); } if (quest->GetZoneOrSort() > 0) @@ -15637,7 +16269,7 @@ void Player::KilledPlayerCredit() if (curKillCount < uint32(obj.Amount)) { SetQuestObjectiveData(qInfo, obj.StorageIndex, curKillCount + addKillCount); - SendQuestUpdateAddPlayer(qInfo, curKillCount + addKillCount, obj.Amount); + SendQuestUpdateAddPlayer(qInfo, curKillCount + addKillCount); } if (CanCompleteQuest(questid)) @@ -16045,7 +16677,6 @@ void Player::SendQuestReward(Quest const* quest, uint32 XP) const packet.XPReward = xp; packet.SkillLineIDReward = quest->GetRewardSkillId(); packet.NumSkillUpsReward = quest->GetRewardSkillPoints(); - packet.TalentReward = quest->GetBonusTalents(); // @todo fix these 3 packet.UseQuestReward = true; @@ -16131,13 +16762,12 @@ void Player::SendQuestUpdateAddCredit(Quest const* quest, ObjectGuid guid, Quest GetSession()->SendPacket(packet.Write()); } -void Player::SendQuestUpdateAddPlayer(Quest const* quest, uint16 newCount, uint32 required) const +void Player::SendQuestUpdateAddPlayer(Quest const* quest, uint16 newCount) const { - WorldPacket data(SMSG_QUEST_UPDATE_ADD_PVP_CREDIT, (3*4)); - data << uint32(quest->GetQuestId()); - data << uint32(newCount); - data << uint32(required); - GetSession()->SendPacket(&data); + WorldPackets::Quest::QuestUpdateAddPvPCredit questUpdateAddPvpCredit; + questUpdateAddPvpCredit.QuestID = quest->GetQuestId(); + questUpdateAddPvpCredit.Count = newCount; + GetSession()->SendPacket(questUpdateAddPvpCredit.Write()); } bool Player::HasPvPForcingQuest() const @@ -16218,7 +16848,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; @@ -16228,6 +16858,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(); @@ -16238,14 +16869,55 @@ void Player::_LoadEquipmentSets(PreparedQueryResult result) if (ObjectGuid::LowType guid = fields[5 + i].GetUInt64()) eqSet.Data.Pieces[i] = ObjectGuid::Create<HighGuid::Item>(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) @@ -16341,18 +17013,18 @@ bool Player::IsLoading() const bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) { - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 - //"SELECT guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, bankSlots, restState, playerFlags, " - // 17 18 19 20 21 22 23 24 25 26 27 28 29 + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + //"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, " - // 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 - //"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, " - // 45 46 47 48 49 50 + // 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, " - // 51 52 53 54 55 56 57 58 59 60 61 62 63 - //"health, power1, power2, power3, power4, power5, power6, instance_id, speccount, activespec, lootSpecId, exploredZones, equipmentCache, " - // 64 65 66 67 68 - //"knownTitles, actionBars, grantableLevels, raidDifficulty, legacyRaidDifficulty FROM characters WHERE guid = '%u'", guid); + // 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); if (!result) { @@ -16420,8 +17092,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) SetUInt32Value(UNIT_FIELD_LEVEL, fields[6].GetUInt8()); SetUInt32Value(PLAYER_XP, fields[7].GetUInt32()); - _LoadIntoDataField(fields[62].GetString(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE); - _LoadIntoDataField(fields[64].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); @@ -16439,12 +17111,13 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) SetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_STYLE_ID, fields[11].GetUInt8()); SetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_COLOR_ID, fields[12].GetUInt8()); SetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_FACIAL_STYLE, fields[13].GetUInt8()); - SetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_BANK_BAG_SLOTS, fields[14].GetUInt8()); - SetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_REST_STATE, fields[15].GetUInt8()); + for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) + SetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_CUSTOM_DISPLAY_OPTION + i, fields[14 + i].GetUInt8()); + SetBankBagSlotCount(fields[17].GetUInt8()); SetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_GENDER, gender); - SetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_INEBRIATION, fields[50].GetUInt8()); - SetUInt32Value(PLAYER_FLAGS, fields[16].GetUInt32()); - SetInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, fields[49].GetUInt32()); + SetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_INEBRIATION, fields[53].GetUInt8()); + SetUInt32Value(PLAYER_FLAGS, fields[19].GetUInt32()); + SetInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, fields[52].GetUInt32()); if (!ValidateAppearance( fields[3].GetUInt8(), // race @@ -16454,14 +17127,15 @@ 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<uint8, PLAYER_CUSTOM_DISPLAY_SIZE>{ 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; } // 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[65].GetUInt8()); + SetByteValue(PLAYER_FIELD_BYTES, PLAYER_FIELD_BYTES_OFFSET_ACTION_BAR_TOGGLES, fields[66].GetUInt8()); InitDisplayIds(); @@ -16489,18 +17163,18 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) InitPrimaryProfessions(); // to max set before any spell loaded // init saved position, and fix it later if problematic - ObjectGuid::LowType transLowGUID = fields[36].GetUInt64(); + ObjectGuid::LowType transLowGUID = fields[39].GetUInt64(); - Relocate(fields[17].GetFloat(), fields[18].GetFloat(), fields[19].GetFloat(), fields[21].GetFloat()); + Relocate(fields[20].GetFloat(), fields[21].GetFloat(), fields[22].GetFloat(), fields[24].GetFloat()); - uint32 mapId = fields[20].GetUInt16(); - uint32 instanceId = fields[58].GetUInt32(); + uint32 mapId = fields[23].GetUInt16(); + uint32 instanceId = fields[61].GetUInt32(); - SetDungeonDifficultyID(CheckLoadedDungeonDifficultyID(Difficulty(fields[44].GetUInt8()))); - SetRaidDifficultyID(CheckLoadedRaidDifficultyID(Difficulty(fields[67].GetUInt8()))); - SetLegacyRaidDifficultyID(CheckLoadedLegacyRaidDifficultyID(Difficulty(fields[68].GetUInt8()))); + SetDungeonDifficultyID(CheckLoadedDungeonDifficultyID(Difficulty(fields[47].GetUInt8()))); + SetRaidDifficultyID(CheckLoadedRaidDifficultyID(Difficulty(fields[68].GetUInt8()))); + SetLegacyRaidDifficultyID(CheckLoadedLegacyRaidDifficultyID(Difficulty(fields[69].GetUInt8()))); - std::string taxi_nodes = fields[43].GetString(); + std::string taxi_nodes = fields[46].GetString(); #define RelocateToHomebind(){ mapId = m_homebindMapId; instanceId = 0; Relocate(m_homebindX, m_homebindY, m_homebindZ); } @@ -16525,9 +17199,9 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) } _LoadCurrency(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_CURRENCY)); - SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, fields[45].GetUInt32()); - SetUInt16Value(PLAYER_FIELD_KILLS, PLAYER_FIELD_KILLS_OFFSET_TODAY_KILLS, fields[46].GetUInt16()); - SetUInt16Value(PLAYER_FIELD_KILLS, PLAYER_FIELD_KILLS_OFFSET_YESTERDAY_KILLS, fields[47].GetUInt16()); + SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, fields[48].GetUInt32()); + SetUInt16Value(PLAYER_FIELD_KILLS, PLAYER_FIELD_KILLS_OFFSET_TODAY_KILLS, fields[49].GetUInt16()); + SetUInt16Value(PLAYER_FIELD_KILLS, PLAYER_FIELD_KILLS_OFFSET_YESTERDAY_KILLS, fields[50].GetUInt16()); _LoadBoundInstances(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_BOUND_INSTANCES)); _LoadInstanceTimeRestrictions(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES)); @@ -16600,7 +17274,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) if (transport) { - float x = fields[32].GetFloat(), y = fields[33].GetFloat(), z = fields[34].GetFloat(), o = fields[35].GetFloat(); + float x = fields[35].GetFloat(), y = fields[36].GetFloat(), z = fields[37].GetFloat(), o = fields[38].GetFloat(); m_movementInfo.transport.pos.Relocate(x, y, z, o); transport->CalculatePassengerPosition(x, y, z, &o); @@ -16790,7 +17464,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) SaveRecallPosition(); time_t now = time(nullptr); - time_t logoutTime = time_t(fields[27].GetUInt32()); + time_t logoutTime = time_t(fields[30].GetUInt32()); // since last logout (in seconds) uint32 time_diff = uint32(now - logoutTime); //uint64 is excessive for a time_diff in seconds.. uint32 allows for 136~ year difference. @@ -16803,18 +17477,18 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) SetDrunkValue(newDrunkValue); - m_cinematic = fields[23].GetUInt8(); - m_Played_time[PLAYED_TIME_TOTAL] = fields[24].GetUInt32(); - m_Played_time[PLAYED_TIME_LEVEL] = fields[25].GetUInt32(); + m_cinematic = fields[26].GetUInt8(); + m_Played_time[PLAYED_TIME_TOTAL] = fields[27].GetUInt32(); + m_Played_time[PLAYED_TIME_LEVEL] = fields[28].GetUInt32(); - SetTalentResetCost(fields[29].GetUInt32()); - SetTalentResetTime(time_t(fields[30].GetUInt32())); + SetTalentResetCost(fields[32].GetUInt32()); + SetTalentResetTime(time_t(fields[33].GetUInt32())); - m_taxi.LoadTaxiMask(fields[22].GetString()); // must be before InitTaxiNodesForLevel + m_taxi.LoadTaxiMask(fields[25].GetString()); // must be before InitTaxiNodesForLevel - uint32 extraflags = fields[37].GetUInt16(); + uint32 extraflags = fields[40].GetUInt16(); - m_stableSlots = fields[38].GetUInt8(); + m_stableSlots = fields[41].GetUInt8(); if (m_stableSlots > MAX_PET_STABLES) { TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) can't have more stable slots than %u, but has %u in DB", @@ -16822,7 +17496,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) m_stableSlots = MAX_PET_STABLES; } - m_atLoginFlags = fields[39].GetUInt16(); + m_atLoginFlags = fields[42].GetUInt16(); if (HasAtLoginFlag(AT_LOGIN_RENAME)) { @@ -16835,7 +17509,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) m_lastHonorUpdateTime = logoutTime; UpdateHonorFields(); - m_deathExpireTime = time_t(fields[42].GetUInt32()); + m_deathExpireTime = time_t(fields[45].GetUInt32()); if (m_deathExpireTime > now + MAX_DEATH_COUNT * DEATH_EXPIRE_STEP) m_deathExpireTime = now + MAX_DEATH_COUNT * DEATH_EXPIRE_STEP - 1; @@ -16867,12 +17541,12 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) // reset stats before loading any modifiers InitStatsForLevel(); - InitGlyphsForLevel(); InitTaxiNodesForLevel(); InitRunes(); // rest bonus can only be calculated after InitStatsForLevel() - m_rest_bonus = fields[26].GetFloat(); + SetUInt32Value(PLAYER_FIELD_REST_INFO + REST_STATE_XP, fields[18].GetUInt8()); + m_rest_bonus = fields[29].GetFloat(); if (time_diff > 0) { @@ -16880,7 +17554,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) float bubble0 = 0.031f; //speed collect rest bonus in offline, in logout, in tavern, city (section/in hour) float bubble1 = 0.125f; - float bubble = fields[28].GetUInt8() > 0 + float bubble = fields[31].GetUInt8() > 0 ? bubble1*sWorld->getRate(RATE_REST_OFFLINE_IN_TAVERN_OR_CITY) : bubble0*sWorld->getRate(RATE_REST_OFFLINE_IN_WILDERNESS); @@ -16891,53 +17565,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[59].GetUInt8()); - SetActiveTalentGroup(fields[60].GetUInt8()); + SetPrimarySpecialization(fields[34].GetUInt32()); + SetActiveTalentGroup(fields[62].GetUInt8()); + ChrSpecializationEntry const* primarySpec = sChrSpecializationStore.LookupEntry(GetPrimarySpecialization()); + if (!primarySpec || primarySpec->ClassID != getClass() || GetActiveTalentGroup() >= MAX_SPECIALIZATIONS) + ResetTalentSpecialization(); - uint32 lootSpecId = fields[61].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) - { - 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()); - SetActiveTalentGroup(0); - } - // Only load selected specializations, learning mastery spells requires this - Tokenizer talentSpecs(fields[31].GetString(), ' ', MAX_TALENT_GROUPS); - for (uint8 i = 0; i < MAX_TALENT_GROUPS; ++i) - { - 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, GetSpecId(GetActiveTalentGroup())); + if (ChrSpecializationEntry const* spec = sDB2Manager.GetChrSpecializationByIndex(getClass(), GetActiveTalentGroup())) + SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, spec->ID); _LoadTalents(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TALENTS)); _LoadSpells(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELLS)); GetSession()->GetCollectionMgr()->LoadToys(); GetSession()->GetCollectionMgr()->LoadHeirlooms(); + GetSession()->GetCollectionMgr()->LoadItemAppearances(); 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; @@ -16977,7 +17627,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) // check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES // note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded - uint32 curTitle = fields[48].GetUInt32(); + uint32 curTitle = fields[51].GetUInt32(); if (curTitle && !HasTitle(curTitle)) curTitle = 0; @@ -17000,14 +17650,14 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) UpdateAllStats(); // restore remembered power/health values (but not more max values) - uint32 savedHealth = fields[51].GetUInt32(); + uint32 savedHealth = fields[54].GetUInt32(); SetHealth(savedHealth > GetMaxHealth() ? GetMaxHealth() : savedHealth); uint32 loadedPowers = 0; for (uint32 i = 0; i < MAX_POWERS; ++i) { if (GetPowerIndex(i) != MAX_POWERS) { - uint32 savedPower = fields[52 + loadedPowers].GetUInt32(); + uint32 savedPower = fields[55 + loadedPowers].GetUInt32(); uint32 maxPower = GetUInt32Value(UNIT_FIELD_MAXPOWER + loadedPowers); SetPower(Powers(i), (savedPower > maxPower) ? maxPower : savedPower); if (++loadedPowers >= MAX_POWERS_PER_CLASS) @@ -17018,7 +17668,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(); @@ -17072,7 +17722,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) } // RaF stuff. - m_grantableLevels = fields[66].GetUInt8(); + m_grantableLevels = fields[67].GetUInt8(); if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0)) SetFlag(OBJECT_DYNAMIC_FLAGS, UNIT_DYNFLAG_REFER_A_FRIEND); @@ -17082,6 +17732,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)); @@ -17289,7 +17940,8 @@ void Player::_LoadAuras(PreparedQueryResult auraResult, PreparedQueryResult effe remainCharges = 0; AuraLoadEffectInfo& info = effectInfo[key]; - if (Aura* aura = Aura::TryCreate(spellInfo, key.EffectMask, this, nullptr, info.BaseAmounts.data(), nullptr, casterGuid, castItemLevel)) + ObjectGuid castId = ObjectGuid::Create<HighGuid::Cast>(SPELL_CAST_SOURCE_NORMAL, GetMapId(), spellInfo->Id, GetMap()->GenerateLowGuid<HighGuid::Cast>()); + if (Aura* aura = Aura::TryCreate(spellInfo, castId, key.EffectMask, this, nullptr, info.BaseAmounts.data(), nullptr, casterGuid, castItemLevel)) { if (!aura->CanBeSaved()) { @@ -17307,36 +17959,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)) @@ -17359,10 +17981,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 - // 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 + // 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 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?) @@ -17374,6 +18002,7 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) std::map<ObjectGuid, Bag*> bagMap; // fast guid lookup for bags std::map<ObjectGuid, Item*> invalidBagMap; // fast guid lookup for bags + std::vector<Item*> childItems; std::list<Item*> problematicItems; SQLTransaction trans = CharacterDatabase.BeginTransaction(); @@ -17384,10 +18013,11 @@ 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<HighGuid::Item>(fields[21].GetUInt64()) : ObjectGuid::Empty; - uint8 slot = fields[22].GetUInt8(); + ObjectGuid bagGuid = fields[38].GetUInt64() ? ObjectGuid::Create<HighGuid::Item>(fields[38].GetUInt64()) : ObjectGuid::Empty; + uint8 slot = fields[39].GetUInt8(); GetSession()->GetCollectionMgr()->CheckHeirloomUpgrades(item); + GetSession()->GetCollectionMgr()->AddItemAppearance(item); InventoryResult err = EQUIP_ERR_OK; // Item is not in bag @@ -17459,9 +18089,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.", @@ -17487,6 +18122,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()) @@ -17536,15 +18180,14 @@ 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; + voidInstance.Initialize(_voidStorageItems[slot]); + BonusData bonus; + bonus.Initialize(voidInstance); + + GetSession()->GetCollectionMgr()->AddItemAppearance(itemId, bonus.AppearanceModID); } while (result->NextRow()); } @@ -17713,7 +18356,7 @@ void Player::_LoadMailedItems(Mail* mail) Item* item = NewItemOrBag(proto); - ObjectGuid ownerGuid = fields[21].GetUInt64() ? ObjectGuid::Create<HighGuid::Player>(fields[21].GetUInt64()) : ObjectGuid::Empty; + ObjectGuid ownerGuid = fields[38].GetUInt64() ? ObjectGuid::Create<HighGuid::Player>(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); @@ -17949,6 +18592,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<QuestPackageItemEntry const*> 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); @@ -18149,7 +18804,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()) { @@ -18165,7 +18820,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)", @@ -18203,7 +18858,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; @@ -18217,7 +18872,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; @@ -18449,14 +19104,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())); @@ -18653,8 +19308,10 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_STYLE_ID)); stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_COLOR_ID)); stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_FACIAL_STYLE)); - stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_BANK_BAG_SLOTS)); - stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_REST_STATE)); + for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) + stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_CUSTOM_DISPLAY_OPTION + i)); + stmt->setUInt8(index++, GetBankBagSlotCount()); + stmt->setUInt8(index++, uint8(GetUInt32Value(PLAYER_FIELD_REST_INFO + REST_STATE_XP))); stmt->setUInt32(index++, GetUInt32Value(PLAYER_FLAGS)); stmt->setUInt16(index++, (uint16)GetMapId()); stmt->setUInt32(index++, (uint32)GetInstanceId()); @@ -18687,11 +19344,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); @@ -18726,7 +19379,6 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt32(index++, GetSession()->GetLatency()); - stmt->setUInt8(index++, GetTalentGroupsCount()); stmt->setUInt8(index++, GetActiveTalentGroup()); stmt->setUInt32(index++, GetLootSpecId()); @@ -18742,8 +19394,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'; @@ -18780,8 +19432,10 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_STYLE_ID)); stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_COLOR_ID)); stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_FACIAL_STYLE)); - stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_BANK_BAG_SLOTS)); - stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_REST_STATE)); + for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) + stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_CUSTOM_DISPLAY_OPTION + i)); + stmt->setUInt8(index++, GetBankBagSlotCount()); + stmt->setUInt8(index++, uint8(GetUInt32Value(PLAYER_FIELD_REST_INFO + REST_STATE_XP))); stmt->setUInt32(index++, GetUInt32Value(PLAYER_FLAGS)); if (!IsBeingTeleported()) @@ -18831,11 +19485,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); @@ -18870,7 +19520,6 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt32(index++, GetSession()->GetLatency()); - stmt->setUInt8(index++, GetTalentGroupsCount()); stmt->setUInt8(index++, GetActiveTalentGroup()); stmt->setUInt32(index++, GetLootSpecId()); @@ -18886,8 +19535,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'; @@ -18938,7 +19587,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); @@ -18957,6 +19605,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()); @@ -19693,7 +20342,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); } @@ -19705,7 +20354,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)); @@ -20329,7 +20978,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); @@ -20696,17 +21345,17 @@ void Player::SetRestBonus(float rest_bonus_new) // update data for client if ((GetsRecruitAFriendBonus(true) && (GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0))) - SetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_REST_STATE, REST_STATE_RAF_LINKED); + SetUInt32Value(PLAYER_FIELD_REST_INFO + REST_STATE_XP, REST_STATE_RAF_LINKED); else { if (m_rest_bonus > 10) - SetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_REST_STATE, REST_STATE_RESTED); + SetUInt32Value(PLAYER_FIELD_REST_INFO + REST_STATE_XP, REST_STATE_RESTED); else if (m_rest_bonus <= 1) - SetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_REST_STATE, REST_STATE_NOT_RAF_LINKED); + SetUInt32Value(PLAYER_FIELD_REST_INFO + REST_STATE_XP, REST_STATE_NOT_RAF_LINKED); } //RestTickUpdate - SetUInt32Value(PLAYER_REST_STATE_EXPERIENCE, uint32(m_rest_bonus)); + SetUInt32Value(PLAYER_FIELD_REST_INFO + REST_RESTED_XP, uint32(m_rest_bonus)); } bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc /*= NULL*/, uint32 spellid /*= 0*/) @@ -21090,7 +21739,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) { @@ -21117,6 +21766,8 @@ inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 c it->SaveRefundDataToDB(); AddRefundReference(it->GetGUID()); } + + GetSession()->GetCollectionMgr()->OnItemAdded(it); } return true; } @@ -21654,23 +22305,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 (ItemDynamicFieldGems const& gemData : pItem2->GetGems()) { - 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(gemData.ItemId); if (!gemProto) continue; @@ -21678,13 +22317,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]; - } } } } @@ -21842,7 +22479,7 @@ void Player::SetBattlegroundEntryPoint() void Player::SetBGTeam(uint32 team) { m_bgData.bgTeam = team; - SetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_ARENA_FACTION, uint8(team == ALLIANCE ? 1 : 0)); + SetByteValue(PLAYER_BYTES_4, PLAYER_BYTES_4_OFFSET_ARENA_FACTION, uint8(team == ALLIANCE ? 1 : 0)); } uint32 Player::GetBGTeam() const @@ -22383,8 +23020,6 @@ void Player::SendInitialPacketsBeforeAddToMap() /// SMSG_WORLD_SERVER_INFO WorldPackets::Misc::WorldServerInfo worldServerInfo; - // worldServerInfo.IneligibleForLootMask; /// @todo - worldServerInfo.WeeklyReset = sWorld->GetNextWeeklyQuestsResetTime() - WEEK; worldServerInfo.InstanceGroupSize = GetMap()->GetMapDifficulty()->MaxPlayers; worldServerInfo.IsTournamentRealm = 0; /// @todo // worldServerInfo.RestrictedAccountMaxLevel; /// @todo @@ -22406,6 +23041,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()); @@ -22514,7 +23151,6 @@ void Player::SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint3 raidInstanceMessage.Type = type; raidInstanceMessage.MapID = mapid; raidInstanceMessage.DifficultyID = difficulty; - raidInstanceMessage.TimeLeft = int32(time); if (InstancePlayerBind const* bind = GetBoundInstance(mapid, difficulty)) raidInstanceMessage.Locked = bind->perm; else @@ -22657,8 +23293,6 @@ void Player::LearnDefaultSkill(SkillRaceClassInfoEntry const* rcInfo) skillValue = std::min(std::max<uint16>({ 1, uint16((getLevel() - 1) * 5) }), maxValue); else if (skillId == SKILL_FIST_WEAPONS) skillValue = std::max<uint16>(1, GetSkillValue(SKILL_UNARMED)); - else if (skillId == SKILL_LOCKPICKING) - skillValue = std::max<uint16>(1, GetSkillValue(SKILL_LOCKPICKING)); SetSkill(skillId, 0, skillValue, maxValue); break; @@ -23602,7 +24236,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); @@ -23898,7 +24532,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) @@ -24049,7 +24683,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; } @@ -24067,66 +24701,53 @@ bool Player::CanCaptureTowerPoint() const IsAlive()); // live player } -uint32 Player::GetBarberShopCost(BarberShopStyleEntry const* newHairStyle, uint8 newHairColor, BarberShopStyleEntry const* newFacialHair, BarberShopStyleEntry const* newSkin /*= nullptr*/, BarberShopStyleEntry const* newFace /*= nullptr*/) const +uint32 Player::GetBarberShopCost(BarberShopStyleEntry const* newHairStyle, uint8 newHairColor, BarberShopStyleEntry const* newFacialHair, BarberShopStyleEntry const* newSkin, BarberShopStyleEntry const* newFace, std::array<BarberShopStyleEntry const*, PLAYER_CUSTOM_DISPLAY_SIZE> const& newCustomDisplay) const { - uint8 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); uint8 skincolor = GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_SKIN_ID); uint8 face = GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_FACE_ID); - - if ((hairstyle == newHairStyle->Data) && (haircolor == newHairColor) && (facialhair == newFacialHair->Data) && (!newSkin || (newSkin->Data == skincolor)) && (!newFace || (newFace->Data == face))) + std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> customDisplay; + for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) + customDisplay[i] = GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_CUSTOM_DISPLAY_OPTION + i); + + if ((hairstyle == newHairStyle->Data) && + (haircolor == newHairColor) && + (facialhair == newFacialHair->Data) && + (!newSkin || (newSkin->Data == skincolor)) && + (!newFace || (newFace->Data == face)) && + (!newCustomDisplay[0] || (newCustomDisplay[0]->Data == customDisplay[0])) && + (!newCustomDisplay[1] || (newCustomDisplay[1]->Data == customDisplay[1])) && + (!newCustomDisplay[2] || (newCustomDisplay[2]->Data == customDisplay[2]))) return 0; - 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; -} + for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) + if (newCustomDisplay[i] && customDisplay[i] != newCustomDisplay[i]->Data) + cost += uint32(bsc->Cost * newCustomDisplay[i]->CostModifier); -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); - } - - SetUInt32Value(PLAYER_GLYPHS_ENABLED, slotMask); -} - -void Player::SetGlyph(uint8 slot, uint32 glyph) -{ - _talentMgr->GroupInfo[GetActiveTalentGroup()].Glyphs[slot] = glyph; - SetUInt32Value(PLAYER_FIELD_GLYPHS_1 + slot, glyph); + return cost; } bool Player::isTotalImmune() const @@ -24202,18 +24823,17 @@ bool Player::isTotalImmunity() const return false; } -uint32 Player::GetRuneTypeBaseCooldown(RuneType runeType) const +uint32 Player::GetRuneBaseCooldown() const { float cooldown = RUNE_BASE_COOLDOWN; - float hastePct; AuraEffectList const& regenAura = GetAuraEffectsByType(SPELL_AURA_MOD_POWER_REGEN_PERCENT); for (AuraEffectList::const_iterator i = regenAura.begin();i != regenAura.end(); ++i) - if ((*i)->GetMiscValue() == POWER_RUNES && (*i)->GetMiscValueB() == runeType) + if ((*i)->GetMiscValue() == POWER_RUNES) cooldown *= 1.0f - (*i)->GetAmount() / 100.0f; // Runes cooldown are now affected by player's haste from equipment ... - hastePct = GetRatingBonusValue(CR_HASTE_MELEE); + float hastePct = GetRatingBonusValue(CR_HASTE_MELEE); // ... and some auras. hastePct += GetTotalAuraModifier(SPELL_AURA_MOD_MELEE_HASTE); @@ -24241,72 +24861,52 @@ 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) -{ - SetRuneConvertAura(index, aura); ConvertRune(index, newType); -} - -void Player::RemoveRunesByAuraEffect(AuraEffect const* aura) +void Runes::SetRuneState(uint8 index, bool set /*= true*/) { - 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) +void Player::ResyncRunes() const { - SetCurrentRune(index, newType); + WorldPackets::Spells::ResyncRunes data(MAX_RUNES); + data.Runes.Start = 0; + data.Runes.Count = GetRunesState(); - WorldPackets::Spells::ConvertRune data; - data.Index = index; - data.Rune = newType; - GetSession()->SendPacket(data.Write()); -} - -void Player::ResyncRunes(uint8 count) const -{ - WorldPackets::Spells::ResyncRunes data(count); + for (uint32 i = 0; i < MAX_RUNES; ++i) + data.Runes.Cooldowns.push_back(uint8(255 - (GetRuneCooldown(i) * 51))); - for (uint32 i = 0; i < count; ++i) + // calculate mask of recharging runes + uint32 regeneratedRunes = 0; + uint32 regenIndex = 0; + while (regeneratedRunes < MAX_RECHARGING_RUNES && !m_runes->CooldownOrder.empty()) { - 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); + uint8 runeToRegen = m_runes->CooldownOrder[regenIndex++]; + uint32 runeCooldown = GetRuneCooldown(runeToRegen); + if (runeCooldown > m_regenTimer) + { + data.Runes.Start |= 1 << runeToRegen; + ++regenIndex; + } + + ++regeneratedRunes; } + GetSession()->SendPacket(data.Write()); } @@ -24317,48 +24917,28 @@ 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) return; - m_runes = new Runes; + uint32 runeIndex = GetPowerIndex(POWER_RUNES); + if (runeIndex == MAX_POWERS) + return; - 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); } - for (uint8 i = 0; i < NUM_RUNE_TYPES; ++i) - SetFloatValue(PLAYER_RUNE_REGEN_1 + i, 0.1f); // set a base regen timer equal to 10 sec -} - -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; + // set a base regen timer equal to 10 sec + SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER + runeIndex, 0.1f); + SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER + runeIndex, 0.1f); } void Player::AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore const& store, bool broadcast) @@ -24474,7 +25054,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 } @@ -24503,7 +25083,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", @@ -24615,16 +25195,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 (ItemDynamicFieldGems const& gemData : pItem->GetGems()) { - 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(gemData.ItemId); if (!pGem) continue; @@ -24782,22 +25355,38 @@ void Player::CompletedAchievement(AchievementEntry const* entry) m_achievementMgr->CompletedAchievement(entry, this); } -bool Player::LearnTalent(uint32 talentId) +bool Player::ModifierTreeSatisfied(uint32 modifierTreeId) const +{ + return m_achievementMgr->ModifierTreeSatisfied(modifierTreeId); +} + +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: @@ -24806,11 +25395,11 @@ 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; - else if (talent->SpecID == GetSpecId(GetActiveTalentGroup())) + else if (talent->SpecID == GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID)) { bestSlotMatch = talent; break; @@ -24818,74 +25407,67 @@ 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 : sTalentByPos[getClass()][talentInfo->TierID][c]) - if (HasTalent(talent->ID, GetActiveTalentGroup())) - return false; + { + for (TalentEntry const* talent : sDB2Manager.GetTalentsByPosition(getClass(), talentInfo->TierID, c)) + { + 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; + return TALENT_LEARN_OK; } -void Player::LearnTalentSpecialization(uint32 talentSpec) +void Player::ResetTalentSpecialization() { - 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 (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(); - SendTalentsInfoData(); - UpdateItemSetAuras(false); -} - -void Player::ResetTalentSpecialization() -{ - if (!GetSpecId(GetActiveTalentGroup())) - return; + RemoveSpecializationSpells(); - SetSpecId(GetActiveTalentGroup(), 0); - SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, 0); + ChrSpecializationEntry const* defaultSpec = sChrSpecializationStore.LookupEntry(sChrClassesStore.AssertEntry(getClass())->DefaultSpec); + SetPrimarySpecialization(defaultSpec->ID); + SetActiveTalentGroup(defaultSpec->OrderIndex); + SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, defaultSpec->ID); - // 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 (sTalentByPos[class_][t][c].size() > 1) - for (TalentEntry const* talent : sTalentByPos[class_][t][c]) - RemoveTalent(talent); + LearnSpecializationSpells(); - RemoveSpecializationSpells(); SendTalentsInfoData(); UpdateItemSetAuras(false); } @@ -24959,19 +25541,22 @@ 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); - groupInfoPkt.TalentIDs.reserve(GetTalentMap(i)->size()); + PlayerTalentMap* talents = GetTalentMap(i); - for (PlayerTalentMap::const_iterator itr = GetTalentMap(i)->begin(); itr != GetTalentMap(i)->end(); ++itr) + WorldPackets::Talent::TalentGroupInfo groupInfoPkt; + groupInfoPkt.SpecID = spec->ID; + groupInfoPkt.TalentIDs.reserve(talents->size()); + + for (PlayerTalentMap::const_iterator itr = talents->begin(); itr != talents->end(); ++itr) { if (itr->second == PLAYERSPELL_REMOVED) continue; @@ -24998,9 +25583,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); } @@ -25022,12 +25604,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)", @@ -25036,7 +25618,7 @@ void Player::SetEquipmentSet(EquipmentSetInfo::EquipmentSetData&& newEqSet) } } - EquipmentSetInfo& eqSlot = _equipmentSets[newEqSet.SetID]; + EquipmentSetInfo& eqSlot = _equipmentSets[newEqSet.Guid]; EquipmentSetUpdateState oldState = eqSlot.State; @@ -25048,6 +25630,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()); } @@ -25068,39 +25651,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); @@ -25179,48 +25799,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)); @@ -25240,7 +25818,7 @@ void Player::_SaveTalents(SQLTransaction& trans) trans->Append(stmt); PlayerTalentMap* talents; - for (uint8 group = 0; group < MAX_TALENT_GROUPS; ++group) + for (uint8 group = 0; group < MAX_SPECIALIZATIONS; ++group) { talents = GetTalentMap(group); for (PlayerTalentMap::iterator itr = talents->begin(); itr != talents->end();) @@ -25261,58 +25839,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)) @@ -25373,15 +25902,10 @@ 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)); + SetActiveTalentGroup(spec->OrderIndex); + SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, spec->ID); + if (!GetPrimarySpecialization()) + SetPrimarySpecialization(spec->ID); for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId) { @@ -25408,23 +25932,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); - - // 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); - } + for (uint32 i = 0; i < MAX_MASTERY_SPELLS; ++i) + if (uint32 mastery = spec->MasterySpellID[i]) + LearnSpell(mastery, false); InitTalentForLevel(); @@ -25444,9 +25954,10 @@ void Player::ActivateTalentGroup(uint8 spec) SetPower(pw, 0); UpdateItemSetAuras(false); - - if (!sChrSpecializationStore.LookupEntry(GetSpecId(GetActiveTalentGroup()))) - ResetTalents(true); + // 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() @@ -25659,7 +26170,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); @@ -25958,9 +26470,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; @@ -26074,7 +26586,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; @@ -26183,7 +26695,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; @@ -26196,7 +26720,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; @@ -26281,7 +26805,7 @@ void Player::RemoveOverrideSpell(uint32 overridenSpellId, uint32 newSpellId) void Player::LearnSpecializationSpells() { - if (std::vector<SpecializationSpellsEntry const*> const* specSpells = sDB2Manager.GetSpecializationSpells(GetSpecId(GetActiveTalentGroup()))) + if (std::vector<SpecializationSpellsEntry const*> const* specSpells = sDB2Manager.GetSpecializationSpells(GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID))) { for (size_t j = 0; j < specSpells->size(); ++j) { @@ -26301,7 +26825,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<SpecializationSpellsEntry const*> const* specSpells = sDB2Manager.GetSpecializationSpells(specialization->ID)) { @@ -26327,58 +26851,135 @@ void Player::RemoveSocial() m_social = nullptr; } -bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 hairID, uint8 hairColor, uint8 faceID, uint8 facialHair, uint8 skinColor, bool create /*=false*/) +uint32 GetSelectionFromContext(uint32 context, uint32 playerClass) { - // Check skin color - // For Skin type is always 0 - if (CharSectionsEntry const* entry = 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)) - { - // Check DeathKnight exclusive - if (((entry->Flags & SECTION_FLAG_DEATH_KNIGHT) || (entry2->Flags & SECTION_FLAG_DEATH_KNIGHT)) && class_ != CLASS_DEATH_KNIGHT) + switch (context) + { + case 1: + if (playerClass == CLASS_DEATH_KNIGHT) + return 1; + if (playerClass == CLASS_DEMON_HUNTER) + return 3; + return 0; + case 2: + if (playerClass == CLASS_DEATH_KNIGHT) + return 5; + if (playerClass == CLASS_DEMON_HUNTER) + return 6; + return 4; + case 3: + return 7; + case 4: + if (playerClass == CLASS_DEATH_KNIGHT) + return 9; + if (playerClass == CLASS_DEMON_HUNTER) + return 10; + return 8; + default: + if (playerClass == CLASS_DEATH_KNIGHT) + return 1; + if (playerClass == CLASS_DEMON_HUNTER) + return 2; + return 0; + } + + return 0; +} + +bool ComponentFlagsMatch(CharSectionsEntry const* entry, uint32 selection) +{ + switch (selection) + { + case 0: + if (!(entry->Flags & 1)) return false; - if (create && !((entry->Flags & SECTION_FLAG_PLAYER) && (entry2->Flags & SECTION_FLAG_PLAYER))) + return !(entry->Flags & 0x2C); + case 1: + if (!(entry->Flags & 1)) return false; - } - else - return false; + if (!(entry->Flags & 0x94)) + return false; + return !(entry->Flags & 8); + case 2: + if (!(entry->Flags & 1)) + return false; + if (!(entry->Flags & 0x70)) + return false; + return !(entry->Flags & 8); + case 3: + if (!(entry->Flags & 1)) + return false; + if (!(entry->Flags & 0x20)) + return false; + return !(entry->Flags & 8); + case 4: + case 8: + if (!(entry->Flags & 3)) + return false; + return !(entry->Flags & 0x2C); + case 5: + case 9: + if (!(entry->Flags & 3)) + return false; + if (!(entry->Flags & 0x94)) + return false; + return !(entry->Flags & 8); + case 6: + case 10: + if (!(entry->Flags & 3)) + return false; + if (!(entry->Flags & 0x70)) + return false; + return !(entry->Flags & 8); + case 7: + return true; + default: + break; } - else + + return false; +} + +bool IsSectionFlagValid(CharSectionsEntry const* entry, uint8 class_, bool create) +{ + if (create) + return ComponentFlagsMatch(entry, GetSelectionFromContext(0, class_)); + + return ComponentFlagsMatch(entry, GetSelectionFromContext(2, class_)); +} + +bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 hairID, uint8 hairColor, uint8 faceID, uint8 facialHairID, uint8 skinColor, std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> const& customDisplay, bool create /*= false*/) +{ + CharSectionsEntry const* skin = sDB2Manager.GetCharSectionEntry(race, SECTION_TYPE_SKIN, gender, 0, skinColor); + if (!skin) return false; - // These combinations don't have an entry of Type SECTION_TYPE_FACIAL_HAIR, exclude them from that check - bool excludeCheck = (race == RACE_TAUREN) || (race == RACE_DRAENEI) || (gender == GENDER_FEMALE && race != RACE_NIGHTELF && race != RACE_UNDEAD_PLAYER); + if (!IsSectionFlagValid(skin, class_, create)) + return false; - // 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)) - return false; + CharSectionsEntry const* face = sDB2Manager.GetCharSectionEntry(race, SECTION_TYPE_FACE, gender, faceID, skinColor); + if (!face) + 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)) - return false; - } - else - return false; - } - else - { - // @TODO: Bound checking for facialHair ID (used clientside for markings, tauren beard, etc.) - // Not present in DBC - } - } - else + if (!IsSectionFlagValid(face, class_, create)) + return false; + + CharSectionsEntry const* hair = sDB2Manager.GetCharSectionEntry(race, SECTION_TYPE_HAIR, gender, hairID, hairColor); + if (!hair) + return false; + + if (!IsSectionFlagValid(hair, class_, create)) return false; + CharSectionsEntry const* facialHair = sDB2Manager.GetCharSectionEntry(race, SECTION_TYPE_HAIR, gender, facialHairID, hairColor); + if (!facialHair) + return false; + + for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) + 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; + return true; } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 6810bdb0c72..faac57d2c28 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" @@ -446,7 +445,8 @@ struct Areas float y2; }; -#define MAX_RUNES 6 +#define MAX_RUNES 7 +#define MAX_RECHARGING_RUNES 3 enum RuneCooldowns { @@ -454,36 +454,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<uint8> 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 @@ -574,26 +551,32 @@ enum PlayerBytesOffsets enum PlayerBytes2Offsets { - PLAYER_BYTES_2_OFFSET_FACIAL_STYLE = 0, - PLAYER_BYTES_2_OFFSET_PARTY_TYPE = 1, - PLAYER_BYTES_2_OFFSET_BANK_BAG_SLOTS = 2, - PLAYER_BYTES_2_OFFSET_REST_STATE = 3 + PLAYER_BYTES_2_OFFSET_CUSTOM_DISPLAY_OPTION = 0, // 3 bytes + PLAYER_BYTES_2_OFFSET_FACIAL_STYLE = 3, }; +#define PLAYER_CUSTOM_DISPLAY_SIZE 3 + enum PlayerBytes3Offsets { - PLAYER_BYTES_3_OFFSET_GENDER = 0, - PLAYER_BYTES_3_OFFSET_INEBRIATION = 1, - PLAYER_BYTES_3_OFFSET_PVP_TITLE = 2, - PLAYER_BYTES_3_OFFSET_ARENA_FACTION = 3 + PLAYER_BYTES_3_OFFSET_PARTY_TYPE = 0, + PLAYER_BYTES_3_OFFSET_BANK_BAG_SLOTS = 1, + PLAYER_BYTES_3_OFFSET_GENDER = 2, + PLAYER_BYTES_3_OFFSET_INEBRIATION = 3, +}; + +enum PlayerBytes4Offsets +{ + PLAYER_BYTES_4_OFFSET_PVP_TITLE = 0, + PLAYER_BYTES_4_OFFSET_ARENA_FACTION = 1 }; enum PlayerFieldBytesOffsets { - PLAYER_FIELD_BYTES_OFFSET_RAF_GRANTABLE_LEVEL = 0, - PLAYER_FIELD_BYTES_OFFSET_ACTION_BAR_TOGGLES = 1, - PLAYER_FIELD_BYTES_OFFSET_PVP_RANK = 2, - PLAYER_FIELD_BYTES_OFFSET_LIFETIME_MAX_PVP_RANK = 3 + PLAYER_FIELD_BYTES_OFFSET_RAF_GRANTABLE_LEVEL = 0, + PLAYER_FIELD_BYTES_OFFSET_ACTION_BAR_TOGGLES = 1, + PLAYER_FIELD_BYTES_OFFSET_LIFETIME_MAX_PVP_RANK = 2, + PLAYER_FIELD_BYTES_OFFSET_MAX_ARTIFACT_POWER_RANKS = 3, }; enum PlayerFieldBytes2Offsets @@ -624,6 +607,16 @@ enum PlayerFieldKillsOffsets PLAYER_FIELD_KILLS_OFFSET_YESTERDAY_KILLS = 1 }; +enum PlayerRestInfoOffsets +{ + REST_STATE_XP = 0, + REST_RESTED_XP = 1, + REST_STATE_HONOR = 2, + REST_RESTED_HONOR = 3, + + MAX_REST_INFO +}; + enum MirrorTimerType { FATIGUE_TIMER = 0, @@ -687,7 +680,7 @@ enum QuestSlotOffsets }; #define MAX_QUEST_COUNTS 24 -#define MAX_QUEST_OFFSET 15 +#define MAX_QUEST_OFFSET 16 enum QuestSlotStateMask { @@ -733,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) }; @@ -804,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, @@ -814,24 +813,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<ObjectGuid, EQUIPMENT_SLOT_END> Pieces; + std::array<int32, EQUIPMENT_SLOT_END> Appearances; ///< ItemModifiedAppearanceID + std::array<int32, 2> 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<uint32, EquipmentSetInfo> EquipmentSetContainer; +typedef std::map<uint64, EquipmentSetInfo> EquipmentSetContainer; struct ItemPosCount { @@ -961,8 +969,8 @@ 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_GLYPHS, PLAYER_LOGIN_QUERY_LOAD_TALENTS, PLAYER_LOGIN_QUERY_LOAD_ACCOUNT_DATA, PLAYER_LOGIN_QUERY_LOAD_SKILLS, @@ -1143,43 +1151,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) + PlayerTalentInfo() : ResetTalentsCost(0), ResetTalentsTime(0), PrimarySpecialization(0), ActiveGroup(0) { - 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; - } } - ~PlayerTalentInfo() - { - for (uint8 i = 0; i < MAX_TALENT_GROUPS; ++i) - delete GroupInfo[i].Talents; - } - - struct TalentGroupInfo - { - PlayerTalentMap* Talents; - uint32 Glyphs[MAX_GLYPH_SLOT_INDEX]; - 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<Player> @@ -1238,7 +1241,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> uint8 GetChatFlags() const; std::string autoReplyMsg; - uint32 GetBarberShopCost(BarberShopStyleEntry const* newHairStyle, uint8 newHairColor, BarberShopStyleEntry const* newFacialHair, BarberShopStyleEntry const* newSkin = nullptr, BarberShopStyleEntry const* newFace = nullptr) const; + uint32 GetBarberShopCost(BarberShopStyleEntry const* newHairStyle, uint8 newHairColor, BarberShopStyleEntry const* newFacialHair, BarberShopStyleEntry const* newSkin, BarberShopStyleEntry const* newFace, std::array<BarberShopStyleEntry const*, PLAYER_CUSTOM_DISPLAY_SIZE> const& newCustomDisplay) const; PlayerSocial* GetSocial() const { return m_social; } void RemoveSocial(); @@ -1328,6 +1331,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> 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<Item*> &GetItemUpdateQueue() { return m_itemUpdateQueue; } static bool IsInventoryPos(uint16 pos) { return IsInventoryPos(pos >> 8, pos & 255); } @@ -1337,10 +1341,12 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> 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_2, PLAYER_BYTES_2_OFFSET_BANK_BAG_SLOTS); } - void SetBankBagSlotCount(uint8 count) { SetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_BANK_BAG_SLOTS, count); } + uint8 GetBankBagSlotCount() const { return GetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_BANK_BAG_SLOTS); } + void SetBankBagSlotCount(uint8 count) { SetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_BANK_BAG_SLOTS, count); } bool HasItemCount(uint32 item, uint32 count = 1, bool inBankAlso = false) const; bool HasItemFitToSpellRequirements(SpellInfo const* spellInfo, Item const* ignoreItem = nullptr) const; bool CanNoReagentCast(SpellInfo const* spellInfo) const; @@ -1354,6 +1360,9 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> 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; @@ -1363,11 +1372,13 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> 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<int32> const& bonusListIDs = std::vector<int32>()); + Item* StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool update, int32 randomPropertyId = 0, GuidSet const& allowedLooters = GuidSet(), std::vector<int32> const& bonusListIDs = std::vector<int32>(), 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); 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); } @@ -1586,7 +1597,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void SendQuestConfirmAccept(Quest const* quest, Player* receiver) const; void SendPushToPartyResponse(Player* player, QuestPushReason reason) const; void SendQuestUpdateAddCredit(Quest const* quest, ObjectGuid guid, QuestObjective const& obj, uint16 count) const; - void SendQuestUpdateAddPlayer(Quest const* quest, uint16 newCount, uint32 required) const; + void SendQuestUpdateAddPlayer(Quest const* quest, uint16 newCount) const; ObjectGuid GetDivider() const { return m_divider; } void SetDivider(ObjectGuid guid) { m_divider = guid; } @@ -1627,7 +1638,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> static bool IsValidGender(uint8 Gender) { return Gender <= GENDER_FEMALE; } static bool IsValidClass(uint8 Class) { return ((1 << (Class - 1)) & CLASSMASK_ALL_PLAYABLE) != 0; } static bool IsValidRace(uint8 Race) { return ((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<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> const& customDisplay, bool create = false); /*********************************************************/ /*** SAVE SYSTEM ***/ @@ -1757,39 +1768,28 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> 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 InitGlyphsForLevel(); - void SetGlyphSlot(uint8 slot, uint32 slottype) { SetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot, slottype); } - - uint32 GetGlyphSlot(uint8 slot) const { return GetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot); } - void SetGlyph(uint8 slot, uint32 glyph); - uint32 GetGlyph(uint8 group, uint8 slot) const { return _talentMgr->GroupInfo[group].Glyphs[slot]; } + 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); } @@ -1936,10 +1936,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> 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; @@ -1964,7 +1961,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void ApplyManaRegenBonus(int32 amount, bool apply); void ApplyHealthRegenBonus(int32 amount, bool apply); void UpdateManaRegen(); - void UpdateRuneRegen(RuneType rune); uint32 GetRuneTimer(uint8 index) const { return m_runeGraceCooldown[index]; } void SetRuneTimer(uint8 index, uint32 timer) { m_runeGraceCooldown[index] = timer; } uint32 GetLastRuneGraceTimer(uint8 index) const { return m_lastRuneGraceTimers[index]; } @@ -2158,11 +2154,11 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void UpdateItemSetAuras(bool formChange = false); void CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 procVictim, uint32 procEx); - void CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 castCount, int32* misc); + void CastItemUseSpell(Item* item, SpellCastTargets const& targets, ObjectGuid castCount, int32* misc); 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); @@ -2400,24 +2396,11 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> 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(GetBaseRune(index)); } - uint32 GetRuneTypeBaseCooldown(RuneType runeType) 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(); @@ -2430,6 +2413,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> 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); } @@ -2533,7 +2517,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> 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); @@ -2555,8 +2538,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void _LoadDeclinedNames(PreparedQueryResult result); void _LoadArenaTeamInfo(PreparedQueryResult result); void _LoadEquipmentSets(PreparedQueryResult result); + void _LoadTransmogOutfits(PreparedQueryResult result); void _LoadBGData(PreparedQueryResult result); - void _LoadGlyphs(PreparedQueryResult result); void _LoadTalents(PreparedQueryResult result); void _LoadInstanceTimeRestrictions(PreparedQueryResult result); void _LoadCurrency(PreparedQueryResult result); @@ -2580,7 +2563,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> 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/Entities/Taxi/TaxiPathGraph.cpp b/src/server/game/Entities/Taxi/TaxiPathGraph.cpp index 6670c8ea2cb..3ff288b0c50 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" @@ -108,8 +107,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/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/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index d2a8a31817d..94c12daa7bb 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" @@ -300,6 +299,7 @@ Creature* Transport::CreateNPCPassenger(ObjectGuid::LowType guid, CreatureData c creature->SetTransport(this); creature->m_movementInfo.transport.guid = GetGUID(); creature->m_movementInfo.transport.pos.Relocate(x, y, z, o); + creature->m_movementInfo.transport.seat = -1; CalculatePassengerPosition(x, y, z, &o); creature->Relocate(x, y, z, o); creature->SetHomePosition(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), creature->GetOrientation()); @@ -356,6 +356,7 @@ GameObject* Transport::CreateGOPassenger(ObjectGuid::LowType guid, GameObjectDat go->SetTransport(this); go->m_movementInfo.transport.guid = GetGUID(); go->m_movementInfo.transport.pos.Relocate(x, y, z, o); + go->m_movementInfo.transport.seat = -1; CalculatePassengerPosition(x, y, z, &o); go->Relocate(x, y, z, o); go->RelocateStationaryPosition(x, y, z, o); @@ -526,7 +527,7 @@ void Transport::UpdatePosition(float x, float y, float z, float o) void Transport::LoadStaticPassengers() { - if (uint32 mapId = GetGOInfo()->moTransport.mapID) + if (uint32 mapId = GetGOInfo()->moTransport.SpawnMap) { CellObjectGuidsMap const& cells = sObjectMgr->GetMapObjectGuids(mapId, GetMap()->GetSpawnMode()); CellGuidSet::const_iterator guidEnd; diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 6ca1045f63a..2c9da5cf672 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" @@ -90,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 @@ -119,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; } @@ -271,8 +270,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); @@ -523,7 +522,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); @@ -546,15 +545,12 @@ 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; for (uint32 i = 0; i < MAX_MASTERY_SPELLS; ++i) { - if (!chrSpec->MasterySpellID[i]) - continue; - if (Aura* aura = GetAura(chrSpec->MasterySpellID[i])) { for (SpellEffectInfo const* effect : aura->GetSpellEffectInfos()) @@ -668,9 +664,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 @@ -763,8 +757,12 @@ void Player::ApplyHealthRegenBonus(int32 amount, bool apply) void Player::UpdateManaRegen() { + uint32 manaIndex = GetPowerIndex(POWER_MANA); + if (manaIndex == MAX_POWERS) + 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); @@ -774,36 +772,22 @@ void Player::UpdateManaRegen() // Set regen rate in cast state apply only on spirit based regen int32 modManaRegenInterrupt = GetTotalAuraModifier(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT); - SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, base_regen + CalculatePct(spirit_regen, modManaRegenInterrupt)); - SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, 0.001f + spirit_regen + base_regen); + SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER + manaIndex, base_regen + CalculatePct(spirit_regen, modManaRegenInterrupt)); + SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER + manaIndex, 0.001f + spirit_regen + base_regen); } -void Player::UpdateRuneRegen(RuneType rune) +void Player::UpdateAllRunesRegen() { - if (rune >= NUM_RUNE_TYPES) + if (getClass() != CLASS_DEATH_KNIGHT) return; - uint32 cooldown = 0; - - for (uint32 i = 0; i < MAX_RUNES; ++i) - if (GetBaseRune(i) == rune) - { - cooldown = GetRuneBaseCooldown(i); - break; - } - - if (cooldown <= 0) + uint32 runeIndex = GetPowerIndex(POWER_RUNES); + if (runeIndex == MAX_POWERS) return; - float regen = float(1 * IN_MILLISECONDS) / float(cooldown); - SetFloatValue(PLAYER_RUNE_REGEN_1 + uint8(rune), regen); -} - -void Player::UpdateAllRunesRegen() -{ - for (uint8 i = 0; i < NUM_RUNE_TYPES; ++i) - if (uint32 cooldown = GetRuneTypeBaseCooldown(RuneType(i))) - SetFloatValue(PLAYER_RUNE_REGEN_1 + i, float(1 * IN_MILLISECONDS) / float(cooldown)); + 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)); } void Player::_ApplyAllStatBonuses() @@ -1048,7 +1032,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 4fa16a53624..96565ac12f2 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -164,8 +164,8 @@ ProcEventInfo::ProcEventInfo(Unit* actor, Unit* actionTarget, Unit* procTarget, _damageInfo(damageInfo), _healInfo(healInfo) { } -SpellNonMeleeDamage::SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _schoolMask) - : target(_target), attacker(_attacker), SpellID(_SpellID), damage(0), schoolMask(_schoolMask), +SpellNonMeleeDamage::SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _schoolMask, ObjectGuid _castId) + : target(_target), attacker(_attacker), castId(_castId), SpellID(_SpellID), damage(0), schoolMask(_schoolMask), absorb(0), resist(0), periodicLog(false), blocked(0), HitInfo(0), cleanDamage(0), preHitHealth(_target->GetHealth()) { } @@ -1432,7 +1432,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) @@ -1443,13 +1443,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<<MECHANIC_BLEED)) - return false; + // bleeding effects are not reduced by armor + if (SpellEffectInfo const* effect = spellInfo->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; @@ -1502,14 +1505,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<uint32>(damage * (1.0f - mitigation), 1); } @@ -1773,7 +1776,7 @@ void Unit::CalcAbsorbResist(Unit* victim, SpellSchoolMask schoolMask, DamageEffe uint32 split_absorb = 0; DealDamageMods(caster, splitDamage, &split_absorb); - SpellNonMeleeDamage log(this, caster, (*itr)->GetSpellInfo()->Id, schoolMask); + SpellNonMeleeDamage log(this, caster, (*itr)->GetSpellInfo()->Id, schoolMask, (*itr)->GetBase()->GetCastGUID()); CleanDamage cleanDamage = CleanDamage(splitDamage, 0, BASE_ATTACK, MELEE_HIT_NORMAL); DealDamage(caster, splitDamage, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false); log.damage = splitDamage; @@ -3307,7 +3310,7 @@ void Unit::_RemoveNoStackAurasDueToAura(Aura* aura) { Unit* caster = aura->GetCaster(); if (caster && caster->GetTypeId() == TYPEID_PLAYER) - Spell::SendCastResult(caster->ToPlayer(), aura->GetSpellInfo(), 1, SPELL_FAILED_AURA_BOUNCED); + Spell::SendCastResult(caster->ToPlayer(), aura->GetSpellInfo(), aura->GetSpellXSpellVisualId(), aura->GetCastGUID(), SPELL_FAILED_AURA_BOUNCED); } aura->Remove(); @@ -3672,7 +3675,7 @@ void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, ObjectGuid casterGUID, U if (aura->IsSingleTarget()) aura->UnregisterSingleTarget(); - if (Aura* newAura = Aura::TryRefreshStackOrCreate(aura->GetSpellInfo(), effMask, stealer, NULL, &baseDamage[0], NULL, aura->GetCasterGUID())) + if (Aura* newAura = Aura::TryRefreshStackOrCreate(aura->GetSpellInfo(), aura->GetCastGUID(), effMask, stealer, NULL, &baseDamage[0], NULL, aura->GetCasterGUID())) { // created aura must not be single target aura,, so stealer won't loose it on recast if (newAura->IsSingleTarget()) @@ -4848,6 +4851,7 @@ void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage const* log) WorldPackets::CombatLog::SpellNonMeleeDamageLog packet; packet.Me = log->target->GetGUID(); packet.CasterGUID = log->attacker->GetGUID(); + packet.CastID = log->castId; packet.SpellID = log->SpellID; packet.Damage = log->damage; if (log->damage > log->preHitHealth) @@ -4893,7 +4897,6 @@ void Unit::SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* info) spellLogEffect.AbsorbedOrAmplitude = info->absorb; spellLogEffect.Resisted = info->resist; spellLogEffect.Crit = info->critical; - spellLogEffect.Multistrike = false; // NYI /// @todo: implement debug info data.Effects.push_back(spellLogEffect); @@ -6078,78 +6081,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: @@ -6213,8 +6144,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 @@ -6827,11 +6756,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; @@ -8256,7 +8185,7 @@ float Unit::GetUnitSpellCriticalChance(Unit* victim, SpellInfo const* spellProto crit_chance = 0.0f; // For other schools else if (GetTypeId() == TYPEID_PLAYER) - crit_chance = GetFloatValue(PLAYER_SPELL_CRIT_PERCENTAGE1 + GetFirstSchoolInMask(schoolMask)); + crit_chance = GetFloatValue(PLAYER_SPELL_CRIT_PERCENTAGE1); else { crit_chance = (float)m_baseSpellCritChance; @@ -9046,7 +8975,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()))); } } @@ -9688,23 +9617,23 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co return true; } -int32 Unit::ModifyHealth(int32 dVal) +int64 Unit::ModifyHealth(int64 dVal) { - int32 gain = 0; + int64 gain = 0; if (dVal == 0) return 0; - int32 curHealth = (int32)GetHealth(); + int64 curHealth = (int64)GetHealth(); - int32 val = dVal + curHealth; + int64 val = dVal + curHealth; if (val <= 0) { SetHealth(0); return -curHealth; } - int32 maxHealth = (int32)GetMaxHealth(); + int64 maxHealth = (int64)GetMaxHealth(); if (val < maxHealth) { @@ -9725,28 +9654,27 @@ int32 Unit::ModifyHealth(int32 dVal) if (Player* player = GetCharmerOrOwnerPlayerOrPlayerItself()) player->GetSession()->SendPacket(packet.Write()); - } return gain; } -int32 Unit::GetHealthGain(int32 dVal) +int64 Unit::GetHealthGain(int64 dVal) { - int32 gain = 0; + int64 gain = 0; if (dVal == 0) return 0; - int32 curHealth = (int32)GetHealth(); + int64 curHealth = (int64)GetHealth(); - int32 val = dVal + curHealth; + int64 val = dVal + curHealth; if (val <= 0) { return -curHealth; } - int32 maxHealth = (int32)GetMaxHealth(); + int64 maxHealth = (int64)GetMaxHealth(); if (val < maxHealth) gain = dVal; @@ -10831,8 +10759,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; @@ -10945,8 +10872,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; } @@ -11014,7 +10939,7 @@ void Unit::SetLevel(uint8 lvl) } } -void Unit::SetHealth(uint32 val) +void Unit::SetHealth(uint64 val) { if (getDeathState() == JUST_DIED) val = 0; @@ -11022,12 +10947,12 @@ void Unit::SetHealth(uint32 val) val = 1; else { - uint32 maxHealth = GetMaxHealth(); + uint64 maxHealth = GetMaxHealth(); if (maxHealth < val) val = maxHealth; } - SetUInt32Value(UNIT_FIELD_HEALTH, val); + SetUInt64Value(UNIT_FIELD_HEALTH, val); // group update if (Player* player = ToPlayer()) @@ -11042,13 +10967,13 @@ void Unit::SetHealth(uint32 val) } } -void Unit::SetMaxHealth(uint32 val) +void Unit::SetMaxHealth(uint64 val) { if (!val) val = 1; - uint32 health = GetHealth(); - SetUInt32Value(UNIT_FIELD_MAXHEALTH, val); + uint64 health = GetHealth(); + SetUInt64Value(UNIT_FIELD_MAXHEALTH, val); // group update if (GetTypeId() == TYPEID_PLAYER) @@ -11175,16 +11100,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; @@ -14085,7 +14010,8 @@ Aura* Unit::AddAura(SpellInfo const* spellInfo, uint32 effMask, Unit* target) effMask &= ~(1<<i); } - if (Aura* aura = Aura::TryRefreshStackOrCreate(spellInfo, effMask, target, this)) + ObjectGuid castId = ObjectGuid::Create<HighGuid::Cast>(SPELL_CAST_SOURCE_NORMAL, GetMapId(), spellInfo->Id, GetMap()->GenerateLowGuid<HighGuid::Cast>()); + if (Aura* aura = Aura::TryRefreshStackOrCreate(spellInfo, castId, effMask, target, this)) { aura->ApplyForTargets(); return aura; @@ -14819,7 +14745,7 @@ bool Unit::HandleSpellClick(Unit* clicker, int8 seatId) bp0[effect->EffectIndex] = effect->BasePoints; bp0[i] = seatId; - Aura::TryRefreshStackOrCreate(spellEntry, MAX_EFFECT_MASK, this, clicker, bp0, NULL, origCasterGUID); + Aura::TryRefreshStackOrCreate(spellEntry, ObjectGuid::Create<HighGuid::Cast>(SPELL_CAST_SOURCE_NORMAL, GetMapId(), spellEntry->Id, GetMap()->GenerateLowGuid<HighGuid::Cast>()), MAX_EFFECT_MASK, this, clicker, bp0, NULL, origCasterGUID); } } else @@ -14827,7 +14753,7 @@ bool Unit::HandleSpellClick(Unit* clicker, int8 seatId) if (IsInMap(caster)) caster->CastSpell(target, spellEntry, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, NULL, NULL, origCasterGUID); else - Aura::TryRefreshStackOrCreate(spellEntry, MAX_EFFECT_MASK, this, clicker, NULL, NULL, origCasterGUID); + Aura::TryRefreshStackOrCreate(spellEntry, ObjectGuid::Create<HighGuid::Cast>(SPELL_CAST_SOURCE_NORMAL, GetMapId(), spellEntry->Id, GetMap()->GenerateLowGuid<HighGuid::Cast>()), MAX_EFFECT_MASK, this, clicker, NULL, NULL, origCasterGUID); } result = true; @@ -15831,10 +15757,10 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) *data << uint32(m_floatValues[index] < 0 ? 0 : m_floatValues[index]); } // there are some float values which may be negative or can't get negative due to other checks - else if ((index >= UNIT_FIELD_NEGSTAT && index < UNIT_FIELD_NEGSTAT + 5) || - (index >= UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE && index <= (UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE + 6)) || - (index >= UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE && index <= (UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE + 6)) || - (index >= UNIT_FIELD_POSSTAT && index < UNIT_FIELD_POSSTAT + 5)) + else if ((index >= UNIT_FIELD_NEGSTAT && index < UNIT_FIELD_NEGSTAT + MAX_STATS) || + (index >= UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE && index < (UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE + MAX_SPELL_SCHOOL)) || + (index >= UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE && index < (UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE + MAX_SPELL_SCHOOL)) || + (index >= UNIT_FIELD_POSSTAT && index < UNIT_FIELD_POSSTAT + MAX_STATS)) { *data << uint32(m_floatValues[index]); } @@ -15875,16 +15801,12 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) // hide lootable animation for unallowed players else if (index == OBJECT_DYNAMIC_FLAGS) { - uint32 dynamicFlags = m_uint32Values[OBJECT_DYNAMIC_FLAGS] & ~(UNIT_DYNFLAG_TAPPED | UNIT_DYNFLAG_TAPPED_BY_PLAYER); + uint32 dynamicFlags = m_uint32Values[OBJECT_DYNAMIC_FLAGS] & ~UNIT_DYNFLAG_TAPPED; if (creature) { - if (creature->hasLootRecipient()) - { + if (creature->hasLootRecipient() && !creature->isTappedBy(target)) dynamicFlags |= UNIT_DYNFLAG_TAPPED; - if (creature->isTappedBy(target)) - dynamicFlags |= UNIT_DYNFLAG_TAPPED_BY_PLAYER; - } if (!target->isAllowedToLoot(creature)) dynamicFlags &= ~UNIT_DYNFLAG_LOOTABLE; @@ -15904,7 +15826,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 3827b35451a..054720c2218 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" @@ -384,6 +383,7 @@ enum InventorySlot }; struct FactionTemplateEntry; +struct LiquidTypeEntry; struct MountCapabilityEntry; struct SpellValue; @@ -485,11 +485,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, @@ -502,6 +501,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, @@ -517,11 +524,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 @@ -626,8 +633,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, @@ -641,22 +648,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 @@ -1047,10 +1055,11 @@ struct CalcDamageInfo // Spell damage info structure based on structure sending in SMSG_SPELLNONMELEEDAMAGELOG opcode struct TC_GAME_API SpellNonMeleeDamage { - SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _schoolMask); + SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _schoolMask, ObjectGuid _castId = ObjectGuid::Empty); Unit *target; Unit *attacker; + ObjectGuid castId; uint32 SpellID; uint32 damage; uint32 schoolMask; @@ -1430,8 +1439,8 @@ class TC_GAME_API Unit : public WorldObject uint32 GetResistance(SpellSchoolMask mask) const; void SetResistance(SpellSchools school, int32 val) { SetStatInt32Value(UNIT_FIELD_RESISTANCES+school, val); } - uint32 GetHealth() const { return GetUInt32Value(UNIT_FIELD_HEALTH); } - uint32 GetMaxHealth() const { return GetUInt32Value(UNIT_FIELD_MAXHEALTH); } + uint64 GetHealth() const { return GetUInt64Value(UNIT_FIELD_HEALTH); } + uint64 GetMaxHealth() const { return GetUInt64Value(UNIT_FIELD_MAXHEALTH); } bool IsFullHealth() const { return GetHealth() == GetMaxHealth(); } bool HealthBelowPct(int32 pct) const { return GetHealth() < CountPctFromMaxHealth(pct); } @@ -1439,19 +1448,19 @@ class TC_GAME_API Unit : public WorldObject bool HealthAbovePct(int32 pct) const { return GetHealth() > CountPctFromMaxHealth(pct); } bool HealthAbovePctHealed(int32 pct, uint32 heal) const { return uint64(GetHealth()) + uint64(heal) > CountPctFromMaxHealth(pct); } float GetHealthPct() const { return GetMaxHealth() ? 100.f * GetHealth() / GetMaxHealth() : 0.0f; } - uint32 CountPctFromMaxHealth(int32 pct) const { return CalculatePct(GetMaxHealth(), pct); } - uint32 CountPctFromCurHealth(int32 pct) const { return CalculatePct(GetHealth(), pct); } + uint64 CountPctFromMaxHealth(int32 pct) const { return CalculatePct(GetMaxHealth(), pct); } + uint64 CountPctFromCurHealth(int32 pct) const { return CalculatePct(GetHealth(), pct); } - void SetHealth(uint32 val); - void SetMaxHealth(uint32 val); + void SetHealth(uint64 val); + void SetMaxHealth(uint64 val); inline void SetFullHealth() { SetHealth(GetMaxHealth()); } - int32 ModifyHealth(int32 val); - int32 GetHealthGain(int32 dVal); + int64 ModifyHealth(int64 val); + int64 GetHealthGain(int64 dVal); 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); } @@ -1544,7 +1553,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; @@ -2089,7 +2098,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/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 9705eeaed72..9f3c91f2e35 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/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp index 5a25f91876e..970dd893f1d 100644 --- a/src/server/game/Garrison/Garrison.cpp +++ b/src/server/game/Garrison/Garrison.cpp @@ -47,7 +47,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()); } @@ -219,10 +219,12 @@ void Garrison::DeleteFromDB(ObjectGuid::LowType ownerGuid, SQLTransaction trans) bool Garrison::Create(uint32 garrSiteId) { - _siteLevel = sGarrisonMgr.GetGarrSiteLevelEntry(garrSiteId, 1); - if (!_siteLevel) + GarrSiteLevelEntry const* siteLevel = sGarrisonMgr.GetGarrSiteLevelEntry(garrSiteId, 1); + if (!siteLevel) return false; + _siteLevel = siteLevel; + InitializePlots(); WorldPackets::Garrison::GarrisonCreateResult garrisonCreateResult; @@ -337,6 +339,7 @@ Garrison::Plot const* Garrison::GetPlot(uint32 garrPlotInstanceId) const void Garrison::LearnBlueprint(uint32 garrBuildingId) { WorldPackets::Garrison::GarrisonLearnBlueprintResult learnBlueprintResult; + learnBlueprintResult.GarrTypeID = GARRISON_TYPE_GARRISON; learnBlueprintResult.BuildingID = garrBuildingId; learnBlueprintResult.Result = GARRISON_SUCCESS; @@ -353,6 +356,7 @@ void Garrison::LearnBlueprint(uint32 garrBuildingId) void Garrison::UnlearnBlueprint(uint32 garrBuildingId) { WorldPackets::Garrison::GarrisonUnlearnBlueprintResult unlearnBlueprintResult; + unlearnBlueprintResult.GarrTypeID = GARRISON_TYPE_GARRISON; unlearnBlueprintResult.BuildingID = garrBuildingId; unlearnBlueprintResult.Result = GARRISON_SUCCESS; @@ -369,6 +373,7 @@ void Garrison::UnlearnBlueprint(uint32 garrBuildingId) void Garrison::PlaceBuilding(uint32 garrPlotInstanceId, uint32 garrBuildingId) { WorldPackets::Garrison::GarrisonPlaceBuildingResult placeBuildingResult; + placeBuildingResult.GarrTypeID = GARRISON_TYPE_GARRISON; placeBuildingResult.Result = CheckBuildingPlacement(garrPlotInstanceId, garrBuildingId); if (placeBuildingResult.Result == GARRISON_SUCCESS) { @@ -401,6 +406,7 @@ void Garrison::PlaceBuilding(uint32 garrPlotInstanceId, uint32 garrBuildingId) if (oldBuildingId) { WorldPackets::Garrison::GarrisonBuildingRemoved buildingRemoved; + buildingRemoved.GarrTypeID = GARRISON_TYPE_GARRISON; buildingRemoved.Result = GARRISON_SUCCESS; buildingRemoved.GarrPlotInstanceID = garrPlotInstanceId; buildingRemoved.GarrBuildingID = oldBuildingId; @@ -416,6 +422,7 @@ void Garrison::PlaceBuilding(uint32 garrPlotInstanceId, uint32 garrBuildingId) void Garrison::CancelBuildingConstruction(uint32 garrPlotInstanceId) { WorldPackets::Garrison::GarrisonBuildingRemoved buildingRemoved; + buildingRemoved.GarrTypeID = GARRISON_TYPE_GARRISON; buildingRemoved.Result = CheckBuildingRemoval(garrPlotInstanceId); if (buildingRemoved.Result == GARRISON_SUCCESS) { @@ -439,13 +446,14 @@ 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.GarrTypeID = GARRISON_TYPE_GARRISON; 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; @@ -485,6 +493,7 @@ void Garrison::ActivateBuilding(uint32 garrPlotInstanceId) void Garrison::AddFollower(uint32 garrFollowerId) { WorldPackets::Garrison::GarrisonAddFollowerResult addFollowerResult; + addFollowerResult.GarrTypeID = GARRISON_TYPE_GARRISON; GarrFollowerEntry const* followerEntry = sGarrFollowerStore.LookupEntry(garrFollowerId); if (_followerIds.count(garrFollowerId) || !followerEntry) { @@ -505,7 +514,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; @@ -526,20 +535,24 @@ Garrison::Follower const* Garrison::GetFollower(uint64 dbId) const void Garrison::SendInfo() { WorldPackets::Garrison::GetGarrisonInfoResult garrisonInfo; - garrisonInfo.GarrSiteID = _siteLevel->SiteID; - garrisonInfo.GarrSiteLevelID = _siteLevel->ID; garrisonInfo.FactionIndex = GetFaction(); - garrisonInfo.NumFollowerActivationsRemaining = _followerActivationsRemainingToday; + garrisonInfo.Garrisons.emplace_back(); + + WorldPackets::Garrison::GarrisonInfo& garrison = garrisonInfo.Garrisons.back(); + garrison.GarrTypeID = GARRISON_TYPE_GARRISON; + garrison.GarrSiteID = _siteLevel->SiteID; + garrison.GarrSiteLevelID = _siteLevel->ID; + garrison.NumFollowerActivationsRemaining = _followerActivationsRemainingToday; for (auto& p : _plots) { Plot& plot = p.second; - garrisonInfo.Plots.push_back(&plot.PacketInfo); + garrison.Plots.push_back(&plot.PacketInfo); if (plot.BuildingInfo.PacketInfo) - garrisonInfo.Buildings.push_back(plot.BuildingInfo.PacketInfo.get_ptr()); + garrison.Buildings.push_back(plot.BuildingInfo.PacketInfo.get_ptr()); } for (auto const& p : _followers) - garrisonInfo.Followers.push_back(&p.second.PacketInfo); + garrison.Followers.push_back(&p.second.PacketInfo); _owner->SendDirectMessage(garrisonInfo.Write()); } @@ -565,6 +578,7 @@ void Garrison::SendRemoteInfo() const void Garrison::SendBlueprintAndSpecializationData() { WorldPackets::Garrison::GarrisonRequestBlueprintAndSpecializationDataResult data; + data.GarrTypeID = GARRISON_TYPE_GARRISON; data.BlueprintsKnown = &_knownBuildings; _owner->SendDirectMessage(data.Write()); } @@ -742,9 +756,9 @@ GameObject* Garrison::Plot::CreateGameObject(Map* map, GarrisonFactionIndex fact } } - if (building->GetGoType() == GAMEOBJECT_TYPE_GARRISON_BUILDING && building->GetGOInfo()->garrisonBuilding.mapID) + if (building->GetGoType() == GAMEOBJECT_TYPE_GARRISON_BUILDING && building->GetGOInfo()->garrisonBuilding.SpawnMap) { - for (CellObjectGuidsMap::value_type const& cellGuids : sObjectMgr->GetMapObjectGuids(building->GetGOInfo()->garrisonBuilding.mapID, map->GetSpawnMode())) + for (CellObjectGuidsMap::value_type const& cellGuids : sObjectMgr->GetMapObjectGuids(building->GetGOInfo()->garrisonBuilding.SpawnMap, map->GetSpawnMode())) { for (ObjectGuid::LowType spawnId : cellGuids.second.creatures) if (Creature* spawn = BuildingSpawnHelper<Creature, &Creature::SetHomePosition>(building, spawnId, map)) @@ -795,6 +809,7 @@ void Garrison::Plot::DeleteGameObject(Map* map) void Garrison::Plot::ClearBuildingInfo(Player* owner) { WorldPackets::Garrison::GarrisonPlotPlaced plotPlaced; + plotPlaced.GarrTypeID = GARRISON_TYPE_GARRISON; plotPlaced.PlotInfo = &PacketInfo; owner->SendDirectMessage(plotPlaced.Write()); diff --git a/src/server/game/Garrison/Garrison.h b/src/server/game/Garrison/Garrison.h index 2aa38ee6ad3..750ed64639a 100644 --- a/src/server/game/Garrison/Garrison.h +++ b/src/server/game/Garrison/Garrison.h @@ -21,6 +21,12 @@ #include "Player.h" #include "GarrisonPackets.h" +enum GarrisonType +{ + GARRISON_TYPE_GARRISON = 2, + GARRISON_TYPE_CLASS_ORDER = 3 +}; + enum GarrisonFactionIndex { GARRISON_FACTION_INDEX_HORDE = 0, @@ -74,7 +80,8 @@ enum GarrisonFollowerStatus { FOLLOWER_STATUS_FAVORITE = 0x01, FOLLOWER_STATUS_EXHAUSTED = 0x02, - FOLLOWER_STATUS_INACTIVE = 0x04 + FOLLOWER_STATUS_INACTIVE = 0x04, + FOLLOWER_STATUS_TROOP = 0x08 }; class GameObject; diff --git a/src/server/game/Garrison/GarrisonMgr.cpp b/src/server/game/Garrison/GarrisonMgr.cpp index 5c9bef62fc3..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 (GarrSiteLevelPlotInstEntry const* plotInstance : sGarrSiteLevelPlotInstStore) - _garrisonPlotInstBySiteLevel[plotInstance->GarrSiteLevelID].push_back(plotInstance); + for (GarrSiteLevelPlotInstEntry const* siteLevelPlotInst : sGarrSiteLevelPlotInstStore) + _garrisonPlotInstBySiteLevel[siteLevelPlotInst->GarrSiteLevelID].push_back(siteLevelPlotInst); 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 (GarrBuildingEntry const* building : sGarrBuildingStore) - _garrisonBuildingsByType[building->Type].push_back(building); + _garrisonBuildingsByType[building->Type].push_back(building->ID); for (GarrFollowerXAbilityEntry const* followerAbility : sGarrFollowerXAbilityStore) { @@ -75,9 +75,9 @@ void GarrisonMgr::Initialize() GarrSiteLevelEntry const* GarrisonMgr::GetGarrSiteLevelEntry(uint32 garrSiteId, uint32 level) const { - for (GarrSiteLevelEntry const* garrSiteLevel : sGarrSiteLevelStore) - if (garrSiteLevel->SiteID == garrSiteId && garrSiteLevel->Level == level) - return garrSiteLevel; + for (GarrSiteLevelEntry const* siteLevel : sGarrSiteLevelStore) + if (siteLevel->SiteID == garrSiteId && siteLevel->Level == level) + return siteLevel; return nullptr; } @@ -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<GarrAbilityEntry const*> GarrisonMgr::RollFollowerAbilities(GarrFollowerEntry const* follower, uint32 quality, uint32 faction, bool initial) const +std::list<GarrAbilityEntry const*> GarrisonMgr::RollFollowerAbilities(uint32 garrFollowerId, GarrFollowerEntry const* follower, uint32 quality, uint32 faction, bool initial) const { ASSERT(faction < 2); @@ -173,7 +173,7 @@ std::list<GarrAbilityEntry const*> 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..b5bb0628ab1 100644 --- a/src/server/game/Garrison/GarrisonMgr.h +++ b/src/server/game/Garrison/GarrisonMgr.h @@ -50,10 +50,10 @@ public: 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<GarrAbilityEntry const*> RollFollowerAbilities(GarrFollowerEntry const* follower, uint32 quality, uint32 faction, bool initial) const; + std::list<GarrAbilityEntry const*> RollFollowerAbilities(uint32 garrFollowerId, GarrFollowerEntry const* follower, uint32 quality, uint32 faction, bool initial) const; std::list<GarrAbilityEntry const*> GetClassSpecAbilities(GarrFollowerEntry const* follower, uint32 faction) const; private: @@ -65,7 +65,7 @@ private: std::unordered_map<uint32 /*mapId*/, std::unordered_map<uint32 /*garrPlotId*/, GameObjectsEntry const*>> _garrisonPlots; std::unordered_map<uint32 /*garrPlotId*/, std::unordered_set<uint32/*garrBuildingId*/>> _garrisonBuildingsByPlot; std::unordered_map<uint64 /*garrBuildingId | garrSiteLevelPlotInstId << 32*/, uint32 /*garrBuildingPlotInstId*/> _garrisonBuildingPlotInstances; - std::unordered_map<uint32 /*buildingType*/, std::vector<GarrBuildingEntry const*>> _garrisonBuildingsByType; + std::unordered_map<uint32 /*buildingType*/, std::vector<uint32>> _garrisonBuildingsByType; std::unordered_map<uint32 /*garrPlotInstanceId*/, FinalizeGarrisonPlotGOInfo> _finalizePlotGOInfo; std::unordered_map<uint32 /*garrFollowerId*/, GarrAbilities> _garrisonFollowerAbilities[2]; std::unordered_map<uint32 /*classSpecId*/, std::list<GarrAbilityEntry const*>> _garrisonFollowerClassSpecAbilities; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index b32bc623500..d3d33a22ad3 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 <http://www.gnu.org/licenses/>. */ +#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" @@ -176,12 +176,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 }, @@ -1733,7 +1733,7 @@ void ObjectMgr::LoadCreatures() // Build single time for check spawnmask std::map<uint32, uint32> spawnMasks; - for (auto& mapDifficultyPair : sMapDifficultyMap) + for (auto& mapDifficultyPair : sDB2Manager.GetMapDifficulties()) for (auto& difficultyPair : mapDifficultyPair.second) spawnMasks[mapDifficultyPair.first] |= (1 << difficultyPair.first); @@ -1825,7 +1825,7 @@ void ObjectMgr::LoadCreatures() } else if (data.movementType == RANDOM_MOTION_TYPE) { - if (data.spawndist == 0.0f) + if (G3D::fuzzyEq(data.spawndist, 0.0f)) { TC_LOG_ERROR("sql.sql", "Table `creature` has creature (GUID: " UI64FMTD " Entry: %u) with `MovementType`=1 (random movement) but with `spawndist`=0, replace by idle movement type (0).", guid, data.id); data.movementType = IDLE_MOTION_TYPE; @@ -1856,8 +1856,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; @@ -2046,7 +2045,7 @@ void ObjectMgr::LoadGameobjects() // build single time for check spawnmask std::map<uint32, uint32> spawnMasks; - for (auto& mapDifficultyPair : sMapDifficultyMap) + for (auto& mapDifficultyPair : sDB2Manager.GetMapDifficulties()) for (auto& difficultyPair : mapDifficultyPair.second) spawnMasks[mapDifficultyPair.first] |= (1 << difficultyPair.first); @@ -2143,8 +2142,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; @@ -2371,7 +2369,7 @@ uint32 FillMaxDurability(uint32 itemClass, uint32 itemSubClass, uint32 inventory 1.00f, // ITEM_SUBCLASS_WEAPON_POLEARM 0.91f, // ITEM_SUBCLASS_WEAPON_SWORD 1.00f, // ITEM_SUBCLASS_WEAPON_SWORD2 - 0.00f, // ITEM_SUBCLASS_WEAPON_Obsolete + 1.00f, // ITEM_SUBCLASS_WEAPON_WARGLAIVES 1.00f, // ITEM_SUBCLASS_WEAPON_STAFF 0.00f, // ITEM_SUBCLASS_WEAPON_EXOTIC 0.00f, // ITEM_SUBCLASS_WEAPON_EXOTIC2 @@ -2409,7 +2407,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) @@ -2423,18 +2421,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; } @@ -2483,6 +2481,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; @@ -2537,6 +2538,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; @@ -2570,9 +2599,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; @@ -2585,9 +2611,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; @@ -2642,6 +2665,7 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.MaxMoneyLoot = 0; itemTemplate.FlagsCu = 0; itemTemplate.SpellPPMRate = 0.0f; + itemTemplate.ItemSpecClassMask = 0; if (std::vector<ItemSpecOverrideEntry const*> const* itemSpecOverrides = sDB2Manager.GetItemSpecOverrides(sparse->ID)) { @@ -2676,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].set(ItemTemplate::CalculateItemSpecBit(specialization)); + } + } } } } @@ -3448,6 +3477,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) { @@ -3475,18 +3510,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; @@ -3531,7 +3562,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; @@ -3539,17 +3570,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 @@ -3582,63 +3610,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)); } } } @@ -3657,31 +3676,33 @@ void ObjectMgr::LoadQuests() QueryResult result = WorldDatabase.Query("SELECT " //0 1 2 3 4 5 6 7 8 9 10 "ID, QuestType, QuestLevel, QuestPackageID, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, RewardNextQuest, RewardXPDifficulty, RewardXPMultiplier, " - //11 12 13 14 15 16 17 18 19 20 21 - "RewardMoney, RewardMoneyDifficulty, RewardMoneyMultiplier, RewardBonusMoney, RewardDisplaySpell, RewardSpell, RewardHonor, RewardKillHonor, StartItem, Flags, FlagsEx, " - //22 23 24 25 26 27 28 29 + //11 12 13 14 15 16 17 18 19 20 21 + "RewardMoney, RewardMoneyDifficulty, RewardMoneyMultiplier, RewardBonusMoney, RewardDisplaySpell1, RewardDisplaySpell2, RewardDisplaySpell3, RewardSpell, RewardHonor, RewardKillHonor, StartItem, " + //22 23 24 25 26 + "RewardArtifactXPDifficulty, RewardArtifactXPMultiplier, RewardArtifactCategoryID, Flags, FlagsEx, " + //27 28 29 30 31 32 33 34 "RewardItem1, RewardAmount1, ItemDrop1, ItemDropQuantity1, RewardItem2, RewardAmount2, ItemDrop2, ItemDropQuantity2, " - //30 31 32 33 34 35 36 37 + //35 36 37 38 39 40 41 42 "RewardItem3, RewardAmount3, ItemDrop3, ItemDropQuantity3, RewardItem4, RewardAmount4, ItemDrop4, ItemDropQuantity4, " - //38 39 40 41 42 43 + //43 44 45 46 47 48 "RewardChoiceItemID1, RewardChoiceItemQuantity1, RewardChoiceItemDisplayID1, RewardChoiceItemID2, RewardChoiceItemQuantity2, RewardChoiceItemDisplayID2, " - //44 45 46 47 48 49 + //49 50 51 52 53 54 "RewardChoiceItemID3, RewardChoiceItemQuantity3, RewardChoiceItemDisplayID3, RewardChoiceItemID4, RewardChoiceItemQuantity4, RewardChoiceItemDisplayID4, " - //50 51 52 53 54 55 + //55 56 57 58 59 60 "RewardChoiceItemID5, RewardChoiceItemQuantity5, RewardChoiceItemDisplayID5, RewardChoiceItemID6, RewardChoiceItemQuantity6, RewardChoiceItemDisplayID6, " - //56 57 58 59 60 61 62 63 64 65 66 - "POIContinent, POIx, POIy, POIPriority, RewardTitle, RewardTalents, RewardArenaPoints, RewardSkillLineID, RewardNumSkillUps, PortraitGiver, PortraitTurnIn, " - //67 68 69 70 71 72 - "RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, " - //73 74 75 76 77 78 - "RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, " - //79 80 81 82 - "RewardFactionID5, RewardFactionValue5, RewardFactionOverride5, RewardFactionFlags, " - //83 84 85 86 87 88 89 90 + //61 62 63 64 65 66 67 68 69 70 + "POIContinent, POIx, POIy, POIPriority, RewardTitle, RewardArenaPoints, RewardSkillLineID, RewardNumSkillUps, PortraitGiver, PortraitTurnIn, " + //71 72 73 74 75 76 77 78 + "RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionCapIn1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, RewardFactionCapIn2, " + //79 80 81 82 83 84 85 86 + "RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionCapIn3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, RewardFactionCapIn4, " + //87 88 89 90 91 + "RewardFactionID5, RewardFactionValue5, RewardFactionOverride5, RewardFactionCapIn5, RewardFactionFlags, " + //92 93 94 95 96 97 98 99 "RewardCurrencyID1, RewardCurrencyQty1, RewardCurrencyID2, RewardCurrencyQty2, RewardCurrencyID3, RewardCurrencyQty3, RewardCurrencyID4, RewardCurrencyQty4, " - //91 92 93 94 95 - "AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, " - //96 97 98 99 100 101 102 103 104 + //100 101 102 103 104 105 + "AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, QuestRewardID, " + //106 107 108 109 110 111 112 113 114 "LogTitle, LogDescription, QuestDescription, AreaDescription, PortraitGiverText, PortraitGiverName, PortraitTurnInText, PortraitTurnInName, QuestCompletionLog" " FROM quest_template"); if (!result) @@ -4288,22 +4309,25 @@ void ObjectMgr::LoadQuests() } } - if (qinfo->RewardDisplaySpell) + for (uint32 i = 0; i < QUEST_REWARD_DISPLAY_SPELL_COUNT; ++i) { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->RewardDisplaySpell); - - if (!spellInfo) + if (qinfo->RewardDisplaySpell[i]) { - TC_LOG_ERROR("sql.sql", "Quest %u has `RewardSpell` = %u but spell %u does not exist, spell removed as display reward.", - qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell); - qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest - } + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->RewardDisplaySpell[i]); - else if (!SpellMgr::IsSpellValid(spellInfo)) - { - TC_LOG_ERROR("sql.sql", "Quest %u has `RewardSpell` = %u but spell %u is broken, quest will not have a spell reward.", - qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell); - qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest + if (!spellInfo) + { + TC_LOG_ERROR("sql.sql", "Quest %u has `RewardDisplaySpell%u` = %u but spell %u does not exist, spell removed as display reward.", + qinfo->GetQuestId(), i, qinfo->RewardDisplaySpell[i], qinfo->RewardDisplaySpell[i]); + qinfo->RewardDisplaySpell[i] = 0; // no spell reward will display for this quest + } + + else if (!SpellMgr::IsSpellValid(spellInfo)) + { + TC_LOG_ERROR("sql.sql", "Quest %u has `RewardDisplaySpell%u` = %u but spell %u is broken, quest will not have a spell reward.", + qinfo->GetQuestId(), i, qinfo->RewardDisplaySpell[i], qinfo->RewardDisplaySpell[i]); + qinfo->RewardDisplaySpell[i] = 0; // no spell reward will display for this quest + } } } @@ -4388,7 +4412,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 +4422,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); @@ -5137,8 +5161,8 @@ void ObjectMgr::LoadPageTexts() { uint32 oldMSTime = getMSTime(); - // 0 1 2 - QueryResult result = WorldDatabase.Query("SELECT ID, Text, NextPageID FROM page_text"); + // 0 1 2 3 4 + QueryResult result = WorldDatabase.Query("SELECT ID, Text, NextPageID, PlayerConditionID, Flags FROM page_text"); if (!result) { TC_LOG_INFO("server.loading", ">> Loaded 0 page texts. DB table `page_text` is empty!"); @@ -5155,22 +5179,18 @@ void ObjectMgr::LoadPageTexts() PageText& pageText = _pageTextStore[id]; pageText.Text = fields[1].GetString(); pageText.NextPageID = fields[2].GetUInt32(); + pageText.PlayerConditionID = fields[3].GetInt32(); + pageText.Flags = fields[4].GetUInt8(); ++count; } while (result->NextRow()); for (PageTextContainer::const_iterator itr = _pageTextStore.begin(); itr != _pageTextStore.end(); ++itr) - { if (itr->second.NextPageID) - { - PageTextContainer::const_iterator itr2 = _pageTextStore.find(itr->second.NextPageID); - if (itr2 == _pageTextStore.end()) + if (_pageTextStore.find(itr->second.NextPageID) == _pageTextStore.end()) TC_LOG_ERROR("sql.sql", "Page text (ID: %u) has non-existing `NextPageID` (%u)", itr->first, itr->second.NextPageID); - } - } - TC_LOG_INFO("server.loading", ">> Loaded %u page texts in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } @@ -5276,7 +5296,7 @@ void ObjectMgr::LoadInstanceEncounters() } uint32 count = 0; - std::map<uint32, DungeonEncounterEntry const*> dungeonLastBosses; + std::map<uint32, std::pair<uint32, DungeonEncounterEntry const*>> dungeonLastBosses; do { Field* fields = result->Fetch(); @@ -5293,20 +5313,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<uint32, DungeonEncounterEntry const*>::const_iterator itr = dungeonLastBosses.find(lastEncounterDungeon); + std::map<uint32, std::pair<uint32, DungeonEncounterEntry const*>>::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) @@ -5316,7 +5338,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<CreatureTemplate*>(creatureInfo)->flags_extra |= CREATURE_FLAG_EXTRA_DUNGEON_BOSS; @@ -5325,12 +5348,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; } @@ -5338,7 +5363,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)); @@ -6231,7 +6256,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; @@ -6736,7 +6761,7 @@ void ObjectMgr::LoadGameObjectTemplate() TC_LOG_ERROR("sql.sql", "GameObject (Entry: %u GoType: %u) have data0=%u but TaxiPath (Id: %u) not exist.", entry, got.type, got.moTransport.taxiPathID, got.moTransport.taxiPathID); } - if (uint32 transportMap = got.moTransport.mapID) + if (uint32 transportMap = got.moTransport.SpawnMap) _transportMaps.insert(transportMap); break; } @@ -6779,7 +6804,7 @@ void ObjectMgr::LoadGameObjectTemplate() } break; case GAMEOBJECT_TYPE_GARRISON_BUILDING: - if (uint32 transportMap = got.garrisonBuilding.mapID) + if (uint32 transportMap = got.garrisonBuilding.SpawnMap) _transportMaps.insert(transportMap); break; } @@ -6886,7 +6911,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 @@ -7892,7 +7917,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) @@ -8703,25 +8728,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[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); @@ -9030,8 +9042,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/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 31eff02b3dc..1d76813cbab 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -56,6 +56,8 @@ struct PageText { std::string Text; uint32 NextPageID; + int32 PlayerConditionID; + uint8 Flags; }; /// Key for storing temp summon data in TempSummonDataContainer @@ -762,7 +764,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 43763631b0b..594284d8fc8 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1608,7 +1608,7 @@ void Group::SendUpdateToPlayer(ObjectGuid playerGUID, MemberSlot* slot) Player* member = ObjectAccessor::FindConnectedPlayer(citr->guid); - WorldPackets::Party::GroupPlayerInfos playerInfos; + WorldPackets::Party::PartyPlayerInfo playerInfos; playerInfos.GUID = citr->guid; playerInfos.Name = citr->name; @@ -1668,7 +1668,7 @@ void Group::UpdatePlayerOutOfRange(Player* player) if (!player || !player->IsInWorld()) return; - WorldPackets::Party::PartyMemberStats packet; + WorldPackets::Party::PartyMemberState packet; packet.Initialize(player); Player* member; @@ -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 @@ -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/Group.h b/src/server/game/Groups/Group.h index 3c75bf6739f..a417138a2b2 100644 --- a/src/server/game/Groups/Group.h +++ b/src/server/game/Groups/Group.h @@ -68,7 +68,9 @@ enum GroupMemberOnlineStatus MEMBER_STATUS_PVP_FFA = 0x0010, // Lua_UnitIsPVPFreeForAll MEMBER_STATUS_UNK3 = 0x0020, // used in calls from Lua_GetPlayerMapPosition/Lua_GetBattlefieldFlagPosition MEMBER_STATUS_AFK = 0x0040, // Lua_UnitIsAFK - MEMBER_STATUS_DND = 0x0080 // Lua_UnitIsDND + MEMBER_STATUS_DND = 0x0080, // Lua_UnitIsDND + MEMBER_STATUS_RAF = 0x0100, + MEMBER_STATUS_VEHICLE = 0x0200, // Lua_UnitInVehicle }; enum GroupMemberFlags diff --git a/src/server/game/Groups/GroupMgr.cpp b/src/server/game/Groups/GroupMgr.cpp index dce3102fe3e..fc191e79532 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 86a59f04f23..5140b74547b 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) @@ -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); @@ -2395,7 +2394,7 @@ void Guild::LoadBankTabFromDB(Field* fields) bool Guild::LoadBankItemFromDB(Field* fields) { - uint8 tabId = fields[22].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.", @@ -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()); @@ -3216,21 +3214,17 @@ void Guild::_SendBankContentUpdate(uint8 tabId, SlotIds slots) const if (tabItem) { - uint32 enchants = 0; - for (uint32 ench = 0; ench < MAX_ENCHANTMENT_SLOT; ++ench) - if (tabItem->GetEnchantmentId(EnchantmentSlot(ench))) - ++enchants; - - itemInfo.SocketEnchant.reserve(enchants); - for (uint32 ench = 0; ench < MAX_ENCHANTMENT_SLOT; ++ench) + uint8 i = 0; + for (ItemDynamicFieldGems const& gemData : tabItem->GetGems()) { - if (uint32 enchantId = tabItem->GetEnchantmentId(EnchantmentSlot(ench))) + if (gemData.ItemId) { - WorldPackets::Guild::GuildBankItemInfo::GuildBankSocketEnchant socketEnchant; - socketEnchant.SocketEnchantID = int32(enchantId); - socketEnchant.SocketIndex = int32(ench); - itemInfo.SocketEnchant.push_back(socketEnchant); + WorldPackets::Item::ItemGemInstanceData gem; + gem.Slot = i; + gem.Item.Initialize(&gemData); + itemInfo.SocketEnchant.push_back(gem); } + ++i; } } @@ -3304,21 +3298,17 @@ void Guild::SendBankList(WorldSession* session, uint8 tabId, bool fullUpdate) co itemInfo.OnUseEnchantmentID = 0/*int32(tabItem->GetItemSuffixFactor())*/; itemInfo.Flags = 0; - uint32 enchants = 0; - for (uint32 ench = 0; ench < MAX_ENCHANTMENT_SLOT; ++ench) - if (tabItem->GetEnchantmentId(EnchantmentSlot(ench))) - ++enchants; - - itemInfo.SocketEnchant.reserve(enchants); - for (uint32 ench = 0; ench < MAX_ENCHANTMENT_SLOT; ++ench) + uint8 i = 0; + for (ItemDynamicFieldGems const& gemData : tabItem->GetGems()) { - if (uint32 enchantId = tabItem->GetEnchantmentId(EnchantmentSlot(ench))) + if (gemData.ItemId) { - WorldPackets::Guild::GuildBankItemInfo::GuildBankSocketEnchant socketEnchant; - socketEnchant.SocketEnchantID = int32(enchantId); - socketEnchant.SocketIndex = int32(ench); - itemInfo.SocketEnchant.push_back(socketEnchant); + 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/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/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index 6af809dcedb..bb65c6c00bd 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 - // battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, 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 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) @@ -417,7 +423,7 @@ void GuildMgr::LoadGuilds() do { Field* fields = result->Fetch(); - uint64 guildId = fields[21].GetUInt64(); + uint64 guildId = fields[38].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 7e3048f3d93..f25bbce20eb 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -54,7 +54,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; @@ -138,7 +138,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()); @@ -614,10 +615,8 @@ void WorldSession::HandleAuctionListItems(WorldPackets::AuctionHouse::AuctionLis AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->getFaction()); - TC_LOG_DEBUG("auctionHouse", "Auctionhouse search (%s), searchedname: %s, levelmin: %u, levelmax: %u, auctionSlotID: %u, auctionMainCategory: %u, auctionSubCategory: %u, quality: %u, usable: %u", - packet.Auctioneer.ToString().c_str(), packet.Name.c_str(), packet.MinLevel, packet.MaxLevel , packet.InvType, packet.ItemClass, packet.ItemSubclass, packet.Quality, packet.OnlyUsable); - - WorldPackets::AuctionHouse::AuctionListItemsResult result; + TC_LOG_DEBUG("auctionHouse", "Auctionhouse search (%s), searchedname: %s, levelmin: %u, levelmax: %u, quality: %u, usable: %u", + packet.Auctioneer.ToString().c_str(), packet.Name.c_str(), packet.MinLevel, packet.MaxLevel , packet.Quality, packet.OnlyUsable); // converting string that we try to find to lower case std::wstring wsearchedname; @@ -626,9 +625,29 @@ void WorldSession::HandleAuctionListItems(WorldPackets::AuctionHouse::AuctionLis wstrToLower(wsearchedname); - auctionHouse->BuildListAuctionItems(result, _player, - wsearchedname, packet.Offset, packet.MinLevel, packet.MaxLevel, packet.OnlyUsable, - packet.InvType, packet.ItemClass, packet.ItemSubclass, packet.Quality, result.TotalCount); + Optional<AuctionSearchFilters> filters; + + WorldPackets::AuctionHouse::AuctionListItemsResult result; + if (packet.ClassFilters.empty()) + { + filters = boost::in_place(); + + for (auto const& classFilter : packet.ClassFilters) + { + if (!classFilter.SubClassFilters.empty()) + { + for (auto const& subClassFilter : classFilter.SubClassFilters) + { + filters->Classes[classFilter.ItemClass].SubclassMask |= 1 << subClassFilter.ItemSubclass; + filters->Classes[classFilter.ItemClass].InvTypes[subClassFilter.ItemSubclass] = subClassFilter.InvTypeMask; + } + } + else + filters->Classes[classFilter.ItemClass].SubclassMask = AuctionSearchFilters::FILTER_SKIP_SUBCLASS; + } + } + + auctionHouse->BuildListAuctionItems(result, _player, wsearchedname, packet.Offset, packet.MinLevel, packet.MaxLevel, packet.OnlyUsable, filters, packet.Quality); result.DesiredDelay = sWorld->getIntConfig(CONFIG_AUCTION_SEARCH_DELAY); result.OnlyUsable = packet.OnlyUsable; 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/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp index 71e469b23c3..308a40206a4 100644 --- a/src/server/game/Handlers/CalendarHandler.cpp +++ b/src/server/game/Handlers/CalendarHandler.cpp @@ -54,8 +54,6 @@ void WorldSession::HandleCalendarGetCalendar(WorldPackets::Calendar::CalendarGet time_t currTime = time(NULL); WorldPackets::Calendar::CalendarSendCalendar packet; - packet.ServerNow = currTime; - packet.RaidOrigin = 1135753200; // Constant date, unk (28.12.2005 07:00) packet.ServerTime = currTime; CalendarInviteStore playerInvites = sCalendarMgr->GetPlayerInvites(guid); @@ -110,27 +108,6 @@ void WorldSession::HandleCalendarGetCalendar(WorldPackets::Calendar::CalendarGet } } - std::set<uint32> sentMaps; - ResetTimeByMapDifficultyMap const& resets = sInstanceSaveMgr->GetResetTimeMap(); - for (auto const& reset : resets) - { - uint32 mapID = PAIR64_LOPART(reset.first); - if (sentMaps.find(mapID) != sentMaps.end()) - continue; - - MapEntry const* mapEntry = sMapStore.LookupEntry(mapID); - if (!mapEntry || !mapEntry->IsRaid()) - continue; - - sentMaps.insert(mapID); - WorldPackets::Calendar::CalendarSendCalendarRaidResetInfo resetInfo; - resetInfo.MapID = mapID; - resetInfo.Duration = reset.second - currTime; - resetInfo.Offset = 0; // Never seen anything else in sniffs - still unknown - - packet.RaidResets.push_back(resetInfo); - } - SendPacket(packet.Write()); } diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index f7f198809aa..2278e001aba 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -191,6 +191,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); @@ -199,10 +203,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); @@ -267,6 +267,8 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result) WorldPackets::Character::EnumCharactersResult charEnum; charEnum.Success = true; charEnum.IsDeletedCharacters = false; + charEnum.IsDemonHunterCreationAllowed = true; + charEnum.DisabledClassesMask = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK); _legitCharacters.clear(); @@ -279,7 +281,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()); @@ -300,6 +302,9 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result) if (!sWorld->HasCharacterInfo(charInfo.Guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet. sWorld->AddCharacterInfo(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.Sex, charInfo.Race, charInfo.Class, charInfo.Level, false); + if (charInfo.Class == CLASS_DEMON_HUNTER) + charEnum.HasDemonHunterOnRealm = true; + charEnum.Characters.emplace_back(charInfo); } while (result->NextRow()); @@ -333,6 +338,7 @@ void WorldSession::HandleCharUndeleteEnum(PreparedQueryResult result) WorldPackets::Character::EnumCharactersResult charEnum; charEnum.Success = true; charEnum.IsDeletedCharacters = true; + charEnum.DisabledClassesMask = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK); if (result) { @@ -1253,22 +1259,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)) @@ -1437,12 +1427,25 @@ void WorldSession::HandleAlterAppearance(WorldPackets::Character::AlterApperance if (bs_face && (bs_face->Type != 4 || bs_face->Race != _player->getRace() || bs_face->Sex != _player->GetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_GENDER))) return; + std::array<BarberShopStyleEntry const*, PLAYER_CUSTOM_DISPLAY_SIZE> customDisplayEntries; + std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> customDisplay; + for (std::size_t i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) + { + BarberShopStyleEntry const* bs_customDisplay = sBarberShopStyleStore.LookupEntry(packet.NewCustomDisplay[i]); + if (bs_customDisplay && (bs_customDisplay->Type != 5 + i || bs_customDisplay->Race != _player->getRace() || bs_customDisplay->Sex != _player->GetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_GENDER))) + return; + + customDisplayEntries[i] = bs_customDisplay; + customDisplay[i] = bs_customDisplay->Data; + } + if (!Player::ValidateAppearance(_player->getRace(), _player->getClass(), _player->GetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_GENDER), bs_hair->Data, 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), + customDisplay)) return; GameObject* go = _player->FindNearestGameObjectOfType(GAMEOBJECT_TYPE_BARBER_CHAIR, 5.0f); @@ -1458,7 +1461,7 @@ void WorldSession::HandleAlterAppearance(WorldPackets::Character::AlterApperance return; } - uint32 cost = _player->GetBarberShopCost(bs_hair, packet.NewHairColor, bs_facialHair, bs_skinColor, bs_face); + uint32 cost = _player->GetBarberShopCost(bs_hair, packet.NewHairColor, bs_facialHair, bs_skinColor, bs_face, customDisplayEntries); // 0 - ok // 1, 3 - not enough money @@ -1487,28 +1490,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)) @@ -1544,7 +1525,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)) { SendCharCustomize(CHAR_CREATE_ERROR, customizeInfo); return; @@ -1606,7 +1588,10 @@ void WorldSession::HandleCharCustomizeCallback(PreparedQueryResult result, World stmt->setUInt8(3, customizeInfo->HairStyleID); stmt->setUInt8(4, customizeInfo->HairColorID); stmt->setUInt8(5, customizeInfo->FacialHairStyleID); - stmt->setUInt64(6, lowGuid); + stmt->setUInt8(6, customizeInfo->CustomDisplay[0]); + stmt->setUInt8(7, customizeInfo->CustomDisplay[1]); + stmt->setUInt8(8, customizeInfo->CustomDisplay[2]); + stmt->setUInt64(9, lowGuid); trans->Append(stmt); } @@ -1641,29 +1626,86 @@ 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]) + { + if (!sItemModifiedAppearanceStore.LookupEntry(saveEquipmentSet.Set.Appearances[i])) + return; + + bool hasAppearance, isTemporary; + std::tie(hasAppearance, isTemporary) = GetCollectionMgr()->HasItemAppearance(saveEquipmentSet.Set.Appearances[i]); + if (!hasAppearance) + return; + } + } } 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; + } + 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; - _player->SetEquipmentSet(std::move(saveEquipmentSet.Set)); + if (saveEquipmentSet.Set.Enchants[1] && !validateIllusion(saveEquipmentSet.Set.Enchants[1])) + return; + } + + _player->SetEquipmentSet(saveEquipmentSet.Set); } void WorldSession::HandleDeleteEquipmentSet(WorldPackets::EquipmentSet::DeleteEquipmentSet& deleteEquipmentSet) @@ -1866,29 +1908,17 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(PreparedQueryResult res // Customize { - if (!factionChangeInfo->SkinID) - factionChangeInfo->SkinID = fields[2].GetUInt8(); - - if (!factionChangeInfo->FaceID) - factionChangeInfo->FaceID = fields[3].GetUInt8(); - - if (!factionChangeInfo->HairStyleID) - factionChangeInfo->HairStyleID = fields[4].GetUInt8(); - - if (!factionChangeInfo->HairColorID) - factionChangeInfo->HairColorID = fields[5].GetUInt8(); - - if (!factionChangeInfo->FacialHairStyleID) - factionChangeInfo->FacialHairStyleID = fields[6].GetUInt8(); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GENDER_AND_APPEARANCE); stmt->setUInt8(0, factionChangeInfo->SexID); - stmt->setUInt8(1, *factionChangeInfo->SkinID); - stmt->setUInt8(2, *factionChangeInfo->FaceID); - stmt->setUInt8(3, *factionChangeInfo->HairStyleID); - stmt->setUInt8(4, *factionChangeInfo->HairColorID); - stmt->setUInt8(5, *factionChangeInfo->FacialHairStyleID); - stmt->setUInt64(6, lowGuid); + stmt->setUInt8(1, factionChangeInfo->SkinID); + stmt->setUInt8(2, factionChangeInfo->FaceID); + stmt->setUInt8(3, factionChangeInfo->HairStyleID); + stmt->setUInt8(4, factionChangeInfo->HairColorID); + stmt->setUInt8(5, factionChangeInfo->FacialHairStyleID); + stmt->setUInt8(6, factionChangeInfo->CustomDisplay[0]); + stmt->setUInt8(7, factionChangeInfo->CustomDisplay[1]); + stmt->setUInt8(8, factionChangeInfo->CustomDisplay[2]); + stmt->setUInt64(9, lowGuid); trans->Append(stmt); } @@ -2544,12 +2574,13 @@ void WorldSession::SendCharFactionChange(ResponseCodes result, WorldPackets::Cha packet.Display = boost::in_place(); packet.Display->Name = factionChangeInfo->Name; packet.Display->SexID = factionChangeInfo->SexID; - packet.Display->SkinID = *factionChangeInfo->SkinID; - packet.Display->HairColorID = *factionChangeInfo->HairColorID; - packet.Display->HairStyleID = *factionChangeInfo->HairStyleID; - packet.Display->FacialHairStyleID = *factionChangeInfo->FacialHairStyleID; - packet.Display->FaceID = *factionChangeInfo->FaceID; + packet.Display->SkinID = factionChangeInfo->SkinID; + packet.Display->HairColorID = factionChangeInfo->HairColorID; + packet.Display->HairStyleID = factionChangeInfo->HairStyleID; + packet.Display->FacialHairStyleID = factionChangeInfo->FacialHairStyleID; + packet.Display->FaceID = factionChangeInfo->FaceID; packet.Display->RaceID = factionChangeInfo->RaceID; + packet.Display->CustomDisplay = factionChangeInfo->CustomDisplay; } SendPacket(packet.Write()); 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/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 097a1979400..89c41496827 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -561,12 +561,12 @@ void WorldSession::HandleReadyCheckResponseOpcode(WorldPackets::Party::ReadyChec void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPackets::Party::RequestPartyMemberStats& packet) { - WorldPackets::Party::PartyMemberStats partyMemberStats; + WorldPackets::Party::PartyMemberState partyMemberStats; Player* player = ObjectAccessor::FindConnectedPlayer(packet.TargetGUID); if (!player) { - partyMemberStats.MemberStats.GUID = packet.TargetGUID; + partyMemberStats.MemberGuid = packet.TargetGUID; partyMemberStats.MemberStats.Status = MEMBER_STATUS_OFFLINE; } else diff --git a/src/server/game/Handlers/InspectHandler.cpp b/src/server/game/Handlers/InspectHandler.cpp index 3ffde3dc3e3..02746109348 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())) @@ -72,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/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 6eab4072491..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(); } @@ -872,22 +908,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) @@ -901,65 +953,46 @@ 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; - } - - uint32 GemEnchants[MAX_GEM_SOCKETS]; - uint32 OldEnchants[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)); + // Gem must match socket color + if (SocketColorToGemTypeMask[itemTarget->GetSocketColor(i)] != gemProperties[i]->Type) + { + // unless its red, blue, yellow or prismatic + if (!(SocketColorToGemTypeMask[itemTarget->GetSocketColor(i)] & SOCKET_COLOR_PRISMATIC) || !(gemProperties[i]->Type & SOCKET_COLOR_PRISMATIC)) + return; + } } // 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 (OldEnchants[j]) + else if (oldGemData[j]) { - if (SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(OldEnchants[j])) + if (iGemProto->GetId() == oldGemData[j]->ItemId) { - 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; } } } @@ -974,19 +1007,18 @@ 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 (OldEnchants[j]) + else if (oldGemData[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(oldGemData[j]->ItemId)) + if (iGemProto->GetItemLimitCategory() == jProto->GetItemLimitCategory()) + ++limit_newcount; } } @@ -1001,7 +1033,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; @@ -1018,16 +1050,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); - for (int i = 0; i < MAX_GEM_SOCKETS; ++i) + for (uint16 i = 0; i < MAX_GEM_SOCKETS; ++i) { - if (GemEnchants[i]) + if (gems[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->SetGem(i, &gemData[i]); + + 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(gems[i], gemCount, true); } } @@ -1099,164 +1132,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<Item*, Item*> transmogItems; - std::unordered_map<Item*, std::pair<VoidStorageItem*, BonusData>> transmogVoidItems; - std::vector<Item*> 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<VoidStorageItem*, BonusData>& 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. @@ -1281,15 +1156,20 @@ 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->UpdateCriteria(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..e86b304b554 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" @@ -636,7 +635,7 @@ void WorldSession::HandleMailCreateTextItem(WorldPackets::Mail::MailCreateTextIt if (m->messageType == MAIL_NORMAL) bodyItem->SetGuidValue(ITEM_FIELD_CREATOR, ObjectGuid::Create<HighGuid::Player>(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); diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index be271c2c73d..ab8bcc8e03a 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) @@ -576,7 +576,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 d8943099a93..9e11c044f3e 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -176,9 +176,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)) { @@ -392,7 +392,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/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 84b89968dfb..416ff57a6ab 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -380,7 +380,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe else { if (pet->isPossessed() || pet->IsVehicle()) /// @todo: confirm this check - Spell::SendCastResult(GetPlayer(), spellInfo, 0, result); + Spell::SendCastResult(GetPlayer(), spellInfo, spell->m_SpellVisual, spell->m_castId, result); else spell->SendPetCastResult(result); @@ -676,7 +676,6 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPackets::Spells::PetCastSpell& caster->ClearUnitState(UNIT_STATE_FOLLOW); Spell* spell = new Spell(caster, spellInfo, TRIGGERED_NONE); - spell->m_cast_count = petCastSpell.Cast.CastID; spell->m_misc.Raw.Data[0] = petCastSpell.Cast.Misc[0]; spell->m_misc.Raw.Data[1] = petCastSpell.Cast.Misc[1]; spell->m_targets = targets; @@ -697,6 +696,11 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPackets::Spells::PetCastSpell& } } + WorldPackets::Spells::SpellPrepare spellPrepare; + spellPrepare.ClientCastID = petCastSpell.Cast.CastID; + spellPrepare.ServerCastID = spell->m_castId; + SendPacket(spellPrepare.Write()); + spell->prepare(&targets); } else @@ -721,37 +725,3 @@ void WorldSession::SendPetNameInvalid(uint32 error, const std::string& name, Dec SendPacket(petNameInvalid.Write()); } - -void WorldSession::HandlePetSetSpecializationOpcode(WorldPackets::Pet::LearnPetSpecializationGroup& learnPetSpecializationGroup) -{ - if (!_player->IsInWorld()) - return; - - Pet* pet = ObjectAccessor::GetPet(*_player, learnPetSpecializationGroup.PetGUID); - - if (!pet || !pet->IsPet() || ((Pet*)pet)->getPetType() != HUNTER_PET || - pet->GetOwnerGUID() != _player->GetGUID() || !pet->GetCharmInfo()) - return; - - if (learnPetSpecializationGroup.SpecGroupIndex >= MAX_SPECIALIZATIONS) - { - TC_LOG_DEBUG("network", "WORLD: HandlePetSetSpecializationOpcode - specialization index %u out of range", learnPetSpecializationGroup.SpecGroupIndex); - return; - } - - uint32 specIndex = _player->HasAuraType(SPELL_AURA_OVERRIDE_PET_SPECS) ? PET_SPEC_OVERRIDE_CLASS_INDEX : 0; - ChrSpecializationEntry const* petSpec = sChrSpecializationByIndexStore[specIndex][learnPetSpecializationGroup.SpecGroupIndex]; - if (!petSpec) - { - TC_LOG_DEBUG("network", "WORLD: HandlePetSetSpecializationOpcode - specialization index %u not found", learnPetSpecializationGroup.SpecGroupIndex); - return; - } - - if (_player->getLevel() < MIN_SPECIALIZATION_LEVEL) - { - TC_LOG_DEBUG("network", "WORLD: HandlePetSetSpecializationOpcode - player level too low for specializations"); - return; - } - - pet->SetSpecialization(petSpec->ID); -} diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index 85ac5af064c..c493c58ec0c 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -57,7 +57,6 @@ void WorldSession::SendQueryTimeResponse() { WorldPackets::Query::QueryTimeResponse queryTimeResponse; queryTimeResponse.CurrentTime = time(nullptr); - queryTimeResponse.TimeOutRequest = sWorld->GetNextDailyQuestsResetTime() - queryTimeResponse.CurrentTime; SendPacket(queryTimeResponse.Write()); } @@ -128,7 +127,6 @@ void WorldSession::HandleCreatureQuery(WorldPackets::Query::QueryCreature& packe void WorldSession::HandleGameObjectQueryOpcode(WorldPackets::Query::QueryGameObject& packet) { WorldPackets::Query::QueryGameObjectResponse response; - response.GameObjectID = packet.GameObjectID; if (GameObjectTemplate const* gameObjectInfo = sObjectMgr->GetGameObjectTemplate(packet.GameObjectID)) @@ -156,19 +154,20 @@ void WorldSession::HandleGameObjectQueryOpcode(WorldPackets::Query::QueryGameObj stats.Size = gameObjectInfo->size; if (GameObjectQuestItemList const* items = sObjectMgr->GetGameObjectQuestItemList(packet.GameObjectID)) - for (uint32 item : *items) + for (int32 item : *items) stats.QuestItems.push_back(item); - for (uint32 i = 0; i < MAX_GAMEOBJECT_DATA; i++) - stats.Data[i] = gameObjectInfo->raw.data[i]; + memcpy(stats.Data, gameObjectInfo->raw.data, MAX_GAMEOBJECT_DATA * sizeof(int32)); + stats.Expansion = gameObjectInfo->unkInt32; } SendPacket(response.Write()); } -void WorldSession::HandleQueryCorpseLocation(WorldPackets::Query::QueryCorpseLocationFromClient& /*packet*/) +void WorldSession::HandleQueryCorpseLocation(WorldPackets::Query::QueryCorpseLocationFromClient& queryCorpseLocation) { - if (!_player->HasCorpse()) + Player* player = ObjectAccessor::FindConnectedPlayer(queryCorpseLocation.Player); + if (!player || !player->HasCorpse() || !_player->IsInSameRaidWith(player)) { WorldPackets::Query::CorpseLocation packet; packet.Valid = false; // corpse not found @@ -176,7 +175,7 @@ void WorldSession::HandleQueryCorpseLocation(WorldPackets::Query::QueryCorpseLoc return; } - WorldLocation corpseLocation = _player->GetCorpseLocation(); + WorldLocation corpseLocation = player->GetCorpseLocation(); uint32 corpseMapID = corpseLocation.GetMapId(); uint32 mapID = corpseLocation.GetMapId(); float x = corpseLocation.GetPositionX(); @@ -184,7 +183,7 @@ void WorldSession::HandleQueryCorpseLocation(WorldPackets::Query::QueryCorpseLoc float z = corpseLocation.GetPositionZ(); // if corpse at different map - if (mapID != _player->GetMapId()) + if (mapID != player->GetMapId()) { // search entrance map for proper show entrance if (MapEntry const* corpseMapEntry = sMapStore.LookupEntry(mapID)) @@ -197,7 +196,7 @@ void WorldSession::HandleQueryCorpseLocation(WorldPackets::Query::QueryCorpseLoc mapID = corpseMapEntry->CorpseMapID; x = corpseMapEntry->CorpsePos.X; y = corpseMapEntry->CorpsePos.Y; - z = entranceMap->GetHeight(GetPlayer()->GetPhaseMask(), x, y, MAX_HEIGHT); + z = entranceMap->GetHeight(player->GetPhaseMask(), x, y, MAX_HEIGHT); } } } @@ -205,6 +204,7 @@ void WorldSession::HandleQueryCorpseLocation(WorldPackets::Query::QueryCorpseLoc WorldPackets::Query::CorpseLocation packet; packet.Valid = true; + packet.Player = queryCorpseLocation.Player; packet.MapID = corpseMapID; packet.ActualMapID = mapID; packet.Position = G3D::Vector3(x, y, z); @@ -243,55 +243,49 @@ void WorldSession::HandleNpcTextQueryOpcode(WorldPackets::Query::QueryNPCText& p /// Only _static_ data is sent in this packet !!! void WorldSession::HandleQueryPageText(WorldPackets::Query::QueryPageText& packet) { - uint32 pageID = packet.PageTextID; + WorldPackets::Query::QueryPageTextResponse response; + response.PageTextID = packet.PageTextID; + uint32 pageID = packet.PageTextID; while (pageID) { PageText const* pageText = sObjectMgr->GetPageText(pageID); - - WorldPackets::Query::QueryPageTextResponse response; - response.PageTextID = pageID; - if (!pageText) - { - response.Allow = false; - pageID = 0; - } - else - { - response.Allow = true; - response.Info.ID = pageID; - response.Info.NextPageID = pageText->NextPageID; - response.Info.Text = pageText->Text; - - LocaleConstant localeConstant = GetSessionDbLocaleIndex(); - if (localeConstant >= LOCALE_enUS) - if (PageTextLocale const* pageTextLocale = sObjectMgr->GetPageTextLocale(pageID)) - ObjectMgr::GetLocaleString(pageTextLocale->Text, localeConstant, response.Info.Text); - - pageID = pageText->NextPageID; - } + break; + + WorldPackets::Query::QueryPageTextResponse::PageTextInfo page; + page.ID = pageID; + page.NextPageID = pageText->NextPageID; + page.Text = pageText->Text; + page.PlayerConditionID = pageText->PlayerConditionID; + page.Flags = pageText->Flags; + + LocaleConstant locale = GetSessionDbLocaleIndex(); + if (locale >= LOCALE_enUS) + if (PageTextLocale const* pageTextLocale = sObjectMgr->GetPageTextLocale(pageID)) + ObjectMgr::GetLocaleString(pageTextLocale->Text, locale, page.Text); + + response.Pages.push_back(page); + pageID = pageText->NextPageID; + } - SendPacket(response.Write()); + response.Allow = !response.Pages.empty(); - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUERY_PAGE_TEXT_RESPONSE"); - } + SendPacket(response.Write()); } void WorldSession::HandleQueryCorpseTransport(WorldPackets::Query::QueryCorpseTransport& queryCorpseTransport) { - Corpse* corpse = _player->GetCorpse(); - WorldPackets::Query::CorpseTransportQuery response; - if (!corpse || corpse->GetTransGUID().IsEmpty() || corpse->GetTransGUID() != queryCorpseTransport.Transport) - { - response.Position = G3D::Vector3(0.0f, 0.0f, 0.0f); - response.Facing = 0.0f; - } - else + response.Player = queryCorpseTransport.Player; + if (Player* player = ObjectAccessor::FindConnectedPlayer(queryCorpseTransport.Player)) { - response.Position = G3D::Vector3(corpse->GetTransOffsetX(), corpse->GetTransOffsetY(), corpse->GetTransOffsetZ()); - response.Facing = corpse->GetTransOffsetO(); + Corpse* corpse = player->GetCorpse(); + if (_player->IsInSameRaidWith(player) && corpse && !corpse->GetTransGUID().IsEmpty() && corpse->GetTransGUID() == queryCorpseTransport.Transport) + { + response.Position = G3D::Vector3(corpse->GetTransOffsetX(), corpse->GetTransOffsetY(), corpse->GetTransOffsetZ()); + response.Facing = corpse->GetTransOffsetO(); + } } SendPacket(response.Write()); 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/SkillHandler.cpp b/src/server/game/Handlers/SkillHandler.cpp index 2060468a41a..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(); @@ -71,42 +84,9 @@ 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; 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 = sChrSpecializationByIndexStore[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/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 45ce6399c24..184de15af09 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -17,9 +17,9 @@ */ #include "WorldSession.h" +#include "CollectionMgr.h" #include "Common.h" #include "Config.h" -#include "DBCStores.h" #include "GameObjectAI.h" #include "GameObjectPackets.h" #include "GuildMgr.h" @@ -112,13 +112,14 @@ void WorldSession::HandleUseItemOpcode(WorldPackets::Spells::UseItem& packet) { item->SetState(ITEM_CHANGED, user); item->SetBinding(true); + GetCollectionMgr()->AddItemAppearance(item); } } SpellCastTargets targets(user, packet.Cast); // Note: If script stop casting it must send appropriate data to client to prevent stuck item in gray state. - if (!sScriptMgr->OnItemUse(user, item, targets)) + if (!sScriptMgr->OnItemUse(user, item, targets, packet.Cast.CastID)) { // no script or script not process request by self user->CastItemUseSpell(item, targets, packet.Cast.CastID, packet.Cast.Misc); @@ -301,7 +302,12 @@ void WorldSession::HandleCastSpellOpcode(WorldPackets::Spells::CastSpell& cast) } Spell* spell = new Spell(caster, spellInfo, TRIGGERED_NONE, ObjectGuid::Empty, false); - spell->m_cast_count = cast.Cast.CastID; // set count of casts + + WorldPackets::Spells::SpellPrepare spellPrepare; + spellPrepare.ClientCastID = cast.Cast.CastID; + spellPrepare.ServerCastID = spell->m_castId; + SendPacket(spellPrepare.Write()); + spell->m_misc.Raw.Data[0] = cast.Cast.Misc[0]; spell->m_misc.Raw.Data[1] = cast.Cast.Misc[1]; spell->prepare(&targets); @@ -510,6 +516,8 @@ void WorldSession::HandleMirrorImageDataRequest(WorldPackets::Spells::GetMirrorI mirrorImageComponentedData.HairVariation = player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_STYLE_ID); mirrorImageComponentedData.HairColor = player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_COLOR_ID); mirrorImageComponentedData.BeardVariation = player->GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_FACIAL_STYLE); + for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) + mirrorImageComponentedData.CustomDisplay[i] = player->GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_CUSTOM_DISPLAY_OPTION + i); mirrorImageComponentedData.GuildGUID = (guild ? guild->GetGUID() : ObjectGuid::Empty); mirrorImageComponentedData.ItemDisplayID.reserve(11); @@ -531,14 +539,14 @@ void WorldSession::HandleMirrorImageDataRequest(WorldPackets::Spells::GetMirrorI }; // Display items in visible slots - for (auto const& slot : itemSlots) + for (EquipmentSlots slot : itemSlots) { uint32 itemDisplayId; if ((slot == EQUIPMENT_SLOT_HEAD && player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM)) || (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/ToyHandler.cpp b/src/server/game/Handlers/ToyHandler.cpp index 27edf4905ad..2e894438bf6 100644 --- a/src/server/game/Handlers/ToyHandler.cpp +++ b/src/server/game/Handlers/ToyHandler.cpp @@ -75,8 +75,13 @@ void WorldSession::HandleUseToy(WorldPackets::Toy::UseToy& packet) SpellCastTargets targets(_player, packet.Cast); Spell* spell = new Spell(_player, spellInfo, TRIGGERED_NONE, ObjectGuid::Empty, false); + + WorldPackets::Spells::SpellPrepare spellPrepare; + spellPrepare.ClientCastID = packet.Cast.CastID; + spellPrepare.ServerCastID = spell->m_castId; + SendPacket(spellPrepare.Write()); + spell->m_castItemEntry = packet.ItemID; - spell->m_cast_count = packet.Cast.CastID; spell->m_misc.Raw.Data[0] = packet.Cast.Misc[0]; spell->m_misc.Raw.Data[1] = packet.Cast.Misc[1]; spell->m_castFlagsEx |= CAST_FLAG_EX_USE_TOY_SPELL; diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index c7e75300c99..ae263301fc9 100644 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -64,14 +64,13 @@ void WorldSession::SendUpdateTrade(bool trader_data /*= true*/) { WorldPackets::Trade::TradeUpdated::TradeItem tradeItem; tradeItem.Slot = i; - tradeItem.EntryID = item->GetEntry(); + tradeItem.Item.Initialize(item); tradeItem.StackCount = item->GetCount(); tradeItem.GiftCreator = item->GetGuidValue(ITEM_FIELD_GIFTCREATOR); if (!item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) { tradeItem.Unwrapped = boost::in_place(); - tradeItem.Unwrapped->Item.Initialize(item); tradeItem.Unwrapped->EnchantID = item->GetEnchantmentId(PERM_ENCHANTMENT_SLOT); tradeItem.Unwrapped->OnUseEnchantmentID = item->GetEnchantmentId(USE_ENCHANTMENT_SLOT); tradeItem.Unwrapped->Creator = item->GetGuidValue(ITEM_FIELD_CREATOR); @@ -80,8 +79,18 @@ void WorldSession::SendUpdateTrade(bool trader_data /*= true*/) tradeItem.Unwrapped->MaxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY); tradeItem.Unwrapped->Durability = item->GetUInt32Value(ITEM_FIELD_DURABILITY); - for (uint32 s = SOCK_ENCHANTMENT_SLOT; s < MAX_GEM_SOCKETS; ++s) - tradeItem.Unwrapped->SocketEnchant[s] = item->GetEnchantmentId(EnchantmentSlot(s + SOCK_ENCHANTMENT_SLOT)); + uint8 i = 0; + for (ItemDynamicFieldGems const& gemData : item->GetGems()) + { + if (gemData.ItemId) + { + WorldPackets::Item::ItemGemInstanceData gem; + gem.Slot = i; + gem.Item.Initialize(&gemData); + tradeItem.Unwrapped->Gems.push_back(gem); + } + ++i; + } } tradeUpdated.Items.push_back(tradeItem); 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 <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "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<Item*, uint32> transmogItems; + std::unordered_map<Item*, uint32> illusionItems; + + std::vector<Item*> resetAppearanceItems; + std::vector<Item*> resetIllusionItems; + std::vector<uint32> 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<ObjectGuid> 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/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/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<HighGuid::Item>(itemVS->ItemId)); diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index 9258977f7a8..4fa2682c7b6 100644 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -384,7 +384,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); @@ -403,7 +403,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; @@ -411,11 +411,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; @@ -455,15 +455,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; @@ -509,7 +509,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)); @@ -635,7 +635,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/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index 2b415bf9a66..9854e46f1cb 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -693,11 +693,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 3aabe686f58..abf20d1920a 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -1558,7 +1558,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 @@ -1587,10 +1587,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 (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 2e98dc59016..0a7138616e0 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) @@ -2405,7 +2405,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); @@ -2440,20 +2440,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); + wmoEntry = sDB2Manager.GetWMOAreaTable(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<Map*>(this)->GetGrid(x, y)) areaId = gmap->getArea(x, y); @@ -2653,7 +2653,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) @@ -3415,7 +3415,7 @@ void InstanceMap::SetResetSchedule(bool on) MapDifficultyEntry const* Map::GetMapDifficulty() const { - return GetMapDifficultyData(GetId(), GetDifficultyID()); + return sDB2Manager.GetMapDifficultyData(GetId(), GetDifficultyID()); } uint32 Map::GetDifficultyLootBonusTreeMod() const @@ -3430,6 +3430,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)) @@ -3437,6 +3467,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); @@ -3456,7 +3518,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 6a87a1e3246..89edf9823b7 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -21,7 +21,6 @@ #include "Define.h" -#include "DBCStructure.h" #include "GridDefines.h" #include "Cell.h" #include "Timer.h" @@ -36,24 +35,28 @@ #include <list> #include <memory> -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; } @@ -322,8 +325,7 @@ class TC_GAME_API Map : public GridRefManager<NGridType> 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); @@ -392,23 +394,19 @@ class TC_GAME_API Map : public GridRefManager<NGridType> 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 3acd04543ad..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; @@ -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/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 <G3D/Quat.h> #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/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index ce4be425140..05b8684a9ee 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 @@ -238,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) { @@ -253,16 +255,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 +729,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 +760,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 @@ -847,13 +851,9 @@ enum SpellAttr13 SPELL_ATTR13_UNK23 = 0x00800000 // 23 }; -#define MIN_TALENT_GROUP 0 -#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 // Custom values enum SpellClickUserTypes @@ -931,6 +931,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, @@ -1259,10 +1271,14 @@ enum SpellEffectName SPELL_EFFECT_249 = 249, SPELL_EFFECT_TAKE_SCREENSHOT = 250, // Serverside marker for selfie screenshot - achievement check SPELL_EFFECT_SET_GARRISON_CACHE_SIZE = 251, - TOTAL_SPELL_EFFECTS = 252, + SPELL_EFFECT_252 = 252, + SPELL_EFFECT_253 = 253, + SPELL_EFFECT_254 = 254, + SPELL_EFFECT_255 = 255, + TOTAL_SPELL_EFFECTS = 256, }; -enum SpellCastResult // 21355 +enum SpellCastResult { SPELL_FAILED_SUCCESS = 0, SPELL_FAILED_AFFECTING_COMBAT = 1, @@ -1316,51 +1332,51 @@ enum SpellCastResult // 21355 SPELL_FAILED_GARRISON_FOLLOWER_NOT_MAX_LEVEL = 49, SPELL_FAILED_GARRISON_FOLLOWER_HAS_ABILITY = 50, SPELL_FAILED_GARRISON_FOLLOWER_HAS_SINGLE_MISSION_ABILITY = 51, - SPELL_FAILED_GARRISON_MISSION_NOT_IN_PROGRESS = 52, - SPELL_FAILED_GARRISON_MISSION_COMPLETE = 53, - SPELL_FAILED_GARRISON_NO_MISSIONS_AVAILABLE = 54, - SPELL_FAILED_HIGHLEVEL = 55, - SPELL_FAILED_HUNGER_SATIATED = 56, - SPELL_FAILED_IMMUNE = 57, - SPELL_FAILED_INCORRECT_AREA = 58, - SPELL_FAILED_INTERRUPTED = 59, - SPELL_FAILED_INTERRUPTED_COMBAT = 60, - SPELL_FAILED_ITEM_ALREADY_ENCHANTED = 61, - SPELL_FAILED_ITEM_GONE = 62, - SPELL_FAILED_ITEM_NOT_FOUND = 63, - SPELL_FAILED_ITEM_NOT_READY = 64, - SPELL_FAILED_LEVEL_REQUIREMENT = 65, - SPELL_FAILED_LINE_OF_SIGHT = 66, - SPELL_FAILED_LOWLEVEL = 67, - SPELL_FAILED_LOW_CASTLEVEL = 68, - SPELL_FAILED_MAINHAND_EMPTY = 69, - SPELL_FAILED_MOVING = 70, - SPELL_FAILED_NEED_AMMO = 71, - SPELL_FAILED_NEED_AMMO_POUCH = 72, - SPELL_FAILED_NEED_EXOTIC_AMMO = 73, - SPELL_FAILED_NEED_MORE_ITEMS = 74, - SPELL_FAILED_NOPATH = 75, - SPELL_FAILED_NOT_BEHIND = 76, - SPELL_FAILED_NOT_FISHABLE = 77, - SPELL_FAILED_NOT_FLYING = 78, - SPELL_FAILED_NOT_HERE = 79, - SPELL_FAILED_NOT_INFRONT = 80, - SPELL_FAILED_NOT_IN_CONTROL = 81, - SPELL_FAILED_NOT_KNOWN = 82, - SPELL_FAILED_NOT_MOUNTED = 83, - SPELL_FAILED_NOT_ON_TAXI = 84, - SPELL_FAILED_NOT_ON_TRANSPORT = 85, - SPELL_FAILED_NOT_READY = 86, - SPELL_FAILED_NOT_SHAPESHIFT = 87, - SPELL_FAILED_NOT_STANDING = 88, - SPELL_FAILED_NOT_TRADEABLE = 89, - SPELL_FAILED_NOT_TRADING = 90, - SPELL_FAILED_NOT_UNSHEATHED = 91, - SPELL_FAILED_NOT_WHILE_GHOST = 92, - SPELL_FAILED_NOT_WHILE_LOOTING = 93, - SPELL_FAILED_NO_AMMO = 94, - SPELL_FAILED_NO_CHARGES_REMAIN = 95, - SPELL_FAILED_NO_CHAMPION = 96, + SPELL_FAILED_GARRISON_FOLLOWER_REQUIRES_EPIC = 52, + SPELL_FAILED_GARRISON_MISSION_NOT_IN_PROGRESS = 53, + SPELL_FAILED_GARRISON_MISSION_COMPLETE = 54, + SPELL_FAILED_GARRISON_NO_MISSIONS_AVAILABLE = 55, + SPELL_FAILED_HIGHLEVEL = 56, + SPELL_FAILED_HUNGER_SATIATED = 57, + SPELL_FAILED_IMMUNE = 58, + SPELL_FAILED_INCORRECT_AREA = 59, + SPELL_FAILED_INTERRUPTED = 60, + SPELL_FAILED_INTERRUPTED_COMBAT = 61, + SPELL_FAILED_ITEM_ALREADY_ENCHANTED = 62, + SPELL_FAILED_ITEM_GONE = 63, + SPELL_FAILED_ITEM_NOT_FOUND = 64, + SPELL_FAILED_ITEM_NOT_READY = 65, + SPELL_FAILED_LEVEL_REQUIREMENT = 66, + SPELL_FAILED_LINE_OF_SIGHT = 67, + SPELL_FAILED_LOWLEVEL = 68, + SPELL_FAILED_LOW_CASTLEVEL = 69, + SPELL_FAILED_MAINHAND_EMPTY = 70, + SPELL_FAILED_MOVING = 71, + SPELL_FAILED_NEED_AMMO = 72, + SPELL_FAILED_NEED_AMMO_POUCH = 73, + SPELL_FAILED_NEED_EXOTIC_AMMO = 74, + SPELL_FAILED_NEED_MORE_ITEMS = 75, + SPELL_FAILED_NOPATH = 76, + SPELL_FAILED_NOT_BEHIND = 77, + SPELL_FAILED_NOT_FISHABLE = 78, + SPELL_FAILED_NOT_FLYING = 79, + SPELL_FAILED_NOT_HERE = 80, + SPELL_FAILED_NOT_INFRONT = 81, + SPELL_FAILED_NOT_IN_CONTROL = 82, + SPELL_FAILED_NOT_KNOWN = 83, + SPELL_FAILED_NOT_MOUNTED = 84, + SPELL_FAILED_NOT_ON_TAXI = 85, + SPELL_FAILED_NOT_ON_TRANSPORT = 86, + SPELL_FAILED_NOT_READY = 87, + SPELL_FAILED_NOT_SHAPESHIFT = 88, + SPELL_FAILED_NOT_STANDING = 89, + SPELL_FAILED_NOT_TRADEABLE = 90, + SPELL_FAILED_NOT_TRADING = 91, + SPELL_FAILED_NOT_UNSHEATHED = 92, + SPELL_FAILED_NOT_WHILE_GHOST = 93, + SPELL_FAILED_NOT_WHILE_LOOTING = 94, + SPELL_FAILED_NO_AMMO = 95, + SPELL_FAILED_NO_CHARGES_REMAIN = 96, SPELL_FAILED_NO_COMBO_POINTS = 97, SPELL_FAILED_NO_DUELING = 98, SPELL_FAILED_NO_ENDURANCE = 99, @@ -1372,316 +1388,505 @@ enum SpellCastResult // 21355 SPELL_FAILED_NOTHING_TO_DISPEL = 105, SPELL_FAILED_NOTHING_TO_STEAL = 106, SPELL_FAILED_ONLY_ABOVEWATER = 107, - SPELL_FAILED_ONLY_DAYTIME = 108, - SPELL_FAILED_ONLY_INDOORS = 109, - SPELL_FAILED_ONLY_MOUNTED = 110, - SPELL_FAILED_ONLY_NIGHTTIME = 111, - SPELL_FAILED_ONLY_OUTDOORS = 112, - SPELL_FAILED_ONLY_SHAPESHIFT = 113, - SPELL_FAILED_ONLY_STEALTHED = 114, - SPELL_FAILED_ONLY_UNDERWATER = 115, - SPELL_FAILED_OUT_OF_RANGE = 116, - SPELL_FAILED_PACIFIED = 117, - SPELL_FAILED_POSSESSED = 118, - SPELL_FAILED_REAGENTS = 119, - SPELL_FAILED_REQUIRES_AREA = 120, - SPELL_FAILED_REQUIRES_SPELL_FOCUS = 121, - SPELL_FAILED_ROOTED = 122, - SPELL_FAILED_SILENCED = 123, - SPELL_FAILED_SPELL_IN_PROGRESS = 124, - SPELL_FAILED_SPELL_LEARNED = 125, - SPELL_FAILED_SPELL_UNAVAILABLE = 126, - SPELL_FAILED_STUNNED = 127, - SPELL_FAILED_TARGETS_DEAD = 128, - SPELL_FAILED_TARGET_AFFECTING_COMBAT = 129, - SPELL_FAILED_TARGET_AURASTATE = 130, - SPELL_FAILED_TARGET_DUELING = 131, - SPELL_FAILED_TARGET_ENEMY = 132, - SPELL_FAILED_TARGET_ENRAGED = 133, - SPELL_FAILED_TARGET_FRIENDLY = 134, - SPELL_FAILED_TARGET_IN_COMBAT = 135, - SPELL_FAILED_TARGET_IN_PET_BATTLE = 136, - SPELL_FAILED_TARGET_IS_PLAYER = 137, - SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED = 138, - SPELL_FAILED_TARGET_NOT_DEAD = 139, - SPELL_FAILED_TARGET_NOT_IN_PARTY = 140, - SPELL_FAILED_TARGET_NOT_LOOTED = 141, - SPELL_FAILED_TARGET_NOT_PLAYER = 142, - SPELL_FAILED_TARGET_NO_POCKETS = 143, - SPELL_FAILED_TARGET_NO_WEAPONS = 144, - SPELL_FAILED_TARGET_NO_RANGED_WEAPONS = 145, - SPELL_FAILED_TARGET_UNSKINNABLE = 146, - SPELL_FAILED_THIRST_SATIATED = 147, - SPELL_FAILED_TOO_CLOSE = 148, - SPELL_FAILED_TOO_MANY_OF_ITEM = 149, - SPELL_FAILED_TOTEM_CATEGORY = 150, - SPELL_FAILED_TOTEMS = 151, - SPELL_FAILED_TRY_AGAIN = 152, - SPELL_FAILED_UNIT_NOT_BEHIND = 153, - SPELL_FAILED_UNIT_NOT_INFRONT = 154, - SPELL_FAILED_VISION_OBSCURED = 155, - SPELL_FAILED_WRONG_PET_FOOD = 156, - SPELL_FAILED_NOT_WHILE_FATIGUED = 157, - SPELL_FAILED_TARGET_NOT_IN_INSTANCE = 158, - SPELL_FAILED_NOT_WHILE_TRADING = 159, - SPELL_FAILED_TARGET_NOT_IN_RAID = 160, - SPELL_FAILED_TARGET_FREEFORALL = 161, - SPELL_FAILED_NO_EDIBLE_CORPSES = 162, - SPELL_FAILED_ONLY_BATTLEGROUNDS = 163, - SPELL_FAILED_TARGET_NOT_GHOST = 164, - SPELL_FAILED_TRANSFORM_UNUSABLE = 165, - SPELL_FAILED_WRONG_WEATHER = 166, - SPELL_FAILED_DAMAGE_IMMUNE = 167, - SPELL_FAILED_PREVENTED_BY_MECHANIC = 168, - SPELL_FAILED_PLAY_TIME = 169, - SPELL_FAILED_REPUTATION = 170, - SPELL_FAILED_MIN_SKILL = 171, - SPELL_FAILED_NOT_IN_RATED_BATTLEGROUND = 172, - SPELL_FAILED_NOT_ON_SHAPESHIFT = 173, - SPELL_FAILED_NOT_ON_STEALTHED = 174, - SPELL_FAILED_NOT_ON_DAMAGE_IMMUNE = 175, - SPELL_FAILED_NOT_ON_MOUNTED = 176, - SPELL_FAILED_TOO_SHALLOW = 177, - SPELL_FAILED_TARGET_NOT_IN_SANCTUARY = 178, - SPELL_FAILED_TARGET_IS_TRIVIAL = 179, - SPELL_FAILED_BM_OR_INVISGOD = 180, - SPELL_FAILED_GROUND_MOUNT_NOT_ALLOWED = 181, - SPELL_FAILED_FLOATING_MOUNT_NOT_ALLOWED = 182, - SPELL_FAILED_UNDERWATER_MOUNT_NOT_ALLOWED = 183, - SPELL_FAILED_FLYING_MOUNT_NOT_ALLOWED = 184, - SPELL_FAILED_APPRENTICE_RIDING_REQUIREMENT = 185, - SPELL_FAILED_JOURNEYMAN_RIDING_REQUIREMENT = 186, - SPELL_FAILED_EXPERT_RIDING_REQUIREMENT = 187, - SPELL_FAILED_ARTISAN_RIDING_REQUIREMENT = 188, - SPELL_FAILED_MASTER_RIDING_REQUIREMENT = 189, - SPELL_FAILED_COLD_RIDING_REQUIREMENT = 190, - SPELL_FAILED_FLIGHT_MASTER_RIDING_REQUIREMENT = 191, - SPELL_FAILED_CS_RIDING_REQUIREMENT = 192, - SPELL_FAILED_PANDA_RIDING_REQUIREMENT = 193, - SPELL_FAILED_DRAENOR_RIDING_REQUIREMENT = 194, - SPELL_FAILED_MOUNT_NO_FLOAT_HERE = 195, - SPELL_FAILED_MOUNT_NO_UNDERWATER_HERE = 196, - SPELL_FAILED_MOUNT_ABOVE_WATER_HERE = 197, - SPELL_FAILED_MOUNT_COLLECTED_ON_OTHER_CHAR = 198, - SPELL_FAILED_NOT_IDLE = 199, - SPELL_FAILED_NOT_INACTIVE = 200, - SPELL_FAILED_PARTIAL_PLAYTIME = 201, - SPELL_FAILED_NO_PLAYTIME = 202, - SPELL_FAILED_NOT_IN_BATTLEGROUND = 203, - SPELL_FAILED_NOT_IN_RAID_INSTANCE = 204, - SPELL_FAILED_ONLY_IN_ARENA = 205, - SPELL_FAILED_TARGET_LOCKED_TO_RAID_INSTANCE = 206, - SPELL_FAILED_ON_USE_ENCHANT = 207, - SPELL_FAILED_NOT_ON_GROUND = 208, - SPELL_FAILED_CUSTOM_ERROR = 209, - SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW = 210, - SPELL_FAILED_TOO_MANY_SOCKETS = 211, - SPELL_FAILED_INVALID_GLYPH = 212, - SPELL_FAILED_UNIQUE_GLYPH = 213, - SPELL_FAILED_GLYPH_SOCKET_LOCKED = 214, - SPELL_FAILED_GLYPH_EXCLUSIVE_CATEGORY = 215, - SPELL_FAILED_GLYPH_INVALID_SPEC = 216, - SPELL_FAILED_GLYPH_NO_SPEC = 217, - SPELL_FAILED_NO_VALID_TARGETS = 218, - SPELL_FAILED_ITEM_AT_MAX_CHARGES = 219, - SPELL_FAILED_NOT_IN_BARBERSHOP = 220, - SPELL_FAILED_FISHING_TOO_LOW = 221, - SPELL_FAILED_ITEM_ENCHANT_TRADE_WINDOW = 222, - SPELL_FAILED_SUMMON_PENDING = 223, - SPELL_FAILED_MAX_SOCKETS = 224, - SPELL_FAILED_PET_CAN_RENAME = 225, - SPELL_FAILED_TARGET_CANNOT_BE_RESURRECTED = 226, - SPELL_FAILED_TARGET_HAS_RESURRECT_PENDING = 227, - SPELL_FAILED_NO_ACTIONS = 228, - SPELL_FAILED_CURRENCY_WEIGHT_MISMATCH = 229, - SPELL_FAILED_WEIGHT_NOT_ENOUGH = 230, - SPELL_FAILED_WEIGHT_TOO_MUCH = 231, - SPELL_FAILED_NO_VACANT_SEAT = 232, - SPELL_FAILED_NO_LIQUID = 233, - SPELL_FAILED_ONLY_NOT_SWIMMING = 234, - SPELL_FAILED_BY_NOT_MOVING = 235, - SPELL_FAILED_IN_COMBAT_RES_LIMIT_REACHED = 236, - SPELL_FAILED_NOT_IN_ARENA = 237, - SPELL_FAILED_TARGET_NOT_GROUNDED = 238, - SPELL_FAILED_EXCEEDED_WEEKLY_USAGE = 239, - SPELL_FAILED_NOT_IN_LFG_DUNGEON = 240, - SPELL_FAILED_BAD_TARGET_FILTER = 241, - SPELL_FAILED_NOT_ENOUGH_TARGETS = 242, - SPELL_FAILED_NO_SPEC = 243, - SPELL_FAILED_CANT_ADD_BATTLE_PET = 244, - SPELL_FAILED_CANT_UPGRADE_BATTLE_PET = 245, - SPELL_FAILED_WRONG_BATTLE_PET_TYPE = 246, - SPELL_FAILED_NO_DUNGEON_ENCOUNTER = 247, - SPELL_FAILED_NO_TELEPORT_FROM_DUNGEON = 248, - SPELL_FAILED_MAX_LEVEL_TOO_LOW = 249, - SPELL_FAILED_CANT_REPLACE_ITEM_BONUS = 250, - GRANT_PET_LEVEL_FAIL = 251, - SPELL_FAILED_SKILL_LINE_NOT_KNOWN = 252, - SPELL_FAILED_BLUEPRINT_KNOWN = 253, - SPELL_FAILED_FOLLOWER_KNOWN = 254, - SPELL_FAILED_CANT_OVERRIDE_ENCHANT_VISUAL = 255, - SPELL_FAILED_ITEM_NOT_A_WEAPON = 256, - SPELL_FAILED_SAME_ENCHANT_VISUAL = 257, - SPELL_FAILED_TOY_USE_LIMIT_REACHED = 258, - SPELL_FAILED_TOY_ALREADY_KNOWN = 259, - SPELL_FAILED_SHIPMENTS_FULL = 260, - SPELL_FAILED_NO_SHIPMENTS_FOR_CONTAINER = 261, - SPELL_FAILED_NO_BUILDING_FOR_SHIPMENT = 262, - SPELL_FAILED_NOT_ENOUGH_SHIPMENTS_FOR_CONTAINER = 263, - SPELL_FAILED_HAS_MISSION = 264, - SPELL_FAILED_BUILDING_ACTIVATE_NOT_READY = 265, - SPELL_FAILED_NOT_SOULBOUND = 266, - SPELL_FAILED_RIDING_VEHICLE = 267, - SPELL_FAILED_VETERAN_TRIAL_ABOVE_SKILL_RANK_MAX = 268, - SPELL_FAILED_NOT_WHILE_MERCENARY = 269, - SPELL_FAILED_UNKNOWN = 270, - SPELL_CAST_OK = 0xFFFF // custom value, must not be sent to client + SPELL_FAILED_ONLY_INDOORS = 108, + SPELL_FAILED_ONLY_MOUNTED = 109, + SPELL_FAILED_ONLY_OUTDOORS = 110, + SPELL_FAILED_ONLY_SHAPESHIFT = 111, + SPELL_FAILED_ONLY_STEALTHED = 112, + SPELL_FAILED_ONLY_UNDERWATER = 113, + SPELL_FAILED_OUT_OF_RANGE = 114, + SPELL_FAILED_PACIFIED = 115, + SPELL_FAILED_POSSESSED = 116, + SPELL_FAILED_REAGENTS = 117, + SPELL_FAILED_REQUIRES_AREA = 118, + SPELL_FAILED_REQUIRES_SPELL_FOCUS = 119, + SPELL_FAILED_ROOTED = 120, + SPELL_FAILED_SILENCED = 121, + SPELL_FAILED_SPELL_IN_PROGRESS = 122, + SPELL_FAILED_SPELL_LEARNED = 123, + SPELL_FAILED_SPELL_UNAVAILABLE = 124, + SPELL_FAILED_STUNNED = 125, + SPELL_FAILED_TARGETS_DEAD = 126, + SPELL_FAILED_TARGET_AFFECTING_COMBAT = 127, + SPELL_FAILED_TARGET_AURASTATE = 128, + SPELL_FAILED_TARGET_DUELING = 129, + SPELL_FAILED_TARGET_ENEMY = 130, + SPELL_FAILED_TARGET_ENRAGED = 131, + SPELL_FAILED_TARGET_FRIENDLY = 132, + SPELL_FAILED_TARGET_IN_COMBAT = 133, + SPELL_FAILED_TARGET_IN_PET_BATTLE = 134, + SPELL_FAILED_TARGET_IS_PLAYER = 135, + SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED = 136, + SPELL_FAILED_TARGET_NOT_DEAD = 137, + SPELL_FAILED_TARGET_NOT_IN_PARTY = 138, + SPELL_FAILED_TARGET_NOT_LOOTED = 139, + SPELL_FAILED_TARGET_NOT_PLAYER = 140, + SPELL_FAILED_TARGET_NO_POCKETS = 141, + SPELL_FAILED_TARGET_NO_WEAPONS = 142, + SPELL_FAILED_TARGET_NO_RANGED_WEAPONS = 143, + SPELL_FAILED_TARGET_UNSKINNABLE = 144, + SPELL_FAILED_THIRST_SATIATED = 145, + SPELL_FAILED_TOO_CLOSE = 146, + SPELL_FAILED_TOO_MANY_OF_ITEM = 147, + SPELL_FAILED_TOTEM_CATEGORY = 148, + SPELL_FAILED_TOTEMS = 149, + SPELL_FAILED_TRY_AGAIN = 150, + SPELL_FAILED_UNIT_NOT_BEHIND = 151, + SPELL_FAILED_UNIT_NOT_INFRONT = 152, + SPELL_FAILED_VISION_OBSCURED = 153, + SPELL_FAILED_WRONG_PET_FOOD = 154, + SPELL_FAILED_NOT_WHILE_FATIGUED = 155, + SPELL_FAILED_TARGET_NOT_IN_INSTANCE = 156, + SPELL_FAILED_NOT_WHILE_TRADING = 157, + SPELL_FAILED_TARGET_NOT_IN_RAID = 158, + SPELL_FAILED_TARGET_FREEFORALL = 159, + SPELL_FAILED_NO_EDIBLE_CORPSES = 160, + SPELL_FAILED_ONLY_BATTLEGROUNDS = 161, + SPELL_FAILED_TARGET_NOT_GHOST = 162, + SPELL_FAILED_TRANSFORM_UNUSABLE = 163, + SPELL_FAILED_WRONG_WEATHER = 164, + SPELL_FAILED_DAMAGE_IMMUNE = 165, + SPELL_FAILED_PREVENTED_BY_MECHANIC = 166, + SPELL_FAILED_PLAY_TIME = 167, + SPELL_FAILED_REPUTATION = 168, + SPELL_FAILED_MIN_SKILL = 169, + SPELL_FAILED_NOT_IN_RATED_BATTLEGROUND = 170, + SPELL_FAILED_NOT_ON_SHAPESHIFT = 171, + SPELL_FAILED_NOT_ON_STEALTHED = 172, + SPELL_FAILED_NOT_ON_DAMAGE_IMMUNE = 173, + SPELL_FAILED_NOT_ON_MOUNTED = 174, + SPELL_FAILED_TOO_SHALLOW = 175, + SPELL_FAILED_TARGET_NOT_IN_SANCTUARY = 176, + SPELL_FAILED_TARGET_IS_TRIVIAL = 177, + SPELL_FAILED_BM_OR_INVISGOD = 178, + SPELL_FAILED_GROUND_MOUNT_NOT_ALLOWED = 179, + SPELL_FAILED_FLOATING_MOUNT_NOT_ALLOWED = 180, + SPELL_FAILED_UNDERWATER_MOUNT_NOT_ALLOWED = 181, + SPELL_FAILED_FLYING_MOUNT_NOT_ALLOWED = 182, + SPELL_FAILED_APPRENTICE_RIDING_REQUIREMENT = 183, + SPELL_FAILED_JOURNEYMAN_RIDING_REQUIREMENT = 184, + SPELL_FAILED_EXPERT_RIDING_REQUIREMENT = 185, + SPELL_FAILED_ARTISAN_RIDING_REQUIREMENT = 186, + SPELL_FAILED_MASTER_RIDING_REQUIREMENT = 187, + SPELL_FAILED_COLD_RIDING_REQUIREMENT = 188, + SPELL_FAILED_FLIGHT_MASTER_RIDING_REQUIREMENT = 189, + SPELL_FAILED_CS_RIDING_REQUIREMENT = 190, + SPELL_FAILED_PANDA_RIDING_REQUIREMENT = 191, + SPELL_FAILED_DRAENOR_RIDING_REQUIREMENT = 192, + SPELL_FAILED_MOUNT_NO_FLOAT_HERE = 193, + SPELL_FAILED_MOUNT_NO_UNDERWATER_HERE = 194, + SPELL_FAILED_MOUNT_ABOVE_WATER_HERE = 195, + SPELL_FAILED_MOUNT_COLLECTED_ON_OTHER_CHAR = 196, + SPELL_FAILED_NOT_IDLE = 197, + SPELL_FAILED_NOT_INACTIVE = 198, + SPELL_FAILED_PARTIAL_PLAYTIME = 199, + SPELL_FAILED_NO_PLAYTIME = 200, + SPELL_FAILED_NOT_IN_BATTLEGROUND = 201, + SPELL_FAILED_NOT_IN_RAID_INSTANCE = 202, + SPELL_FAILED_ONLY_IN_ARENA = 203, + SPELL_FAILED_TARGET_LOCKED_TO_RAID_INSTANCE = 204, + SPELL_FAILED_ON_USE_ENCHANT = 205, + SPELL_FAILED_NOT_ON_GROUND = 206, + SPELL_FAILED_CUSTOM_ERROR = 207, + SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW = 208, + SPELL_FAILED_TOO_MANY_SOCKETS = 209, + SPELL_FAILED_INVALID_GLYPH = 210, + SPELL_FAILED_UNIQUE_GLYPH = 211, + SPELL_FAILED_GLYPH_SOCKET_LOCKED = 212, + SPELL_FAILED_GLYPH_EXCLUSIVE_CATEGORY = 213, + SPELL_FAILED_GLYPH_INVALID_SPEC = 214, + SPELL_FAILED_GLYPH_NO_SPEC = 215, + SPELL_FAILED_NO_VALID_TARGETS = 216, + SPELL_FAILED_ITEM_AT_MAX_CHARGES = 217, + SPELL_FAILED_NOT_IN_BARBERSHOP = 218, + SPELL_FAILED_FISHING_TOO_LOW = 219, + SPELL_FAILED_ITEM_ENCHANT_TRADE_WINDOW = 220, + SPELL_FAILED_SUMMON_PENDING = 221, + SPELL_FAILED_MAX_SOCKETS = 222, + SPELL_FAILED_PET_CAN_RENAME = 223, + SPELL_FAILED_TARGET_CANNOT_BE_RESURRECTED = 224, + SPELL_FAILED_TARGET_HAS_RESURRECT_PENDING = 225, + SPELL_FAILED_NO_ACTIONS = 226, + SPELL_FAILED_CURRENCY_WEIGHT_MISMATCH = 227, + SPELL_FAILED_WEIGHT_NOT_ENOUGH = 228, + SPELL_FAILED_WEIGHT_TOO_MUCH = 229, + SPELL_FAILED_NO_VACANT_SEAT = 230, + SPELL_FAILED_NO_LIQUID = 231, + SPELL_FAILED_ONLY_NOT_SWIMMING = 232, + SPELL_FAILED_BY_NOT_MOVING = 233, + SPELL_FAILED_IN_COMBAT_RES_LIMIT_REACHED = 234, + SPELL_FAILED_NOT_IN_ARENA = 235, + SPELL_FAILED_TARGET_NOT_GROUNDED = 236, + SPELL_FAILED_EXCEEDED_WEEKLY_USAGE = 237, + SPELL_FAILED_NOT_IN_LFG_DUNGEON = 238, + SPELL_FAILED_BAD_TARGET_FILTER = 239, + SPELL_FAILED_NOT_ENOUGH_TARGETS = 240, + SPELL_FAILED_NO_SPEC = 241, + SPELL_FAILED_CANT_ADD_BATTLE_PET = 242, + SPELL_FAILED_CANT_UPGRADE_BATTLE_PET = 243, + SPELL_FAILED_WRONG_BATTLE_PET_TYPE = 244, + SPELL_FAILED_NO_DUNGEON_ENCOUNTER = 245, + SPELL_FAILED_NO_TELEPORT_FROM_DUNGEON = 246, + SPELL_FAILED_MAX_LEVEL_TOO_LOW = 247, + SPELL_FAILED_CANT_REPLACE_ITEM_BONUS = 248, + GRANT_PET_LEVEL_FAIL = 249, + SPELL_FAILED_SKILL_LINE_NOT_KNOWN = 250, + SPELL_FAILED_BLUEPRINT_KNOWN = 251, + SPELL_FAILED_FOLLOWER_KNOWN = 252, + SPELL_FAILED_CANT_OVERRIDE_ENCHANT_VISUAL = 253, + SPELL_FAILED_ITEM_NOT_A_WEAPON = 254, + SPELL_FAILED_SAME_ENCHANT_VISUAL = 255, + SPELL_FAILED_TOY_USE_LIMIT_REACHED = 256, + SPELL_FAILED_TOY_ALREADY_KNOWN = 257, + SPELL_FAILED_SHIPMENTS_FULL = 258, + SPELL_FAILED_NO_SHIPMENTS_FOR_CONTAINER = 259, + SPELL_FAILED_NO_BUILDING_FOR_SHIPMENT = 260, + SPELL_FAILED_NOT_ENOUGH_SHIPMENTS_FOR_CONTAINER = 261, + SPELL_FAILED_HAS_MISSION = 262, + SPELL_FAILED_BUILDING_ACTIVATE_NOT_READY = 263, + SPELL_FAILED_NOT_SOULBOUND = 264, + SPELL_FAILED_RIDING_VEHICLE = 265, + SPELL_FAILED_VETERAN_TRIAL_ABOVE_SKILL_RANK_MAX = 266, + SPELL_FAILED_NOT_WHILE_MERCENARY = 267, + SPELL_FAILED_SPEC_DISABLED = 268, + SPELL_FAILED_CANT_BE_OBLITERATED = 269, + SPELL_FAILED_FOLLOWER_CLASS_SPEC_CAP = 270, + SPELL_FAILED_TRANSPORT_NOT_READY = 271, + SPELL_FAILED_TRANSMOG_SET_ALREADY_KNOWN = 272, + SPELL_FAILED_DISABLED_BY_AURA_LABEL = 273, + SPELL_FAILED_DISABLED_BY_MAX_USABLE_LEVEL = 274, + SPELL_FAILED_SPELL_ALREADY_KNOWN = 275, + SPELL_FAILED_MUST_KNOW_SUPERCEDING_SPELL = 276, + SPELL_FAILED_YOU_CANNOT_USE_THAT_IN_PVP_INSTANCE = 277, + SPELL_FAILED_NO_ARTIFACT_EQUIPPED = 278, + SPELL_FAILED_WRONG_ARTIFACT_EQUIPPED = 279, + SPELL_FAILED_UNKNOWN = 280, + + // ok cast value - here in case a future version removes SPELL_FAILED_SUCCESS and we need to use a custom value (not sent to client either way) + SPELL_CAST_OK = SPELL_FAILED_SUCCESS }; enum SpellCustomErrors { - SPELL_CUSTOM_ERROR_NONE = 0, - SPELL_CUSTOM_ERROR_CUSTOM_MSG = 1, // Something bad happened, and we want to display a custom message! - SPELL_CUSTOM_ERROR_ALEX_BROKE_QUEST = 2, // Alex broke your quest! Thank him later! - SPELL_CUSTOM_ERROR_NEED_HELPLESS_VILLAGER = 3, // This spell may only be used on Helpless Wintergarde Villagers that have not been rescued. - SPELL_CUSTOM_ERROR_NEED_WARSONG_DISGUISE = 4, // Requires that you be wearing the Warsong Orc Disguise. - SPELL_CUSTOM_ERROR_REQUIRES_PLAGUE_WAGON = 5, // You must be closer to a plague wagon in order to drop off your 7th Legion Siege Engineer. - SPELL_CUSTOM_ERROR_CANT_TARGET_FRIENDLY_NONPARTY = 6, // You cannot target friendly units outside your party. - SPELL_CUSTOM_ERROR_NEED_CHILL_NYMPH = 7, // You must target a weakened chill nymph. - SPELL_CUSTOM_ERROR_MUST_BE_IN_ENKILAH = 8, // The Imbued Scourge Shroud will only work when equipped in the Temple City of En'kilah. - SPELL_CUSTOM_ERROR_REQUIRES_CORPSE_DUST = 9, // Requires Corpse Dust - SPELL_CUSTOM_ERROR_CANT_SUMMON_GARGOYLE = 10, // You cannot summon another gargoyle yet. - SPELL_CUSTOM_ERROR_NEED_CORPSE_DUST_IF_NO_TARGET = 11, // Requires Corpse Dust if the target is not dead and humanoid. - SPELL_CUSTOM_ERROR_MUST_BE_AT_SHATTERHORN = 12, // Can only be placed near Shatterhorn - SPELL_CUSTOM_ERROR_MUST_TARGET_PROTO_DRAKE_EGG = 13, // You must first select a Proto-Drake Egg. - SPELL_CUSTOM_ERROR_MUST_BE_CLOSE_TO_TREE = 14, // You must be close to a marked tree. - SPELL_CUSTOM_ERROR_MUST_TARGET_TURKEY = 15, // You must target a Fjord Turkey. - SPELL_CUSTOM_ERROR_MUST_TARGET_HAWK = 16, // You must target a Fjord Hawk. - SPELL_CUSTOM_ERROR_TOO_FAR_FROM_BOUY = 17, // You are too far from the bouy. - SPELL_CUSTOM_ERROR_MUST_BE_CLOSE_TO_OIL_SLICK = 18, // Must be used near an oil slick. - SPELL_CUSTOM_ERROR_MUST_BE_CLOSE_TO_BOUY = 19, // You must be closer to the buoy! - SPELL_CUSTOM_ERROR_WYRMREST_VANQUISHER = 20, // You may only call for the aid of a Wyrmrest Vanquisher in Wyrmrest Temple, The Dragon Wastes, Galakrond's Rest or The Wicked Coil. - SPELL_CUSTOM_ERROR_MUST_TARGET_ICE_HEART_JORMUNGAR = 21, // That can only be used on a Ice Heart Jormungar Spawn. - SPELL_CUSTOM_ERROR_MUST_BE_CLOSE_TO_SINKHOLE = 22, // You must be closer to a sinkhole to use your map. - SPELL_CUSTOM_ERROR_REQUIRES_HAROLD_LANE = 23, // You may only call down a stampede on Harold Lane. - SPELL_CUSTOM_ERROR_REQUIRES_GAMMOTH_MAGNATAUR = 24, // You may only use the Pouch of Crushed Bloodspore on Gammothra or other magnataur in the Bloodspore Plains and Gammoth. - SPELL_CUSTOM_ERROR_MUST_BE_IN_RESURRECTION_CHAMBER = 25, // Requires the magmawyrm resurrection chamber in the back of the Maw of Neltharion. - SPELL_CUSTOM_ERROR_CANT_CALL_WINTERGARDE_HERE = 26, // You may only call down a Wintergarde Gryphon in Wintergarde Keep or the Carrion Fields. - SPELL_CUSTOM_ERROR_MUST_TARGET_WILHELM = 27, // What are you doing? Only aim that thing at Wilhelm! - SPELL_CUSTOM_ERROR_NOT_ENOUGH_HEALTH = 28, // Not enough health! - SPELL_CUSTOM_ERROR_NO_NEARBY_CORPSES = 29, // There are no nearby corpses to use - SPELL_CUSTOM_ERROR_TOO_MANY_GHOULS = 30, // You've created enough ghouls. Return to Gothik the Harvester at Death's Breach. - SPELL_CUSTOM_ERROR_GO_FURTHER_FROM_SUNDERED_SHARD = 31, // Your companion does not want to come here. Go further from the Sundered Shard. - SPELL_CUSTOM_ERROR_MUST_BE_IN_CAT_FORM = 32, // Must be in Cat Form - SPELL_CUSTOM_ERROR_MUST_BE_DEATH_KNIGHT = 33, // Only Death Knights may enter Ebon Hold. - SPELL_CUSTOM_ERROR_MUST_BE_IN_FERAL_FORM = 34, // Must be in Cat Form, Bear Form, or Dire Bear Form - SPELL_CUSTOM_ERROR_MUST_BE_NEAR_HELPLESS_VILLAGER = 35, // You must be within range of a Helpless Wintergarde Villager. - SPELL_CUSTOM_ERROR_CANT_TARGET_ELEMENTAL_MECHANICAL = 36, // You cannot target an elemental or mechanical corpse. - SPELL_CUSTOM_ERROR_MUST_HAVE_USED_DALARAN_CRYSTAL = 37, // This teleport crystal cannot be used until the teleport crystal in Dalaran has been used at least once. - SPELL_CUSTOM_ERROR_YOU_ALREADY_HOLD_SOMETHING = 38, // You are already holding something in your hand. You must throw the creature in your hand before picking up another. - SPELL_CUSTOM_ERROR_YOU_DONT_HOLD_ANYTHING = 39, // You don't have anything to throw! Find a Vargul and use Gymer Grab to pick one up! - SPELL_CUSTOM_ERROR_MUST_BE_CLOSE_TO_VALDURAN = 40, // Bouldercrag's War Horn can only be used within 10 yards of Valduran the Stormborn. - SPELL_CUSTOM_ERROR_NO_PASSENGER = 41, // You are not carrying a passenger. There is nobody to drop off. - SPELL_CUSTOM_ERROR_CANT_BUILD_MORE_VEHICLES = 42, // You cannot build any more siege vehicles. - SPELL_CUSTOM_ERROR_ALREADY_CARRYING_CRUSADER = 43, // You are already carrying a captured Argent Crusader. You must return to the Argent Vanguard infirmary and drop off your passenger before you may pick up another. - SPELL_CUSTOM_ERROR_CANT_DO_WHILE_ROOTED = 44, // You can't do that while rooted. - SPELL_CUSTOM_ERROR_REQUIRES_NEARBY_TARGET = 45, // Requires a nearby target. - SPELL_CUSTOM_ERROR_NOTHING_TO_DISCOVER = 46, // Nothing left to discover. - SPELL_CUSTOM_ERROR_NOT_ENOUGH_TARGETS = 47, // No targets close enough to bluff. - SPELL_CUSTOM_ERROR_CONSTRUCT_TOO_FAR = 48, // Your Iron Rune Construct is out of range. - SPELL_CUSTOM_ERROR_REQUIRES_GRAND_MASTER_ENGINEER = 49, // Requires Grand Master Engineer - SPELL_CUSTOM_ERROR_CANT_USE_THAT_MOUNT = 50, // You can't use that mount. - SPELL_CUSTOM_ERROR_NOONE_TO_EJECT = 51, // There is nobody to eject! - SPELL_CUSTOM_ERROR_TARGET_MUST_BE_BOUND = 52, // The target must be bound to you. - SPELL_CUSTOM_ERROR_TARGET_MUST_BE_UNDEAD = 53, // Target must be undead. - SPELL_CUSTOM_ERROR_TARGET_TOO_FAR = 54, // You have no target or your target is too far away. - SPELL_CUSTOM_ERROR_MISSING_DARK_MATTER = 55, // Missing Reagents: Dark Matter - SPELL_CUSTOM_ERROR_CANT_USE_THAT_ITEM = 56, // You can't use that item - SPELL_CUSTOM_ERROR_CANT_DO_WHILE_CYCYLONED = 57, // You can't do that while Cycloned - SPELL_CUSTOM_ERROR_TARGET_HAS_SCROLL = 58, // Target is already affected by a scroll - SPELL_CUSTOM_ERROR_POISON_TOO_STRONG = 59, // That anti-venom is not strong enough to dispel that poison - SPELL_CUSTOM_ERROR_MUST_HAVE_LANCE_EQUIPPED = 60, // You must have a lance equipped. - SPELL_CUSTOM_ERROR_MUST_BE_CLOSE_TO_MAIDEN = 61, // You must be near the Maiden of Winter's Breath Lake. - SPELL_CUSTOM_ERROR_LEARNED_EVERYTHING = 62, // You have learned everything from that book - SPELL_CUSTOM_ERROR_PET_IS_DEAD = 63, // Your pet is dead - SPELL_CUSTOM_ERROR_NO_VALID_TARGETS = 64, // There are no valid targets within range. - SPELL_CUSTOM_ERROR_GM_ONLY = 65, // Only GMs may use that. Your account has been reported for investigation. - SPELL_CUSTOM_ERROR_REQUIRES_LEVEL_58 = 66, // You must reach level 58 to use this portal. - SPELL_CUSTOM_ERROR_AT_HONOR_CAP = 67, // You already have the maximum amount of honor. - SPELL_CUSTOM_ERROR_HAVE_HOT_ROD = 68, // You already have a Hot Rod. - SPELL_CUSTOM_ERROR_PARTYGOER_MORE_BUBBLY = 69, // This partygoer wants some more bubbly - SPELL_CUSTOM_ERROR_PARTYGOER_NEED_BUCKET = 70, // This partygoer needs a bucket! - SPELL_CUSTOM_ERROR_PARTYGOER_WANT_TO_DANCE = 71, // This partygoer wants to dance with you. - SPELL_CUSTOM_ERROR_PARTYGOER_WANT_FIREWORKS = 72, // This partygoer wants to see some fireworks. - SPELL_CUSTOM_ERROR_PARTYGOER_WANT_APPETIZER = 73, // This partygoer wants some more hors d'oeuvres. - SPELL_CUSTOM_ERROR_GOBLIN_BATTERY_DEPLETED = 74, // The Goblin All-In-1-Der Belt's battery is depleted. - SPELL_CUSTOM_ERROR_MUST_HAVE_DEMONIC_CIRCLE = 75, // You must have a demonic circle active. - SPELL_CUSTOM_ERROR_AT_MAX_RAGE = 76, // You already have maximum rage - SPELL_CUSTOM_ERROR_REQUIRES_350_ENGINEERING = 77, // Requires Engineering (350) - SPELL_CUSTOM_ERROR_SOUL_BELONGS_TO_LICH_KING = 78, // Your soul belongs to the Lich King - SPELL_CUSTOM_ERROR_ATTENDANT_HAS_PONY = 79, // Your attendant already has an Argent Pony - SPELL_CUSTOM_ERROR_GOBLIN_STARTING_MISSION = 80, // First, Overload the Defective Generator, Activate the Leaky Stove, and Drop a Cigar on the Flammable Bed. - SPELL_CUSTOM_ERROR_GASBOT_ALREADY_SENT = 81, // You've already sent in the Gasbot and destroyed headquarters! - SPELL_CUSTOM_ERROR_GOBLIN_IS_PARTIED_OUT = 82, // This goblin is all partied out! - SPELL_CUSTOM_ERROR_MUST_HAVE_FIRE_TOTEM = 83, // You must have a Fire Totem active. - SPELL_CUSTOM_ERROR_CANT_TARGET_VAMPIRES = 84, // You may not bite other vampires. - SPELL_CUSTOM_ERROR_PET_ALREADY_AT_YOUR_LEVEL = 85, // Your pet is already at your level. - SPELL_CUSTOM_ERROR_MISSING_ITEM_REQUIREMENS = 86, // You do not meet the level requirements for this item. - SPELL_CUSTOM_ERROR_TOO_MANY_ABOMINATIONS = 87, // There are too many Mutated Abominations. - SPELL_CUSTOM_ERROR_ALL_POTIONS_USED = 88, // The potions have all been depleted by Professor Putricide. - SPELL_CUSTOM_ERROR_DEFEATED_ENOUGH_ALREADY = 89, // You have already defeated enough of them. - SPELL_CUSTOM_ERROR_REQUIRES_LEVEL_65 = 90, // Requires level 65 - SPELL_CUSTOM_ERROR_DESTROYED_KTC_OIL_PLATFORM = 91, // You have already destroyed the KTC Oil Platform. - SPELL_CUSTOM_ERROR_LAUNCHED_ENOUGH_CAGES = 92, // You have already launched enough cages. - SPELL_CUSTOM_ERROR_REQUIRES_BOOSTER_ROCKETS = 93, // Requires Single-Stage Booster Rockets. Return to Hobart Grapplehammer to get more. - SPELL_CUSTOM_ERROR_ENOUGH_WILD_CLUCKERS = 94, // You have already captured enough wild cluckers. - SPELL_CUSTOM_ERROR_REQUIRES_CONTROL_FIREWORKS = 95, // Requires Remote Control Fireworks. Return to Hobart Grapplehammer to get more. - SPELL_CUSTOM_ERROR_MAX_NUMBER_OF_RECRUITS = 96, // You already have the max number of recruits. - SPELL_CUSTOM_ERROR_MAX_NUMBER_OF_VOLUNTEERS = 97, // You already have the max number of volunteers. - SPELL_CUSTOM_ERROR_FROSTMOURNE_RENDERED_RESURRECT = 98, // Frostmourne has rendered you unable to resurrect. - SPELL_CUSTOM_ERROR_CANT_MOUNT_WITH_SHAPESHIFT = 99, // You can't mount while affected by that shapeshift. - SPELL_CUSTOM_ERROR_FAWNS_ALREADY_FOLLOWING = 100, // Three fawns are already following you! - SPELL_CUSTOM_ERROR_ALREADY_HAVE_RIVER_BOAT = 101, // You already have a River Boat. - SPELL_CUSTOM_ERROR_NO_ACTIVE_ENCHANTMENT = 102, // You have no active enchantment to unleash. - SPELL_CUSTOM_ERROR_ENOUGH_HIGHBOURNE_SOULS = 103, // You have bound enough Highborne souls. Return to Arcanist Valdurian. - SPELL_CUSTOM_ERROR_ATLEAST_40YD_FROM_OIL_DRILLING = 104, // You must be at least 40 yards away from all other Oil Drilling Rigs. - SPELL_CUSTOM_ERROR_ABOVE_ENSLAVED_PEARL_MINER = 106, // You must be above the Enslaved Pearl Miner. - SPELL_CUSTOM_ERROR_MUST_TARGET_CORPSE_SPECIAL_1 = 107, // You must target the corpse of a Seabrush Terrapin, Scourgut Remora, or Spinescale Hammerhead. - SPELL_CUSTOM_ERROR_SLAGHAMMER_ALREADY_PRISONER = 108, // Ambassador Slaghammer is already your prisoner. - SPELL_CUSTOM_ERROR_REQUIRE_ATTUNED_LOCATION_1 = 109, // Requires a location that is attuned with the Naz'jar Battlemaiden. - SPELL_CUSTOM_ERROR_NEED_TO_FREE_DRAKE_FIRST = 110, // Free the Drake from the net first! - SPELL_CUSTOM_ERROR_DRAGONMAW_ALLIES_ALREADY_FOLLOW = 111, // You already have three Dragonmaw allies following you. - SPELL_CUSTOM_ERROR_REQUIRE_OPPOSABLE_THUMBS = 112, // Requires Opposable Thumbs. - SPELL_CUSTOM_ERROR_NOT_ENOUGH_HEALTH_2 = 113, // Not enough health - SPELL_CUSTOM_ERROR_ENOUGH_FORSAKEN_TROOPERS = 114, // You already have enough Forsaken Troopers. - SPELL_CUSTOM_ERROR_CANNOT_JUMP_TO_BOULDER = 115, // You cannot jump to another boulder yet. - SPELL_CUSTOM_ERROR_SKILL_TOO_HIGH = 116, // Skill too high. - SPELL_CUSTOM_ERROR_ALREADY_6_SURVIVORS_RESCUED = 117, // You have already rescued 6 Survivors. - SPELL_CUSTOM_ERROR_MUST_FACE_SHIPS_FROM_BALLOON = 118, // You need to be facing the ships from the rescue balloon. - SPELL_CUSTOM_ERROR_CANNOT_SUPERVISE_MORE_CULTISTS = 119, // You cannot supervise more than 5 Arrested Cultists at a time. - SPELL_CUSTOM_ERROR_REQUIRES_LEVEL_85 = 120, // You must reach level 85 to use this portal. - SPELL_CUSTOM_ERROR_MUST_BE_BELOW_35_HEALTH = 121, // Your target must be below 35% health. - SPELL_CUSTOM_ERROR_MUST_SELECT_TALENT_SPECIAL = 122, // You must select a talent specialization first. - SPELL_CUSTOM_ERROR_TOO_WISE_AND_POWERFUL = 123, // You are too wise and powerful to gain any benefit from that item. - SPELL_CUSTOM_ERROR_TOO_CLOSE_ARGENT_LIGHTWELL = 124, // You are within 10 yards of another Argent Lightwell. - SPELL_CUSTOM_ERROR_NOT_WHILE_SHAPESHIFTED = 125, // You can't do that while shapeshifted. - SPELL_CUSTOM_ERROR_MANA_GEM_IN_BANK = 126, // You already have a Mana Gem in your bank. - SPELL_CUSTOM_ERROR_FLAME_SHOCK_NOT_ACTIVE = 127, // You must have at least one Flame Shock active. - SPELL_CUSTOM_ERROR_CANT_TRANSFORM = 128, // You cannot transform right now - SPELL_CUSTOM_ERROR_PET_MUST_BE_ATTACKING = 129, // Your pet must be attacking a target. - SPELL_CUSTOM_ERROR_GNOMISH_ENGINEERING = 130, // Requires Gnomish Engineering - SPELL_CUSTOM_ERROR_GOBLIN_ENGINEERING = 131, // Requires Goblin Engineering - SPELL_CUSTOM_ERROR_NO_TARGET = 132, // You have no target. - SPELL_CUSTOM_ERROR_PET_OUT_OF_RANGE = 133, // Your Pet is out of range of the target. - SPELL_CUSTOM_ERROR_HOLDING_FLAG = 134, // You can't do that while holding the flag. - SPELL_CUSTOM_ERROR_TARGET_HOLDING_FLAG = 135, // You can't do that to targets holding the flag. - SPELL_CUSTOM_ERROR_PORTAL_NOT_OPEN = 136, // The portal is not yet open. Continue helping the druids at the Sanctuary of Malorne. - SPELL_CUSTOM_ERROR_AGGRA_AIR_TOTEM = 137, // You need to be closer to Aggra's Air Totem, in the west. - SPELL_CUSTOM_ERROR_AGGRA_WATER_TOTEM = 138, // You need to be closer to Aggra's Water Totem, in the north. - SPELL_CUSTOM_ERROR_AGGRA_EARTH_TOTEM = 139, // You need to be closer to Aggra's Earth Totem, in the east. - SPELL_CUSTOM_ERROR_AGGRA_FIRE_TOTEM = 140, // You need to be closer to Aggra's Fire Totem, near Thrall. - SPELL_CUSTOM_ERROR_TARGET_HAS_STARTDUST_2 = 148, // Target is already affected by Stardust No. 2. - SPELL_CUSTOM_ERROR_ELEMENTIUM_GEM_CLUSTERS = 149 // You cannot deconstruct Elementium Gem Clusters while collecting them! + SPELL_CUSTOM_ERROR_NONE = 0, + SPELL_CUSTOM_ERROR_CUSTOM_MSG = 1, // Something bad happened, and we want to display a custom message! + SPELL_CUSTOM_ERROR_ALEX_BROKE_QUEST = 2, // Alex broke your quest! Thank him later! + SPELL_CUSTOM_ERROR_NEED_HELPLESS_VILLAGER = 3, // This spell may only be used on Helpless Wintergarde Villagers that have not been rescued. + SPELL_CUSTOM_ERROR_NEED_WARSONG_DISGUISE = 4, // Requires that you be wearing the Warsong Orc Disguise. + SPELL_CUSTOM_ERROR_REQUIRES_PLAGUE_WAGON = 5, // You must be closer to a plague wagon in order to drop off your 7th Legion Siege Engineer. + SPELL_CUSTOM_ERROR_CANT_TARGET_FRIENDLY_NONPARTY = 6, // You cannot target friendly units outside your party. + SPELL_CUSTOM_ERROR_NEED_CHILL_NYMPH = 7, // You must target a weakened chill nymph. + SPELL_CUSTOM_ERROR_MUST_BE_IN_ENKILAH = 8, // The Imbued Scourge Shroud will only work when equipped in the Temple City of En'kilah. + SPELL_CUSTOM_ERROR_REQUIRES_CORPSE_DUST = 9, // Requires Corpse Dust + SPELL_CUSTOM_ERROR_CANT_SUMMON_GARGOYLE = 10, // You cannot summon another gargoyle yet. + SPELL_CUSTOM_ERROR_NEED_CORPSE_DUST_IF_NO_TARGET = 11, // Requires Corpse Dust if the target is not dead and humanoid. + SPELL_CUSTOM_ERROR_MUST_BE_AT_SHATTERHORN = 12, // Can only be placed near Shatterhorn + SPELL_CUSTOM_ERROR_MUST_TARGET_PROTO_DRAKE_EGG = 13, // You must first select a Proto-Drake Egg. + SPELL_CUSTOM_ERROR_MUST_BE_CLOSE_TO_TREE = 14, // You must be close to a marked tree. + SPELL_CUSTOM_ERROR_MUST_TARGET_TURKEY = 15, // You must target a Fjord Turkey. + SPELL_CUSTOM_ERROR_MUST_TARGET_HAWK = 16, // You must target a Fjord Hawk. + SPELL_CUSTOM_ERROR_TOO_FAR_FROM_BOUY = 17, // You are too far from the bouy. + SPELL_CUSTOM_ERROR_MUST_BE_CLOSE_TO_OIL_SLICK = 18, // Must be used near an oil slick. + SPELL_CUSTOM_ERROR_MUST_BE_CLOSE_TO_BOUY = 19, // You must be closer to the buoy! + SPELL_CUSTOM_ERROR_WYRMREST_VANQUISHER = 20, // You may only call for the aid of a Wyrmrest Vanquisher in Wyrmrest Temple, The Dragon Wastes, Galakrond's Rest or The Wicked Coil. + SPELL_CUSTOM_ERROR_MUST_TARGET_ICE_HEART_JORMUNGAR = 21, // That can only be used on a Ice Heart Jormungar Spawn. + SPELL_CUSTOM_ERROR_MUST_BE_CLOSE_TO_SINKHOLE = 22, // You must be closer to a sinkhole to use your map. + SPELL_CUSTOM_ERROR_REQUIRES_HAROLD_LANE = 23, // You may only call down a stampede on Harold Lane. + SPELL_CUSTOM_ERROR_REQUIRES_GAMMOTH_MAGNATAUR = 24, // You may only use the Pouch of Crushed Bloodspore on Gammothra or other magnataur in the Bloodspore Plains and Gammoth. + SPELL_CUSTOM_ERROR_MUST_BE_IN_RESURRECTION_CHAMBER = 25, // Requires the magmawyrm resurrection chamber in the back of the Maw of Neltharion. + SPELL_CUSTOM_ERROR_CANT_CALL_WINTERGARDE_HERE = 26, // You may only call down a Wintergarde Gryphon in Wintergarde Keep or the Carrion Fields. + SPELL_CUSTOM_ERROR_MUST_TARGET_WILHELM = 27, // What are you doing? Only aim that thing at Wilhelm! + SPELL_CUSTOM_ERROR_NOT_ENOUGH_HEALTH = 28, // Not enough health! + SPELL_CUSTOM_ERROR_NO_NEARBY_CORPSES = 29, // There are no nearby corpses to use. + SPELL_CUSTOM_ERROR_TOO_MANY_GHOULS = 30, // You've created enough ghouls. Return to Gothik the Harvester at Death's Breach. + SPELL_CUSTOM_ERROR_GO_FURTHER_FROM_SUNDERED_SHARD = 31, // Your companion does not want to come here. Go further from the Sundered Shard. + SPELL_CUSTOM_ERROR_MUST_BE_IN_CAT_FORM = 32, // Must be in Cat Form + SPELL_CUSTOM_ERROR_MUST_BE_DEATH_KNIGHT = 33, // Only Death Knights may enter Ebon Hold. + SPELL_CUSTOM_ERROR_MUST_BE_IN_BEAR_FORM = 34, // Must be in Bear Form + SPELL_CUSTOM_ERROR_MUST_BE_NEAR_HELPLESS_VILLAGER = 35, // You must be within range of a Helpless Wintergarde Villager. + SPELL_CUSTOM_ERROR_CANT_TARGET_ELEMENTAL_MECHANICAL = 36, // You cannot target an elemental or mechanical corpse. + SPELL_CUSTOM_ERROR_MUST_HAVE_USED_DALARAN_CRYSTAL = 37, // This teleport crystal cannot be used until the teleport crystal in Dalaran has been used at least once. + SPELL_CUSTOM_ERROR_YOU_ALREADY_HOLD_SOMETHING = 38, // You are already holding something in your hand. You must throw the creature in your hand before picking up another. + SPELL_CUSTOM_ERROR_YOU_DONT_HOLD_ANYTHING = 39, // You don't have anything to throw! Find a Vargul and use Gymer Grab to pick one up! + SPELL_CUSTOM_ERROR_MUST_BE_CLOSE_TO_VALDURAN = 40, // Bouldercrag's War Horn can only be used within 10 yards of Valduran the Stormborn. + SPELL_CUSTOM_ERROR_NO_PASSENGER = 41, // You are not carrying a passenger. There is nobody to drop off. + SPELL_CUSTOM_ERROR_CANT_BUILD_MORE_VEHICLES = 42, // You cannot build any more siege vehicles. + SPELL_CUSTOM_ERROR_ALREADY_CARRYING_CRUSADER = 43, // You are already carrying a captured Argent Crusader. You must return to the Argent Vanguard infirmary and drop off your passenger before you may pick up another. + SPELL_CUSTOM_ERROR_CANT_DO_WHILE_ROOTED = 44, // You can't do that while rooted. + SPELL_CUSTOM_ERROR_REQUIRES_NEARBY_TARGET = 45, // Requires a nearby target. + SPELL_CUSTOM_ERROR_NOTHING_TO_DISCOVER = 46, // Nothing left to discover. + SPELL_CUSTOM_ERROR_NOT_ENOUGH_TARGETS = 47, // No targets close enough to bluff. + SPELL_CUSTOM_ERROR_CONSTRUCT_TOO_FAR = 48, // Your Iron Rune Construct is out of range. + SPELL_CUSTOM_ERROR_REQUIRES_GRAND_MASTER_ENGINEER = 49, // Requires Engineering (350) + SPELL_CUSTOM_ERROR_CANT_USE_THAT_MOUNT = 50, // You can't use that mount. + SPELL_CUSTOM_ERROR_NOONE_TO_EJECT = 51, // There is nobody to eject! + SPELL_CUSTOM_ERROR_TARGET_MUST_BE_BOUND = 52, // The target must be bound to you. + SPELL_CUSTOM_ERROR_TARGET_MUST_BE_UNDEAD = 53, // Target must be undead. + SPELL_CUSTOM_ERROR_TARGET_TOO_FAR = 54, // You have no target or your target is too far away. + SPELL_CUSTOM_ERROR_MISSING_DARK_MATTER = 55, // Missing Reagents: Dark Matter + SPELL_CUSTOM_ERROR_CANT_USE_THAT_ITEM = 56, // You can't use that item + SPELL_CUSTOM_ERROR_CANT_DO_WHILE_CYCYLONED = 57, // You can't do that while Cycloned + SPELL_CUSTOM_ERROR_TARGET_HAS_SCROLL = 58, // Target is already affected by a similar effect + SPELL_CUSTOM_ERROR_POISON_TOO_STRONG = 59, // That anti-venom is not strong enough to dispel that poison + SPELL_CUSTOM_ERROR_MUST_HAVE_LANCE_EQUIPPED = 60, // You must have a lance equipped. + SPELL_CUSTOM_ERROR_MUST_BE_CLOSE_TO_MAIDEN = 61, // You must be near the Maiden of Winter's Breath Lake. + SPELL_CUSTOM_ERROR_LEARNED_EVERYTHING = 62, // You have learned everything from that book + SPELL_CUSTOM_ERROR_PET_IS_DEAD = 63, // Your pet is dead + SPELL_CUSTOM_ERROR_NO_VALID_TARGETS = 64, // There are no valid targets within range. + SPELL_CUSTOM_ERROR_GM_ONLY = 65, // Only GMs may use that. Your account has been reported for investigation. + SPELL_CUSTOM_ERROR_REQUIRES_LEVEL_58 = 66, // You must reach level 58 to use this portal. + SPELL_CUSTOM_ERROR_AT_HONOR_CAP = 67, // You already have the maximum amount of honor. + SPELL_CUSTOM_ERROR_HAVE_HOT_ROD = 68, // You already have a Hot Rod. + SPELL_CUSTOM_ERROR_PARTYGOER_MORE_BUBBLY = 69, // This partygoer wants some more bubbly. + SPELL_CUSTOM_ERROR_PARTYGOER_NEED_BUCKET = 70, // This partygoer needs a bucket! + SPELL_CUSTOM_ERROR_PARTYGOER_WANT_TO_DANCE = 71, // This partygoer wants to dance with you. + SPELL_CUSTOM_ERROR_PARTYGOER_WANT_FIREWORKS = 72, // This partygoer wants to see some fireworks. + SPELL_CUSTOM_ERROR_PARTYGOER_WANT_APPETIZER = 73, // This partygoer wants some more hors d'oeuvres. + SPELL_CUSTOM_ERROR_GOBLIN_BATTERY_DEPLETED = 74, // The Goblin All-In-1-Der Belt's battery is depleted. + SPELL_CUSTOM_ERROR_MUST_HAVE_DEMONIC_CIRCLE = 75, // You must have a demonic circle active. + SPELL_CUSTOM_ERROR_AT_MAX_RAGE = 76, // You already have maximum rage + SPELL_CUSTOM_ERROR_REQUIRES_350_ENGINEERING = 77, // Requires Engineering (350) + SPELL_CUSTOM_ERROR_SOUL_BELONGS_TO_LICH_KING = 78, // Your soul belongs to the Lich King + SPELL_CUSTOM_ERROR_ATTENDANT_HAS_PONY = 79, // Your attendant already has an Argent Pony + SPELL_CUSTOM_ERROR_GOBLIN_STARTING_MISSION = 80, // First, Overload the Defective Generator, Activate the Leaky Stove, and Drop a Cigar on the Flammable Bed. + SPELL_CUSTOM_ERROR_GASBOT_ALREADY_SENT = 81, // You've already sent in the Gasbot and destroyed headquarters! + SPELL_CUSTOM_ERROR_GOBLIN_IS_PARTIED_OUT = 82, // This goblin is all partied out! + SPELL_CUSTOM_ERROR_MUST_HAVE_FIRE_TOTEM = 83, // You must have a Magma, Flametongue, or Fire Elemental Totem active. + SPELL_CUSTOM_ERROR_CANT_TARGET_VAMPIRES = 84, // You may not bite other vampires. + SPELL_CUSTOM_ERROR_PET_ALREADY_AT_YOUR_LEVEL = 85, // Your pet is already at your level. + SPELL_CUSTOM_ERROR_MISSING_ITEM_REQUIREMENS = 86, // You do not meet the level requirements for this item. + SPELL_CUSTOM_ERROR_TOO_MANY_ABOMINATIONS = 87, // There are too many Mutated Abominations. + SPELL_CUSTOM_ERROR_ALL_POTIONS_USED = 88, // The potions have all been depleted by Professor Putricide. + SPELL_CUSTOM_ERROR_DEFEATED_ENOUGH_ALREADY = 89, // You have already defeated enough of them. + SPELL_CUSTOM_ERROR_REQUIRES_LEVEL_65 = 90, // Requires level 65 + SPELL_CUSTOM_ERROR_DESTROYED_KTC_OIL_PLATFORM = 91, // You have already destroyed the KTC Oil Platform. + SPELL_CUSTOM_ERROR_LAUNCHED_ENOUGH_CAGES = 92, // You have already launched enough cages. + SPELL_CUSTOM_ERROR_REQUIRES_BOOSTER_ROCKETS = 93, // Requires Single-Stage Booster Rockets. Return to Hobart Grapplehammer to get more. + SPELL_CUSTOM_ERROR_ENOUGH_WILD_CLUCKERS = 94, // You have already captured enough wild cluckers. + SPELL_CUSTOM_ERROR_REQUIRES_CONTROL_FIREWORKS = 95, // Requires Remote Control Fireworks. Return to Hobart Grapplehammer to get more. + SPELL_CUSTOM_ERROR_MAX_NUMBER_OF_RECRUITS = 96, // You already have the max number of recruits. + SPELL_CUSTOM_ERROR_MAX_NUMBER_OF_VOLUNTEERS = 97, // You already have the max number of volunteers. + SPELL_CUSTOM_ERROR_FROSTMOURNE_RENDERED_RESURRECT = 98, // Frostmourne has rendered you unable to resurrect. + SPELL_CUSTOM_ERROR_CANT_MOUNT_WITH_SHAPESHIFT = 99, // You can't mount while affected by that shapeshift. + SPELL_CUSTOM_ERROR_FAWNS_ALREADY_FOLLOWING = 100, // Three fawns are already following you! + SPELL_CUSTOM_ERROR_ALREADY_HAVE_RIVER_BOAT = 101, // You already have a River Boat. + SPELL_CUSTOM_ERROR_NO_ACTIVE_ENCHANTMENT = 102, // You have no active enchantment to unleash. + SPELL_CUSTOM_ERROR_ENOUGH_HIGHBOURNE_SOULS = 103, // You have bound enough Highborne souls. Return to Arcanist Valdurian. + SPELL_CUSTOM_ERROR_ATLEAST_40YD_FROM_OIL_DRILLING = 104, // You must be at least 40 yards away from all other Oil Drilling Rigs. + SPELL_CUSTOM_ERROR_ABOVE_ENSLAVED_PEARL_MINER = 106, // You must be above the Enslaved Pearl Miner. + SPELL_CUSTOM_ERROR_MUST_TARGET_CORPSE_SPECIAL_1 = 107, // You must target the corpse of a Seabrush Terrapin, Scourgut Remora, or Spinescale Hammerhead. + SPELL_CUSTOM_ERROR_SLAGHAMMER_ALREADY_PRISONER = 108, // Ambassador Slaghammer is already your prisoner. + SPELL_CUSTOM_ERROR_REQUIRE_ATTUNED_LOCATION_1 = 109, // Requires a location that is attuned with the Naz'jar Battlemaiden. + SPELL_CUSTOM_ERROR_NEED_TO_FREE_DRAKE_FIRST = 110, // Free the Drake from the net first! + SPELL_CUSTOM_ERROR_DRAGONMAW_ALLIES_ALREADY_FOLLOW = 111, // You already have three Dragonmaw allies following you. + SPELL_CUSTOM_ERROR_REQUIRE_OPPOSABLE_THUMBS = 112, // Requires Opposable Thumbs. + SPELL_CUSTOM_ERROR_NOT_ENOUGH_HEALTH_2 = 113, // Not enough health + SPELL_CUSTOM_ERROR_ENOUGH_FORSAKEN_TROOPERS = 114, // You already have enough Forsaken Troopers. + SPELL_CUSTOM_ERROR_CANNOT_JUMP_TO_BOULDER = 115, // You cannot jump to another boulder yet. + SPELL_CUSTOM_ERROR_SKILL_TOO_HIGH = 116, // Skill too high. + SPELL_CUSTOM_ERROR_ALREADY_6_SURVIVORS_RESCUED = 117, // You have already rescued 6 Survivors. + SPELL_CUSTOM_ERROR_MUST_FACE_SHIPS_FROM_BALLOON = 118, // You need to be facing the ships from the rescue balloon. + SPELL_CUSTOM_ERROR_CANNOT_SUPERVISE_MORE_CULTISTS = 119, // You cannot supervise more than 5 Arrested Cultists at a time. + SPELL_CUSTOM_ERROR_REQUIRES_LEVEL_85 = 120, // You must reach level 85 to use this portal. + SPELL_CUSTOM_ERROR_MUST_BE_BELOW_35_HEALTH = 121, // Your target must be below 35% health. + SPELL_CUSTOM_ERROR_MUST_SELECT_SPECIALIZATION = 122, // You must select a specialization first. + SPELL_CUSTOM_ERROR_TOO_WISE_AND_POWERFUL = 123, // You are too wise and powerful to gain any benefit from that item. + SPELL_CUSTOM_ERROR_TOO_CLOSE_ARGENT_LIGHTWELL = 124, // You are within 10 yards of another Argent Lightwell. + SPELL_CUSTOM_ERROR_NOT_WHILE_SHAPESHIFTED = 125, // You can't do that while shapeshifted. + SPELL_CUSTOM_ERROR_MANA_GEM_IN_BANK = 126, // You already have a Mana Gem in your bank. + SPELL_CUSTOM_ERROR_FLAME_SHOCK_NOT_ACTIVE = 127, // You must have at least one Flame Shock active. + SPELL_CUSTOM_ERROR_CANT_TRANSFORM = 128, // You cannot transform right now + SPELL_CUSTOM_ERROR_PET_MUST_BE_ATTACKING = 129, // Your pet must be attacking a target. + SPELL_CUSTOM_ERROR_GNOMISH_ENGINEERING = 130, // Requires Gnomish Engineering + SPELL_CUSTOM_ERROR_GOBLIN_ENGINEERING = 131, // Requires Goblin Engineering + SPELL_CUSTOM_ERROR_NO_TARGET = 132, // You have no target. + SPELL_CUSTOM_ERROR_PET_OUT_OF_RANGE = 133, // Your Pet is out of range of the target. + SPELL_CUSTOM_ERROR_HOLDING_FLAG = 134, // You can't do that while holding the flag. + SPELL_CUSTOM_ERROR_TARGET_HOLDING_FLAG = 135, // You can't do that to targets holding the flag. + SPELL_CUSTOM_ERROR_PORTAL_NOT_OPEN = 136, // The portal is not yet open. Continue helping the druids at the Sanctuary of Malorne. + SPELL_CUSTOM_ERROR_AGGRA_AIR_TOTEM = 137, // You need to be closer to Aggra's Air Totem, in the west. + SPELL_CUSTOM_ERROR_AGGRA_WATER_TOTEM = 138, // You need to be closer to Aggra's Water Totem, in the north. + SPELL_CUSTOM_ERROR_AGGRA_EARTH_TOTEM = 139, // You need to be closer to Aggra's Earth Totem, in the east. + SPELL_CUSTOM_ERROR_AGGRA_FIRE_TOTEM = 140, // You need to be closer to Aggra's Fire Totem, near Thrall. + SPELL_CUSTOM_ERROR_FACING_WRONG_WAY = 141, // You are facing the wrong way. + SPELL_CUSTOM_ERROR_TOO_CLOSE_TO_MAKESHIFT_DYNAMITE = 142, // You are within 10 yards of another Makeshift Dynamite. + SPELL_CUSTOM_ERROR_NOT_NEAR_SAPPHIRE_SUNKEN_SHIP = 143, // You must be near the sunken ship at Sapphire's End in the Jade Forest. + SPELL_CUSTOM_ERROR_DEMONS_HEALTH_FULL = 144, // That demon's health is already full. + SPELL_CUSTOM_ERROR_ONYX_SERPENT_NOT_OVERHEAD = 145, // Wait until the Onyx Serpent is directly overhead. + SPELL_CUSTOM_ERROR_OBJECTIVE_ALREADY_COMPLETE = 146, // Your objective is already complete. + SPELL_CUSTOM_ERROR_PUSH_SAD_PANDA_TOWARDS_TOWN = 147, // You can only push Sad Panda towards Sad Panda Town! + SPELL_CUSTOM_ERROR_TARGET_HAS_STARTDUST_2 = 148, // Target is already affected by Stardust No. 2. + SPELL_CUSTOM_ERROR_ELEMENTIUM_GEM_CLUSTERS = 149, // You cannot deconstruct Elementium Gem Clusters while collecting them! + SPELL_CUSTOM_ERROR_YOU_DONT_HAVE_ENOUGH_HEALTH = 150, // You don't have enough health. + SPELL_CUSTOM_ERROR_YOU_CANNOT_USE_THE_GATEWAY_YET = 151, // You cannot use the gateway yet. + SPELL_CUSTOM_ERROR_CHOOSE_SPEC_FOR_ASCENDANCE = 152, // You must choose a specialization to use Ascendance. + SPELL_CUSTOM_ERROR_INSUFFICIENT_BLOOD_CHARGES = 153, // You have insufficient Blood Charges. + SPELL_CUSTOM_ERROR_NO_FULLY_DEPLETED_RUNES = 154, // No fully depleted runes. + SPELL_CUSTOM_ERROR_NO_MORE_CHARGES = 155, // No more charges. + SPELL_CUSTOM_ERROR_STATUE_IS_OUT_OF_RANGE_OF_TARGET = 156, // Statue is out of range of the target. + SPELL_CUSTOM_ERROR_YOU_DONT_HAVE_A_STATUE_SUMMONED = 157, // You don't have a statue summoned. + SPELL_CUSTOM_ERROR_YOU_HAVE_NO_SPIRIT_ACTIVE = 158, // You have no spirit active. + SPELL_CUSTOM_ERROR_BOTH_DISESASES_MUST_BE_ON_TARGET = 159, // Both Frost Fever and Blood Plague must be present on the target. + SPELL_CUSTOM_ERROR_CANT_DO_THAT_WITH_ORB_OF_POWER = 160, // You can't do that while holding an Orb of Power. + SPELL_CUSTOM_ERROR_CANT_DO_THAT_WHILE_JUMPING_OR_FALLING = 161, // You can't do that while jumping or falling. + SPELL_CUSTOM_ERROR_MUST_BE_TRANSFORMED_BY_POLYFORMIC_ACID = 162, // You must be transformed by Polyformic Acid. + SPELL_CUSTOM_ERROR_NOT_ENOUGH_ACID_TO_STORE_TRANSFORMATION = 163, // There isn't enough acid left to store this transformation. + SPELL_CUSTOM_ERROR_MUST_HAVE_FLIGHT_MASTERS_LICENSE = 164, // You must obtain a Flight Master's License before using this spell. + SPELL_CUSTOM_ERROR_ALREADY_SAMPLED_SAP_FROM_FEEDER = 165, // You have already sampled sap from this Feeder. + SPELL_CUSTOM_ERROR_MUST_BE_NEWR_MANTID_FEEDER = 166, // Requires you to be near a Mantid Feeder in the Heart of Fear. + SPELL_CUSTOM_ERROR_TARGET_MUST_BE_IN_DIRECTLY_FRONT = 167, // Target must be directly in front of you. + SPELL_CUSTOM_ERROR_CANT_DO_THAT_WHILE_MYTHIC_KEYSTONE_IS_ACTIVE = 168, // You can't do that while a Mythic Keystone is active. + SPELL_CUSTOM_ERROR_WRONG_CLASS_FOR_MOUNT = 169, // You are not the correct class for that mount. + SPELL_CUSTOM_ERROR_NOTHING_LEFT_TO_DISCOVER = 170, // Nothing left to discover. + SPELL_CUSTOM_ERROR_NO_EXPLOSIVES_AVAILABLE = 171, // There are no explosives available. + SPELL_CUSTOM_ERROR_YOU_MUST_BE_FLAGGED_FOR_PVP = 172, // You must be flagged for PvP. + SPELL_CUSTOM_ERROR_REQUIRES_BATTLE_RATIONS = 173, // Requires Battle Rations or Meaty Haunch + SPELL_CUSTOM_ERROR_REQUIRES_BRITTLE_ROOT = 174, // Requires Brittle Root + SPELL_CUSTOM_ERROR_REQUIRES_LABORERS_TOOL = 175, // Requires Laborer's Tool + SPELL_CUSTOM_ERROR_REQUIRES_UNEXPLODED_CANNONBALL = 176, // Requires Unexploded Cannonball + SPELL_CUSTOM_ERROR_REQUIRES_MISPLACED_KEG = 177, // Requires Misplaced Keg + SPELL_CUSTOM_ERROR_REQUIRES_LIQUID_FIRE = 178, // Requires Liquid Fire, Jungle Hops, or Spirit-kissed Water + SPELL_CUSTOM_ERROR_REQUIRES_KRASARI_IRON = 179, // Requires Krasari Iron + SPELL_CUSTOM_ERROR_REQUIRES_SPIRIT_KISSED_WATER = 180, // Requires Spirit-Kissed Water + SPELL_CUSTOM_ERROR_REQUIRES_SNAKE_OIL = 181, // Requires Snake Oil + SPELL_CUSTOM_ERROR_SCENARIO_IS_IN_PROGRESS = 182, // You can't do that while a Scenario is in progress. + SPELL_CUSTOM_ERROR_REQUIRES_DARKMOON_FAIRE_OPEN = 183, // Requires the Darkmoon Faire to be open. + SPELL_CUSTOM_ERROR_ALREADY_AT_VALOR_CAP = 184, // Already at Valor cap + SPELL_CUSTOM_ERROR_ALREADY_COMMENDED_BY_THIS_FACTION = 185, // Already commended by this faction + SPELL_CUSTOM_ERROR_OUT_OF_COINS = 186, // Out of coins! Pickpocket humanoids to get more. + SPELL_CUSTOM_ERROR_ONLY_ONE_ELEMENTAL_SPIRIT = 187, // Only one elemental spirit on a target at a time. + SPELL_CUSTOM_ERROR_DONT_KNOW_HOW_TO_TAME_DIREHORNS = 188, // You do not know how to tame Direhorns. + SPELL_CUSTOM_ERROR_MUST_BE_NEAR_BLOODIED_COURT_GATE = 189, // You must be near the Bloodied Court gate. + SPELL_CUSTOM_ERROR_YOU_ARE_NOT_ELECTRIFIED = 190, // You are not Electrified. + SPELL_CUSTOM_ERROR_THERE_IS_NOTHING_TO_BE_FETCHED = 191, // There is nothing to be fetched. + SPELL_CUSTOM_ERROR_REQUIRES_THE_THUNDER_FORGE = 192, // Requires The Thunder Forge. + SPELL_CUSTOM_ERROR_CANNOT_USE_THE_DICE_AGAIN_YET = 193, // You cannot use the dice again yet. + SPELL_CUSTOM_ERROR_ALREADY_MEMBER_OF_BRAWLERS_GUILD = 194, // You are already a member of the Brawler's Guild. + SPELL_CUSTOM_ERROR_CANT_CHANGE_SPEC_IN_CELESTIAL_CHALLENGE = 195, // You may not change talent specializations during a celestial challenge. + SPELL_CUSTOM_ERROR_SPEC_DOES_MATCH_CHALLENGE = 196, // Your talent specialization does not match the selected challenge. + SPELL_CUSTOM_ERROR_YOU_DONT_HAVE_ENOUGH_CURRENCY = 197, // You don't have enough currency to do that. + SPELL_CUSTOM_ERROR_TARGET_CANNOT_BENEFIT_FROM_SPELL = 198, // Target cannot benefit from that spell + SPELL_CUSTOM_ERROR_YOU_CAN_ONLY_HAVE_ONE_HEALING_RAIN = 199, // You can only have one Healing Rain active at a time. + SPELL_CUSTOM_ERROR_THE_DOOR_IS_LOCKED = 200, // The door is locked. + SPELL_CUSTOM_ERROR_YOU_NEED_TO_SELECT_WAITING_CUSTOMER = 201, // You need to select a customer who is waiting in line first. + SPELL_CUSTOM_ERROR_CANT_CHANGE_SPEC_DURING_TRIAL = 202, // You may not change specialization while a trial is in progress. + SPELL_CUSTOM_ERROR_CUSTOMER_NEED_TO_GET_IN_LINE = 203, // You must wait for customers to get in line before you can select them to be seated. + SPELL_CUSTOM_ERROR_MUST_BE_CLOSER_TO_GAZLOWE_OBJECTIVE = 204, // Must be closer to one of Gazlowe's objectives to deploy! + SPELL_CUSTOM_ERROR_MUST_BE_CLOSER_TO_THAELIN_OBJECTIVE = 205, // Must be closer to one of Thaelin's objectives to deploy! + SPELL_CUSTOM_ERROR_YOUR_PACK_OF_VOLEN_IS_FULL = 206, // Your pack of volen is already full! + SPELL_CUSTOM_ERROR_REQUIRES_600_MINING_OR_BLACKSMITHING = 207, // Requires 600 Mining or Blacksmithing + SPELL_CUSTOM_ERROR_ARKONITE_PROTECTOR_NOT_IN_RANGE = 208, // The Arkonite Protector is not in range. + SPELL_CUSTOM_ERROR_TARGET_CANNOT_HAVE_BOTH_BEACONS = 209, // You are unable to have both Beacon of Light and Beacon of Faith on the same target. + SPELL_CUSTOM_ERROR_CAN_ONLY_USE_ON_AFK_PLAYER = 210, // Can only be used on AFK players. + SPELL_CUSTOM_ERROR_NO_LOOTABLE_CORPSES_IN_RANGE = 211, // No lootable corpse in range + SPELL_CUSTOM_ERROR_CHIMAERON_TOO_CALM_TO_TAME = 212, // Chimaeron is too calm to tame right now. + SPELL_CUSTOM_ERROR_CAN_ONLY_CARRY_ONE_TYPE_OF_MUNITIONS = 213, // You may only carry one type of Blackrock Munitions. + SPELL_CUSTOM_ERROR_OUT_OF_BLACKROCK_MUNITIONS = 214, // You have run out of Blackrock Munitions. + SPELL_CUSTOM_ERROR_CARRYING_MAX_AMOUNT_OF_MUNITIONS = 215, // You are carrying the maximum amount of Blackrock Munitions. + SPELL_CUSTOM_ERROR_TARGET_IS_TOO_FAR_AWAY = 216, // Target is too far away. + SPELL_CUSTOM_ERROR_CANNOT_USE_DURING_BOSS_ENCOUNTER = 217, // Cannot use during a boss encounter. + SPELL_CUSTOM_ERROR_MUST_HAVE_MELEE_WEAPON_IN_BOTH_HANDS = 218, // Must have a Melee Weapon equipped in both hands + SPELL_CUSTOM_ERROR_YOUR_WEAPON_HAS_OVERHEATED = 219, // Your weapon has overheated. + SPELL_CUSTOM_ERROR_MUST_BE_PARTY_LEADER_TO_QUEUE = 220, // You must be a party leader to queue your group. + SPELL_CUSTOM_ERROR_NOT_ENOUGH_FUEL = 221, // Not enough fuel + SPELL_CUSTOM_ERROR_YOU_ARE_ALREADY_DISGUISED = 222, // You are already disguised! + SPELL_CUSTOM_ERROR_YOU_NEED_TO_BE_IN_SHREDDER = 223, // You need to be in a Shredder to chop this up! + SPELL_CUSTOM_ERROR_FOOD_CANNOT_EAT_FOOD = 224, // Food cannot eat food + SPELL_CUSTOM_ERROR_MYSTERIOUS_FORCE_PREVENTS_OPENING_CHEST = 225, // A mysterious force prevents you from opening the chest. + SPELL_CUSTOM_ERROR_CANT_DO_THAT_WHILE_HOLDING_EMPOWERED_ORE = 226, // You can't do that while holding Empowered Ore. + SPELL_CUSTOM_ERROR_NOT_ENOUGH_AMMUNITION = 227, // Not enough Ammunition! + SPELL_CUSTOM_ERROR_YOU_NEED_BEATFACE_THE_GLADIATOR = 228, // You need Beatface the Sparring Arena gladiator to break this! + SPELL_CUSTOM_ERROR_YOU_CAN_ONLY_HAVE_ONE_WAYGATE = 229, // You can only have one waygate open. Disable an activated waygate first. + SPELL_CUSTOM_ERROR_YOU_CAN_ONLY_HAVE_TWO_WAYGATES = 230, // You can only have two waygates open. Disable an activated waygate first. + SPELL_CUSTOM_ERROR_YOU_CAN_ONLY_HAVE_THREE_WAYGATES = 231, // You can only have three waygates open. Disable an activated waygate first. + SPELL_CUSTOM_ERROR_REQUIRES_MAGE_TOWER = 232, // Requires Mage Tower + SPELL_CUSTOM_ERROR_REQUIRES_SPIRIT_LODGE = 233, // Requires Spirit Lodge + SPELL_CUSTOM_ERROR_FROST_WYRM_ALREADY_ACTIVE = 234, // A Frost Wyrm is already active. + SPELL_CUSTOM_ERROR_NOT_ENOUGH_RUNIC_POWER = 235, // Not enough Runic Power + SPELL_CUSTOM_ERROR_YOU_ARE_THE_PARTY_LEADER = 236, // You are the Party Leader. + SPELL_CUSTOM_ERROR_YULON_IS_ALREADY_ACTIVE = 237, // Yu'lon is already active. + SPELL_CUSTOM_ERROR_A_STAMPEDE_IS_ALREADY_ACTIVE = 238, // A Stampede is already active. + SPELL_CUSTOM_ERROR_YOU_ARE_ALREADY_WELL_FED = 239, // You are already Well Fed. + SPELL_CUSTOM_ERROR_CANT_DO_THAT_UNDER_SUPPRESSIVE_FIRE = 240, // You cannot do that while under Suppressive Fire. + SPELL_CUSTOM_ERROR_YOU_ALREADY_HAVE_MURLOC_SLOP = 241, // You already have a piece of Murloc Slop. + SPELL_CUSTOM_ERROR_YOU_DONT_HAVE_ARTIFACT_FRAGMENTS = 242, // You don't have any Artifact Fragments. + SPELL_CUSTOM_ERROR_YOU_ARENT_IN_A_PARTY = 243, // You aren't in a Party. + SPELL_CUSTOM_ERROR_REQUIRES_20_AMMUNITION = 244, // Requires 30 Ammunition! + SPELL_CUSTOM_ERROR_REQUIRES_30_AMMUNITION = 245, // Requires 20 Ammunition! + SPELL_CUSTOM_ERROR_YOU_ALREADY_HAVE_MAX_OUTCAST_FOLLOWERS = 246, // You already have the maximum amount of Outcasts following you. + SPELL_CUSTOM_ERROR_NOT_IN_WORLD_PVP_ZONE = 247, // Not in World PvP zone. + SPELL_CUSTOM_ERROR_ALREADY_AT_RESOURCE_CAP = 248, // Already at Resource cap + SPELL_CUSTOM_ERROR_APEXIS_SENTINEL_REQUIRES_ENERGY = 249, // This Apexis Sentinel requires energy from a nearby Apexis Pylon to be powered up. + SPELL_CUSTOM_ERROR_YOU_MUST_HAVE_3_OR_FEWER_PLAYER = 250, // You must have 3 or fewer players. + SPELL_CUSTOM_ERROR_YOU_ALREADY_READ_TREASURE_MAP = 251, // You have already read that treasure map. + SPELL_CUSTOM_ERROR_MAY_ONLY_USE_WHILE_GARRISON_UNDER_ATTACK = 252, // You may only use this item while your garrison is under attack. + SPELL_CUSTOM_ERROR_REQUIRES_ACTIVE_MUSHROOMS = 253, // This spell requires active mushrooms for you to detonate. + SPELL_CUSTOM_ERROR_REQUIRES_FASTER_TIME_WITH_RACER = 254, // Requires a faster time with the basic racer + SPELL_CUSTOM_ERROR_REQUIRES_INFERNO_SHOT_AMMO = 255, // Requires Inferno Shot Ammo! + SPELL_CUSTOM_ERROR_YOU_CANNOT_DO_THAT_RIGHT_NOW = 256, // You cannot do that right now. + SPELL_CUSTOM_ERROR_A_TRAP_IS_ALREADY_PLACED_THERE = 257, // A trap is already placed there. + SPELL_CUSTOM_ERROR_YOU_ARE_ALREADY_ON_THAT_QUEST = 258, // You are already on that quest. + SPELL_CUSTOM_ERROR_REQUIRES_FELFORGED_CUDGEL = 259, // Requires a Felforged Cudgel! + SPELL_CUSTOM_ERROR_CANT_TAKE_WHILE_BEING_DAMAGED = 260, // Can't take while being damaged! + SPELL_CUSTOM_ERROR_YOU_ARE_BOUND_TO_DRAENOR = 261, // You are bound to Draenor by Archimonde's magic. + SPELL_CUSTOM_ERROR_ALREAY_HAVE_MAX_NUMBER_OF_SHIPS = 262, // You already have the maximum number of ships your shipyard can support. + SPELL_CUSTOM_ERROR_MUST_BE_AT_SHIPYARD = 263, // You must be at your shipyard. + SPELL_CUSTOM_ERROR_REQUIRES_LEVEL_3_MAGE_TOWER = 264, // Requires a level 3 Mage Tower. + SPELL_CUSTOM_ERROR_REQUIRES_LEVEL_3_SPIRIT_LODGE = 265, // Requires a level 3 Spirit Lodge. + SPELL_CUSTOM_ERROR_YOU_DO_NOT_LIKE_FEL_EGGS_AND_HAM = 266, // You do not like Fel Eggs and Ham. + SPELL_CUSTOM_ERROR_ALREADY_ENTERED_IN_THIS_AGREEMENT = 267, // You have already entered in to this trade agreement. + SPELL_CUSTOM_ERROR_CANNOT_STEAL_THAT_WHILE_GUARDS_ARE_ON_DUTY = 268, // You cannot steal that while guards are on duty. + SPELL_CUSTOM_ERROR_YOU_ALREADY_USED_VANTUS_RUNE = 269, // You have already used a Vantus Rune this week. + SPELL_CUSTOM_ERROR_THAT_ITEM_CANNOT_BE_OBLITERATED = 270, // That item cannot be obliterated. + SPELL_CUSTOM_ERROR_NO_SKINNABLE_CORPSE_IN_RANGE = 271, // No skinnable corpse in range + SPELL_CUSTOM_ERROR_MUST_BE_MERCENARY_TO_USE_TRINKET = 272, // You must be a Mercenary to use this trinket. + SPELL_CUSTOM_ERROR_YOU_MUST_BE_IN_COMBAT = 273, // You must be in combat. + SPELL_CUSTOM_ERROR_NO_ENEMIES_NEAR_TARGET = 274, // No enemies near target. + SPELL_CUSTOM_ERROR_REQUIRES_LEYSPINE_MISSILE = 275, // Requires a Leyspine Missile + SPELL_CUSTOM_ERROR_REQUIRES_BOTH_CURRENTS_CONNECTED = 276, // Requires both currents connected. + SPELL_CUSTOM_ERROR_CANT_DO_THAT_IN_DEMON_FORM = 277, // Can't do that while in demon form (yet) + SPELL_CUSTOM_ERROR_YOU_DONT_KNOW_HOW_TO_TAME_MECHS = 278, // You do not know how to tame or obtain lore about Mechs. + SPELL_CUSTOM_ERROR_CANNOT_CHARM_ANY_MORE_WITHERED = 279, // You cannot charm any more withered. + SPELL_CUSTOM_ERROR_REQUIRES_ACTIVE_HEALING_RAIN = 280, // Requires an active Healing Rain. + SPELL_CUSTOM_ERROR_ALREADY_COLLECTED_APPEARANCES = 281, // You've already collected these appearances + SPELL_CUSTOM_ERROR_CANNOT_RESURRECT_SURRENDERED_TO_MADNESS = 282, // Cannot resurrect someone who has surrendered to madness + SPELL_CUSTOM_ERROR_YOU_MUST_BE_IN_CAT_FORM = 283, // You must be in Cat Form. + SPELL_CUSTOM_ERROR_YOU_CANNOT_RELEASE_SPIRIT_YET = 284, // You cannot Release Spirit yet. + SPELL_CUSTOM_ERROR_NO_FISHING_NODES_NEARBY = 285, // No fishing nodes nearby. + SPELL_CUSTOM_ERROR_YOU_ARE_NOT_IN_CORRECT_SPEC = 286, // You are not the correct specialization. + SPELL_CUSTOM_ERROR_ULTHALESH_HAS_NO_POWER_WITHOUT_SOULS = 287, // Ulthalesh has no power without souls. + SPELL_CUSTOM_ERROR_CANNOT_CAST_THAT_WITH_VOODOO_TOTEM = 288, // You cannot cast that while talented into Voodoo Totem. + SPELL_CUSTOM_ERROR_ALREADY_COLLECTED_THIS_APPEARANCE = 289, // You've already collected this appearance. + SPELL_CUSTOM_ERROR_YOUR_PET_MAXIMUM_IS_ALREADY_HIGH = 290, // Your total pet maximum is already this high. + SPELL_CUSTOM_ERROR_YOU_DONT_HAVE_ENOUGH_WITHERED = 291, // You do not have enough withered to do that. + SPELL_CUSTOM_ERROR_REQUIRES_NEARBY_SOUL_FRAGMENT = 292, // Requires a nearby Soul Fragment. + SPELL_CUSTOM_ERROR_REQUIRES_AT_LEAST_10_WITHERED = 293, // Requires at least 10 living withered + SPELL_CUSTOM_ERROR_REQUIRES_AT_LEAST_14_WITHERED = 294, // Requires at least 14 living withered + SPELL_CUSTOM_ERROR_REQUIRES_AT_LEAST_18_WITHERED = 295, // Requires at least 18 living withered + SPELL_CUSTOM_ERROR_REQUIRES_2_WITHERED_MANA_RAGERS = 296, // Requires 2 Withered Mana-Ragers + SPELL_CUSTOM_ERROR_REQUIRES_1_WITHERED_BERSERKE = 297, // Requires 1 Withered Berserker + SPELL_CUSTOM_ERROR_REQUIRES_2_WITHERED_BERSERKER = 298, // Requires 2 Withered Berserkers + SPELL_CUSTOM_ERROR_TARGET_HEALTH_IS_TOO_LOW = 299, // Target's health is too low + SPELL_CUSTOM_ERROR_CANNOT_SHAPESHIFT_WHILE_RIDING_STORMTALON = 300, // You cannot shapeshift while riding Stormtalon + SPELL_CUSTOM_ERROR_CANNOT_CHANGE_SPEC_IN_COMBAT_TRAINING = 301, // You can not change specializations while in Combat Training. + SPELL_CUSTOM_ERROR_UNKNOWN_PHENOMENON_PREVENTS_LEYLINE_CONNECTION = 302, // Unknown phenomenon is preventing a connection to the Leyline. + SPELL_CUSTOM_ERROR_THE_NIGHTMARE_OBSCURES_YOUR_VISION = 303, // The Nightmare obscures your vision. + SPELL_CUSTOM_ERROR_YOU_ARE_IN_WRONG_CLASS_SPEC = 304, // You are in the wrong class specialization. + SPELL_CUSTOM_ERROR_THERE_ARE_NO_VALID_CORPSES_NEARBY = 305, // There are no valid corpses nearby. + SPELL_CUSTOM_ERROR_CANT_CAST_THAT_RIGHT_NOW = 306, // Can't cast that right now. + SPELL_CUSTOM_ERROR_NOT_ENOUGH_ANCIENT_MAN = 307, // Not enough Ancient Mana. + SPELL_CUSTOM_ERROR_REQUIRES_SONG_SCROLL = 308, // Requires a Song Scroll to function. + SPELL_CUSTOM_ERROR_MUST_HAVE_ARTIFACT_EQUIPPED = 309, // You must have an artifact weapon equipped. + SPELL_CUSTOM_ERROR_REQUIRES_CAT_FORM = 310, // Requires Cat Form. + SPELL_CUSTOM_ERROR_REQUIRES_BEAR_FORM = 311, // Requires Bear Form. + SPELL_CUSTOM_ERROR_REQUIRES_CONJURED_FOOD = 312, // Requires either a Conjured Mana Pudding or Conjured Mana Fritter. + SPELL_CUSTOM_ERROR_REQUIRES_ARTIFACT_WEAPON = 313, // Requires an artifact weapon. + SPELL_CUSTOM_ERROR_YOU_CANT_CAST_THAT_HERE = 314, // You can't cast that here + SPELL_CUSTOM_ERROR_CANT_DO_THAT_ON_CLASS_TRIAL = 315, // You cannot do that while on a Class Trial. + SPELL_CUSTOM_ERROR_RITUAL_OF_DOOM_ONCE_PER_DAY = 316, // You can only benefit from the Ritual of Doom once per day. + SPELL_CUSTOM_ERROR_CANNOT_RITUAL_OF_DOOM_WHILE_SUMMONING_SITERS = 317, // You cannot perform the Ritual of Doom while attempting to summon the sisters. + SPELL_CUSTOM_ERROR_LEARNED_ALL_THAT_YOU_CAN_ABOUT_YOUR_ARTIFACT = 318, // You have learned all that you can about your artifact. + SPELL_CUSTOM_ERROR_CANT_CALL_PET_WITH_LONE_WOLF = 319, // You cannot use Call Pet while Lone Wolf is active. }; enum StealthType @@ -2013,6 +2218,7 @@ enum Targets TARGET_UNK_145 = 145, TARGET_UNK_146 = 146, TARGET_UNK_147 = 147, + TARGET_UNK_148 = 148, TOTAL_SPELL_TARGETS }; @@ -2128,6 +2334,7 @@ enum GameObjectFlags GO_FLAG_DAMAGED = 0x00000200, GO_FLAG_DESTROYED = 0x00000400, GO_FLAG_INTERACT_DISTANCE_USES_TEMPLATE_MODEL = 0x00080000, // client checks interaction distance from model sent in SMSG_QUERY_GAMEOBJECT_RESPONSE instead of GAMEOBJECT_DISPLAYID + GO_FLAG_MAP_OBJECT = 0x00100000 // pre-7.0 model loading used to be controlled by file extension (wmo vs m2) }; enum GameObjectDynamicLowFlags @@ -3883,58 +4090,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, @@ -3950,61 +4144,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, @@ -4016,12 +4194,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, @@ -4030,31 +4204,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, @@ -4073,7 +4242,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, @@ -4093,28 +4262,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; @@ -4202,11 +4374,9 @@ enum UnitDynFlags UNIT_DYNFLAG_LOOTABLE = 0x0002, UNIT_DYNFLAG_TRACK_UNIT = 0x0004, UNIT_DYNFLAG_TAPPED = 0x0008, // Lua_UnitIsTapped - UNIT_DYNFLAG_TAPPED_BY_PLAYER = 0x0010, // Lua_UnitIsTappedByPlayer - UNIT_DYNFLAG_SPECIALINFO = 0x0020, - UNIT_DYNFLAG_DEAD = 0x0040, - UNIT_DYNFLAG_REFER_A_FRIEND = 0x0080, - UNIT_DYNFLAG_TAPPED_BY_ALL_THREAT_LIST = 0x0100 // Lua_UnitIsTappedByAllThreatList + UNIT_DYNFLAG_SPECIALINFO = 0x0010, + UNIT_DYNFLAG_DEAD = 0x0020, + UNIT_DYNFLAG_REFER_A_FRIEND = 0x0040 }; enum CorpseDynFlags diff --git a/src/server/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp index c0faf1867b7..b16bee6aec0 100644 --- a/src/server/game/Movement/Spline/MoveSpline.cpp +++ b/src/server/game/Movement/Spline/MoveSpline.cpp @@ -43,11 +43,11 @@ Location MoveSpline::ComputePosition() const else if (splineflags.falling) computeFallElevation(c.z); - if (splineflags.done && splineflags.isFacing()) + if (splineflags.done && facing.type != MONSTER_MOVE_NORMAL) { - if (splineflags.final_angle) + if (facing.type == MONSTER_MOVE_FACING_ANGLE) c.orientation = facing.angle; - else if (splineflags.final_point) + else if (facing.type == MONSTER_MOVE_FACING_SPOT) c.orientation = std::atan2(facing.f.y - c.y, facing.f.x - c.x); //nothing to do for MoveSplineFlag::Final_Target flag } @@ -165,6 +165,7 @@ void MoveSpline::Initialize(MoveSplineInitArgs const& args) time_passed = 0; vertical_acceleration = 0.f; effect_start_time = 0; + splineIsFacingOnly = args.path.size() == 2 && args.facing.type != MONSTER_MOVE_NORMAL && ((args.path[1] - args.path[0]).length() < 0.1f); // Check if its a stop spline if (args.flags.done) @@ -177,7 +178,7 @@ void MoveSpline::Initialize(MoveSplineInitArgs const& args) // init parabolic / animation // spline initialized, duration known and i able to compute parabolic acceleration - if (args.flags & (MoveSplineFlag::Parabolic | MoveSplineFlag::Animation)) + if (args.flags & (MoveSplineFlag::Parabolic | MoveSplineFlag::Animation | MoveSplineFlag::Unknown6)) { effect_start_time = Duration() * args.time_perc; if (args.flags.parabolic && effect_start_time < Duration()) @@ -190,7 +191,7 @@ void MoveSpline::Initialize(MoveSplineInitArgs const& args) MoveSpline::MoveSpline() : m_Id(0), time_passed(0), vertical_acceleration(0.f), initialOrientation(0.f), effect_start_time(0), point_Idx(0), point_Idx_offset(0), - onTransport(false) + onTransport(false), splineIsFacingOnly(false) { splineflags.done = true; } @@ -208,32 +209,18 @@ bool MoveSplineInitArgs::Validate(Unit* unit) const CHECK(path.size() > 1); CHECK(velocity > 0.1f); CHECK(time_perc >= 0.f && time_perc <= 1.f); - //CHECK(_checkPathBounds()); + CHECK(_checkPathLengths()); return true; #undef CHECK } -// MONSTER_MOVE packet format limitation for not CatmullRom movement: -// each vertex offset packed into 11 bytes -bool MoveSplineInitArgs::_checkPathBounds() const +// check path lengths - why are we even starting such short movement? +bool MoveSplineInitArgs::_checkPathLengths() const { - if (!(flags & MoveSplineFlag::Catmullrom) && path.size() > 2) - { - enum{ - MAX_OFFSET = (1 << 11) / 2 - }; - Vector3 middle = (path.front()+path.back()) / 2; - Vector3 offset; - for (uint32 i = 1; i < path.size()-1; ++i) - { - offset = path[i] - middle; - if (std::fabs(offset.x) >= MAX_OFFSET || std::fabs(offset.y) >= MAX_OFFSET || std::fabs(offset.z) >= MAX_OFFSET) - { - TC_LOG_ERROR("misc", "MoveSplineInitArgs::_checkPathBounds check failed"); + if (path.size() > 2 || facing.type == MONSTER_MOVE_NORMAL) + for (uint32 i = 0; i < path.size() - 1; ++i) + if ((path[i + 1] - path[i]).length() < 0.1f) return false; - } - } - } return true; } @@ -287,11 +274,11 @@ std::string MoveSpline::ToString() const str << "MoveSpline" << std::endl; str << "spline Id: " << GetId() << std::endl; str << "flags: " << splineflags.ToString() << std::endl; - if (splineflags.final_angle) + if (facing.type == MONSTER_MOVE_FACING_ANGLE) str << "facing angle: " << facing.angle; - else if (splineflags.final_target) + else if (facing.type == MONSTER_MOVE_FACING_TARGET) str << "facing target: " << facing.target.ToString(); - else if (splineflags.final_point) + else if (facing.type == MONSTER_MOVE_FACING_SPOT) str << "facing point: " << facing.f.x << " " << facing.f.y << " " << facing.f.z; str << std::endl; str << "time passed: " << time_passed << std::endl; diff --git a/src/server/game/Movement/Spline/MoveSpline.h b/src/server/game/Movement/Spline/MoveSpline.h index 24a6d85fcbc..f4f1e07cbe0 100644 --- a/src/server/game/Movement/Spline/MoveSpline.h +++ b/src/server/game/Movement/Spline/MoveSpline.h @@ -134,6 +134,7 @@ namespace Movement int32 currentPathIdx() const; bool onTransport; + bool splineIsFacingOnly; std::string ToString() const; }; } diff --git a/src/server/game/Movement/Spline/MoveSplineFlag.h b/src/server/game/Movement/Spline/MoveSplineFlag.h index acd0c94bbf1..94d0b7bc13f 100644 --- a/src/server/game/Movement/Spline/MoveSplineFlag.h +++ b/src/server/game/Movement/Spline/MoveSplineFlag.h @@ -56,20 +56,19 @@ namespace Movement Unknown5 = 0x01000000, // NOT VERIFIED Animation = 0x02000000, // Plays animation after some time passed Parabolic = 0x04000000, // Affects elevation computation, can't be combined with Falling flag - Final_Point = 0x08000000, - Final_Target = 0x10000000, - Final_Angle = 0x20000000, - Unknown6 = 0x40000000, // NOT VERIFIED - Unknown7 = 0x80000000, // NOT VERIFIED + Unknown6 = 0x08000000, // NOT VERIFIED + Unknown7 = 0x10000000, // NOT VERIFIED + Unknown8 = 0x20000000, // NOT VERIFIED + Unknown9 = 0x40000000, // NOT VERIFIED + Unknown10 = 0x80000000, // NOT VERIFIED // Masks - Mask_Final_Facing = Final_Point | Final_Target | Final_Angle, // animation ids stored here, see AnimType enum, used with Animation flag Mask_Animations = 0x7, // flags that shouldn't be appended into SMSG_MONSTER_MOVE\SMSG_MONSTER_MOVE_TRANSPORT packet, should be more probably - Mask_No_Monster_Move = Mask_Final_Facing | Mask_Animations | Done, + Mask_No_Monster_Move = Mask_Animations | Done, // Unused, not suported flags - Mask_Unused = No_Spline|Enter_Cycle|Frozen|Unknown0|Unknown1|Unknown2|Unknown3|Unknown4|Unknown5|Unknown6|Unknown7 + Mask_Unused = No_Spline|Enter_Cycle|Frozen|Unknown0|Unknown1|Unknown2|Unknown3|Unknown4|Unknown5|Unknown6|Unknown7|Unknown8|Unknown9|Unknown10 }; inline uint32& raw() { return (uint32&)*this; } @@ -83,7 +82,6 @@ namespace Movement bool isSmooth() const { return (raw() & Catmullrom) != 0; } bool isLinear() const { return !isSmooth(); } - bool isFacing() const { return (raw() & Mask_Final_Facing) != 0; } uint8 getAnimationId() const { return animId; } bool hasAllFlags(uint32 f) const { return (raw() & f) == f; } @@ -102,9 +100,6 @@ namespace Movement void EnableFlying() { raw() = (raw() & ~(Falling)) | Flying; } void EnableFalling() { raw() = (raw() & ~(Mask_Animations | Parabolic | Animation | Flying)) | Falling; } void EnableCatmullRom() { raw() = (raw() & ~SmoothGroundPath) | Catmullrom; } - void EnableFacingPoint() { raw() = (raw() & ~Mask_Final_Facing) | Final_Point; } - void EnableFacingAngle() { raw() = (raw() & ~Mask_Final_Facing) | Final_Angle; } - void EnableFacingTarget() { raw() = (raw() & ~Mask_Final_Facing) | Final_Target; } void EnableTransportEnter() { raw() = (raw() & ~TransportExit) | TransportEnter; } void EnableTransportExit() { raw() = (raw() & ~TransportEnter) | TransportExit; } @@ -133,11 +128,11 @@ namespace Movement bool unknown5 : 1; bool animation : 1; bool parabolic : 1; - bool final_point : 1; - bool final_target : 1; - bool final_angle : 1; bool unknown6 : 1; bool unknown7 : 1; + bool unknown8 : 1; + bool unknown9 : 1; + bool unknown10 : 1; }; #pragma pack(pop) } diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index 114f683b601..f4d5a449e57 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -161,6 +161,7 @@ namespace Movement WorldPackets::Movement::MonsterMove packet; packet.MoverGUID = unit->GetGUID(); packet.Pos = loc; + packet.SplineData.StopDistanceTolerance = 2; packet.SplineData.ID = move_spline.GetId(); if (transport) @@ -185,8 +186,9 @@ namespace Movement void MoveSplineInit::SetFacing(const Unit* target) { - args.flags.EnableFacingTarget(); + args.facing.angle = unit->GetAngle(target); args.facing.target = target->GetGUID(); + args.facing.type = MONSTER_MOVE_FACING_TARGET; } void MoveSplineInit::SetFacing(float angle) @@ -200,7 +202,7 @@ namespace Movement } args.facing.angle = G3D::wrap(angle, 0.f, (float)G3D::twoPi()); - args.flags.EnableFacingAngle(); + args.facing.type = MONSTER_MOVE_FACING_ANGLE; } void MoveSplineInit::MoveTo(const Vector3& dest, bool generatePath, bool forceDestination) diff --git a/src/server/game/Movement/Spline/MoveSplineInit.h b/src/server/game/Movement/Spline/MoveSplineInit.h index 421a8d6b06c..f0b5e9aaac0 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.h +++ b/src/server/game/Movement/Spline/MoveSplineInit.h @@ -200,7 +200,7 @@ namespace Movement args.facing.f.x = finalSpot.x; args.facing.f.y = finalSpot.y; args.facing.f.z = finalSpot.z; - args.flags.EnableFacingPoint(); + args.facing.type = MONSTER_MOVE_FACING_SPOT; } inline void MoveSplineInit::DisableTransportPathTransformations() { args.TransformForTransport = false; } diff --git a/src/server/game/Movement/Spline/MoveSplineInitArgs.h b/src/server/game/Movement/Spline/MoveSplineInitArgs.h index e6e1198aa07..60cb4db8b55 100644 --- a/src/server/game/Movement/Spline/MoveSplineInitArgs.h +++ b/src/server/game/Movement/Spline/MoveSplineInitArgs.h @@ -35,7 +35,9 @@ namespace Movement ObjectGuid target; float angle; - FacingInfo() : angle(0.0f) { } + MonsterMoveType type; + + FacingInfo() : angle(0.0f), type(MONSTER_MOVE_NORMAL) { } }; struct MoveSplineInitArgs @@ -63,7 +65,7 @@ namespace Movement bool Validate(Unit* unit) const; private: - bool _checkPathBounds() const; + bool _checkPathLengths() const; }; } diff --git a/src/server/game/Movement/Spline/MovementUtil.cpp b/src/server/game/Movement/Spline/MovementUtil.cpp index a7aa84f3680..745802f0138 100644 --- a/src/server/game/Movement/Spline/MovementUtil.cpp +++ b/src/server/game/Movement/Spline/MovementUtil.cpp @@ -149,7 +149,7 @@ namespace Movement STRINGIZE(Done ), // 0x00000020 STRINGIZE(Falling ), // 0x00000040 // Not Compartible With Trajectory Movement STRINGIZE(No_Spline ), // 0x00000080 - STRINGIZE(Unknown2 ), // 0x00000100 + STRINGIZE(Unknown1 ), // 0x00000100 STRINGIZE(Flying ), // 0x00000200 // Smooth Movement(Catmullrom Interpolation Mode), Flying Animation STRINGIZE(OrientationFixed ), // 0x00000400 // Model Orientation Fixed STRINGIZE(Catmullrom ), // 0x00000800 // Used Catmullrom Interpolation Mode @@ -158,21 +158,21 @@ namespace Movement STRINGIZE(Frozen ), // 0x00004000 STRINGIZE(TransportEnter ), // 0x00008000 STRINGIZE(TransportExit ), // 0x00010000 - STRINGIZE(Unknown3 ), // 0x00020000 - STRINGIZE(Unknown4 ), // 0x00040000 + STRINGIZE(Unknown2 ), // 0x00020000 + STRINGIZE(Unknown3 ), // 0x00040000 STRINGIZE(OrientationInversed), // 0x00080000 // Appears With Runmode Flag, Nodes ), // 1, Handles Orientation STRINGIZE(SmoothGroundPath ), // 0x00100000 STRINGIZE(Walkmode ), // 0x00200000 STRINGIZE(UncompressedPath ), // 0x00400000 - STRINGIZE(Unknown6 ), // 0x00800000 - STRINGIZE(Animation ), // 0x01000000 // Animationid (0...3), Uint32 Time, Not Compartible With Trajectory And Fall Movement - STRINGIZE(Parabolic ), // 0x02000000 // Not Compartible With Fall Movement - STRINGIZE(Final_Point ), // 0x04000000 - STRINGIZE(Final_Target ), // 0x08000000 - STRINGIZE(Final_Angle ), // 0x10000000 - STRINGIZE(Unknown7 ), // 0x20000000 - STRINGIZE(Unknown8 ), // 0x40000000 - STRINGIZE(Unknown9 ), // 0x80000000 + STRINGIZE(Unknown4 ), // 0x00800000 + STRINGIZE(Unknown5 ), // 0x01000000 + STRINGIZE(Animation ), // 0x02000000 // Animationid (0...3), Uint32 Time, Not Compartible With Trajectory And Fall Movement + STRINGIZE(Parabolic ), // 0x04000000 // Not Compartible With Fall Movement + STRINGIZE(Unknown6 ), // 0x08000000 + STRINGIZE(Unknown7 ), // 0x10000000 + STRINGIZE(Unknown8 ), // 0x20000000 + STRINGIZE(Unknown9 ), // 0x40000000 + STRINGIZE(Unknown10 ), // 0x80000000 }; template<class Flags, int N> diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index 91a928b7a98..083c5a59e40 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -17,6 +17,7 @@ */ #include "QuestDef.h" +#include "GameTables.h" #include "Player.h" #include "World.h" #include "QuestPackets.h" @@ -44,20 +45,25 @@ Quest::Quest(Field* questRecord) RewardMoneyDifficulty = questRecord[12].GetUInt32(); RewardMoneyMultiplier = questRecord[13].GetFloat(); RewardBonusMoney = questRecord[14].GetUInt32(); - RewardDisplaySpell = questRecord[15].GetUInt32(); - RewardSpell = questRecord[16].GetUInt32(); - RewardHonor = questRecord[17].GetUInt32(); - RewardKillHonor = questRecord[18].GetUInt32(); - SourceItemId = questRecord[19].GetUInt32(); - Flags = questRecord[20].GetUInt32(); - FlagsEx = questRecord[21].GetUInt32(); + for (uint32 i = 0; i < QUEST_REWARD_DISPLAY_SPELL_COUNT; ++i) + RewardDisplaySpell[i] = questRecord[15 + i].GetUInt32(); + + RewardSpell = questRecord[18].GetUInt32(); + RewardHonor = questRecord[19].GetUInt32(); + RewardKillHonor = questRecord[20].GetUInt32(); + SourceItemId = questRecord[21].GetUInt32(); + RewardArtifactXPDifficulty = questRecord[22].GetUInt32(); + RewardArtifactXPMultiplier = questRecord[23].GetFloat(); + RewardArtifactCategoryID = questRecord[24].GetUInt32(); + Flags = questRecord[25].GetUInt32(); + FlagsEx = questRecord[26].GetUInt32(); for (uint32 i = 0; i < QUEST_ITEM_DROP_COUNT; ++i) { - RewardItemId[i] = questRecord[22+i*4].GetUInt32(); - RewardItemCount[i] = questRecord[23+i*4].GetUInt32(); - ItemDrop[i] = questRecord[24+i*4].GetUInt32(); - ItemDropQuantity[i] = questRecord[25+i*4].GetUInt32(); + RewardItemId[i] = questRecord[27 + i * 4].GetUInt32(); + RewardItemCount[i] = questRecord[28 + i * 4].GetUInt32(); + ItemDrop[i] = questRecord[29 + i * 4].GetUInt32(); + ItemDropQuantity[i] = questRecord[30 + i * 4].GetUInt32(); if (RewardItemId[i]) ++_rewItemsCount; @@ -65,63 +71,64 @@ Quest::Quest(Field* questRecord) for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) { - RewardChoiceItemId[i] = questRecord[38+i*3].GetUInt32(); - RewardChoiceItemCount[i] = questRecord[39+i*3].GetUInt32(); - RewardChoiceItemDisplayId[i] = questRecord[40+i*3].GetUInt32(); + RewardChoiceItemId[i] = questRecord[43 + i * 3].GetUInt32(); + RewardChoiceItemCount[i] = questRecord[44 + i * 3].GetUInt32(); + RewardChoiceItemDisplayId[i] = questRecord[45 + i * 3].GetUInt32(); if (RewardChoiceItemId[i]) ++_rewChoiceItemsCount; } - POIContinent = questRecord[56].GetUInt32(); - POIx = questRecord[57].GetFloat(); - POIy = questRecord[58].GetFloat(); - POIPriority = questRecord[59].GetUInt32(); + POIContinent = questRecord[61].GetUInt32(); + POIx = questRecord[62].GetFloat(); + POIy = questRecord[63].GetFloat(); + POIPriority = questRecord[64].GetUInt32(); - RewardTitleId = questRecord[60].GetUInt32(); - RewardTalents = questRecord[61].GetUInt32(); - RewardArenaPoints = questRecord[62].GetUInt32(); - RewardSkillId = questRecord[63].GetUInt32(); - RewardSkillPoints = questRecord[64].GetUInt32(); + RewardTitleId = questRecord[65].GetUInt32(); + RewardArenaPoints = questRecord[66].GetUInt32(); + RewardSkillId = questRecord[67].GetUInt32(); + RewardSkillPoints = questRecord[68].GetUInt32(); - QuestGiverPortrait = questRecord[65].GetUInt32(); - QuestTurnInPortrait = questRecord[66].GetUInt32(); + QuestGiverPortrait = questRecord[69].GetUInt32(); + QuestTurnInPortrait = questRecord[70].GetUInt32(); for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i) { - RewardFactionId[i] = questRecord[67+i*3].GetUInt32(); - RewardFactionValue[i] = questRecord[68+i*3].GetInt32(); - RewardFactionOverride[i] = questRecord[69+i*3].GetInt32(); + RewardFactionId[i] = questRecord[71 + i * 4].GetUInt32(); + RewardFactionValue[i] = questRecord[72 + i * 4].GetInt32(); + RewardFactionOverride[i] = questRecord[73 + i * 4].GetInt32(); + RewardFactionCapIn[i] = questRecord[74 + i * 4].GetUInt32(); } - RewardReputationMask = questRecord[82].GetUInt32(); + RewardReputationMask = questRecord[91].GetUInt32(); for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i) { - RewardCurrencyId[i] = questRecord[83+i*2].GetUInt32(); - RewardCurrencyCount[i] = questRecord[84+i*2].GetUInt32(); + RewardCurrencyId[i] = questRecord[91 + i * 2].GetUInt32(); + RewardCurrencyCount[i] = questRecord[92 + i * 2].GetUInt32(); if (RewardCurrencyId[i]) ++_rewCurrencyCount; } - SoundAccept = questRecord[91].GetUInt32(); - SoundTurnIn = questRecord[92].GetUInt32(); - AreaGroupID = questRecord[93].GetUInt32(); - LimitTime = questRecord[94].GetUInt32(); - AllowableRaces = questRecord[95].GetInt32(); - - LogTitle = questRecord[96].GetString(); - LogDescription = questRecord[97].GetString(); - QuestDescription = questRecord[98].GetString(); - AreaDescription = questRecord[99].GetString(); - PortraitGiverText = questRecord[100].GetString(); - PortraitGiverName = questRecord[101].GetString(); - PortraitTurnInText = questRecord[102].GetString(); - PortraitTurnInName = questRecord[103].GetString(); - QuestCompletionLog = questRecord[104].GetString(); - - for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) + SoundAccept = questRecord[100].GetUInt32(); + SoundTurnIn = questRecord[101].GetUInt32(); + AreaGroupID = questRecord[102].GetUInt32(); + LimitTime = questRecord[103].GetUInt32(); + AllowableRaces = questRecord[104].GetInt32(); + QuestRewardID = questRecord[105].GetUInt32(); + + LogTitle = questRecord[106].GetString(); + LogDescription = questRecord[107].GetString(); + QuestDescription = questRecord[108].GetString(); + AreaDescription = questRecord[109].GetString(); + PortraitGiverText = questRecord[110].GetString(); + PortraitGiverName = questRecord[111].GetString(); + PortraitTurnInText = questRecord[112].GetString(); + PortraitTurnInName = questRecord[113].GetString(); + QuestCompletionLog = questRecord[114].GetString(); + + for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i) { DetailsEmote[i] = 0; DetailsEmoteDelay[i] = 0; @@ -132,11 +139,11 @@ Quest::Quest(Field* questRecord) void Quest::LoadQuestDetails(Field* fields) { - for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - DetailsEmote[i] = fields[1+i].GetUInt16(); + for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i) + DetailsEmote[i] = fields[1 + i].GetUInt16(); - for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - DetailsEmoteDelay[i] = fields[5+i].GetUInt32(); + for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i) + DetailsEmoteDelay[i] = fields[5 + i].GetUInt32(); } void Quest::LoadQuestRequestItems(Field* fields) @@ -148,14 +155,13 @@ void Quest::LoadQuestRequestItems(Field* fields) RequestItemsText = fields[5].GetString(); } - void Quest::LoadQuestOfferReward(Field* fields) { - for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - OfferRewardEmote[i] = fields[1+i].GetUInt16(); + for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i) + OfferRewardEmote[i] = fields[1 + i].GetUInt16(); - for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - OfferRewardEmoteDelay[i] = fields[5+i].GetUInt32(); + for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i) + OfferRewardEmoteDelay[i] = fields[5 + i].GetUInt32(); OfferRewardText = fields[9].GetString(); } @@ -220,18 +226,22 @@ uint32 Quest::XPValue(uint32 playerLevel) const { if (playerLevel) { - int32 quest_level = (Level == -1 ? playerLevel : Level); - const QuestXPEntry* xpentry = sQuestXPStore.LookupEntry(quest_level); - if (!xpentry) + uint32 questLevel = uint32(Level == -1 ? playerLevel : Level); + QuestXPEntry const* questXp = sQuestXPStore.LookupEntry(questLevel); + if (!questXp || RewardXPDifficulty > 10) return 0; - int32 diffFactor = 2 * (quest_level - playerLevel) + 20; + float multiplier = 1.0f; + if (questLevel != playerLevel) + multiplier = sXpGameTable.GetRow(std::min(playerLevel, questLevel))->Divisor / sXpGameTable.GetRow(playerLevel)->Divisor; + + int32 diffFactor = 2 * (questLevel - playerLevel) + 20; if (diffFactor < 1) diffFactor = 1; else if (diffFactor > 10) diffFactor = 10; - uint32 xp = diffFactor * xpentry->Exp[RewardXPDifficulty] * RewardXPMultiplier / 10; + uint32 xp = diffFactor * questXp->Exp[RewardXPDifficulty] * RewardXPMultiplier / 10 * multiplier; if (xp <= 100) xp = 5 * ((xp + 2) / 5); else if (xp <= 500) @@ -263,13 +273,16 @@ void Quest::BuildQuestRewards(WorldPackets::Quest::QuestRewards& rewards, Player rewards.ItemCount = GetRewItemsCount(); rewards.Money = player->GetQuestMoneyReward(this); rewards.XP = player->GetQuestXPReward(this); + rewards.ArtifactCategoryID = GetArtifactCategoryId(); rewards.Title = GetRewTitle(); - rewards.Talents = GetBonusTalents(); rewards.FactionFlags = GetRewardReputationMask(); - rewards.SpellCompletionDisplayID = GetRewDisplaySpell(); + for (uint32 i = 0; i < QUEST_REWARD_DISPLAY_SPELL_COUNT; ++i) + rewards.SpellCompletionDisplayID[i] = RewardDisplaySpell[i]; + rewards.SpellCompletionID = GetRewSpell(); rewards.SkillLineID = GetRewardSkillId(); rewards.NumSkillUps = GetRewardSkillPoints(); + rewards.RewardID = GetRewardId(); for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) { @@ -288,6 +301,7 @@ void Quest::BuildQuestRewards(WorldPackets::Quest::QuestRewards& rewards, Player rewards.FactionID[i] = RewardFactionId[i]; rewards.FactionValue[i] = RewardFactionValue[i]; rewards.FactionOverride[i] = RewardFactionOverride[i]; + rewards.FactionCapIn[i] = RewardFactionCapIn[i]; } for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i) diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h index 03179f53b3f..83cf2a6410a 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -49,6 +49,7 @@ namespace WorldPackets #define QUEST_REWARD_REPUTATIONS_COUNT 5 #define QUEST_EMOTE_COUNT 4 #define QUEST_REWARD_CURRENCY_COUNT 4 +#define QUEST_REWARD_DISPLAY_SPELL_COUNT 3 enum QuestFailedReason { @@ -323,7 +324,6 @@ class TC_GAME_API Quest int32 GetNextQuestId() const { return NextQuestID; } int32 GetExclusiveGroup() const { return ExclusiveGroup; } uint32 GetNextQuestInChain() const { return NextQuestInChain; } - uint32 GetBonusTalents() const { return RewardTalents; } int32 GetRewArenaPoints() const {return RewardArenaPoints; } uint32 GetXPDifficulty() const { return RewardXPDifficulty; } float GetXPMultiplier() const { return RewardXPMultiplier; } @@ -346,9 +346,11 @@ class TC_GAME_API Quest uint32 GetRewMoneyDifficulty() const { return RewardMoneyDifficulty; } uint32 GetRewHonor() const { return RewardHonor; } uint32 GetRewKillHonor() const { return RewardKillHonor; } + uint32 GetArtifactXPDifficulty() const { return RewardArtifactXPDifficulty; } + float GetArtifactXPMultiplier() const { return RewardArtifactXPMultiplier; } + uint32 GetArtifactCategoryId() const { return RewardArtifactCategoryID; } uint32 GetRewMoneyMaxLevel() const; // use in XP calculation at client uint32 GetRewSpell() const { return RewardSpell; } - int32 GetRewDisplaySpell() const { return RewardDisplaySpell; } uint32 GetRewMailTemplateId() const { return RewardMailTemplateId; } uint32 GetRewMailDelaySecs() const { return RewardMailDelay; } uint32 GetRewTitle() const { return RewardTitleId; } @@ -370,6 +372,7 @@ class TC_GAME_API Quest uint32 GetRewardSkillId() const { return RewardSkillId; } uint32 GetRewardSkillPoints() const { return RewardSkillPoints; } uint32 GetRewardReputationMask() const { return RewardReputationMask; } + uint32 GetRewardId() const { return QuestRewardID; } uint32 GetQuestGiverPortrait() const { return QuestGiverPortrait; } uint32 GetQuestTurnInPortrait() const { return QuestTurnInPortrait; } bool IsDaily() const { return (Flags & QUEST_FLAGS_DAILY) != 0; } @@ -415,10 +418,13 @@ class TC_GAME_API Quest uint32 RewardMoneyDifficulty; float RewardMoneyMultiplier; uint32 RewardBonusMoney; - uint32 RewardDisplaySpell; + uint32 RewardDisplaySpell[QUEST_REWARD_DISPLAY_SPELL_COUNT]; uint32 RewardSpell; uint32 RewardHonor; uint32 RewardKillHonor; + uint32 RewardArtifactXPDifficulty; + float RewardArtifactXPMultiplier; + uint32 RewardArtifactCategoryID; uint32 SourceItemId; uint32 Flags; uint32 FlagsEx; @@ -434,7 +440,6 @@ class TC_GAME_API Quest float POIy; uint32 POIPriority; uint32 RewardTitleId; - uint32 RewardTalents; int32 RewardArenaPoints; uint32 RewardSkillId; uint32 RewardSkillPoints; @@ -443,6 +448,7 @@ class TC_GAME_API Quest uint32 RewardFactionId[QUEST_REWARD_REPUTATIONS_COUNT]; int32 RewardFactionValue[QUEST_REWARD_REPUTATIONS_COUNT]; int32 RewardFactionOverride[QUEST_REWARD_REPUTATIONS_COUNT]; + uint32 RewardFactionCapIn[QUEST_REWARD_REPUTATIONS_COUNT]; uint32 RewardReputationMask; uint32 RewardCurrencyId[QUEST_REWARD_CURRENCY_COUNT]; uint32 RewardCurrencyCount[QUEST_REWARD_CURRENCY_COUNT]; @@ -451,6 +457,7 @@ class TC_GAME_API Quest uint32 AreaGroupID; uint32 LimitTime; int32 AllowableRaces; + uint32 QuestRewardID; QuestObjectives Objectives; std::string LogTitle; std::string LogDescription; 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<uint32> const* flist = GetFactionTeamList(factionEntry->ID); + std::vector<uint32> 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 <map> diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index d7bfc47bf79..de13f63e099 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" @@ -1497,13 +1496,13 @@ bool ScriptMgr::OnQuestAccept(Player* player, Item* item, Quest const* quest) return tmpscript->OnQuestAccept(player, item, quest); } -bool ScriptMgr::OnItemUse(Player* player, Item* item, SpellCastTargets const& targets) +bool ScriptMgr::OnItemUse(Player* player, Item* item, SpellCastTargets const& targets, ObjectGuid castId) { ASSERT(player); ASSERT(item); GET_SCRIPT_RET(ItemScript, item->GetScriptId(), tmpscript, false); - return tmpscript->OnUse(player, item, targets); + return tmpscript->OnUse(player, item, targets, castId); } bool ScriptMgr::OnItemExpire(Player* player, ItemTemplate const* proto) diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 850a979923c..b3436c4773e 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -21,7 +21,6 @@ #include "Common.h" #include <atomic> -#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) @@ -367,7 +368,7 @@ class TC_GAME_API ItemScript : public ScriptObject virtual bool OnQuestAccept(Player* /*player*/, Item* /*item*/, Quest const* /*quest*/) { return false; } // Called when a player uses the item. - virtual bool OnUse(Player* /*player*/, Item* /*item*/, SpellCastTargets const& /*targets*/) { return false; } + virtual bool OnUse(Player* /*player*/, Item* /*item*/, SpellCastTargets const& /*targets*/, ObjectGuid /*castId*/) { return false; } // Called when the item expires (is destroyed). virtual bool OnExpire(Player* /*player*/, ItemTemplate const* /*proto*/) { return false; } @@ -942,7 +943,7 @@ class TC_GAME_API ScriptMgr bool OnDummyEffect(Unit* caster, uint32 spellId, SpellEffIndex effIndex, Item* target); bool OnQuestAccept(Player* player, Item* item, Quest const* quest); - bool OnItemUse(Player* player, Item* item, SpellCastTargets const& targets); + bool OnItemUse(Player* player, Item* item, SpellCastTargets const& targets, ObjectGuid castId); bool OnItemExpire(Player* player, ItemTemplate const* proto); bool OnItemRemove(Player* player, Item* item); 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/AuctionHousePackets.cpp b/src/server/game/Server/Packets/AuctionHousePackets.cpp index 143ba11ddca..6bff90b10ae 100644 --- a/src/server/game/Server/Packets/AuctionHousePackets.cpp +++ b/src/server/game/Server/Packets/AuctionHousePackets.cpp @@ -24,7 +24,6 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::AuctionHouse::AuctionItem data << auctionItem.Item; // ItemInstance data << int32(auctionItem.Count); data << int32(auctionItem.Charges); - data << int32(auctionItem.Enchantments.size()); data << int32(auctionItem.Flags); data << int32(auctionItem.AuctionItemID); data << auctionItem.Owner; @@ -33,8 +32,16 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::AuctionHouse::AuctionItem data << uint64(auctionItem.BuyoutPrice); data << int32(auctionItem.DurationLeft); data << uint8(auctionItem.DeleteReason); + data.WriteBits(auctionItem.Enchantments.size(), 4); + data.WriteBits(auctionItem.Gems.size(), 2); + data.WriteBit(auctionItem.CensorServerSideInfo); + data.WriteBit(auctionItem.CensorBidInfo); + data.FlushBits(); + + for (auto const& gem : auctionItem.Gems) + data << gem; - for (auto const& enchant : auctionItem.Enchantments) + for (WorldPackets::AuctionHouse::AuctionItem::AuctionItemEnchant const& enchant : auctionItem.Enchantments) { data << int32(enchant.ID); data << uint32(enchant.Expiration); @@ -42,19 +49,14 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::AuctionHouse::AuctionItem data << uint8(enchant.Slot); } - data.FlushBits(); - - bool censorServerSideInfo = !data.WriteBit(auctionItem.CensorServerSideInfo); - bool censorBidInfo = !data.WriteBit(auctionItem.CensorBidInfo); - - if (censorServerSideInfo) + if (!auctionItem.CensorServerSideInfo) { data << auctionItem.ItemGuid; data << auctionItem.OwnerAccountID; data << int32(auctionItem.EndTime); } - if (censorBidInfo) + if (!auctionItem.CensorBidInfo) { data << auctionItem.Bidder; data << uint64(auctionItem.BidAmount); @@ -195,14 +197,12 @@ WorldPacket const* WorldPackets::AuctionHouse::AuctionListItemsResult::Write() _worldPacket << int32(Items.size()); _worldPacket << int32(TotalCount); _worldPacket << int32(DesiredDelay); - - for (auto const& item : Items) - _worldPacket << item; - - _worldPacket.FlushBits(); _worldPacket.WriteBit(OnlyUsable); _worldPacket.FlushBits(); + for (AuctionItem const& item : Items) + _worldPacket << item; + return &_worldPacket; } @@ -212,7 +212,7 @@ WorldPacket const* WorldPackets::AuctionHouse::AuctionListOwnerItemsResult::Writ _worldPacket << uint32(TotalCount); _worldPacket << uint32(DesiredDelay); - for (auto const& item : Items) + for (AuctionItem const& item : Items) _worldPacket << item; return &_worldPacket; @@ -224,7 +224,7 @@ WorldPacket const* WorldPackets::AuctionHouse::AuctionListBidderItemsResult::Wri _worldPacket << uint32(TotalCount); _worldPacket << uint32(DesiredDelay); - for (auto const& item : Items) + for (AuctionItem const& item : Items) _worldPacket << item; return &_worldPacket; @@ -236,25 +236,36 @@ void WorldPackets::AuctionHouse::AuctionListItems::Read() _worldPacket >> Auctioneer; _worldPacket >> MinLevel; _worldPacket >> MaxLevel; - _worldPacket >> InvType; - _worldPacket >> ItemClass; - _worldPacket >> ItemSubclass; _worldPacket >> Quality; _worldPacket >> SortCount; + KnownPets.resize(_worldPacket.read<uint32>()); + _worldPacket >> MaxPetLevel; + for (std::size_t i = 0; i < KnownPets.size(); ++i) + _worldPacket >> KnownPets[i]; - _worldPacket.FlushBits(); - uint32 nameLength = _worldPacket.ReadBits(8); - Name = _worldPacket.ReadString(nameLength); + Name = _worldPacket.ReadString(_worldPacket.ReadBits(8)); + ClassFilters.resize(_worldPacket.ReadBits(3)); OnlyUsable = _worldPacket.ReadBit(); ExactMatch = _worldPacket.ReadBit(); + for (ClassFilter& classFilter : ClassFilters) + { + _worldPacket >> classFilter.ItemClass; + classFilter.SubClassFilters.resize(_worldPacket.ReadBits(5)); + for (ClassFilter::SubClassFilter& subclassFilter : classFilter.SubClassFilters) + { + _worldPacket >> subclassFilter.ItemSubclass; + _worldPacket >> subclassFilter.InvTypeMask; + } + } + _worldPacket.read_skip<uint32>(); // DataSize = (SortCount * 2) for (int32 i = 0; i < SortCount; i++) { WorldPackets::AuctionHouse::AuctionListItems::Sort sort; - _worldPacket >> sort.UnkByte1; - _worldPacket >> sort.UnkByte2; - DataSort.emplace_back(sort); + _worldPacket >> sort.Type; + _worldPacket >> sort.Direction; + DataSort.push_back(sort); } } @@ -266,7 +277,7 @@ void WorldPackets::AuctionHouse::AuctionListOwnerItems::Read() WorldPacket const* WorldPackets::AuctionHouse::AuctionListPendingSalesResult::Write() { - _worldPacket << int32(Mails.size()); + _worldPacket << uint32(Mails.size()); _worldPacket << int32(TotalNumRecords); for (auto const& mail : Mails) @@ -312,12 +323,12 @@ WorldPacket const* WorldPackets::AuctionHouse::AuctionOutBidNotification::Write( WorldPacket const* WorldPackets::AuctionHouse::AuctionReplicateResponse::Write() { - _worldPacket << int32(Result); - _worldPacket << int32(DesiredDelay); - _worldPacket << int32(ChangeNumberGlobal); - _worldPacket << int32(ChangeNumberCursor); - _worldPacket << int32(ChangeNumberTombstone); - _worldPacket << int32(Items.size()); + _worldPacket << uint32(Result); + _worldPacket << uint32(DesiredDelay); + _worldPacket << uint32(ChangeNumberGlobal); + _worldPacket << uint32(ChangeNumberCursor); + _worldPacket << uint32(ChangeNumberTombstone); + _worldPacket << uint32(Items.size()); for (auto const& item : Items) _worldPacket << item; diff --git a/src/server/game/Server/Packets/AuctionHousePackets.h b/src/server/game/Server/Packets/AuctionHousePackets.h index e6aa6faac16..8ea9615e301 100644 --- a/src/server/game/Server/Packets/AuctionHousePackets.h +++ b/src/server/game/Server/Packets/AuctionHousePackets.h @@ -59,6 +59,7 @@ namespace WorldPackets uint32 EndTime = 0; ObjectGuid Bidder; uint64 BidAmount = 0; + std::vector<Item::ItemGemInstanceData> Gems; }; struct AuctionOwnerNotification @@ -254,25 +255,37 @@ namespace WorldPackets public: struct Sort { - uint8 UnkByte1 = 0; - uint8 UnkByte2 = 0; + uint8 Type = 0; + uint8 Direction = 0; + }; + + struct ClassFilter + { + struct SubClassFilter + { + int32 ItemSubclass; + uint32 InvTypeMask; + }; + + int32 ItemClass; + Array<SubClassFilter, 31> SubClassFilters; }; AuctionListItems(WorldPacket&& packet) : ClientPacket(CMSG_AUCTION_LIST_ITEMS, std::move(packet)) { } void Read() override; - ObjectGuid Auctioneer; - uint8 SortCount = 0; - uint8 MaxLevel = 100; uint32 Offset = 0; - int32 ItemClass = 0; + ObjectGuid Auctioneer; uint8 MinLevel = 1; - int32 InvType = 0; + uint8 MaxLevel = 100; int32 Quality = 0; - int32 ItemSubclass = 0; - bool ExactMatch = true; + uint8 SortCount = 0; + Array<uint8> KnownPets; + int8 MaxPetLevel; std::string Name; + Array<ClassFilter, 7> ClassFilters; + bool ExactMatch = true; bool OnlyUsable = false; std::vector<Sort> DataSort; }; diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp index 23a27ae4114..52fb54c725a 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.cpp +++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp @@ -54,8 +54,9 @@ WorldPacket const* WorldPackets::Auth::AuthChallenge::Write() void WorldPackets::Auth::AuthSession::Read() { - uint32 addonDataSize, realmJoinTicketSize; + uint32 realmJoinTicketSize; + _worldPacket >> DosResponse; _worldPacket >> Build; _worldPacket >> BuildType; _worldPacket >> RegionID; @@ -63,22 +64,13 @@ void WorldPackets::Auth::AuthSession::Read() _worldPacket >> RealmID; _worldPacket.read(LocalChallenge.data(), LocalChallenge.size()); _worldPacket.read(Digest.data(), Digest.size()); - _worldPacket >> DosResponse; - _worldPacket >> addonDataSize; - if (addonDataSize) - { - AddonInfo.resize(std::min(addonDataSize, uint32(_worldPacket.size() - _worldPacket.rpos()))); - _worldPacket.read(AddonInfo.contents(), AddonInfo.size()); - } - + UseIPv6 = _worldPacket.ReadBit(); _worldPacket >> realmJoinTicketSize; if (realmJoinTicketSize) { RealmJoinTicket.resize(std::min(realmJoinTicketSize, uint32(_worldPacket.size() - _worldPacket.rpos()))); _worldPacket.read(reinterpret_cast<uint8*>(&RealmJoinTicket[0]), RealmJoinTicket.size()); } - - UseIPv6 = _worldPacket.ReadBit(); // UseIPv6 } WorldPackets::Auth::AuthResponse::AuthResponse() @@ -106,6 +98,24 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write() _worldPacket << uint32(SuccessInfo->Templates.size()); _worldPacket << uint32(SuccessInfo->CurrencyID); + for (auto& race : *SuccessInfo->AvailableRaces) + { + _worldPacket << uint8(race.first); /// the current race + _worldPacket << uint8(race.second); /// the required Expansion + } + + for (auto& klass : *SuccessInfo->AvailableClasses) + { + _worldPacket << uint8(klass.first); /// the current class + _worldPacket << uint8(klass.second); /// the required Expansion + } + + _worldPacket.WriteBit(SuccessInfo->IsExpansionTrial); + _worldPacket.WriteBit(SuccessInfo->ForceCharacterTemplate); + _worldPacket.WriteBit(SuccessInfo->NumPlayersHorde.is_initialized()); + _worldPacket.WriteBit(SuccessInfo->NumPlayersAlliance.is_initialized()); + _worldPacket.FlushBits(); + { _worldPacket << uint32(SuccessInfo->Billing.BillingPlan); _worldPacket << uint32(SuccessInfo->Billing.TimeRemain); @@ -116,6 +126,12 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write() _worldPacket.FlushBits(); } + if (SuccessInfo->NumPlayersHorde) + _worldPacket << uint16(*SuccessInfo->NumPlayersHorde); + + if (SuccessInfo->NumPlayersAlliance) + _worldPacket << uint16(*SuccessInfo->NumPlayersAlliance); + for (auto& virtualRealm : SuccessInfo->VirtualRealms) { _worldPacket << uint32(virtualRealm.RealmAddress); @@ -129,18 +145,6 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write() _worldPacket.WriteString(virtualRealm.RealmNameNormalized); } - for (auto& race : *SuccessInfo->AvailableRaces) - { - _worldPacket << uint8(race.first); /// the current race - _worldPacket << uint8(race.second); /// the required Expansion - } - - for (auto& klass : *SuccessInfo->AvailableClasses) - { - _worldPacket << uint8(klass.first); /// the current class - _worldPacket << uint8(klass.second); /// the required Expansion - } - for (auto& templat : SuccessInfo->Templates) { _worldPacket << uint32(templat.TemplateSetId); @@ -158,18 +162,6 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write() _worldPacket.WriteString(templat.Name); _worldPacket.WriteString(templat.Description); } - - _worldPacket.WriteBit(SuccessInfo->IsExpansionTrial); - _worldPacket.WriteBit(SuccessInfo->ForceCharacterTemplate); - _worldPacket.WriteBit(SuccessInfo->NumPlayersHorde.is_initialized()); - _worldPacket.WriteBit(SuccessInfo->NumPlayersAlliance.is_initialized()); - _worldPacket.FlushBits(); - - if (SuccessInfo->NumPlayersHorde) - _worldPacket << uint16(*SuccessInfo->NumPlayersHorde); - - if (SuccessInfo->NumPlayersAlliance) - _worldPacket << uint16(*SuccessInfo->NumPlayersAlliance); } if (WaitInfo) diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h index a127b4b2e62..ef29cfae0d1 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.h +++ b/src/server/game/Server/Packets/AuthenticationPackets.h @@ -92,7 +92,6 @@ namespace WorldPackets std::array<uint8, 16> LocalChallenge; std::array<uint8, DigestLength> Digest; uint64 DosResponse = 0; - ByteBuffer AddonInfo; std::string RealmJoinTicket; bool UseIPv6 = false; @@ -243,6 +242,14 @@ namespace WorldPackets private: void Read() override; }; + + 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/BattlePetPackets.cpp b/src/server/game/Server/Packets/BattlePetPackets.cpp index fa5bff46511..48ea4c3d60e 100644 --- a/src/server/game/Server/Packets/BattlePetPackets.cpp +++ b/src/server/game/Server/Packets/BattlePetPackets.cpp @@ -49,6 +49,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::BattlePet::BattlePet cons data.WriteBit(pet.Name.empty()); // NoRename data.FlushBits(); + data.WriteString(pet.Name); + if (!pet.Owner.IsEmpty()) { data << pet.Owner; @@ -56,8 +58,6 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::BattlePet::BattlePet cons data << uint32(GetVirtualRealmAddress()); // Native } - data.WriteString(pet.Name); - return data; } @@ -66,6 +66,9 @@ WorldPacket const* WorldPackets::BattlePet::BattlePetJournal::Write() _worldPacket << uint16(Trap); _worldPacket << uint32(Slots.size()); _worldPacket << uint32(Pets.size()); + _worldPacket << int32(MaxPets); + _worldPacket.WriteBit(HasJournalLock); + _worldPacket.FlushBits(); for (auto const& slot : Slots) _worldPacket << slot; @@ -73,37 +76,31 @@ WorldPacket const* WorldPackets::BattlePet::BattlePetJournal::Write() for (auto const& pet : Pets) _worldPacket << pet; - _worldPacket.WriteBit(HasJournalLock); - _worldPacket.FlushBits(); - return &_worldPacket; } WorldPacket const* WorldPackets::BattlePet::BattlePetUpdates::Write() { _worldPacket << uint32(Pets.size()); + _worldPacket.WriteBit(PetAdded); + _worldPacket.FlushBits(); for (auto const& pet : Pets) _worldPacket << pet; - _worldPacket.WriteBit(PetAdded); - _worldPacket.FlushBits(); - return &_worldPacket; } - WorldPacket const* WorldPackets::BattlePet::PetBattleSlotUpdates::Write() { _worldPacket << uint32(Slots.size()); - - for (auto const& slot : Slots) - _worldPacket << slot; - _worldPacket.WriteBit(NewSlot); _worldPacket.WriteBit(AutoSlotted); _worldPacket.FlushBits(); + for (auto const& slot : Slots) + _worldPacket << slot; + return &_worldPacket; } @@ -158,8 +155,7 @@ WorldPacket const* WorldPackets::BattlePet::BattlePetDeleted::Write() WorldPacket const* WorldPackets::BattlePet::BattlePetError::Write() { - _worldPacket.WriteBits(Result, 4); - _worldPacket.FlushBits(); + _worldPacket.WriteBits(Result, 3); _worldPacket << uint32(CreatureID); return &_worldPacket; diff --git a/src/server/game/Server/Packets/BattlePetPackets.h b/src/server/game/Server/Packets/BattlePetPackets.h index 293ac775314..03d3c348c30 100644 --- a/src/server/game/Server/Packets/BattlePetPackets.h +++ b/src/server/game/Server/Packets/BattlePetPackets.h @@ -61,9 +61,10 @@ namespace WorldPackets WorldPacket const* Write() override; uint16 Trap = 0; + bool HasJournalLock = true; std::vector<BattlePetSlot> Slots; std::vector<BattlePet> Pets; - bool HasJournalLock = true; + int32 MaxPets = 1000; }; class BattlePetJournalLockAcquired final : public ServerPacket diff --git a/src/server/game/Server/Packets/BattlegroundPackets.cpp b/src/server/game/Server/Packets/BattlegroundPackets.cpp index 52b99035141..72f00270618 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.cpp +++ b/src/server/game/Server/Packets/BattlegroundPackets.cpp @@ -67,8 +67,9 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData: data << uint32(playerData.HealingDone); data << uint32(playerData.Stats.size()); data << int32(playerData.PrimaryTalentTree); - data << uint32(playerData.PrimaryTalentTreeNameIndex); - data << uint32(playerData.Race); + data << int32(playerData.PrimaryTalentTreeNameIndex); + data << int32(playerData.Race); + data << uint32(playerData.Prestige); if (!playerData.Stats.empty()) data.append(playerData.Stats.data(), playerData.Stats.size()); @@ -131,6 +132,7 @@ void WorldPackets::Battleground::BattlemasterJoin::Read() void WorldPackets::Battleground::BattlemasterJoinArena::Read() { _worldPacket >> TeamSizeIndex; + _worldPacket >> Roles; } ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::BattlefieldStatusHeader const& header) diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h index e67860e6727..88da35bf966 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.h +++ b/src/server/game/Server/Packets/BattlegroundPackets.h @@ -122,8 +122,9 @@ namespace WorldPackets Optional<int32> MmrChange; std::vector<int32> Stats; int32 PrimaryTalentTree = 0; - uint32 PrimaryTalentTreeNameIndex = 0; // controls which name field from ChrSpecialization.dbc will be sent to lua - uint32 Race; + int32 PrimaryTalentTreeNameIndex = 0; // controls which name field from ChrSpecialization.dbc will be sent to lua + int32 Race; + uint32 Prestige = 0; }; Optional<uint8> Winner; @@ -231,6 +232,7 @@ namespace WorldPackets void Read() override; uint8 TeamSizeIndex = 0; + uint8 Roles = 0; }; class BattlefieldLeave final : public ClientPacket diff --git a/src/server/game/Server/Packets/BlackMarketPackets.cpp b/src/server/game/Server/Packets/BlackMarketPackets.cpp index cc5fd79adfc..582340bde53 100644 --- a/src/server/game/Server/Packets/BlackMarketPackets.cpp +++ b/src/server/game/Server/Packets/BlackMarketPackets.cpp @@ -70,13 +70,13 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::BlackMarket::BlackMarketI { data << int32(blackMarketItem.MarketID); data << int32(blackMarketItem.SellerNPC); - data << blackMarketItem.Item; data << int32(blackMarketItem.Quantity); data << uint64(blackMarketItem.MinBid); data << uint64(blackMarketItem.MinIncrement); data << uint64(blackMarketItem.CurrentBid); data << int32(blackMarketItem.SecondsRemaining); data << int32(blackMarketItem.NumBids); + data << blackMarketItem.Item; data.WriteBit(blackMarketItem.HighBid); data.FlushBits(); @@ -101,7 +101,7 @@ ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::BlackMarket::BlackMarketI WorldPacket const* WorldPackets::BlackMarket::BlackMarketRequestItemsResult::Write() { - _worldPacket << uint32(LastUpdateID); + _worldPacket << int32(LastUpdateID); _worldPacket << uint32(Items.size()); for (BlackMarketItem const& item : Items) @@ -121,8 +121,8 @@ void WorldPackets::BlackMarket::BlackMarketBidOnItem::Read() WorldPacket const* WorldPackets::BlackMarket::BlackMarketBidOnItemResult::Write() { _worldPacket << int32(MarketID); - _worldPacket << Item; _worldPacket << int32(Result); + _worldPacket << Item; return &_worldPacket; } @@ -130,8 +130,8 @@ WorldPacket const* WorldPackets::BlackMarket::BlackMarketBidOnItemResult::Write( WorldPacket const* WorldPackets::BlackMarket::BlackMarketOutbid::Write() { _worldPacket << int32(MarketID); - _worldPacket << Item; _worldPacket << int32(RandomPropertiesID); + _worldPacket << Item; return &_worldPacket; } @@ -139,8 +139,8 @@ WorldPacket const* WorldPackets::BlackMarket::BlackMarketOutbid::Write() WorldPacket const* WorldPackets::BlackMarket::BlackMarketWon::Write() { _worldPacket << int32(MarketID); - _worldPacket << Item; _worldPacket << int32(RandomPropertiesID); + _worldPacket << Item; return &_worldPacket; } diff --git a/src/server/game/Server/Packets/BlackMarketPackets.h b/src/server/game/Server/Packets/BlackMarketPackets.h index 19853a212a5..fae6968426d 100644 --- a/src/server/game/Server/Packets/BlackMarketPackets.h +++ b/src/server/game/Server/Packets/BlackMarketPackets.h @@ -84,7 +84,7 @@ namespace WorldPackets WorldPacket const* Write() override; - uint32 LastUpdateID = 0; + int32 LastUpdateID = 0; std::vector<BlackMarketItem> Items; }; diff --git a/src/server/game/Server/Packets/CalendarPackets.cpp b/src/server/game/Server/Packets/CalendarPackets.cpp index dc9f71039c7..03b3b3744ef 100644 --- a/src/server/game/Server/Packets/CalendarPackets.cpp +++ b/src/server/game/Server/Packets/CalendarPackets.cpp @@ -35,15 +35,6 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Calendar::CalendarSendCal return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Calendar::CalendarSendCalendarRaidResetInfo const& resetInfo) -{ - data << int32(resetInfo.MapID); - data << uint32(resetInfo.Duration); - data << int32(resetInfo.Offset); - - return data; -} - ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Calendar::CalendarSendCalendarRaidLockoutInfo const& lockoutInfo) { data << uint64(lockoutInfo.InstanceID); @@ -238,25 +229,19 @@ WorldPacket const* WorldPackets::Calendar::SCalendarEventInvite::Write() WorldPacket const* WorldPackets::Calendar::CalendarSendCalendar::Write() { - _worldPacket << uint32(ServerNow); _worldPacket.AppendPackedTime(ServerTime); - _worldPacket << uint32(RaidOrigin); _worldPacket << uint32(Invites.size()); _worldPacket << uint32(Events.size()); _worldPacket << uint32(RaidLockouts.size()); - _worldPacket << uint32(RaidResets.size()); for (auto const& invite : Invites) _worldPacket << invite; - for (auto const& event : Events) - _worldPacket << event; - for (auto const& lockout : RaidLockouts) _worldPacket << lockout; - for (auto const& reset : RaidResets) - _worldPacket << reset; + for (auto const& event : Events) + _worldPacket << event; return &_worldPacket; } @@ -272,15 +257,14 @@ WorldPacket const* WorldPackets::Calendar::CalendarSendEvent::Write() _worldPacket.AppendPackedTime(Date); _worldPacket << uint32(LockDate); _worldPacket << EventGuildID; - _worldPacket << uint32(Invites.size()); - for (auto const& invite : Invites) - _worldPacket << invite; - _worldPacket.WriteBits(EventName.size(), 8); _worldPacket.WriteBits(Description.size(), 11); _worldPacket.FlushBits(); + for (auto const& invite : Invites) + _worldPacket << invite; + _worldPacket.WriteString(EventName); _worldPacket.WriteString(Description); diff --git a/src/server/game/Server/Packets/CalendarPackets.h b/src/server/game/Server/Packets/CalendarPackets.h index e702beb81bd..d1b7c7207b1 100644 --- a/src/server/game/Server/Packets/CalendarPackets.h +++ b/src/server/game/Server/Packets/CalendarPackets.h @@ -168,13 +168,6 @@ namespace WorldPackets time_t ExpireTime = time_t(0); }; - struct CalendarSendCalendarRaidResetInfo - { - int32 MapID = 0; - uint32 Duration = 0; - int32 Offset = 0; - }; - struct CalendarSendCalendarEventInfo { uint64 EventID = 0; @@ -194,12 +187,9 @@ namespace WorldPackets WorldPacket const* Write() override; - time_t RaidOrigin = time_t(0); time_t ServerTime = time_t(0); - time_t ServerNow = time_t(0); std::vector<CalendarSendCalendarInviteInfo> Invites; std::vector<CalendarSendCalendarRaidLockoutInfo> RaidLockouts; - std::vector<CalendarSendCalendarRaidResetInfo> RaidResets; std::vector<CalendarSendCalendarEventInfo> Events; }; diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index d30779d49c2..5e7efd257f7 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -24,11 +24,13 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel { // 0 1 2 3 4 5 6 7 // "SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.skin, characters.face, characters.hairStyle, " - // 8 9 10 11 12 13 14 15 - // "characters.hairColor, characters.facialStyle, characters.level, characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z, " - // 16 17 18 19 20 21 22 + // 8 9 10 11 12 13 + // "characters.hairColor, characters.facialStyle, characters.customDisplay1, characters.customDisplay2, characters.customDisplay3, characters.level, " + // 14 15 16 17 18 + // "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, " - // 23 24 25 26 + // 26 27 28 29 // "character_banned.guid, characters.slot, characters.logout_time, character_declinedname.genitive" Guid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64()); @@ -41,18 +43,21 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel HairStyle = fields[7].GetUInt8(); HairColor = fields[8].GetUInt8(); FacialHair = fields[9].GetUInt8(); - Level = fields[10].GetUInt8(); - ZoneId = int32(fields[11].GetUInt16()); - MapId = int32(fields[12].GetUInt16()); - PreLoadPosition.x = fields[13].GetFloat(); - PreLoadPosition.y = fields[14].GetFloat(); - PreLoadPosition.z = fields[15].GetFloat(); - - if (ObjectGuid::LowType guildId = fields[16].GetUInt64()) + CustomDisplay[0] = fields[10].GetUInt8(); + CustomDisplay[1] = fields[11].GetUInt8(); + CustomDisplay[2] = fields[12].GetUInt8(); + Level = fields[13].GetUInt8(); + ZoneId = int32(fields[14].GetUInt16()); + MapId = int32(fields[15].GetUInt16()); + PreLoadPosition.x = fields[16].GetFloat(); + PreLoadPosition.y = fields[17].GetFloat(); + PreLoadPosition.z = fields[18].GetFloat(); + + if (ObjectGuid::LowType guildId = fields[19].GetUInt64()) GuildGuid = ObjectGuid::Create<HighGuid::Guild>(guildId); - uint32 playerFlags = fields[17].GetUInt32(); - uint32 atLoginFlags = fields[18].GetUInt16(); + uint32 playerFlags = fields[20].GetUInt32(); + uint32 atLoginFlags = fields[21].GetUInt16(); if (atLoginFlags & AT_LOGIN_RESURRECT) playerFlags &= ~PLAYER_FLAGS_GHOST; @@ -69,10 +74,10 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel if (atLoginFlags & AT_LOGIN_RENAME) Flags |= CHARACTER_FLAG_RENAME; - if (fields[23].GetUInt64()) + if (fields[26].GetUInt64()) Flags |= CHARACTER_FLAG_LOCKED_BY_BILLING; - if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[26].GetString().empty()) + if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[29].GetString().empty()) Flags |= CHARACTER_FLAG_DECLINED; if (atLoginFlags & AT_LOGIN_CUSTOMIZE) @@ -83,15 +88,16 @@ 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 if (!(playerFlags & PLAYER_FLAGS_GHOST) && (Class == CLASS_WARLOCK || Class == CLASS_HUNTER || Class == CLASS_DEATH_KNIGHT)) { - if (CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(fields[19].GetUInt32())) + if (CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(fields[22].GetUInt32())) { - Pet.CreatureDisplayId = fields[20].GetUInt32(); - Pet.Level = fields[21].GetUInt16(); + Pet.CreatureDisplayId = fields[23].GetUInt32(); + Pet.Level = fields[24].GetUInt16(); Pet.CreatureFamily = creatureInfo->family; } } @@ -100,9 +106,9 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel ProfessionIds[0] = 0; ProfessionIds[1] = 0; - Tokenizer equipment(fields[22].GetString(), ' '); - ListPosition = fields[24].GetUInt8(); - LastPlayedTime = fields[25].GetUInt32(); + Tokenizer equipment(fields[25].GetString(), ' '); + ListPosition = fields[27].GetUInt8(); + LastPlayedTime = fields[28].GetUInt32(); for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot) { @@ -119,9 +125,23 @@ WorldPacket const* WorldPackets::Character::EnumCharactersResult::Write() _worldPacket.WriteBit(Success); _worldPacket.WriteBit(IsDeletedCharacters); + _worldPacket.WriteBit(IsDemonHunterCreationAllowed); + _worldPacket.WriteBit(HasDemonHunterOnRealm); + _worldPacket.WriteBit(HasLevel70OnAccount); + _worldPacket.WriteBit(Unknown7x); + _worldPacket.WriteBit(DisabledClassesMask.is_initialized()); _worldPacket << uint32(Characters.size()); _worldPacket << uint32(FactionChangeRestrictions.size()); + if (DisabledClassesMask) + _worldPacket << uint32(*DisabledClassesMask); + + for (RestrictedFactionChangeRuleInfo const& rule : FactionChangeRestrictions) + { + _worldPacket << int32(rule.Mask); + _worldPacket << uint8(rule.Race); + } + for (CharacterInfo const& charInfo : Characters) { _worldPacket << charInfo.Guid; @@ -134,6 +154,7 @@ WorldPacket const* WorldPackets::Character::EnumCharactersResult::Write() _worldPacket << uint8(charInfo.HairStyle); _worldPacket << uint8(charInfo.HairColor); _worldPacket << uint8(charInfo.FacialHair); + _worldPacket.append(charInfo.CustomDisplay.data(), charInfo.CustomDisplay.size()); _worldPacket << uint8(charInfo.Level); _worldPacket << int32(charInfo.ZoneId); _worldPacket << int32(charInfo.MapId); @@ -157,6 +178,9 @@ WorldPacket const* WorldPackets::Character::EnumCharactersResult::Write() } _worldPacket << uint32(charInfo.LastPlayedTime); + _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); @@ -166,12 +190,6 @@ WorldPacket const* WorldPackets::Character::EnumCharactersResult::Write() _worldPacket.WriteString(charInfo.Name); } - for (RestrictedFactionChangeRuleInfo const& rule : FactionChangeRestrictions) - { - _worldPacket << int32(rule.Mask); - _worldPacket << uint8(rule.Race); - } - return &_worldPacket; } @@ -190,6 +208,7 @@ void WorldPackets::Character::CreateCharacter::Read() _worldPacket >> CreateInfo->HairColor; _worldPacket >> CreateInfo->FacialHairStyle; _worldPacket >> CreateInfo->OutfitId; + _worldPacket.read(CreateInfo->CustomDisplay.data(), CreateInfo->CustomDisplay.size()); CreateInfo->Name = _worldPacket.ReadString(nameLength); if (hasTemplateSet) CreateInfo->TemplateSet = _worldPacket.read<int32>(); @@ -244,6 +263,7 @@ void WorldPackets::Character::CharCustomize::Read() _worldPacket >> CustomizeInfo->HairStyleID; _worldPacket >> CustomizeInfo->FacialHairStyleID; _worldPacket >> CustomizeInfo->FaceID; + _worldPacket.read(CustomizeInfo->CustomDisplay.data(), CustomizeInfo->CustomDisplay.size()); CustomizeInfo->CharName = _worldPacket.ReadString(_worldPacket.ReadBits(6)); } @@ -255,32 +275,16 @@ void WorldPackets::Character::CharRaceOrFactionChange::Read() uint32 nameLength = _worldPacket.ReadBits(6); - bool const hasSkinID = _worldPacket.ReadBit(); - bool const hasHairColorID = _worldPacket.ReadBit(); - bool const hasHairStyleID = _worldPacket.ReadBit(); - bool const hasFacialHairStyleID = _worldPacket.ReadBit(); - bool const hasFaceID = _worldPacket.ReadBit(); - _worldPacket >> RaceOrFactionChangeInfo->Guid; _worldPacket >> RaceOrFactionChangeInfo->SexID; _worldPacket >> RaceOrFactionChangeInfo->RaceID; - + _worldPacket >> RaceOrFactionChangeInfo->SkinID; + _worldPacket >> RaceOrFactionChangeInfo->HairColorID; + _worldPacket >> RaceOrFactionChangeInfo->HairStyleID; + _worldPacket >> RaceOrFactionChangeInfo->FacialHairStyleID; + _worldPacket >> RaceOrFactionChangeInfo->FaceID; + _worldPacket.read(RaceOrFactionChangeInfo->CustomDisplay.data(), RaceOrFactionChangeInfo->CustomDisplay.size()); RaceOrFactionChangeInfo->Name = _worldPacket.ReadString(nameLength); - - if (hasSkinID) - RaceOrFactionChangeInfo->SkinID = _worldPacket.read<uint8>(); - - if (hasHairColorID) - RaceOrFactionChangeInfo->HairColorID = _worldPacket.read<uint8>(); - - if (hasHairStyleID) - RaceOrFactionChangeInfo->HairStyleID = _worldPacket.read<uint8>(); - - if (hasFacialHairStyleID) - RaceOrFactionChangeInfo->FacialHairStyleID = _worldPacket.read<uint8>(); - - if (hasFaceID) - RaceOrFactionChangeInfo->FaceID = _worldPacket.read<uint8>(); } WorldPacket const* WorldPackets::Character::CharFactionChangeResult::Write() @@ -300,6 +304,7 @@ WorldPacket const* WorldPackets::Character::CharFactionChangeResult::Write() _worldPacket << uint8(Display->FacialHairStyleID); _worldPacket << uint8(Display->FaceID); _worldPacket << uint8(Display->RaceID); + _worldPacket.append(Display->CustomDisplay.data(), Display->CustomDisplay.size()); _worldPacket.WriteString(Display->Name); } @@ -407,8 +412,6 @@ WorldPacket const* WorldPackets::Character::InitialSetup::Write() { _worldPacket << uint8(ServerExpansionLevel); _worldPacket << uint8(ServerExpansionTier); - _worldPacket << int32(ServerRegionID); - _worldPacket << uint32(RaidOrigin); return &_worldPacket; } @@ -433,16 +436,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; @@ -455,6 +448,8 @@ void WorldPackets::Character::AlterApperance::Read() _worldPacket >> NewFacialHair; _worldPacket >> NewSkinColor; _worldPacket >> NewFace; + for (std::size_t i = 0; i < NewCustomDisplay.size(); ++i) + _worldPacket >> NewCustomDisplay[i]; } WorldPacket const* WorldPackets::Character::BarberShopResultServer::Write() @@ -522,6 +517,7 @@ WorldPackets::Character::CharCustomizeResponse::CharCustomizeResponse(WorldPacke FacialHairStyleID = info->FacialHairStyleID; FaceID = info->FaceID; CharName = info->CharName; + CustomDisplay = info->CustomDisplay; } WorldPacket const* WorldPackets::Character::CharCustomizeResponse::Write() @@ -533,6 +529,7 @@ WorldPacket const* WorldPackets::Character::CharCustomizeResponse::Write() _worldPacket << uint8(HairStyleID); _worldPacket << uint8(FacialHairStyleID); _worldPacket << uint8(FaceID); + _worldPacket.append(CustomDisplay.data(), CustomDisplay.size()); _worldPacket.WriteBits(CharName.length(), 6); _worldPacket.FlushBits(); _worldPacket.WriteString(CharName); diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index 017dddd1d06..ec3ac9dc172 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -48,6 +48,7 @@ namespace WorldPackets uint8 HairStyle = 0; uint8 HairColor = 0; uint8 FacialHairStyle = 0; + std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> CustomDisplay; uint8 OutfitId = 0; Optional<int32> TemplateSet; std::string Name; @@ -72,20 +73,22 @@ namespace WorldPackets uint8 HairColorID = 0; uint8 FacialHairStyleID = 0; uint8 SkinID = 0; + std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> CustomDisplay; }; struct CharRaceOrFactionChangeInfo { - Optional<uint8> HairColorID; + uint8 HairColorID = 0; uint8 RaceID = RACE_NONE; uint8 SexID = GENDER_NONE; - Optional<uint8> SkinID; - Optional<uint8> FacialHairStyleID; + uint8 SkinID = 0; + uint8 FacialHairStyleID = 0; ObjectGuid Guid; bool FactionChange = false; std::string Name; - Optional<uint8> FaceID; - Optional<uint8> HairStyleID; + uint8 FaceID = 0; + uint8 HairStyleID = 0; + std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> CustomDisplay; }; struct CharacterUndeleteInfo @@ -123,6 +126,7 @@ namespace WorldPackets uint8 HairStyle = 0; uint8 HairColor = 0; uint8 FacialHair = 0; + std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> CustomDisplay; uint8 Level = 0; int32 ZoneId = 0; int32 MapId = 0; @@ -131,9 +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 SpecID = 0; + uint32 Unknown703; struct PetInfo { @@ -170,9 +177,15 @@ namespace WorldPackets bool Success = false; ///< bool IsDeletedCharacters = false; ///< used for character undelete list + bool IsDemonHunterCreationAllowed = false; ///< used for demon hunter early access + bool HasDemonHunterOnRealm = false; + bool HasLevel70OnAccount = false; + bool Unknown7x = false; - std::list<CharacterInfo> Characters; ///< all characters on the list - std::list<RestrictedFactionChangeRuleInfo> FactionChangeRestrictions; ///< @todo: research + Optional<uint32> DisabledClassesMask; + + std::vector<CharacterInfo> Characters; ///< all characters on the list + std::vector<RestrictedFactionChangeRuleInfo> FactionChangeRestrictions; ///< @todo: research }; class CreateCharacter final : public ClientPacket @@ -311,6 +324,7 @@ namespace WorldPackets uint8 FacialHairStyleID = 0; uint8 FaceID = 0; uint8 RaceID = RACE_NONE; + std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> CustomDisplay; }; CharFactionChangeResult() : ServerPacket(SMSG_CHAR_FACTION_CHANGE_RESULT, 20 + sizeof(CharFactionChangeDisplayInfo)) { } @@ -523,8 +537,6 @@ namespace WorldPackets uint8 ServerExpansionTier = 0; uint8 ServerExpansionLevel = 0; - time_t RaidOrigin = time_t(1135753200); // 28/12/2005 07:00:00 - int32 ServerRegionID = 3; // Cfg_Regions.dbc, EU }; class SetActionBarToggles final : public ClientPacket @@ -559,26 +571,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: @@ -601,6 +593,7 @@ namespace WorldPackets uint32 NewFacialHair = 0; uint32 NewSkinColor = 0; uint32 NewFace = 0; + std::array<uint32, PLAYER_CUSTOM_DISPLAY_SIZE> NewCustomDisplay; }; class BarberShopResultServer final : public ServerPacket @@ -705,6 +698,7 @@ namespace WorldPackets uint8 HairStyleID = 0; uint8 FacialHairStyleID = 0; uint8 FaceID = 0; + std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> CustomDisplay; }; class CharCustomizeFailed final : public ServerPacket diff --git a/src/server/game/Server/Packets/ClientConfigPackets.cpp b/src/server/game/Server/Packets/ClientConfigPackets.cpp index f5a7eabc0a1..a39900a8a83 100644 --- a/src/server/game/Server/Packets/ClientConfigPackets.cpp +++ b/src/server/game/Server/Packets/ClientConfigPackets.cpp @@ -17,68 +17,6 @@ #include "ClientConfigPackets.h" -uint8 const WorldPackets::ClientConfig::AddonInfo::PublicKey[256] = -{ - 0xC3, 0x5B, 0x50, 0x84, 0xB9, 0x3E, 0x32, 0x42, 0x8C, 0xD0, 0xC7, 0x48, 0xFA, 0x0E, 0x5D, 0x54, - 0x5A, 0xA3, 0x0E, 0x14, 0xBA, 0x9E, 0x0D, 0xB9, 0x5D, 0x8B, 0xEE, 0xB6, 0x84, 0x93, 0x45, 0x75, - 0xFF, 0x31, 0xFE, 0x2F, 0x64, 0x3F, 0x3D, 0x6D, 0x07, 0xD9, 0x44, 0x9B, 0x40, 0x85, 0x59, 0x34, - 0x4E, 0x10, 0xE1, 0xE7, 0x43, 0x69, 0xEF, 0x7C, 0x16, 0xFC, 0xB4, 0xED, 0x1B, 0x95, 0x28, 0xA8, - 0x23, 0x76, 0x51, 0x31, 0x57, 0x30, 0x2B, 0x79, 0x08, 0x50, 0x10, 0x1C, 0x4A, 0x1A, 0x2C, 0xC8, - 0x8B, 0x8F, 0x05, 0x2D, 0x22, 0x3D, 0xDB, 0x5A, 0x24, 0x7A, 0x0F, 0x13, 0x50, 0x37, 0x8F, 0x5A, - 0xCC, 0x9E, 0x04, 0x44, 0x0E, 0x87, 0x01, 0xD4, 0xA3, 0x15, 0x94, 0x16, 0x34, 0xC6, 0xC2, 0xC3, - 0xFB, 0x49, 0xFE, 0xE1, 0xF9, 0xDA, 0x8C, 0x50, 0x3C, 0xBE, 0x2C, 0xBB, 0x57, 0xED, 0x46, 0xB9, - 0xAD, 0x8B, 0xC6, 0xDF, 0x0E, 0xD6, 0x0F, 0xBE, 0x80, 0xB3, 0x8B, 0x1E, 0x77, 0xCF, 0xAD, 0x22, - 0xCF, 0xB7, 0x4B, 0xCF, 0xFB, 0xF0, 0x6B, 0x11, 0x45, 0x2D, 0x7A, 0x81, 0x18, 0xF2, 0x92, 0x7E, - 0x98, 0x56, 0x5D, 0x5E, 0x69, 0x72, 0x0A, 0x0D, 0x03, 0x0A, 0x85, 0xA2, 0x85, 0x9C, 0xCB, 0xFB, - 0x56, 0x6E, 0x8F, 0x44, 0xBB, 0x8F, 0x02, 0x22, 0x68, 0x63, 0x97, 0xBC, 0x85, 0xBA, 0xA8, 0xF7, - 0xB5, 0x40, 0x68, 0x3C, 0x77, 0x86, 0x6F, 0x4B, 0xD7, 0x88, 0xCA, 0x8A, 0xD7, 0xCE, 0x36, 0xF0, - 0x45, 0x6E, 0xD5, 0x64, 0x79, 0x0F, 0x17, 0xFC, 0x64, 0xDD, 0x10, 0x6F, 0xF3, 0xF5, 0xE0, 0xA6, - 0xC3, 0xFB, 0x1B, 0x8C, 0x29, 0xEF, 0x8E, 0xE5, 0x34, 0xCB, 0xD1, 0x2A, 0xCE, 0x79, 0xC3, 0x9A, - 0x0D, 0x36, 0xEA, 0x01, 0xE0, 0xAA, 0x91, 0x20, 0x54, 0xF0, 0x72, 0xD8, 0x1E, 0xC7, 0x89, 0xD2 -}; - -WorldPacket const* WorldPackets::ClientConfig::AddonInfo::Write() -{ - _worldPacket << uint32(Addons ? Addons->size() : 0); - _worldPacket << uint32(BannedAddons ? BannedAddons->size() : 0); - - if (Addons) - { - for (::AddonInfo const& addon : *Addons) - { - bool KeyProvided = addon.UsePublicKeyOrCRC && addon.CRC != STANDARD_ADDON_CRC; - _worldPacket << uint8(addon.Status); - - _worldPacket.WriteBit(addon.Enabled); // InfoProvided - _worldPacket.WriteBit(KeyProvided); // KeyProvided - _worldPacket.WriteBit(0); // UrlProvided - - if (addon.Enabled) - { - _worldPacket << uint8(1); // KeyVersion - _worldPacket << uint32(0); // Revision - } - - if (KeyProvided) - _worldPacket.append(PublicKey, sizeof(PublicKey)); // KeyData - } - } - - if (BannedAddons) - { - for (BannedAddon const& addon : *BannedAddons) - { - _worldPacket << uint32(addon.Id); // Id - _worldPacket.append(addon.NameMD5, MD5_DIGEST_LENGTH); // NameMD5 - MD5 of addon .toc filename without extension - _worldPacket.append(addon.VersionMD5, MD5_DIGEST_LENGTH); // VersionMD5 - MD5 of version string declared in addon .toc file - _worldPacket << uint32(addon.Timestamp); // LastModified - _worldPacket << uint32(1); // Flags - } - } - - return &_worldPacket; -} - WorldPacket const* WorldPackets::ClientConfig::AccountDataTimes::Write() { _worldPacket << PlayerGuid; diff --git a/src/server/game/Server/Packets/ClientConfigPackets.h b/src/server/game/Server/Packets/ClientConfigPackets.h index 65bee1155ee..101ed1fc2fd 100644 --- a/src/server/game/Server/Packets/ClientConfigPackets.h +++ b/src/server/game/Server/Packets/ClientConfigPackets.h @@ -19,26 +19,12 @@ #define ClientConfigPackets_h__ #include "Packet.h" -#include "AddonMgr.h" #include "WorldSession.h" namespace WorldPackets { namespace ClientConfig { - class AddonInfo final : public ServerPacket - { - static uint8 const PublicKey[256]; - - public: - AddonInfo() : ServerPacket(SMSG_ADDON_INFO) { } - - WorldPacket const* Write() override; - - std::list< ::AddonInfo> const* Addons = nullptr; - std::list<BannedAddon> const* BannedAddons = nullptr; - }; - class AccountDataTimes final : public ServerPacket { public: diff --git a/src/server/game/Server/Packets/CombatLogPackets.cpp b/src/server/game/Server/Packets/CombatLogPackets.cpp index f431b9b77a5..f1e6ac04d65 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.cpp +++ b/src/server/game/Server/Packets/CombatLogPackets.cpp @@ -22,6 +22,7 @@ WorldPacket const* WorldPackets::CombatLog::SpellNonMeleeDamageLog::Write() { *this << Me; *this << CasterGUID; + *this << CastID; *this << int32(SpellID); *this << int32(Damage); *this << int32(Overkill); @@ -30,11 +31,14 @@ WorldPacket const* WorldPackets::CombatLog::SpellNonMeleeDamageLog::Write() *this << int32(Resisted); *this << int32(Absorbed); WriteBit(Periodic); - WriteBits(Flags, 8); + WriteBits(Flags, 7); WriteBit(false); // Debug info WriteLogDataBit(); + WriteBit(SandboxScaling.is_initialized()); FlushBits(); WriteLogData(); + if (SandboxScaling) + *this << *SandboxScaling; return &_worldPacket; } @@ -117,10 +121,10 @@ WorldPacket const* WorldPackets::CombatLog::SpellHealLog::Write() *this << int32(OverHeal); *this << int32(Absorbed); WriteBit(Crit); - WriteBit(Multistrike); WriteBit(CritRollMade.is_initialized()); WriteBit(CritRollNeeded.is_initialized()); WriteLogDataBit(); + WriteBit(SandboxScaling.is_initialized()); FlushBits(); if (CritRollMade) @@ -131,6 +135,9 @@ WorldPacket const* WorldPackets::CombatLog::SpellHealLog::Write() WriteLogData(); + if (SandboxScaling) + *this << *SandboxScaling; + return &_worldPacket; } @@ -138,27 +145,31 @@ WorldPacket const* WorldPackets::CombatLog::SpellPeriodicAuraLog::Write() { *this << TargetGUID; *this << CasterGUID; - *this << SpellID; + *this << int32(SpellID); *this << uint32(Effects.size()); for (SpellLogEffect const& effect : Effects) { - *this << effect.Effect; + *this << int32(effect.Effect); *this << int32(effect.Amount); *this << int32(effect.OverHealOrKill); *this << int32(effect.SchoolMaskOrPower); *this << int32(effect.AbsorbedOrAmplitude); *this << int32(effect.Resisted); WriteBit(effect.Crit); - WriteBit(effect.Multistrike); + WriteBit(effect.DebugInfo.is_initialized()); + WriteBit(effect.SandboxScaling.is_initialized()); + FlushBits(); - if (WriteBit(effect.DebugInfo.is_initialized())) + if (effect.SandboxScaling) + *this << *effect.SandboxScaling; + + if (effect.DebugInfo) { *this << float(effect.DebugInfo->CritRollMade); *this << float(effect.DebugInfo->CritRollNeeded); } - FlushBits(); } WriteLogDataBit(); @@ -280,49 +291,59 @@ WorldPacket const* WorldPackets::CombatLog::SpellDamageShield::Write() WorldPacket const* WorldPackets::CombatLog::AttackerStateUpdate::Write() { ByteBuffer attackRoundInfo; - attackRoundInfo << HitInfo; + attackRoundInfo << uint32(HitInfo); attackRoundInfo << AttackerGUID; attackRoundInfo << VictimGUID; - attackRoundInfo << Damage; - attackRoundInfo << OverDamage; - - if (attackRoundInfo.WriteBit(SubDmg.is_initialized())) + attackRoundInfo << int32(Damage); + attackRoundInfo << int32(OverDamage); + attackRoundInfo << uint8(SubDmg.is_initialized()); + if (SubDmg) { - attackRoundInfo << SubDmg->SchoolMask; - attackRoundInfo << SubDmg->FDamage; - attackRoundInfo << SubDmg->Damage; + attackRoundInfo << int32(SubDmg->SchoolMask); + attackRoundInfo << float(SubDmg->FDamage); + attackRoundInfo << int32(SubDmg->Damage); if (HitInfo & (HITINFO_FULL_ABSORB | HITINFO_PARTIAL_ABSORB)) - attackRoundInfo << SubDmg->Absorbed; + attackRoundInfo << int32(SubDmg->Absorbed); if (HitInfo & (HITINFO_FULL_RESIST | HITINFO_PARTIAL_RESIST)) - attackRoundInfo << SubDmg->Resisted; + attackRoundInfo << int32(SubDmg->Resisted); } - attackRoundInfo << VictimState; - attackRoundInfo << AttackerState; - attackRoundInfo << MeleeSpellID; + attackRoundInfo << uint8(VictimState); + attackRoundInfo << uint32(AttackerState); + attackRoundInfo << uint32(MeleeSpellID); if (HitInfo & HITINFO_BLOCK) - attackRoundInfo << BlockAmount; + attackRoundInfo << int32(BlockAmount); if (HitInfo & HITINFO_RAGE_GAIN) - attackRoundInfo << RageGained; + attackRoundInfo << int32(RageGained); if (HitInfo & HITINFO_UNK1) { - attackRoundInfo << UnkState.State1; - attackRoundInfo << UnkState.State2; - attackRoundInfo << UnkState.State3; - attackRoundInfo << UnkState.State4; - attackRoundInfo << UnkState.State5; - attackRoundInfo << UnkState.State6; - attackRoundInfo << UnkState.State7; - attackRoundInfo << UnkState.State8; - attackRoundInfo << UnkState.State9; - attackRoundInfo << UnkState.State10; - attackRoundInfo << UnkState.State11; - attackRoundInfo << UnkState.State12; + attackRoundInfo << uint32(UnkState.State1); + attackRoundInfo << float(UnkState.State2); + attackRoundInfo << float(UnkState.State3); + attackRoundInfo << float(UnkState.State4); + attackRoundInfo << float(UnkState.State5); + attackRoundInfo << float(UnkState.State6); + attackRoundInfo << float(UnkState.State7); + attackRoundInfo << float(UnkState.State8); + attackRoundInfo << float(UnkState.State9); + attackRoundInfo << float(UnkState.State10); + attackRoundInfo << float(UnkState.State11); + attackRoundInfo << uint32(UnkState.State12); } + if (HitInfo & (HITINFO_BLOCK | HITINFO_UNK12)) - attackRoundInfo << Unk; + attackRoundInfo << float(Unk); + + attackRoundInfo << uint8(SandboxScaling.Type); + attackRoundInfo << uint8(SandboxScaling.TargetLevel); + attackRoundInfo << uint8(SandboxScaling.Expansion); + attackRoundInfo << uint8(SandboxScaling.Class); + attackRoundInfo << uint8(SandboxScaling.TargetMinScalingLevel); + attackRoundInfo << uint8(SandboxScaling.TargetMaxScalingLevel); + attackRoundInfo << int16(SandboxScaling.PlayerLevelDelta); + attackRoundInfo << int8(SandboxScaling.TargetScalingLevelDelta); WriteLogDataBit(); FlushBits(); diff --git a/src/server/game/Server/Packets/CombatLogPackets.h b/src/server/game/Server/Packets/CombatLogPackets.h index 050c436a770..5652ecba8ab 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.h +++ b/src/server/game/Server/Packets/CombatLogPackets.h @@ -26,55 +26,6 @@ namespace WorldPackets { namespace CombatLog { - class CombatLogServerPacket : public ServerPacket - { - public: - CombatLogServerPacket(OpcodeServer opcode, size_t initialSize = 200, ConnectionType connection = CONNECTION_TYPE_DEFAULT) - : ServerPacket(opcode, initialSize, connection), _fullLogPacket(opcode, initialSize, connection) { } - - WorldPacket const* GetFullLogPacket() const { return &_fullLogPacket; } - WorldPacket const* GetBasicLogPacket() const { return &_worldPacket; } - - Spells::SpellCastLogData LogData; - - protected: - template<typename T> - void operator<<(T const& val) - { - _worldPacket << val; - _fullLogPacket << val; - } - - void WriteLogDataBit() - { - _worldPacket.WriteBit(false); - _fullLogPacket.WriteBit(true); - } - - void FlushBits() - { - _worldPacket.FlushBits(); - _fullLogPacket.FlushBits(); - } - - bool WriteBit(bool bit) - { - _worldPacket.WriteBit(bit); - _fullLogPacket.WriteBit(bit); - return bit; - } - - void WriteBits(uint32 value, uint32 bitCount) - { - _worldPacket.WriteBits(value, bitCount); - _fullLogPacket.WriteBits(value, bitCount); - } - - ByteBuffer& WriteLogData() { return _fullLogPacket << LogData; } - - WorldPacket _fullLogPacket; - }; - class SpellNonMeleeDamageLog final : public CombatLogServerPacket { public: @@ -82,18 +33,20 @@ namespace WorldPackets WorldPacket const* Write() override; - int32 Absorbed = 0; - int32 ShieldBlock = 0; ObjectGuid Me; - int32 SpellID = 0; - int32 Resisted = 0; - bool Periodic = 0.0f; - uint8 SchoolMask = 0; ObjectGuid CasterGUID; + ObjectGuid CastID; + int32 SpellID = 0; int32 Damage = 0; - // Optional<SpellNonMeleeDamageLogDebugInfo> Debug Info; - int32 Flags = 0; int32 Overkill = 0; + uint8 SchoolMask = 0; + int32 ShieldBlock = 0; + int32 Resisted = 0; + bool Periodic = false; + int32 Absorbed = 0; + int32 Flags = 0; + // Optional<SpellNonMeleeDamageLogDebugInfo> Debug Info; + Optional<Spells::SandboxScalingData> SandboxScaling; }; class EnvironmentalDamageLog final : public CombatLogServerPacket @@ -148,9 +101,9 @@ namespace WorldPackets int32 OverHeal = 0; int32 Absorbed = 0; bool Crit = false; - bool Multistrike = false; Optional<float> CritRollMade; Optional<float> CritRollNeeded; + Optional<Spells::SandboxScalingData> SandboxScaling; }; class SpellPeriodicAuraLog final : public CombatLogServerPacket @@ -171,8 +124,8 @@ namespace WorldPackets int32 AbsorbedOrAmplitude = 0; int32 Resisted = 0; bool Crit = false; - bool Multistrike = false; Optional<PeriodicalAuraLogEffectDebugInfo> DebugInfo; + Optional<Spells::SandboxScalingData> SandboxScaling; }; SpellPeriodicAuraLog() : CombatLogServerPacket(SMSG_SPELL_PERIODIC_AURA_LOG, 16 + 16 + 4 + 4 + 1) { } @@ -328,7 +281,7 @@ namespace WorldPackets struct UnkAttackerState { - int32 State1 = 0; + uint32 State1 = 0; float State2 = 0.0f; float State3 = 0.0f; float State4 = 0.0f; @@ -339,7 +292,7 @@ namespace WorldPackets float State9 = 0.0f; float State10 = 0.0f; float State11 = 0.0f; - int32 State12 = 0; + uint32 State12 = 0; }; class AttackerStateUpdate final : public CombatLogServerPacket @@ -356,12 +309,13 @@ namespace WorldPackets int32 OverDamage = -1; // (damage - health) or -1 if unit is still alive Optional<SubDamage> SubDmg; uint8 VictimState = 0; - int32 AttackerState = -1; - int32 MeleeSpellID = 0; + uint32 AttackerState = 0; + uint32 MeleeSpellID = 0; int32 BlockAmount = 0; int32 RageGained = 0; UnkAttackerState UnkState; float Unk = 0.0f; + Spells::SandboxScalingData SandboxScaling; }; } } diff --git a/src/server/game/Server/Packets/CombatPackets.cpp b/src/server/game/Server/Packets/CombatPackets.cpp index 8f2ea3ac39a..3b3bcc5d19c 100644 --- a/src/server/game/Server/Packets/CombatPackets.cpp +++ b/src/server/game/Server/Packets/CombatPackets.cpp @@ -143,6 +143,7 @@ WorldPacket const* WorldPackets::Combat::ThreatClear::Write() WorldPacket const* WorldPackets::Combat::PvPCredit::Write() { + _worldPacket << int32(OriginalHonor); _worldPacket << int32(Honor); _worldPacket << Target; _worldPacket << int32(Rank); diff --git a/src/server/game/Server/Packets/CombatPackets.h b/src/server/game/Server/Packets/CombatPackets.h index 5554ac9b0b5..550fee5fe35 100644 --- a/src/server/game/Server/Packets/CombatPackets.h +++ b/src/server/game/Server/Packets/CombatPackets.h @@ -186,7 +186,7 @@ namespace WorldPackets WorldPacket const* Write() override; ObjectGuid Guid; - int32 Health = 0; + int64 Health = 0; }; class ThreatClear final : public ServerPacket @@ -206,8 +206,9 @@ namespace WorldPackets WorldPacket const* Write() override; - ObjectGuid Target; + int32 OriginalHonor = 0; int32 Honor = 0; + ObjectGuid Target; int32 Rank = 0; }; 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<int32>()); _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/Packets/GarrisonPackets.cpp b/src/server/game/Server/Packets/GarrisonPackets.cpp index 0618cd041ad..0f84d6a393c 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.cpp +++ b/src/server/game/Server/Packets/GarrisonPackets.cpp @@ -16,6 +16,7 @@ */ #include "GarrisonPackets.h" +#include "DB2Structure.h" WorldPacket const* WorldPackets::Garrison::GarrisonCreateResult::Write() { @@ -64,9 +65,11 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonFollowe data << uint32(follower.ItemLevelWeapon); data << uint32(follower.ItemLevelArmor); data << uint32(follower.Xp); + data << uint32(follower.Durability); data << uint32(follower.CurrentBuildingID); data << uint32(follower.CurrentMissionID); data << uint32(follower.AbilityID.size()); + data << uint32(follower.ZoneSupportSpellID); data << uint32(follower.FollowerStatus); for (GarrAbilityEntry const* ability : follower.AbilityID) data << uint32(ability->ID); @@ -88,6 +91,21 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMission data << uint32(mission.TravelDuration); data << uint32(mission.MissionDuration); data << uint32(mission.MissionState); + data << uint32(mission.Unknown1); + data << uint32(mission.Unknown2); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMissionReward const& missionRewardItem) +{ + data << int32(missionRewardItem.ItemID); + data << uint32(missionRewardItem.Quantity); + data << int32(missionRewardItem.CurrencyID); + data << uint32(missionRewardItem.CurrencyQuantity); + data << uint32(missionRewardItem.FollowerXP); + data << uint32(missionRewardItem.BonusAbilityID); + data << int32(missionRewardItem.Unknown); return data; } @@ -100,51 +118,86 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMission return data; } -WorldPacket const* WorldPackets::Garrison::GetGarrisonInfoResult::Write() +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonTalent const& talent) { - _worldPacket.reserve(4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + - Buildings.size() * sizeof(GarrisonBuildingInfo) + - Plots.size() * sizeof(GarrisonPlotInfo) + - Followers.size() * (sizeof(GarrisonFollower) + 5 * 4) + - Missions.size() * sizeof(GarrisonMission) + - MissionAreaBonuses.size() * sizeof(GarrisonMissionAreaBonus) + - ArchivedMissions.size() * 4 + - CanStartMission.size()); - - _worldPacket << int32(GarrSiteID); - _worldPacket << int32(GarrSiteLevelID); - _worldPacket << int32(FactionIndex); - _worldPacket << uint32(Buildings.size()); - _worldPacket << uint32(Plots.size()); - _worldPacket << uint32(Followers.size()); - _worldPacket << uint32(Missions.size()); - _worldPacket << uint32(CanStartMission.size()); - _worldPacket << uint32(MissionAreaBonuses.size()); - _worldPacket << uint32(ArchivedMissions.size()); - _worldPacket << int32(NumFollowerActivationsRemaining); - - for (GarrisonBuildingInfo const* building : Buildings) - _worldPacket << *building; - - for (GarrisonPlotInfo* plot : Plots) - _worldPacket << *plot; - - for (GarrisonFollower const* follower : Followers) - _worldPacket << *follower; + data << int32(talent.GarrTalentID); + data << int32(talent.ResearchStartTime); + data << int32(talent.Flags); - for (GarrisonMission const* mission : Missions) - _worldPacket << *mission; + return data; +} - for (GarrisonMissionAreaBonus const* areaBonus : MissionAreaBonuses) - _worldPacket << *areaBonus; +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonInfo const& garrison) +{ + ASSERT(garrison.Missions.size() == garrison.MissionRewards.size()); + ASSERT(garrison.Missions.size() == garrison.MissionOvermaxRewards.size()); + ASSERT(garrison.Missions.size() == garrison.CanStartMission.size()); + + data << int32(garrison.GarrTypeID); + data << int32(garrison.GarrSiteID); + data << int32(garrison.GarrSiteLevelID); + data << uint32(garrison.Buildings.size()); + data << uint32(garrison.Plots.size()); + data << uint32(garrison.Followers.size()); + data << uint32(garrison.Missions.size()); + data << uint32(garrison.MissionRewards.size()); + data << uint32(garrison.MissionOvermaxRewards.size()); + data << uint32(garrison.MissionAreaBonuses.size()); + data << uint32(garrison.Talents.size()); + data << uint32(garrison.CanStartMission.size()); + data << uint32(garrison.ArchivedMissions.size()); + data << int32(garrison.NumFollowerActivationsRemaining); + data << uint32(garrison.NumMissionsStartedToday); + + for (WorldPackets::Garrison::GarrisonBuildingInfo const* building : garrison.Buildings) + data << *building; + + for (WorldPackets::Garrison::GarrisonPlotInfo* plot : garrison.Plots) + data << *plot; + + for (WorldPackets::Garrison::GarrisonFollower const* follower : garrison.Followers) + data << *follower; + + for (WorldPackets::Garrison::GarrisonMission const* mission : garrison.Missions) + data << *mission; + + for (std::vector<WorldPackets::Garrison::GarrisonMissionReward> const& missionReward : garrison.MissionRewards) + { + data << uint32(missionReward.size()); + for (WorldPackets::Garrison::GarrisonMissionReward const& missionRewardItem : missionReward) + data << missionRewardItem; + } + + for (std::vector<WorldPackets::Garrison::GarrisonMissionReward> const& missionReward : garrison.MissionOvermaxRewards) + { + data << uint32(missionReward.size()); + for (WorldPackets::Garrison::GarrisonMissionReward const& missionRewardItem : missionReward) + data << missionRewardItem; + } + + for (WorldPackets::Garrison::GarrisonMissionAreaBonus const* areaBonus : garrison.MissionAreaBonuses) + data << *areaBonus; + + for (WorldPackets::Garrison::GarrisonTalent const& talent : garrison.Talents) + data << talent; + + if (!garrison.ArchivedMissions.empty()) + data.append(garrison.ArchivedMissions.data(), garrison.ArchivedMissions.size()); + + for (bool canStartMission : garrison.CanStartMission) + data.WriteBit(canStartMission); - if (!ArchivedMissions.empty()) - _worldPacket.append(ArchivedMissions.data(), ArchivedMissions.size()); + data.FlushBits(); - for (bool canStartMission : CanStartMission) - _worldPacket.WriteBit(canStartMission); + return data; +} - _worldPacket.FlushBits(); +WorldPacket const* WorldPackets::Garrison::GetGarrisonInfoResult::Write() +{ + _worldPacket << int32(FactionIndex); + _worldPacket << uint32(Garrisons.size()); + for (GarrisonInfo const& garrison : Garrisons) + _worldPacket << garrison; return &_worldPacket; } @@ -185,6 +238,7 @@ void WorldPackets::Garrison::GarrisonPurchaseBuilding::Read() WorldPacket const* WorldPackets::Garrison::GarrisonPlaceBuildingResult::Write() { + _worldPacket << int32(GarrTypeID); _worldPacket << uint32(Result); _worldPacket << BuildingInfo; _worldPacket.WriteBit(PlayActivationCinematic); @@ -201,6 +255,7 @@ void WorldPackets::Garrison::GarrisonCancelConstruction::Read() WorldPacket const* WorldPackets::Garrison::GarrisonBuildingRemoved::Write() { + _worldPacket << int32(GarrTypeID); _worldPacket << uint32(Result); _worldPacket << uint32(GarrPlotInstanceID); _worldPacket << uint32(GarrBuildingID); @@ -210,6 +265,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonBuildingRemoved::Write() WorldPacket const* WorldPackets::Garrison::GarrisonLearnBlueprintResult::Write() { + _worldPacket << int32(GarrTypeID); _worldPacket << uint32(Result); _worldPacket << uint32(BuildingID); @@ -218,6 +274,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonLearnBlueprintResult::Write() WorldPacket const* WorldPackets::Garrison::GarrisonUnlearnBlueprintResult::Write() { + _worldPacket << int32(GarrTypeID); _worldPacket << uint32(Result); _worldPacket << uint32(BuildingID); @@ -226,6 +283,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonUnlearnBlueprintResult::Write WorldPacket const* WorldPackets::Garrison::GarrisonRequestBlueprintAndSpecializationDataResult::Write() { + _worldPacket << int32(GarrTypeID); _worldPacket << uint32(BlueprintsKnown ? BlueprintsKnown->size() : 0); _worldPacket << uint32(SpecializationsKnown ? SpecializationsKnown->size() : 0); if (BlueprintsKnown) @@ -258,6 +316,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonBuildingLandmarks::Write() WorldPacket const* WorldPackets::Garrison::GarrisonPlotPlaced::Write() { + _worldPacket << int32(GarrTypeID); _worldPacket << *PlotInfo; return &_worldPacket; @@ -272,6 +331,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonPlotRemoved::Write() WorldPacket const* WorldPackets::Garrison::GarrisonAddFollowerResult::Write() { + _worldPacket << int32(GarrTypeID); _worldPacket << uint32(Result); _worldPacket << Follower; @@ -281,6 +341,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonAddFollowerResult::Write() WorldPacket const* WorldPackets::Garrison::GarrisonRemoveFollowerResult::Write() { _worldPacket << uint64(FollowerDBID); + _worldPacket << int32(GarrTypeID); _worldPacket << uint32(Result); _worldPacket << uint32(Destroyed); diff --git a/src/server/game/Server/Packets/GarrisonPackets.h b/src/server/game/Server/Packets/GarrisonPackets.h index a5ce42d7488..15134c55535 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 { @@ -84,9 +85,11 @@ namespace WorldPackets uint32 ItemLevelWeapon = 0; uint32 ItemLevelArmor = 0; uint32 Xp = 0; + uint32 Durability = 0; uint32 CurrentBuildingID = 0; uint32 CurrentMissionID = 0; std::list<GarrAbilityEntry const*> AbilityID; + uint32 ZoneSupportSpellID = 0; uint32 FollowerStatus = 0; std::string CustomName; }; @@ -101,6 +104,19 @@ namespace WorldPackets uint32 TravelDuration = 0; uint32 MissionDuration = 0; uint32 MissionState = 0; + uint32 Unknown1 = 0; + uint32 Unknown2 = 0; + }; + + struct GarrisonMissionReward + { + int32 ItemID = 0; + uint32 Quantity = 0; + int32 CurrencyID = 0; + uint32 CurrencyQuantity = 0; + uint32 FollowerXP = 0; + uint32 BonusAbilityID = 0; + int32 Unknown = 0; }; struct GarrisonMissionAreaBonus @@ -109,26 +125,43 @@ namespace WorldPackets time_t StartTime = time_t(0); }; - class GetGarrisonInfoResult final : public ServerPacket + struct GarrisonTalent { - public: - GetGarrisonInfoResult() : ServerPacket(SMSG_GET_GARRISON_INFO_RESULT) { } - - WorldPacket const* Write() override; + int32 GarrTalentID = 0; + time_t ResearchStartTime = time_t(0); + int32 Flags = 0; + }; + struct GarrisonInfo + { + int32 GarrTypeID = 0; uint32 GarrSiteID = 0; uint32 GarrSiteLevelID = 0; - uint32 FactionIndex = 0; uint32 NumFollowerActivationsRemaining = 0; + uint32 NumMissionsStartedToday = 0; // might mean something else, but sending 0 here enables follower abilities "Increase success chance of the first mission of the day by %." std::vector<GarrisonPlotInfo*> Plots; std::vector<GarrisonBuildingInfo const*> Buildings; std::vector<GarrisonFollower const*> Followers; std::vector<GarrisonMission const*> Missions; + std::vector<std::vector<GarrisonMissionReward>> MissionRewards; + std::vector<std::vector<GarrisonMissionReward>> MissionOvermaxRewards; std::vector<GarrisonMissionAreaBonus const*> MissionAreaBonuses; + std::vector<GarrisonTalent> Talents; std::vector<bool> CanStartMission; std::vector<int32> ArchivedMissions; }; + class GetGarrisonInfoResult final : public ServerPacket + { + public: + GetGarrisonInfoResult() : ServerPacket(SMSG_GET_GARRISON_INFO_RESULT) { } + + WorldPacket const* Write() override; + + uint32 FactionIndex = 0; + std::vector<GarrisonInfo> Garrisons; + }; + struct GarrisonRemoteBuildingInfo { GarrisonRemoteBuildingInfo() : GarrPlotInstanceID(0), GarrBuildingID(0) { } @@ -173,6 +206,7 @@ namespace WorldPackets WorldPacket const* Write() override; + int32 GarrTypeID = 0; uint32 Result = 0; GarrisonBuildingInfo BuildingInfo; bool PlayActivationCinematic = false; @@ -196,6 +230,7 @@ namespace WorldPackets WorldPacket const* Write() override; + int32 GarrTypeID = 0; uint32 Result = 0; uint32 GarrPlotInstanceID = 0; uint32 GarrBuildingID = 0; @@ -208,6 +243,7 @@ namespace WorldPackets WorldPacket const* Write() override; + int32 GarrTypeID = 0; uint32 BuildingID = 0; uint32 Result = 0; }; @@ -219,6 +255,7 @@ namespace WorldPackets WorldPacket const* Write() override; + int32 GarrTypeID = 0; uint32 BuildingID = 0; uint32 Result = 0; }; @@ -238,6 +275,7 @@ namespace WorldPackets WorldPacket const* Write() override; + int32 GarrTypeID = 0; std::unordered_set<uint32> const* SpecializationsKnown = nullptr; std::unordered_set<uint32> const* BlueprintsKnown = nullptr; }; @@ -276,6 +314,7 @@ namespace WorldPackets WorldPacket const* Write() override; + int32 GarrTypeID = 0; GarrisonPlotInfo* PlotInfo = nullptr; }; @@ -296,6 +335,7 @@ namespace WorldPackets WorldPacket const* Write() override; + int32 GarrTypeID = 0; GarrisonFollower Follower; uint32 Result = 0; }; @@ -308,6 +348,7 @@ namespace WorldPackets WorldPacket const* Write() override; uint64 FollowerDBID = 0; + int32 GarrTypeID = 0; uint32 Result = 0; uint32 Destroyed = 0; }; diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp index 21626fd8640..a5a897c3eac 100644 --- a/src/server/game/Server/Packets/GuildPackets.cpp +++ b/src/server/game/Server/Packets/GuildPackets.cpp @@ -42,21 +42,19 @@ WorldPacket const* WorldPackets::Guild::QueryGuildInfoResponse::Write() _worldPacket << uint32(Info->BorderStyle); _worldPacket << uint32(Info->BorderColor); _worldPacket << uint32(Info->BackgroundColor); + _worldPacket.WriteBits(Info->GuildName.size(), 7); + _worldPacket.FlushBits(); for (GuildInfo::GuildInfoRank const& rank : Info->Ranks) { _worldPacket << uint32(rank.RankID); _worldPacket << uint32(rank.RankOrder); - _worldPacket.WriteBits(rank.RankName.size(), 7); _worldPacket.FlushBits(); _worldPacket.WriteString(rank.RankName); } - _worldPacket.WriteBits(Info->GuildName.size(), 7); - _worldPacket.FlushBits(); - _worldPacket.WriteString(Info->GuildName); } @@ -69,14 +67,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); @@ -600,6 +597,8 @@ WorldPacket const* WorldPackets::Guild::GuildBankQueryResults::Write() _worldPacket << WithdrawalsRemaining; _worldPacket << uint32(TabInfo.size()); _worldPacket << uint32(ItemInfo.size()); + _worldPacket.WriteBit(FullUpdate); + _worldPacket.FlushBits(); for (GuildBankTabInfo const& tab : TabInfo) { @@ -620,21 +619,14 @@ WorldPacket const* WorldPackets::Guild::GuildBankQueryResults::Write() _worldPacket << item.EnchantmentID; _worldPacket << item.Charges; _worldPacket << item.OnUseEnchantmentID; - _worldPacket << uint32(item.SocketEnchant.size()); _worldPacket << item.Flags; - - for (GuildBankItemInfo::GuildBankSocketEnchant const& socketEnchant : item.SocketEnchant) - { - _worldPacket << socketEnchant.SocketIndex; - _worldPacket << socketEnchant.SocketEnchantID; - } - + _worldPacket.WriteBits(item.SocketEnchant.size(), 2); _worldPacket.WriteBit(item.Locked); _worldPacket.FlushBits(); - } - _worldPacket.WriteBit(FullUpdate); - _worldPacket.FlushBits(); + for (Item::ItemGemInstanceData const& socketEnchant : item.SocketEnchant) + _worldPacket << socketEnchant; + } return &_worldPacket; } @@ -668,6 +660,8 @@ WorldPacket const* WorldPackets::Guild::GuildBankLogQueryResults::Write() { _worldPacket << Tab; _worldPacket << uint32(Entry.size()); + _worldPacket.WriteBit(WeeklyBonusMoney.is_initialized()); + _worldPacket.FlushBits(); for (GuildBankLogEntry const& logEntry : Entry) { @@ -694,9 +688,6 @@ WorldPacket const* WorldPackets::Guild::GuildBankLogQueryResults::Write() _worldPacket << *logEntry.OtherTab; } - _worldPacket.WriteBit(WeeklyBonusMoney.is_initialized()); - _worldPacket.FlushBits(); - if (WeeklyBonusMoney) _worldPacket << *WeeklyBonusMoney; @@ -723,11 +714,7 @@ WorldPacket const* WorldPackets::Guild::GuildBankTextQueryResult::Write() void WorldPackets::Guild::GuildBankSetTabText::Read() { _worldPacket >> Tab; - - _worldPacket.ResetBitPos(); - uint32 tabTextLen = _worldPacket.ReadBits(14); - - TabText = _worldPacket.ReadString(tabTextLen); + TabText = _worldPacket.ReadString(_worldPacket.ReadBits(14)); } void WorldPackets::Guild::GuildQueryNews::Read() @@ -783,16 +770,16 @@ void WorldPackets::Guild::GuildSetGuildMaster::Read() WorldPacket const* WorldPackets::Guild::GuildChallengeUpdate::Write() { - for (int i = 0; i < GUILD_CHALLENGES_TYPES; ++i) + for (int32 i = 0; i < GUILD_CHALLENGES_TYPES; ++i) _worldPacket << int32(CurrentCount[i]); - for (int i = 0; i < GUILD_CHALLENGES_TYPES; ++i) + for (int32 i = 0; i < GUILD_CHALLENGES_TYPES; ++i) _worldPacket << int32(MaxCount[i]); - for (int i = 0; i < GUILD_CHALLENGES_TYPES; ++i) + for (int32 i = 0; i < GUILD_CHALLENGES_TYPES; ++i) _worldPacket << int32(MaxLevelGold[i]); - for (int i = 0; i < GUILD_CHALLENGES_TYPES; ++i) + for (int32 i = 0; i < GUILD_CHALLENGES_TYPES; ++i) _worldPacket << int32(Gold[i]); return &_worldPacket; diff --git a/src/server/game/Server/Packets/GuildPackets.h b/src/server/game/Server/Packets/GuildPackets.h index 34d7981dcb1..2e1d60578d1 100644 --- a/src/server/game/Server/Packets/GuildPackets.h +++ b/src/server/game/Server/Packets/GuildPackets.h @@ -780,12 +780,6 @@ namespace WorldPackets struct GuildBankItemInfo { - struct GuildBankSocketEnchant - { - int32 SocketIndex = 0; - int32 SocketEnchantID = 0; - }; - WorldPackets::Item::ItemInstance Item; int32 Slot = 0; int32 Count = 0; @@ -794,7 +788,7 @@ namespace WorldPackets int32 OnUseEnchantmentID = 0; int32 Flags = 0; bool Locked = false; - std::vector<GuildBankSocketEnchant> SocketEnchant; + std::vector<Item::ItemGemInstanceData> SocketEnchant; }; struct GuildBankTabInfo @@ -972,7 +966,7 @@ namespace WorldPackets class GuildChallengeUpdate final : public ServerPacket { public: - GuildChallengeUpdate() : ServerPacket(SMSG_GUILD_CHALLENGE_UPDATE, 120) { } + GuildChallengeUpdate() : ServerPacket(SMSG_GUILD_CHALLENGE_UPDATE, 96) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/InspectPackets.cpp b/src/server/game/Server/Packets/InspectPackets.cpp index 8f8ce7b2caa..666f653d69e 100644 --- a/src/server/game/Server/Packets/InspectPackets.cpp +++ b/src/server/game/Server/Packets/InspectPackets.cpp @@ -34,16 +34,19 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::InspectEnchantDa ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::InspectItemData const& itemData) { data << itemData.CreatorGUID; - data << itemData.Item; data << uint8(itemData.Index); + data << itemData.Item; + data.WriteBit(itemData.Usable); + data.WriteBits(itemData.Enchants.size(), 4); + data.WriteBits(itemData.Gems.size(), 2); + data.FlushBits(); + + for (auto const& gem : itemData.Gems) + data << gem; - data << uint32(itemData.Enchants.size()); for (size_t i = 0; i < itemData.Enchants.size(); ++i) data << itemData.Enchants[i]; - data.WriteBit(itemData.Usable); - data.FlushBits(); - return data; } @@ -65,36 +68,46 @@ WorldPackets::Inspect::InspectItemData::InspectItemData(::Item const* item, uint Usable = true; /// @todo for (uint8 i = 0; i < MAX_ENCHANTMENT_SLOT; ++i) - { if (uint32 enchId = item->GetEnchantmentId(EnchantmentSlot(i))) Enchants.emplace_back(enchId, i); + + uint8 i = 0; + for (ItemDynamicFieldGems const& gemData : item->GetGems()) + { + if (gemData.ItemId) + { + WorldPackets::Item::ItemGemInstanceData gem; + gem.Slot = i; + gem.Item.Initialize(&gemData); + Gems.push_back(gem); + } + ++i; } } WorldPacket const* WorldPackets::Inspect::InspectResult::Write() { _worldPacket << InspecteeGUID; - _worldPacket << uint32(Items.size()); _worldPacket << uint32(Glyphs.size()); _worldPacket << uint32(Talents.size()); - + _worldPacket << uint32(PvpTalents.size()); _worldPacket << int32(ClassID); _worldPacket << int32(SpecializationID); _worldPacket << int32(GenderID); - - for (size_t i = 0; i < Items.size(); ++i) - _worldPacket << Items[i]; - - for (size_t i = 0; i < Glyphs.size(); ++i) - _worldPacket << uint16(Glyphs[i]); - - for (size_t i = 0; i < Talents.size(); ++i) - _worldPacket << uint16(Talents[i]); + if (!Glyphs.empty()) + _worldPacket.append(Glyphs.data(), Glyphs.size()); + if (!Talents.empty()) + _worldPacket.append(Talents.data(), Talents.size()); + if (!PvpTalents.empty()) + _worldPacket.append(PvpTalents.data(), PvpTalents.size()); _worldPacket.WriteBit(GuildData.is_initialized()); _worldPacket.FlushBits(); + for (size_t i = 0; i < Items.size(); ++i) + _worldPacket << Items[i]; + if (GuildData) _worldPacket << *GuildData; diff --git a/src/server/game/Server/Packets/InspectPackets.h b/src/server/game/Server/Packets/InspectPackets.h index 46d169ec69d..e02e59b5e28 100644 --- a/src/server/game/Server/Packets/InspectPackets.h +++ b/src/server/game/Server/Packets/InspectPackets.h @@ -54,6 +54,7 @@ namespace WorldPackets uint8 Index = 0; bool Usable = false; std::vector<InspectEnchantData> Enchants; + std::vector<Item::ItemGemInstanceData> Gems; }; struct InspectGuildData @@ -70,13 +71,14 @@ namespace WorldPackets WorldPacket const* Write() override; + ObjectGuid InspecteeGUID; std::vector<InspectItemData> Items; + std::vector<uint16> Glyphs; + std::vector<uint16> Talents; + std::vector<uint16> PvpTalents; int32 ClassID = CLASS_NONE; int32 GenderID = GENDER_NONE; - std::vector<uint16> Talents; - std::vector<uint16> Glyphs; Optional<InspectGuildData> GuildData; - ObjectGuid InspecteeGUID; int32 SpecializationID = 0; }; diff --git a/src/server/game/Server/Packets/InstancePackets.cpp b/src/server/game/Server/Packets/InstancePackets.cpp index 375761a5611..dfa490135b0 100644 --- a/src/server/game/Server/Packets/InstancePackets.cpp +++ b/src/server/game/Server/Packets/InstancePackets.cpp @@ -110,7 +110,6 @@ WorldPacket const* WorldPackets::Instance::RaidInstanceMessage::Write() _worldPacket << uint8(Type); _worldPacket << uint32(MapID); _worldPacket << uint32(DifficultyID); - _worldPacket << int32(TimeLeft); _worldPacket.WriteBit(Locked); _worldPacket.WriteBit(Extended); _worldPacket.FlushBits(); diff --git a/src/server/game/Server/Packets/InstancePackets.h b/src/server/game/Server/Packets/InstancePackets.h index 71bd5fa5268..d9e957aa470 100644 --- a/src/server/game/Server/Packets/InstancePackets.h +++ b/src/server/game/Server/Packets/InstancePackets.h @@ -160,7 +160,6 @@ namespace WorldPackets uint8 Type = 0; uint32 MapID = 0; uint32 DifficultyID = 0; - int32 TimeLeft = 0; bool Locked = false; bool Extended = false; }; diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index 94a9f1d24c0..54bc120d178 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -31,37 +31,36 @@ bool WorldPackets::Item::ItemBonusInstanceData::operator==(ItemBonusInstanceData void WorldPackets::Item::BuyBackItem::Read() { - _worldPacket >> VendorGUID - >> Slot; + _worldPacket >> VendorGUID; + _worldPacket >> Slot; } void WorldPackets::Item::BuyItem::Read() { - _worldPacket >> VendorGUID - >> ContainerGUID - >> Item - >> Quantity - >> Muid - >> Slot; - + _worldPacket >> VendorGUID; + _worldPacket >> ContainerGUID; + _worldPacket >> Item; + _worldPacket >> Quantity; + _worldPacket >> Muid; + _worldPacket >> Slot; ItemType = static_cast<ItemVendorType>(_worldPacket.ReadBits(2)); } WorldPacket const* WorldPackets::Item::BuySucceeded::Write() { - _worldPacket << VendorGUID - << uint32(Muid) - << int32(NewQuantity) - << uint32(QuantityBought); + _worldPacket << VendorGUID; + _worldPacket << uint32(Muid); + _worldPacket << int32(NewQuantity); + _worldPacket << uint32(QuantityBought); return &_worldPacket; } WorldPacket const* WorldPackets::Item::BuyFailed::Write() { - _worldPacket << VendorGUID - << uint32(Muid) - << uint8(Reason); + _worldPacket << VendorGUID; + _worldPacket << uint32(Muid); + _worldPacket << uint8(Reason); return &_worldPacket; } @@ -73,23 +72,23 @@ void WorldPackets::Item::GetItemPurchaseData::Read() ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemPurchaseRefundItem& refundItem) { - data << refundItem.ItemID; - data << refundItem.ItemCount; + data << int32(refundItem.ItemID); + data << int32(refundItem.ItemCount); return data; } ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemPurchaseRefundCurrency& refundCurrency) { - data << refundCurrency.CurrencyID; - data << refundCurrency.CurrencyCount; + data << int32(refundCurrency.CurrencyID); + data << int32(refundCurrency.CurrencyCount); return data; } ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemPurchaseContents& purchaseContents) { - data << purchaseContents.Money; + data << uint64(purchaseContents.Money); for (uint32 i = 0; i < 5; ++i) data << purchaseContents.Items[i]; @@ -103,8 +102,8 @@ WorldPacket const* WorldPackets::Item::SetItemPurchaseData::Write() { _worldPacket << ItemGUID; _worldPacket << Contents; - _worldPacket << Flags; - _worldPacket << PurchaseTime; + _worldPacket << uint32(Flags); + _worldPacket << uint32(PurchaseTime); return &_worldPacket; } @@ -150,43 +149,41 @@ void WorldPackets::Item::SellItem::Read() WorldPacket const* WorldPackets::Item::ItemTimeUpdate::Write() { _worldPacket << ItemGuid; - _worldPacket << DurationLeft; + _worldPacket << uint32(DurationLeft); return &_worldPacket; } WorldPacket const* WorldPackets::Item::SetProficiency::Write() { - _worldPacket << ProficiencyMask; - _worldPacket << ProficiencyClass; + _worldPacket << uint32(ProficiencyMask); + _worldPacket << uint8(ProficiencyClass); return &_worldPacket; } ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData const& itemBonusInstanceData) { - data << itemBonusInstanceData.Context; + data << uint8(itemBonusInstanceData.Context); data << uint32(itemBonusInstanceData.BonusListIDs.size()); for (uint32 bonusID : itemBonusInstanceData.BonusListIDs) - data << bonusID; + data << uint32(bonusID); return data; } -ByteBuffer& operator>>(ByteBuffer& data, Optional<WorldPackets::Item::ItemBonusInstanceData>& itemBonusInstanceData) +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData& itemBonusInstanceData) { uint32 bonusListIdSize; - itemBonusInstanceData = boost::in_place(); - - data >> itemBonusInstanceData->Context; + data >> itemBonusInstanceData.Context; data >> bonusListIdSize; for (uint32 i = 0u; i < bonusListIdSize; ++i) { uint32 bonusId; data >> bonusId; - itemBonusInstanceData->BonusListIDs.push_back(bonusId); + itemBonusInstanceData.BonusListIDs.push_back(bonusId); } return data; @@ -217,22 +214,38 @@ ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemInstance& itemI data >> itemInstance.RandomPropertiesSeed; data >> itemInstance.RandomPropertiesID; - bool const hasItemBonus = data.ReadBit(); - bool const hasModifications = data.ReadBit(); + bool hasItemBonus = data.ReadBit(); + bool hasModifications = data.ReadBit(); if (hasItemBonus) - data >> itemInstance.ItemBonus; + { + itemInstance.ItemBonus = boost::in_place(); + data >> *itemInstance.ItemBonus; + } if (hasModifications) { - WorldPackets::CompactArray<int32> modifications; - data >> modifications; - itemInstance.Modifications = std::move(modifications); + itemInstance.Modifications = boost::in_place(); + data >> *itemInstance.Modifications; } return data; } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemGemInstanceData const& itemGemInstanceData) +{ + data << uint8(itemGemInstanceData.Slot); + data << itemGemInstanceData.Item; + return data; +} + +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemGemInstanceData& itemGemInstanceData) +{ + data >> itemGemInstanceData.Slot; + data >> itemGemInstanceData.Item; + return data; +} + ByteBuffer& WorldPackets::Item::operator>>(ByteBuffer& data, InvUpdate& invUpdate) { invUpdate.Items.resize(data.ReadBits(2)); @@ -268,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; @@ -354,64 +381,64 @@ WorldPacket const* WorldPackets::Item::InventoryChangeFailure::Write() void WorldPackets::Item::SplitItem::Read() { - _worldPacket >> Inv - >> FromPackSlot - >> FromSlot - >> ToPackSlot - >> ToSlot - >> Quantity; + _worldPacket >> Inv; + _worldPacket >> FromPackSlot; + _worldPacket >> FromSlot; + _worldPacket >> ToPackSlot; + _worldPacket >> ToSlot; + _worldPacket >> Quantity; } void WorldPackets::Item::SwapInvItem::Read() { - _worldPacket >> Inv - >> Slot2 - >> Slot1; + _worldPacket >> Inv; + _worldPacket >> Slot2; + _worldPacket >> Slot1; } void WorldPackets::Item::SwapItem::Read() { - _worldPacket >> Inv - >> ContainerSlotB - >> ContainerSlotA - >> SlotB - >> SlotA; + _worldPacket >> Inv; + _worldPacket >> ContainerSlotB; + _worldPacket >> ContainerSlotA; + _worldPacket >> SlotB; + _worldPacket >> SlotA; } void WorldPackets::Item::AutoEquipItem::Read() { - _worldPacket >> Inv - >> PackSlot - >> Slot; + _worldPacket >> Inv; + _worldPacket >> PackSlot; + _worldPacket >> Slot; } void WorldPackets::Item::AutoEquipItemSlot::Read() { - _worldPacket >> Inv - >> Item - >> ItemDstSlot; + _worldPacket >> Inv; + _worldPacket >> Item; + _worldPacket >> ItemDstSlot; } void WorldPackets::Item::AutoStoreBagItem::Read() { - _worldPacket >> Inv - >> ContainerSlotB - >> ContainerSlotA - >> SlotA; + _worldPacket >> Inv; + _worldPacket >> ContainerSlotB; + _worldPacket >> ContainerSlotA; + _worldPacket >> SlotA; } void WorldPackets::Item::DestroyItem::Read() { - _worldPacket >> Count - >> ContainerId - >> SlotNum; + _worldPacket >> Count; + _worldPacket >> ContainerId; + _worldPacket >> SlotNum; } WorldPacket const* WorldPackets::Item::SellResponse::Write() { - _worldPacket << VendorGUID - << ItemGUID - << uint8(Reason); + _worldPacket << VendorGUID; + _worldPacket << ItemGUID; + _worldPacket << uint8(Reason); return &_worldPacket; } @@ -419,30 +446,24 @@ WorldPacket const* WorldPackets::Item::SellResponse::Write() WorldPacket const* WorldPackets::Item::ItemPushResult::Write() { _worldPacket << PlayerGUID; - _worldPacket << uint8(Slot); _worldPacket << int32(SlotInBag); - - _worldPacket << Item; - - _worldPacket << uint32(QuestLogItemID); + _worldPacket << int32(QuestLogItemID); _worldPacket << int32(Quantity); _worldPacket << int32(QuantityInInventory); - _worldPacket << uint32(DungeonEncounterID); + _worldPacket << int32(DungeonEncounterID); _worldPacket << int32(BattlePetBreedID); - _worldPacket << int32(BattlePetBreedQuality); _worldPacket << int32(BattlePetSpeciesID); + _worldPacket << uint32(BattlePetBreedQuality); _worldPacket << int32(BattlePetLevel); - _worldPacket << ItemGUID; - _worldPacket.WriteBit(Pushed); _worldPacket.WriteBit(Created); - _worldPacket.WriteBits(DisplayText, 2); + _worldPacket.WriteBits(DisplayText, 3); _worldPacket.WriteBit(IsBonusRoll); _worldPacket.WriteBit(IsEncounterLoot); - _worldPacket.FlushBits(); + _worldPacket << Item; return &_worldPacket; } @@ -456,7 +477,7 @@ void WorldPackets::Item::ReadItem::Read() WorldPacket const* WorldPackets::Item::ReadItemResultFailed::Write() { _worldPacket << Item; - _worldPacket << Delay; + _worldPacket << uint32(Delay); _worldPacket.WriteBits(Subcode, 3); _worldPacket.FlushBits(); @@ -500,34 +521,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<uint32>()); - _worldPacket >> Npc; - for (TransmogrifyItem& item : Items) - _worldPacket >> item; -} - void WorldPackets::Item::UseCritterItem::Read() { _worldPacket >> ItemGuid; @@ -552,8 +545,6 @@ void WorldPackets::Item::SocketGems::Read() WorldPacket const* WorldPackets::Item::SocketGemsResult::Write() { _worldPacket << Item; - _worldPacket.append(Sockets, MAX_GEM_SOCKETS); - _worldPacket << int32(SocketMatch); return &_worldPacket; } diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h index ad821682f9c..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); @@ -53,6 +54,12 @@ namespace WorldPackets bool operator!=(ItemInstance const& r) const { return !(*this == r); } }; + struct ItemGemInstanceData + { + uint8 Slot; + ItemInstance Item; + }; + class BuyBackItem final : public ClientPacket { public: @@ -129,7 +136,7 @@ namespace WorldPackets struct ItemPurchaseContents { - uint32 Money = 0; + uint64 Money = 0; ItemPurchaseRefundItem Items[5] = { }; ItemPurchaseRefundCurrency Currencies[5] = { }; }; @@ -360,9 +367,9 @@ namespace WorldPackets public: enum DisplayType { - DISPLAY_TYPE_ENCOUNTER_LOOT = 1, - DISPLAY_TYPE_NORMAL = 2, - DISPLAY_TYPE_HIDDEN = 3 + DISPLAY_TYPE_HIDDEN = 0, + DISPLAY_TYPE_NORMAL = 1, + DISPLAY_TYPE_ENCOUNTER_LOOT = 2 }; ItemPushResult() : ServerPacket(SMSG_ITEM_PUSH_RESULT, 16 + 1 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 16 + 1 + 1 + 1 + 1) { } @@ -373,11 +380,11 @@ namespace WorldPackets uint8 Slot = 0; int32 SlotInBag = 0; ItemInstance Item; - uint32 QuestLogItemID = 0; // Item ID used for updating quest progress + int32 QuestLogItemID = 0; // Item ID used for updating quest progress // only set if different than real ID (similar to CreatureTemplate.KillCredit) int32 Quantity = 0; int32 QuantityInInventory = 0; - uint32 DungeonEncounterID = 0; + int32 DungeonEncounterID = 0; int32 BattlePetBreedID = 0; uint32 BattlePetBreedQuality = 0; int32 BattlePetSpeciesID = 0; @@ -468,30 +475,6 @@ namespace WorldPackets uint32 Slot = 0; }; - struct TransmogrifyItem - { - Optional<ObjectGuid> SrcItemGUID; - Optional<ObjectGuid> 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<TransmogrifyItem, MAX_TRANSMOGRIFY_ITEMS> Items; - }; - class UseCritterItem final : public ClientPacket { public: @@ -545,8 +528,6 @@ namespace WorldPackets WorldPacket const* Write() override; ObjectGuid Item; - int32 Sockets[MAX_GEM_SOCKETS] = {}; - int32 SocketMatch = 0; }; ByteBuffer& operator>>(ByteBuffer& data, InvUpdate& invUpdate); @@ -557,5 +538,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceDa ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData& itemBonusInstanceData); ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const& itemInstance); ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemInstance& itemInstance); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemGemInstanceData const& itemGemInstanceData); +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemGemInstanceData& itemGemInstanceData); #endif // ItemPackets_h__ diff --git a/src/server/game/Server/Packets/LootPackets.cpp b/src/server/game/Server/Packets/LootPackets.cpp index 68a709b15f6..8d85f27b6b0 100644 --- a/src/server/game/Server/Packets/LootPackets.cpp +++ b/src/server/game/Server/Packets/LootPackets.cpp @@ -26,13 +26,17 @@ WorldPacket const* WorldPackets::Loot::LootResponse::Write() { _worldPacket << LootObj; _worldPacket << Owner; - _worldPacket << FailureReason; - _worldPacket << AcquireReason; - _worldPacket << LootMethod; - _worldPacket << Threshold; - _worldPacket << Coins; + _worldPacket << uint8(FailureReason); + _worldPacket << uint8(AcquireReason); + _worldPacket << uint8(LootMethod); + _worldPacket << uint8(Threshold); + _worldPacket << uint32(Coins); _worldPacket << uint32(Items.size()); _worldPacket << uint32(Currencies.size()); + _worldPacket.WriteBit(Acquired); + _worldPacket.WriteBit(AELooting); + _worldPacket.WriteBit(PersonalLooting); + _worldPacket.FlushBits(); for (LootItemData const& item : Items) { @@ -40,27 +44,21 @@ WorldPacket const* WorldPackets::Loot::LootResponse::Write() _worldPacket.WriteBits(item.UIType, 3); _worldPacket.WriteBit(item.CanTradeToTapList); _worldPacket.FlushBits(); - - _worldPacket << item.Quantity; - _worldPacket << item.LootItemType; - _worldPacket << item.LootListID; _worldPacket << item.Loot; // WorldPackets::Item::ItemInstance + _worldPacket << uint32(item.Quantity); + _worldPacket << uint8(item.LootItemType); + _worldPacket << uint8(item.LootListID); } for (LootCurrency const& currency : Currencies) { - _worldPacket << currency.CurrencyID; - _worldPacket << currency.Quantity; - _worldPacket << currency.LootListID; + _worldPacket << uint32(currency.CurrencyID); + _worldPacket << uint32(currency.Quantity); + _worldPacket << uint8(currency.LootListID); _worldPacket.WriteBits(currency.UIType, 3); _worldPacket.FlushBits(); } - _worldPacket.WriteBit(Acquired); - _worldPacket.WriteBit(AELooting); - _worldPacket.WriteBit(PersonalLooting); - _worldPacket.FlushBits(); - return &_worldPacket; } diff --git a/src/server/game/Server/Packets/MailPackets.cpp b/src/server/game/Server/Packets/MailPackets.cpp index fc1c75dd2e1..f9bfaad578b 100644 --- a/src/server/game/Server/Packets/MailPackets.cpp +++ b/src/server/game/Server/Packets/MailPackets.cpp @@ -33,32 +33,55 @@ WorldPackets::Mail::MailAttachedItem::MailAttachedItem(::Item const* item, uint8 for (uint8 j = 0; j < MAX_INSPECTED_ENCHANTMENT_SLOT; j++) { - Enchants[j].Enchant = item->GetEnchantmentId((EnchantmentSlot)j); - Enchants[j].Duration = item->GetEnchantmentDuration((EnchantmentSlot)j); - Enchants[j].Charges = item->GetEnchantmentCharges((EnchantmentSlot)j); + if (!item->GetEnchantmentId((EnchantmentSlot)j)) + continue; + + MailAttachedItemEnchant enchant; + enchant.Enchant = item->GetEnchantmentId((EnchantmentSlot)j); + enchant.Duration = item->GetEnchantmentDuration((EnchantmentSlot)j); + enchant.Charges = item->GetEnchantmentCharges((EnchantmentSlot)j); + enchant.Slot = j; + Enchants.push_back(enchant); + } + + uint8 i = 0; + for (ItemDynamicFieldGems const& gemData : item->GetGems()) + { + if (gemData.ItemId) + { + WorldPackets::Item::ItemGemInstanceData gem; + gem.Slot = i; + gem.Item.Initialize(&gemData); + Gems.push_back(gem); + } + ++i; } } ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Mail::MailAttachedItem const& att) { data << uint8(att.Position); - data << uint32(att.AttachID); + data << int32(att.AttachID); + data << int32(att.Count); + data << int32(att.Charges); + data << uint32(att.MaxDurability); + data << int32(att.Durability); data << att.Item; + data.WriteBits(att.Enchants.size(), 4); + data.WriteBits(att.Gems.size(), 2); + data.WriteBit(att.Unlocked); + data.FlushBits(); + + for (auto const& gem : att.Gems) + data << gem; for (auto const& en : att.Enchants) { data << int32(en.Enchant); - data << int32(en.Duration); + data << uint32(en.Duration); data << int32(en.Charges); } - data << int32(att.Count); - data << int32(att.Charges); - data << int32(att.MaxDurability); - data << int32(att.Durability); - data.WriteBit(att.Unlocked); - data.FlushBits(); - return data; } @@ -100,26 +123,22 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Mail::MailListEntry const { data << int32(entry.MailID); data << int8(entry.SenderType); - data << int64(entry.Cod); data << int32(entry.StationeryID); data << int64(entry.SentMoney); data << int32(entry.Flags); data << float(entry.DaysLeft); data << int32(entry.MailTemplateID); - data << int32(entry.Attachments.size()); - - for (auto const& att : entry.Attachments) - data << att; - data.WriteBit(entry.SenderCharacter.is_initialized()); data.WriteBit(entry.AltSenderID.is_initialized()); - data.WriteBits(entry.Subject.size(), 8); data.WriteBits(entry.Body.size(), 13); data.FlushBits(); + for (auto const& att : entry.Attachments) + data << att; + if (entry.SenderCharacter) data << *entry.SenderCharacter; diff --git a/src/server/game/Server/Packets/MailPackets.h b/src/server/game/Server/Packets/MailPackets.h index 927d8022c73..6a2928bb9a5 100644 --- a/src/server/game/Server/Packets/MailPackets.h +++ b/src/server/game/Server/Packets/MailPackets.h @@ -32,8 +32,9 @@ namespace WorldPackets struct MailAttachedItemEnchant { int32 Enchant = 0; - int32 Duration = 0; + uint32 Duration = 0; int32 Charges = 0; + uint8 Slot = 0; }; struct MailAttachedItem @@ -45,10 +46,11 @@ namespace WorldPackets Item::ItemInstance Item; int32 Count = 0; int32 Charges = 0; - int32 MaxDurability = 0; + uint32 MaxDurability = 0; int32 Durability = 0; bool Unlocked = false; - MailAttachedItemEnchant Enchants[8]; + std::vector<MailAttachedItemEnchant> Enchants; + std::vector<Item::ItemGemInstanceData> Gems; }; struct MailListEntry diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index ec440305d26..7a45e527699 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -47,20 +47,23 @@ WorldPacket const* WorldPackets::Misc::LoginSetTimeSpeed::Write() WorldPacket const* WorldPackets::Misc::SetCurrency::Write() { - _worldPacket << uint32(Type); - _worldPacket << uint32(Quantity); + _worldPacket << int32(Type); + _worldPacket << int32(Quantity); _worldPacket << uint32(Flags); _worldPacket.WriteBit(WeeklyQuantity.is_initialized()); _worldPacket.WriteBit(TrackedQuantity.is_initialized()); + _worldPacket.WriteBit(MaxQuantity.is_initialized()); _worldPacket.WriteBit(SuppressChatLog); + _worldPacket.FlushBits(); if (WeeklyQuantity) - _worldPacket << uint32(*WeeklyQuantity); + _worldPacket << int32(*WeeklyQuantity); if (TrackedQuantity) - _worldPacket << uint32(*TrackedQuantity); + _worldPacket << int32(*TrackedQuantity); - _worldPacket.FlushBits(); + if (MaxQuantity) + _worldPacket << int32(*MaxQuantity); return &_worldPacket; } @@ -76,14 +79,15 @@ WorldPacket const* WorldPackets::Misc::SetupCurrency::Write() for (Record const& data : Data) { - _worldPacket << uint32(data.Type); - _worldPacket << uint32(data.Quantity); + _worldPacket << int32(data.Type); + _worldPacket << int32(data.Quantity); _worldPacket.WriteBit(data.WeeklyQuantity.is_initialized()); _worldPacket.WriteBit(data.MaxWeeklyQuantity.is_initialized()); _worldPacket.WriteBit(data.TrackedQuantity.is_initialized()); - + _worldPacket.WriteBit(data.MaxQuantity.is_initialized()); _worldPacket.WriteBits(data.Flags, 5); + _worldPacket.FlushBits(); if (data.WeeklyQuantity) _worldPacket << uint32(*data.WeeklyQuantity); @@ -91,10 +95,10 @@ WorldPacket const* WorldPackets::Misc::SetupCurrency::Write() _worldPacket << uint32(*data.MaxWeeklyQuantity); if (data.TrackedQuantity) _worldPacket << uint32(*data.TrackedQuantity); + if (data.MaxQuantity) + _worldPacket << int32(*data.MaxQuantity); } - _worldPacket.FlushBits(); - return &_worldPacket; } @@ -155,11 +159,9 @@ WorldPacket const* WorldPackets::Misc::WorldServerInfo::Write() { _worldPacket << uint32(DifficultyID); _worldPacket << uint8(IsTournamentRealm); - _worldPacket << uint32(WeeklyReset); _worldPacket.WriteBit(XRealmPvpAlert); _worldPacket.WriteBit(RestrictedAccountMaxLevel.is_initialized()); _worldPacket.WriteBit(RestrictedAccountMaxMoney.is_initialized()); - _worldPacket.WriteBit(IneligibleForLootMask.is_initialized()); _worldPacket.WriteBit(InstanceGroupSize.is_initialized()); if (RestrictedAccountMaxLevel) @@ -168,9 +170,6 @@ WorldPacket const* WorldPackets::Misc::WorldServerInfo::Write() if (RestrictedAccountMaxMoney) _worldPacket << uint32(*RestrictedAccountMaxMoney); - if (IneligibleForLootMask) - _worldPacket << uint32(*IneligibleForLootMask); - if (InstanceGroupSize) _worldPacket << uint32(*InstanceGroupSize); @@ -576,6 +575,7 @@ void WorldPackets::Misc::WorldTeleport::Read() _worldPacket >> TransportGUID; _worldPacket >> Pos; _worldPacket >> Facing; + _worldPacket >> LfgDungeonID; } WorldPacket const* WorldPackets::Misc::AccountHeirloomUpdate::Write() diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index cef9a810213..ffb4f6367a8 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -98,12 +98,13 @@ namespace WorldPackets WorldPacket const* Write() override; - bool SuppressChatLog = false; - Optional<int32> TrackedQuantity; + int32 Type = 0; int32 Quantity = 0; uint32 Flags = 0; - int32 Type = 0; Optional<int32> WeeklyQuantity; + Optional<int32> TrackedQuantity; + Optional<int32> MaxQuantity; + bool SuppressChatLog = false; }; class SetSelection final : public ClientPacket @@ -126,6 +127,7 @@ namespace WorldPackets Optional<int32> WeeklyQuantity; // Currency count obtained this Week. Optional<int32> MaxWeeklyQuantity; // Weekly Currency cap. Optional<int32> TrackedQuantity; + Optional<int32> MaxQuantity; uint8 Flags = 0; // 0 = none, }; @@ -236,14 +238,12 @@ namespace WorldPackets WorldPacket const* Write() override; - Optional<uint32> IneligibleForLootMask; ///< Encountermask? - uint32 WeeklyReset = 0; ///< UnixTime of last Weekly Reset Time - Optional<uint32> InstanceGroupSize; + uint32 DifficultyID = 0; uint8 IsTournamentRealm = 0; + bool XRealmPvpAlert = false; Optional<uint32> RestrictedAccountMaxLevel; Optional<uint32> RestrictedAccountMaxMoney; - uint32 DifficultyID = 0; - bool XRealmPvpAlert = false; + Optional<uint32> InstanceGroupSize; }; class AreaTrigger final : public ClientPacket @@ -758,6 +758,7 @@ namespace WorldPackets ObjectGuid TransportGUID; G3D::Vector3 Pos; float Facing = 0.0f; + int32 LfgDungeonID; }; class AccountHeirloomUpdate final : public ServerPacket diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index 6fdad7553a3..35c14cf8ce3 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -47,7 +47,7 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementInfo& movementInfo) }*/ data.WriteBits(movementInfo.flags, 30); - data.WriteBits(movementInfo.flags2, 16); + data.WriteBits(movementInfo.flags2, 18); data.WriteBit(hasTransportData); data.WriteBit(hasFallData); @@ -92,8 +92,8 @@ ByteBuffer& operator>>(ByteBuffer& data, MovementInfo& movementInfo) uint32 removeMovementForcesCount; data >> removeMovementForcesCount; - uint32 int168; - data >> int168; + uint32 moveIndex; + data >> moveIndex; for (uint32 i = 0; i < removeMovementForcesCount; ++i) { @@ -102,7 +102,7 @@ ByteBuffer& operator>>(ByteBuffer& data, MovementInfo& movementInfo) } movementInfo.flags = data.ReadBits(30); - movementInfo.flags2 = data.ReadBits(16); + movementInfo.flags2 = data.ReadBits(18); bool hasTransport = data.ReadBit(); bool hasFall = data.ReadBit(); @@ -186,8 +186,8 @@ void WorldPackets::Movement::ClientPlayerMovement::Read() ByteBuffer& WorldPackets::operator<<(ByteBuffer& data, Movement::MonsterSplineFilterKey const& monsterSplineFilterKey) { - data << monsterSplineFilterKey.Idx; - data << monsterSplineFilterKey.Speed; + data << int16(monsterSplineFilterKey.Idx); + data << uint16(monsterSplineFilterKey.Speed); return data; } @@ -195,10 +195,10 @@ ByteBuffer& WorldPackets::operator<<(ByteBuffer& data, Movement::MonsterSplineFi ByteBuffer& WorldPackets::operator<<(ByteBuffer& data, Movement::MonsterSplineFilter const& monsterSplineFilter) { data << uint32(monsterSplineFilter.FilterKeys.size()); - data << monsterSplineFilter.BaseSpeed; - data << monsterSplineFilter.StartOffset; - data << monsterSplineFilter.DistToPrevFilterKey; - data << monsterSplineFilter.AddedToStart; + data << float(monsterSplineFilter.BaseSpeed); + data << int16(monsterSplineFilter.StartOffset); + data << float(monsterSplineFilter.DistToPrevFilterKey); + data << int16(monsterSplineFilter.AddedToStart); for (WorldPackets::Movement::MonsterSplineFilterKey const& filterKey : monsterSplineFilter.FilterKeys) data << filterKey; data.WriteBits(monsterSplineFilter.FilterFlags, 2); @@ -207,45 +207,60 @@ ByteBuffer& WorldPackets::operator<<(ByteBuffer& data, Movement::MonsterSplineFi return data; } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineSpellEffectExtraData const& spellEffectExtraData) +{ + data << spellEffectExtraData.field_1; + data << uint32(spellEffectExtraData.field_2); + data << uint32(spellEffectExtraData.field_3); + data << uint32(spellEffectExtraData.field_4); + + return data; +} + ByteBuffer& WorldPackets::operator<<(ByteBuffer& data, Movement::MovementSpline const& movementSpline) { - data << movementSpline.Flags; - data << movementSpline.AnimTier; - data << movementSpline.TierTransStartTime; - data << movementSpline.Elapsed; - data << movementSpline.MoveTime; - data << movementSpline.JumpGravity; - data << movementSpline.SpecialTime; - data << int32(movementSpline.Points.size()); - data << movementSpline.Mode; - data << movementSpline.VehicleExitVoluntary; + data << uint32(movementSpline.Flags); + data << uint8(movementSpline.AnimTier); + data << uint32(movementSpline.TierTransStartTime); + data << int32(movementSpline.Elapsed); + data << uint32(movementSpline.MoveTime); + data << float(movementSpline.JumpGravity); + data << uint32(movementSpline.SpecialTime); + data << uint8(movementSpline.Mode); + data << uint8(movementSpline.VehicleExitVoluntary); data << movementSpline.TransportGUID; - data << movementSpline.VehicleSeat; - data << int32(movementSpline.PackedDeltas.size()); - for (G3D::Vector3 const& pos : movementSpline.Points) - data << pos; - for (G3D::Vector3 const& pos : movementSpline.PackedDeltas) - data.appendPackXYZ(pos.x, pos.y, pos.z); + data << int8(movementSpline.VehicleSeat); data.WriteBits(movementSpline.Face, 2); + data.WriteBits(movementSpline.Points.size(), 16); + data.WriteBits(movementSpline.PackedDeltas.size(), 16); data.WriteBit(movementSpline.SplineFilter.is_initialized()); + data.WriteBit(movementSpline.SpellEffectExtraData.is_initialized()); data.FlushBits(); + if (movementSpline.SplineFilter) + data << *movementSpline.SplineFilter; + switch (movementSpline.Face) { case ::Movement::MONSTER_MOVE_FACING_SPOT: data << movementSpline.FaceSpot; break; case ::Movement::MONSTER_MOVE_FACING_TARGET: - data << movementSpline.FaceDirection; + data << float(movementSpline.FaceDirection); data << movementSpline.FaceGUID; break; case ::Movement::MONSTER_MOVE_FACING_ANGLE: - data << movementSpline.FaceDirection; + data << float(movementSpline.FaceDirection); break; } - if (movementSpline.SplineFilter) - data << *movementSpline.SplineFilter; + for (G3D::Vector3 const& pos : movementSpline.Points) + data << pos; + for (G3D::Vector3 const& pos : movementSpline.PackedDeltas) + data.appendPackXYZ(pos.x, pos.y, pos.z); + + if (movementSpline.SpellEffectExtraData) + data << *movementSpline.SpellEffectExtraData; return data; } @@ -254,16 +269,10 @@ ByteBuffer& WorldPackets::operator<<(ByteBuffer& data, Movement::MovementMonster { data << movementMonsterSpline.ID; data << movementMonsterSpline.Destination; - data << movementMonsterSpline.Move; data.WriteBit(movementMonsterSpline.CrzTeleport); + data.WriteBits(movementMonsterSpline.StopDistanceTolerance, 3); - // Unk bits. 0 if monster is moving, 1 or 2 if stopped - if (movementMonsterSpline.Move.Flags) - data.WriteBits(0, 2); - else - data.WriteBits(2, 2); - - data.FlushBits(); + data << movementMonsterSpline.Move; return data; } @@ -277,40 +286,41 @@ void WorldPackets::Movement::CommonMovement::WriteCreateObjectSplineDataBlock(:: else data << G3D::Vector3::zero(); - if (data.WriteBit(!moveSpline.Finalized())) // MovementSplineMove - { - data.FlushBits(); + bool hasSplineMove = data.WriteBit(!moveSpline.Finalized() && !moveSpline.splineIsFacingOnly); + data.FlushBits(); + if (hasSplineMove) // MovementSplineMove + { ::Movement::MoveSplineFlag const& splineFlags = moveSpline.splineflags; - data.WriteBits(moveSpline.splineflags.raw(), 28); // SplineFlags - - uint8 face = ::Movement::MONSTER_MOVE_NORMAL; - if (splineFlags.final_angle) - face = ::Movement::MONSTER_MOVE_FACING_ANGLE; - else if (splineFlags.final_target) - face = ::Movement::MONSTER_MOVE_FACING_TARGET; - else if (splineFlags.final_point) - face = ::Movement::MONSTER_MOVE_FACING_SPOT; - - data.WriteBits(face, 2); // Face - - bool HasJumpGravity = data.WriteBit(moveSpline.splineflags & (::Movement::MoveSplineFlag::Parabolic | ::Movement::MoveSplineFlag::Animation)); // HasJumpGravity - bool HasSpecialTime = data.WriteBit((moveSpline.splineflags & ::Movement::MoveSplineFlag::Parabolic) && moveSpline.effect_start_time < moveSpline.Duration()); // HasSpecialTime - - data.WriteBits(uint8(moveSpline.spline.mode()), 2); // Mode - - data.WriteBit(0); // HasSplineFilterKey - + data << uint32(moveSpline.splineflags.raw()); // SplineFlags data << int32(moveSpline.timePassed()); // Elapsed data << uint32(moveSpline.Duration()); // Duration data << float(1.0f); // DurationModifier data << float(1.0f); // NextDurationModifier + data.WriteBits(moveSpline.facing.type, 2); // Face + bool HasJumpGravity = data.WriteBit(moveSpline.splineflags & (::Movement::MoveSplineFlag::Parabolic | ::Movement::MoveSplineFlag::Animation)); // HasJumpGravity + bool HasSpecialTime = data.WriteBit((moveSpline.splineflags & ::Movement::MoveSplineFlag::Parabolic) && moveSpline.effect_start_time < moveSpline.Duration()); // HasSpecialTime + data.WriteBits(moveSpline.getPath().size(), 16); + data.WriteBits(uint8(moveSpline.spline.mode()), 2); // Mode + data.WriteBit(0); // HasSplineFilter + data.WriteBit(0); // HasSpellEffectExtraData + data.FlushBits(); + + //if (HasSplineFilterKey) + //{ + // data << uint32(FilterKeysCount); + // for (var i = 0; i < FilterKeysCount; ++i) + // { + // data << float(In); + // data << float(Out); + // } - uint32 PointsCount = moveSpline.getPath().size(); - data << uint32(PointsCount); + // data.WriteBits(FilterFlags, 2); + // data.FlushBits(); + //} - switch (face) + switch (moveSpline.facing.type) { case ::Movement::MONSTER_MOVE_FACING_SPOT: data << moveSpline.facing.f; // FaceSpot @@ -329,19 +339,15 @@ void WorldPackets::Movement::CommonMovement::WriteCreateObjectSplineDataBlock(:: if (HasSpecialTime) data << uint32(moveSpline.effect_start_time); // SpecialTime - //if (HasSplineFilterKey) - //{ - // data << uint32(FilterKeysCount); - // for (var i = 0; i < PointsCount; ++i) - // { - // data << float(In); - // data << float(Out); - // } + data.append<G3D::Vector3>(&moveSpline.getPath()[0], moveSpline.getPath().size()); - // data.WriteBits(FilterFlags, 2); + //if (HasSpellEffectExtraData) + //{ + // data << ObjectGuid(); + // data << uint32(); + // data << uint32(); + // data << uint32(); //} - - data.append<G3D::Vector3>(&moveSpline.getPath()[0], PointsCount); // Points } } @@ -353,25 +359,10 @@ void WorldPackets::Movement::MonsterMove::InitializeSplineData(::Movement::MoveS ::Movement::MoveSplineFlag splineFlags = moveSpline.splineflags; splineFlags.enter_cycle = moveSpline.isCyclic(); movementSpline.Flags = uint32(splineFlags & uint32(~::Movement::MoveSplineFlag::Mask_No_Monster_Move)); - - switch (moveSpline.splineflags & ::Movement::MoveSplineFlag::Mask_Final_Facing) - { - case ::Movement::MoveSplineFlag::Final_Point: - movementSpline.Face = ::Movement::MONSTER_MOVE_FACING_SPOT; - movementSpline.FaceSpot = moveSpline.facing.f; - break; - case ::Movement::MoveSplineFlag::Final_Target: - movementSpline.Face = ::Movement::MONSTER_MOVE_FACING_TARGET; - movementSpline.FaceGUID = moveSpline.facing.target; - break; - case ::Movement::MoveSplineFlag::Final_Angle: - movementSpline.Face = ::Movement::MONSTER_MOVE_FACING_ANGLE; - movementSpline.FaceDirection = moveSpline.facing.angle; - break; - default: - movementSpline.Face = ::Movement::MONSTER_MOVE_NORMAL; - break; - } + movementSpline.Face = moveSpline.facing.type; + movementSpline.FaceDirection = moveSpline.facing.angle; + movementSpline.FaceGUID = moveSpline.facing.target; + movementSpline.FaceSpot = moveSpline.facing.f; if (splineFlags.animation) { @@ -387,6 +378,9 @@ void WorldPackets::Movement::MonsterMove::InitializeSplineData(::Movement::MoveS movementSpline.SpecialTime = moveSpline.effect_start_time; } + if (splineFlags.unknown6) + movementSpline.SpecialTime = moveSpline.effect_start_time; + ::Movement::Spline<int32> const& spline = moveSpline.spline; std::vector<G3D::Vector3> const& array = spline.getPoints(); @@ -497,6 +491,7 @@ WorldPacket const* WorldPackets::Movement::TransferAborted::Write() { _worldPacket << uint32(MapID); _worldPacket << uint8(Arg); + _worldPacket << int32(MapDifficultyXConditionID); _worldPacket.WriteBits(TransfertAbort, 5); _worldPacket.FlushBits(); return &_worldPacket; @@ -504,34 +499,36 @@ WorldPacket const* WorldPackets::Movement::TransferAborted::Write() WorldPacket const* WorldPackets::Movement::NewWorld::Write() { - _worldPacket << MapID; + _worldPacket << int32(MapID); _worldPacket << Pos.PositionXYZOStream(); - _worldPacket << Reason; + _worldPacket << uint32(Reason); + _worldPacket << MovementOffset.PositionXYZStream(); return &_worldPacket; } WorldPacket const* WorldPackets::Movement::MoveTeleport::Write() { _worldPacket << MoverGUID; - _worldPacket << SequenceIndex; + _worldPacket << uint32(SequenceIndex); _worldPacket << Pos.PositionXYZStream(); - _worldPacket << Facing; + _worldPacket << float(Facing); + _worldPacket << uint8(PreloadWorld); - _worldPacket.WriteBit(TransportGUID.is_initialized()); _worldPacket.WriteBit(Vehicle.is_initialized()); + _worldPacket.WriteBit(TransportGUID.is_initialized()); _worldPacket.FlushBits(); - if (TransportGUID) - _worldPacket << *TransportGUID; - if (Vehicle) { - _worldPacket << Vehicle->VehicleSeatIndex; + _worldPacket << uint8(Vehicle->VehicleSeatIndex); _worldPacket.WriteBit(Vehicle->VehicleExitVoluntary); _worldPacket.WriteBit(Vehicle->VehicleExitTeleport); _worldPacket.FlushBits(); } + if (TransportGUID) + _worldPacket << *TransportGUID; + return &_worldPacket; } @@ -543,6 +540,7 @@ WorldPacket const* WorldPackets::Movement::MoveUpdateTeleport::Write() for (WorldPackets::Movement::MovementForce const& force : MovementForces) { _worldPacket << force.ID; + _worldPacket << force.Origin; _worldPacket << force.Direction; _worldPacket << force.TransportPosition; _worldPacket << force.TransportID; @@ -670,6 +668,29 @@ WorldPacket const* WorldPackets::Movement::MoveUpdateCollisionHeight::Write() return &_worldPacket; } +WorldPacket const* WorldPackets::Movement::MoveUpdateRemoveMovementForce::Write() +{ + _worldPacket << *movementInfo; + _worldPacket << TriggerGUID; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Movement::MoveUpdateApplyMovementForce::Write() +{ + _worldPacket << *movementInfo; + _worldPacket << Force.ID; + _worldPacket << Force.Origin; + _worldPacket << Force.Direction; + _worldPacket << Force.TransportPosition; + _worldPacket << Force.TransportID; + _worldPacket << Force.Magnitude; + _worldPacket.WriteBits(Force.Type, 2); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + void WorldPackets::Movement::MoveSetCollisionHeightAck::Read() { _worldPacket >> Data; @@ -710,6 +731,7 @@ WorldPacket const* WorldPackets::Movement::SummonRequest::Write() _worldPacket << SummonerGUID; _worldPacket << uint32(SummonerVirtualRealmAddress); _worldPacket << int32(AreaID); + _worldPacket << uint8(Reason); _worldPacket.WriteBit(SkipStartingArea); _worldPacket.FlushBits(); diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index 3bce8ed665c..1c21c034c86 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -54,8 +54,8 @@ namespace WorldPackets struct MonsterSplineFilterKey { - int16 Idx = 0; - int16 Speed = 0; + int16 Idx = 0; + uint16 Speed = 0; }; struct MonsterSplineFilter @@ -68,13 +68,21 @@ namespace WorldPackets int16 AddedToStart = 0; }; + struct MonsterSplineSpellEffectExtraData + { + ObjectGuid field_1; + uint32 field_2; + uint32 field_3; + uint32 field_4; + }; + struct MovementSpline { uint32 Flags = 0; // Spline flags uint8 Face = 0; // Movement direction (see MonsterMoveType enum) uint8 AnimTier = 0; uint32 TierTransStartTime = 0; - uint32 Elapsed = 0; + int32 Elapsed = 0; uint32 MoveTime = 0; float JumpGravity = 0.0f; uint32 SpecialTime = 0; @@ -82,9 +90,10 @@ namespace WorldPackets uint8 Mode = 0; // Spline mode - actually always 0 in this packet - Catmullrom mode appears only in SMSG_UPDATE_OBJECT. In this packet it is determined by flags uint8 VehicleExitVoluntary = 0; ObjectGuid TransportGUID; - uint8 VehicleSeat = 255; + int8 VehicleSeat = -1; std::vector<G3D::Vector3> PackedDeltas; Optional<MonsterSplineFilter> SplineFilter; + Optional<MonsterSplineSpellEffectExtraData> SpellEffectExtraData; float FaceDirection = 0.0f; ObjectGuid FaceGUID; G3D::Vector3 FaceSpot; @@ -95,6 +104,7 @@ namespace WorldPackets uint32 ID = 0; G3D::Vector3 Destination; bool CrzTeleport = false; + uint8 StopDistanceTolerance = 0; // Determines how far from spline destination the mover is allowed to stop in place 0, 0, 3.0, 2.76, numeric_limits<float>::max, 1.1, float(INT_MAX); default before this field existed was distance 3.0 (index 2) MovementSpline Move; }; @@ -194,25 +204,27 @@ namespace WorldPackets class TransferAborted final : public ServerPacket { public: - TransferAborted() : ServerPacket(SMSG_TRANSFER_ABORTED, 4 + 1 + 4) { } + TransferAborted() : ServerPacket(SMSG_TRANSFER_ABORTED, 4 + 1 + 4 + 1) { } WorldPacket const* Write() override; - uint32 TransfertAbort = 0; - uint8 Arg = 0; uint32 MapID = 0; + uint8 Arg = 0; + int32 MapDifficultyXConditionID; + uint32 TransfertAbort = 0; }; class NewWorld final : public ServerPacket { public: - NewWorld() : ServerPacket(SMSG_NEW_WORLD, 24) { } + NewWorld() : ServerPacket(SMSG_NEW_WORLD, 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4) { } WorldPacket const* Write() override; int32 MapID = 0; uint32 Reason = 0; Position Pos; + Position MovementOffset; // Adjusts all pending movement events by this offset }; class WorldPortResponse final : public ClientPacket @@ -243,11 +255,13 @@ namespace WorldPackets ObjectGuid MoverGUID; Optional<ObjectGuid> TransportGUID; float Facing = 0.0f; + uint8 PreloadWorld = 0; }; struct MovementForce { ObjectGuid ID; + G3D::Vector3 Origin; G3D::Vector3 Direction; G3D::Vector3 TransportPosition; uint32 TransportID = 0; @@ -275,6 +289,28 @@ namespace WorldPackets Optional<float> PitchRate; }; + class MoveUpdateApplyMovementForce final : public ServerPacket + { + public: + MoveUpdateApplyMovementForce() : ServerPacket(SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE) { } + + WorldPacket const* Write() override; + + MovementInfo* movementInfo = nullptr; + MovementForce Force; + }; + + class MoveUpdateRemoveMovementForce final : public ServerPacket + { + public: + MoveUpdateRemoveMovementForce() : ServerPacket(SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE) { } + + WorldPacket const* Write() override; + + MovementInfo* movementInfo = nullptr; + ObjectGuid TriggerGUID; + }; + class MoveTeleportAck final : public ClientPacket { public: @@ -452,6 +488,12 @@ namespace WorldPackets class SummonRequest final : public ServerPacket { public: + enum SummonReason : uint8 + { + SPELL = 0, + SCENARIO = 1 + }; + SummonRequest() : ServerPacket(SMSG_SUMMON_REQUEST, 16 + 4 + 4 + 1) { } WorldPacket const* Write() override; @@ -459,6 +501,7 @@ namespace WorldPackets ObjectGuid SummonerGUID; uint32 SummonerVirtualRealmAddress = 0; int32 AreaID = 0; + SummonReason Reason = SPELL; bool SkipStartingArea = false; }; diff --git a/src/server/game/Server/Packets/NPCPackets.cpp b/src/server/game/Server/Packets/NPCPackets.cpp index 9e8090b03b2..66039eff650 100644 --- a/src/server/game/Server/Packets/NPCPackets.cpp +++ b/src/server/game/Server/Packets/NPCPackets.cpp @@ -25,20 +25,18 @@ void WorldPackets::NPC::Hello::Read() WorldPacket const* WorldPackets::NPC::GossipMessage::Write() { _worldPacket << GossipGUID; - _worldPacket << GossipID; - _worldPacket << FriendshipFactionID; - _worldPacket << TextID; - - _worldPacket << int32(GossipOptions.size()); - _worldPacket << int32(GossipText.size()); + _worldPacket << int32(GossipID); + _worldPacket << int32(FriendshipFactionID); + _worldPacket << int32(TextID); + _worldPacket << uint32(GossipOptions.size()); + _worldPacket << uint32(GossipText.size()); for (ClientGossipOptions const& options : GossipOptions) { - _worldPacket << options.ClientOption; - _worldPacket << options.OptionNPC; - _worldPacket << options.OptionFlags; - _worldPacket << options.OptionCost; - + _worldPacket << int32(options.ClientOption); + _worldPacket << uint8(options.OptionNPC); + _worldPacket << int8(options.OptionFlags); + _worldPacket << int32(options.OptionCost); _worldPacket.WriteBits(options.Text.size(), 12); _worldPacket.WriteBits(options.Confirm.size(), 12); _worldPacket.FlushBits(); @@ -49,13 +47,14 @@ WorldPacket const* WorldPackets::NPC::GossipMessage::Write() for (ClientGossipText const& text : GossipText) { - _worldPacket << text.QuestID; - _worldPacket << text.QuestType; - _worldPacket << text.QuestLevel; - _worldPacket << text.QuestFlags[0]; - _worldPacket << text.QuestFlags[1]; + _worldPacket << int32(text.QuestID); + _worldPacket << int32(text.QuestType); + _worldPacket << int32(text.QuestLevel); + _worldPacket << int32(text.QuestFlags[0]); + _worldPacket << int32(text.QuestFlags[1]); _worldPacket.WriteBit(text.Repeatable); + _worldPacket.WriteBit(text.Ignored); _worldPacket.WriteBits(text.QuestTitle.size(), 9); _worldPacket.FlushBits(); @@ -65,27 +64,31 @@ WorldPacket const* WorldPackets::NPC::GossipMessage::Write() return &_worldPacket; } + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::NPC::VendorItem const &item) +{ + data << uint32(item.MuID); + data << int32(item.Type); + data << int32(item.Quantity); + data << uint64(item.Price); + data << int32(item.Durability); + data << int32(item.StackCount); + data << int32(item.ExtendedCostID); + data << int32(item.PlayerConditionFailed); + data << item.Item; + data.WriteBit(item.DoNotFilterOnVendor); + data.FlushBits(); + + return data; +} + WorldPacket const* WorldPackets::NPC::VendorInventory::Write() { _worldPacket << Vendor; - _worldPacket << Reason; - - _worldPacket << int32(Items.size()); + _worldPacket << uint8(Reason); + _worldPacket << uint32(Items.size()); for (VendorItem const& item : Items) - { - _worldPacket << item.MuID; - _worldPacket << item.Type; - _worldPacket << item.Item; - _worldPacket << item.Quantity; - _worldPacket << item.Price; - _worldPacket << item.Durability; - _worldPacket << item.StackCount; - _worldPacket << item.ExtendedCostID; - _worldPacket << item.PlayerConditionFailed; - - _worldPacket.WriteBit(item.DoNotFilterOnVendor); - _worldPacket.FlushBits(); - } + _worldPacket << item; return &_worldPacket; } @@ -142,23 +145,14 @@ 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); _worldPacket.WriteBits(Name.length(), 6); - _worldPacket << Pos.x; - _worldPacket << Pos.y; - _worldPacket << Icon; - _worldPacket << Importance; + _worldPacket << float(Pos.x); + _worldPacket << float(Pos.y); + _worldPacket << int32(Icon); + _worldPacket << int32(Importance); _worldPacket.WriteString(Name); return &_worldPacket; diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h index 98fa079afaa..034ef1fb909 100644 --- a/src/server/game/Server/Packets/NPCPackets.h +++ b/src/server/game/Server/Packets/NPCPackets.h @@ -61,6 +61,7 @@ namespace WorldPackets int32 QuestType = 0; int32 QuestLevel = 0; bool Repeatable = false; + bool Ignored = false; std::string QuestTitle; int32 QuestFlags[2] = { }; }; @@ -107,7 +108,7 @@ namespace WorldPackets int32 Type = 0; WorldPackets::Item::ItemInstance Item; int32 Quantity = -1; - int32 Price = 0; + uint64 Price = 0; int32 Durability = 0; int32 StackCount = 0; int32 ExtendedCostID = 0; @@ -172,21 +173,10 @@ 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: - GossipPOI() : ServerPacket(SMSG_GOSSIP_POI, 2 + 2 * 4 + 4 + 4 + 1) { } + GossipPOI() : ServerPacket(SMSG_GOSSIP_POI, 2 + 4 + 4 + 4 + 4) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index c4803ba7c6d..91b6ca4e18d 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -58,30 +58,25 @@ void WorldPackets::Party::PartyInviteClient::Read() WorldPacket const* WorldPackets::Party::PartyInvite::Write() { - // Order guessed _worldPacket.WriteBit(CanAccept); _worldPacket.WriteBit(MightCRZYou); + _worldPacket.WriteBit(IsXRealm); _worldPacket.WriteBit(MustBeBNetFriend); _worldPacket.WriteBit(AllowMultipleRoles); - _worldPacket.WriteBit(IsXRealm); - - _worldPacket.WriteBits(InviterName.size(), 6); - - _worldPacket << InviterGUID; - _worldPacket << InviterBNetAccountId; + _worldPacket.WriteBits(InviterName.length(), 6); _worldPacket << InviterVirtualRealmAddress; - _worldPacket << Unk1; - _worldPacket.WriteBit(IsLocal); _worldPacket.WriteBit(Unk2); - _worldPacket.WriteBits(InviterRealmNameActual.size(), 8); _worldPacket.WriteBits(InviterRealmNameNormalized.size(), 8); _worldPacket.WriteString(InviterRealmNameActual); _worldPacket.WriteString(InviterRealmNameNormalized); - _worldPacket << ProposedRoles; + _worldPacket << InviterGUID; + _worldPacket << InviterBNetAccountId; + _worldPacket << uint16(Unk1); + _worldPacket << uint32(ProposedRoles); _worldPacket << int32(LfgSlots.size()); _worldPacket << LfgCompletedMask; @@ -146,11 +141,97 @@ void WorldPackets::Party::RequestPartyMemberStats::Read() _worldPacket >> TargetGUID; } -WorldPacket const* WorldPackets::Party::PartyMemberStats::Write() +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberPhase const& phase) +{ + data << uint16(phase.Flags); + data << uint16(phase.Id); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberPhaseStates const& phases) +{ + data << uint32(phases.PhaseShiftFlags); + data << uint32(phases.List.size()); + data << phases.PersonalGUID; + + for (WorldPackets::Party::PartyMemberPhase const& phase : phases.List) + data << phase; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberAuraStates const& aura) +{ + data << int32(aura.SpellID); + data << uint8(aura.Flags); + data << uint32(aura.ActiveFlags); + data << int32(aura.Points.size()); + for (float points : aura.Points) + data << float(points); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberPetStats const& petStats) +{ + data << petStats.GUID; + data << int32(petStats.ModelId); + data << int32(petStats.CurrentHealth); + data << int32(petStats.MaxHealth); + data << uint32(petStats.Auras.size()); + for (WorldPackets::Party::PartyMemberAuraStates const& aura : petStats.Auras) + data << aura; + + data.WriteBits(petStats.Name.size(), 8); + data.FlushBits(); + data.WriteString(petStats.Name); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberStats const& memberStats) +{ + for (uint32 i = 0; i < 2; i++) + data << uint8(memberStats.PartyType[i]); + + data << uint16(memberStats.Status); + data << uint8(memberStats.PowerType); + data << uint16(memberStats.PowerDisplayID); + data << int32(memberStats.CurrentHealth); + data << int32(memberStats.MaxHealth); + data << uint16(memberStats.CurrentPower); + data << uint16(memberStats.MaxPower); + data << uint16(memberStats.Level); + data << uint16(memberStats.SpecID); + data << uint16(memberStats.ZoneID); + data << uint16(memberStats.WmoGroupID); + data << uint32(memberStats.WmoDoodadPlacementID); + data << int16(memberStats.PositionX); + data << int16(memberStats.PositionY); + data << int16(memberStats.PositionZ); + data << int32(memberStats.VehicleSeat); + data << int32(memberStats.Auras.size()); + data << memberStats.Phases; + + for (WorldPackets::Party::PartyMemberAuraStates const& aura : memberStats.Auras) + data << aura; + + data.WriteBit(memberStats.PetStats.is_initialized()); + data.FlushBits(); + + if (memberStats.PetStats.is_initialized()) + data << *memberStats.PetStats; + + return data; +} + +WorldPacket const* WorldPackets::Party::PartyMemberState::Write() { _worldPacket.WriteBit(ForEnemy); _worldPacket << MemberStats; + _worldPacket << MemberGuid; return &_worldPacket; } @@ -335,27 +416,72 @@ WorldPacket const* WorldPackets::Party::GroupNewLeader::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Party::PartyUpdate::Write() +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyPlayerInfo const& playerInfo) { - _worldPacket << PartyType; - _worldPacket << PartyIndex; - _worldPacket << PartyFlags; + data.WriteBits(playerInfo.Name.size(), 6); + data << playerInfo.GUID; + data << uint8(playerInfo.Status); + data << uint8(playerInfo.Subgroup); + data << uint8(playerInfo.Flags); + data << uint8(playerInfo.RolesAssigned); + data << uint8(playerInfo.Class); + data.WriteString(playerInfo.Name); - _worldPacket << MyIndex; - _worldPacket << PartyGUID; - _worldPacket << SequenceNum; - _worldPacket << LeaderGUID; + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyLFGInfo const& lfgInfos) +{ + data << uint8(lfgInfos.MyFlags); + data << uint32(lfgInfos.Slot); + data << uint32(lfgInfos.MyRandomSlot); + data << uint8(lfgInfos.MyPartialClear); + data << float(lfgInfos.MyGearDiff); + data << uint8(lfgInfos.MyStrangerCount); + data << uint8(lfgInfos.MyKickVoteCount); + data << uint8(lfgInfos.BootCount); + data.WriteBit(lfgInfos.Aborted); + data.WriteBit(lfgInfos.MyFirstReward); + data.FlushBits(); + + return data; +} - _worldPacket << PlayerList; +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyLootSettings const& lootSettings) +{ + data << uint8(lootSettings.Method); + data << lootSettings.LootMaster; + data << uint8(lootSettings.Threshold); + + return data; +} +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyDifficultySettings const& difficultySettings) +{ + data << uint32(difficultySettings.DungeonDifficultyID); + data << uint32(difficultySettings.RaidDifficultyID); + data << uint32(difficultySettings.LegacyRaidDifficultyID); + + return data; +} + +WorldPacket const* WorldPackets::Party::PartyUpdate::Write() +{ + _worldPacket << uint16(PartyFlags); + _worldPacket << uint8(PartyIndex); + _worldPacket << uint8(PartyType); + _worldPacket << int32(MyIndex); + _worldPacket << PartyGUID; + _worldPacket << uint32(SequenceNum); + _worldPacket << LeaderGUID; + _worldPacket << uint32(PlayerList.size()); _worldPacket.WriteBit(LfgInfos.is_initialized()); _worldPacket.WriteBit(LootSettings.is_initialized()); _worldPacket.WriteBit(DifficultySettings.is_initialized()); - _worldPacket.FlushBits(); - if (LfgInfos.is_initialized()) - _worldPacket << *LfgInfos; + for (WorldPackets::Party::PartyPlayerInfo const& playerInfos : PlayerList) + _worldPacket << playerInfos; if (LootSettings.is_initialized()) _worldPacket << *LootSettings; @@ -363,6 +489,9 @@ WorldPacket const* WorldPackets::Party::PartyUpdate::Write() if (DifficultySettings.is_initialized()) _worldPacket << *DifficultySettings; + if (LfgInfos.is_initialized()) + _worldPacket << *LfgInfos; + return &_worldPacket; } @@ -409,11 +538,11 @@ WorldPacket const* WorldPackets::Party::RaidMarkersChanged::Write() return &_worldPacket; } -void WorldPackets::Party::PartyMemberStats::Initialize(Player const* player) +void WorldPackets::Party::PartyMemberState::Initialize(Player const* player) { ForEnemy = false; - MemberStats.GUID = player->GetGUID(); + MemberGuid = player->GetGUID(); // Status MemberStats.Status = MEMBER_STATUS_ONLINE; @@ -438,6 +567,9 @@ void WorldPackets::Party::PartyMemberStats::Initialize(Player const* player) if (player->isDND()) MemberStats.Status |= MEMBER_STATUS_DND; + if (player->GetVehicle()) + MemberStats.Status |= MEMBER_STATUS_VEHICLE; + // Level MemberStats.Level = player->getLevel(); @@ -447,6 +579,7 @@ void WorldPackets::Party::PartyMemberStats::Initialize(Player const* player) // Power MemberStats.PowerType = player->getPowerType(); + MemberStats.PowerDisplayID = 0; MemberStats.CurrentPower = player->GetPower(player->getPowerType()); MemberStats.MaxPower = player->GetMaxPower(player->getPowerType()); @@ -456,14 +589,11 @@ void WorldPackets::Party::PartyMemberStats::Initialize(Player const* player) MemberStats.PositionY = int16(player->GetPositionY()); MemberStats.PositionZ = int16(player->GetPositionZ()); - // Unk - MemberStats.Unk322 = 0; // Always 0 - MemberStats.Unk704[0] = 1; // Always 1 - MemberStats.Unk704[1] = 0; // Always 0 - MemberStats.Unk200000 = 0; // Always 0 - - MemberStats.Unk2000000 = 0; - MemberStats.Unk4000000 = 0; + MemberStats.SpecID = player->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID); + MemberStats.PartyType[0] = player->GetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_PARTY_TYPE) & 0xF; + MemberStats.PartyType[1] = player->GetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_PARTY_TYPE) >> 4; + MemberStats.WmoGroupID = 0; + MemberStats.WmoDoodadPlacementID = 0; // Vehicle if (player->GetVehicle() && player->GetVehicle()->GetVehicleInfo()) @@ -474,24 +604,25 @@ void WorldPackets::Party::PartyMemberStats::Initialize(Player const* player) { if (AuraApplication const* aurApp = player->GetVisibleAura(i)) { - WorldPackets::Party::GroupAura aura; + WorldPackets::Party::PartyMemberAuraStates aura; - aura.SpellId = aurApp->GetBase()->GetId(); - aura.EffectMask = aurApp->GetEffectMask(); - aura.Scalings = aurApp->GetFlags(); // ?? + aura.SpellID = aurApp->GetBase()->GetId(); + aura.ActiveFlags = aurApp->GetEffectMask(); + aura.Flags = aurApp->GetFlags(); if (aurApp->GetFlags() & AFLAG_SCALABLE) { - for (uint32 e = 0; e < MAX_SPELL_EFFECTS; ++e) + for (AuraEffect const* aurEff : aurApp->GetBase()->GetAuraEffects()) { - float scale = 0.0f; - if (AuraEffect const* eff = aurApp->GetBase()->GetEffect(e)) - scale = float(eff->GetAmount()); - aura.EffectScales.push_back(scale); + if (!aurEff) + continue; + + if (aurApp->HasEffect(aurEff->GetEffIndex())) + aura.Points.push_back(float(aurEff->GetAmount())); } } - MemberStats.AuraList.push_back(aura); + MemberStats.Auras.push_back(aura); } } @@ -501,7 +632,7 @@ void WorldPackets::Party::PartyMemberStats::Initialize(Player const* player) MemberStats.Phases.PersonalGUID = ObjectGuid::Empty; for (uint32 phaseId : phases) { - WorldPackets::Party::GroupPhase phase; + WorldPackets::Party::PartyMemberPhase phase; phase.Id = phaseId; phase.Flags = 1; MemberStats.Phases.List.push_back(phase); @@ -525,24 +656,25 @@ void WorldPackets::Party::PartyMemberStats::Initialize(Player const* player) { if (AuraApplication const* aurApp = pet->GetVisibleAura(i)) { - WorldPackets::Party::GroupAura aura; + WorldPackets::Party::PartyMemberAuraStates aura; - aura.SpellId = aurApp->GetBase()->GetId(); - aura.EffectMask = aurApp->GetEffectMask(); - aura.Scalings = aurApp->GetFlags(); // ?? + aura.SpellID = aurApp->GetBase()->GetId(); + aura.ActiveFlags = aurApp->GetEffectMask(); + aura.Flags = aurApp->GetFlags(); if (aurApp->GetFlags() & AFLAG_SCALABLE) { - for (uint32 e = 0; e < MAX_SPELL_EFFECTS; ++e) + for (AuraEffect const* aurEff : aurApp->GetBase()->GetAuraEffects()) { - float scale = 0.0f; - if (AuraEffect const* eff = aurApp->GetBase()->GetEffect(e)) - scale = float(eff->GetAmount()); - aura.EffectScales.push_back(scale); + if (!aurEff) + continue; + + if (aurApp->HasEffect(aurEff->GetEffIndex())) + aura.Points.push_back(float(aurEff->GetAmount())); } } - MemberStats.PetStats->AuraList.push_back(aura); + MemberStats.PetStats->Auras.push_back(aura); } } } @@ -556,175 +688,3 @@ WorldPacket const* WorldPackets::Party::PartyKillLog::Write() return &_worldPacket; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPhase const& phase) -{ - data << phase.Flags; - data << phase.Id; - - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPhases const& phases) -{ - data << phases.PhaseShiftFlags; - data << int32(phases.List.size()); - data << phases.PersonalGUID; - - for (WorldPackets::Party::GroupPhase const& phase : phases.List) - data << phase; - - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupAura const& aura) -{ - data << aura.SpellId; - data << aura.Scalings; - data << aura.EffectMask; - - data << int32(aura.EffectScales.size()); - for (float scale : aura.EffectScales) - data << scale; - - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, std::vector<WorldPackets::Party::GroupAura> const& auraList) -{ - data << int32(auraList.size()); - for (WorldPackets::Party::GroupAura const& aura : auraList) - data << aura; - - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPetStats const& petStats) -{ - data << petStats.GUID; - - data << petStats.ModelId; - - data << petStats.CurrentHealth; - data << petStats.MaxHealth; - - data << petStats.AuraList; - - data.WriteBits(petStats.Name.size(), 8); - data.FlushBits(); - data.WriteString(petStats.Name); - - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupMemberStats const& memberStats) -{ - data << memberStats.GUID; - - for (uint8 i = 0; i < 2; i++) - data << memberStats.Unk704[i]; - - data << memberStats.Status; - - data << memberStats.PowerType; - - data << memberStats.Unk322; - - data << memberStats.CurrentHealth; - data << memberStats.MaxHealth; - - data << memberStats.CurrentPower; - data << memberStats.MaxPower; - - data << memberStats.Level; - - data << memberStats.Unk200000; - - data << memberStats.ZoneID; - - data << memberStats.Unk2000000; - data << memberStats.Unk4000000; - - data << memberStats.PositionX; - data << memberStats.PositionY; - data << memberStats.PositionZ; - - data << memberStats.VehicleSeat; - - data << int32(memberStats.AuraList.size()); - - data << memberStats.Phases; - - for (WorldPackets::Party::GroupAura const& aura : memberStats.AuraList) - data << aura; - - data.WriteBit(memberStats.PetStats.is_initialized()); - data.FlushBits(); - - if (memberStats.PetStats.is_initialized()) - data << *memberStats.PetStats; - - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, std::vector<WorldPackets::Party::GroupPlayerInfos> const& playerList) -{ - data << int32(playerList.size()); - - for (WorldPackets::Party::GroupPlayerInfos const& playerInfos : playerList) - data << playerInfos; - - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPlayerInfos const& playerInfos) -{ - data.WriteBits(playerInfos.Name.size(), 6); - data.FlushBits(); - - data << playerInfos.GUID; - data << playerInfos.Status; - data << playerInfos.Subgroup; - data << playerInfos.Flags; - data << playerInfos.RolesAssigned; - data << playerInfos.Class; - - data.WriteString(playerInfos.Name); - - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupLfgInfos const& lfgInfos) -{ - data << lfgInfos.MyFlags; - data << lfgInfos.Slot; - data << lfgInfos.MyRandomSlot; - data << lfgInfos.MyPartialClear; - data << lfgInfos.MyGearDiff; - data << lfgInfos.MyStrangerCount; - data << lfgInfos.MyKickVoteCount; - data << lfgInfos.BootCount; - - data.WriteBit(lfgInfos.Aborted); - data.WriteBit(lfgInfos.MyFirstReward); - data.FlushBits(); - - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupLootSettings const& lootSettings) -{ - data << lootSettings.Method; - data << lootSettings.LootMaster; - data << lootSettings.Threshold; - - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupDifficultySettings const& difficultySettings) -{ - data << difficultySettings.DungeonDifficultyID; - data << difficultySettings.RaidDifficultyID; - data << difficultySettings.LegacyRaidDifficultyID; - - return data; -} diff --git a/src/server/game/Server/Packets/PartyPackets.h b/src/server/game/Server/Packets/PartyPackets.h index 388be459eb5..d1d2773d66e 100644 --- a/src/server/game/Server/Packets/PartyPackets.h +++ b/src/server/game/Server/Packets/PartyPackets.h @@ -61,13 +61,14 @@ namespace WorldPackets PartyInvite() : ServerPacket(SMSG_PARTY_INVITE, 55) { } WorldPacket const* Write() override; + void Initialize(Player* const inviter, int32 proposedRoles, bool canAccept); bool MightCRZYou = false; bool MustBeBNetFriend = false; bool AllowMultipleRoles = false; bool Unk2 = false; - int16 Unk1 = 0; + uint16 Unk1 = 0; bool CanAccept = false; @@ -134,28 +135,28 @@ namespace WorldPackets ObjectGuid TargetGUID; }; - struct GroupPhase + struct PartyMemberPhase { uint16 Flags = 0u; uint16 Id = 0u; }; - struct GroupPhases + struct PartyMemberPhaseStates { - int32 PhaseShiftFlags = 0; + uint32 PhaseShiftFlags = 0; ObjectGuid PersonalGUID; - std::vector<GroupPhase> List; + std::vector<PartyMemberPhase> List; }; - struct GroupAura + struct PartyMemberAuraStates { - uint32 SpellId = 0u; - uint8 Scalings = 0; - uint32 EffectMask = 0u; - std::vector<float> EffectScales; + int32 SpellID = 0; + uint8 Flags = 0; + uint32 ActiveFlags = 0u; + std::vector<float> Points; }; - struct GroupPetStats + struct PartyMemberPetStats { ObjectGuid GUID; std::string Name; @@ -164,50 +165,50 @@ namespace WorldPackets int32 CurrentHealth = 0; int32 MaxHealth = 0; - std::vector<GroupAura> AuraList; + std::vector<PartyMemberAuraStates> Auras; }; - struct GroupMemberStats + struct PartyMemberStats { - ObjectGuid GUID; - int16 Level = 0; - int16 Status = 0; + uint16 Level = 0; + uint16 Status = 0; int32 CurrentHealth = 0; - int32 MaxHealth; + int32 MaxHealth = 0; uint8 PowerType = 0u; - int16 CurrentPower = 0; - int16 MaxPower = 0; + uint16 CurrentPower = 0; + uint16 MaxPower = 0; - int16 ZoneID = 0; + uint16 ZoneID = 0; int16 PositionX = 0; int16 PositionY = 0; int16 PositionZ = 0; int32 VehicleSeat = 0; - GroupPhases Phases; - std::vector<GroupAura> AuraList; - Optional<GroupPetStats> PetStats; + PartyMemberPhaseStates Phases; + std::vector<PartyMemberAuraStates> Auras; + Optional<PartyMemberPetStats> PetStats; - int16 Unk322 = 0; - int16 Unk200000 = 0; - int16 Unk2000000 = 0; - int32 Unk4000000 = 0; - int8 Unk704[2]; + uint16 PowerDisplayID = 0; + uint16 SpecID = 0; + uint16 WmoGroupID = 0; + uint32 WmoDoodadPlacementID = 0; + int8 PartyType[2]; }; - class PartyMemberStats final : public ServerPacket + class PartyMemberState final : public ServerPacket { public: - PartyMemberStats() : ServerPacket(SMSG_PARTY_MEMBER_STATE, 80) { } + PartyMemberState() : ServerPacket(SMSG_PARTY_MEMBER_STATE, 80) { } WorldPacket const* Write() override; void Initialize(Player const* player); - GroupMemberStats MemberStats; bool ForEnemy = false; + ObjectGuid MemberGuid; + PartyMemberStats MemberStats; }; class SetPartyLeader final : public ClientPacket @@ -481,7 +482,7 @@ namespace WorldPackets std::string Name; }; - struct GroupPlayerInfos + struct PartyPlayerInfo { ObjectGuid GUID; std::string Name; @@ -493,32 +494,28 @@ namespace WorldPackets uint8 RolesAssigned = 0u; }; - struct GroupLfgInfos + struct PartyLFGInfo { - int32 Slot = 0u; - int8 BootCount = 0; - + uint8 MyFlags = 0; + uint32 Slot = 0; + uint8 BootCount = 0; + uint32 MyRandomSlot = 0; bool Aborted = false; - - int32 MyRandomSlot = 0; - uint8 MyFlags = 0u; - uint8 MyPartialClear = 0u; - float MyGearDiff = 0.f; - - int8 MyStrangerCount = 0; - int8 MyKickVoteCount = 0; - + uint8 MyPartialClear = 0; + float MyGearDiff = 0.0f; + uint8 MyStrangerCount = 0; + uint8 MyKickVoteCount = 0; bool MyFirstReward = false; }; - struct GroupLootSettings + struct PartyLootSettings { uint8 Method = 0u; ObjectGuid LootMaster; uint8 Threshold = 0u; }; - struct GroupDifficultySettings + struct PartyDifficultySettings { uint32 DungeonDifficultyID = 0u; uint32 RaidDifficultyID = 0u; @@ -532,9 +529,9 @@ namespace WorldPackets WorldPacket const* Write() override; - int8 PartyFlags = 0; - int8 PartyIndex = 0; - int8 PartyType = 0; + uint16 PartyFlags = 0; + uint8 PartyIndex = 0; + uint8 PartyType = 0; ObjectGuid PartyGUID; ObjectGuid LeaderGUID; @@ -542,11 +539,11 @@ namespace WorldPackets int32 MyIndex = 0; int32 SequenceNum = 0; - std::vector<GroupPlayerInfos> PlayerList; + std::vector<PartyPlayerInfo> PlayerList; - Optional<GroupLfgInfos> LfgInfos; - Optional<GroupLootSettings> LootSettings; - Optional<GroupDifficultySettings> DifficultySettings; + Optional<PartyLFGInfo> LfgInfos; + Optional<PartyLootSettings> LootSettings; + Optional<PartyDifficultySettings> DifficultySettings; }; class SetEveryoneIsAssistant final : public ClientPacket @@ -620,20 +617,4 @@ namespace WorldPackets } } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPhase const& phase); -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPhases const& phases); - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupAura const& aura); -ByteBuffer& operator<<(ByteBuffer& data, std::vector<WorldPackets::Party::GroupAura> const& auraList); - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPetStats const& petStats); -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupMemberStats const& memberStats); - -ByteBuffer& operator<<(ByteBuffer& data, std::vector<WorldPackets::Party::GroupPlayerInfos> const& playerList); -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPlayerInfos const& playerInfos); - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupLfgInfos const& lfgInfos); -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupLootSettings const& lootSettings); -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupDifficultySettings const& difficultySettings); - #endif // PartyPackets_h__ diff --git a/src/server/game/Server/Packets/PetPackets.cpp b/src/server/game/Server/Packets/PetPackets.cpp index 8bbf0b051e4..8bedd8f3e4f 100644 --- a/src/server/game/Server/Packets/PetPackets.cpp +++ b/src/server/game/Server/Packets/PetPackets.cpp @@ -20,29 +20,25 @@ WorldPacket const* WorldPackets::Pet::PetSpells::Write() { _worldPacket << PetGUID; - _worldPacket << int16(_CreatureFamily); - _worldPacket << int16(Specialization); - _worldPacket << int32(TimeLimit); - - uint32 petModeAndOrders = ReactState + (CommandState << 8) + (Flag << 16); - _worldPacket << uint32(petModeAndOrders); - - for (uint32 actionButton : ActionButtons) - _worldPacket << int32(actionButton); - - _worldPacket << int32(Actions.size()); - _worldPacket << int32(Cooldowns.size()); - _worldPacket << int32(SpellHistory.size()); + _worldPacket << uint16(_CreatureFamily); + _worldPacket << uint16(Specialization); + _worldPacket << uint32(TimeLimit); + _worldPacket << uint16(CommandState | (Flag << 16)); + _worldPacket << uint8(ReactState); + _worldPacket.append(ActionButtons.data(), ActionButtons.size()); + _worldPacket << uint32(Actions.size()); + _worldPacket << uint32(Cooldowns.size()); + _worldPacket << uint32(SpellHistory.size()); for (uint32 action : Actions) - _worldPacket << action; + _worldPacket << uint32(action); for (PetSpellCooldown const& cooldown : Cooldowns) { _worldPacket << int32(cooldown.SpellID); _worldPacket << int32(cooldown.Duration); _worldPacket << int32(cooldown.CategoryDuration); - _worldPacket << int16(cooldown.Category); + _worldPacket << uint16(cooldown.Category); } for (PetSpellHistory const& history : SpellHistory) @@ -186,12 +182,6 @@ void WorldPackets::Pet::PetCancelAura::Read() _worldPacket >> SpellID; } -void WorldPackets::Pet::LearnPetSpecializationGroup::Read() -{ - _worldPacket >> PetGUID; - _worldPacket >> SpecGroupIndex; -} - WorldPacket const* WorldPackets::Pet::SetPetSpecialization::Write() { _worldPacket << uint16(SpecID); diff --git a/src/server/game/Server/Packets/PetPackets.h b/src/server/game/Server/Packets/PetPackets.h index 3d3c3e76f72..a847d44cd17 100644 --- a/src/server/game/Server/Packets/PetPackets.h +++ b/src/server/game/Server/Packets/PetPackets.h @@ -83,7 +83,7 @@ namespace WorldPackets int32 SpellID = 0; int32 Duration = 0; int32 CategoryDuration = 0; - int Category = 0; + uint16 Category = 0; }; struct PetSpellHistory @@ -106,7 +106,7 @@ namespace WorldPackets uint32 TimeLimit = 0; uint8 ReactState = 0; uint8 CommandState = 0; - uint16 Flag = 0; + uint8 Flag = 0; std::array<int, 10> ActionButtons; @@ -225,17 +225,6 @@ namespace WorldPackets int32 SpellID = 0; }; - class LearnPetSpecializationGroup final : public ClientPacket - { - public: - LearnPetSpecializationGroup(WorldPacket&& packet) : ClientPacket(CMSG_LEARN_PET_SPECIALIZATION_GROUP, std::move(packet)) { } - - void Read() override; - - ObjectGuid PetGUID; - uint32 SpecGroupIndex = 0; - }; - class SetPetSpecialization final : public ServerPacket { public: diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index aeaf43e6e8a..aa7a970d125 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -18,6 +18,7 @@ #include "QueryPackets.h" #include "BattlenetAccountMgr.h" #include "Player.h" +#include "PacketUtilities.h" #include "World.h" #include "ObjectMgr.h" @@ -58,24 +59,23 @@ WorldPacket const* WorldPackets::Query::QueryCreatureResponse::Write() for (uint8 i = 0; i < 2; ++i) _worldPacket << Stats.Flags[i]; - _worldPacket << Stats.CreatureType; - _worldPacket << Stats.CreatureFamily; - _worldPacket << Stats.Classification; + _worldPacket << int32(Stats.CreatureType); + _worldPacket << int32(Stats.CreatureFamily); + _worldPacket << int32(Stats.Classification); for (uint32 i = 0; i < MAX_KILL_CREDIT; ++i) - _worldPacket << Stats.ProxyCreatureID[i]; + _worldPacket << int32(Stats.ProxyCreatureID[i]); for (uint32 i = 0; i < MAX_CREATURE_MODELS; ++i) - _worldPacket << Stats.CreatureDisplayID[i]; - - _worldPacket << Stats.HpMulti; - _worldPacket << Stats.EnergyMulti; - - _worldPacket << int32(Stats.QuestItems.size()); - _worldPacket << Stats.CreatureMovementInfoID; - _worldPacket << Stats.RequiredExpansion; + _worldPacket << int32(Stats.CreatureDisplayID[i]); + _worldPacket << float(Stats.HpMulti); + _worldPacket << float(Stats.EnergyMulti); + _worldPacket << uint32(Stats.QuestItems.size()); + _worldPacket << int32(Stats.CreatureMovementInfoID); + _worldPacket << int32(Stats.RequiredExpansion); _worldPacket << int32(0); // FlagQuest + _worldPacket << int32(0); if (!Stats.Title.empty()) _worldPacket << Stats.Title; @@ -196,6 +196,21 @@ void WorldPackets::Query::QueryPageText::Read() _worldPacket >> ItemGUID; } + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Query::QueryPageTextResponse::PageTextInfo const& page) +{ + data << uint32(page.ID); + data << uint32(page.NextPageID); + data << int32(page.PlayerConditionID); + data << uint8(page.Flags); + data.WriteBits(page.Text.length(), 12); + data.FlushBits(); + + data.WriteString(page.Text); + + return data; +} + WorldPacket const* WorldPackets::Query::QueryPageTextResponse::Write() { _worldPacket << PageTextID; @@ -205,12 +220,9 @@ WorldPacket const* WorldPackets::Query::QueryPageTextResponse::Write() if (Allow) { - _worldPacket << Info.ID; - _worldPacket << Info.NextPageID; - _worldPacket.WriteBits(Info.Text.length(), 12); - _worldPacket.FlushBits(); - - _worldPacket.WriteString(Info.Text); + _worldPacket << uint32(Pages.size()); + for (PageTextInfo const& pageText : Pages) + _worldPacket << pageText; } return &_worldPacket; @@ -293,43 +305,47 @@ WorldPacket const* WorldPackets::Query::QueryGameObjectResponse::Write() _worldPacket.WriteBit(Allow); _worldPacket.FlushBits(); + ByteBuffer statsData; if (Allow) { - uint32 dataSize = Stats.GetDataSize(); - - _worldPacket << uint32(dataSize); - if (dataSize) - { - _worldPacket << Stats.Type; - _worldPacket << Stats.DisplayID; - for (int8 i = 0; i < 4; i++) - _worldPacket << Stats.Name[i]; - - _worldPacket << Stats.IconName; - _worldPacket << Stats.CastBarCaption; - _worldPacket << Stats.UnkString; + statsData << int32(Stats.Type); + statsData << int32(Stats.DisplayID); + for (int8 i = 0; i < 4; ++i) + statsData << Stats.Name[i]; - for (uint32 i = 0; i < MAX_GAMEOBJECT_DATA; i++) - _worldPacket << Stats.Data[i]; + statsData << Stats.IconName; + statsData << Stats.CastBarCaption; + statsData << Stats.UnkString; - _worldPacket << Stats.Size; + for (uint32 i = 0; i < MAX_GAMEOBJECT_DATA; ++i) + statsData << int32(Stats.Data[i]); - _worldPacket << uint8(Stats.QuestItems.size()); - for (int32 questItem : Stats.QuestItems) - _worldPacket << questItem; + statsData << float(Stats.Size); + statsData << uint8(Stats.QuestItems.size()); + for (int32 questItem : Stats.QuestItems) + statsData << int32(questItem); - _worldPacket << Stats.Expansion; - } + statsData << int32(Stats.Expansion); } + _worldPacket << uint32(statsData.size()); + if (!statsData.empty()) + _worldPacket.append(statsData); + return &_worldPacket; } +void WorldPackets::Query::QueryCorpseLocationFromClient::Read() +{ + _worldPacket >> Player; +} + WorldPacket const* WorldPackets::Query::CorpseLocation::Write() { _worldPacket.WriteBit(Valid); _worldPacket.FlushBits(); + _worldPacket << Player; _worldPacket << ActualMapID; _worldPacket << Position.x; _worldPacket << Position.y; @@ -342,14 +358,14 @@ WorldPacket const* WorldPackets::Query::CorpseLocation::Write() void WorldPackets::Query::QueryCorpseTransport::Read() { + _worldPacket >> Player; _worldPacket >> Transport; } WorldPacket const* WorldPackets::Query::CorpseTransportQuery::Write() { - _worldPacket << Position.x; - _worldPacket << Position.y; - _worldPacket << Position.z; + _worldPacket << Player; + _worldPacket << Position; _worldPacket << Facing; return &_worldPacket; @@ -357,8 +373,7 @@ WorldPacket const* WorldPackets::Query::CorpseTransportQuery::Write() WorldPacket const* WorldPackets::Query::QueryTimeResponse::Write() { - _worldPacket << uint32(CurrentTime); - _worldPacket << int32(TimeOutRequest); + _worldPacket << int32(CurrentTime); return &_worldPacket; } @@ -483,8 +498,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Query::ItemTextCache cons WorldPacket const* WorldPackets::Query::QueryItemTextResponse::Write() { _worldPacket.WriteBit(Valid); - _worldPacket << Id; _worldPacket << Item; + _worldPacket << Id; return &_worldPacket; } diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index 10a8924477f..2d6e488e4be 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -140,12 +140,14 @@ namespace WorldPackets { uint32 ID = 0; uint32 NextPageID = 0; + int32 PlayerConditionID = 0; + uint8 Flags = 0; std::string Text; }; - bool Allow = false; - PageTextInfo Info; uint32 PageTextID = 0; + bool Allow = false; + std::vector<PageTextInfo> Pages; }; class QueryNPCText final : public ClientPacket @@ -236,12 +238,6 @@ namespace WorldPackets float Size = 0.0f; std::vector<int32> QuestItems; uint32 Expansion = 0; - - size_t GetDataSize() const - { - // [1..3] always empty '\0' '\0' '\0' '\0' QuestItems counter - return sizeof(Type) + sizeof(DisplayID) + (Name->size() + (4 * 1)) + (IconName.size() + 1) + (CastBarCaption.size() + 1) + (UnkString.size() + 1) + sizeof(Data) + sizeof(Size) + sizeof(uint8) + (QuestItems.size() * sizeof(int32)) + sizeof(Expansion); - } }; class QueryGameObjectResponse final : public ServerPacket @@ -261,7 +257,9 @@ namespace WorldPackets public: QueryCorpseLocationFromClient(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT, std::move(packet)) { } - void Read() override { } + void Read() override; + + ObjectGuid Player; }; class CorpseLocation final : public ServerPacket @@ -271,6 +269,7 @@ namespace WorldPackets WorldPacket const* Write() override; + ObjectGuid Player; ObjectGuid Transport; G3D::Vector3 Position; int32 ActualMapID = 0; @@ -285,6 +284,7 @@ namespace WorldPackets void Read() override; + ObjectGuid Player; ObjectGuid Transport; }; @@ -295,6 +295,7 @@ namespace WorldPackets WorldPacket const* Write() override; + ObjectGuid Player; G3D::Vector3 Position; float Facing = 0.0f; }; @@ -315,7 +316,6 @@ namespace WorldPackets WorldPacket const* Write() override; time_t CurrentTime = time_t(0); - int32 TimeOutRequest = 0; }; class QuestPOIQuery final : public ClientPacket diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp index 803da693c95..4f2139c3454 100644 --- a/src/server/game/Server/Packets/QuestPackets.cpp +++ b/src/server/game/Server/Packets/QuestPackets.cpp @@ -77,10 +77,13 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write() _worldPacket << int32(Info.RewardMoneyDifficulty); _worldPacket << float(Info.RewardMoneyMultiplier); _worldPacket << int32(Info.RewardBonusMoney); - _worldPacket << int32(Info.RewardDisplaySpell); + _worldPacket.append(Info.RewardDisplaySpell, QUEST_REWARD_DISPLAY_SPELL_COUNT); _worldPacket << int32(Info.RewardSpell); _worldPacket << int32(Info.RewardHonor); _worldPacket << float(Info.RewardKillHonor); + _worldPacket << int32(Info.RewardArtifactXPDifficulty); + _worldPacket << float(Info.RewardArtifactXPMultiplier); + _worldPacket << int32(Info.RewardArtifactCategoryID); _worldPacket << int32(Info.StartItem); _worldPacket << uint32(Info.Flags); _worldPacket << uint32(Info.FlagsEx); @@ -106,7 +109,6 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write() _worldPacket << int32(Info.POIPriority); _worldPacket << int32(Info.RewardTitle); - _worldPacket << int32(Info.RewardTalents); _worldPacket << int32(Info.RewardArenaPoints); _worldPacket << int32(Info.RewardSkillLineID); _worldPacket << int32(Info.RewardNumSkillUps); @@ -117,8 +119,9 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write() for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i) { _worldPacket << int32(Info.RewardFactionID[i]); - _worldPacket << int32(Info.RewardFactionValue[i]); _worldPacket << int32(Info.RewardFactionOverride[i]); + _worldPacket << int32(Info.RewardFactionValue[i]); + _worldPacket << int32(Info.RewardFactionCapIn[i]); } _worldPacket << int32(Info.RewardFactionFlags); @@ -137,6 +140,18 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write() _worldPacket << int32(Info.Objectives.size()); _worldPacket << int32(Info.AllowableRaces); + _worldPacket << int32(Info.QuestRewardID); + + _worldPacket.WriteBits(Info.LogTitle.size(), 9); + _worldPacket.WriteBits(Info.LogDescription.size(), 12); + _worldPacket.WriteBits(Info.QuestDescription.size(), 12); + _worldPacket.WriteBits(Info.AreaDescription.size(), 9); + _worldPacket.WriteBits(Info.PortraitGiverText.size(), 10); + _worldPacket.WriteBits(Info.PortraitGiverName.size(), 8); + _worldPacket.WriteBits(Info.PortraitTurnInText.size(), 10); + _worldPacket.WriteBits(Info.PortraitTurnInName.size(), 8); + _worldPacket.WriteBits(Info.QuestCompletionLog.size(), 11); + _worldPacket.FlushBits(); for (QuestObjective const& questObjective : Info.Objectives) { @@ -158,17 +173,6 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write() _worldPacket.WriteString(questObjective.Description); } - _worldPacket.WriteBits(Info.LogTitle.size(), 9); - _worldPacket.WriteBits(Info.LogDescription.size(), 12); - _worldPacket.WriteBits(Info.QuestDescription.size(), 12); - _worldPacket.WriteBits(Info.AreaDescription.size(), 9); - _worldPacket.WriteBits(Info.PortraitGiverText.size(), 10); - _worldPacket.WriteBits(Info.PortraitGiverName.size(), 8); - _worldPacket.WriteBits(Info.PortraitTurnInText.size(), 10); - _worldPacket.WriteBits(Info.PortraitTurnInName.size(), 8); - _worldPacket.WriteBits(Info.QuestCompletionLog.size(), 11); - _worldPacket.FlushBits(); - _worldPacket.WriteString(Info.LogTitle); _worldPacket.WriteString(Info.LogDescription); _worldPacket.WriteString(Info.QuestDescription); @@ -205,48 +209,54 @@ WorldPacket const* WorldPackets::Quest::QuestUpdateAddPvPCredit::Write() ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestRewards const& questRewards) { - data << questRewards.ChoiceItemCount; + data << int32(questRewards.ChoiceItemCount); for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) { - data << questRewards.ChoiceItems[i].ItemID; - data << questRewards.ChoiceItems[i].Quantity; + data << int32(questRewards.ChoiceItems[i].ItemID); + data << int32(questRewards.ChoiceItems[i].Quantity); } - data << questRewards.ItemCount; + data << int32(questRewards.ItemCount); for (uint32 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i) { - data << questRewards.ItemID[i]; - data << questRewards.ItemQty[i]; + data << int32(questRewards.ItemID[i]); + data << int32(questRewards.ItemQty[i]); } - data << questRewards.Money; - data << questRewards.XP; - data << questRewards.Title; - data << questRewards.Talents; - data << questRewards.FactionFlags; + data << int32(questRewards.Money); + data << int32(questRewards.XP); + data << int32(questRewards.ArtifactXP); + data << int32(questRewards.ArtifactCategoryID); + data << int32(questRewards.Honor); + data << int32(questRewards.Title); + data << int32(questRewards.FactionFlags); for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i) { - data << questRewards.FactionID[i]; - data << questRewards.FactionValue[i]; - data << questRewards.FactionOverride[i]; + data << int32(questRewards.FactionID[i]); + data << int32(questRewards.FactionOverride[i]); + data << int32(questRewards.FactionValue[i]); + data << int32(questRewards.FactionCapIn[i]); } - data << questRewards.SpellCompletionDisplayID; - data << questRewards.SpellCompletionID; + for (uint32 i = 0; i < QUEST_REWARD_DISPLAY_SPELL_COUNT; ++i) + data << int32(questRewards.SpellCompletionDisplayID[i]); + + data << int32(questRewards.SpellCompletionID); for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i) { - data << questRewards.CurrencyID[i]; - data << questRewards.CurrencyQty[i]; + data << int32(questRewards.CurrencyID[i]); + data << int32(questRewards.CurrencyQty[i]); } - data << questRewards.SkillLineID; - data << questRewards.NumSkillUps; + data << int32(questRewards.SkillLineID); + data << int32(questRewards.NumSkillUps); + data << int32(questRewards.RewardID); - data.WriteBit(false); // Unk + data.WriteBit(questRewards.IsBoostSpell); data.FlushBits(); return data; @@ -260,8 +270,6 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestGiverOfferRew data << int32(offer.QuestFlags[0]); // Flags data << int32(offer.QuestFlags[1]); // FlagsEx data << int32(offer.SuggestedPartyMembers); - data << offer.Rewards; // WorldPackets::Quest::QuestRewards - data << int32(offer.Emotes.size()); for (WorldPackets::Quest::QuestDescEmote const& emote : offer.Emotes) { @@ -272,6 +280,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestGiverOfferRew data.WriteBit(offer.AutoLaunched); data.FlushBits(); + data << offer.Rewards; // WorldPackets::Quest::QuestRewards + return data; } @@ -310,15 +320,15 @@ void WorldPackets::Quest::QuestGiverChooseReward::Read() WorldPacket const* WorldPackets::Quest::QuestGiverQuestComplete::Write() { _worldPacket << int32(QuestID); + _worldPacket << int32(XPReward); + _worldPacket << int64(MoneyReward); _worldPacket << int32(SkillLineIDReward); - _worldPacket << int32(MoneyReward); _worldPacket << int32(NumSkillUpsReward); - _worldPacket << int32(XPReward); - _worldPacket << int32(TalentReward); _worldPacket << ItemReward; - _worldPacket.WriteBit(UseQuestReward); _worldPacket.WriteBit(LaunchGossip); + _worldPacket.WriteBit(LaunchQuest); + _worldPacket.WriteBit(HideChatMessage); _worldPacket.FlushBits(); return &_worldPacket; @@ -342,10 +352,11 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write() _worldPacket << uint32(QuestFlags[0]); // Flags _worldPacket << uint32(QuestFlags[1]); // FlagsEx _worldPacket << int32(PortraitTurnIn); - _worldPacket << int32(LearnSpells.size()); + _worldPacket << uint32(LearnSpells.size()); _worldPacket << Rewards; // WorldPackets::Quest::QuestRewards _worldPacket << int32(DescEmotes.size()); _worldPacket << int32(Objectives.size()); + _worldPacket << int32(QuestStartItemID); for (int32 spell : LearnSpells) _worldPacket << int32(spell); @@ -374,6 +385,8 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write() _worldPacket.WriteBit(DisplayPopup); _worldPacket.WriteBit(StartCheat); _worldPacket.WriteBit(AutoLaunched); + _worldPacket.WriteBit(CanIgnoreQuest); + _worldPacket.WriteBit(IsQuestIgnored); _worldPacket.FlushBits(); _worldPacket.WriteString(QuestTitle); @@ -406,6 +419,7 @@ WorldPacket const* WorldPackets::Quest::QuestGiverRequestItems::Write() { _worldPacket << int32(obj.ObjectID); _worldPacket << int32(obj.Amount); + _worldPacket << uint32(obj.Flags); } for (QuestCurrency const& cur : Currency) @@ -415,6 +429,8 @@ WorldPacket const* WorldPackets::Quest::QuestGiverRequestItems::Write() } _worldPacket.WriteBit(AutoLaunched); + _worldPacket.WriteBit(CanIgnoreQuest); + _worldPacket.WriteBit(IsQuestIgnored); _worldPacket.FlushBits(); _worldPacket.WriteBits(QuestTitle.size(), 9); @@ -458,6 +474,9 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestList::Write() _worldPacket << uint32(GreetEmoteDelay); _worldPacket << uint32(GreetEmoteType); _worldPacket << uint32(GossipTexts.size()); + _worldPacket.WriteBits(Greeting.size(), 11); + _worldPacket.FlushBits(); + for (GossipTextData const& gossip : GossipTexts) { _worldPacket << uint32(gossip.QuestID); @@ -466,13 +485,12 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestList::Write() _worldPacket << uint32(gossip.QuestFlags); _worldPacket << uint32(gossip.QuestFlagsEx); _worldPacket.WriteBit(gossip.Repeatable); + _worldPacket.WriteBit(gossip.IsQuestIgnored); _worldPacket.WriteBits(gossip.QuestTitle.size(), 9); _worldPacket.FlushBits(); _worldPacket.WriteString(gossip.QuestTitle); } - _worldPacket.WriteBits(Greeting.size(), 11); - _worldPacket.FlushBits(); _worldPacket.WriteString(Greeting); return &_worldPacket; diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index b321b4076a5..170c3d992fb 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -121,10 +121,13 @@ namespace WorldPackets int32 RewardMoneyDifficulty = 0; float RewardMoneyMultiplier = 1.0f; int32 RewardBonusMoney = 0; - int32 RewardDisplaySpell = 0; // reward spell, this spell will be displayed (icon) + int32 RewardDisplaySpell[QUEST_REWARD_DISPLAY_SPELL_COUNT] = {}; // reward spell, this spell will be displayed (icon) int32 RewardSpell = 0; int32 RewardHonor = 0; float RewardKillHonor = 0.0f; + int32 RewardArtifactXPDifficulty = 0; + float RewardArtifactXPMultiplier = 0.0f; + int32 RewardArtifactCategoryID = 0; int32 StartItem = 0; uint32 Flags = 0; uint32 FlagsEx = 0; @@ -138,7 +141,6 @@ namespace WorldPackets std::string QuestDescription; std::string AreaDescription; int32 RewardTitle = 0; // new 2.4.0, player gets this title (id from CharTitles) - int32 RewardTalents = 0; int32 RewardArenaPoints = 0; int32 RewardSkillLineID = 0; // reward skill id int32 RewardNumSkillUps = 0; // reward skill points @@ -154,6 +156,7 @@ namespace WorldPackets int32 CompleteSoundKitID = 0; int32 AreaGroupID = 0; int32 TimeAllowed = 0; + int32 QuestRewardID = 0; std::vector<QuestObjective> Objectives; int32 RewardItems[QUEST_REWARD_ITEM_COUNT] = {}; int32 RewardAmount[QUEST_REWARD_ITEM_COUNT] = {}; @@ -163,6 +166,7 @@ namespace WorldPackets int32 RewardFactionID[QUEST_REWARD_REPUTATIONS_COUNT] = {}; int32 RewardFactionValue[QUEST_REWARD_REPUTATIONS_COUNT] = {}; int32 RewardFactionOverride[QUEST_REWARD_REPUTATIONS_COUNT] = {}; + int32 RewardFactionCapIn[QUEST_REWARD_REPUTATIONS_COUNT] = {}; int32 RewardCurrencyID[QUEST_REWARD_CURRENCY_COUNT] = {}; int32 RewardCurrencyQty[QUEST_REWARD_CURRENCY_COUNT] = {}; }; @@ -217,21 +221,26 @@ namespace WorldPackets int32 ItemCount = 0; int32 Money = 0; int32 XP = 0; + int32 ArtifactXP = 0; + int32 ArtifactCategoryID = 0; + int32 Honor = 0; int32 Title = 0; - int32 Talents = 0; int32 FactionFlags = 0; - int32 SpellCompletionDisplayID = 0; + int32 SpellCompletionDisplayID[QUEST_REWARD_DISPLAY_SPELL_COUNT] = {}; int32 SpellCompletionID = 0; int32 SkillLineID = 0; int32 NumSkillUps = 0; + int32 RewardID = 0; QuestChoiceItem ChoiceItems[QUEST_REWARD_CHOICES_COUNT]; int32 ItemID[QUEST_REWARD_ITEM_COUNT] = {}; int32 ItemQty[QUEST_REWARD_ITEM_COUNT] = {}; int32 FactionID[QUEST_REWARD_REPUTATIONS_COUNT] = {}; int32 FactionValue[QUEST_REWARD_REPUTATIONS_COUNT] = {}; int32 FactionOverride[QUEST_REWARD_REPUTATIONS_COUNT] = {}; + int32 FactionCapIn[QUEST_REWARD_REPUTATIONS_COUNT] = {}; int32 CurrencyID[QUEST_REWARD_CURRENCY_COUNT] = {}; int32 CurrencyQty[QUEST_REWARD_CURRENCY_COUNT] = {}; + bool IsBoostSpell = false; }; struct QuestDescEmote @@ -291,14 +300,15 @@ namespace WorldPackets WorldPacket const* Write() override; - bool UseQuestReward = false; + int32 QuestID = 0; + int32 XPReward = 0; + int64 MoneyReward = 0; int32 SkillLineIDReward = 0; - int32 MoneyReward = 0; int32 NumSkillUpsReward = 0; - int32 XPReward = 0; - int32 QuestID = 0; - int32 TalentReward = 0; - bool LaunchGossip = 0; + bool UseQuestReward = false; + bool LaunchGossip = false; + bool LaunchQuest = false; + bool HideChatMessage = false; WorldPackets::Item::ItemInstance ItemReward; }; @@ -341,6 +351,7 @@ namespace WorldPackets std::vector<int32> LearnSpells; int32 PortraitTurnIn = 0; int32 PortraitGiver = 0; + int32 QuestStartItemID = 0; std::string PortraitGiverText; std::string PortraitGiverName; std::string PortraitTurnInText; @@ -351,13 +362,16 @@ namespace WorldPackets bool DisplayPopup = false; bool StartCheat = false; bool AutoLaunched = false; + bool CanIgnoreQuest = false; + bool IsQuestIgnored = false; }; struct QuestObjectiveCollect { - QuestObjectiveCollect(int32 objectID = 0, int32 amount = 0) : ObjectID(objectID), Amount(amount) { } + QuestObjectiveCollect(int32 objectID = 0, int32 amount = 0, uint32 flags = 0) : ObjectID(objectID), Amount(amount), Flags(flags) { } int32 ObjectID; int32 Amount; + uint32 Flags; }; struct QuestCurrency @@ -388,6 +402,8 @@ namespace WorldPackets uint32 QuestFlags[2] = {}; std::string QuestTitle; std::string CompletionText; + bool CanIgnoreQuest = false; + bool IsQuestIgnored = false; }; class QuestGiverRequestReward final : public ClientPacket @@ -437,14 +453,15 @@ namespace WorldPackets struct GossipTextData { - GossipTextData(uint32 questID, uint32 questType, uint32 questLevel, uint32 questFlags, uint32 questFlagsEx, bool repeatable, std::string questTitle) : - QuestID(questID), QuestType(questType), QuestLevel(questLevel), QuestFlags(questFlags), QuestFlagsEx(questFlagsEx), Repeatable(repeatable), QuestTitle(questTitle) { } + GossipTextData(uint32 questID, uint32 questType, uint32 questLevel, uint32 questFlags, uint32 questFlagsEx, bool repeatable, bool ignored, std::string questTitle) : + QuestID(questID), QuestType(questType), QuestLevel(questLevel), QuestFlags(questFlags), QuestFlagsEx(questFlagsEx), Repeatable(repeatable), IsQuestIgnored(ignored), QuestTitle(questTitle) { } uint32 QuestID; uint32 QuestType; uint32 QuestLevel; uint32 QuestFlags; uint32 QuestFlagsEx; bool Repeatable; + bool IsQuestIgnored; std::string QuestTitle; }; 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/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index c319be3811d..b2fff8cddfa 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -52,14 +52,18 @@ WorldPacket const* WorldPackets::Spells::CategoryCooldown::Write() WorldPacket const* WorldPackets::Spells::SendKnownSpells::Write() { - _worldPacket.reserve(1 + 4 * KnownSpells.size()); + _worldPacket.reserve(1 + 4 * KnownSpells.size() + 4 * FavoriteSpells.size()); _worldPacket.WriteBit(InitialLogin); _worldPacket << uint32(KnownSpells.size()); + _worldPacket << uint32(FavoriteSpells.size()); for (uint32 spellId : KnownSpells) _worldPacket << uint32(spellId); + for (uint32 spellId : FavoriteSpells) + _worldPacket << uint32(spellId); + return &_worldPacket; } @@ -93,69 +97,119 @@ void WorldPackets::Spells::SpellCastLogData::Initialize(Unit const* unit) Health = unit->GetHealth(); AttackPower = unit->GetTotalAttackPowerValue(unit->getClass() == CLASS_HUNTER ? RANGED_ATTACK : BASE_ATTACK); SpellPower = unit->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SPELL); - PowerData.emplace_back(int32(unit->getPowerType()), unit->GetPower(unit->getPowerType())); + PowerData.emplace_back(int32(unit->getPowerType()), unit->GetPower(unit->getPowerType()), int32(0)); +} + +void WorldPackets::Spells::SpellCastLogData::Initialize(Spell const* spell) +{ + Health = spell->GetCaster()->GetHealth(); + AttackPower = spell->GetCaster()->GetTotalAttackPowerValue(spell->GetCaster()->getClass() == CLASS_HUNTER ? RANGED_ATTACK : BASE_ATTACK); + SpellPower = spell->GetCaster()->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SPELL); + Powers primaryPowerType = spell->GetCaster()->getPowerType(); + bool primaryPowerAdded = false; + for (SpellInfo::CostData const& cost : spell->GetPowerCost()) + { + PowerData.emplace_back(int32(cost.Power), spell->GetCaster()->GetPower(Powers(cost.Power)), int32(cost.Amount)); + if (cost.Power == primaryPowerType) + primaryPowerAdded = true; + } + + if (!primaryPowerAdded) + PowerData.insert(PowerData.begin(), SpellLogPowerData(int32(primaryPowerType), spell->GetCaster()->GetPower(primaryPowerType), 0)); } ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData const& spellCastLogData) { - data << spellCastLogData.Health; - data << spellCastLogData.AttackPower; - data << spellCastLogData.SpellPower; - data << int32(spellCastLogData.PowerData.size()); + data << int64(spellCastLogData.Health); + data << int32(spellCastLogData.AttackPower); + data << int32(spellCastLogData.SpellPower); + data.WriteBits(spellCastLogData.PowerData.size(), 9); + data.FlushBits(); + for (WorldPackets::Spells::SpellLogPowerData const& powerData : spellCastLogData.PowerData) { - data << powerData.PowerType; - data << powerData.Amount; + data << int32(powerData.PowerType); + data << int32(powerData.Amount); + data << int32(powerData.Cost); } - data.WriteBit(false); - // data << float // Unk data if bit is true + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SandboxScalingData const& sandboxScalingData) +{ + data.WriteBits(sandboxScalingData.Type, 3); + data << int16(sandboxScalingData.PlayerLevelDelta); + data << uint8(sandboxScalingData.TargetLevel); + data << uint8(sandboxScalingData.Expansion); + data << uint8(sandboxScalingData.Class); + data << uint8(sandboxScalingData.TargetMinScalingLevel); + data << uint8(sandboxScalingData.TargetMaxScalingLevel); + data << int8(sandboxScalingData.TargetScalingLevelDelta); + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::AuraDataInfo const& auraData) +{ + data << auraData.CastID; + data << int32(auraData.SpellID); + data << int32(auraData.SpellXSpellVisualID); + data << uint8(auraData.Flags); + data << uint32(auraData.ActiveFlags); + data << uint16(auraData.CastLevel); + data << uint8(auraData.Applications); + data.WriteBit(auraData.CastUnit.is_initialized()); + data.WriteBit(auraData.Duration.is_initialized()); + data.WriteBit(auraData.Remaining.is_initialized()); + data.WriteBit(auraData.TimeMod.is_initialized()); + data.WriteBits(auraData.Points.size(), 6); + data.WriteBits(auraData.EstimatedPoints.size(), 6); + data.WriteBit(auraData.SandboxScaling.is_initialized()); + + if (auraData.CastUnit) + data << *auraData.CastUnit; + + if (auraData.Duration) + data << uint32(*auraData.Duration); + + if (auraData.Remaining) + data << uint32(*auraData.Remaining); + + if (auraData.TimeMod) + data << float(*auraData.TimeMod); + + if (!auraData.Points.empty()) + data.append(auraData.Points.data(), auraData.Points.size()); + + if (!auraData.EstimatedPoints.empty()) + data.append(auraData.EstimatedPoints.data(), auraData.EstimatedPoints.size()); + + if (auraData.SandboxScaling) + data << *auraData.SandboxScaling; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::AuraInfo const& aura) +{ + data << aura.Slot; + data.WriteBit(aura.AuraData.is_initialized()); data.FlushBits(); + if (aura.AuraData) + data << *aura.AuraData; + return data; } WorldPacket const* WorldPackets::Spells::AuraUpdate::Write() { _worldPacket.WriteBit(UpdateAll); + _worldPacket.WriteBits(Auras.size(), 9); + for (AuraInfo const& aura : Auras) + _worldPacket << aura; + _worldPacket << UnitGUID; - _worldPacket << uint32(Auras.size()); - for (auto& aura : Auras) - { - _worldPacket << aura.Slot; - if (_worldPacket.WriteBit(aura.AuraData.is_initialized())) - { - AuraDataInfo const& data = *aura.AuraData; - _worldPacket << uint32(data.SpellID); - _worldPacket << uint32(data.SpellXSpellVisualID); - _worldPacket << uint8(data.Flags); - _worldPacket << uint32(data.ActiveFlags); - _worldPacket << uint16(data.CastLevel); - _worldPacket << uint8(data.Applications); - _worldPacket << uint32(data.Points.size()); - _worldPacket << uint32(data.EstimatedPoints.size()); - - if (!data.Points.empty()) - _worldPacket.append(data.Points.data(), data.Points.size()); - - if (!data.EstimatedPoints.empty()) - _worldPacket.append(data.EstimatedPoints.data(), data.EstimatedPoints.size()); - - _worldPacket.WriteBit(data.CastUnit.is_initialized()); - _worldPacket.WriteBit(data.Duration.is_initialized()); - _worldPacket.WriteBit(data.Remaining.is_initialized()); - - if (data.CastUnit) - _worldPacket << *data.CastUnit; - - if (data.Duration) - _worldPacket << uint32(*data.Duration); - - if (data.Remaining) - _worldPacket << uint32(*data.Remaining); - } - - _worldPacket.FlushBits(); - } return &_worldPacket; } @@ -174,10 +228,11 @@ ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::SpellTargetData { buffer.ResetBitPos(); - targetData.Flags = buffer.ReadBits(23); - bool const hasSrcLocation = buffer.ReadBit(); - bool const hasDstLocation = buffer.ReadBit(); - bool const hasOrientation = buffer.ReadBit(); + targetData.Flags = buffer.ReadBits(25); + bool hasSrcLocation = buffer.ReadBit(); + bool hasDstLocation = buffer.ReadBit(); + bool hasOrientation = buffer.ReadBit(); + bool hasMapID = buffer.ReadBit(); uint32 nameLength = buffer.ReadBits(7); buffer >> targetData.Unit; @@ -192,6 +247,9 @@ ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::SpellTargetData if (hasOrientation) targetData.Orientation = buffer.read<float>(); + if (hasMapID) + targetData.MapID = buffer.read<int32>(); + targetData.Name = buffer.ReadString(nameLength); return buffer; @@ -211,20 +269,17 @@ ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::SpellCastReques buffer >> request.Misc[1]; buffer >> request.SpellID; buffer >> request.SpellXSpellVisualID; - buffer >> request.Target; buffer >> request.MissileTrajectory; buffer >> request.Charmer; - - buffer.ResetBitPos(); request.SendCastFlags = buffer.ReadBits(5); - bool const hasMoveUpdate = buffer.ReadBit(); + bool hasMoveUpdate = buffer.ReadBit(); request.Weight.resize(buffer.ReadBits(2)); + buffer >> request.Target; if (hasMoveUpdate) { - MovementInfo movementInfo; - buffer >> movementInfo; - request.MoveUpdate = movementInfo; + request.MoveUpdate = boost::in_place(); + buffer >> *request.MoveUpdate; } for (WorldPackets::Spells::SpellWeight& weight : request.Weight) @@ -257,6 +312,14 @@ void WorldPackets::Spells::UseItem::Read() _worldPacket >> Cast; } +WorldPacket const* WorldPackets::Spells::SpellPrepare::Write() +{ + _worldPacket << ClientCastID; + _worldPacket << ServerCastID; + + return &_worldPacket; +} + ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::TargetLocation const& targetLocation) { data << targetLocation.Transport; @@ -268,10 +331,11 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::TargetLocation co ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellTargetData const& spellTargetData) { - data.WriteBits(spellTargetData.Flags, 23); + data.WriteBits(spellTargetData.Flags, 25); data.WriteBit(spellTargetData.SrcLocation.is_initialized()); data.WriteBit(spellTargetData.DstLocation.is_initialized()); data.WriteBit(spellTargetData.Orientation.is_initialized()); + data.WriteBit(spellTargetData.MapID.is_initialized()); data.WriteBits(spellTargetData.Name.size(), 7); data.FlushBits(); @@ -287,6 +351,9 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellTargetData c if (spellTargetData.Orientation) data << *spellTargetData.Orientation; + if (spellTargetData.MapID) + data << *spellTargetData.MapID; + data.WriteString(spellTargetData.Name); return data; @@ -295,8 +362,10 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellTargetData c ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellMissStatus const& spellMissStatus) { data.WriteBits(spellMissStatus.Reason, 4); - data.WriteBits(spellMissStatus.ReflectStatus, 4); - // No need to flush bits as we written exactly 8 bits (1 byte) + if (spellMissStatus.Reason == SPELL_MISS_REFLECT) + data.WriteBits(spellMissStatus.ReflectStatus, 4); + + data.FlushBits(); return data; } @@ -311,12 +380,9 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::RuneData const& r { data << uint8(runeData.Start); data << uint8(runeData.Count); - - data.WriteBits(runeData.Cooldowns.size(), 3); - data.FlushBits(); - - for (uint8 cd : runeData.Cooldowns) - data << cd; + data << uint32(runeData.Cooldowns.size()); + if (!runeData.Cooldowns.empty()) + data.append(runeData.Cooldowns.data(), runeData.Cooldowns.size()); return data; } @@ -354,22 +420,30 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastData con { data << spellCastData.CasterGUID; data << spellCastData.CasterUnit; - data << uint8(spellCastData.CastID); + data << spellCastData.CastID; + data << spellCastData.OriginalCastID; data << int32(spellCastData.SpellID); data << uint32(spellCastData.SpellXSpellVisualID); data << uint32(spellCastData.CastFlags); data << uint32(spellCastData.CastTime); - data << uint32(spellCastData.HitTargets.size()); - data << uint32(spellCastData.MissTargets.size()); - data << uint32(spellCastData.MissStatus.size()); - data << spellCastData.Target; - data << uint32(spellCastData.RemainingPower.size()); data << spellCastData.MissileTrajectory; - data << spellCastData.Ammo; + data << int32(spellCastData.Ammo.DisplayID); data << uint8(spellCastData.DestLocSpellCastIndex); - data << uint32(spellCastData.TargetPoints.size()); data << spellCastData.Immunities; data << spellCastData.Predict; + data.WriteBits(spellCastData.CastFlagsEx, 22); + data.WriteBits(spellCastData.HitTargets.size(), 16); + data.WriteBits(spellCastData.MissTargets.size(), 16); + data.WriteBits(spellCastData.MissStatus.size(), 16); + data.WriteBits(spellCastData.RemainingPower.size(), 9); + data.WriteBit(spellCastData.RemainingRunes.is_initialized()); + data.WriteBits(spellCastData.TargetPoints.size(), 16); + data.FlushBits(); + + for (WorldPackets::Spells::SpellMissStatus const& status : spellCastData.MissStatus) + data << status; + + data << spellCastData.Target; for (ObjectGuid const& target : spellCastData.HitTargets) data << target; @@ -377,22 +451,15 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastData con for (ObjectGuid const& target : spellCastData.MissTargets) data << target; - for (WorldPackets::Spells::SpellMissStatus const& status : spellCastData.MissStatus) - data << status; - for (WorldPackets::Spells::SpellPowerData const& power : spellCastData.RemainingPower) data << power; - for (WorldPackets::Spells::TargetLocation const& targetLoc : spellCastData.TargetPoints) - data << targetLoc; - - data.WriteBits(spellCastData.CastFlagsEx, 20); - data.WriteBit(spellCastData.RemainingRunes.is_initialized()); - data.FlushBits(); - if (spellCastData.RemainingRunes) data << *spellCastData.RemainingRunes; + for (WorldPackets::Spells::TargetLocation const& targetLoc : spellCastData.TargetPoints) + data << targetLoc; + return data; } @@ -405,13 +472,12 @@ WorldPacket const* WorldPackets::Spells::SpellStart::Write() WorldPacket const* WorldPackets::Spells::SpellGo::Write() { - _worldPacket << Cast; + *this << Cast; - _worldPacket.WriteBit(LogData.is_initialized()); - _worldPacket.FlushBits(); + WriteLogDataBit(); + FlushBits(); - if (LogData) - _worldPacket << *LogData; + WriteLogData(); return &_worldPacket; } @@ -419,9 +485,13 @@ WorldPacket const* WorldPackets::Spells::SpellGo::Write() WorldPacket const* WorldPackets::Spells::LearnedSpells::Write() { _worldPacket << uint32(SpellID.size()); + _worldPacket << uint32(FavoriteSpellID.size()); for (int32 spell : SpellID) _worldPacket << spell; + for (int32 spell : FavoriteSpellID) + _worldPacket << spell; + _worldPacket.WriteBit(SuppressMessaging); _worldPacket.FlushBits(); @@ -432,6 +502,7 @@ WorldPacket const* WorldPackets::Spells::SupercededSpells::Write() { _worldPacket << uint32(SpellID.size()); _worldPacket << uint32(Superceded.size()); + _worldPacket << uint32(FavoriteSpellID.size()); if (!SpellID.empty()) _worldPacket.append(SpellID.data(), SpellID.size()); @@ -439,13 +510,16 @@ WorldPacket const* WorldPackets::Spells::SupercededSpells::Write() if (!Superceded.empty()) _worldPacket.append(Superceded.data(), Superceded.size()); + if (!FavoriteSpellID.empty()) + _worldPacket.append(FavoriteSpellID.data(), FavoriteSpellID.size()); + return &_worldPacket; } WorldPacket const* WorldPackets::Spells::SpellFailure::Write() { _worldPacket << CasterUnit; - _worldPacket << uint8(CastID); + _worldPacket << CastID; _worldPacket << int32(SpellID); _worldPacket << uint32(SpelXSpellVisualID); _worldPacket << uint16(Reason); @@ -456,8 +530,9 @@ WorldPacket const* WorldPackets::Spells::SpellFailure::Write() WorldPacket const* WorldPackets::Spells::SpellFailedOther::Write() { _worldPacket << CasterUnit; - _worldPacket << uint8(CastID); + _worldPacket << CastID; _worldPacket << uint32(SpellID); + _worldPacket << uint32(SpelXSpellVisualID); _worldPacket << uint8(Reason); return &_worldPacket; @@ -465,11 +540,23 @@ WorldPacket const* WorldPackets::Spells::SpellFailedOther::Write() WorldPacket const* WorldPackets::Spells::CastFailed::Write() { + _worldPacket << CastID; + _worldPacket << int32(SpellID); + _worldPacket << int32(SpellXSpellVisualID); + _worldPacket << int32(Reason); + _worldPacket << int32(FailedArg1); + _worldPacket << int32(FailedArg2); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Spells::PetCastFailed::Write() +{ + _worldPacket << CastID; _worldPacket << int32(SpellID); _worldPacket << int32(Reason); _worldPacket << int32(FailedArg1); _worldPacket << int32(FailedArg2); - _worldPacket << uint8(CastID); return &_worldPacket; } @@ -679,8 +766,8 @@ WorldPacket const* WorldPackets::Spells::PlaySpellVisualKit::Write() void WorldPackets::Spells::CancelCast::Read() { - _worldPacket >> SpellID; _worldPacket >> CastID; + _worldPacket >> SpellID; } void WorldPackets::Spells::OpenItem::Read() @@ -731,15 +818,12 @@ WorldPacket const* WorldPackets::Spells::SpellChannelUpdate::Write() WorldPacket const* WorldPackets::Spells::ResurrectRequest::Write() { _worldPacket << ResurrectOffererGUID; - _worldPacket << ResurrectOffererVirtualRealmAddress; - - _worldPacket << PetNumber; - _worldPacket << SpellID; - + _worldPacket << uint32(ResurrectOffererVirtualRealmAddress); + _worldPacket << uint32(PetNumber); + _worldPacket << int32(SpellID); _worldPacket.WriteBits(Name.length(), 6); _worldPacket.WriteBit(UseTimer); _worldPacket.WriteBit(Sickness); - _worldPacket.FlushBits(); _worldPacket.WriteString(Name); @@ -761,21 +845,21 @@ void WorldPackets::Spells::GetMirrorImageData::Read() WorldPacket const* WorldPackets::Spells::MirrorImageComponentedData::Write() { _worldPacket << UnitGUID; - _worldPacket << DisplayID; - _worldPacket << RaceID; - _worldPacket << Gender; - _worldPacket << ClassID; - _worldPacket << SkinColor; - _worldPacket << FaceVariation; - _worldPacket << HairVariation; - _worldPacket << HairColor; - _worldPacket << BeardVariation; + _worldPacket << int32(DisplayID); + _worldPacket << uint8(RaceID); + _worldPacket << uint8(Gender); + _worldPacket << uint8(ClassID); + _worldPacket << uint8(SkinColor); + _worldPacket << uint8(FaceVariation); + _worldPacket << uint8(HairVariation); + _worldPacket << uint8(HairColor); + _worldPacket << uint8(BeardVariation); + _worldPacket.append(CustomDisplay.data(), CustomDisplay.size()); _worldPacket << GuildGUID; - _worldPacket << uint32(ItemDisplayID.size()); - for (auto const& itemDisplayId : ItemDisplayID) - _worldPacket << itemDisplayId; + for (int32 itemDisplayId : ItemDisplayID) + _worldPacket << int32(itemDisplayId); return &_worldPacket; } @@ -783,7 +867,7 @@ WorldPacket const* WorldPackets::Spells::MirrorImageComponentedData::Write() WorldPacket const* WorldPackets::Spells::MirrorImageCreatureData::Write() { _worldPacket << UnitGUID; - _worldPacket << DisplayID; + _worldPacket << int32(DisplayID); return &_worldPacket; } @@ -794,22 +878,9 @@ 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); - } + _worldPacket << Runes; return &_worldPacket; } @@ -825,7 +896,7 @@ void WorldPackets::Spells::MissileTrajectoryCollision::Read() WorldPacket const* WorldPackets::Spells::NotifyMissileTrajectoryCollision::Write() { _worldPacket << Caster; - _worldPacket << uint8(CastID); + _worldPacket << CastID; _worldPacket << CollisionPos; return &_worldPacket; @@ -845,9 +916,8 @@ void WorldPackets::Spells::UpdateMissileTrajectory::Read() _worldPacket.ResetBitPos(); if (hasStatus) { - MovementInfo info; - _worldPacket >> info; - Status = info; + Status = boost::in_place(); + _worldPacket >> *Status; } } diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 016fbb89895..595b5522175 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -28,6 +28,86 @@ namespace WorldPackets { namespace Spells { + struct SpellLogPowerData + { + SpellLogPowerData(int32 powerType, int32 amount, int32 cost) : PowerType(powerType), Amount(amount), Cost(cost) { } + + int32 PowerType = 0; + int32 Amount = 0; + int32 Cost = 0; + }; + + struct SpellCastLogData + { + int64 Health = 0; + int32 AttackPower = 0; + int32 SpellPower = 0; + std::vector<SpellLogPowerData> PowerData; + + void Initialize(Unit const* unit); + void Initialize(Spell const* spell); + }; + } +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData const& spellCastLogData); + +namespace WorldPackets +{ + namespace CombatLog + { + class CombatLogServerPacket : public ServerPacket + { + public: + CombatLogServerPacket(OpcodeServer opcode, size_t initialSize = 200, ConnectionType connection = CONNECTION_TYPE_DEFAULT) + : ServerPacket(opcode, initialSize, connection), _fullLogPacket(opcode, initialSize, connection) { } + + WorldPacket const* GetFullLogPacket() const { return &_fullLogPacket; } + WorldPacket const* GetBasicLogPacket() const { return &_worldPacket; } + + Spells::SpellCastLogData LogData; + + protected: + template<typename T> + void operator<<(T const& val) + { + _worldPacket << val; + _fullLogPacket << val; + } + + void WriteLogDataBit() + { + _worldPacket.WriteBit(false); + _fullLogPacket.WriteBit(true); + } + + void FlushBits() + { + _worldPacket.FlushBits(); + _fullLogPacket.FlushBits(); + } + + bool WriteBit(bool bit) + { + _worldPacket.WriteBit(bit); + _fullLogPacket.WriteBit(bit); + return bit; + } + + void WriteBits(uint32 value, uint32 bitCount) + { + _worldPacket.WriteBits(value, bitCount); + _fullLogPacket.WriteBits(value, bitCount); + } + + ByteBuffer& WriteLogData() { return _fullLogPacket << LogData; } + + WorldPacket _fullLogPacket; + }; + } + + namespace Spells + { class CancelAura final : public ClientPacket { public: @@ -120,6 +200,7 @@ namespace WorldPackets bool InitialLogin = false; std::vector<uint32> KnownSpells; + std::vector<uint32> FavoriteSpells; // tradeskill recipes }; class UpdateActionButtons final : public ServerPacket @@ -163,28 +244,23 @@ namespace WorldPackets std::vector<uint32> Spells; }; - struct SpellLogPowerData - { - SpellLogPowerData(int32 powerType, int32 amount) : PowerType(powerType), Amount(amount) { } - - int32 PowerType = 0; - int32 Amount = 0; - }; - - struct SpellCastLogData + struct SandboxScalingData { - int32 Health = 0; - int32 AttackPower = 0; - int32 SpellPower = 0; - std::vector<SpellLogPowerData> PowerData; - - void Initialize(Unit const* unit); + uint32 Type = 0; + int16 PlayerLevelDelta = 0; + uint8 TargetLevel = 0; + uint8 Expansion = 0; + uint8 Class = 1; + uint8 TargetMinScalingLevel = 1; + uint8 TargetMaxScalingLevel = 1; + int8 TargetScalingLevelDelta = 1; }; struct AuraDataInfo { + ObjectGuid CastID; int32 SpellID = 0; - uint32 SpellXSpellVisualID = 0; + int32 SpellXSpellVisualID = 0; uint8 Flags = 0; uint32 ActiveFlags = 0; uint16 CastLevel = 1; @@ -192,8 +268,10 @@ namespace WorldPackets Optional<ObjectGuid> CastUnit; Optional<int32> Duration; Optional<int32> Remaining; + Optional<float> TimeMod; std::vector<float> Points; std::vector<float> EstimatedPoints; + Optional<SandboxScalingData> SandboxScaling; }; struct AuraInfo @@ -228,6 +306,7 @@ namespace WorldPackets Optional<TargetLocation> SrcLocation; Optional<TargetLocation> DstLocation; Optional<float> Orientation; + Optional<int32> MapID; std::string Name; }; @@ -246,7 +325,7 @@ namespace WorldPackets struct SpellCastRequest { - uint8 CastID = 0; + ObjectGuid CastID; int32 SpellID = 0; uint32 SpellXSpellVisualID = 0; uint8 SendCastFlags = 0; @@ -292,6 +371,17 @@ namespace WorldPackets SpellCastRequest Cast; }; + class SpellPrepare final : public ServerPacket + { + public: + SpellPrepare() : ServerPacket(SMSG_SPELL_PREPARE, 16 + 16) { } + + WorldPacket const* Write() override; + + ObjectGuid ClientCastID; + ObjectGuid ServerCastID; + }; + struct SpellMissStatus { uint8 Reason = 0; @@ -340,7 +430,8 @@ namespace WorldPackets { ObjectGuid CasterGUID; ObjectGuid CasterUnit; - uint8 CastID = 0; + ObjectGuid CastID; + ObjectGuid OriginalCastID; int32 SpellID = 0; uint32 SpellXSpellVisualID = 0; uint32 CastFlags = 0; @@ -360,14 +451,13 @@ namespace WorldPackets SpellHealPrediction Predict; }; - class SpellGo final : public ServerPacket + class SpellGo final : public CombatLog::CombatLogServerPacket { public: - SpellGo() : ServerPacket(SMSG_SPELL_GO) { } + SpellGo() : CombatLog::CombatLogServerPacket(SMSG_SPELL_GO) { } WorldPacket const* Write() override; - Optional<SpellCastLogData> LogData; SpellCastData Cast; }; @@ -389,6 +479,7 @@ namespace WorldPackets WorldPacket const* Write() override; std::vector<int32> SpellID; + std::vector<int32> FavoriteSpellID; bool SuppressMessaging = false; }; @@ -401,6 +492,7 @@ namespace WorldPackets std::vector<int32> SpellID; std::vector<int32> Superceded; + std::vector<int32> FavoriteSpellID; }; class SpellFailure final : public ServerPacket @@ -414,7 +506,7 @@ namespace WorldPackets uint32 SpellID = 0; uint32 SpelXSpellVisualID = 0; uint16 Reason = 0; - uint8 CastID = 0; + ObjectGuid CastID; }; class SpellFailedOther final : public ServerPacket @@ -426,22 +518,38 @@ namespace WorldPackets ObjectGuid CasterUnit; uint32 SpellID = 0; + uint32 SpelXSpellVisualID = 0; uint8 Reason = 0; - uint8 CastID = 0; + ObjectGuid CastID; }; class TC_GAME_API CastFailed final : public ServerPacket { public: - CastFailed(OpcodeServer opcode) : ServerPacket(opcode, 4+4+4+4+1) { } + CastFailed() : ServerPacket(SMSG_CAST_FAILED, 4 + 4 + 4 + 4 + 1) { } WorldPacket const* Write() override; - int32 Reason = 0; - int32 FailedArg1 = -1; - int32 FailedArg2 = -1; - int32 SpellID = 0; - uint8 CastID = 0; + ObjectGuid CastID; + int32 SpellID = 0; + int32 SpellXSpellVisualID = 0; + int32 Reason = 0; + int32 FailedArg1 = -1; + int32 FailedArg2 = -1; + }; + + class TC_GAME_API PetCastFailed final : public ServerPacket + { + public: + PetCastFailed() : ServerPacket(SMSG_PET_CAST_FAILED, 4 + 4 + 4 + 1) { } + + WorldPacket const* Write() override; + + ObjectGuid CastID; + int32 SpellID = 0; + int32 Reason = 0; + int32 FailedArg1 = -1; + int32 FailedArg2 = -1; }; struct SpellModifierData @@ -670,7 +778,7 @@ namespace WorldPackets void Read() override; uint32 SpellID = 0; - uint8 CastID = 0; + ObjectGuid CastID; }; class OpenItem final : public ClientPacket @@ -774,7 +882,7 @@ namespace WorldPackets WorldPacket const* Write() override; ObjectGuid UnitGUID; - uint32 DisplayID = 0; + int32 DisplayID = 0; uint8 RaceID = 0; uint8 Gender = 0; uint8 ClassID = 0; @@ -783,9 +891,10 @@ namespace WorldPackets uint8 HairVariation = 0; uint8 HairColor = 0; uint8 BeardVariation = 0; + std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> CustomDisplay; ObjectGuid GuildGUID; - std::vector<uint32> ItemDisplayID; + std::vector<int32> ItemDisplayID; }; class MirrorImageCreatureData final : public ServerPacket @@ -796,7 +905,7 @@ namespace WorldPackets WorldPacket const* Write() override; ObjectGuid UnitGUID; - uint32 DisplayID = 0; + int32 DisplayID = 0; }; class SpellClick final : public ClientPacket @@ -810,31 +919,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) { } + ResyncRunes(size_t size) : ServerPacket(SMSG_RESYNC_RUNES, 1 + 1 + 4 + size) { } WorldPacket const* Write() override; - std::vector<ResyncRune> Runes; + RuneData Runes; }; class MissileTrajectoryCollision final : public ClientPacket @@ -846,7 +938,7 @@ namespace WorldPackets ObjectGuid Target; int32 SpellID = 0; - uint8 CastID = 0; + ObjectGuid CastID; G3D::Vector3 CollisionPos; }; @@ -858,7 +950,7 @@ namespace WorldPackets WorldPacket const* Write() override; ObjectGuid Caster; - uint8 CastID = 0; + ObjectGuid CastID; G3D::Vector3 CollisionPos; }; @@ -905,7 +997,7 @@ namespace WorldPackets } } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData const& spellCastLogData); ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::SpellCastRequest& request); +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SandboxScalingData const& sandboxScalingData); #endif // SpellPackets_h__ diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp index 68b835c85ab..00882b27600 100644 --- a/src/server/game/Server/Packets/SystemPackets.cpp +++ b/src/server/game/Server/Packets/SystemPackets.cpp @@ -48,7 +48,8 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write() _worldPacket.WriteBit(CommerceSystemEnabled); _worldPacket.WriteBit(Unk67); _worldPacket.WriteBit(WillKickFromWorld); - _worldPacket.WriteBit(UnkBit61); + _worldPacket.WriteBit(KioskModeEnabled); + _worldPacket.WriteBit(RaceClassExpansionLevels.is_initialized()); _worldPacket.FlushBits(); @@ -72,14 +73,12 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write() _worldPacket << int32(SessionAlert->DisplayTime); } - /*if (bit61) + if (RaceClassExpansionLevels) { - var int88 = packet.ReadInt32("int88"); - for (int i = 0; i < int88; i++) - packet.ReadByte("byte23", i); - }*/ - - _worldPacket.FlushBits(); + _worldPacket << uint32(RaceClassExpansionLevels->size()); + if (!RaceClassExpansionLevels->empty()) + _worldPacket.append(RaceClassExpansionLevels->data(), RaceClassExpansionLevels->size()); + } return &_worldPacket; } @@ -94,6 +93,9 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatusGlueScreen::Write() _worldPacket.WriteBit(Unk14); _worldPacket.WriteBit(WillKickFromWorld); _worldPacket.WriteBit(IsExpansionPreorderInStore); + _worldPacket.WriteBit(KioskModeEnabled); + _worldPacket.WriteBit(false); // not accessed in handler + _worldPacket.WriteBit(TrialBoostEnabled); _worldPacket.FlushBits(); _worldPacket << int32(TokenPollTimeSeconds); diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h index 5d6d2a9c071..7a420df6859 100644 --- a/src/server/game/Server/Packets/SystemPackets.h +++ b/src/server/game/Server/Packets/SystemPackets.h @@ -84,7 +84,9 @@ namespace WorldPackets bool RestrictedAccount = false; bool TutorialsEnabled = false; bool NPETutorialsEnabled = false; - bool UnkBit61 = false; + bool KioskModeEnabled = false; + + Optional<std::vector<uint8>> RaceClassExpansionLevels; }; class FeatureSystemStatusGlueScreen final : public ServerPacket @@ -101,7 +103,9 @@ namespace WorldPackets bool CommerceSystemEnabled = false; // NYI bool Unk14 = false; // NYI bool WillKickFromWorld = false; // NYI - bool IsExpansionPreorderInStore = false; + bool IsExpansionPreorderInStore = false; // NYI + bool KioskModeEnabled = false; // NYI + bool TrialBoostEnabled = false; // NYI int32 TokenPollTimeSeconds = 0; // NYI int32 TokenRedeemIndex = 0; // NYI }; diff --git a/src/server/game/Server/Packets/TalentPackets.cpp b/src/server/game/Server/Packets/TalentPackets.cpp index 7dc2daaa706..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 ca6b0217a28..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<uint16> TalentIDs; - uint16 GlyphIDs[MAX_GLYPH_SLOT_INDEX]; + std::vector<uint16> PvPTalentIDs; }; struct TalentInfoUpdate { - uint8 ActiveGroup; + uint8 ActiveGroup = 0; + uint32 PrimarySpecialization = 0; std::vector<TalentGroupInfo> 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<uint16> Talents; + Array<uint16, MAX_TALENT_TIERS> 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<uint16> Talents; + }; } } diff --git a/src/server/game/Server/Packets/TaxiPackets.cpp b/src/server/game/Server/Packets/TaxiPackets.cpp index 0f64d8eccf4..0c53f53bdd9 100644 --- a/src/server/game/Server/Packets/TaxiPackets.cpp +++ b/src/server/game/Server/Packets/TaxiPackets.cpp @@ -63,6 +63,8 @@ void WorldPackets::Taxi::ActivateTaxi::Read() { _worldPacket >> Vendor; _worldPacket >> Node; + _worldPacket >> GroundMountID; + _worldPacket >> FlyingMountID; } WorldPacket const* WorldPackets::Taxi::ActivateTaxiReply::Write() diff --git a/src/server/game/Server/Packets/TaxiPackets.h b/src/server/game/Server/Packets/TaxiPackets.h index c4d4cac3046..e9f132740cc 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 { @@ -93,6 +92,8 @@ namespace WorldPackets ObjectGuid Vendor; uint32 Node = 0; + uint32 GroundMountID = 0; + uint32 FlyingMountID = 0; }; class NewTaxiPath final : public ServerPacket diff --git a/src/server/game/Server/Packets/TicketPackets.cpp b/src/server/game/Server/Packets/TicketPackets.cpp index 8048fecb597..328930f5ba8 100644 --- a/src/server/game/Server/Packets/TicketPackets.cpp +++ b/src/server/game/Server/Packets/TicketPackets.cpp @@ -100,16 +100,15 @@ ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Ticket::SupportTicketSubm ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Ticket::SupportTicketSubmitComplaint::SupportTicketChatLog& chatlog) { uint32 linesCount = data.read<uint32>(); + bool hasReportLineIndex = data.ReadBit(); + data.ResetBitPos(); for (uint32 i = 0; i < linesCount; i++) chatlog.Lines.emplace_back(data); - bool hasReportLineIndex = data.ReadBit(); if (hasReportLineIndex) chatlog.ReportLineIndex = data.read<uint32>(); - data.ResetBitPos(); - return data; } @@ -206,11 +205,11 @@ void WorldPackets::Ticket::SupportTicketSubmitComplaint::Read() _worldPacket.ResetBitPos(); - Note = _worldPacket.ReadString(noteLength); - if (hasMailInfo) _worldPacket >> MailInfo; + Note = _worldPacket.ReadString(noteLength); + if (hasCalendarInfo) _worldPacket >> CalenderInfo; diff --git a/src/server/game/Server/Packets/TradePackets.cpp b/src/server/game/Server/Packets/TradePackets.cpp index a66d50268f6..2eadb4796ae 100644 --- a/src/server/game/Server/Packets/TradePackets.cpp +++ b/src/server/game/Server/Packets/TradePackets.cpp @@ -84,25 +84,27 @@ WorldPacket const* WorldPackets::Trade::TradeStatus::Write() ByteBuffer& operator<<(ByteBuffer& buffer, WorldPackets::Trade::TradeUpdated::UnwrappedTradeItem const& unwrappedTradeItem) { - buffer << unwrappedTradeItem.Item; buffer << int32(unwrappedTradeItem.EnchantID); buffer << int32(unwrappedTradeItem.OnUseEnchantmentID); - buffer.append(unwrappedTradeItem.SocketEnchant, MAX_GEM_SOCKETS); buffer << unwrappedTradeItem.Creator; buffer << int32(unwrappedTradeItem.Charges); buffer << uint32(unwrappedTradeItem.MaxDurability); buffer << uint32(unwrappedTradeItem.Durability); + buffer.WriteBits(unwrappedTradeItem.Gems.size(), 2); buffer.WriteBit(unwrappedTradeItem.Lock); buffer.FlushBits(); + for (WorldPackets::Item::ItemGemInstanceData const& gem : unwrappedTradeItem.Gems) + buffer << gem; + return buffer; } ByteBuffer& operator<<(ByteBuffer& buffer, WorldPackets::Trade::TradeUpdated::TradeItem const& tradeItem) { buffer << uint8(tradeItem.Slot); - buffer << uint32(tradeItem.EntryID); buffer << uint32(tradeItem.StackCount); + buffer << tradeItem.Item; buffer << tradeItem.GiftCreator; if (buffer.WriteBit(tradeItem.Unwrapped.is_initialized())) buffer << *tradeItem.Unwrapped; diff --git a/src/server/game/Server/Packets/TradePackets.h b/src/server/game/Server/Packets/TradePackets.h index 3536ae34b83..df3b62165dd 100644 --- a/src/server/game/Server/Packets/TradePackets.h +++ b/src/server/game/Server/Packets/TradePackets.h @@ -160,13 +160,13 @@ namespace WorldPackets bool Lock = false; uint32 MaxDurability = 0; uint32 Durability = 0; - int32 SocketEnchant[MAX_GEM_SOCKETS] = { }; + std::vector<Item::ItemGemInstanceData> Gems; }; struct TradeItem { uint8 Slot = 0; - int32 EntryID = 0; + Item::ItemInstance Item; int32 StackCount = 0; ObjectGuid GiftCreator; Optional<UnwrappedTradeItem> Unwrapped; 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 <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "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<uint32>()); + _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 <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef 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<TransmogrifyItem, MAX_TRANSMOGRIFY_ITEMS> 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<uint32> FavoriteAppearances; + }; + } +} + +#endif // TransmogrificationPackets_h__ diff --git a/src/server/game/Server/Packets/WhoPackets.cpp b/src/server/game/Server/Packets/WhoPackets.cpp index 8869aeaa035..07c44b012d6 100644 --- a/src/server/game/Server/Packets/WhoPackets.cpp +++ b/src/server/game/Server/Packets/WhoPackets.cpp @@ -34,8 +34,8 @@ WorldPacket const* WorldPackets::Who::WhoIsResponse::Write() ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Who::WhoWord& word) { - data.ResetBitPos(); word.Word = data.ReadString(data.ReadBits(7)); + data.ResetBitPos(); return data; } @@ -68,15 +68,17 @@ ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Who::WhoRequest& request) request.ShowArenaPlayers = data.ReadBit(); request.ExactName = data.ReadBit(); - bool const hasWhoRequest = data.ReadBit(); + bool hasWhoRequest = data.ReadBit(); + data.ResetBitPos(); + + for (size_t i = 0; i < request.Words.size(); ++i) + data >> request.Words[i]; request.Name = data.ReadString(nameLength); request.VirtualRealmName = data.ReadString(virtualRealmNameLength); request.Guild = data.ReadString(guildNameLength); request.GuildVirtualRealmName = data.ReadString(guildVirtualRealmNameLength); - for (size_t i = 0; i < request.Words.size(); ++i) - data >> request.Words[i]; if (hasWhoRequest) data >> request.ServerInfo; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 980cf06f883..15c714d66aa 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -120,16 +120,20 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_ACCEPT_LEVEL_GRANT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::RaF::AcceptLevelGrant, &WorldSession::HandleAcceptGrantLevel); DEFINE_HANDLER(CMSG_ACCEPT_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::AcceptTrade, &WorldSession::HandleAcceptTradeOpcode); DEFINE_HANDLER(CMSG_ACCEPT_WARGAME_INVITE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_ACTIVATE_TAXI, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Taxi::ActivateTaxi, &WorldSession::HandleActivateTaxiOpcode); + DEFINE_HANDLER(CMSG_ACTIVATE_TAXI, STATUS_UNHANDLED, PROCESS_THREADSAFE, WorldPackets::Taxi::ActivateTaxi, &WorldSession::HandleActivateTaxiOpcode); DEFINE_HANDLER(CMSG_ADDON_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ADD_BATTLENET_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ADD_FRIEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::AddFriend, &WorldSession::HandleAddFriendOpcode); DEFINE_HANDLER(CMSG_ADD_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::AddIgnore, &WorldSession::HandleAddIgnoreOpcode); DEFINE_HANDLER(CMSG_ADD_TOY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Toy::AddToy, &WorldSession::HandleAddToy); + DEFINE_HANDLER(CMSG_ADVENTURE_JOURNAL_OPEN_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_ADVENTURE_JOURNAL_START_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ALTER_APPEARANCE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::AlterApperance, &WorldSession::HandleAlterAppearance); DEFINE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::AreaSpiritHealerQuery, &WorldSession::HandleAreaSpiritHealerQueryOpcode); DEFINE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUEUE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::AreaSpiritHealerQueue, &WorldSession::HandleAreaSpiritHealerQueueOpcode); DEFINE_HANDLER(CMSG_AREA_TRIGGER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::AreaTrigger, &WorldSession::HandleAreaTriggerOpcode); + DEFINE_HANDLER(CMSG_ARTIFACT_ADD_POWER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_ARTIFACT_SET_APPEARANCE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ATTACK_STOP, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Combat::AttackStop, &WorldSession::HandleAttackStopOpcode); DEFINE_HANDLER(CMSG_ATTACK_SWING, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Combat::AttackSwing, &WorldSession::HandleAttackSwingOpcode); DEFINE_HANDLER(CMSG_AUCTION_HELLO_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionHelloRequest, &WorldSession::HandleAuctionHelloOpcode); @@ -166,8 +170,11 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PAY_GET_PRODUCT_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PAY_GET_PURCHASE_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_BATTLE_PAY_QUERY_CLASS_TRIAL_BOOST_RESULT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PAY_START_PURCHASE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PAY_START_VAS_PURCHASE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_BATTLE_PAY_TRIAL_BOOST_CHARACTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_BATTLE_PET_CLEAR_FANFARE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PET_DELETE_PET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::BattlePet::BattlePetDeletePet, &WorldSession::HandleBattlePetDeletePet); DEFINE_HANDLER(CMSG_BATTLE_PET_DELETE_PET_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PET_MODIFY_NAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::BattlePet::BattlePetModifyName, &WorldSession::HandleBattlePetModifyName); @@ -178,10 +185,9 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_BATTLE_PET_SUMMON, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::BattlePet::BattlePetSummon, &WorldSession::HandleBattlePetSummon); DEFINE_HANDLER(CMSG_BATTLE_PET_UPDATE_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BEGIN_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::BeginTrade, &WorldSession::HandleBeginTradeOpcode); - DEFINE_HANDLER(CMSG_BF_MGR_ENTRY_INVITE_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battlefield::BFMgrEntryInviteResponse, &WorldSession::HandleBfEntryInviteResponse); - DEFINE_HANDLER(CMSG_BF_MGR_QUEUE_EXIT_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battlefield::BFMgrQueueExitRequest, &WorldSession::HandleBfQueueExitRequest); - DEFINE_HANDLER(CMSG_BF_MGR_QUEUE_INVITE_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battlefield::BFMgrQueueInviteResponse, &WorldSession::HandleBfQueueInviteResponse); - DEFINE_HANDLER(CMSG_BF_MGR_QUEUE_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + //DEFINE_HANDLER(CMSG_BF_MGR_ENTRY_INVITE_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battlefield::BFMgrEntryInviteResponse, &WorldSession::HandleBfEntryInviteResponse); + //DEFINE_HANDLER(CMSG_BF_MGR_QUEUE_EXIT_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battlefield::BFMgrQueueExitRequest, &WorldSession::HandleBfQueueExitRequest); + //DEFINE_HANDLER(CMSG_BF_MGR_QUEUE_INVITE_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battlefield::BFMgrQueueInviteResponse, &WorldSession::HandleBfQueueInviteResponse); DEFINE_HANDLER(CMSG_BINDER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBinderActivateOpcode); DEFINE_HANDLER(CMSG_BLACK_MARKET_BID_ON_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::BlackMarket::BlackMarketBidOnItem, &WorldSession::HandleBlackMarketBidOnItem); DEFINE_HANDLER(CMSG_BLACK_MARKET_OPEN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::BlackMarket::BlackMarketOpen, &WorldSession::HandleBlackMarketOpen); @@ -227,7 +233,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHANGE_BAG_SLOT_FLAG, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHANGE_MONUMENT_APPEARANCE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_CHANGE_SUB_GROUP, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::ChangeSubGroup, &WorldSession::HandleChangeSubGroupOpcode); + DEFINE_HANDLER(CMSG_CHANGE_SUB_GROUP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::ChangeSubGroup, &WorldSession::HandleChangeSubGroupOpcode); DEFINE_HANDLER(CMSG_CHARACTER_RENAME_REQUEST, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharacterRenameRequest, &WorldSession::HandleCharRenameOpcode); DEFINE_HANDLER(CMSG_CHAR_CUSTOMIZE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharCustomize, &WorldSession::HandleCharCustomizeOpcode); DEFINE_HANDLER(CMSG_CHAR_DELETE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharDelete, &WorldSession::HandleCharDeleteOpcode); @@ -296,6 +302,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_COMPLAINT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::Complaint, &WorldSession::HandleComplaint); DEFINE_HANDLER(CMSG_COMPLETE_CINEMATIC, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::CompleteCinematic, &WorldSession::HandleCompleteCinematic); DEFINE_HANDLER(CMSG_COMPLETE_MOVIE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_CONFIRM_ARTIFACT_RESPEC, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CONFIRM_RESPEC_WIPE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Talent::ConfirmRespecWipe, &WorldSession::HandleConfirmRespecWipeOpcode); DEFINE_HANDLER(CMSG_CONNECT_TO_FAILED, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); DEFINE_HANDLER(CMSG_CONVERT_RAID, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::ConvertRaid, &WorldSession::HandleConvertRaidOpcode); @@ -316,9 +323,9 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_LEAVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleLfgLeaveOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_PROPOSAL_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgProposalResultOpcode ); DEFINE_HANDLER(CMSG_DF_READY_CHECK_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_DF_SEARCH_JOIN, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_DF_SEARCH_LEAVE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_SET_COMMENT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleLfgSetCommentOpcode ); + //DEFINE_HANDLER(CMSG_DF_SEARCH_JOIN, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + //DEFINE_HANDLER(CMSG_DF_SEARCH_LEAVE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + //DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_SET_COMMENT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleLfgSetCommentOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_SET_ROLES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgSetRolesOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_TELEPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgTeleportOpcode ); DEFINE_HANDLER(CMSG_DISCARDED_TIME_SYNC_ACKS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -328,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); @@ -349,8 +357,10 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_RENAME_FOLLOWER, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Garrison::GarrisonRequestBlueprintAndSpecializationData, &WorldSession::HandleGarrisonRequestBlueprintAndSpecializationData); + DEFINE_HANDLER(CMSG_GARRISON_REQUEST_CLASS_SPEC_CATEGORY_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_REQUEST_SHIPMENT_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_GARRISON_RESEARCH_TALENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_SET_BUILDING_ACTIVE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_SET_FOLLOWER_FAVORITE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_SET_FOLLOWER_INACTIVE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -418,7 +428,6 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_GUILD_UPDATE_MOTD_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildUpdateMotdText, &WorldSession::HandleGuildUpdateMotdText); DEFINE_HANDLER(CMSG_HEARTH_AND_RESURRECT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::HearthAndResurrect, &WorldSession::HandleHearthAndResurrect); DEFINE_HANDLER(CMSG_IGNORE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::IgnoreTrade, &WorldSession::HandleIgnoreTradeOpcode); - DEFINE_HANDLER(CMSG_INCREASE_CAST_TIME_FOR_SPELL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_INITIATE_ROLE_POLL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::InitiateRolePoll, &WorldSession::HandleInitiateRolePoll); DEFINE_HANDLER(CMSG_INITIATE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::InitiateTrade, &WorldSession::HandleInitiateTradeOpcode); DEFINE_HANDLER(CMSG_INSPECT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Inspect::Inspect, &WorldSession::HandleInspectOpcode); @@ -430,7 +439,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_PET_SPECIALIZATION_GROUP, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Pet::LearnPetSpecializationGroup, &WorldSession::HandlePetSetSpecializationOpcode); + DEFINE_HANDLER(CMSG_LEARN_PVP_TALENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); 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); @@ -453,6 +462,9 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_LF_GUILD_REMOVE_RECRUIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::GuildFinder::LFGuildRemoveRecruit, &WorldSession::HandleGuildFinderRemoveRecruit); DEFINE_HANDLER(CMSG_LF_GUILD_SET_GUILD_POST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::GuildFinder::LFGuildSetGuildPost, &WorldSession::HandleGuildFinderSetGuildPost); DEFINE_HANDLER(CMSG_LIST_INVENTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleListInventoryOpcode); + DEFINE_HANDLER(CMSG_LIVE_REGION_ACCOUNT_RESTORE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_LIVE_REGION_CHARACTER_COPY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LOADING_SCREEN_NOTIFY, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::LoadingScreenNotify, &WorldSession::HandleLoadScreenOpcode); DEFINE_HANDLER(CMSG_LOAD_SELECTED_TROPHY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LOGOUT_CANCEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::LogoutCancel, &WorldSession::HandleLogoutCancelOpcode); @@ -477,6 +489,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_MASTER_LOOT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLootMasterGiveOpcode ); DEFINE_HANDLER(CMSG_MINIMAP_PING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::MinimapPingClient, &WorldSession::HandleMinimapPingOpcode); DEFINE_HANDLER(CMSG_MISSILE_TRAJECTORY_COLLISION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::MissileTrajectoryCollision, &WorldSession::HandleMissileTrajectoryCollision); + DEFINE_HANDLER(CMSG_MOUNT_CLEAR_FANFARE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_MOUNT_SET_FAVORITE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_MOUNT_SPECIAL_ANIM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::MountSpecial, &WorldSession::HandleMountSpecialAnimOpcode); DEFINE_HANDLER(CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -542,10 +555,10 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_MOVE_TOGGLE_COLLISION_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_MOVE_WATER_WALK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MovementAckMessage, &WorldSession::HandleMovementAckMessage); DEFINE_HANDLER(CMSG_NEUTRAL_PLAYER_SELECT_FACTION, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_NEXT_CINEMATIC_CAMERA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::NextCinematicCamera, &WorldSession::HandleNextCinematicCamera); + DEFINE_HANDLER(CMSG_NEXT_CINEMATIC_CAMERA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::NextCinematicCamera, &WorldSession::HandleNextCinematicCamera); DEFINE_HANDLER(CMSG_OBJECT_UPDATE_FAILED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::ObjectUpdateFailed, &WorldSession::HandleObjectUpdateFailedOpcode); DEFINE_HANDLER(CMSG_OBJECT_UPDATE_RESCUED, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::ObjectUpdateRescued, &WorldSession::HandleObjectUpdateRescuedOpcode); - DEFINE_HANDLER(CMSG_OFFER_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::OfferPetition, &WorldSession::HandleOfferPetition); + DEFINE_HANDLER(CMSG_OFFER_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::OfferPetition, &WorldSession::HandleOfferPetition); DEFINE_HANDLER(CMSG_OPENING_CINEMATIC, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::OpeningCinematic, &WorldSession::HandleOpeningCinematic); DEFINE_HANDLER(CMSG_OPEN_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::OpenItem, &WorldSession::HandleOpenItemOpcode); DEFINE_HANDLER(CMSG_OPEN_MISSION_NPC, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -570,6 +583,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_PET_BATTLE_REQUEST_UPDATE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_PET_BATTLE_REQUEST_WILD, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_PET_BATTLE_WILD_LOCATION_FAIL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_PET_CANCEL_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::PetCancelAura, &WorldSession::HandlePetCancelAuraOpcode); DEFINE_HANDLER(CMSG_PET_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::PetCastSpell, &WorldSession::HandlePetCastSpellOpcode); DEFINE_HANDLER(CMSG_PET_RENAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Pet::PetRename, &WorldSession::HandlePetRename); @@ -581,6 +595,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_PROTOCOL_MISMATCH, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_PUSH_QUEST_TO_PARTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::PushQuestToParty, &WorldSession::HandlePushQuestToParty); DEFINE_HANDLER(CMSG_PVP_LOG_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::PVPLogDataRequest, &WorldSession::HandlePVPLogDataOpcode); + DEFINE_HANDLER(CMSG_PVP_PRESTIGE_RANK_UP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUERY_BATTLE_PET_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryCorpseLocationFromClient, &WorldSession::HandleQueryCorpseLocation); DEFINE_HANDLER(CMSG_QUERY_CORPSE_TRANSPORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryCorpseTransport, &WorldSession::HandleQueryCorpseTransport); @@ -598,6 +613,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_QUERY_PLAYER_NAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryPlayerName, &WorldSession::HandleNameQueryOpcode); DEFINE_HANDLER(CMSG_QUERY_QUEST_COMPLETION_NPCS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryQuestCompletionNPCs, &WorldSession::HandleQueryQuestCompletionNPCs); DEFINE_HANDLER(CMSG_QUERY_QUEST_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QueryQuestInfo, &WorldSession::HandleQuestQueryOpcode); + DEFINE_HANDLER(CMSG_QUERY_QUEST_REWARDS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUERY_REALM_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUERY_SCENARIO_POI, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUERY_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryTime, &WorldSession::HandleQueryTimeOpcode); @@ -607,14 +623,17 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_QUEST_GIVER_CHOOSE_REWARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverChooseReward, &WorldSession::HandleQuestgiverChooseRewardOpcode); DEFINE_HANDLER(CMSG_QUEST_GIVER_COMPLETE_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverCompleteQuest, &WorldSession::HandleQuestgiverCompleteQuest); DEFINE_HANDLER(CMSG_QUEST_GIVER_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverHello, &WorldSession::HandleQuestgiverHelloOpcode); + DEFINE_HANDLER(CMSG_QUEST_GIVER_IGNORE_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUEST_GIVER_QUERY_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverQueryQuest, &WorldSession::HandleQuestgiverQueryQuestOpcode); 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); DEFINE_HANDLER(CMSG_QUEUED_MESSAGES_END, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_RAID_OR_BATTLEGROUND_ENGINE_SURVEY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_RANDOM_ROLL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::RandomRollClient, &WorldSession::HandleRandomRollOpcode); DEFINE_HANDLER(CMSG_READY_CHECK_RESPONSE, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::ReadyCheckResponseClient, &WorldSession::HandleReadyCheckResponseOpcode); DEFINE_HANDLER(CMSG_READ_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::ReadItem, &WorldSession::HandleReadItem); @@ -639,24 +658,26 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_REQUEST_LFG_LIST_BLACKLIST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_PARTY_JOIN_UPDATES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::RequestPartyJoinUpdates, &WorldSession::HandleRequestPartyJoinUpdates); DEFINE_HANDLER(CMSG_REQUEST_PARTY_MEMBER_STATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::RequestPartyMemberStats, &WorldSession::HandleRequestPartyMemberStatsOpcode); - DEFINE_HANDLER(CMSG_REQUEST_PET_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Pet::RequestPetInfo, &WorldSession::HandleRequestPetInfo); + DEFINE_HANDLER(CMSG_REQUEST_PET_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Pet::RequestPetInfo, &WorldSession::HandleRequestPetInfo); DEFINE_HANDLER(CMSG_REQUEST_PLAYED_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::RequestPlayedTime, &WorldSession::HandlePlayedTime); DEFINE_HANDLER(CMSG_REQUEST_PVP_REWARDS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::RequestPVPRewards, &WorldSession::HandleRequestPvpReward); DEFINE_HANDLER(CMSG_REQUEST_RAID_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::RequestRaidInfo, &WorldSession::HandleRequestRaidInfoOpcode); DEFINE_HANDLER(CMSG_REQUEST_RATED_BATTLEFIELD_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::RequestRatedBattlefieldInfo, &WorldSession::HandleRequestRatedBattlefieldInfo); DEFINE_HANDLER(CMSG_REQUEST_RESEARCH_HISTORY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_STABLED_PETS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::RequestStabledPets, &WorldSession::HandleRequestStabledPets); - DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_EXIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RequestVehicleExit, &WorldSession::HandleRequestVehicleExit); - DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_NEXT_SEAT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RequestVehicleNextSeat, &WorldSession::HandleRequestVehicleNextSeat); - DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_PREV_SEAT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RequestVehiclePrevSeat, &WorldSession::HandleRequestVehiclePrevSeat); + DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_EXIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RequestVehicleExit, &WorldSession::HandleRequestVehicleExit); + DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_NEXT_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RequestVehicleNextSeat, &WorldSession::HandleRequestVehicleNextSeat); + DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_PREV_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RequestVehiclePrevSeat, &WorldSession::HandleRequestVehiclePrevSeat); DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_SWITCH_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RequestVehicleSwitchSeat, &WorldSession::HandleRequestVehicleSwitchSeat); - DEFINE_HANDLER(CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Token::RequestWowTokenMarketPrice, &WorldSession::HandleRequestWowTokenMarketPrice); + DEFINE_HANDLER(CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Token::RequestWowTokenMarketPrice, &WorldSession::HandleRequestWowTokenMarketPrice); DEFINE_HANDLER(CMSG_RESET_CHALLENGE_MODE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_RESET_INSTANCES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Instance::ResetInstances, &WorldSession::HandleResetInstancesOpcode); + DEFINE_HANDLER(CMSG_RESET_INSTANCES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Instance::ResetInstances, &WorldSession::HandleResetInstancesOpcode); DEFINE_HANDLER(CMSG_RESURRECT_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::ResurrectResponse, &WorldSession::HandleResurrectResponse); 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_CLIENT_VARIABLES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SAVE_CUF_PROFILES, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::SaveCUFProfiles, &WorldSession::HandleSaveCUFProfiles); + DEFINE_HANDLER(CMSG_SAVE_ENABLED_ADDONS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); 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); @@ -674,7 +695,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_SET_ACTION_BAR_TOGGLES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::SetActionBarToggles, &WorldSession::HandleSetActionBarToggles); DEFINE_HANDLER(CMSG_SET_ACTION_BUTTON, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::SetActionButton, &WorldSession::HandleSetActionButtonOpcode); DEFINE_HANDLER(CMSG_SET_ACTIVE_MOVER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Movement::SetActiveMover, &WorldSession::HandleSetActiveMoverOpcode); - DEFINE_HANDLER(CMSG_SET_ACTIVE_VOICE_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Voice::SetActiveVoiceChannel, &WorldSession::HandleSetActiveVoiceChannel); + DEFINE_HANDLER(CMSG_SET_ACTIVE_VOICE_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Voice::SetActiveVoiceChannel, &WorldSession::HandleSetActiveVoiceChannel); DEFINE_HANDLER(CMSG_SET_ADVANCED_COMBAT_LOGGING, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::ClientConfig::SetAdvancedCombatLogging, &WorldSession::HandleSetAdvancedCombatLogging); DEFINE_HANDLER(CMSG_SET_ASSISTANT_LEADER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::SetAssistantLeader, &WorldSession::HandleSetAssistantLeaderOpcode); DEFINE_HANDLER(CMSG_SET_BACKPACK_AUTOSORT_DISABLED, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -704,7 +725,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); @@ -712,8 +732,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); @@ -725,6 +743,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_SPIRIT_HEALER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::SpiritHealerActivate, &WorldSession::HandleSpiritHealerActivate); DEFINE_HANDLER(CMSG_SPLIT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SplitItem, &WorldSession::HandleSplitItemOpcode); DEFINE_HANDLER(CMSG_STAND_STATE_CHANGE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::StandStateChange, &WorldSession::HandleStandStateChangeOpcode); + DEFINE_HANDLER(CMSG_START_CHALLENGE_MODE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_START_SPECTATOR_WAR_GAME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_START_WAR_GAME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SUMMON_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Movement::SummonResponse, &WorldSession::HandleSummonResponseOpcode); @@ -735,13 +754,14 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_SUSPEND_TOKEN_RESPONSE, STATUS_TRANSFER, PROCESS_THREADUNSAFE, WorldPackets::Movement::SuspendTokenResponse, &WorldSession::HandleSuspendTokenResponse); DEFINE_HANDLER(CMSG_SWAP_INV_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SwapInvItem, &WorldSession::HandleSwapInvItemOpcode); DEFINE_HANDLER(CMSG_SWAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SwapItem, &WorldSession::HandleSwapItem); - DEFINE_HANDLER(CMSG_SWAP_SUB_GROUPS, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::SwapSubGroups, &WorldSession::HandleSwapSubGroupsOpcode); + DEFINE_HANDLER(CMSG_SWAP_SUB_GROUPS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::SwapSubGroups, &WorldSession::HandleSwapSubGroupsOpcode); DEFINE_HANDLER(CMSG_SWAP_VOID_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::SwapVoidItem, &WorldSession::HandleVoidSwapItem); DEFINE_HANDLER(CMSG_TABARD_VENDOR_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleTabardVendorActivateOpcode); DEFINE_HANDLER(CMSG_TALK_TO_GOSSIP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleGossipHelloOpcode); DEFINE_HANDLER(CMSG_TAXI_NODE_STATUS_QUERY, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Taxi::TaxiNodeStatusQuery, &WorldSession::HandleTaxiNodeStatusQueryOpcode); DEFINE_HANDLER(CMSG_TAXI_QUERY_AVAILABLE_NODES, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Taxi::TaxiQueryAvailableNodes, &WorldSession::HandleTaxiQueryAvailableNodesOpcode); DEFINE_HANDLER(CMSG_TAXI_REQUEST_EARLY_LANDING, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Taxi::TaxiRequestEarlyLanding, &WorldSession::HandleTaxiRequestEarlyLanding); + DEFINE_HANDLER(CMSG_TELEPORT_TO_GUID, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TELEPORT_TO_UNIT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TIME_ADJUSTMENT_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TIME_SYNC_RESPONSE, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::TimeSyncResponse, &WorldSession::HandleTimeSyncResponse); @@ -751,9 +771,11 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_TOGGLE_PVP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::TogglePvP, &WorldSession::HandleTogglePvP); DEFINE_HANDLER(CMSG_TOTEM_DESTROYED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Totem::TotemDestroyed, &WorldSession::HandleTotemDestroyed); DEFINE_HANDLER(CMSG_TOY_SET_FAVORITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Toy::ToySetFavorite, &WorldSession::HandleToySetFavorite); + 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_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::TransmogrifyItems, &WorldSession::HandleTransmogrifyItems); + 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); @@ -771,7 +793,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_UPDATE_MISSILE_TRAJECTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::UpdateMissileTrajectory, &WorldSession::HandleUpdateMissileTrajectory); DEFINE_HANDLER(CMSG_UPDATE_RAID_TARGET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::UpdateRaidTarget, &WorldSession::HandleUpdateRaidTargetOpcode); DEFINE_HANDLER(CMSG_UPDATE_VAS_PURCHASE_STATES, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Token::UpdateListedAuctionableTokens, &WorldSession::HandleUpdateListedAuctionableTokens); + DEFINE_HANDLER(CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Token::UpdateListedAuctionableTokens, &WorldSession::HandleUpdateListedAuctionableTokens); DEFINE_HANDLER(CMSG_UPDATE_WOW_TOKEN_COUNT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_UPGRADE_GARRISON, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_UPGRADE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::UpgradeItem, &WorldSession::HandleUpgradeItem); @@ -783,7 +805,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_VIOLENCE_LEVEL, STATUS_AUTHED, PROCESS_INPLACE, WorldPackets::Misc::ViolenceLevel, &WorldSession::HandleViolenceLevel); DEFINE_HANDLER(CMSG_VOICE_ADD_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_VOICE_DEL_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_VOICE_SESSION_ENABLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Voice::VoiceSessionEnable, &WorldSession::HandleVoiceSessionEnable); + DEFINE_HANDLER(CMSG_VOICE_SESSION_ENABLE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Voice::VoiceSessionEnable, &WorldSession::HandleVoiceSessionEnable); DEFINE_HANDLER(CMSG_VOID_STORAGE_TRANSFER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::VoidStorageTransfer, &WorldSession::HandleVoidStorageTransfer); DEFINE_HANDLER(CMSG_WARDEN_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Warden::WardenData, &WorldSession::HandleWardenData); DEFINE_HANDLER(CMSG_WHO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Who::WhoRequestPkt, &WorldSession::HandleWhoOpcode); @@ -800,7 +822,7 @@ void OpcodeTable::Initialize() ValidateAndSetServerOpcode(opcode, #opcode, status, con) DEFINE_SERVER_OPCODE_HANDLER(SMSG_ABORT_NEW_WORLD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_CRITERIA_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_CRITERIA_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_DATA_TIMES, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_HEIRLOOM_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_MOUNT_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); @@ -808,7 +830,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_DELETED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVATE_TAXI_REPLY, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADDON_INFO, STATUS_NEVER, 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); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_ITEM_PASSIVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_LOSS_OF_CONTROL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -817,7 +839,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_AE_LOOT_TARGETS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AE_LOOT_TARGET_ACK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AI_REACTION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACCOUNT_CRITERIA, 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_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARCHAEOLOGY_SURVERY_CAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -828,6 +850,10 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_SHAPE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_APPEARANCE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_FORGE_OPENED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_POWERS_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_XP_GAIN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKER_STATE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACK_START, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACK_STOP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -882,33 +908,34 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_PURCHASE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VAS_BOOST_CONSUMED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VAS_CHARACTER_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VAS_PURCHASE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VAS_PURCHASE_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VAS_PURCHASE_STARTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PETS_HEALED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_CAGE_DATE_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_DELETED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_ERROR, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_LICENSE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_MAX_COUNT_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_RESTORED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_REVOKED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_TRAP_LEVEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_UPDATES, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_DROP_TIMER_CANCELLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_DROP_TIMER_STARTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_EJECTED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_EJECT_PENDING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_ENTERING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_ENTRY_INVITE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_QUEUE_INVITE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_QUEUE_REQUEST_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_QUEUE_STATUS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_STATE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + //DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_EJECTED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + //DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_ENTERING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + //DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_ENTRY_INVITE, STATUS_NEVER, CONNECTION_TYPE_REALM); + //DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_QUEUE_INVITE, STATUS_NEVER, CONNECTION_TYPE_REALM); + //DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_QUEUE_REQUEST_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDER_CONFIRM, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BIND_POINT_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_OPEN_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_OUTBID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_OUTBID, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_WON, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BONUS_ROLL_EMPTY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -916,6 +943,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_BREAK_TARGET, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_SUCCEEDED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CACHE_INFO, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CACHE_VERSION, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_CLEAR_PENDING_ACTION, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -937,22 +965,23 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_CALENDAR, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_EVENT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_NUM_PENDING, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAMERA_EFFECT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAMERA_SHAKE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_AUTO_REPEAT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_COMBAT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_ORPHAN_SPELL_VISUAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_ORPHAN_SPELL_VISUAL, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SCENE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SPELL_VISUAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SPELL_VISUAL, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SPELL_VISUAL_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAN_DUEL_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAST_FAILED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CATEGORY_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLEGE_MODE_REWARDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_ALL_MAP_STATS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_MAP_STATS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_NEW_PLAYER_RECORD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_REWARDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -960,11 +989,13 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY, STATUS_NEVER, CONNECTION_TYPE_REALM); 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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_UPGRADE_CHARACTER_CHOSEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_UPGRADE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_UPGRADE_QUEUED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_UPGRADE_STARTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_CUSTOMIZE, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -997,13 +1028,11 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_STATE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMPLAINT_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMPLETE_SHIPMENT_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMPRESSED_PACKET, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONNECT_TO, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONQUEST_FORMULA_CONSTANTS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); 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_NEVER, CONNECTION_TYPE_REALM); @@ -1045,6 +1074,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); @@ -1071,6 +1101,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_RESET_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_SET_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_UI_ACTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_SPEED_SET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_TIME_SET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1087,6 +1118,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_CREATE_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_DELETE_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_ABILITIES, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_DURABILITY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_XP, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); @@ -1146,7 +1178,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_TEXT_QUERY_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHALLENGE_COMPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHALLENGE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHALLENGE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHANGE_NAME_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_DELETED, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1170,6 +1202,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_INVITE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_INVITE_DECLINED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_INVITE_EXPIRED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ITEM_LOOTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_KNOWN_RECIPES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBERS_WITH_RECIPE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_DAILY_RESET, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1193,9 +1226,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_HIGHEST_THREAT_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_NOTIFY_BLOB, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_INCREASE_CAST_TIME_FOR_SPELL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIALIZE_FACTIONS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIAL_SETUP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIAL_SETUP, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_WORLD_STATES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_HONOR_STATS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_PVP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1204,7 +1236,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_END, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); @@ -1217,6 +1249,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_RESET, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_RESET_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_SAVE_CREATED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALIDATE_PAGE_TEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALIDATE_PLAYER, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALID_PROMOTION_CODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVENTORY_CHANGE_FAILURE, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1228,13 +1261,16 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PURCHASE_REFUND_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PUSH_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_UPGRADE_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_UPGRADE_RESULT, STATUS_UNHANDLED, 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_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); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_DISABLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_INSTANCE_SHUTDOWN_COUNTDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_JOIN_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_LIST_JOIN_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_LIST_SEARCH_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1250,7 +1286,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_READY_CHECK_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_READY_CHECK_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_ROLE_CHECK_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_SEARCH_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + //DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_SEARCH_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_SLOT_INVALID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_TELEPORT_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1274,7 +1310,6 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOG_XP_GAIN, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ALL_PASSED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_CONTENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ITEM_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MONEY_NOTIFY, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1297,7 +1332,10 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_COMPONENTED_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_CREATURE_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MISSILE_CANCEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MODIFY_CHARGE_RECOVERY_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MODIFY_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MODIFY_COOLDOWN_RECOVERY_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MODIFY_PARTY_RANGE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOTD, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_APPLY_MOVEMENT_FORCE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); @@ -1362,17 +1400,17 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_TELEPORT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNROOT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_HOVERING, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_HOVERING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_COLLISION_HEIGHT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_KNOCK_BACK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_PITCH_RATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SWIM_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1380,7 +1418,6 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TELEPORT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TURN_RATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_WALK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MULTIPLE_PACKETS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_TAXI_PATH, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_WORLD, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1401,6 +1438,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_INVITE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_KILL_LOG, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAUSE_MIRROR_TIMER, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PENDING_RAID_LOCK, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1459,10 +1497,12 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_TIME_WARNING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PONG, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_POWER_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRESTIGE_AND_HONOR_INVOLUNTARILY_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRE_RESSURECT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRINT_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROC_RESIST, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROPOSE_LEVEL_GRANT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PUSH_SPELL_TO_ACTION_BAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_CREDIT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_LOG_DATA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1479,6 +1519,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PET_NAME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PLAYER_NAME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_QUEST_INFO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_QUEST_REWARD_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_COMPLETION_NPC_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_CONFIRM_ACCEPT, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1492,13 +1533,17 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_REQUEST_ITEMS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_STATUS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_STATUS_MULTIPLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_IGNORED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_LOG_FULL, STATUS_NEVER, CONNECTION_TYPE_REALM); + 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); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_COMPLETE_BY_SPELL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_FAILED_TIMER, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAF_EMAIL_ENABLED_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1527,8 +1572,9 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_PVP_REWARDS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESEARCH_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_AREA_TRIGGER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_COMPRESSION_CONTEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_FAILED_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_FAILED_NOTIFY, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_RANGED_COMBAT_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_WEEKLY_CURRENCY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESPEC_WIPE_CONFIRM, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1544,9 +1590,9 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_RUNE_REGEN_DEBUG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENARIO_BOOT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENARIO_COMPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENARIO_OUT_OF_BOUNDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENARIO_POIS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENARIO_PROGRESS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENARIO_SPELL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENARIO_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENE_OBJECT_EVENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1595,15 +1641,20 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TASK_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TIME_ZONE_INFORMATION, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_VEHICLE_REC_ID, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_ADVENTURE_MAP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_BANK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_MAILBOX, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_TAXI_NODES, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_TRADE_SKILL_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SOCKET_GEMS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SOCKET_GEMS_FAILURE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SOR_START_EXPERIENCE_INCOMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPECIALIZATION_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPECIAL_MOUNT_ANIM, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPEC_INVOLUNTARILY_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_ABSORB_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_CATEGORY_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_CHANNEL_START, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_CHANNEL_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1619,10 +1670,10 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_INSTAKILL_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_INTERRUPT_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_MISS_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_MULTISTRIKE_EFFECT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_NON_MELEE_DAMAGE_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_OR_DAMAGE_IMMUNE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_PERIODIC_AURA_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_PREPARE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_START, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_UPDATE_CHAIN_TARGETS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPIRIT_HEALER_CONFIRM, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1640,7 +1691,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_NEVER, CONNECTION_TYPE_INSTANCE); - 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_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_INVOLUNTARILY_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1661,10 +1711,13 @@ 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_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); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TUTORIAL_FLAGS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TUTORIAL_HIGHLIGHT_SPELL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TUTORIAL_UNHIGHLIGHT_SPELL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TWITTER_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UI_TIME, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNDELETE_CHARACTER_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1675,7 +1728,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_CHARACTER_FLAGS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_EXPANSION_LEVEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_INSTANCE_OWNERSHIP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_INSTANCE_OWNERSHIP, STATUS_NEVER, 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_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1703,23 +1756,29 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEATHER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEEKLY_SPELL_USAGE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_WHO, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WHO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WHO_IS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_SERVER_INFO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_TEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_AUCTION_SOLD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_CAN_VETERAN_BUY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_DISTRIBUTION_GLUE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_DISTRIBUTION_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_REDEEM_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_XP_GAIN_ABORTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_XP_GAIN_ENABLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ZONE_UNDER_ATTACK, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMPRESSED_PACKET, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MULTIPLE_PACKETS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + #undef DEFINE_SERVER_OPCODE_HANDLER }; diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 5e428ec9a4d..aa9dce6f127 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -45,1612 +45,1667 @@ enum OpcodeMisc : uint32 enum OpcodeClient : uint32 { - CMSG_ACCEPT_GUILD_INVITE = 0x357B, - CMSG_ACCEPT_LEVEL_GRANT = 0x3463, - CMSG_ACCEPT_TRADE = 0x30D8, - CMSG_ACCEPT_WARGAME_INVITE = 0x3560, - CMSG_ACTIVATE_TAXI = 0x341F, - CMSG_ADDON_LIST = 0x3555, - CMSG_ADD_BATTLENET_FRIEND = 0x35E5, - CMSG_ADD_FRIEND = 0x365E, - CMSG_ADD_IGNORE = 0x3662, - CMSG_ADD_TOY = 0x31E6, - CMSG_ALTER_APPEARANCE = 0x345F, - CMSG_AREA_SPIRIT_HEALER_QUERY = 0x3424, - CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x3425, - CMSG_AREA_TRIGGER = 0x313C, - CMSG_ATTACK_STOP = 0x31B4, - CMSG_ATTACK_SWING = 0x31B3, - CMSG_AUCTION_HELLO_REQUEST = 0x3434, - CMSG_AUCTION_LIST_BIDDER_ITEMS = 0x343A, - CMSG_AUCTION_LIST_ITEMS = 0x3437, - CMSG_AUCTION_LIST_OWNER_ITEMS = 0x3439, - CMSG_AUCTION_LIST_PENDING_SALES = 0x343C, - CMSG_AUCTION_PLACE_BID = 0x343B, - CMSG_AUCTION_REMOVE_ITEM = 0x3436, - CMSG_AUCTION_REPLICATE_ITEMS = 0x3438, - CMSG_AUCTION_SELL_ITEM = 0x3435, - CMSG_AUTH_CONTINUED_SESSION = 0x36E4, - CMSG_AUTH_SESSION = 0x36E3, - CMSG_AUTOBANK_ITEM = 0x3917, - CMSG_AUTOBANK_REAGENT = 0x3914, - CMSG_AUTOSTORE_BANK_ITEM = 0x3916, - CMSG_AUTOSTORE_BANK_REAGENT = 0x3915, - CMSG_AUTO_EQUIP_ITEM = 0x3918, - CMSG_AUTO_EQUIP_ITEM_SLOT = 0x391D, - CMSG_AUTO_STORE_BAG_ITEM = 0x3919, - CMSG_BANKER_ACTIVATE = 0x3427, - CMSG_BATTLEFIELD_LEAVE = 0x30F0, - CMSG_BATTLEFIELD_LIST = 0x30FB, - CMSG_BATTLEFIELD_PORT = 0x348C, - CMSG_BATTLEMASTER_HELLO = 0x31FC, - CMSG_BATTLEMASTER_JOIN = 0x3489, - CMSG_BATTLEMASTER_JOIN_ARENA = 0x348A, - CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x348B, - CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x3661, - CMSG_BATTLENET_REQUEST = 0x3683, - CMSG_BATTLENET_REQUEST_REALM_LIST_TICKET = 0x3684, - CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x3658, - CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x3657, - CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x3651, - CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x364C, - CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x364D, - CMSG_BATTLE_PAY_START_PURCHASE = 0x3680, - CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x3681, - CMSG_BATTLE_PET_DELETE_PET = 0x35AD, - CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x35AC, - CMSG_BATTLE_PET_MODIFY_NAME = 0x35AF, - CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x35AB, - CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x35AA, - CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x35B3, - CMSG_BATTLE_PET_SET_FLAGS = 0x35B6, - CMSG_BATTLE_PET_SUMMON = 0x35B0, - CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x3145, - CMSG_BEGIN_TRADE = 0x30D5, - CMSG_BF_MGR_ENTRY_INVITE_RESPONSE = 0x3559, - CMSG_BF_MGR_QUEUE_EXIT_REQUEST = 0x355B, - CMSG_BF_MGR_QUEUE_INVITE_RESPONSE = 0x355A, - CMSG_BF_MGR_QUEUE_REQUEST = 0x30EF, - CMSG_BINDER_ACTIVATE = 0x3426, - CMSG_BLACK_MARKET_BID_ON_ITEM = 0x3493, - CMSG_BLACK_MARKET_OPEN = 0x3491, - CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x3492, - CMSG_BUG_REPORT = 0x3616, - CMSG_BUSY_TRADE = 0x30D6, - CMSG_BUY_BACK_ITEM = 0x3418, - CMSG_BUY_BANK_SLOT = 0x3428, - CMSG_BUY_ITEM = 0x3417, - CMSG_BUY_REAGENT_BANK = 0x3429, - CMSG_BUY_WOW_TOKEN_CONFIRM = 0x367A, - CMSG_BUY_WOW_TOKEN_START = 0x3679, - CMSG_CAGE_BATTLE_PET = 0x3154, - CMSG_CALENDAR_ADD_EVENT = 0x360D, - CMSG_CALENDAR_COMPLAIN = 0x3609, - CMSG_CALENDAR_COPY_EVENT = 0x3608, - CMSG_CALENDAR_EVENT_INVITE = 0x3602, - CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x3606, - CMSG_CALENDAR_EVENT_RSVP = 0x3604, - CMSG_CALENDAR_EVENT_SIGN_UP = 0x360B, - CMSG_CALENDAR_EVENT_STATUS = 0x3605, - CMSG_CALENDAR_GET = 0x35FF, - CMSG_CALENDAR_GET_EVENT = 0x3600, - CMSG_CALENDAR_GET_NUM_PENDING = 0x360A, - CMSG_CALENDAR_GUILD_FILTER = 0x3601, - CMSG_CALENDAR_REMOVE_EVENT = 0x3607, - CMSG_CALENDAR_REMOVE_INVITE = 0x3603, - CMSG_CALENDAR_UPDATE_EVENT = 0x360E, - CMSG_CANCEL_AURA = 0x3126, - CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x344F, - CMSG_CANCEL_CAST = 0x31EB, - CMSG_CANCEL_CHANNELLING = 0x31BF, - CMSG_CANCEL_GROWTH_AURA = 0x31C4, - CMSG_CANCEL_MASTER_LOOT_ROLL = 0x3172, - CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x3125, - CMSG_CANCEL_MOUNT_AURA = 0x31D5, - CMSG_CANCEL_QUEUED_SPELL = 0x30FC, - CMSG_CANCEL_TEMP_ENCHANTMENT = 0x345C, - CMSG_CANCEL_TRADE = 0x30DA, - CMSG_CAN_DUEL = 0x35EE, - CMSG_CAST_SPELL = 0x31E9, - CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x300D, - CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS = 0x300C, - CMSG_CHANGE_BAG_SLOT_FLAG = 0x3265, - CMSG_CHANGE_MONUMENT_APPEARANCE = 0x3247, - CMSG_CHANGE_SUB_GROUP = 0x35D3, - CMSG_CHARACTER_RENAME_REQUEST = 0x364F, - CMSG_CHAR_CUSTOMIZE = 0x361E, - CMSG_CHAR_DELETE = 0x362B, - CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x3624, - CMSG_CHAT_ADDON_MESSAGE_CHANNEL = 0x374E, - CMSG_CHAT_ADDON_MESSAGE_GUILD = 0x3752, - CMSG_CHAT_ADDON_MESSAGE_INSTANCE_CHAT = 0x3775, - CMSG_CHAT_ADDON_MESSAGE_OFFICER = 0x3754, - CMSG_CHAT_ADDON_MESSAGE_PARTY = 0x3771, - CMSG_CHAT_ADDON_MESSAGE_RAID = 0x3773, - CMSG_CHAT_ADDON_MESSAGE_WHISPER = 0x3750, - CMSG_CHAT_CHANNEL_ANNOUNCEMENTS = 0x3765, - CMSG_CHAT_CHANNEL_BAN = 0x3763, - CMSG_CHAT_CHANNEL_DECLINE_INVITE = 0x376C, - CMSG_CHAT_CHANNEL_DISPLAY_LIST = 0x3758, - CMSG_CHAT_CHANNEL_INVITE = 0x3761, - CMSG_CHAT_CHANNEL_KICK = 0x3762, - CMSG_CHAT_CHANNEL_LIST = 0x3757, - CMSG_CHAT_CHANNEL_MODERATE = 0x375C, - CMSG_CHAT_CHANNEL_MODERATOR = 0x375D, - CMSG_CHAT_CHANNEL_MUTE = 0x375F, - CMSG_CHAT_CHANNEL_OWNER = 0x375B, - CMSG_CHAT_CHANNEL_PASSWORD = 0x3759, - CMSG_CHAT_CHANNEL_SET_OWNER = 0x375A, - CMSG_CHAT_CHANNEL_SILENCE_ALL = 0x3768, - CMSG_CHAT_CHANNEL_SILENCE_VOICE = 0x3766, - CMSG_CHAT_CHANNEL_UNBAN = 0x3764, - CMSG_CHAT_CHANNEL_UNMODERATOR = 0x375E, - CMSG_CHAT_CHANNEL_UNMUTE = 0x3760, - CMSG_CHAT_CHANNEL_UNSILENCE_ALL = 0x3769, - CMSG_CHAT_CHANNEL_UNSILENCE_VOICE = 0x3767, - CMSG_CHAT_CHANNEL_VOICE_OFF = 0x376B, - CMSG_CHAT_CHANNEL_VOICE_ON = 0x376A, - CMSG_CHAT_JOIN_CHANNEL = 0x3746, - CMSG_CHAT_LEAVE_CHANNEL = 0x3747, - CMSG_CHAT_MESSAGE_AFK = 0x3755, - CMSG_CHAT_MESSAGE_CHANNEL = 0x374D, - CMSG_CHAT_MESSAGE_DND = 0x3756, - CMSG_CHAT_MESSAGE_EMOTE = 0x376E, - CMSG_CHAT_MESSAGE_GUILD = 0x3751, - CMSG_CHAT_MESSAGE_INSTANCE_CHAT = 0x3774, - CMSG_CHAT_MESSAGE_OFFICER = 0x3753, - CMSG_CHAT_MESSAGE_PARTY = 0x3770, - CMSG_CHAT_MESSAGE_RAID = 0x3772, - CMSG_CHAT_MESSAGE_RAID_WARNING = 0x3776, - CMSG_CHAT_MESSAGE_SAY = 0x376D, - CMSG_CHAT_MESSAGE_WHISPER = 0x374F, - CMSG_CHAT_MESSAGE_YELL = 0x376F, - CMSG_CHAT_REGISTER_ADDON_PREFIXES = 0x374B, - CMSG_CHAT_REPORT_FILTERED = 0x374A, - CMSG_CHAT_REPORT_IGNORED = 0x3749, - CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES = 0x374C, - CMSG_CHECK_RAF_EMAIL_ENABLED = 0x3659, - CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY = 0x3678, - CMSG_CHOICE_RESPONSE = 0x31ED, - CMSG_CLEAR_RAID_MARKER = 0x311E, - CMSG_CLEAR_TRADE_ITEM = 0x30DC, - CMSG_CLIENT_PORT_GRAVEYARD = 0x348E, - CMSG_CLOSE_INTERACTION = 0x3405, - CMSG_COMMENTATOR_ENABLE = 0x3673, - CMSG_COMMENTATOR_ENTER_INSTANCE = 0x3573, - CMSG_COMMENTATOR_EXIT_INSTANCE = 0x3574, - CMSG_COMMENTATOR_GET_MAP_INFO = 0x3571, - CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3572, - CMSG_COMMENTATOR_START_WARGAME = 0x356F, - CMSG_COMPLAINT = 0x35FC, - CMSG_COMPLETE_CINEMATIC = 0x34AB, - CMSG_COMPLETE_MOVIE = 0x3446, - CMSG_CONFIRM_RESPEC_WIPE = 0x316C, - CMSG_CONNECT_TO_FAILED = 0x3552, - CMSG_CONVERT_RAID = 0x35D5, - CMSG_CREATE_CHARACTER = 0x35CA, - CMSG_CREATE_SHIPMENT = 0x3236, - CMSG_DB_QUERY_BULK = 0x3566, - CMSG_DECLINE_GUILD_INVITES = 0x3487, - CMSG_DECLINE_PETITION = 0x349A, - CMSG_DELETE_EQUIPMENT_SET = 0x3478, - CMSG_DEL_FRIEND = 0x365F, - CMSG_DEL_IGNORE = 0x3663, - CMSG_DEPOSIT_REAGENT_BANK = 0x326E, - CMSG_DESTROY_ITEM = 0x31E0, - CMSG_DF_BOOT_PLAYER_VOTE = 0x359B, - CMSG_DF_GET_JOIN_STATUS = 0x3597, - CMSG_DF_GET_SYSTEM_INFO = 0x3596, - CMSG_DF_JOIN = 0x3588, - CMSG_DF_LEAVE = 0x3593, - CMSG_DF_PROPOSAL_RESPONSE = 0x3587, - CMSG_DF_READY_CHECK_RESPONSE = 0x359E, - CMSG_DF_SEARCH_JOIN = 0x3594, - CMSG_DF_SEARCH_LEAVE = 0x3595, - CMSG_DF_SET_COMMENT = 0x3598, - CMSG_DF_SET_ROLES = 0x3599, - CMSG_DF_TELEPORT = 0x359C, - CMSG_DISCARDED_TIME_SYNC_ACKS = 0x39B4, - CMSG_DISMISS_CRITTER = 0x3465, - CMSG_DO_MASTER_LOOT_ROLL = 0x3171, - CMSG_DO_READY_CHECK = 0x35BA, - CMSG_DUEL_RESPONSE = 0x344B, - CMSG_EJECT_PASSENGER = 0x3198, - CMSG_EMOTE = 0x34A7, - CMSG_ENABLE_NAGLE = 0x36E8, - CMSG_ENABLE_TAXI_NODE = 0x341D, - CMSG_ENGINE_SURVEY = 0x3672, - CMSG_ENUM_CHARACTERS = 0x3568, - CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x366C, - CMSG_FAR_SIGHT = 0x3450, - CMSG_GAME_OBJ_REPORT_USE = 0x3459, - CMSG_GAME_OBJ_USE = 0x3458, - CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x3227, - CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x3219, - CMSG_GARRISON_CHECK_UPGRADEABLE = 0x3261, - CMSG_GARRISON_COMPLETE_MISSION = 0x3254, - CMSG_GARRISON_GENERATE_RECRUITS = 0x322A, - CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x3232, - CMSG_GARRISON_MISSION_BONUS_ROLL = 0x3256, - CMSG_GARRISON_PURCHASE_BUILDING = 0x3215, - CMSG_GARRISON_RECRUIT_FOLLOWER = 0x322C, - CMSG_GARRISON_REMOVE_FOLLOWER = 0x324B, - CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x3228, - CMSG_GARRISON_RENAME_FOLLOWER = 0x3229, - CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x3214, - CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x3235, - CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x3234, - CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x3216, - CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x3226, - CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x3222, - CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x322B, - CMSG_GARRISON_START_MISSION = 0x3253, - CMSG_GARRISON_SWAP_BUILDINGS = 0x321A, - CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x3567, - CMSG_GET_CHALLENGE_MODE_REWARDS = 0x300F, - CMSG_GET_GARRISON_INFO = 0x320F, - CMSG_GET_ITEM_PURCHASE_DATA = 0x3495, - CMSG_GET_MIRROR_IMAGE_DATA = 0x31E4, - CMSG_GET_PVP_OPTIONS_ENABLED = 0x356E, - CMSG_GET_REMAINING_GAME_TIME = 0x367B, - CMSG_GET_TROPHY_LIST = 0x3244, - CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x366E, - CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3622, - CMSG_GM_TICKET_GET_CASE_STATUS = 0x3621, - CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x3620, - CMSG_GOSSIP_SELECT_OPTION = 0x3406, - CMSG_GRANT_LEVEL = 0x3461, - CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x300B, - CMSG_GUILD_ADD_RANK = 0x2FE2, - CMSG_GUILD_ASSIGN_MEMBER_RANK = 0x2FDD, - CMSG_GUILD_AUTO_DECLINE_INVITATION = 0x2FDF, - CMSG_GUILD_BANK_ACTIVATE = 0x342A, - CMSG_GUILD_BANK_BUY_TAB = 0x342D, - CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x342F, - CMSG_GUILD_BANK_LOG_QUERY = 0x3000, - CMSG_GUILD_BANK_QUERY_TAB = 0x342C, - CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x3001, - CMSG_GUILD_BANK_SET_TAB_TEXT = 0x3004, - CMSG_GUILD_BANK_SWAP_ITEMS = 0x342B, - CMSG_GUILD_BANK_TEXT_QUERY = 0x3005, - CMSG_GUILD_BANK_UPDATE_TAB = 0x342E, - CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x3430, - CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x2FF9, - CMSG_GUILD_CHANGE_NAME_REQUEST = 0x2FFC, - CMSG_GUILD_DECLINE_INVITATION = 0x2FDE, - CMSG_GUILD_DELETE = 0x2FE6, - CMSG_GUILD_DELETE_RANK = 0x2FE3, - CMSG_GUILD_DEMOTE_MEMBER = 0x2FDC, - CMSG_GUILD_EVENT_LOG_QUERY = 0x3003, - CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0x2FEF, - CMSG_GUILD_GET_RANKS = 0x2FEB, - CMSG_GUILD_GET_ROSTER = 0x2FF1, - CMSG_GUILD_INVITE_BY_NAME = 0x3586, - CMSG_GUILD_LEAVE = 0x2FE0, - CMSG_GUILD_MEMBER_SEND_SOR_REQUEST = 0x300A, - CMSG_GUILD_NEWS_UPDATE_STICKY = 0x2FEC, - CMSG_GUILD_OFFICER_REMOVE_MEMBER = 0x2FE1, - CMSG_GUILD_PERMISSIONS_QUERY = 0x3002, - CMSG_GUILD_PROMOTE_MEMBER = 0x2FDB, - CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE = 0x2FE9, - CMSG_GUILD_QUERY_MEMBER_RECIPES = 0x2FE7, - CMSG_GUILD_QUERY_NEWS = 0x2FEA, - CMSG_GUILD_QUERY_RECIPES = 0x2FE8, - CMSG_GUILD_REPLACE_GUILD_MASTER = 0x3006, - CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x2FED, - CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x2FEE, - CMSG_GUILD_SET_GUILD_MASTER = 0x3653, - CMSG_GUILD_SET_MEMBER_NOTE = 0x2FF0, - CMSG_GUILD_SET_RANK_PERMISSIONS = 0x2FE5, - CMSG_GUILD_SHIFT_RANK = 0x2FE4, - CMSG_GUILD_UPDATE_INFO_TEXT = 0x2FF3, - CMSG_GUILD_UPDATE_MOTD_TEXT = 0x2FF2, - CMSG_HEARTH_AND_RESURRECT = 0x3474, - CMSG_IGNORE_TRADE = 0x30D7, - CMSG_INCREASE_CAST_TIME_FOR_SPELL = 0x3169, - CMSG_INITIATE_ROLE_POLL = 0x3557, - CMSG_INITIATE_TRADE = 0x30D4, - CMSG_INSPECT = 0x3490, - CMSG_INSPECT_PVP = 0x3631, - CMSG_INSTANCE_LOCK_RESPONSE = 0x3479, - CMSG_ITEM_PURCHASE_REFUND = 0x3496, - CMSG_ITEM_TEXT_QUERY = 0x3262, - CMSG_JOIN_PET_BATTLE_QUEUE = 0x3143, - CMSG_JOIN_RATED_BATTLEGROUND = 0x30F4, - CMSG_KEEP_ALIVE = 0x360F, - CMSG_KEYBOUND_OVERRIDE = 0x3183, - CMSG_LEARN_PET_SPECIALIZATION_GROUP = 0x3124, - CMSG_LEARN_TALENTS = 0x3123, - CMSG_LEAVE_GROUP = 0x35D0, - CMSG_LEAVE_PET_BATTLE_QUEUE = 0x3144, - CMSG_LFG_LIST_APPLY_TO_GROUP = 0x358E, - CMSG_LFG_LIST_CANCEL_APPLICATION = 0x358F, - CMSG_LFG_LIST_DECLINE_APPLICANT = 0x3590, - CMSG_LFG_LIST_GET_STATUS = 0x358C, - CMSG_LFG_LIST_INVITE_APPLICANT = 0x3591, - CMSG_LFG_LIST_INVITE_RESPONSE = 0x3592, - CMSG_LFG_LIST_JOIN = 0x3589, - CMSG_LFG_LIST_LEAVE = 0x358B, - CMSG_LFG_LIST_SEARCH = 0x358D, - CMSG_LFG_LIST_UPDATE_REQUEST = 0x358A, - CMSG_LF_GUILD_ADD_RECRUIT = 0x35A3, - CMSG_LF_GUILD_BROWSE = 0x35A5, - CMSG_LF_GUILD_DECLINE_RECRUIT = 0x2FF6, - CMSG_LF_GUILD_GET_APPLICATIONS = 0x2FF7, - CMSG_LF_GUILD_GET_GUILD_POST = 0x2FF4, - CMSG_LF_GUILD_GET_RECRUITS = 0x2FF5, - CMSG_LF_GUILD_REMOVE_RECRUIT = 0x2FF8, - CMSG_LF_GUILD_SET_GUILD_POST = 0x35A4, - CMSG_LIST_INVENTORY = 0x3415, - CMSG_LOADING_SCREEN_NOTIFY = 0x3577, - CMSG_LOAD_SELECTED_TROPHY = 0x3245, - CMSG_LOGOUT_CANCEL = 0x3441, - CMSG_LOGOUT_INSTANT = 0x3442, - CMSG_LOGOUT_REQUEST = 0x3440, - CMSG_LOG_DISCONNECT = 0x36E6, - CMSG_LOG_STREAMING_ERROR = 0x36EA, - CMSG_LOOT_ITEM = 0x316F, - CMSG_LOOT_MONEY = 0x316E, - CMSG_LOOT_RELEASE = 0x3173, - CMSG_LOOT_ROLL = 0x3174, - CMSG_LOOT_UNIT = 0x316D, - CMSG_LOW_LEVEL_RAID1 = 0x362F, - CMSG_LOW_LEVEL_RAID2 = 0x347F, - CMSG_MAIL_CREATE_TEXT_ITEM = 0x34A1, - CMSG_MAIL_DELETE = 0x3185, - CMSG_MAIL_GET_LIST = 0x349C, - CMSG_MAIL_MARK_AS_READ = 0x34A0, - CMSG_MAIL_RETURN_TO_SENDER = 0x35DF, - CMSG_MAIL_TAKE_ITEM = 0x349E, - CMSG_MAIL_TAKE_MONEY = 0x349D, - CMSG_MASTER_LOOT_ITEM = 0x3170, - CMSG_MINIMAP_PING = 0x35D2, - CMSG_MISSILE_TRAJECTORY_COLLISION = 0x3107, - CMSG_MOUNT_SET_FAVORITE = 0x35B8, - CMSG_MOUNT_SPECIAL_ANIM = 0x31D6, - CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x398C, - CMSG_MOVE_CHANGE_TRANSPORT = 0x39A4, - CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x39A9, - CMSG_MOVE_CHARM_TELEPORT_CHEAT = 0x3972, - CMSG_MOVE_DISMISS_VEHICLE = 0x39A8, - CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x3999, - CMSG_MOVE_FALL_LAND = 0x3975, - CMSG_MOVE_FALL_RESET = 0x3990, - CMSG_MOVE_FEATHER_FALL_ACK = 0x3992, - CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x39A3, - CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x39A2, - CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x39A7, - CMSG_MOVE_FORCE_ROOT_ACK = 0x3985, - CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x3983, - CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x3982, - CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x3997, - CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x3984, - CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x3998, - CMSG_MOVE_FORCE_UNROOT_ACK = 0x3986, - CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x3996, - CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x39AA, - CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x39AB, - CMSG_MOVE_HEARTBEAT = 0x3987, - CMSG_MOVE_HOVER_ACK = 0x398A, - CMSG_MOVE_JUMP = 0x3968, - CMSG_MOVE_KNOCK_BACK_ACK = 0x3989, - CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x398E, - CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x398D, - CMSG_MOVE_SET_CAN_FLY_ACK = 0x399C, - CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x399A, - CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x39AE, - CMSG_MOVE_SET_FACING = 0x3980, - CMSG_MOVE_SET_FLY = 0x399D, - CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK = 0x399B, - CMSG_MOVE_SET_PITCH = 0x3981, - CMSG_MOVE_SET_RELATIVE_POSITION = 0x3973, - CMSG_MOVE_SET_RUN_MODE = 0x396F, - CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x398B, - CMSG_MOVE_SET_WALK_MODE = 0x3970, - CMSG_MOVE_SPLINE_DONE = 0x398F, - CMSG_MOVE_START_ASCEND = 0x399E, - CMSG_MOVE_START_BACKWARD = 0x3963, - CMSG_MOVE_START_DESCEND = 0x39A5, - CMSG_MOVE_START_FORWARD = 0x3962, - CMSG_MOVE_START_PITCH_DOWN = 0x396D, - CMSG_MOVE_START_PITCH_UP = 0x396C, - CMSG_MOVE_START_STRAFE_LEFT = 0x3965, - CMSG_MOVE_START_STRAFE_RIGHT = 0x3966, - CMSG_MOVE_START_SWIM = 0x3976, - CMSG_MOVE_START_TURN_LEFT = 0x3969, - CMSG_MOVE_START_TURN_RIGHT = 0x396A, - CMSG_MOVE_STOP = 0x3964, - CMSG_MOVE_STOP_ASCEND = 0x399F, - CMSG_MOVE_STOP_PITCH = 0x396E, - CMSG_MOVE_STOP_STRAFE = 0x3967, - CMSG_MOVE_STOP_SWIM = 0x3977, - CMSG_MOVE_STOP_TURN = 0x396B, - CMSG_MOVE_TELEPORT_ACK = 0x3974, - CMSG_MOVE_TELEPORT_CHEAT = 0x3971, - CMSG_MOVE_TIME_SKIPPED = 0x3991, - CMSG_MOVE_TOGGLE_COLLISION_CHEAT = 0x397F, - CMSG_MOVE_WATER_WALK_ACK = 0x3993, - CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x3139, - CMSG_NEXT_CINEMATIC_CAMERA = 0x34AA, - CMSG_OBJECT_UPDATE_FAILED = 0x30FD, - CMSG_OBJECT_UPDATE_RESCUED = 0x30FE, - CMSG_OFFER_PETITION = 0x3640, - CMSG_OPENING_CINEMATIC = 0x34A9, - CMSG_OPEN_ITEM = 0x3263, - CMSG_OPEN_MISSION_NPC = 0x322E, - CMSG_OPEN_SHIPMENT_NPC = 0x3233, - CMSG_OPEN_TRADESKILL_NPC = 0x323B, - CMSG_OPT_OUT_OF_LOOT = 0x3460, - CMSG_PARTY_INVITE = 0x3581, - CMSG_PARTY_INVITE_RESPONSE = 0x3582, - CMSG_PARTY_UNINVITE = 0x35CE, - CMSG_PETITION_BUY = 0x3432, - CMSG_PETITION_RENAME_GUILD = 0x3654, - CMSG_PETITION_SHOW_LIST = 0x3431, - CMSG_PETITION_SHOW_SIGNATURES = 0x3433, - CMSG_PET_ABANDON = 0x33FF, - CMSG_PET_ACTION = 0x33FD, - CMSG_PET_BATTLE_FINAL_NOTIFY = 0x3147, - CMSG_PET_BATTLE_INPUT = 0x35C7, - CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x3184, - CMSG_PET_BATTLE_QUIT_NOTIFY = 0x3146, - CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x35C8, - CMSG_PET_BATTLE_REQUEST_PVP = 0x3141, - CMSG_PET_BATTLE_REQUEST_UPDATE = 0x3142, - CMSG_PET_BATTLE_REQUEST_WILD = 0x313F, - CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x3148, - CMSG_PET_CANCEL_AURA = 0x3400, - CMSG_PET_CAST_SPELL = 0x31E8, - CMSG_PET_RENAME = 0x3615, - CMSG_PET_SET_ACTION = 0x33FC, - CMSG_PET_SPELL_AUTOCAST = 0x3401, - CMSG_PET_STOP_ATTACK = 0x33FE, - CMSG_PING = 0x36E5, - CMSG_PLAYER_LOGIN = 0x356A, - CMSG_PROTOCOL_MISMATCH = 0x36EB, - CMSG_PUSH_QUEST_TO_PARTY = 0x3413, - CMSG_PVP_LOG_DATA = 0x30F8, - CMSG_QUERY_BATTLE_PET_NAME = 0x31CB, - CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x35EC, - CMSG_QUERY_CORPSE_TRANSPORT = 0x35ED, - CMSG_QUERY_COUNTDOWN_TIMER = 0x3121, - CMSG_QUERY_CREATURE = 0x31C5, - CMSG_QUERY_GAME_OBJECT = 0x31C6, - CMSG_QUERY_GARRISON_CREATURE_NAME = 0x31CC, - CMSG_QUERY_GUILD_INFO = 0x361D, - CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x346F, - CMSG_QUERY_NEXT_MAIL_TIME = 0x349F, - CMSG_QUERY_NPC_TEXT = 0x31C7, - CMSG_QUERY_PAGE_TEXT = 0x31C9, - CMSG_QUERY_PETITION = 0x31CD, - CMSG_QUERY_PET_NAME = 0x31CA, - CMSG_QUERY_PLAYER_NAME = 0x361B, - CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x30F1, - CMSG_QUERY_QUEST_INFO = 0x31C8, - CMSG_QUERY_REALM_NAME = 0x361C, - CMSG_QUERY_SCENARIO_POI = 0x35E0, - CMSG_QUERY_TIME = 0x343F, - CMSG_QUERY_VOID_STORAGE = 0x311A, - CMSG_QUEST_CONFIRM_ACCEPT = 0x3412, - CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x340B, - CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x340E, - CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x340C, - CMSG_QUEST_GIVER_HELLO = 0x3408, - CMSG_QUEST_GIVER_QUERY_QUEST = 0x3409, - CMSG_QUEST_GIVER_REQUEST_REWARD = 0x340F, - CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x3411, - CMSG_QUEST_GIVER_STATUS_QUERY = 0x3410, - CMSG_QUEST_LOG_REMOVE_QUEST = 0x3494, - CMSG_QUEST_POI_QUERY = 0x3641, - CMSG_QUEST_PUSH_RESULT = 0x3414, - CMSG_QUEUED_MESSAGES_END = 0x36E9, - CMSG_RANDOM_ROLL = 0x35DB, - CMSG_READY_CHECK_RESPONSE = 0x35BB, - CMSG_READ_ITEM = 0x3264, - CMSG_RECLAIM_CORPSE = 0x3444, - CMSG_RECRUIT_A_FRIEND = 0x365A, - CMSG_REDEEM_WOW_TOKEN_CONFIRM = 0x367D, - CMSG_REDEEM_WOW_TOKEN_START = 0x367C, - CMSG_REORDER_CHARACTERS = 0x3569, - CMSG_REPAIR_ITEM = 0x3454, - CMSG_REPLACE_TROPHY = 0x3246, - CMSG_REPOP_REQUEST = 0x348D, - CMSG_REPORT_PVP_PLAYER_AFK = 0x345E, - CMSG_REQUEST_ACCOUNT_DATA = 0x3625, - CMSG_REQUEST_BATTLEFIELD_STATUS = 0x355C, - CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x30FA, - CMSG_REQUEST_CEMETERY_LIST = 0x30F2, - CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x31FF, - CMSG_REQUEST_FORCED_REACTIONS = 0x3168, - CMSG_REQUEST_GUILD_PARTY_STATE = 0x3120, - CMSG_REQUEST_GUILD_REWARDS_LIST = 0x311F, - CMSG_REQUEST_HONOR_STATS = 0x30F7, - CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x31EF, - CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x3576, - CMSG_REQUEST_PARTY_MEMBER_STATS = 0x35DA, - CMSG_REQUEST_PET_INFO = 0x3402, - CMSG_REQUEST_PLAYED_TIME = 0x31D1, - CMSG_REQUEST_PVP_REWARDS = 0x310E, - CMSG_REQUEST_RAID_INFO = 0x3655, - CMSG_REQUEST_RATED_BATTLEFIELD_INFO = 0x3564, - CMSG_REQUEST_RESEARCH_HISTORY = 0x30E5, - CMSG_REQUEST_STABLED_PETS = 0x3403, - CMSG_REQUEST_VEHICLE_EXIT = 0x3193, - CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x3194, - CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x3195, - CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x3196, - CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x3675, - CMSG_RESET_CHALLENGE_MODE = 0x3166, - CMSG_RESET_INSTANCES = 0x35F8, - CMSG_RESURRECT_RESPONSE = 0x3614, - CMSG_REVERT_MONUMENT_APPEARANCE = 0x3248, - CMSG_RIDE_VEHICLE_INTERACT = 0x3197, - CMSG_SAVE_CUF_PROFILES = 0x3108, - CMSG_SAVE_EQUIPMENT_SET = 0x3477, - CMSG_SAVE_GUILD_EMBLEM = 0x31F4, - CMSG_SCENE_PLAYBACK_CANCELED = 0x3180, - CMSG_SCENE_PLAYBACK_COMPLETE = 0x317F, - CMSG_SCENE_TRIGGER_EVENT = 0x3181, - CMSG_SELF_RES = 0x3497, - CMSG_SELL_ITEM = 0x3416, - CMSG_SELL_WOW_TOKEN_CONFIRM = 0x3677, - CMSG_SELL_WOW_TOKEN_START = 0x3676, - CMSG_SEND_CONTACT_LIST = 0x365D, - CMSG_SEND_MAIL = 0x3579, - CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x35A8, - CMSG_SEND_TEXT_EMOTE = 0x33F9, - CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x3186, - CMSG_SET_ACTION_BAR_TOGGLES = 0x3498, - CMSG_SET_ACTION_BUTTON = 0x35BC, - CMSG_SET_ACTIVE_MOVER = 0x39AF, - CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x35DC, - CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x3200, - CMSG_SET_ASSISTANT_LEADER = 0x35D6, - CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x3267, - CMSG_SET_BANK_AUTOSORT_DISABLED = 0x3268, - CMSG_SET_BANK_BAG_SLOT_FLAG = 0x3266, - CMSG_SET_CONTACT_NOTES = 0x3660, - CMSG_SET_CURRENCY_FLAGS = 0x30E7, - CMSG_SET_DIFFICULTY_ID = 0x3182, - CMSG_SET_DUNGEON_DIFFICULTY = 0x3612, - CMSG_SET_EVERYONE_IS_ASSISTANT = 0x359D, - CMSG_SET_FACTION_AT_WAR = 0x3447, - CMSG_SET_FACTION_INACTIVE = 0x3449, - CMSG_SET_FACTION_NOT_AT_WAR = 0x3448, - CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x326A, - CMSG_SET_LFG_BONUS_FACTION_ID = 0x31EE, - CMSG_SET_LOOT_METHOD = 0x35CF, - CMSG_SET_LOOT_SPECIALIZATION = 0x34A5, - CMSG_SET_PARTY_ASSIGNMENT = 0x35D8, - CMSG_SET_PARTY_LEADER = 0x35D1, - CMSG_SET_PET_SLOT = 0x30E6, - CMSG_SET_PLAYER_DECLINED_NAMES = 0x361A, - CMSG_SET_PREFERRED_CEMETERY = 0x30F3, - CMSG_SET_PVP = 0x31F8, - CMSG_SET_RAID_DIFFICULTY = 0x366A, - CMSG_SET_ROLE = 0x3556, - CMSG_SET_SAVED_INSTANCE_EXTEND = 0x3618, - CMSG_SET_SELECTION = 0x348F, - CMSG_SET_SHEATHED = 0x33FA, - CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x3269, - CMSG_SET_SPECIALIZATION = 0x3122, - CMSG_SET_TAXI_BENCHMARK_MODE = 0x345D, - CMSG_SET_TITLE = 0x31D4, - CMSG_SET_TRADE_CURRENCY = 0x30DE, - CMSG_SET_TRADE_GOLD = 0x30DD, - CMSG_SET_TRADE_ITEM = 0x30DB, - CMSG_SET_USING_PARTY_GARRISON = 0x322F, - CMSG_SET_WATCHED_FACTION = 0x344A, - CMSG_SHOWING_CLOAK = 0x3456, - CMSG_SHOWING_HELM = 0x3455, - CMSG_SHOW_TRADE_SKILL = 0x3650, - CMSG_SIGN_PETITION = 0x3499, - CMSG_SILENCE_PARTY_TALKER = 0x35D9, - CMSG_SOCKET_GEMS = 0x3453, - CMSG_SORT_BAGS = 0x326B, - CMSG_SORT_BANK_BAGS = 0x326C, - CMSG_SORT_REAGENT_BANK_BAGS = 0x326D, - CMSG_SPELL_CLICK = 0x3407, - CMSG_SPIRIT_HEALER_ACTIVATE = 0x3423, - CMSG_SPLIT_ITEM = 0x391C, - CMSG_STAND_STATE_CHANGE = 0x3106, - CMSG_START_SPECTATOR_WAR_GAME = 0x355F, - CMSG_START_WAR_GAME = 0x355E, - CMSG_SUMMON_RESPONSE = 0x35FA, - CMSG_SUPPORT_TICKET_SUBMIT_BUG = 0x35CC, - CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x35CB, - CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x35CD, - CMSG_SUSPEND_COMMS_ACK = 0x36E2, - CMSG_SUSPEND_TOKEN_RESPONSE = 0x36E7, - CMSG_SWAP_INV_ITEM = 0x391B, - CMSG_SWAP_ITEM = 0x391A, - CMSG_SWAP_SUB_GROUPS = 0x35D4, - CMSG_SWAP_VOID_ITEM = 0x311C, - CMSG_TABARD_VENDOR_ACTIVATE = 0x31F5, - CMSG_TALK_TO_GOSSIP = 0x3404, - CMSG_TAXI_NODE_STATUS_QUERY = 0x341C, - CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x341E, - CMSG_TAXI_REQUEST_EARLY_LANDING = 0x3420, - CMSG_TELEPORT_TO_UNIT = 0x35F1, - CMSG_TIME_ADJUSTMENT_RESPONSE = 0x39B3, - CMSG_TIME_SYNC_RESPONSE = 0x39B0, - CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x39B2, - CMSG_TIME_SYNC_RESPONSE_FAILED = 0x39B1, - CMSG_TOGGLE_DIFFICULTY = 0x35E1, - CMSG_TOGGLE_PVP = 0x31F7, - CMSG_TOTEM_DESTROYED = 0x3464, - CMSG_TOY_SET_FAVORITE = 0x35B9, - CMSG_TRAINER_BUY_SPELL = 0x3422, - CMSG_TRAINER_LIST = 0x3421, - CMSG_TRANSMOGRIFY_ITEMS = 0x310F, - CMSG_TURN_IN_PETITION = 0x349B, - CMSG_TUTORIAL = 0x366B, - CMSG_TWITTER_CHECK_STATUS = 0x30A8, - CMSG_TWITTER_CONNECT = 0x30A5, - CMSG_TWITTER_DISCONNECT = 0x30A9, - CMSG_TWITTER_POST = 0x326F, - CMSG_UI_TIME_REQUEST = 0x362A, - CMSG_UNACCEPT_TRADE = 0x30D9, - CMSG_UNDELETE_CHARACTER = 0x366D, - CMSG_UNLEARN_SKILL = 0x344D, - CMSG_UNLEARN_SPECIALIZATION = 0x311D, - CMSG_UNLOCK_VOID_STORAGE = 0x3119, - CMSG_UPDATE_ACCOUNT_DATA = 0x3626, - CMSG_UPDATE_CLIENT_SETTINGS = 0x35F4, - CMSG_UPDATE_MISSILE_TRAJECTORY = 0x39B6, - CMSG_UPDATE_RAID_TARGET = 0x35D7, - CMSG_UPDATE_VAS_PURCHASE_STATES = 0x3682, - CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST = 0x367E, - CMSG_UPDATE_WOW_TOKEN_COUNT = 0x3674, - CMSG_UPGRADE_GARRISON = 0x3208, - CMSG_UPGRADE_ITEM = 0x3187, - CMSG_USED_FOLLOW = 0x3103, - CMSG_USE_CRITTER_ITEM = 0x319E, - CMSG_USE_EQUIPMENT_SET = 0x3913, - CMSG_USE_ITEM = 0x31E5, - CMSG_USE_TOY = 0x31E7, - CMSG_VIOLENCE_LEVEL = 0x3101, - CMSG_VOICE_ADD_IGNORE = 0x35DD, - CMSG_VOICE_DEL_IGNORE = 0x35DE, - CMSG_VOICE_SESSION_ENABLE = 0x3613, - CMSG_VOID_STORAGE_TRANSFER = 0x311B, - CMSG_WARDEN_DATA = 0x356C, - CMSG_WHO = 0x3611, - CMSG_WHO_IS = 0x3610, - CMSG_WORLD_PORT_RESPONSE = 0x3578, - CMSG_WORLD_TELEPORT = 0x3562, - CMSG_WRAP_ITEM = 0x3912, + CMSG_ACCEPT_GUILD_INVITE = 0x35FA, + CMSG_ACCEPT_LEVEL_GRANT = 0x34ED, + CMSG_ACCEPT_TRADE = 0x315A, + CMSG_ACCEPT_WARGAME_INVITE = 0x35E0, + CMSG_ACTIVATE_TAXI = 0x34AA, + CMSG_ADDON_LIST = 0x35D8, + CMSG_ADD_BATTLENET_FRIEND = 0x365F, + CMSG_ADD_FRIEND = 0x36D5, + CMSG_ADD_IGNORE = 0x36D9, + CMSG_ADD_TOY = 0x3273, + CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0x31E9, + CMSG_ADVENTURE_JOURNAL_START_QUEST = 0x331B, + CMSG_ALTER_APPEARANCE = 0x34E9, + CMSG_AREA_SPIRIT_HEALER_QUERY = 0x34AF, + CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x34B0, + CMSG_AREA_TRIGGER = 0x31BF, + CMSG_ARTIFACT_ADD_POWER = 0x31A3, + CMSG_ARTIFACT_SET_APPEARANCE = 0x31A5, + CMSG_ATTACK_STOP = 0x3239, + CMSG_ATTACK_SWING = 0x3238, + CMSG_AUCTION_HELLO_REQUEST = 0x34BF, + CMSG_AUCTION_LIST_BIDDER_ITEMS = 0x34C5, + CMSG_AUCTION_LIST_ITEMS = 0x34C2, + CMSG_AUCTION_LIST_OWNER_ITEMS = 0x34C4, + CMSG_AUCTION_LIST_PENDING_SALES = 0x34C7, + CMSG_AUCTION_PLACE_BID = 0x34C6, + CMSG_AUCTION_REMOVE_ITEM = 0x34C1, + CMSG_AUCTION_REPLICATE_ITEMS = 0x34C3, + CMSG_AUCTION_SELL_ITEM = 0x34C0, + CMSG_AUTH_CONTINUED_SESSION = 0x3766, + CMSG_AUTH_SESSION = 0x3765, + 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 = 0x34B2, + CMSG_BATTLEFIELD_LEAVE = 0x3171, + CMSG_BATTLEFIELD_LIST = 0x317C, + CMSG_BATTLEFIELD_PORT = 0x3517, + CMSG_BATTLEMASTER_HELLO = 0x3288, + CMSG_BATTLEMASTER_JOIN = 0x3514, + CMSG_BATTLEMASTER_JOIN_ARENA = 0x3515, + CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x3516, + 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_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 = 0x3628, + CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x31C8, + CMSG_BEGIN_TRADE = 0x3157, + CMSG_BINDER_ACTIVATE = 0x34B1, + CMSG_BLACK_MARKET_BID_ON_ITEM = 0x351E, + CMSG_BLACK_MARKET_OPEN = 0x351C, + CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x351D, + CMSG_BUG_REPORT = 0x368C, + CMSG_BUSY_TRADE = 0x3158, + CMSG_BUY_BACK_ITEM = 0x34A3, + CMSG_BUY_BANK_SLOT = 0x34B3, + CMSG_BUY_ITEM = 0x34A2, + CMSG_BUY_REAGENT_BANK = 0x34B4, + CMSG_BUY_WOW_TOKEN_CONFIRM = 0x36F1, + CMSG_BUY_WOW_TOKEN_START = 0x36F0, + CMSG_CAGE_BATTLE_PET = 0x31D9, + 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_CANCEL_AURA = 0x31A7, + CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x34DB, + CMSG_CANCEL_CAST = 0x3278, + CMSG_CANCEL_CHANNELLING = 0x3246, + CMSG_CANCEL_GROWTH_AURA = 0x324B, + CMSG_CANCEL_MASTER_LOOT_ROLL = 0x31F7, + CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x31A6, + CMSG_CANCEL_MOUNT_AURA = 0x325C, + CMSG_CANCEL_QUEUED_SPELL = 0x317D, + CMSG_CANCEL_TEMP_ENCHANTMENT = 0x34E6, + CMSG_CANCEL_TRADE = 0x315C, + CMSG_CAN_DUEL = 0x3667, + CMSG_CAST_SPELL = 0x3276, + CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x308F, + CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS = 0x308E, + CMSG_CHANGE_BAG_SLOT_FLAG = 0x32FD, + CMSG_CHANGE_MONUMENT_APPEARANCE = 0x32DD, + CMSG_CHANGE_SUB_GROUP = 0x364D, + CMSG_CHARACTER_RENAME_REQUEST = 0x36C4, + CMSG_CHAR_CUSTOMIZE = 0x3694, + CMSG_CHAR_DELETE = 0x36A1, + CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x369A, + CMSG_CHAT_ADDON_MESSAGE_CHANNEL = 0x37D0, + CMSG_CHAT_ADDON_MESSAGE_GUILD = 0x37D4, + CMSG_CHAT_ADDON_MESSAGE_INSTANCE_CHAT = 0x37F7, + CMSG_CHAT_ADDON_MESSAGE_OFFICER = 0x37D6, + CMSG_CHAT_ADDON_MESSAGE_PARTY = 0x37F3, + CMSG_CHAT_ADDON_MESSAGE_RAID = 0x37F5, + CMSG_CHAT_ADDON_MESSAGE_WHISPER = 0x37D2, + CMSG_CHAT_CHANNEL_ANNOUNCEMENTS = 0x37E7, + CMSG_CHAT_CHANNEL_BAN = 0x37E5, + CMSG_CHAT_CHANNEL_DECLINE_INVITE = 0x37EE, + CMSG_CHAT_CHANNEL_DISPLAY_LIST = 0x37DA, + CMSG_CHAT_CHANNEL_INVITE = 0x37E3, + CMSG_CHAT_CHANNEL_KICK = 0x37E4, + CMSG_CHAT_CHANNEL_LIST = 0x37D9, + CMSG_CHAT_CHANNEL_MODERATE = 0x37DE, + CMSG_CHAT_CHANNEL_MODERATOR = 0x37DF, + CMSG_CHAT_CHANNEL_MUTE = 0x37E1, + CMSG_CHAT_CHANNEL_OWNER = 0x37DD, + CMSG_CHAT_CHANNEL_PASSWORD = 0x37DB, + CMSG_CHAT_CHANNEL_SET_OWNER = 0x37DC, + CMSG_CHAT_CHANNEL_SILENCE_ALL = 0x37EA, + CMSG_CHAT_CHANNEL_SILENCE_VOICE = 0x37E8, + CMSG_CHAT_CHANNEL_UNBAN = 0x37E6, + CMSG_CHAT_CHANNEL_UNMODERATOR = 0x37E0, + CMSG_CHAT_CHANNEL_UNMUTE = 0x37E2, + CMSG_CHAT_CHANNEL_UNSILENCE_ALL = 0x37EB, + CMSG_CHAT_CHANNEL_UNSILENCE_VOICE = 0x37E9, + CMSG_CHAT_CHANNEL_VOICE_OFF = 0x37ED, + CMSG_CHAT_CHANNEL_VOICE_ON = 0x37EC, + CMSG_CHAT_JOIN_CHANNEL = 0x37C8, + CMSG_CHAT_LEAVE_CHANNEL = 0x37C9, + CMSG_CHAT_MESSAGE_AFK = 0x37D7, + CMSG_CHAT_MESSAGE_CHANNEL = 0x37CF, + CMSG_CHAT_MESSAGE_DND = 0x37D8, + CMSG_CHAT_MESSAGE_EMOTE = 0x37F0, + CMSG_CHAT_MESSAGE_GUILD = 0x37D3, + CMSG_CHAT_MESSAGE_INSTANCE_CHAT = 0x37F6, + CMSG_CHAT_MESSAGE_OFFICER = 0x37D5, + CMSG_CHAT_MESSAGE_PARTY = 0x37F2, + CMSG_CHAT_MESSAGE_RAID = 0x37F4, + CMSG_CHAT_MESSAGE_RAID_WARNING = 0x37F8, + CMSG_CHAT_MESSAGE_SAY = 0x37EF, + CMSG_CHAT_MESSAGE_WHISPER = 0x37D1, + CMSG_CHAT_MESSAGE_YELL = 0x37F1, + CMSG_CHAT_REGISTER_ADDON_PREFIXES = 0x37CD, + 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_CHOICE_RESPONSE = 0x327A, + CMSG_CLEAR_RAID_MARKER = 0x319F, + CMSG_CLEAR_TRADE_ITEM = 0x315E, + CMSG_CLIENT_PORT_GRAVEYARD = 0x3519, + CMSG_CLOSE_INTERACTION = 0x348E, + CMSG_COMMENTATOR_ENABLE = 0x35EF, + CMSG_COMMENTATOR_ENTER_INSTANCE = 0x35F2, + CMSG_COMMENTATOR_EXIT_INSTANCE = 0x35F3, + CMSG_COMMENTATOR_GET_MAP_INFO = 0x35F0, + CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x35F1, + CMSG_COMMENTATOR_START_WARGAME = 0x35EE, + CMSG_COMPLAINT = 0x3671, + CMSG_COMPLETE_CINEMATIC = 0x3536, + CMSG_COMPLETE_MOVIE = 0x34D1, + CMSG_CONFIRM_ARTIFACT_RESPEC = 0x31A4, + CMSG_CONFIRM_RESPEC_WIPE = 0x31F1, + CMSG_CONNECT_TO_FAILED = 0x35D4, + CMSG_CONVERT_RAID = 0x364F, + CMSG_CREATE_CHARACTER = 0x3644, + CMSG_CREATE_SHIPMENT = 0x32C9, + CMSG_DB_QUERY_BULK = 0x35E5, + CMSG_DECLINE_GUILD_INVITES = 0x3512, + CMSG_DECLINE_PETITION = 0x3525, + CMSG_DELETE_EQUIPMENT_SET = 0x3500, + CMSG_DEL_FRIEND = 0x36D6, + CMSG_DEL_IGNORE = 0x36DA, + CMSG_DEPOSIT_REAGENT_BANK = 0x3306, + CMSG_DESTROY_ITEM = 0x326D, + 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 = 0x34EF, + CMSG_DO_MASTER_LOOT_ROLL = 0x31F6, + CMSG_DO_READY_CHECK = 0x3634, + CMSG_DUEL_RESPONSE = 0x34D6, + CMSG_EJECT_PASSENGER = 0x321F, + CMSG_EMOTE = 0x3532, + CMSG_ENABLE_ENCRYPTION_ACK = 0x3767, + CMSG_ENABLE_NAGLE = 0x376B, + CMSG_ENABLE_TAXI_NODE = 0x34A8, + CMSG_ENGINE_SURVEY = 0x36E9, + CMSG_ENUM_CHARACTERS = 0x35E7, + CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x36E3, + CMSG_FAR_SIGHT = 0x34DC, + CMSG_GAME_OBJ_REPORT_USE = 0x34E3, + CMSG_GAME_OBJ_USE = 0x34E2, + CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x32B4, + CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x32A5, + CMSG_GARRISON_CHECK_UPGRADEABLE = 0x32F9, + CMSG_GARRISON_COMPLETE_MISSION = 0x32EA, + CMSG_GARRISON_GENERATE_RECRUITS = 0x32B7, + CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x32C5, + CMSG_GARRISON_MISSION_BONUS_ROLL = 0x32EC, + CMSG_GARRISON_PURCHASE_BUILDING = 0x32A1, + CMSG_GARRISON_RECRUIT_FOLLOWER = 0x32B9, + CMSG_GARRISON_REMOVE_FOLLOWER = 0x32E1, + CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x32B5, + CMSG_GARRISON_RENAME_FOLLOWER = 0x32B6, + CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x32A0, + 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 = 0x32BA, + CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x32A2, + CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x32B2, + CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x32AE, + CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x32B8, + CMSG_GARRISON_START_MISSION = 0x32E9, + CMSG_GARRISON_SWAP_BUILDINGS = 0x32A6, + CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x35E6, + CMSG_GET_CHALLENGE_MODE_REWARDS = 0x3688, + CMSG_GET_GARRISON_INFO = 0x329B, + CMSG_GET_ITEM_PURCHASE_DATA = 0x3520, + CMSG_GET_MIRROR_IMAGE_DATA = 0x3271, + CMSG_GET_PVP_OPTIONS_ENABLED = 0x35ED, + CMSG_GET_REMAINING_GAME_TIME = 0x36F2, + 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 = 0x348F, + CMSG_GRANT_LEVEL = 0x34EB, + 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 = 0x34B5, + CMSG_GUILD_BANK_BUY_TAB = 0x34B8, + CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x34BA, + CMSG_GUILD_BANK_LOG_QUERY = 0x3082, + CMSG_GUILD_BANK_QUERY_TAB = 0x34B7, + CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x3083, + CMSG_GUILD_BANK_SET_TAB_TEXT = 0x3086, + CMSG_GUILD_BANK_SWAP_ITEMS = 0x34B6, + CMSG_GUILD_BANK_TEXT_QUERY = 0x3087, + CMSG_GUILD_BANK_UPDATE_TAB = 0x34B9, + CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x34BB, + CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x307B, + CMSG_GUILD_CHANGE_NAME_REQUEST = 0x307E, + CMSG_GUILD_DECLINE_INVITATION = 0x3060, + CMSG_GUILD_DELETE = 0x3068, + CMSG_GUILD_DELETE_RANK = 0x3065, + CMSG_GUILD_DEMOTE_MEMBER = 0x305E, + CMSG_GUILD_EVENT_LOG_QUERY = 0x3085, + CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0x3071, + CMSG_GUILD_GET_RANKS = 0x306D, + CMSG_GUILD_GET_ROSTER = 0x3073, + CMSG_GUILD_INVITE_BY_NAME = 0x3604, + CMSG_GUILD_LEAVE = 0x3062, + CMSG_GUILD_MEMBER_SEND_SOR_REQUEST = 0x308C, + CMSG_GUILD_NEWS_UPDATE_STICKY = 0x306E, + CMSG_GUILD_OFFICER_REMOVE_MEMBER = 0x3063, + CMSG_GUILD_PERMISSIONS_QUERY = 0x3084, + CMSG_GUILD_PROMOTE_MEMBER = 0x305D, + CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE = 0x306B, + CMSG_GUILD_QUERY_MEMBER_RECIPES = 0x3069, + CMSG_GUILD_QUERY_NEWS = 0x306C, + CMSG_GUILD_QUERY_RECIPES = 0x306A, + 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_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 = 0x34FC, + CMSG_IGNORE_TRADE = 0x3159, + CMSG_INITIATE_ROLE_POLL = 0x35DA, + CMSG_INITIATE_TRADE = 0x3156, + CMSG_INSPECT = 0x351B, + CMSG_INSPECT_PVP = 0x36A7, + CMSG_INSTANCE_LOCK_RESPONSE = 0x3501, + CMSG_ITEM_PURCHASE_REFUND = 0x3521, + CMSG_ITEM_TEXT_QUERY = 0x32FA, + CMSG_JOIN_PET_BATTLE_QUEUE = 0x31C6, + CMSG_JOIN_RATED_BATTLEGROUND = 0x3175, + CMSG_KEEP_ALIVE = 0x3684, + CMSG_KEYBOUND_OVERRIDE = 0x3208, + CMSG_LEARN_PVP_TALENTS = 0x3544, + CMSG_LEARN_TALENTS = 0x3543, + CMSG_LEAVE_GROUP = 0x364A, + CMSG_LEAVE_PET_BATTLE_QUEUE = 0x31C7, + 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 = 0x361C, + CMSG_LIST_INVENTORY = 0x34A0, + CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x36C0, + CMSG_LIVE_REGION_CHARACTER_COPY = 0x36BF, + CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x36BE, + CMSG_LOADING_SCREEN_NOTIFY = 0x35F6, + CMSG_LOAD_SELECTED_TROPHY = 0x32DB, + CMSG_LOGOUT_CANCEL = 0x34CC, + CMSG_LOGOUT_INSTANT = 0x34CD, + CMSG_LOGOUT_REQUEST = 0x34CB, + CMSG_LOG_DISCONNECT = 0x3769, + CMSG_LOG_STREAMING_ERROR = 0x376D, + CMSG_LOOT_ITEM = 0x31F4, + CMSG_LOOT_MONEY = 0x31F3, + CMSG_LOOT_RELEASE = 0x31F8, + CMSG_LOOT_ROLL = 0x31F9, + CMSG_LOOT_UNIT = 0x31F2, + CMSG_LOW_LEVEL_RAID1 = 0x36A5, + CMSG_LOW_LEVEL_RAID2 = 0x3507, + CMSG_MAIL_CREATE_TEXT_ITEM = 0x352C, + CMSG_MAIL_DELETE = 0x320A, + CMSG_MAIL_GET_LIST = 0x3527, + CMSG_MAIL_MARK_AS_READ = 0x352B, + CMSG_MAIL_RETURN_TO_SENDER = 0x3659, + CMSG_MAIL_TAKE_ITEM = 0x3529, + CMSG_MAIL_TAKE_MONEY = 0x3528, + CMSG_MASTER_LOOT_ITEM = 0x31F5, + CMSG_MINIMAP_PING = 0x364C, + CMSG_MISSILE_TRAJECTORY_COLLISION = 0x3188, + CMSG_MOUNT_CLEAR_FANFARE = 0x312D, + CMSG_MOUNT_SET_FAVORITE = 0x3631, + CMSG_MOUNT_SPECIAL_ANIM = 0x325D, + CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x3A12, + CMSG_MOVE_CHANGE_TRANSPORT = 0x3A2C, + CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x3A31, + CMSG_MOVE_CHARM_TELEPORT_CHEAT = 0x39F6, + CMSG_MOVE_DISMISS_VEHICLE = 0x3A30, + CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x3A21, + CMSG_MOVE_FALL_LAND = 0x39F9, + CMSG_MOVE_FALL_RESET = 0x3A16, + CMSG_MOVE_FEATHER_FALL_ACK = 0x3A19, + CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x3A2B, + CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x3A2A, + CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x3A2F, + CMSG_MOVE_FORCE_ROOT_ACK = 0x3A0B, + CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x3A09, + CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x3A08, + CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x3A1F, + CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x3A0A, + CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x3A20, + CMSG_MOVE_FORCE_UNROOT_ACK = 0x3A0C, + CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x3A1E, + CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x3A32, + CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x3A33, + CMSG_MOVE_HEARTBEAT = 0x3A0D, + CMSG_MOVE_HOVER_ACK = 0x3A10, + CMSG_MOVE_JUMP = 0x39EA, + CMSG_MOVE_KNOCK_BACK_ACK = 0x3A0F, + CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x3A14, + CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x3A13, + CMSG_MOVE_SET_CAN_FLY_ACK = 0x3A24, + CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x3A22, + CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x3A36, + CMSG_MOVE_SET_FACING = 0x3A06, + CMSG_MOVE_SET_FLY = 0x3A25, + CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK = 0x3A23, + CMSG_MOVE_SET_PITCH = 0x3A07, + CMSG_MOVE_SET_RELATIVE_POSITION = 0x39F7, + CMSG_MOVE_SET_RUN_MODE = 0x39F2, + CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x3A11, + CMSG_MOVE_SET_WALK_MODE = 0x39F3, + CMSG_MOVE_SPLINE_DONE = 0x3A15, + CMSG_MOVE_START_ASCEND = 0x3A26, + CMSG_MOVE_START_BACKWARD = 0x39E5, + CMSG_MOVE_START_DESCEND = 0x3A2D, + CMSG_MOVE_START_FORWARD = 0x39E4, + CMSG_MOVE_START_PITCH_DOWN = 0x39F0, + CMSG_MOVE_START_PITCH_UP = 0x39EF, + CMSG_MOVE_START_STRAFE_LEFT = 0x39E7, + CMSG_MOVE_START_STRAFE_RIGHT = 0x39E8, + CMSG_MOVE_START_SWIM = 0x39FA, + CMSG_MOVE_START_TURN_LEFT = 0x39EC, + CMSG_MOVE_START_TURN_RIGHT = 0x39ED, + CMSG_MOVE_STOP = 0x39E6, + CMSG_MOVE_STOP_ASCEND = 0x3A27, + CMSG_MOVE_STOP_PITCH = 0x39F1, + CMSG_MOVE_STOP_STRAFE = 0x39E9, + CMSG_MOVE_STOP_SWIM = 0x39FB, + CMSG_MOVE_STOP_TURN = 0x39EE, + CMSG_MOVE_TELEPORT_ACK = 0x39F8, + CMSG_MOVE_TELEPORT_CHEAT = 0x39F4, + CMSG_MOVE_TIME_SKIPPED = 0x3A18, + CMSG_MOVE_TOGGLE_COLLISION_CHEAT = 0x3A05, + CMSG_MOVE_WATER_WALK_ACK = 0x3A1A, + CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x31BC, + CMSG_NEXT_CINEMATIC_CAMERA = 0x3535, + CMSG_OBJECT_UPDATE_FAILED = 0x317E, + CMSG_OBJECT_UPDATE_RESCUED = 0x317F, + CMSG_OFFER_PETITION = 0x36B5, + CMSG_OPENING_CINEMATIC = 0x3534, + CMSG_OPEN_ITEM = 0x32FB, + CMSG_OPEN_MISSION_NPC = 0x32C0, + CMSG_OPEN_SHIPMENT_NPC = 0x32C6, + CMSG_OPEN_TRADESKILL_NPC = 0x32D1, + CMSG_OPT_OUT_OF_LOOT = 0x34EA, + CMSG_PARTY_INVITE = 0x3600, + CMSG_PARTY_INVITE_RESPONSE = 0x3601, + CMSG_PARTY_UNINVITE = 0x3648, + CMSG_PETITION_BUY = 0x34BD, + CMSG_PETITION_RENAME_GUILD = 0x36CB, + CMSG_PETITION_SHOW_LIST = 0x34BC, + CMSG_PETITION_SHOW_SIGNATURES = 0x34BE, + CMSG_PET_ABANDON = 0x3488, + CMSG_PET_ACTION = 0x3486, + CMSG_PET_BATTLE_FINAL_NOTIFY = 0x31CA, + CMSG_PET_BATTLE_INPUT = 0x3641, + CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x3209, + CMSG_PET_BATTLE_QUIT_NOTIFY = 0x31C9, + CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x3642, + CMSG_PET_BATTLE_REQUEST_PVP = 0x31C4, + CMSG_PET_BATTLE_REQUEST_UPDATE = 0x31C5, + CMSG_PET_BATTLE_REQUEST_WILD = 0x31C2, + CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x31CB, + CMSG_PET_BATTLE_WILD_LOCATION_FAIL = 0x31C3, + CMSG_PET_CANCEL_AURA = 0x3489, + CMSG_PET_CAST_SPELL = 0x3275, + CMSG_PET_RENAME = 0x368B, + CMSG_PET_SET_ACTION = 0x3485, + CMSG_PET_SPELL_AUTOCAST = 0x348A, + CMSG_PET_STOP_ATTACK = 0x3487, + CMSG_PING = 0x3768, + CMSG_PLAYER_LOGIN = 0x35E9, + CMSG_PROTOCOL_MISMATCH = 0x376E, + CMSG_PUSH_QUEST_TO_PARTY = 0x349E, + CMSG_PVP_LOG_DATA = 0x3179, + CMSG_PVP_PRESTIGE_RANK_UP = 0x331F, + CMSG_QUERY_BATTLE_PET_NAME = 0x3252, + CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x3665, + CMSG_QUERY_CORPSE_TRANSPORT = 0x3666, + CMSG_QUERY_COUNTDOWN_TIMER = 0x31A2, + CMSG_QUERY_CREATURE = 0x324C, + CMSG_QUERY_GAME_OBJECT = 0x324D, + CMSG_QUERY_GARRISON_CREATURE_NAME = 0x3253, + CMSG_QUERY_GUILD_INFO = 0x3693, + CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x34F6, + CMSG_QUERY_NEXT_MAIL_TIME = 0x352A, + CMSG_QUERY_NPC_TEXT = 0x324E, + CMSG_QUERY_PAGE_TEXT = 0x3250, + CMSG_QUERY_PETITION = 0x3254, + CMSG_QUERY_PET_NAME = 0x3251, + CMSG_QUERY_PLAYER_NAME = 0x3691, + CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x3172, + CMSG_QUERY_QUEST_INFO = 0x324F, + CMSG_QUERY_QUEST_REWARDS = 0x3322, + CMSG_QUERY_REALM_NAME = 0x3692, + CMSG_QUERY_SCENARIO_POI = 0x365A, + CMSG_QUERY_TIME = 0x34CA, + CMSG_QUERY_VOID_STORAGE = 0x319B, + CMSG_QUEST_CONFIRM_ACCEPT = 0x349D, + CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x3494, + CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x3499, + CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x3497, + CMSG_QUEST_GIVER_HELLO = 0x3491, + CMSG_QUEST_GIVER_IGNORE_QUEST = 0x3495, + CMSG_QUEST_GIVER_QUERY_QUEST = 0x3492, + CMSG_QUEST_GIVER_REQUEST_REWARD = 0x349A, + CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x349C, + CMSG_QUEST_GIVER_STATUS_QUERY = 0x349B, + CMSG_QUEST_GIVER_UNIGNORE_QUEST = 0x3496, + CMSG_QUEST_LOG_REMOVE_QUEST = 0x351F, + CMSG_QUEST_POI_QUERY = 0x36B6, + CMSG_QUEST_PUSH_RESULT = 0x349F, + CMSG_QUEUED_MESSAGES_END = 0x376C, + CMSG_RAID_OR_BATTLEGROUND_ENGINE_SURVEY = 0x36EA, + CMSG_RANDOM_ROLL = 0x3655, + CMSG_READY_CHECK_RESPONSE = 0x3635, + CMSG_READ_ITEM = 0x32FC, + CMSG_RECLAIM_CORPSE = 0x34CF, + CMSG_RECRUIT_A_FRIEND = 0x36D1, + CMSG_REDEEM_WOW_TOKEN_CONFIRM = 0x36F4, + CMSG_REDEEM_WOW_TOKEN_START = 0x36F3, + CMSG_REORDER_CHARACTERS = 0x35E8, + CMSG_REPAIR_ITEM = 0x34E0, + CMSG_REPLACE_TROPHY = 0x32DC, + CMSG_REPOP_REQUEST = 0x3518, + CMSG_REPORT_PVP_PLAYER_AFK = 0x34E8, + CMSG_REQUEST_ACCOUNT_DATA = 0x369B, + CMSG_REQUEST_BATTLEFIELD_STATUS = 0x35DC, + CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x317B, + CMSG_REQUEST_CEMETERY_LIST = 0x3173, + CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x328B, + CMSG_REQUEST_FORCED_REACTIONS = 0x31EE, + CMSG_REQUEST_GUILD_PARTY_STATE = 0x31A1, + CMSG_REQUEST_GUILD_REWARDS_LIST = 0x31A0, + CMSG_REQUEST_HONOR_STATS = 0x3178, + CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x327C, + CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x35F5, + CMSG_REQUEST_PARTY_MEMBER_STATS = 0x3654, + CMSG_REQUEST_PET_INFO = 0x348B, + CMSG_REQUEST_PLAYED_TIME = 0x3257, + CMSG_REQUEST_PVP_REWARDS = 0x318F, + CMSG_REQUEST_RAID_INFO = 0x36CC, + CMSG_REQUEST_RATED_BATTLEFIELD_INFO = 0x35E3, + CMSG_REQUEST_RESEARCH_HISTORY = 0x3167, + CMSG_REQUEST_STABLED_PETS = 0x348C, + CMSG_REQUEST_VEHICLE_EXIT = 0x321A, + CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x321C, + CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x321B, + CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x321D, + CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x36EC, + CMSG_RESET_CHALLENGE_MODE = 0x31EB, + CMSG_RESET_INSTANCES = 0x366D, + CMSG_RESURRECT_RESPONSE = 0x368A, + CMSG_REVERT_MONUMENT_APPEARANCE = 0x32DE, + CMSG_RIDE_VEHICLE_INTERACT = 0x321E, + CMSG_SAVE_CLIENT_VARIABLES = 0x3705, + CMSG_SAVE_CUF_PROFILES = 0x3189, + CMSG_SAVE_ENABLED_ADDONS = 0x3704, + CMSG_SAVE_EQUIPMENT_SET = 0x34FF, + CMSG_SAVE_GUILD_EMBLEM = 0x3280, + CMSG_SCENE_PLAYBACK_CANCELED = 0x3205, + CMSG_SCENE_PLAYBACK_COMPLETE = 0x3204, + CMSG_SCENE_TRIGGER_EVENT = 0x3206, + CMSG_SELF_RES = 0x3522, + CMSG_SELL_ITEM = 0x34A1, + CMSG_SELL_WOW_TOKEN_CONFIRM = 0x36EE, + CMSG_SELL_WOW_TOKEN_START = 0x36ED, + CMSG_SEND_CONTACT_LIST = 0x36D4, + CMSG_SEND_MAIL = 0x35F8, + CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x3620, + CMSG_SEND_TEXT_EMOTE = 0x3482, + CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x320B, + CMSG_SET_ACTION_BAR_TOGGLES = 0x3523, + CMSG_SET_ACTION_BUTTON = 0x3636, + CMSG_SET_ACTIVE_MOVER = 0x3A37, + CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x3656, + CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x328C, + CMSG_SET_ASSISTANT_LEADER = 0x3650, + 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 = 0x3207, + CMSG_SET_DUNGEON_DIFFICULTY = 0x3687, + CMSG_SET_EVERYONE_IS_ASSISTANT = 0x3617, + CMSG_SET_FACTION_AT_WAR = 0x34D2, + CMSG_SET_FACTION_INACTIVE = 0x34D4, + CMSG_SET_FACTION_NOT_AT_WAR = 0x34D3, + CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x3302, + CMSG_SET_LFG_BONUS_FACTION_ID = 0x327B, + CMSG_SET_LOOT_METHOD = 0x3649, + CMSG_SET_LOOT_SPECIALIZATION = 0x3530, + 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 = 0x3284, + CMSG_SET_RAID_DIFFICULTY = 0x36E1, + CMSG_SET_ROLE = 0x35D9, + CMSG_SET_SAVED_INSTANCE_EXTEND = 0x368E, + CMSG_SET_SELECTION = 0x351A, + CMSG_SET_SHEATHED = 0x3483, + CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x3301, + CMSG_SET_TAXI_BENCHMARK_MODE = 0x34E7, + CMSG_SET_TITLE = 0x325B, + CMSG_SET_TRADE_CURRENCY = 0x3160, + CMSG_SET_TRADE_GOLD = 0x315F, + CMSG_SET_TRADE_ITEM = 0x315D, + CMSG_SET_USING_PARTY_GARRISON = 0x32C2, + CMSG_SET_WATCHED_FACTION = 0x34D5, + CMSG_SHOW_TRADE_SKILL = 0x36C5, + CMSG_SIGN_PETITION = 0x3524, + CMSG_SILENCE_PARTY_TALKER = 0x3653, + CMSG_SOCKET_GEMS = 0x34DF, + CMSG_SORT_BAGS = 0x3303, + CMSG_SORT_BANK_BAGS = 0x3304, + CMSG_SORT_REAGENT_BANK_BAGS = 0x3305, + CMSG_SPELL_CLICK = 0x3490, + CMSG_SPIRIT_HEALER_ACTIVATE = 0x34AE, + CMSG_SPLIT_ITEM = 0x399E, + CMSG_STAND_STATE_CHANGE = 0x3187, + CMSG_START_CHALLENGE_MODE = 0x353B, + CMSG_START_SPECTATOR_WAR_GAME = 0x35DF, + CMSG_START_WAR_GAME = 0x35DE, + CMSG_SUMMON_RESPONSE = 0x366F, + CMSG_SUPPORT_TICKET_SUBMIT_BUG = 0x3646, + CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x3645, + CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x3647, + CMSG_SUSPEND_COMMS_ACK = 0x3764, + CMSG_SUSPEND_TOKEN_RESPONSE = 0x376A, + CMSG_SWAP_INV_ITEM = 0x399D, + CMSG_SWAP_ITEM = 0x399C, + CMSG_SWAP_SUB_GROUPS = 0x364E, + CMSG_SWAP_VOID_ITEM = 0x319D, + CMSG_TABARD_VENDOR_ACTIVATE = 0x3281, + CMSG_TALK_TO_GOSSIP = 0x348D, + CMSG_TAXI_NODE_STATUS_QUERY = 0x34A7, + CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x34A9, + CMSG_TAXI_REQUEST_EARLY_LANDING = 0x34AB, + CMSG_TELEPORT_TO_GUID = 0x39F5, + CMSG_TELEPORT_TO_UNIT = 0x3668, + CMSG_TIME_ADJUSTMENT_RESPONSE = 0x3A3B, + CMSG_TIME_SYNC_RESPONSE = 0x3A38, + CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x3A3A, + CMSG_TIME_SYNC_RESPONSE_FAILED = 0x3A39, + CMSG_TOGGLE_DIFFICULTY = 0x365B, + CMSG_TOGGLE_PVP = 0x3283, + CMSG_TOTEM_DESTROYED = 0x34EE, + CMSG_TOY_SET_FAVORITE = 0x3632, + CMSG_TRADE_SKILL_SET_FAVORITE = 0x3321, + CMSG_TRAINER_BUY_SPELL = 0x34AD, + CMSG_TRAINER_LIST = 0x34AC, + CMSG_TRANSMOGRIFY_ITEMS = 0x3190, + CMSG_TRANSMOG_APPEARANCE_SET_FAVORITE = 0x3633, + CMSG_TURN_IN_PETITION = 0x3526, + CMSG_TUTORIAL = 0x36E2, + CMSG_TWITTER_CHECK_STATUS = 0x312A, + CMSG_TWITTER_CONNECT = 0x3127, + CMSG_TWITTER_DISCONNECT = 0x312B, + CMSG_TWITTER_POST = 0x3307, + CMSG_UI_TIME_REQUEST = 0x36A0, + CMSG_UNACCEPT_TRADE = 0x315B, + CMSG_UNDELETE_CHARACTER = 0x36E4, + CMSG_UNLEARN_SKILL = 0x34D9, + CMSG_UNLEARN_SPECIALIZATION = 0x319E, + CMSG_UNLOCK_VOID_STORAGE = 0x319A, + CMSG_UPDATE_ACCOUNT_DATA = 0x369C, + CMSG_UPDATE_CLIENT_SETTINGS = 0x3669, + CMSG_UPDATE_MISSILE_TRAJECTORY = 0x3A3E, + CMSG_UPDATE_RAID_TARGET = 0x3651, + CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36FA, + CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST = 0x36F5, + CMSG_UPDATE_WOW_TOKEN_COUNT = 0x36EB, + CMSG_UPGRADE_GARRISON = 0x3294, + CMSG_UPGRADE_ITEM = 0x320C, + CMSG_USED_FOLLOW = 0x3184, + CMSG_USE_CRITTER_ITEM = 0x3225, + CMSG_USE_EQUIPMENT_SET = 0x3995, + CMSG_USE_ITEM = 0x3272, + CMSG_USE_TOY = 0x3274, + CMSG_VIOLENCE_LEVEL = 0x3182, + CMSG_VOICE_ADD_IGNORE = 0x3657, + CMSG_VOICE_DEL_IGNORE = 0x3658, + CMSG_VOICE_SESSION_ENABLE = 0x3689, + CMSG_VOID_STORAGE_TRANSFER = 0x319C, + CMSG_WARDEN_DATA = 0x35EB, + CMSG_WHO = 0x3686, + CMSG_WHO_IS = 0x3685, + CMSG_WORLD_PORT_RESPONSE = 0x35F7, + CMSG_WORLD_TELEPORT = 0x3327, + CMSG_WRAP_ITEM = 0x3994, + + CMSG_BF_MGR_ENTRY_INVITE_RESPONSE = 0xBADD, + CMSG_BF_MGR_QUEUE_INVITE_RESPONSE = 0xBADD, + CMSG_BF_MGR_QUEUE_EXIT_REQUEST = 0xBADD, }; enum OpcodeServer : uint32 { - SMSG_ABORT_NEW_WORLD = 0x2533, - SMSG_ACCOUNT_CRITERIA_UPDATE = 0x25D2, - SMSG_ACCOUNT_DATA_TIMES = 0x26CA, - SMSG_ACCOUNT_MOUNT_UPDATE = 0x2549, - SMSG_ACCOUNT_TOYS_UPDATE = 0x254A, - SMSG_ACHIEVEMENT_DELETED = 0x26A0, - SMSG_ACHIEVEMENT_EARNED = 0x25E0, - SMSG_ACTIVATE_TAXI_REPLY = 0x2627, - SMSG_ADDON_INFO = 0x26FC, - SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x25DA, - SMSG_ADD_ITEM_PASSIVE = 0x2545, - SMSG_ADD_LOSS_OF_CONTROL = 0x2617, - SMSG_ADD_RUNE_POWER = 0x2665, - SMSG_ADJUST_SPLINE_DURATION = 0x256C, - SMSG_AE_LOOT_TARGETS = 0x25AE, - SMSG_AE_LOOT_TARGET_ACK = 0x25AF, - SMSG_AI_REACTION = 0x2661, - SMSG_ALL_ACCOUNT_CRITERIA = 0x24EE, - SMSG_ALL_ACHIEVEMENT_DATA = 0x24ED, - SMSG_ALL_GUILD_ACHIEVEMENTS = 0x2936, - SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x2504, - SMSG_AREA_SPIRIT_HEALER_TIME = 0x2701, - SMSG_AREA_TRIGGER_DENIED = 0x261E, - SMSG_AREA_TRIGGER_NO_CORPSE = 0x26D6, - SMSG_AREA_TRIGGER_RE_PATH = 0x25BF, - SMSG_AREA_TRIGGER_RE_SHAPE = 0x25C1, - SMSG_ARENA_ERROR = 0x2693, - SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x25E6, - SMSG_ATTACKER_STATE_UPDATE = 0x2749, - SMSG_ATTACK_START = 0x25EE, - SMSG_ATTACK_STOP = 0x25EF, - SMSG_ATTACK_SWING_ERROR = 0x26B5, - SMSG_ATTACK_SWING_LANDED_LOG = 0x26B6, - SMSG_AUCTION_CLOSED_NOTIFICATION = 0x26AA, - SMSG_AUCTION_COMMAND_RESULT = 0x26A7, - SMSG_AUCTION_HELLO_RESPONSE = 0x26A5, - SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT = 0x26AE, - SMSG_AUCTION_LIST_ITEMS_RESULT = 0x26AC, - SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT = 0x26AD, - SMSG_AUCTION_LIST_PENDING_SALES_RESULT = 0x26AF, - SMSG_AUCTION_OUTBID_NOTIFICATION = 0x26A9, - SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x26AB, - SMSG_AUCTION_REPLICATE_RESPONSE = 0x26A6, - SMSG_AUCTION_WON_NOTIFICATION = 0x26A8, - SMSG_AURA_POINTS_DEPLETED = 0x2BA0, - SMSG_AURA_UPDATE = 0x2B9F, - SMSG_AUTH_CHALLENGE = 0x2FC6, - SMSG_AUTH_RESPONSE = 0x24EA, - SMSG_AVAILABLE_VOICE_CHANNEL = 0x2B30, - SMSG_BAN_REASON = 0x2633, - SMSG_BARBER_SHOP_RESULT = 0x266B, - SMSG_BATTLEFIELD_LIST = 0x2511, - SMSG_BATTLEFIELD_PORT_DENIED = 0x2517, - SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x250D, - SMSG_BATTLEFIELD_STATUS_FAILED = 0x2510, - SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x250C, - SMSG_BATTLEFIELD_STATUS_NONE = 0x250F, - SMSG_BATTLEFIELD_STATUS_QUEUED = 0x250E, - SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x252B, - SMSG_BATTLEGROUND_INFO_THROTTLED = 0x2523, - SMSG_BATTLEGROUND_INIT = 0x271E, - SMSG_BATTLEGROUND_PLAYER_JOINED = 0x2515, - SMSG_BATTLEGROUND_PLAYER_LEFT = 0x2516, - SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x2512, - SMSG_BATTLEGROUND_POINTS = 0x271D, - SMSG_BATTLENET_CHALLENGE_ABORT = 0x2748, - SMSG_BATTLENET_CHALLENGE_START = 0x2747, - SMSG_BATTLENET_NOTIFICATION = 0x279E, - SMSG_BATTLENET_REALM_LIST_TICKET = 0x27A0, - SMSG_BATTLENET_RESPONSE = 0x279D, - SMSG_BATTLENET_SET_SESSION_STATE = 0x279F, - SMSG_BATTLE_PAY_ACK_FAILED = 0x2740, - SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x273F, - SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x2736, - SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x2735, - SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x2734, - SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x2732, - SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x2730, - SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x2731, - SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x273E, - SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x273C, - SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x273B, - SMSG_BATTLE_PETS_HEALED = 0x258C, - SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x2621, - SMSG_BATTLE_PET_DELETED = 0x2589, - SMSG_BATTLE_PET_ERROR = 0x25D5, - SMSG_BATTLE_PET_JOURNAL = 0x2588, - SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x2586, - SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x2587, - SMSG_BATTLE_PET_LICENSE_CHANGED = 0x258D, - SMSG_BATTLE_PET_RESTORED = 0x258B, - SMSG_BATTLE_PET_REVOKED = 0x258A, - SMSG_BATTLE_PET_TRAP_LEVEL = 0x2584, - SMSG_BATTLE_PET_UPDATES = 0x2583, - SMSG_BF_MGR_DROP_TIMER_CANCELLED = 0x251F, - SMSG_BF_MGR_DROP_TIMER_STARTED = 0x251E, - SMSG_BF_MGR_EJECTED = 0x251D, - SMSG_BF_MGR_EJECT_PENDING = 0x251C, - SMSG_BF_MGR_ENTERING = 0x2519, - SMSG_BF_MGR_ENTRY_INVITE = 0x2518, - SMSG_BF_MGR_QUEUE_INVITE = 0x2520, - SMSG_BF_MGR_QUEUE_REQUEST_RESPONSE = 0x251A, - SMSG_BF_MGR_QUEUE_STATUS_UPDATE = 0x251B, - SMSG_BF_MGR_STATE_CHANGED = 0x2522, - SMSG_BINDER_CONFIRM = 0x26BB, - SMSG_BIND_POINT_UPDATE = 0x24FA, - SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x25C5, - SMSG_BLACK_MARKET_OPEN_RESULT = 0x25C3, - SMSG_BLACK_MARKET_OUTBID = 0x25C6, - SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x25C4, - SMSG_BLACK_MARKET_WON = 0x25C7, - SMSG_BONUS_ROLL_EMPTY = 0x25E3, - SMSG_BOSS_KILL_CREDIT = 0x273A, - SMSG_BREAK_TARGET = 0x25ED, - SMSG_BUY_FAILED = 0x2674, - SMSG_BUY_SUCCEEDED = 0x2673, - SMSG_CACHE_VERSION = 0x26C4, - SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x2647, - SMSG_CALENDAR_COMMAND_RESULT = 0x2648, - SMSG_CALENDAR_EVENT_INITIAL_INVITES = 0x2637, - SMSG_CALENDAR_EVENT_INVITE = 0x2638, - SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x2639, - SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS = 0x263C, - SMSG_CALENDAR_EVENT_INVITE_NOTES = 0x2641, - SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT = 0x2642, - SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x263D, - SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x263E, - SMSG_CALENDAR_EVENT_INVITE_STATUS = 0x263A, - SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x263B, - SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x263F, - SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x2640, - SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x2643, - SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x2644, - SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x2645, - SMSG_CALENDAR_SEND_CALENDAR = 0x2635, - SMSG_CALENDAR_SEND_EVENT = 0x2636, - SMSG_CALENDAR_SEND_NUM_PENDING = 0x2646, - SMSG_CAMERA_SHAKE = 0x26E6, - SMSG_CANCEL_AUTO_REPEAT = 0x2694, - SMSG_CANCEL_COMBAT = 0x26B3, - SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x2BC4, - SMSG_CANCEL_SCENE = 0x25D4, - SMSG_CANCEL_SPELL_VISUAL = 0x2BC2, - SMSG_CANCEL_SPELL_VISUAL_KIT = 0x2BC6, - SMSG_CAN_DUEL_RESULT = 0x25F7, - SMSG_CAST_FAILED = 0x2BD2, - SMSG_CATEGORY_COOLDOWN = 0x2B94, - SMSG_CHALLEGE_MODE_REWARDS = 0x25A3, - SMSG_CHALLENGE_MODE_ALL_MAP_STATS = 0x25A4, - SMSG_CHALLENGE_MODE_COMPLETE = 0x25A2, - SMSG_CHALLENGE_MODE_MAP_STATS_UPDATE = 0x25A5, - SMSG_CHALLENGE_MODE_NEW_PLAYER_RECORD = 0x25A7, - SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x25A6, - SMSG_CHALLENGE_MODE_RESET = 0x25A1, - SMSG_CHALLENGE_MODE_START = 0x25A0, - SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x26B7, - SMSG_CHANNEL_LIST = 0x2B46, - SMSG_CHANNEL_NOTIFY = 0x2B43, - SMSG_CHANNEL_NOTIFY_JOINED = 0x2B44, - SMSG_CHANNEL_NOTIFY_LEFT = 0x2B45, - SMSG_CHARACTER_LOGIN_FAILED = 0x26C5, - SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x2746, - SMSG_CHARACTER_RENAME_RESULT = 0x2724, - SMSG_CHARACTER_UPGRADE_CHARACTER_CHOSEN = 0x2772, - SMSG_CHARACTER_UPGRADE_COMPLETE = 0x2773, - SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET = 0x2578, - SMSG_CHARACTER_UPGRADE_STARTED = 0x2771, - SMSG_CHAR_CUSTOMIZE = 0x269B, - SMSG_CHAR_CUSTOMIZE_FAILED = 0x269A, - SMSG_CHAR_FACTION_CHANGE_RESULT = 0x2760, - SMSG_CHAT = 0x2B2B, - SMSG_CHAT_AUTO_RESPONDED = 0x2B3B, - SMSG_CHAT_DOWN = 0x2B40, - SMSG_CHAT_IGNORED_ACCOUNT_MUTED = 0x2B2A, - SMSG_CHAT_IS_DOWN = 0x2B41, - SMSG_CHAT_NOT_IN_PARTY = 0x2B35, - SMSG_CHAT_PLAYER_AMBIGUOUS = 0x2B2E, - SMSG_CHAT_PLAYER_NOTFOUND = 0x2B3A, - SMSG_CHAT_RECONNECT = 0x2B42, - SMSG_CHAT_RESTRICTED = 0x2B36, - SMSG_CHAT_SERVER_MESSAGE = 0x2B47, - SMSG_CHEAT_IGNORE_DIMISHING_RETURNS = 0x2B90, - SMSG_CHECK_WARGAME_ENTRY = 0x2526, - SMSG_CLEAR_ALL_SPELL_CHARGES = 0x2BA5, - SMSG_CLEAR_BOSS_EMOTES = 0x2552, - SMSG_CLEAR_COOLDOWN = 0x2667, - SMSG_CLEAR_COOLDOWNS = 0x2BA3, - SMSG_CLEAR_LOSS_OF_CONTROL = 0x2619, - SMSG_CLEAR_SPELL_CHARGES = 0x2BA6, - SMSG_CLEAR_TARGET = 0x265D, - SMSG_COIN_REMOVED = 0x25AD, - SMSG_COMBAT_EVENT_FAILED = 0x25F0, - SMSG_COMMENTATOR_MAP_INFO = 0x26C7, - SMSG_COMMENTATOR_PLAYER_INFO = 0x26C8, - SMSG_COMMENTATOR_STATE_CHANGED = 0x26C6, - SMSG_COMPLAINT_RESULT = 0x2655, - SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x2758, - SMSG_CONNECT_TO = 0x2FCA, - SMSG_CONQUEST_FORMULA_CONSTANTS = 0x2741, - SMSG_CONSOLE_WRITE = 0x25D1, - SMSG_CONTACT_LIST = 0x2744, - SMSG_CONTROL_UPDATE = 0x25E5, - SMSG_CONVERT_RUNE = 0x2664, - SMSG_COOLDOWN_CHEAT = 0x26F9, - SMSG_COOLDOWN_EVENT = 0x2666, - SMSG_CORPSE_LOCATION = 0x25EC, - SMSG_CORPSE_RECLAIM_DELAY = 0x270C, - SMSG_CORPSE_TRANSPORT_QUERY = 0x26D2, - SMSG_CREATE_CHAR = 0x26C0, - SMSG_CREATE_SHIPMENT_RESPONSE = 0x2757, - SMSG_CRITERIA_DELETED = 0x269F, - SMSG_CRITERIA_UPDATE = 0x2699, - SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x266F, - SMSG_CUSTOM_LOAD_SCREEN = 0x2568, - SMSG_DAILY_QUESTS_RESET = 0x29FE, - SMSG_DAMAGE_CALC_LOG = 0x277A, - SMSG_DANCE_STUDIO_CREATE_RESULT = 0x2721, - SMSG_DB_REPLY = 0x2528, - SMSG_DEATH_RELEASE_LOC = 0x2687, - SMSG_DEFENSE_MESSAGE = 0x2B39, - SMSG_DELETE_CHAR = 0x26C1, - SMSG_DESTROY_ARENA_UNIT = 0x2703, - SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x26B4, - SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x2507, - SMSG_DISENCHANT_CREDIT = 0x2542, - SMSG_DISMOUNT = 0x265C, - SMSG_DISMOUNT_RESULT = 0x24F9, - SMSG_DISPEL_FAILED = 0x2BAE, - SMSG_DISPLAY_GAME_ERROR = 0x253B, - SMSG_DISPLAY_PLAYER_CHOICE = 0x2622, - SMSG_DISPLAY_PROMOTION = 0x25E9, - SMSG_DISPLAY_QUEST_POPUP = 0x2A19, - SMSG_DISPLAY_TOAST = 0x25BB, - SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x257A, - SMSG_DROP_NEW_CONNECTION = 0x2FC9, - SMSG_DUEL_COMPLETE = 0x25F5, - SMSG_DUEL_COUNTDOWN = 0x25F4, - SMSG_DUEL_IN_BOUNDS = 0x25F3, - SMSG_DUEL_OUT_OF_BOUNDS = 0x25F2, - SMSG_DUEL_REQUESTED = 0x25F1, - SMSG_DUEL_WINNER = 0x25F6, - SMSG_DURABILITY_DAMAGE_DEATH = 0x2708, - SMSG_EMOTE = 0x277B, - SMSG_ENABLE_BARBER_SHOP = 0x266A, - SMSG_ENCHANTMENT_LOG = 0x26D3, - SMSG_ENCOUNTER_END = 0x2739, - SMSG_ENCOUNTER_START = 0x2738, - SMSG_ENUM_CHARACTERS_RESULT = 0x2500, - SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x2B9E, - SMSG_EQUIPMENT_SET_ID = 0x265E, - SMSG_EXPECTED_SPAM_RECORDS = 0x2B2F, - SMSG_EXPLORATION_EXPERIENCE = 0x2720, - SMSG_FACTION_BONUS_INFO = 0x26E5, - SMSG_FAILED_PLAYER_CONDITION = 0x2567, - SMSG_FEATURE_SYSTEM_STATUS = 0x2557, - SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x2558, - SMSG_FEIGN_DEATH_RESISTED = 0x2705, - SMSG_FISH_ESCAPED = 0x267C, - SMSG_FISH_NOT_HOOKED = 0x267B, - SMSG_FLIGHT_SPLINE_SYNC = 0x2D73, - SMSG_FORCED_DEATH_UPDATE = 0x2688, - SMSG_FORCE_ANIM = 0x2712, - SMSG_FORCE_OBJECT_RELINK = 0x25E8, - SMSG_FRIEND_STATUS = 0x2745, - SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x255B, - SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x255C, - SMSG_GAME_OBJECT_DESPAWN = 0x255D, - SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x2BC9, - SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x2BC8, - SMSG_GAME_OBJECT_RESET_STATE = 0x26DC, - SMSG_GAME_OBJECT_UI_ACTION = 0x26D9, - SMSG_GAME_SPEED_SET = 0x262B, - SMSG_GAME_TIME_SET = 0x26CC, - SMSG_GAME_TIME_UPDATE = 0x26CB, - SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x287C, - SMSG_GARRISON_ADD_MISSION_RESULT = 0x287F, - SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x2890, - SMSG_GARRISON_BUILDING_ACTIVATED = 0x2879, - SMSG_GARRISON_BUILDING_LANDMARKS = 0x28A3, - SMSG_GARRISON_BUILDING_REMOVED = 0x2872, - SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0x2874, - SMSG_GARRISON_CLEAR_ALL_FOLLOWERS_EXHAUSTION = 0x288E, - SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x2882, - SMSG_GARRISON_CREATE_RESULT = 0x287A, - SMSG_GARRISON_DELETE_RESULT = 0x2897, - SMSG_GARRISON_FOLLOWER_CHANGED_ABILITIES = 0x288C, - SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x288B, - SMSG_GARRISON_FOLLOWER_CHANGED_STATUS = 0x288D, - SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x288A, - SMSG_GARRISON_IS_UPGRADEABLE_RESULT = 0x28A0, - SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO = 0x275A, - SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x2875, - SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x2873, - SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x287E, - SMSG_GARRISON_LIST_MISSIONS_CHEAT_RESULT = 0x28A1, - SMSG_GARRISON_MISSION_AREA_BONUS_ADDED = 0x2888, - SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x2885, - SMSG_GARRISON_MISSION_UPDATE_CAN_START = 0x2889, - SMSG_GARRISON_NUM_FOLLOWER_ACTIVATIONS_REMAINING = 0x288F, - SMSG_GARRISON_OPEN_ARCHITECT = 0x2898, - SMSG_GARRISON_OPEN_MISSION_NPC = 0x289A, - SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0x2894, - SMSG_GARRISON_OPEN_TRADESKILL_NPC = 0x2899, - SMSG_GARRISON_PLACE_BUILDING_RESULT = 0x2871, - SMSG_GARRISON_PLOT_PLACED = 0x286F, - SMSG_GARRISON_PLOT_REMOVED = 0x2870, - SMSG_GARRISON_RECALL_PORTAL_LAST_USED_TIME = 0x2883, - SMSG_GARRISON_RECALL_PORTAL_USED = 0x2884, - SMSG_GARRISON_RECRUITMENT_FOLLOWERS_GENERATED = 0x2895, - SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x2896, - SMSG_GARRISON_REMOTE_INFO = 0x2878, - SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x2891, - SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x287D, - SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0x2877, - SMSG_GARRISON_START_MISSION_RESULT = 0x2880, - SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x2876, - SMSG_GARRISON_UPGRADE_RESULT = 0x287B, - SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x2501, - SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x2722, - SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE = 0x289F, - SMSG_GET_GARRISON_INFO_RESULT = 0x286E, - SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x2759, - SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x2755, - SMSG_GET_TROPHY_LIST_RESPONSE = 0x2776, - SMSG_GM_PLAYER_INFO = 0x26F8, - SMSG_GM_REQUEST_PLAYER_INFO = 0x256F, - SMSG_GM_TICKET_CASE_STATUS = 0x264E, - SMSG_GM_TICKET_SYSTEM_STATUS = 0x264D, - SMSG_GOD_MODE = 0x26BA, - SMSG_GOSSIP_COMPLETE = 0x2A13, - SMSG_GOSSIP_MESSAGE = 0x2A14, - SMSG_GOSSIP_POI = 0x2752, - SMSG_GROUP_ACTION_THROTTLED = 0x2524, - SMSG_GROUP_DECLINE = 0x274D, - SMSG_GROUP_DESTROYED = 0x274F, - SMSG_GROUP_NEW_LEADER = 0x25CA, - SMSG_GROUP_UNINVITE = 0x274E, - SMSG_GUILD_ACHIEVEMENT_DELETED = 0x2943, - SMSG_GUILD_ACHIEVEMENT_EARNED = 0x2942, - SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x2945, - SMSG_GUILD_BANK_LOG_QUERY_RESULTS = 0x295C, - SMSG_GUILD_BANK_QUERY_RESULTS = 0x295B, - SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY = 0x295D, - SMSG_GUILD_BANK_TEXT_QUERY_RESULT = 0x2960, - SMSG_GUILD_CHALLENGE_COMPLETED = 0x2951, - SMSG_GUILD_CHALLENGE_UPDATE = 0x2950, - SMSG_GUILD_CHANGE_NAME_RESULT = 0x295A, - SMSG_GUILD_COMMAND_RESULT = 0x2938, - SMSG_GUILD_CRITERIA_DELETED = 0x2944, - SMSG_GUILD_CRITERIA_UPDATE = 0x2941, - SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x2972, - SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x2971, - SMSG_GUILD_EVENT_DISBANDED = 0x2968, - SMSG_GUILD_EVENT_LOG_QUERY_RESULTS = 0x295F, - SMSG_GUILD_EVENT_MOTD = 0x2969, - SMSG_GUILD_EVENT_NEW_LEADER = 0x2967, - SMSG_GUILD_EVENT_PLAYER_JOINED = 0x2965, - SMSG_GUILD_EVENT_PLAYER_LEFT = 0x2966, - SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x296A, - SMSG_GUILD_EVENT_RANKS_UPDATED = 0x296B, - SMSG_GUILD_EVENT_RANK_CHANGED = 0x296C, - SMSG_GUILD_EVENT_TAB_ADDED = 0x296D, - SMSG_GUILD_EVENT_TAB_DELETED = 0x296E, - SMSG_GUILD_EVENT_TAB_MODIFIED = 0x296F, - SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x2970, - SMSG_GUILD_FLAGGED_FOR_RENAME = 0x2959, - SMSG_GUILD_INVITE = 0x2948, - SMSG_GUILD_INVITE_DECLINED = 0x2963, - SMSG_GUILD_INVITE_EXPIRED = 0x2964, - SMSG_GUILD_KNOWN_RECIPES = 0x293C, - SMSG_GUILD_MEMBERS_WITH_RECIPE = 0x293D, - SMSG_GUILD_MEMBER_DAILY_RESET = 0x2961, - SMSG_GUILD_MEMBER_RECIPES = 0x293B, - SMSG_GUILD_MEMBER_UPDATE_NOTE = 0x2947, - SMSG_GUILD_MOVED = 0x2957, - SMSG_GUILD_MOVE_STARTING = 0x2956, - SMSG_GUILD_NAME_CHANGED = 0x2958, - SMSG_GUILD_NEWS = 0x293F, - SMSG_GUILD_NEWS_DELETED = 0x2940, - SMSG_GUILD_PARTY_STATE = 0x2949, - SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x295E, - SMSG_GUILD_RANKS = 0x2946, - SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0x294A, - SMSG_GUILD_RESET = 0x2955, - SMSG_GUILD_REWARD_LIST = 0x293E, - SMSG_GUILD_ROSTER = 0x2939, - SMSG_GUILD_ROSTER_UPDATE = 0x293A, - SMSG_GUILD_SEND_RANK_CHANGE = 0x2937, - SMSG_HEALTH_UPDATE = 0x267F, - SMSG_HIGHEST_THREAT_UPDATE = 0x268E, - SMSG_HOTFIX_NOTIFY = 0x2529, - SMSG_HOTFIX_NOTIFY_BLOB = 0x252A, - SMSG_INCREASE_CAST_TIME_FOR_SPELL = 0x2BA4, - SMSG_INITIALIZE_FACTIONS = 0x26E4, - SMSG_INITIAL_SETUP = 0x24FD, - SMSG_INIT_WORLD_STATES = 0x2709, - SMSG_INSPECT_HONOR_STATS = 0x2538, - SMSG_INSPECT_PVP = 0x26E0, - SMSG_INSPECT_RESULT = 0x25CE, - SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x2766, - SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x2765, - SMSG_INSTANCE_ENCOUNTER_END = 0x276C, - SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x2764, - SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x276E, - SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x276D, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x2769, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x2768, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x276B, - SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x276F, - SMSG_INSTANCE_ENCOUNTER_START = 0x276A, - SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x2767, - SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x26B8, - SMSG_INSTANCE_INFO = 0x25D0, - SMSG_INSTANCE_RESET = 0x2630, - SMSG_INSTANCE_RESET_FAILED = 0x2631, - SMSG_INSTANCE_SAVE_CREATED = 0x2737, - SMSG_INVALIDATE_PLAYER = 0x2654, - SMSG_INVALID_PROMOTION_CODE = 0x2713, - SMSG_INVENTORY_CHANGE_FAILURE = 0x26E2, - SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x2A01, - SMSG_ITEM_CHANGED = 0x26A2, - SMSG_ITEM_COOLDOWN = 0x2779, - SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x2715, - SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x2537, - SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x2535, - SMSG_ITEM_PUSH_RESULT = 0x25BA, - SMSG_ITEM_TIME_UPDATE = 0x2714, - SMSG_KICK_REASON = 0x2798, - SMSG_LEARNED_SPELLS = 0x2BCB, - SMSG_LEARN_TALENT_FAILED = 0x256D, - SMSG_LEVEL_UP_INFO = 0x26A1, - SMSG_LFG_BOOT_PLAYER = 0x29B4, - SMSG_LFG_DISABLED = 0x29B2, - SMSG_LFG_JOIN_RESULT = 0x299A, - SMSG_LFG_LIST_JOIN_RESULT = 0x299B, - SMSG_LFG_LIST_SEARCH_RESULTS = 0x299C, - SMSG_LFG_LIST_SEARCH_STATUS = 0x299D, - SMSG_LFG_LIST_UPDATE_BLACKLIST = 0x29A7, - SMSG_LFG_LIST_UPDATE_STATUS = 0x29A3, - SMSG_LFG_OFFER_CONTINUE = 0x29B3, - SMSG_LFG_PARTY_INFO = 0x29B5, - SMSG_LFG_PLAYER_INFO = 0x29B6, - SMSG_LFG_PLAYER_REWARD = 0x29B7, - SMSG_LFG_PROPOSAL_UPDATE = 0x29AA, - SMSG_LFG_QUEUE_STATUS = 0x299E, - SMSG_LFG_READY_CHECK_RESULT = 0x29B9, - SMSG_LFG_READY_CHECK_UPDATE = 0x29A0, - SMSG_LFG_ROLE_CHECK_UPDATE = 0x299F, - SMSG_LFG_SEARCH_RESULTS = 0x29AB, - SMSG_LFG_SLOT_INVALID = 0x29AE, - SMSG_LFG_TELEPORT_DENIED = 0x29B1, - SMSG_LFG_UPDATE_STATUS = 0x29A2, - SMSG_LF_GUILD_APPLICANT_LIST_CHANGED = 0x2952, - SMSG_LF_GUILD_APPLICATIONS = 0x294F, - SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED = 0x2953, - SMSG_LF_GUILD_BROWSE = 0x294C, - SMSG_LF_GUILD_COMMAND_RESULT = 0x294E, - SMSG_LF_GUILD_POST = 0x294B, - SMSG_LF_GUILD_RECRUITS = 0x294D, - SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x272E, - SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x272C, - SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x2723, - SMSG_LOAD_CUF_PROFILES = 0x2553, - SMSG_LOAD_EQUIPMENT_SET = 0x26CE, - SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x2777, - SMSG_LOGIN_SET_TIME_SPEED = 0x26CD, - SMSG_LOGIN_VERIFY_WORLD = 0x2532, - SMSG_LOGOUT_CANCEL_ACK = 0x262F, - SMSG_LOGOUT_COMPLETE = 0x262E, - SMSG_LOGOUT_RESPONSE = 0x262D, - SMSG_LOG_XP_GAIN = 0x269D, - SMSG_LOOT_ALL_PASSED = 0x25B8, - SMSG_LOOT_CONTENTS = 0x2573, - SMSG_LOOT_ITEM_LIST = 0x25B6, - SMSG_LOOT_LIST = 0x2702, - SMSG_LOOT_MONEY_NOTIFY = 0x25B2, - SMSG_LOOT_RELEASE = 0x25B1, - SMSG_LOOT_RELEASE_ALL = 0x25B0, - SMSG_LOOT_REMOVED = 0x25AB, - SMSG_LOOT_RESPONSE = 0x25AA, - SMSG_LOOT_ROLL = 0x25B4, - SMSG_LOOT_ROLLS_COMPLETE = 0x25B7, - SMSG_LOOT_ROLL_WON = 0x25B9, - SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x2616, - SMSG_MAIL_COMMAND_RESULT = 0x25D8, - SMSG_MAIL_LIST_RESULT = 0x2716, - SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x2717, - SMSG_MAP_OBJECTIVES_INIT = 0x271F, - SMSG_MAP_OBJ_EVENTS = 0x255E, - SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x25B5, - SMSG_MESSAGE_BOX = 0x24F3, - SMSG_MINIMAP_PING = 0x267A, - SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x2B92, - SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x2B91, - SMSG_MISSILE_CANCEL = 0x255F, - SMSG_MODIFY_COOLDOWN = 0x2725, - SMSG_MOTD = 0x2B2D, - SMSG_MOUNT_RESULT = 0x24F8, - SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x2D5D, - SMSG_MOVE_DISABLE_COLLISION = 0x2D59, - SMSG_MOVE_DISABLE_GRAVITY = 0x2D57, - SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x2D56, - SMSG_MOVE_ENABLE_COLLISION = 0x2D5A, - SMSG_MOVE_ENABLE_GRAVITY = 0x2D58, - SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x2D55, - SMSG_MOVE_KNOCK_BACK = 0x2D4D, - SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0x2D5E, - SMSG_MOVE_ROOT = 0x2D45, - SMSG_MOVE_SET_ACTIVE_MOVER = 0x2D21, - SMSG_MOVE_SET_CAN_FLY = 0x2D4F, - SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING = 0x2D51, - SMSG_MOVE_SET_COLLISION_HEIGHT = 0x2D5B, - SMSG_MOVE_SET_COMPOUND_STATE = 0x2D5F, - SMSG_MOVE_SET_FEATHER_FALL = 0x2D49, - SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0x2D41, - SMSG_MOVE_SET_FLIGHT_SPEED = 0x2D40, - SMSG_MOVE_SET_HOVERING = 0x2D4B, - SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES = 0x2D53, - SMSG_MOVE_SET_LAND_WALK = 0x2D48, - SMSG_MOVE_SET_NORMAL_FALL = 0x2D4A, - SMSG_MOVE_SET_PITCH_RATE = 0x2D44, - SMSG_MOVE_SET_RUN_BACK_SPEED = 0x2D3D, - SMSG_MOVE_SET_RUN_SPEED = 0x2D3C, - SMSG_MOVE_SET_SWIM_BACK_SPEED = 0x2D3F, - SMSG_MOVE_SET_SWIM_SPEED = 0x2D3E, - SMSG_MOVE_SET_TURN_RATE = 0x2D43, - SMSG_MOVE_SET_VEHICLE_REC_ID = 0x2D5C, - SMSG_MOVE_SET_WALK_SPEED = 0x2D42, - SMSG_MOVE_SET_WATER_WALK = 0x2D47, - SMSG_MOVE_SKIP_TIME = 0x2D60, - SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0x2D65, - SMSG_MOVE_SPLINE_DISABLE_GRAVITY = 0x2D63, - SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0x2D66, - SMSG_MOVE_SPLINE_ENABLE_GRAVITY = 0x2D64, - SMSG_MOVE_SPLINE_ROOT = 0x2D61, - SMSG_MOVE_SPLINE_SET_FEATHER_FALL = 0x2D67, - SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED = 0x2D38, - SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED = 0x2D37, - SMSG_MOVE_SPLINE_SET_FLYING = 0x2D71, - SMSG_MOVE_SPLINE_SET_HOVER = 0x2D69, - SMSG_MOVE_SPLINE_SET_LAND_WALK = 0x2D6C, - SMSG_MOVE_SPLINE_SET_NORMAL_FALL = 0x2D68, - SMSG_MOVE_SPLINE_SET_PITCH_RATE = 0x2D3B, - SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED = 0x2D34, - SMSG_MOVE_SPLINE_SET_RUN_MODE = 0x2D6F, - SMSG_MOVE_SPLINE_SET_RUN_SPEED = 0x2D33, - SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED = 0x2D36, - SMSG_MOVE_SPLINE_SET_SWIM_SPEED = 0x2D35, - SMSG_MOVE_SPLINE_SET_TURN_RATE = 0x2D3A, - SMSG_MOVE_SPLINE_SET_WALK_MODE = 0x2D70, - SMSG_MOVE_SPLINE_SET_WALK_SPEED = 0x2D39, - SMSG_MOVE_SPLINE_SET_WATER_WALK = 0x2D6B, - SMSG_MOVE_SPLINE_START_SWIM = 0x2D6D, - SMSG_MOVE_SPLINE_STOP_SWIM = 0x2D6E, - SMSG_MOVE_SPLINE_UNROOT = 0x2D62, - SMSG_MOVE_SPLINE_UNSET_FLYING = 0x2D72, - SMSG_MOVE_SPLINE_UNSET_HOVER = 0x2D6A, - SMSG_MOVE_TELEPORT = 0x2D4E, - SMSG_MOVE_UNROOT = 0x2D46, - SMSG_MOVE_UNSET_CAN_FLY = 0x2D50, - SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING = 0x2D52, - SMSG_MOVE_UNSET_HOVERING = 0x2D4C, - SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x2D54, - SMSG_MOVE_UPDATE = 0x2D2C, - SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0x2D30, - SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x2D2B, - SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0x2D28, - SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0x2D27, - SMSG_MOVE_UPDATE_KNOCK_BACK = 0x2D2E, - SMSG_MOVE_UPDATE_PITCH_RATE = 0x2D2A, - SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE = 0x2D31, - SMSG_MOVE_UPDATE_RUN_BACK_SPEED = 0x2D23, - SMSG_MOVE_UPDATE_RUN_SPEED = 0x2D22, - SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0x2D26, - SMSG_MOVE_UPDATE_SWIM_SPEED = 0x2D25, - SMSG_MOVE_UPDATE_TELEPORT = 0x2D2D, - SMSG_MOVE_UPDATE_TURN_RATE = 0x2D29, - SMSG_MOVE_UPDATE_WALK_SPEED = 0x2D24, - SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x2575, - SMSG_NEW_TAXI_PATH = 0x2628, - SMSG_NEW_WORLD = 0x2531, - SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x2BC1, - SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x2653, - SMSG_NOTIFY_MONEY = 0x2534, - SMSG_NOTIFY_RECEIVED_MAIL = 0x25D9, - SMSG_OFFER_PETITION_ERROR = 0x2662, - SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x269E, - SMSG_ON_MONSTER_MOVE = 0x2D20, - SMSG_OPEN_CONTAINER = 0x26E3, - SMSG_OPEN_LFG_DUNGEON_FINDER = 0x29B0, - SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x2754, - SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x2756, - SMSG_OVERRIDE_LIGHT = 0x2669, - SMSG_PAGE_TEXT = 0x26D8, - SMSG_PARTY_COMMAND_RESULT = 0x2751, - SMSG_PARTY_INVITE = 0x2555, - SMSG_PARTY_KILL_LOG = 0x271B, - SMSG_PARTY_MEMBER_STATE = 0x2719, - SMSG_PARTY_UPDATE = 0x258E, - SMSG_PAUSE_MIRROR_TIMER = 0x26D0, - SMSG_PENDING_RAID_LOCK = 0x26B2, - SMSG_PETITION_ALREADY_SIGNED = 0x253E, - SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x2974, - SMSG_PETITION_SHOW_LIST = 0x266C, - SMSG_PETITION_SHOW_SIGNATURES = 0x266D, - SMSG_PETITION_SIGN_RESULTS = 0x270D, - SMSG_PET_ACTION_FEEDBACK = 0x270B, - SMSG_PET_ACTION_SOUND = 0x264A, - SMSG_PET_ADDED = 0x252E, - SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x259B, - SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x261D, - SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x2594, - SMSG_PET_BATTLE_FINAL_ROUND = 0x2599, - SMSG_PET_BATTLE_FINISHED = 0x259A, - SMSG_PET_BATTLE_FIRST_ROUND = 0x2596, - SMSG_PET_BATTLE_INITIAL_UPDATE = 0x2595, - SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x259C, - SMSG_PET_BATTLE_PVP_CHALLENGE = 0x2593, - SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x25D6, - SMSG_PET_BATTLE_QUEUE_STATUS = 0x25D7, - SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x2598, - SMSG_PET_BATTLE_REQUEST_FAILED = 0x2592, - SMSG_PET_BATTLE_ROUND_RESULT = 0x2597, - SMSG_PET_BATTLE_SLOT_UPDATES = 0x2585, - SMSG_PET_CAST_FAILED = 0x2BD3, - SMSG_PET_CLEAR_SPELLS = 0x2BA1, - SMSG_PET_DISMISS_SOUND = 0x264B, - SMSG_PET_GOD_MODE = 0x2625, - SMSG_PET_GUIDS = 0x26C3, - SMSG_PET_LEARNED_SPELLS = 0x2BCD, - SMSG_PET_MODE = 0x2506, - SMSG_PET_NAME_INVALID = 0x2671, - SMSG_PET_SLOT_UPDATED = 0x2505, - SMSG_PET_SPELLS_MESSAGE = 0x2BA2, - SMSG_PET_STABLE_LIST = 0x252F, - SMSG_PET_STABLE_RESULT = 0x2530, - SMSG_PET_TAME_FAILURE = 0x265F, - SMSG_PET_UNLEARNED_SPELLS = 0x2BCE, - SMSG_PHASE_SHIFT_CHANGE = 0x24F5, - SMSG_PLAYED_TIME = 0x268A, - SMSG_PLAYER_BOUND = 0x24FB, - SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x2973, - SMSG_PLAYER_SKINNED = 0x2706, - SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x271A, - SMSG_PLAY_MUSIC = 0x2728, - SMSG_PLAY_OBJECT_SOUND = 0x2729, - SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x26F0, - SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x2BC5, - SMSG_PLAY_SCENE = 0x25D3, - SMSG_PLAY_SOUND = 0x2727, - SMSG_PLAY_SPEAKERBOT_SOUND = 0x272A, - SMSG_PLAY_SPELL_VISUAL = 0x2BC3, - SMSG_PLAY_SPELL_VISUAL_KIT = 0x2BC7, - SMSG_PLAY_TIME_WARNING = 0x26BC, - SMSG_PONG = 0x2FCB, - SMSG_POWER_UPDATE = 0x2680, - SMSG_PRE_RESSURECT = 0x2726, - SMSG_PRINT_NOTIFICATION = 0x2566, - SMSG_PROC_RESIST = 0x271C, - SMSG_PROPOSE_LEVEL_GRANT = 0x2692, - SMSG_PVP_CREDIT = 0x2698, - SMSG_PVP_LOG_DATA = 0x2539, - SMSG_PVP_OPTIONS_ENABLED = 0x253C, - SMSG_PVP_SEASON = 0x2559, - SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x2685, - SMSG_QUERY_CREATURE_RESPONSE = 0x267D, - SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x267E, - SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE = 0x28A2, - SMSG_QUERY_GUILD_INFO_RESPONSE = 0x2962, - SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x2778, - SMSG_QUERY_NPC_TEXT_RESPONSE = 0x2681, - SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x2683, - SMSG_QUERY_PETITION_RESPONSE = 0x2686, - SMSG_QUERY_PET_NAME_RESPONSE = 0x2684, - SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x2682, - SMSG_QUERY_QUEST_INFO_RESPONSE = 0x2A12, - SMSG_QUERY_TIME_RESPONSE = 0x269C, - SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x29FF, - SMSG_QUEST_CONFIRM_ACCEPT = 0x2A0B, - SMSG_QUEST_FORCE_REMOVED = 0x2A17, - SMSG_QUEST_GIVER_INVALID_QUEST = 0x2A02, - SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE = 0x2A10, - SMSG_QUEST_GIVER_QUEST_COMPLETE = 0x2A00, - SMSG_QUEST_GIVER_QUEST_DETAILS = 0x2A0E, - SMSG_QUEST_GIVER_QUEST_FAILED = 0x2A03, - SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE = 0x2A15, - SMSG_QUEST_GIVER_REQUEST_ITEMS = 0x2A0F, - SMSG_QUEST_GIVER_STATUS = 0x2A16, - SMSG_QUEST_GIVER_STATUS_MULTIPLE = 0x2A0D, - SMSG_QUEST_LOG_FULL = 0x2A04, - SMSG_QUEST_POI_QUERY_RESPONSE = 0x2A18, - SMSG_QUEST_PUSH_RESULT = 0x2A0C, - SMSG_QUEST_UPDATE_ADD_CREDIT = 0x2A08, - SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE = 0x2A09, - SMSG_QUEST_UPDATE_ADD_PVP_CREDIT = 0x2A0A, - SMSG_QUEST_UPDATE_COMPLETE = 0x2A05, - SMSG_QUEST_UPDATE_FAILED = 0x2A06, - SMSG_QUEST_UPDATE_FAILED_TIMER = 0x2A07, - SMSG_RAF_EMAIL_ENABLED_RESPONSE = 0x2742, - SMSG_RAID_DIFFICULTY_SET = 0x2761, - SMSG_RAID_GROUP_ONLY = 0x2763, - SMSG_RAID_INSTANCE_MESSAGE = 0x2B37, - SMSG_RAID_MARKERS_CHANGED = 0x253F, - SMSG_RANDOM_ROLL = 0x25CD, - SMSG_RATED_BATTLEFIELD_INFO = 0x252C, - SMSG_READY_CHECK_COMPLETED = 0x2591, - SMSG_READY_CHECK_RESPONSE = 0x2590, - SMSG_READY_CHECK_STARTED = 0x258F, - SMSG_READ_ITEM_RESULT_FAILED = 0x275C, - SMSG_READ_ITEM_RESULT_OK = 0x275B, - SMSG_REALM_QUERY_RESPONSE = 0x2668, - SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x2743, - SMSG_REFER_A_FRIEND_EXPIRED = 0x26E1, - SMSG_REFER_A_FRIEND_FAILURE = 0x266E, - SMSG_REFRESH_COMPONENT = 0x25F9, - SMSG_REFRESH_SPELL_HISTORY = 0x2BAA, - SMSG_REMOVE_ITEM_PASSIVE = 0x2546, - SMSG_REMOVE_LOSS_OF_CONTROL = 0x2618, - SMSG_REPLACE_TROPHY_RESPONSE = 0x2775, - SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x265B, - SMSG_REQUEST_ADDON_LIST = 0x25DF, - SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x2525, - SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x255A, - SMSG_RESEARCH_COMPLETE = 0x2503, - SMSG_RESET_COMPRESSION_CONTEXT = 0x2FCC, - SMSG_RESET_FAILED_NOTIFY = 0x2663, - SMSG_RESET_RANGED_COMBAT_TIMER = 0x2695, - SMSG_RESET_WEEKLY_CURRENCY = 0x24F2, - SMSG_RESPEC_WIPE_CONFIRM = 0x25A8, - SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x24EF, - SMSG_RESUME_CAST_BAR = 0x2BBB, - SMSG_RESUME_COMMS = 0x2FC8, - SMSG_RESUME_TOKEN = 0x2544, - SMSG_RESURRECT_REQUEST = 0x24FC, - SMSG_RESYNC_RUNES = 0x26BF, - SMSG_ROLE_CHANGED_INFORM = 0x2509, - SMSG_ROLE_CHOSEN = 0x29B8, - SMSG_ROLE_POLL_INFORM = 0x250A, - SMSG_RUNE_REGEN_DEBUG = 0x254D, - SMSG_SCENARIO_BOOT = 0x275D, - SMSG_SCENARIO_COMPLETED = 0x2788, - SMSG_SCENARIO_OUT_OF_BOUNDS = 0x275E, - SMSG_SCENARIO_POIS = 0x25CF, - SMSG_SCENARIO_PROGRESS_UPDATE = 0x25C9, - SMSG_SCENARIO_STATE = 0x25C8, - SMSG_SCENE_OBJECT_EVENT = 0x257B, - SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x2580, - SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x2581, - SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x257D, - SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x257C, - SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x257F, - SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x257E, - SMSG_SCRIPT_CAST = 0x2BD1, - SMSG_SELL_RESPONSE = 0x2672, - SMSG_SEND_ITEM_PASSIVES = 0x2547, - SMSG_SEND_KNOWN_SPELLS = 0x2BA8, - SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x25CB, - SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x25CC, - SMSG_SEND_SPELL_CHARGES = 0x2BAB, - SMSG_SEND_SPELL_HISTORY = 0x2BA9, - SMSG_SEND_UNLEARN_SPELLS = 0x2BAC, - SMSG_SERVER_FIRST_ACHIEVEMENT = 0x2B3F, - SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x25EB, - SMSG_SERVER_TIME = 0x262C, - SMSG_SETUP_CURRENCY = 0x24F0, - SMSG_SETUP_RESEARCH_HISTORY = 0x2502, - SMSG_SET_AI_ANIM_KIT = 0x26EF, - SMSG_SET_ALL_TASK_PROGRESS = 0x274B, - SMSG_SET_ANIM_TIER = 0x26F3, - SMSG_SET_CURRENCY = 0x24F1, - SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x29AC, - SMSG_SET_DUNGEON_DIFFICULTY = 0x264F, - SMSG_SET_FACTION_AT_WAR = 0x26BE, - SMSG_SET_FACTION_NOT_VISIBLE = 0x26EA, - SMSG_SET_FACTION_STANDING = 0x26EB, - SMSG_SET_FACTION_VISIBLE = 0x26E9, - SMSG_SET_FLAT_SPELL_MODIFIER = 0x2BB5, - SMSG_SET_FORCED_REACTIONS = 0x26DB, - SMSG_SET_ITEM_PURCHASE_DATA = 0x2536, - SMSG_SET_LOOT_METHOD_FAILED = 0x2784, - SMSG_SET_MAX_WEEKLY_QUANTITY = 0x253D, - SMSG_SET_MELEE_ANIM_KIT = 0x26F2, - SMSG_SET_MOVEMENT_ANIM_KIT = 0x26F1, - SMSG_SET_PCT_SPELL_MODIFIER = 0x2BB6, - SMSG_SET_PET_SPECIALIZATION = 0x25C2, - SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x2689, - SMSG_SET_PLAY_HOVER_ANIM = 0x2551, - SMSG_SET_PROFICIENCY = 0x26F4, - SMSG_SET_SPELL_CHARGES = 0x2BA7, - SMSG_SET_TASK_COMPLETE = 0x274C, - SMSG_SET_TIME_ZONE_INFORMATION = 0x2620, - SMSG_SET_VEHICLE_REC_ID = 0x26B1, - SMSG_SHOW_BANK = 0x2629, - SMSG_SHOW_MAILBOX = 0x275F, - SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x2574, - SMSG_SHOW_TAXI_NODES = 0x2679, - SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x272F, - SMSG_SOCKET_GEMS = 0x26E7, - SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x2576, - SMSG_SPECIAL_MOUNT_ANIM = 0x2649, - SMSG_SPELL_ABSORB_LOG = 0x2B9C, - SMSG_SPELL_CHANNEL_START = 0x2BB3, - SMSG_SPELL_CHANNEL_UPDATE = 0x2BB4, - SMSG_SPELL_COOLDOWN = 0x2B93, - SMSG_SPELL_DAMAGE_SHIELD = 0x2BAF, - SMSG_SPELL_DELAYED = 0x2BBC, - SMSG_SPELL_DISPELL_LOG = 0x2B98, - SMSG_SPELL_ENERGIZE_LOG = 0x2B9A, - SMSG_SPELL_EXECUTE_LOG = 0x2BBD, - SMSG_SPELL_FAILED_OTHER = 0x2BD0, - SMSG_SPELL_FAILURE = 0x2BCF, - SMSG_SPELL_GO = 0x2BB7, - SMSG_SPELL_HEAL_LOG = 0x2B9B, - SMSG_SPELL_INSTAKILL_LOG = 0x2BB1, - SMSG_SPELL_INTERRUPT_LOG = 0x2B9D, - SMSG_SPELL_MISS_LOG = 0x2BBE, - SMSG_SPELL_MULTISTRIKE_EFFECT = 0x2BC0, - SMSG_SPELL_NON_MELEE_DAMAGE_LOG = 0x2BB0, - SMSG_SPELL_OR_DAMAGE_IMMUNE = 0x2BAD, - SMSG_SPELL_PERIODIC_AURA_LOG = 0x2B99, - SMSG_SPELL_START = 0x2BB8, - SMSG_SPELL_UPDATE_CHAIN_TARGETS = 0x2BB2, - SMSG_SPIRIT_HEALER_CONFIRM = 0x26D5, - SMSG_STAND_STATE_UPDATE = 0x26DA, - SMSG_START_ELAPSED_TIMER = 0x259D, - SMSG_START_ELAPSED_TIMERS = 0x259F, - SMSG_START_LOOT_ROLL = 0x25B3, - SMSG_START_MIRROR_TIMER = 0x26CF, - SMSG_START_TIMER = 0x2541, - SMSG_STOP_ELAPSED_TIMER = 0x259E, - SMSG_STOP_MIRROR_TIMER = 0x26D1, - SMSG_STOP_SPEAKERBOT_SOUND = 0x272B, - SMSG_STREAMING_MOVIES = 0x2540, - SMSG_SUMMON_CANCEL = 0x265A, - SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x250B, - SMSG_SUMMON_REQUEST = 0x26DF, - SMSG_SUPERCEDED_SPELLS = 0x2BCA, - SMSG_SUPPRESS_NPC_GREETINGS = 0x2554, - SMSG_SUSPEND_COMMS = 0x2FC7, - SMSG_SUSPEND_TOKEN = 0x2543, - SMSG_TALENTS_INVOLUNTARILY_RESET = 0x26D7, - SMSG_TAXI_NODE_STATUS = 0x2626, - SMSG_TEXT_EMOTE = 0x2624, - SMSG_THREAT_CLEAR = 0x2691, - SMSG_THREAT_REMOVE = 0x2690, - SMSG_THREAT_UPDATE = 0x268F, - SMSG_TIME_ADJUSTMENT = 0x2D1F, - SMSG_TIME_SYNC_REQUEST = 0x2D1E, - SMSG_TITLE_EARNED = 0x268C, - SMSG_TITLE_LOST = 0x268D, - SMSG_TOTEM_CREATED = 0x2675, - SMSG_TOTEM_MOVED = 0x2676, - SMSG_TRADE_STATUS = 0x24FF, - SMSG_TRADE_UPDATED = 0x24FE, - SMSG_TRAINER_BUY_FAILED = 0x2697, - SMSG_TRAINER_LIST = 0x2696, - SMSG_TRANSFER_ABORTED = 0x26C2, - SMSG_TRANSFER_PENDING = 0x2569, - SMSG_TRIGGER_CINEMATIC = 0x277C, - SMSG_TRIGGER_MOVIE = 0x2677, - SMSG_TURN_IN_PETITION_RESULT = 0x270F, - SMSG_TUTORIAL_FLAGS = 0x2770, - SMSG_TWITTER_STATUS = 0x2F7B, - SMSG_UI_TIME = 0x26D4, - SMSG_UNDELETE_CHARACTER_RESPONSE = 0x277F, - SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x2780, - SMSG_UNLEARNED_SPELLS = 0x2BCC, - SMSG_UPDATE_ACCOUNT_DATA = 0x26C9, - SMSG_UPDATE_ACTION_BUTTONS = 0x2579, - SMSG_UPDATE_CHARACTER_FLAGS = 0x2774, - SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT = 0x29AF, - SMSG_UPDATE_EXPANSION_LEVEL = 0x25E4, - SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x2652, - SMSG_UPDATE_LAST_INSTANCE = 0x2632, - SMSG_UPDATE_OBJECT = 0x277D, - SMSG_UPDATE_TALENT_DATA = 0x256E, - SMSG_UPDATE_TASK_PROGRESS = 0x274A, - SMSG_UPDATE_WEEKLY_SPELL_USAGE = 0x2B97, - SMSG_UPDATE_WORLD_STATE = 0x270A, - SMSG_USERLIST_ADD = 0x2B3C, - SMSG_USERLIST_REMOVE = 0x2B3D, - SMSG_USERLIST_UPDATE = 0x2B3E, - SMSG_USE_EQUIPMENT_SET_RESULT = 0x2710, - SMSG_VENDOR_INVENTORY = 0x254F, - SMSG_VIGNETTE_UPDATE = 0x272D, - SMSG_VOICE_CHAT_STATUS = 0x2B31, - SMSG_VOICE_PARENTAL_CONTROLS = 0x2B32, - SMSG_VOICE_SESSION_LEAVE = 0x2B34, - SMSG_VOICE_SESSION_ROSTER_UPDATE = 0x2B33, - SMSG_VOID_ITEM_SWAP_RESPONSE = 0x2564, - SMSG_VOID_STORAGE_CONTENTS = 0x2561, - SMSG_VOID_STORAGE_FAILED = 0x2560, - SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x2562, - SMSG_VOID_TRANSFER_RESULT = 0x2563, - SMSG_WAIT_QUEUE_FINISH = 0x24EC, - SMSG_WAIT_QUEUE_UPDATE = 0x24EB, - SMSG_WARDEN_DATA = 0x24F4, - SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x253A, - SMSG_WEATHER = 0x2651, - SMSG_WEEKLY_SPELL_USAGE = 0x2B96, - SMSG_WHO = 0x2B2C, - SMSG_WHO_IS = 0x2650, - SMSG_WORLD_SERVER_INFO = 0x2548, - SMSG_WORLD_TEXT = 0x2789, - SMSG_WOW_TOKEN_AUCTION_SOLD = 0x2790, - SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION = 0x2792, - SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION = 0x2793, - SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE = 0x278D, - SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED = 0x2794, - SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION = 0x2795, - SMSG_WOW_TOKEN_REDEEM_RESULT = 0x2796, - SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION = 0x278E, - SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION = 0x278F, - SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE = 0x2797, - SMSG_XP_GAIN_ABORTED = 0x2565, - SMSG_XP_GAIN_ENABLED = 0x2762, - SMSG_ZONE_UNDER_ATTACK = 0x2B38, + SMSG_ABORT_NEW_WORLD = 0x25AB, + SMSG_ACCOUNT_CRITERIA_UPDATE = 0x264E, + SMSG_ACCOUNT_DATA_TIMES = 0x2746, + SMSG_ACCOUNT_MOUNT_UPDATE = 0x25C1, + SMSG_ACCOUNT_TOYS_UPDATE = 0x25C2, + SMSG_ACHIEVEMENT_DELETED = 0x271B, + SMSG_ACHIEVEMENT_EARNED = 0x265C, + SMSG_ACTIVATE_TAXI_REPLY = 0x26A2, + SMSG_ACTIVE_GLYPHS = 0x2C52, + SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x2656, + SMSG_ADD_ITEM_PASSIVE = 0x25BD, + SMSG_ADD_LOSS_OF_CONTROL = 0x2692, + SMSG_ADD_RUNE_POWER = 0x26DF, + SMSG_ADJUST_SPLINE_DURATION = 0x25E4, + SMSG_AE_LOOT_TARGETS = 0x2628, + SMSG_AE_LOOT_TARGET_ACK = 0x2629, + SMSG_AI_REACTION = 0x26DC, + 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 = 0x2780, + SMSG_AREA_TRIGGER_DENIED = 0x2699, + SMSG_AREA_TRIGGER_NO_CORPSE = 0x2752, + SMSG_AREA_TRIGGER_RE_PATH = 0x263C, + SMSG_AREA_TRIGGER_RE_SHAPE = 0x2639, + SMSG_ARENA_ERROR = 0x270E, + SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2661, + SMSG_ARTIFACT_APPEARANCE_CHANGED = 0x27E3, + SMSG_ARTIFACT_FORGE_OPENED = 0x27E1, + SMSG_ARTIFACT_POWERS_UPDATED = 0x27E2, + SMSG_ARTIFACT_XP_GAIN = 0x2823, + SMSG_ATTACKER_STATE_UPDATE = 0x27CE, + 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_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_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 = 0x279E, + SMSG_BATTLEGROUND_PLAYER_JOINED = 0x2598, + SMSG_BATTLEGROUND_PLAYER_LEFT = 0x2599, + SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x2595, + SMSG_BATTLEGROUND_POINTS = 0x279D, + SMSG_BATTLENET_CHALLENGE_ABORT = 0x27CD, + SMSG_BATTLENET_CHALLENGE_START = 0x27CC, + SMSG_BATTLENET_NOTIFICATION = 0x2838, + SMSG_BATTLENET_REALM_LIST_TICKET = 0x283A, + SMSG_BATTLENET_RESPONSE = 0x2837, + SMSG_BATTLENET_SET_SESSION_STATE = 0x2839, + SMSG_BATTLE_PAY_ACK_FAILED = 0x27C5, + SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x27C4, + SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x27B8, + SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x27B7, + SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x27B6, + SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x27B4, + SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x27B2, + SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x27B3, + SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x27C3, + SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x27C1, + SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x27C0, + SMSG_BATTLE_PAY_VAS_BOOST_CONSUMED = 0x27B5, + SMSG_BATTLE_PAY_VAS_CHARACTER_LIST = 0x2827, + SMSG_BATTLE_PAY_VAS_PURCHASE_COMPLETE = 0x282A, + SMSG_BATTLE_PAY_VAS_PURCHASE_LIST = 0x282B, + SMSG_BATTLE_PAY_VAS_PURCHASE_STARTED = 0x2829, + SMSG_BATTLE_PETS_HEALED = 0x2606, + SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x269C, + SMSG_BATTLE_PET_DELETED = 0x2603, + SMSG_BATTLE_PET_ERROR = 0x2651, + 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 = 0x2736, + 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 = 0x27BF, + SMSG_BREAK_TARGET = 0x2668, + SMSG_BUY_FAILED = 0x26EE, + SMSG_BUY_SUCCEEDED = 0x26ED, + SMSG_CACHE_INFO = 0x2740, + 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 = 0x2764, + SMSG_CAMERA_SHAKE = 0x2765, + SMSG_CANCEL_AUTO_REPEAT = 0x270F, + SMSG_CANCEL_COMBAT = 0x272E, + SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x2C45, + SMSG_CANCEL_SCENE = 0x2650, + SMSG_CANCEL_SPELL_VISUAL = 0x2C43, + SMSG_CANCEL_SPELL_VISUAL_KIT = 0x2C47, + SMSG_CAN_DUEL_RESULT = 0x2672, + SMSG_CAST_FAILED = 0x2C55, + SMSG_CATEGORY_COOLDOWN = 0x2C16, + 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_REWARDS = 0x261D, + SMSG_CHALLENGE_MODE_START = 0x261A, + 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_CLASS_TRIAL_CREATE = 0x27FC, + SMSG_CHARACTER_ITEM_FIXUP = 0x2845, + SMSG_CHARACTER_LOGIN_FAILED = 0x2741, + SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x27CB, + SMSG_CHARACTER_RENAME_RESULT = 0x27A4, + SMSG_CHARACTER_UPGRADE_COMPLETE = 0x27FB, + SMSG_CHARACTER_UPGRADE_QUEUED = 0x27FA, + SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET = 0x25F1, + SMSG_CHARACTER_UPGRADE_STARTED = 0x27F9, + SMSG_CHAR_CUSTOMIZE = 0x2716, + SMSG_CHAR_CUSTOMIZE_FAILED = 0x2715, + SMSG_CHAR_FACTION_CHANGE_RESULT = 0x27E8, + SMSG_CHAT = 0x2BAD, + SMSG_CHAT_AUTO_RESPONDED = 0x2BBD, + SMSG_CHAT_DOWN = 0x2BC2, + SMSG_CHAT_IGNORED_ACCOUNT_MUTED = 0x2BAC, + SMSG_CHAT_IS_DOWN = 0x2BC3, + SMSG_CHAT_NOT_IN_PARTY = 0x2BB7, + SMSG_CHAT_PLAYER_AMBIGUOUS = 0x2BB0, + SMSG_CHAT_PLAYER_NOTFOUND = 0x2BBC, + SMSG_CHAT_RECONNECT = 0x2BC4, + SMSG_CHAT_RESTRICTED = 0x2BB8, + SMSG_CHAT_SERVER_MESSAGE = 0x2BC9, + SMSG_CHEAT_IGNORE_DIMISHING_RETURNS = 0x2C12, + SMSG_CHECK_WARGAME_ENTRY = 0x259E, + SMSG_CLEAR_ALL_SPELL_CHARGES = 0x2C26, + SMSG_CLEAR_BOSS_EMOTES = 0x25CA, + SMSG_CLEAR_COOLDOWN = 0x26E1, + SMSG_CLEAR_COOLDOWNS = 0x2C25, + SMSG_CLEAR_LOSS_OF_CONTROL = 0x2694, + SMSG_CLEAR_SPELL_CHARGES = 0x2C27, + SMSG_CLEAR_TARGET = 0x26D8, + SMSG_COIN_REMOVED = 0x2627, + SMSG_COMBAT_EVENT_FAILED = 0x266B, + SMSG_COMMENTATOR_MAP_INFO = 0x2743, + SMSG_COMMENTATOR_PLAYER_INFO = 0x2744, + SMSG_COMMENTATOR_STATE_CHANGED = 0x2742, + SMSG_COMPLAINT_RESULT = 0x26D0, + SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x27DD, + SMSG_CONNECT_TO = 0x304D, + SMSG_CONQUEST_FORMULA_CONSTANTS = 0x27C6, + SMSG_CONSOLE_WRITE = 0x264D, + SMSG_CONTACT_LIST = 0x27C9, + SMSG_CONTROL_UPDATE = 0x2660, + SMSG_COOLDOWN_CHEAT = 0x2779, + SMSG_COOLDOWN_EVENT = 0x26E0, + SMSG_CORPSE_LOCATION = 0x2667, + SMSG_CORPSE_RECLAIM_DELAY = 0x278C, + SMSG_CORPSE_TRANSPORT_QUERY = 0x274E, + SMSG_CREATE_CHAR = 0x273B, + SMSG_CREATE_SHIPMENT_RESPONSE = 0x27DC, + SMSG_CRITERIA_DELETED = 0x271A, + SMSG_CRITERIA_UPDATE = 0x2714, + SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26E9, + SMSG_CUSTOM_LOAD_SCREEN = 0x25DF, + SMSG_DAILY_QUESTS_RESET = 0x2A80, + SMSG_DAMAGE_CALC_LOG = 0x2803, + SMSG_DANCE_STUDIO_CREATE_RESULT = 0x27A1, + SMSG_DB_REPLY = 0x25A0, + SMSG_DEATH_RELEASE_LOC = 0x2702, + SMSG_DEFENSE_MESSAGE = 0x2BBB, + SMSG_DELETE_CHAR = 0x273C, + SMSG_DESTROY_ARENA_UNIT = 0x2782, + SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x272F, + SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x258A, + SMSG_DISENCHANT_CREDIT = 0x25BA, + SMSG_DISMOUNT = 0x26D7, + SMSG_DISMOUNT_RESULT = 0x257B, + SMSG_DISPEL_FAILED = 0x2C2F, + SMSG_DISPLAY_GAME_ERROR = 0x25B3, + SMSG_DISPLAY_PLAYER_CHOICE = 0x269D, + SMSG_DISPLAY_PROMOTION = 0x2664, + SMSG_DISPLAY_QUEST_POPUP = 0x2A9C, + SMSG_DISPLAY_TOAST = 0x2635, + SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x25F3, + SMSG_DROP_NEW_CONNECTION = 0x304C, + 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 = 0x2788, + SMSG_EMOTE = 0x2804, + SMSG_ENABLE_BARBER_SHOP = 0x26E4, + SMSG_ENABLE_ENCRYPTION = 0x3049, + SMSG_ENCHANTMENT_LOG = 0x274F, + SMSG_ENCOUNTER_END = 0x27BE, + SMSG_ENCOUNTER_START = 0x27BD, + SMSG_ENUM_CHARACTERS_RESULT = 0x2582, + SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x2C20, + SMSG_EQUIPMENT_SET_ID = 0x26D9, + SMSG_EXPECTED_SPAM_RECORDS = 0x2BB1, + SMSG_EXPLORATION_EXPERIENCE = 0x27A0, + SMSG_FACTION_BONUS_INFO = 0x2763, + SMSG_FAILED_PLAYER_CONDITION = 0x25DE, + SMSG_FEATURE_SYSTEM_STATUS = 0x25CE, + SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x25CF, + SMSG_FEIGN_DEATH_RESISTED = 0x2785, + SMSG_FISH_ESCAPED = 0x26F6, + SMSG_FISH_NOT_HOOKED = 0x26F5, + SMSG_FLIGHT_SPLINE_SYNC = 0x2DF7, + SMSG_FORCED_DEATH_UPDATE = 0x2703, + SMSG_FORCE_ANIM = 0x2792, + SMSG_FORCE_OBJECT_RELINK = 0x2663, + SMSG_FRIEND_STATUS = 0x27CA, + 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 = 0x275A, + SMSG_GAME_OBJECT_SET_STATE = 0x2836, + SMSG_GAME_OBJECT_UI_ACTION = 0x2757, + SMSG_GAME_SPEED_SET = 0x26A6, + SMSG_GAME_TIME_SET = 0x2748, + SMSG_GAME_TIME_UPDATE = 0x2747, + 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 = 0x292C, + SMSG_GARRISON_BUILDING_REMOVED = 0x28F4, + SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0x28F6, + SMSG_GARRISON_CLEAR_ALL_FOLLOWERS_EXHAUSTION = 0x2916, + SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x2909, + SMSG_GARRISON_CREATE_RESULT = 0x28FC, + SMSG_GARRISON_DELETE_RESULT = 0x2920, + SMSG_GARRISON_FOLLOWER_CHANGED_ABILITIES = 0x2914, + SMSG_GARRISON_FOLLOWER_CHANGED_DURABILITY = 0x2904, + SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x2913, + SMSG_GARRISON_FOLLOWER_CHANGED_STATUS = 0x2915, + SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x2912, + SMSG_GARRISON_IS_UPGRADEABLE_RESULT = 0x2929, + SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO = 0x27DF, + SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x28F7, + SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x28F5, + 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 = 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 = 0x2919, + SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x2903, + SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0x28F9, + SMSG_GARRISON_START_MISSION_RESULT = 0x2907, + SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x28F8, + SMSG_GARRISON_UPGRADE_RESULT = 0x28FD, + SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x2583, + SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A2, + SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE = 0x2928, + SMSG_GET_GARRISON_INFO_RESULT = 0x28F0, + SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x27DE, + SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x27DA, + SMSG_GET_TROPHY_LIST_RESPONSE = 0x27FF, + SMSG_GM_PLAYER_INFO = 0x2778, + SMSG_GM_REQUEST_PLAYER_INFO = 0x25E9, + SMSG_GM_TICKET_CASE_STATUS = 0x26C9, + SMSG_GM_TICKET_SYSTEM_STATUS = 0x26C8, + SMSG_GOD_MODE = 0x2735, + SMSG_GOSSIP_COMPLETE = 0x2A96, + SMSG_GOSSIP_MESSAGE = 0x2A97, + SMSG_GOSSIP_POI = 0x27D7, + SMSG_GROUP_ACTION_THROTTLED = 0x259C, + SMSG_GROUP_DECLINE = 0x27D2, + SMSG_GROUP_DESTROYED = 0x27D4, + SMSG_GROUP_NEW_LEADER = 0x2646, + SMSG_GROUP_UNINVITE = 0x27D3, + SMSG_GUILD_ACHIEVEMENT_DELETED = 0x29C5, + SMSG_GUILD_ACHIEVEMENT_EARNED = 0x29C4, + SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x29C7, + 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 = 0x29DD, + SMSG_GUILD_COMMAND_RESULT = 0x29BA, + SMSG_GUILD_CRITERIA_DELETED = 0x29C6, + SMSG_GUILD_CRITERIA_UPDATE = 0x29C3, + 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 = 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 = 0x29E4, + SMSG_GUILD_MEMBER_RECIPES = 0x29BD, + SMSG_GUILD_MEMBER_UPDATE_NOTE = 0x29C9, + 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 = 0x29E1, + SMSG_GUILD_RANKS = 0x29C8, + SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0x29CC, + 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 = 0x26F9, + SMSG_HIGHEST_THREAT_UPDATE = 0x2709, + SMSG_HOTFIX_NOTIFY = 0x25A1, + SMSG_HOTFIX_NOTIFY_BLOB = 0x25A2, + SMSG_INITIALIZE_FACTIONS = 0x2762, + SMSG_INITIAL_SETUP = 0x257F, + SMSG_INIT_WORLD_STATES = 0x2789, + SMSG_INSPECT_HONOR_STATS = 0x25B0, + SMSG_INSPECT_PVP = 0x275E, + SMSG_INSPECT_RESULT = 0x264A, + SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x27EE, + SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x27ED, + SMSG_INSTANCE_ENCOUNTER_END = 0x27F4, + SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x27EC, + SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x27F6, + SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x27F5, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x27F1, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x27F0, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x27F3, + SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x27F7, + SMSG_INSTANCE_ENCOUNTER_START = 0x27F2, + SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x27EF, + SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x2733, + SMSG_INSTANCE_INFO = 0x264C, + SMSG_INSTANCE_RESET = 0x26AB, + SMSG_INSTANCE_RESET_FAILED = 0x26AC, + SMSG_INSTANCE_SAVE_CREATED = 0x27BC, + SMSG_INVALIDATE_PAGE_TEXT = 0x26FE, + SMSG_INVALIDATE_PLAYER = 0x26CF, + SMSG_INVALID_PROMOTION_CODE = 0x2793, + SMSG_INVENTORY_CHANGE_FAILURE = 0x2760, + SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x2A83, + SMSG_ITEM_CHANGED = 0x271D, + SMSG_ITEM_COOLDOWN = 0x2802, + SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x2795, + SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x25AF, + SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x25AD, + SMSG_ITEM_PUSH_RESULT = 0x2634, + SMSG_ITEM_TIME_UPDATE = 0x2794, + SMSG_KICK_REASON = 0x2826, + SMSG_LEARNED_SPELLS = 0x2C4C, + SMSG_LEARN_PVP_TALENTS_FAILED = 0x25E6, + SMSG_LEARN_TALENTS_FAILED = 0x25E5, + 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 = 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 = 0x2A3B, + SMSG_LFG_READY_CHECK_UPDATE = 0x2A22, + SMSG_LFG_ROLE_CHECK_UPDATE = 0x2A21, + SMSG_LFG_SLOT_INVALID = 0x2A30, + SMSG_LFG_TELEPORT_DENIED = 0x2A33, + SMSG_LFG_UPDATE_STATUS = 0x2A24, + SMSG_LF_GUILD_APPLICANT_LIST_CHANGED = 0x29D5, + SMSG_LF_GUILD_APPLICATIONS = 0x29D1, + 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 = 0x27B0, + SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x27AE, + SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A3, + SMSG_LOAD_CUF_PROFILES = 0x25CB, + SMSG_LOAD_EQUIPMENT_SET = 0x274A, + SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x2800, + SMSG_LOGIN_SET_TIME_SPEED = 0x2749, + 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 = 0x2632, + SMSG_LOOT_ITEM_LIST = 0x2630, + SMSG_LOOT_LIST = 0x2781, + 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 = 0x2691, + SMSG_MAIL_COMMAND_RESULT = 0x2654, + SMSG_MAIL_LIST_RESULT = 0x2796, + SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x2797, + SMSG_MAP_OBJECTIVES_INIT = 0x279F, + SMSG_MAP_OBJ_EVENTS = 0x25D5, + SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x262F, + SMSG_MESSAGE_BOX = 0x2575, + SMSG_MINIMAP_PING = 0x26F4, + SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x2C14, + SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x2C13, + SMSG_MISSILE_CANCEL = 0x25D6, + SMSG_MODIFY_CHARGE_RECOVERY_SPEED = 0x27A7, + SMSG_MODIFY_COOLDOWN = 0x27A5, + SMSG_MODIFY_COOLDOWN_RECOVERY_SPEED = 0x27A6, + SMSG_MODIFY_PARTY_RANGE = 0x2784, + SMSG_MOTD = 0x2BAF, + SMSG_MOUNT_RESULT = 0x257A, + SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x2DE1, + SMSG_MOVE_DISABLE_COLLISION = 0x2DDD, + SMSG_MOVE_DISABLE_GRAVITY = 0x2DDB, + SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x2DDA, + SMSG_MOVE_ENABLE_COLLISION = 0x2DDE, + SMSG_MOVE_ENABLE_GRAVITY = 0x2DDC, + SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x2DD9, + SMSG_MOVE_KNOCK_BACK = 0x2DD1, + SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0x2DE2, + SMSG_MOVE_ROOT = 0x2DC7, + SMSG_MOVE_SET_ACTIVE_MOVER = 0x2DA3, + SMSG_MOVE_SET_CAN_FLY = 0x2DD3, + SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING = 0x2DD5, + SMSG_MOVE_SET_COLLISION_HEIGHT = 0x2DDF, + SMSG_MOVE_SET_COMPOUND_STATE = 0x2DE3, + SMSG_MOVE_SET_FEATHER_FALL = 0x2DCD, + SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0x2DC3, + SMSG_MOVE_SET_FLIGHT_SPEED = 0x2DC2, + SMSG_MOVE_SET_HOVERING = 0x2DCF, + SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES = 0x2DD7, + SMSG_MOVE_SET_LAND_WALK = 0x2DCC, + SMSG_MOVE_SET_NORMAL_FALL = 0x2DCE, + SMSG_MOVE_SET_PITCH_RATE = 0x2DC6, + SMSG_MOVE_SET_RUN_BACK_SPEED = 0x2DBF, + SMSG_MOVE_SET_RUN_SPEED = 0x2DBE, + SMSG_MOVE_SET_SWIM_BACK_SPEED = 0x2DC1, + SMSG_MOVE_SET_SWIM_SPEED = 0x2DC0, + SMSG_MOVE_SET_TURN_RATE = 0x2DC5, + SMSG_MOVE_SET_VEHICLE_REC_ID = 0x2DE0, + SMSG_MOVE_SET_WALK_SPEED = 0x2DC4, + SMSG_MOVE_SET_WATER_WALK = 0x2DC9, + SMSG_MOVE_SKIP_TIME = 0x2DE4, + SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0x2DE9, + SMSG_MOVE_SPLINE_DISABLE_GRAVITY = 0x2DE7, + SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0x2DEA, + SMSG_MOVE_SPLINE_ENABLE_GRAVITY = 0x2DE8, + SMSG_MOVE_SPLINE_ROOT = 0x2DE5, + SMSG_MOVE_SPLINE_SET_FEATHER_FALL = 0x2DEB, + SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED = 0x2DBA, + SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED = 0x2DB9, + SMSG_MOVE_SPLINE_SET_FLYING = 0x2DF5, + SMSG_MOVE_SPLINE_SET_HOVER = 0x2DED, + SMSG_MOVE_SPLINE_SET_LAND_WALK = 0x2DF0, + SMSG_MOVE_SPLINE_SET_NORMAL_FALL = 0x2DEC, + SMSG_MOVE_SPLINE_SET_PITCH_RATE = 0x2DBD, + SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED = 0x2DB6, + SMSG_MOVE_SPLINE_SET_RUN_MODE = 0x2DF3, + SMSG_MOVE_SPLINE_SET_RUN_SPEED = 0x2DB5, + SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED = 0x2DB8, + SMSG_MOVE_SPLINE_SET_SWIM_SPEED = 0x2DB7, + SMSG_MOVE_SPLINE_SET_TURN_RATE = 0x2DBC, + SMSG_MOVE_SPLINE_SET_WALK_MODE = 0x2DF4, + SMSG_MOVE_SPLINE_SET_WALK_SPEED = 0x2DBB, + SMSG_MOVE_SPLINE_SET_WATER_WALK = 0x2DEF, + SMSG_MOVE_SPLINE_START_SWIM = 0x2DF1, + SMSG_MOVE_SPLINE_STOP_SWIM = 0x2DF2, + SMSG_MOVE_SPLINE_UNROOT = 0x2DE6, + SMSG_MOVE_SPLINE_UNSET_FLYING = 0x2DF6, + SMSG_MOVE_SPLINE_UNSET_HOVER = 0x2DEE, + SMSG_MOVE_TELEPORT = 0x2DD2, + SMSG_MOVE_UNROOT = 0x2DC8, + SMSG_MOVE_UNSET_CAN_FLY = 0x2DD4, + SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING = 0x2DD6, + SMSG_MOVE_UNSET_HOVERING = 0x2DD0, + SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x2DD8, + SMSG_MOVE_UPDATE = 0x2DAE, + SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0x2DB2, + SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x2DAD, + SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0x2DAA, + SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0x2DA9, + SMSG_MOVE_UPDATE_KNOCK_BACK = 0x2DB0, + SMSG_MOVE_UPDATE_PITCH_RATE = 0x2DAC, + SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE = 0x2DB3, + SMSG_MOVE_UPDATE_RUN_BACK_SPEED = 0x2DA5, + SMSG_MOVE_UPDATE_RUN_SPEED = 0x2DA4, + SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0x2DA8, + SMSG_MOVE_UPDATE_SWIM_SPEED = 0x2DA7, + SMSG_MOVE_UPDATE_TELEPORT = 0x2DAF, + SMSG_MOVE_UPDATE_TURN_RATE = 0x2DAB, + SMSG_MOVE_UPDATE_WALK_SPEED = 0x2DA6, + SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x25EE, + SMSG_NEW_TAXI_PATH = 0x26A3, + SMSG_NEW_WORLD = 0x25A9, + SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x2C42, + SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x26CE, + SMSG_NOTIFY_MONEY = 0x25AC, + SMSG_NOTIFY_RECEIVED_MAIL = 0x2655, + SMSG_OFFER_PETITION_ERROR = 0x26DD, + SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x2719, + SMSG_ON_MONSTER_MOVE = 0x2DA2, + SMSG_OPEN_CONTAINER = 0x2761, + SMSG_OPEN_LFG_DUNGEON_FINDER = 0x2A32, + SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x27D9, + SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x27DB, + SMSG_OVERRIDE_LIGHT = 0x26E3, + SMSG_PAGE_TEXT = 0x2756, + SMSG_PARTY_COMMAND_RESULT = 0x27D6, + SMSG_PARTY_INVITE = 0x25CC, + SMSG_PARTY_KILL_LOG = 0x279B, + SMSG_PARTY_MEMBER_STATE = 0x2799, + SMSG_PARTY_MEMBER_STATE_UPDATE = 0x2798, + SMSG_PARTY_UPDATE = 0x2608, + SMSG_PAUSE_MIRROR_TIMER = 0x274C, + SMSG_PENDING_RAID_LOCK = 0x272D, + 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 = 0x278D, + SMSG_PET_ACTION_FEEDBACK = 0x278B, + SMSG_PET_ACTION_SOUND = 0x26C5, + SMSG_PET_ADDED = 0x25A6, + SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x2615, + SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x2698, + 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 = 0x2652, + SMSG_PET_BATTLE_QUEUE_STATUS = 0x2653, + 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_LEARNED_SPELLS = 0x2C4E, + SMSG_PET_MODE = 0x2589, + SMSG_PET_NAME_INVALID = 0x26EB, + 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_UNLEARNED_SPELLS = 0x2C4F, + SMSG_PHASE_SHIFT_CHANGE = 0x2577, + SMSG_PLAYED_TIME = 0x2705, + SMSG_PLAYER_BOUND = 0x257D, + SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x29F6, + SMSG_PLAYER_SKINNED = 0x2786, + SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x279A, + SMSG_PLAY_MUSIC = 0x27AA, + SMSG_PLAY_OBJECT_SOUND = 0x27AB, + SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x2770, + SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x2C46, + SMSG_PLAY_SCENE = 0x264F, + SMSG_PLAY_SOUND = 0x27A9, + SMSG_PLAY_SPEAKERBOT_SOUND = 0x27AC, + SMSG_PLAY_SPELL_VISUAL = 0x2C44, + SMSG_PLAY_SPELL_VISUAL_KIT = 0x2C48, + SMSG_PLAY_TIME_WARNING = 0x2737, + SMSG_PONG = 0x304E, + SMSG_POWER_UPDATE = 0x26FA, + SMSG_PRESTIGE_AND_HONOR_INVOLUNTARILY_CHANGED = 0x2755, + SMSG_PRE_RESSURECT = 0x27A8, + SMSG_PRINT_NOTIFICATION = 0x25DD, + SMSG_PROC_RESIST = 0x279C, + SMSG_PROPOSE_LEVEL_GRANT = 0x270D, + SMSG_PUSH_SPELL_TO_ACTION_BAR = 0x2C50, + SMSG_PVP_CREDIT = 0x2713, + SMSG_PVP_LOG_DATA = 0x25B1, + SMSG_PVP_OPTIONS_ENABLED = 0x25B4, + SMSG_PVP_SEASON = 0x25D0, + SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x2700, + SMSG_QUERY_CREATURE_RESPONSE = 0x26F7, + SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x26F8, + SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE = 0x292B, + SMSG_QUERY_GUILD_INFO_RESPONSE = 0x29E5, + SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x2801, + 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_QUEST_INFO_RESPONSE = 0x2A95, + SMSG_QUERY_QUEST_REWARD_RESPONSE = 0x283B, + SMSG_QUERY_TIME_RESPONSE = 0x2717, + SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x2A81, + SMSG_QUEST_CONFIRM_ACCEPT = 0x2A8E, + SMSG_QUEST_FORCE_REMOVED = 0x2A9A, + SMSG_QUEST_GIVER_INVALID_QUEST = 0x2A84, + SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE = 0x2A93, + SMSG_QUEST_GIVER_QUEST_COMPLETE = 0x2A82, + SMSG_QUEST_GIVER_QUEST_DETAILS = 0x2A91, + SMSG_QUEST_GIVER_QUEST_FAILED = 0x2A85, + SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE = 0x2A98, + SMSG_QUEST_GIVER_REQUEST_ITEMS = 0x2A92, + SMSG_QUEST_GIVER_STATUS = 0x2A99, + SMSG_QUEST_GIVER_STATUS_MULTIPLE = 0x2A90, + SMSG_QUEST_IGNORED = 0x2A9F, + SMSG_QUEST_LOG_FULL = 0x2A86, + 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, + SMSG_QUEST_UPDATE_COMPLETE = 0x2A88, + SMSG_QUEST_UPDATE_COMPLETE_BY_SPELL = 0x2A87, + SMSG_QUEST_UPDATE_FAILED = 0x2A89, + SMSG_QUEST_UPDATE_FAILED_TIMER = 0x2A8A, + SMSG_RAF_EMAIL_ENABLED_RESPONSE = 0x27C7, + SMSG_RAID_DIFFICULTY_SET = 0x27E9, + SMSG_RAID_GROUP_ONLY = 0x27EB, + SMSG_RAID_INSTANCE_MESSAGE = 0x2BB9, + SMSG_RAID_MARKERS_CHANGED = 0x25B7, + SMSG_RANDOM_ROLL = 0x2649, + SMSG_RATED_BATTLEFIELD_INFO = 0x25A4, + SMSG_READY_CHECK_COMPLETED = 0x260B, + SMSG_READY_CHECK_RESPONSE = 0x260A, + SMSG_READY_CHECK_STARTED = 0x2609, + SMSG_READ_ITEM_RESULT_FAILED = 0x27E5, + SMSG_READ_ITEM_RESULT_OK = 0x27E0, + SMSG_REALM_QUERY_RESPONSE = 0x26E2, + SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x27C8, + SMSG_REFER_A_FRIEND_EXPIRED = 0x275F, + SMSG_REFER_A_FRIEND_FAILURE = 0x26E8, + SMSG_REFRESH_COMPONENT = 0x2674, + SMSG_REFRESH_SPELL_HISTORY = 0x2C2B, + SMSG_REMOVE_ITEM_PASSIVE = 0x25BE, + SMSG_REMOVE_LOSS_OF_CONTROL = 0x2693, + SMSG_REPLACE_TROPHY_RESPONSE = 0x27FE, + SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x26D6, + SMSG_REQUEST_ADDON_LIST = 0x265B, + SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x259D, + SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x25D1, + SMSG_RESEARCH_COMPLETE = 0x2585, + SMSG_RESET_AREA_TRIGGER = 0x263D, + SMSG_RESET_COMPRESSION_CONTEXT = 0x304F, + SMSG_RESET_FAILED_NOTIFY = 0x26DE, + SMSG_RESET_RANGED_COMBAT_TIMER = 0x2710, + SMSG_RESET_WEEKLY_CURRENCY = 0x2574, + SMSG_RESPEC_WIPE_CONFIRM = 0x2622, + SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x2571, + SMSG_RESUME_CAST_BAR = 0x2C3D, + SMSG_RESUME_COMMS = 0x304B, + 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 = 0x27E6, + SMSG_SCENARIO_COMPLETED = 0x2822, + SMSG_SCENARIO_POIS = 0x264B, + SMSG_SCENARIO_PROGRESS_UPDATE = 0x2645, + SMSG_SCENARIO_SPELL_UPDATE = 0x282E, + SMSG_SCENARIO_STATE = 0x2644, + 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_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_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_SETUP_CURRENCY = 0x2572, + SMSG_SETUP_RESEARCH_HISTORY = 0x2584, + SMSG_SET_AI_ANIM_KIT = 0x276F, + SMSG_SET_ALL_TASK_PROGRESS = 0x27D0, + SMSG_SET_ANIM_TIER = 0x2773, + 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 = 0x276A, + SMSG_SET_FACTION_STANDING = 0x276B, + SMSG_SET_FACTION_VISIBLE = 0x2769, + SMSG_SET_FLAT_SPELL_MODIFIER = 0x2C36, + SMSG_SET_FORCED_REACTIONS = 0x2759, + SMSG_SET_ITEM_PURCHASE_DATA = 0x25AE, + SMSG_SET_LOOT_METHOD_FAILED = 0x280D, + SMSG_SET_MAX_WEEKLY_QUANTITY = 0x25B5, + SMSG_SET_MELEE_ANIM_KIT = 0x2772, + SMSG_SET_MOVEMENT_ANIM_KIT = 0x2771, + SMSG_SET_PCT_SPELL_MODIFIER = 0x2C37, + SMSG_SET_PET_SPECIALIZATION = 0x263E, + SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x2704, + SMSG_SET_PLAY_HOVER_ANIM = 0x25C9, + SMSG_SET_PROFICIENCY = 0x2774, + SMSG_SET_SPELL_CHARGES = 0x2C28, + SMSG_SET_TASK_COMPLETE = 0x27D1, + SMSG_SET_TIME_ZONE_INFORMATION = 0x269B, + SMSG_SET_VEHICLE_REC_ID = 0x272C, + SMSG_SHOW_ADVENTURE_MAP = 0x282C, + SMSG_SHOW_BANK = 0x26A4, + SMSG_SHOW_MAILBOX = 0x27E7, + SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x25ED, + SMSG_SHOW_TAXI_NODES = 0x26F3, + SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x27B1, + SMSG_SOCKET_GEMS = 0x2766, + SMSG_SOCKET_GEMS_FAILURE = 0x2767, + SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x25EF, + SMSG_SPECIALIZATION_CHANGED = 0x25E8, + SMSG_SPECIAL_MOUNT_ANIM = 0x26C4, + SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x2754, + SMSG_SPELL_ABSORB_LOG = 0x2C1E, + SMSG_SPELL_CATEGORY_COOLDOWN = 0x2C17, + SMSG_SPELL_CHANNEL_START = 0x2C34, + SMSG_SPELL_CHANNEL_UPDATE = 0x2C35, + SMSG_SPELL_COOLDOWN = 0x2C15, + SMSG_SPELL_DAMAGE_SHIELD = 0x2C30, + SMSG_SPELL_DELAYED = 0x2C3E, + SMSG_SPELL_DISPELL_LOG = 0x2C1A, + SMSG_SPELL_ENERGIZE_LOG = 0x2C1C, + SMSG_SPELL_EXECUTE_LOG = 0x2C3F, + SMSG_SPELL_FAILED_OTHER = 0x2C53, + SMSG_SPELL_FAILURE = 0x2C51, + SMSG_SPELL_GO = 0x2C39, + SMSG_SPELL_HEAL_LOG = 0x2C1D, + SMSG_SPELL_INSTAKILL_LOG = 0x2C32, + SMSG_SPELL_INTERRUPT_LOG = 0x2C1F, + SMSG_SPELL_MISS_LOG = 0x2C40, + SMSG_SPELL_NON_MELEE_DAMAGE_LOG = 0x2C31, + SMSG_SPELL_OR_DAMAGE_IMMUNE = 0x2C2E, + SMSG_SPELL_PERIODIC_AURA_LOG = 0x2C1B, + SMSG_SPELL_PREPARE = 0x2C38, + SMSG_SPELL_START = 0x2C3A, + SMSG_SPELL_UPDATE_CHAIN_TARGETS = 0x2C33, + SMSG_SPIRIT_HEALER_CONFIRM = 0x2751, + SMSG_STAND_STATE_UPDATE = 0x2758, + SMSG_START_ELAPSED_TIMER = 0x2617, + SMSG_START_ELAPSED_TIMERS = 0x2619, + SMSG_START_LOOT_ROLL = 0x262D, + SMSG_START_MIRROR_TIMER = 0x274B, + SMSG_START_TIMER = 0x25B9, + SMSG_STOP_ELAPSED_TIMER = 0x2618, + SMSG_STOP_MIRROR_TIMER = 0x274D, + SMSG_STOP_SPEAKERBOT_SOUND = 0x27AD, + SMSG_STREAMING_MOVIES = 0x25B8, + SMSG_SUMMON_CANCEL = 0x26D5, + SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x258E, + SMSG_SUMMON_REQUEST = 0x275D, + SMSG_SUPERCEDED_SPELLS = 0x2C4B, + SMSG_SUSPEND_COMMS = 0x304A, + SMSG_SUSPEND_TOKEN = 0x25BB, + SMSG_TALENTS_INVOLUNTARILY_RESET = 0x2753, + SMSG_TAXI_NODE_STATUS = 0x26A1, + SMSG_TEXT_EMOTE = 0x269F, + SMSG_THREAT_CLEAR = 0x270C, + SMSG_THREAT_REMOVE = 0x270B, + SMSG_THREAT_UPDATE = 0x270A, + 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_TRADE_STATUS = 0x2581, + SMSG_TRADE_UPDATED = 0x2580, + SMSG_TRAINER_BUY_FAILED = 0x2712, + SMSG_TRAINER_LIST = 0x2711, + SMSG_TRANSFER_ABORTED = 0x273D, + SMSG_TRANSFER_PENDING = 0x25E1, + SMSG_TRANSMOG_COLLECTION_UPDATE = 0x25C4, + SMSG_TRIGGER_CINEMATIC = 0x2805, + SMSG_TRIGGER_MOVIE = 0x26F1, + SMSG_TURN_IN_PETITION_RESULT = 0x278F, + SMSG_TUTORIAL_FLAGS = 0x27F8, + SMSG_TUTORIAL_HIGHLIGHT_SPELL = 0x2835, + SMSG_TUTORIAL_UNHIGHLIGHT_SPELL = 0x2834, + SMSG_TWITTER_STATUS = 0x2FFD, + SMSG_UI_TIME = 0x2750, + SMSG_UNDELETE_CHARACTER_RESPONSE = 0x2808, + SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x2809, + SMSG_UNLEARNED_SPELLS = 0x2C4D, + SMSG_UPDATE_ACCOUNT_DATA = 0x2745, + SMSG_UPDATE_ACTION_BUTTONS = 0x25F2, + SMSG_UPDATE_CHARACTER_FLAGS = 0x27FD, + 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 = 0x2806, + SMSG_UPDATE_TALENT_DATA = 0x25E7, + SMSG_UPDATE_TASK_PROGRESS = 0x27CF, + SMSG_UPDATE_WEEKLY_SPELL_USAGE = 0x2C19, + SMSG_UPDATE_WORLD_STATE = 0x278A, + SMSG_USERLIST_ADD = 0x2BBE, + SMSG_USERLIST_REMOVE = 0x2BBF, + SMSG_USERLIST_UPDATE = 0x2BC0, + SMSG_USE_EQUIPMENT_SET_RESULT = 0x2790, + SMSG_VENDOR_INVENTORY = 0x25C7, + SMSG_VIGNETTE_UPDATE = 0x27AF, + 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 = 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_WEEKLY_SPELL_USAGE = 0x2C18, + SMSG_WHO = 0x2BAE, + SMSG_WHO_IS = 0x26CB, + SMSG_WORLD_SERVER_INFO = 0x25C0, + SMSG_WORLD_TEXT = 0x2824, + SMSG_WOW_TOKEN_AUCTION_SOLD = 0x2813, + SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION = 0x2815, + SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION = 0x2816, + SMSG_WOW_TOKEN_CAN_VETERAN_BUY_RESULT = 0x2814, + SMSG_WOW_TOKEN_DISTRIBUTION_GLUE_UPDATE = 0x280E, + SMSG_WOW_TOKEN_DISTRIBUTION_UPDATE = 0x280F, + SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE = 0x2810, + SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED = 0x2817, + SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION = 0x2818, + SMSG_WOW_TOKEN_REDEEM_RESULT = 0x2819, + SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION = 0x2811, + SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION = 0x2812, + SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE = 0x281A, + SMSG_XP_GAIN_ABORTED = 0x25DC, + SMSG_XP_GAIN_ENABLED = 0x27EA, + SMSG_ZONE_UNDER_ATTACK = 0x2BBA, // Opcodes that are not generated automatically - SMSG_ACCOUNT_HEIRLOOM_UPDATE = 0x254B, // no client handler - SMSG_ITEM_UPGRADE_RESULT = 0x25DB, // no client handler - SMSG_COMPRESSED_PACKET = 0x2FCF, - SMSG_MULTIPLE_PACKETS = 0x2FCE, + SMSG_ACCOUNT_HEIRLOOM_UPDATE = 0xBADD, // no client handler + SMSG_ITEM_UPGRADE_RESULT = 0xBADD, // no client handler + SMSG_COMPRESSED_PACKET = 0x3052, + SMSG_MULTIPLE_PACKETS = 0x3051, // Deleted opcodes, here only to allow compile SMSG_ARENA_TEAM_STATS = 0xBADD, - SMSG_BUY_BANK_SLOT_RESULT = 0xBADD + SMSG_BUY_BANK_SLOT_RESULT = 0xBADD, + SMSG_BF_MGR_EJECTED = 0xBADD, + SMSG_BF_MGR_ENTERING = 0xBADD, + SMSG_BF_MGR_ENTRY_INVITE = 0xBADD, + SMSG_BF_MGR_QUEUE_INVITE = 0xBADD, + SMSG_BF_MGR_QUEUE_REQUEST_RESPONSE = 0xBADD, }; inline bool IsInstanceOnlyOpcode(uint32 opcode) @@ -1781,9 +1836,9 @@ inline std::string GetOpcodeNameForLogging(T id) std::ostringstream ss; ss << '['; - if (static_cast<uint32>(id) < UNKNOWN_OPCODE) + if (static_cast<uint32>(id) < NUM_OPCODE_HANDLERS) { - if (OpcodeHandler const* handler = opcodeTable[T(opcode & 0x7FFF)]) + if (OpcodeHandler const* handler = opcodeTable[id]) ss << handler->Name; else ss << "UNKNOWN OPCODE"; @@ -1795,7 +1850,5 @@ inline std::string GetOpcodeNameForLogging(T id) return ss.str(); } - #endif /// @} - 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 <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __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/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 8e1a912623e..a013d8bd662 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -829,89 +829,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 @@ -1162,6 +1079,8 @@ public: BATTLE_PET_SLOTS, GLOBAL_ACCOUNT_HEIRLOOMS, GLOBAL_REALM_CHARACTER_COUNTS, + ITEM_APPEARANCES, + ITEM_FAVORITE_APPEARANCES, MAX_QUERIES }; @@ -1192,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; } }; @@ -1225,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); @@ -1236,7 +1164,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 0e2ecee911f..757ea968ed1 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" @@ -201,8 +200,6 @@ namespace WorldPackets class LoadingScreenNotify; class SetActionBarToggles; class RequestPlayedTime; - class ShowingCloak; - class ShowingHelm; class SetTitle; class SetFactionAtWar; class SetFactionNotAtWar; @@ -369,7 +366,6 @@ namespace WorldPackets class SwapItem; class WrapItem; class CancelTempEnchantment; - class TransmogrifyItems; class UseCritterItem; class UpgradeItem; class SocketGems; @@ -464,7 +460,7 @@ namespace WorldPackets class PartyUninvite; class GroupDecline; class RequestPartyMemberStats; - class PartyMemberStats; + class PartyMemberState; class SetPartyLeader; class SetPartyAssignment; class SetRole; @@ -508,7 +504,6 @@ namespace WorldPackets class PetAction; class PetCancelAura; class PetSetAction; - class LearnPetSpecializationGroup; } namespace Petition @@ -619,7 +614,6 @@ namespace WorldPackets namespace Talent { - class SetSpecialization; class LearnTalents; class ConfirmRespecWipe; } @@ -672,6 +666,12 @@ namespace WorldPackets class TradeStatus; } + namespace Transmogrification + { + class TransmogrifyItems; + class TransmogAppearanceSetFavorite; + } + namespace Vehicle { class MoveDismissVehicle; @@ -901,8 +901,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); @@ -1165,10 +1163,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); @@ -1447,7 +1441,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); @@ -1521,7 +1514,6 @@ class TC_GAME_API WorldSession void HandlePetCancelAuraOpcode(WorldPackets::Spells::PetCancelAura& packet); void HandlePetSpellAutocastOpcode(WorldPackets::Pet::PetSpellAutocast& packet); void HandlePetCastSpellOpcode(WorldPackets::Spells::PetCastSpell& petCastSpell); - void HandlePetSetSpecializationOpcode(WorldPackets::Pet::LearnPetSpecializationGroup& learnPetSpecializationGroup); void HandleSetActionBarToggles(WorldPackets::Character::SetActionBarToggles& packet); @@ -1657,12 +1649,12 @@ 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); 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); @@ -1828,8 +1820,6 @@ class TC_GAME_API WorldSession std::unordered_map<uint32, std::function<void(MessageBuffer)>> _battlenetResponseCallbacks; uint32 _battlenetRequestToken; - typedef std::list<AddonInfo> AddonsList; - // Warden Warden* _warden; // Remains NULL if Warden system is not enabled by config @@ -1846,7 +1836,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<std::string> _registeredAddonPrefixes; bool _filterAddonMessages; uint32 recruiterId; diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 0ad88b9edac..36977542e36 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<std::mutex> 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<ClientPktHeader*>(_headerBuffer.GetReadPointer()); - uint32 opcode; - uint32 size; - - ExtractOpcodeAndSize(header, opcode, size); + PacketHeader* header = reinterpret_cast<PacketHeader*>(_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<ClientPktHeader*>(_headerBuffer.GetReadPointer()); - uint32 cmd; - uint32 size; - - ExtractOpcodeAndSize(header, cmd, size); - - OpcodeClient opcode = static_cast<OpcodeClient>(cmd); + PacketHeader* header = reinterpret_cast<PacketHeader*>(_headerBuffer.GetReadPointer()); + OpcodeClient opcode = static_cast<OpcodeClient>(header->Command); WorldPacket packet(opcode, std::move(_packetBuffer), GetConnectionType()); @@ -481,6 +445,10 @@ WorldSocket::ReadDataHandlerResult WorldSocket::ReadDataHandler() HandleConnectToFailed(connectToFailed); break; } + case CMSG_ENABLE_ENCRYPTION_ACK: + LogOpcodeText(opcode, sessionGuard); + HandleEnableEncryptionAck(); + break; default: { sessionGuard.lock(); @@ -545,14 +513,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()) { @@ -579,19 +545,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) @@ -688,9 +647,6 @@ struct AccountInfo void WorldSocket::HandleAuthSession(std::shared_ptr<WorldPackets::Auth::AuthSession> 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)); @@ -740,10 +696,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth:: SessionKeyGenerator<SHA256Hash> 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); @@ -753,7 +706,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth:: // This also allows to check for possible "hack" attempts on account stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_ACCOUNT_INFO_CONTINUED_SESSION); - stmt->setString(0, K.AsHexStr()); + stmt->setString(0, _sessionKey.AsHexStr()); stmt->setUInt32(1, account.Game.Id); LoginDatabase.Execute(stmt); @@ -860,11 +813,10 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth:: _authed = true; _worldSession = new WorldSession(account.Game.Id, std::move(authSession->RealmJoinTicket), 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) - _worldSession->InitWarden(&account.Game.SessionKey); + _worldSession->InitWarden(&_sessionKey); _queryCallback = std::bind(&WorldSocket::LoadSessionPermissionsCallback, this, std::placeholders::_1); _queryFuture = _worldSession->LoadPermissionsAsync(); @@ -876,7 +828,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<WorldPackets::Auth::AuthContinuedSession> authSession) @@ -892,9 +844,6 @@ void WorldSocket::HandleAuthContinuedSession(std::shared_ptr<WorldPackets::Auth: return; } - // Client switches packet headers after sending CMSG_AUTH_CONTINUED_SESSION - _headerBuffer.Resize(SizeOfClientHeader[1]); - uint32 accountId = uint32(key.Fields.AccountId); PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_INFO_CONTINUED_SESSION); stmt->setUInt32(0, accountId); @@ -913,17 +862,14 @@ void WorldSocket::HandleAuthContinuedSessionCallback(std::shared_ptr<WorldPacket } WorldSession::ConnectToKey key; - key.Raw = authSession->Key; + _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<uint8 const*>(&authSession->Key), sizeof(authSession->Key)); hmac.UpdateData(authSession->LocalChallenge.data(), authSession->LocalChallenge.size()); hmac.UpdateData(_serverChallenge.AsByteArray(16).get(), 16); @@ -937,7 +883,7 @@ void WorldSocket::HandleAuthContinuedSessionCallback(std::shared_ptr<WorldPacket return; } - sWorld->AddInstanceSocket(shared_from_this(), authSession->Key); + SendPacketAndLogOpcode(*WorldPackets::Auth::EnableEncryption().Write()); AsyncRead(); } @@ -979,6 +925,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 6f0d314f312..0b78e36a3f5 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" @@ -48,29 +47,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<WorldSocket> { - static uint32 const ConnectionInitializeMagic; static std::string const ServerConnectionInitialize; static std::string const ClientConnectionInitialize; static uint32 const MinSizeForCompression; @@ -131,15 +120,16 @@ private: void LoadSessionPermissionsCallback(PreparedQueryResult result); void HandleConnectToFailed(WorldPackets::Auth::ConnectToFailed& connectToFailed); bool HandlePing(WorldPackets::Auth::Ping& ping); - - void ExtractOpcodeAndSize(ClientPktHeader const* header, uint32& opcode, uint32& size) const; + void HandleEnableEncryptionAck(); 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/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 3e02ba95137..fdd72e4ab6c 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? @@ -1366,23 +1366,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)) { @@ -4045,7 +4028,7 @@ void AuraEffect::HandleModPowerRegen(AuraApplication const* aurApp, uint8 mode, if (GetMiscValue() == POWER_MANA) target->ToPlayer()->UpdateManaRegen(); else if (GetMiscValue() == POWER_RUNES) - target->ToPlayer()->UpdateRuneRegen(RuneType(GetMiscValueB())); + target->ToPlayer()->UpdateAllRunesRegen(); // other powers are not immediate effects - implemented in Player::Regenerate, Creature::Regenerate } @@ -5309,39 +5292,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(); @@ -5634,19 +5584,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; @@ -6184,7 +6121,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c TC_LOG_DEBUG("spells.periodic", "PeriodicTick: %s health leech of %s for %u dmg inflicted by %u abs is %u", GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), damage, GetId(), absorb); - SpellNonMeleeDamage log(caster, target, GetId(), GetSpellInfo()->GetSchoolMask()); + SpellNonMeleeDamage log(caster, target, GetId(), GetSpellInfo()->GetSchoolMask(), GetBase()->GetCastGUID()); log.damage = damage - absorb - resist; log.absorb = absorb; log.resist = resist; @@ -6488,7 +6425,7 @@ void AuraEffect::HandlePeriodicPowerBurnAuraTick(Unit* target, Unit* caster) con SpellInfo const* spellProto = GetSpellInfo(); // maybe has to be sent different to client, but not by SMSG_PERIODICAURALOG - SpellNonMeleeDamage damageInfo(caster, target, spellProto->Id, spellProto->SchoolMask); + SpellNonMeleeDamage damageInfo(caster, target, spellProto->Id, spellProto->SchoolMask, GetBase()->GetCastGUID()); // no SpellDamageBonus for burn mana caster->CalculateSpellDamageTaken(&damageInfo, int32(gain * dmgMultiplier), spellProto); @@ -6542,7 +6479,7 @@ void AuraEffect::HandleProcTriggerDamageAuraProc(AuraApplication* aurApp, ProcEv { Unit* target = aurApp->GetTarget(); Unit* triggerTarget = eventInfo.GetProcTarget(); - SpellNonMeleeDamage damageInfo(target, triggerTarget, GetId(), GetSpellInfo()->SchoolMask); + SpellNonMeleeDamage damageInfo(target, triggerTarget, GetId(), GetSpellInfo()->SchoolMask, GetBase()->GetCastGUID()); uint32 damage = target->SpellDamageBonusDone(triggerTarget, GetSpellInfo(), GetAmount(), SPELL_DIRECT_DAMAGE, GetSpellEffectInfo()); damage = triggerTarget->SpellDamageBonusTaken(target, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE, GetSpellEffectInfo()); target->CalculateSpellDamageTaken(&damageInfo, damage, GetSpellInfo()); @@ -6761,7 +6698,7 @@ void AuraEffect::HandleOverridePetSpecs(AuraApplication const* aurApp, uint8 mod if (!currSpec) return; - pet->SetSpecialization(sChrSpecializationByIndexStore[apply ? PET_SPEC_OVERRIDE_CLASS_INDEX : 0][currSpec->OrderIndex]->ID); + pet->SetSpecialization(sDB2Manager.GetChrSpecializationByIndex(apply ? PET_SPEC_OVERRIDE_CLASS_INDEX : 0, currSpec->OrderIndex)->ID); } void AuraEffect::HandleAllowUsingGameobjectsWhileMounted(AuraApplication const* aurApp, uint8 mode, bool apply) const diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index d01b5cdeaae..5ecf741d967 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -296,7 +296,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 bcef1da2b69..0aa5d752c60 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -198,9 +198,12 @@ void AuraApplication::BuildUpdatePacket(WorldPackets::Spells::AuraInfo& auraInfo if (remove) return; + auraInfo.AuraData = boost::in_place(); + Aura const* aura = GetBase(); - WorldPackets::Spells::AuraDataInfo auraData; + WorldPackets::Spells::AuraDataInfo& auraData = auraInfo.AuraData.get(); + auraData.CastID = aura->GetCastGUID(); auraData.SpellID = aura->GetId(); auraData.SpellXSpellVisualID = aura->GetSpellXSpellVisualId(); auraData.Flags = GetFlags(); @@ -232,8 +235,6 @@ void AuraApplication::BuildUpdatePacket(WorldPackets::Spells::AuraInfo& auraInfo if (effect && HasEffect(effect->GetEffIndex())) // Not all of aura's effects have to be applied on every target auraData.Points[effect->GetEffIndex()] = float(effect->GetAmount()); } - - auraInfo.AuraData = auraData; } void AuraApplication::ClientUpdate(bool remove) @@ -279,7 +280,7 @@ uint32 Aura::BuildEffectMaskForOwner(SpellInfo const* spellProto, uint32 avalibl return effMask & avalibleEffectMask; } -Aura* Aura::TryRefreshStackOrCreate(SpellInfo const* spellproto, uint32 tryEffMask, WorldObject* owner, Unit* caster, int32 *baseAmount /*= NULL*/, Item* castItem /*= NULL*/, ObjectGuid casterGUID /*= ObjectGuid::Empty*/, bool* refresh /*= NULL*/, int32 castItemLevel /*= -1*/) +Aura* Aura::TryRefreshStackOrCreate(SpellInfo const* spellproto, ObjectGuid castId, uint32 tryEffMask, WorldObject* owner, Unit* caster, int32 *baseAmount /*= NULL*/, Item* castItem /*= NULL*/, ObjectGuid casterGUID /*= ObjectGuid::Empty*/, bool* refresh /*= NULL*/, int32 castItemLevel /*= -1*/) { ASSERT(spellproto); ASSERT(owner); @@ -303,10 +304,10 @@ Aura* Aura::TryRefreshStackOrCreate(SpellInfo const* spellproto, uint32 tryEffMa return foundAura; } else - return Create(spellproto, effMask, owner, caster, baseAmount, castItem, casterGUID, castItemLevel); + return Create(spellproto, castId, effMask, owner, caster, baseAmount, castItem, casterGUID, castItemLevel); } -Aura* Aura::TryCreate(SpellInfo const* spellproto, uint32 tryEffMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem /*= NULL*/, ObjectGuid casterGUID /*= ObjectGuid::Empty*/, int32 castItemLevel /*= -1*/) +Aura* Aura::TryCreate(SpellInfo const* spellproto, ObjectGuid castId, uint32 tryEffMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem /*= NULL*/, ObjectGuid casterGUID /*= ObjectGuid::Empty*/, int32 castItemLevel /*= -1*/) { ASSERT(spellproto); ASSERT(owner); @@ -315,10 +316,10 @@ Aura* Aura::TryCreate(SpellInfo const* spellproto, uint32 tryEffMask, WorldObjec uint32 effMask = Aura::BuildEffectMaskForOwner(spellproto, tryEffMask, owner); if (!effMask) return NULL; - return Create(spellproto, effMask, owner, caster, baseAmount, castItem, casterGUID, castItemLevel); + return Create(spellproto, castId, effMask, owner, caster, baseAmount, castItem, casterGUID, castItemLevel); } -Aura* Aura::Create(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel) +Aura* Aura::Create(SpellInfo const* spellproto, ObjectGuid castId, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel) { ASSERT(effMask); ASSERT(spellproto); @@ -348,10 +349,10 @@ Aura* Aura::Create(SpellInfo const* spellproto, uint32 effMask, WorldObject* own { case TYPEID_UNIT: case TYPEID_PLAYER: - aura = new UnitAura(spellproto, effMask, owner, caster, baseAmount, castItem, casterGUID, castItemLevel); + aura = new UnitAura(spellproto, castId, effMask, owner, caster, baseAmount, castItem, casterGUID, castItemLevel); break; case TYPEID_DYNAMICOBJECT: - aura = new DynObjAura(spellproto, effMask, owner, caster, baseAmount, castItem, casterGUID, castItemLevel); + aura = new DynObjAura(spellproto, castId, effMask, owner, caster, baseAmount, castItem, casterGUID, castItemLevel); break; default: ABORT(); @@ -363,8 +364,8 @@ Aura* Aura::Create(SpellInfo const* spellproto, uint32 effMask, WorldObject* own return aura; } -Aura::Aura(SpellInfo const* spellproto, WorldObject* owner, Unit* caster, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel) : -m_spellInfo(spellproto), m_casterGuid(!casterGUID.IsEmpty() ? casterGUID : caster->GetGUID()), +Aura::Aura(SpellInfo const* spellproto, ObjectGuid castId, WorldObject* owner, Unit* caster, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel) : +m_spellInfo(spellproto), m_castGuid(castId), m_casterGuid(!casterGUID.IsEmpty() ? casterGUID : caster->GetGUID()), m_castItemGuid(castItem ? castItem->GetGUID() : ObjectGuid::Empty), m_castItemLevel(castItemLevel), m_spellXSpellVisualId(caster ? caster->GetCastSpellXSpellVisualId(spellproto) : spellproto->GetSpellXSpellVisualId()), m_applyTime(time(NULL)), m_owner(owner), m_timeCla(0), m_updateTargetMapInterval(0), m_casterLevel(caster ? caster->getLevel() : m_spellInfo->SpellLevel), m_procCharges(0), m_stackAmount(1), @@ -1517,21 +1518,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 @@ -2339,8 +2325,8 @@ void Aura::CallScriptAfterEffectProcHandlers(AuraEffect const* aurEff, AuraAppli } } -UnitAura::UnitAura(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel) - : Aura(spellproto, owner, caster, castItem, casterGUID, castItemLevel) +UnitAura::UnitAura(SpellInfo const* spellproto, ObjectGuid castId, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel) + : Aura(spellproto, castId, owner, caster, castItem, casterGUID, castItemLevel) { m_AuraDRGroup = DIMINISHING_NONE; LoadScripts(); @@ -2442,8 +2428,8 @@ void UnitAura::FillTargetMap(std::map<Unit*, uint32> & targets, Unit* caster) } } -DynObjAura::DynObjAura(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel) - : Aura(spellproto, owner, caster, castItem, casterGUID, castItemLevel) +DynObjAura::DynObjAura(SpellInfo const* spellproto, ObjectGuid castId, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel) + : Aura(spellproto, castId, owner, caster, castItem, casterGUID, castItemLevel) { LoadScripts(); ASSERT(GetDynobjOwner()); diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index 33b4f41c34d..83b6343ceef 100644 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -120,19 +120,20 @@ class TC_GAME_API Aura typedef std::map<ObjectGuid, AuraApplication*> ApplicationMap; static uint32 BuildEffectMaskForOwner(SpellInfo const* spellProto, uint32 avalibleEffectMask, WorldObject* owner); - static Aura* TryRefreshStackOrCreate(SpellInfo const* spellproto, uint32 tryEffMask, WorldObject* owner, Unit* caster, int32 *baseAmount = NULL, Item* castItem = NULL, ObjectGuid casterGUID = ObjectGuid::Empty, bool* refresh = NULL, int32 castItemLevel = -1); - static Aura* TryCreate(SpellInfo const* spellproto, uint32 tryEffMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem = NULL, ObjectGuid casterGUID = ObjectGuid::Empty, int32 castItemLevel = -1); - static Aura* Create(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel); - Aura(SpellInfo const* spellproto, WorldObject* owner, Unit* caster, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel); + static Aura* TryRefreshStackOrCreate(SpellInfo const* spellproto, ObjectGuid castId, uint32 tryEffMask, WorldObject* owner, Unit* caster, int32 *baseAmount = NULL, Item* castItem = NULL, ObjectGuid casterGUID = ObjectGuid::Empty, bool* refresh = NULL, int32 castItemLevel = -1); + static Aura* TryCreate(SpellInfo const* spellproto, ObjectGuid castId, uint32 tryEffMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem = NULL, ObjectGuid casterGUID = ObjectGuid::Empty, int32 castItemLevel = -1); + static Aura* Create(SpellInfo const* spellproto, ObjectGuid castId, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel); + Aura(SpellInfo const* spellproto, ObjectGuid castId, WorldObject* owner, Unit* caster, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel); void _InitEffects(uint32 effMask, Unit* caster, int32 *baseAmount); virtual ~Aura(); SpellInfo const* GetSpellInfo() const { return m_spellInfo; } uint32 GetId() const{ return GetSpellInfo()->Id; } + ObjectGuid GetCastGUID() const { return m_castGuid; } + ObjectGuid GetCasterGUID() const { return m_casterGuid; } ObjectGuid GetCastItemGUID() const { return m_castItemGuid; } int32 GetCastItemLevel() const { return m_castItemLevel; } - ObjectGuid GetCasterGUID() const { return m_casterGuid; } uint32 GetSpellXSpellVisualId() const { return m_spellXSpellVisualId; } Unit* GetCaster() const; WorldObject* GetOwner() const { return m_owner; } @@ -298,6 +299,7 @@ class TC_GAME_API Aura void _DeleteRemovedApplications(); protected: SpellInfo const* const m_spellInfo; + ObjectGuid const m_castGuid; ObjectGuid const m_casterGuid; ObjectGuid const m_castItemGuid; // it is NOT safe to keep a pointer to the item because it may get deleted int32 m_castItemLevel; @@ -335,9 +337,9 @@ class TC_GAME_API Aura class TC_GAME_API UnitAura : public Aura { - friend Aura* Aura::Create(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel); + friend Aura* Aura::Create(SpellInfo const* spellproto, ObjectGuid castId, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel); public: - UnitAura(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel); + UnitAura(SpellInfo const* spellproto, ObjectGuid castId, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel); void _ApplyForTarget(Unit* target, Unit* caster, AuraApplication * aurApp) override; void _UnapplyForTarget(Unit* target, Unit* caster, AuraApplication * aurApp) override; @@ -356,9 +358,9 @@ class TC_GAME_API UnitAura : public Aura class TC_GAME_API DynObjAura : public Aura { - friend Aura* Aura::Create(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel); + friend Aura* Aura::Create(SpellInfo const* spellproto, ObjectGuid castId, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel); public: - DynObjAura(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel); + DynObjAura(SpellInfo const* spellproto, ObjectGuid castId, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel); void Remove(AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT) override; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 56784c0a086..6f5e3d4a1af 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -588,7 +588,7 @@ m_spellValue(new SpellValue(caster->GetMap()->GetDifficultyID(), m_spellInfo)), m_procVictim = 0; m_procEx = 0; focusObject = NULL; - m_cast_count = 0; + m_castId = ObjectGuid::Create<HighGuid::Cast>(SPELL_CAST_SOURCE_NORMAL, m_caster->GetMapId(), m_spellInfo->Id, m_caster->GetMap()->GenerateLowGuid<HighGuid::Cast>()); memset(m_misc.Raw.Data, 0, sizeof(m_misc.Raw.Data)); m_SpellVisual = caster->GetCastSpellXSpellVisualId(m_spellInfo); m_preCastSpell = 0; @@ -2427,7 +2427,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) else if (m_damage > 0) { // Fill base damage struct (unitTarget - is real spell target) - SpellNonMeleeDamage damageInfo(caster, unitTarget, m_spellInfo->Id, m_spellSchoolMask); + SpellNonMeleeDamage damageInfo(caster, unitTarget, m_spellInfo->Id, m_spellSchoolMask, m_castId); // Add bonuses and fill damageInfo struct caster->CalculateSpellDamageTaken(&damageInfo, m_damage, m_spellInfo, m_attackType, target->crit); @@ -2616,7 +2616,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA if (m_originalCaster) { bool refresh = false; - m_spellAura = Aura::TryRefreshStackOrCreate(aurSpellInfo, effectMask, unit, + m_spellAura = Aura::TryRefreshStackOrCreate(aurSpellInfo, m_castId, effectMask, unit, m_originalCaster, (aurSpellInfo == m_spellInfo) ? m_spellValue->EffectBasePoints : basePoints, m_CastItem, ObjectGuid::Empty, &refresh, m_castItemLevel); if (m_spellAura) @@ -2922,7 +2922,7 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered m_caster->m_Events.AddEvent(Event, m_caster->m_Events.CalculateTime(1)); //Prevent casting at cast another spell (ServerSide check) - if (!(_triggeredCastFlags & TRIGGERED_IGNORE_CAST_IN_PROGRESS) && m_caster->IsNonMeleeSpellCast(false, true, true) && m_cast_count) + if (!(_triggeredCastFlags & TRIGGERED_IGNORE_CAST_IN_PROGRESS) && m_caster->IsNonMeleeSpellCast(false, true, true) && !m_castId.IsEmpty()) { SendCastResult(SPELL_FAILED_SPELL_IN_PROGRESS); finish(false); @@ -3337,7 +3337,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); } } @@ -3713,39 +3713,10 @@ void Spell::finish(bool ok) m_caster->AttackStop(); } -void Spell::SendCastResult(SpellCastResult result) +template<class T> +inline void FillSpellCastFailedArgs(T& packet, ObjectGuid castId, SpellInfo const* spellInfo, SpellCastResult result, SpellCustomErrors customError, uint32* misc, Player* caster) { - if (result == SPELL_CAST_OK) - return; - - if (m_caster->GetTypeId() != TYPEID_PLAYER) - return; - - if (m_caster->ToPlayer()->GetSession()->PlayerLoading()) // don't send cast results at loading time - return; - - SendCastResult(m_caster->ToPlayer(), m_spellInfo, m_cast_count, result, m_customError, SMSG_CAST_FAILED, m_misc.Raw.Data); -} - -void Spell::SendPetCastResult(SpellCastResult result) -{ - if (result == SPELL_CAST_OK) - return; - - Unit* owner = m_caster->GetCharmerOrOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) - return; - - SendCastResult(owner->ToPlayer(), m_spellInfo, m_cast_count, result, SPELL_CUSTOM_ERROR_NONE, SMSG_PET_CAST_FAILED, m_misc.Raw.Data); -} - -void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cast_count, SpellCastResult result, SpellCustomErrors customError /*= SPELL_CUSTOM_ERROR_NONE*/, OpcodeServer opcode /*= SMSG_CAST_FAILED*/, uint32* misc /*= nullptr*/) -{ - if (result == SPELL_CAST_OK) - return; - - WorldPackets::Spells::CastFailed packet(opcode); - packet.CastID = cast_count; + packet.CastID = castId; packet.SpellID = spellInfo->Id; packet.Reason = result; @@ -3861,7 +3832,47 @@ void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cas default: break; } +} + +void Spell::SendCastResult(SpellCastResult result) +{ + if (result == SPELL_CAST_OK) + return; + + if (m_caster->GetTypeId() != TYPEID_PLAYER) + return; + + if (m_caster->ToPlayer()->GetSession()->PlayerLoading()) // don't send cast results at loading time + return; + + WorldPackets::Spells::CastFailed castFailed; + castFailed.SpellXSpellVisualID = m_SpellVisual; + FillSpellCastFailedArgs(castFailed, m_castId, m_spellInfo, result, m_customError, m_misc.Raw.Data, m_caster->ToPlayer()); + m_caster->ToPlayer()->SendDirectMessage(castFailed.Write()); +} + +void Spell::SendPetCastResult(SpellCastResult result) +{ + if (result == SPELL_CAST_OK) + return; + + Unit* owner = m_caster->GetCharmerOrOwner(); + if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + return; + + WorldPackets::Spells::PetCastFailed petCastFailed; + FillSpellCastFailedArgs(petCastFailed, m_castId, m_spellInfo, result, SPELL_CUSTOM_ERROR_NONE, m_misc.Raw.Data, owner->ToPlayer()); + owner->ToPlayer()->SendDirectMessage(petCastFailed.Write()); +} +void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint32 spellVisual, ObjectGuid cast_count, SpellCastResult result, SpellCustomErrors customError /*= SPELL_CUSTOM_ERROR_NONE*/, uint32* misc /*= nullptr*/) +{ + if (result == SPELL_CAST_OK) + return; + + WorldPackets::Spells::CastFailed packet; + packet.SpellXSpellVisualID = spellVisual; + FillSpellCastFailedArgs(packet, cast_count, spellInfo, result, customError, misc, caster); caster->GetSession()->SendPacket(packet.Write()); } @@ -3889,8 +3900,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; @@ -3902,7 +3912,8 @@ void Spell::SendSpellStart() castData.CasterGUID = m_caster->GetGUID(); castData.CasterUnit = m_caster->GetGUID(); - castData.CastID = m_cast_count; // pending spell cast? + castData.CastID = m_castId; + castData.OriginalCastID = m_originalCastId; castData.SpellID = m_spellInfo->Id; castData.SpellXSpellVisualID = m_SpellVisual; castData.CastFlags = castFlags; @@ -3935,7 +3946,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 } } @@ -3992,7 +4003,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)) { @@ -4018,7 +4028,8 @@ void Spell::SendSpellGo() castData.CasterGUID = m_caster->GetGUID(); castData.CasterUnit = m_caster->GetGUID(); - castData.CastID = m_cast_count; // pending spell cast? + castData.CastID = m_castId; + castData.OriginalCastID = m_originalCastId; castData.SpellID = m_spellInfo->Id; castData.SpellXSpellVisualID = m_SpellVisual; castData.CastFlags = castFlags; @@ -4053,7 +4064,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 } } @@ -4072,7 +4083,9 @@ void Spell::SendSpellGo() castData.MissileTrajectory.Pitch = m_targets.GetPitch(); } - m_caster->SendMessageToSet(packet.Write(), true); + packet.LogData.Initialize(this); + + m_caster->SendCombatLogMessage(&packet); } /// Writes miss and hit targets for a SMSG_SPELL_GO packet @@ -4125,7 +4138,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 @@ -4298,7 +4311,7 @@ void Spell::SendInterrupted(uint8 result) { WorldPackets::Spells::SpellFailure failurePacket; failurePacket.CasterUnit = m_caster->GetGUID(); - failurePacket.CastID = m_cast_count; + failurePacket.CastID = m_castId; failurePacket.SpellID = m_spellInfo->Id; failurePacket.SpelXSpellVisualID = m_SpellVisual; failurePacket.Reason = result; @@ -4306,7 +4319,7 @@ void Spell::SendInterrupted(uint8 result) WorldPackets::Spells::SpellFailedOther failedPacket; failedPacket.CasterUnit = m_caster->GetGUID(); - failedPacket.CastID = m_cast_count; + failedPacket.CastID = m_castId; failedPacket.SpellID = m_spellInfo->Id; failedPacket.Reason = result; m_caster->SendMessageToSet(failedPacket.Write(), true); @@ -4519,9 +4532,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(); @@ -4531,36 +4545,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; + int32 readyRunes = 0; + for (int32 i = 0; i < player->GetMaxPower(POWER_RUNES); ++i) + if (player->GetRuneCooldown(i) == 0) + ++readyRunes; - 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]; - - 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; @@ -4571,95 +4561,22 @@ 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) - { - runeCost[i] = runeCostData->RuneCost[i]; - if (Player* modOwner = m_caster->GetSpellModOwner()) - modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_COST, runeCost[i], this); - } - - 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) + int32 runeCost = std::find_if(m_powerCost.begin(), m_powerCost.end(), [](SpellInfo::CostData const& cost) { - RuneType rune = player->GetCurrentRune(i); - if (!player->GetRuneCooldown(i) && runeCost[rune] > 0) - { - player->SetRuneCooldown(i, didHit ? player->GetRuneBaseCooldown(i) : uint32(RUNE_MISS_COOLDOWN), true); - player->SetLastUsedRune(rune); - runeCost[rune]--; - 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; - } - } - } + return cost.Power == POWER_RUNES; + })->Amount; - // Grab any Death rune - if (runeCost[RUNE_DEATH] > 0) + for (int32 i = 0; i < player->GetMaxPower(POWER_RUNES); ++i) { - for (uint32 i = 0; i < MAX_RUNES; ++i) + if (!player->GetRuneCooldown(i) && runeCost > 0) { - 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; - } + player->SetRuneCooldown(i, didHit ? player->GetRuneBaseCooldown() : uint32(RUNE_MISS_COOLDOWN), true); + --runeCost; } } - - // 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() @@ -5335,17 +5252,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: @@ -5487,6 +5393,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()) @@ -6036,7 +5946,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; } @@ -7071,13 +6981,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.) @@ -7452,7 +7365,7 @@ void Spell::PrepareTriggersExecutedOnHit() // Global cooldowns management enum GCDLimits { - MIN_GCD = 1000, + MIN_GCD = 750, MAX_GCD = 1500 }; diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index f08aa39b4c4..888e813f29b 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -109,6 +109,17 @@ enum SpellCastFlagsEx CAST_FLAG_EX_UNKNOWN_20 = 0x80000 }; +enum SpellCastSource : uint8 +{ + SPELL_CAST_SOURCE_PLAYER = 2, + SPELL_CAST_SOURCE_NORMAL = 3, + SPELL_CAST_SOURCE_ITEM = 4, + SPELL_CAST_SOURCE_PASSIVE = 7, + SPELL_CAST_SOURCE_PET = 9, + SPELL_CAST_SOURCE_AURA = 13, + SPELL_CAST_SOURCE_SPELL = 16, +}; + enum SpellRangeFlag { SPELL_RANGE_DEFAULT = 0, @@ -419,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); @@ -501,7 +511,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(); @@ -522,7 +532,7 @@ class TC_GAME_API Spell void CheckSrc() { if (!m_targets.HasSrc()) m_targets.SetSrc(*m_caster); } void CheckDst() { if (!m_targets.HasDst()) m_targets.SetDst(*m_caster); } - static void SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cast_count, SpellCastResult result, SpellCustomErrors customError = SPELL_CUSTOM_ERROR_NONE, OpcodeServer opcode = SMSG_CAST_FAILED, uint32* misc = nullptr); + static void SendCastResult(Player* caster, SpellInfo const* spellInfo, uint32 spellVisual, ObjectGuid cast_count, SpellCastResult result, SpellCustomErrors customError = SPELL_CUSTOM_ERROR_NONE, uint32* misc = nullptr); void SendCastResult(SpellCastResult result); void SendPetCastResult(SpellCastResult result); void SendSpellStart(); @@ -552,7 +562,8 @@ class TC_GAME_API Spell ObjectGuid m_castItemGUID; uint32 m_castItemEntry; int32 m_castItemLevel; - uint8 m_cast_count; + ObjectGuid m_castId; + ObjectGuid m_originalCastId; uint32 m_castFlagsEx; union { @@ -560,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 @@ -615,7 +629,7 @@ class TC_GAME_API Spell Unit* GetCaster() const { return m_caster; } Unit* GetOriginalCaster() const { return m_originalCaster; } SpellInfo const* GetSpellInfo() const { return m_spellInfo; } - std::vector<SpellInfo::CostData> GetPowerCost() const { return m_powerCost; } + std::vector<SpellInfo::CostData> const& GetPowerCost() const { return m_powerCost; } bool UpdatePointers(); // must be used at call Spell code after time delay (non triggered spell cast/update spell call/etc) diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index b85d334db90..22518c8fbda 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -225,7 +225,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 @@ -316,6 +316,10 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectNULL, //249 SPELL_EFFECT_249 &Spell::EffectNULL, //250 SPELL_EFFECT_TAKE_SCREENSHOT &Spell::EffectNULL, //251 SPELL_EFFECT_SET_GARRISON_CACHE_SIZE + &Spell::EffectNULL, //252 SPELL_EFFECT_252 + &Spell::EffectNULL, //253 SPELL_EFFECT_253 + &Spell::EffectNULL, //254 SPELL_EFFECT_254 + &Spell::EffectNULL, //255 SPELL_EFFECT_255 }; void Spell::EffectNULL(SpellEffIndex /*effIndex*/) @@ -391,7 +395,7 @@ void Spell::EffectEnvironmentalDMG(SpellEffIndex /*effIndex*/) uint32 resist = 0; m_caster->CalcAbsorbResist(unitTarget, m_spellInfo->GetSchoolMask(), SPELL_DIRECT_DAMAGE, damage, &absorb, &resist, m_spellInfo); - SpellNonMeleeDamage log(m_caster, unitTarget, m_spellInfo->Id, m_spellInfo->GetSchoolMask()); + SpellNonMeleeDamage log(m_caster, unitTarget, m_spellInfo->Id, m_spellInfo->GetSchoolMask(), m_castId); log.damage = damage - absorb - resist; log.absorb = absorb; log.resist = resist; @@ -1547,7 +1551,7 @@ void Spell::EffectPersistentAA(SpellEffIndex effIndex) return; } - if (Aura* aura = Aura::TryCreate(m_spellInfo, MAX_EFFECT_MASK, dynObj, caster, &m_spellValue->EffectBasePoints[0], nullptr, ObjectGuid::Empty, m_castItemLevel)) + if (Aura* aura = Aura::TryCreate(m_spellInfo, m_castId, MAX_EFFECT_MASK, dynObj, caster, &m_spellValue->EffectBasePoints[0], nullptr, ObjectGuid::Empty, m_castItemLevel)) { m_spellAura = aura; m_spellAura->_RegisterForTargets(); @@ -1617,7 +1621,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); @@ -2033,7 +2037,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: @@ -2434,7 +2438,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; @@ -3916,72 +3920,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*/) @@ -5166,7 +5107,7 @@ void Spell::EffectQuestStart(SpellEffIndex /*effIndex*/) } } -void Spell::EffectActivateRune(SpellEffIndex effIndex) +void Spell::EffectActivateRune(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH) return; @@ -5183,52 +5124,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 (int32 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) + // then the rest if we still got something left + for (int32 j = 0; j < player->GetMaxPower(POWER_RUNES) && count > 0; ++j) { - 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) - { - // 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; } } @@ -5308,7 +5221,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); } @@ -5424,7 +5337,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; @@ -5433,17 +5346,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) @@ -5452,7 +5354,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*/) @@ -5478,7 +5380,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; @@ -5900,9 +5802,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); diff --git a/src/server/game/Spells/SpellHistory.cpp b/src/server/game/Spells/SpellHistory.cpp index df9d50dad06..657d6027594 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; @@ -709,16 +709,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<ChargeEntry>& charges = _categoryCharges[chargeCategoryEntry->ID]; + std::deque<ChargeEntry>& charges = _categoryCharges[chargeCategoryId]; if (charges.empty()) recoveryStart = Clock::now(); else @@ -731,12 +731,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(); @@ -744,7 +741,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<std::chrono::milliseconds>(itr->second.front().RechargeEnd - Clock::now()).count()); setSpellCharges.ConsumedCharges = uint8(itr->second.size()); @@ -755,12 +752,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); @@ -769,7 +763,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()); } } @@ -787,40 +781,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 = float(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 f38cf40dd96..5db23525a7f 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" @@ -358,9 +358,10 @@ SpellImplicitTargetInfo::StaticData SpellImplicitTargetInfo::_data[TOTAL_SPELL_ {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 145 {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 146 {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 147 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 148 }; -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 +390,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,9 +466,12 @@ 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.MinScalingLevel && _spellInfo->Scaling.MinScalingLevel > level) + level = _spellInfo->Scaling.MinScalingLevel; + if (_spellInfo->Scaling.MaxScalingLevel && _spellInfo->Scaling.MaxScalingLevel < level) level = _spellInfo->Scaling.MaxScalingLevel; @@ -484,20 +485,17 @@ 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 = GetSpellScalingColumnForClass(gtScaling, _spellInfo->Scaling.Class); + else + value = gtScaling->Item; } else value = GetRandomPropertyPoints(itemLevel != -1 ? uint32(itemLevel) : 1u, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0); } 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; @@ -609,10 +607,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; } } } @@ -974,12 +972,17 @@ SpellEffectInfo::StaticData SpellEffectInfo::_data[TOTAL_SPELL_EFFECTS] = {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 249 SPELL_EFFECT_249 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 250 SPELL_EFFECT_TAKE_SCREENSHOT {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 251 SPELL_EFFECT_SET_GARRISON_CACHE_SIZE + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 252 SPELL_EFFECT_252 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 253 SPELL_EFFECT_253 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 254 SPELL_EFFECT_254 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 255 SPELL_EFFECT_255 }; -SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& effectsMap, SpellVisualMap&& visuals) +SpellInfo::SpellInfo(SpellInfoLoadHelper const& data, SpellEffectEntryMap const& effectsMap, SpellVisualMap&& visuals, + std::unordered_map<uint32, SpellEffectScalingEntry const*> const& effectScaling) : _hasPowerDifficultyData(false) { - Id = spellEntry->ID; + Id = data.Entry->ID; // SpellDifficultyEntry for (SpellEffectEntryMap::value_type const& itr : effectsMap) @@ -990,31 +993,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 +1020,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; @@ -1044,18 +1034,14 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef std::sort(visualPair.second.begin(), visualPair.second.end(), [](SpellXSpellVisualEntry const* first, SpellXSpellVisualEntry const* second) { return first->PlayerConditionID > second->PlayerConditionID; }); // 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.MinScalingLevel = _scaling ? _scaling->MinScalingLevel : 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; @@ -1067,7 +1053,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; @@ -1078,47 +1064,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; @@ -1127,26 +1113,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) @@ -1172,7 +1158,7 @@ void SpellInfo::_UnloadSpellEffects() uint32 SpellInfo::GetCategory() const { - return CategoryEntry ? CategoryEntry->ID : 0; + return CategoryId; } bool SpellInfo::HasEffect(uint32 difficulty, SpellEffectName effect) const @@ -1439,7 +1425,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 @@ -1715,7 +1705,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; @@ -2065,11 +2055,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())) { @@ -2469,33 +2459,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) @@ -2652,10 +2652,10 @@ std::vector<SpellInfo::CostData> 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; } } @@ -2810,7 +2810,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; } @@ -3325,81 +3325,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 f749539f51f..0888c7ebb6e 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" @@ -277,7 +275,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 +322,13 @@ typedef std::unordered_map<uint32, SpellVisualVector> SpellVisualMap; typedef std::vector<AuraEffect*> AuraEffectVector; +struct SpellInfoLoadHelper; + class TC_GAME_API SpellInfo { public: uint32 Id; - SpellCategoryEntry const* CategoryEntry; + uint32 CategoryId; uint32 Dispel; uint32 Mechanic; uint32 Attributes; @@ -379,7 +379,7 @@ public: uint32 SpellLevel; SpellDurationEntry const* DurationEntry; std::vector<SpellPowerEntry const*> PowerCosts; - uint32 RuneCostID; + uint32 RangeIndex; SpellRangeEntry const* RangeEntry; float Speed; uint32 StackAmount; @@ -393,7 +393,7 @@ public: uint32 SpellVisual[2]; uint32 SpellIconID; uint32 ActiveIconID; - char* SpellName; + LocalizedString const* SpellName; uint32 MaxTargetLevel; uint32 MaxAffectedTargets; uint32 SpellFamilyName; @@ -402,32 +402,12 @@ 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 MinScalingLevel; uint32 MaxScalingLevel; uint32 ScalesFromItemLevel; } Scaling; @@ -435,24 +415,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<uint32, SpellEffectScalingEntry const*> const& effectScaling); ~SpellInfo(); uint32 GetCategory() const; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index dc785f3bddf..13d03c4ee57 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" @@ -2344,7 +2343,7 @@ void SpellMgr::LoadPetLevelupSpellMap() if (!spell->SpellLevel) continue; - PetLevelupSpellSet& spellSet = mPetLevelupSpellMap[creatureFamily->ID]; + PetLevelupSpellSet& spellSet = mPetLevelupSpellMap[i]; if (spellSet.empty()) ++family_count; @@ -2648,17 +2647,19 @@ void SpellMgr::LoadSpellInfoStore() UnloadSpellInfoStore(); mSpellInfoMap.resize(sSpellStore.GetNumRows(), NULL); + std::unordered_map<uint32, SpellInfoLoadHelper> loadData; std::unordered_map<uint32, SpellEffectEntryMap> effectsBySpell; std::unordered_map<uint32, SpellVisualMap> visualsBySpell; + std::unordered_map<uint32, SpellEffectScalingEntry const*> spellEffectScallingByEffectId; for (SpellEffectEntry const* effect : sSpellEffectStore) { - if (effect->EffectIndex >= MAX_SPELL_EFFECTS) - { - TC_LOG_ERROR("server.loading", "Spell %u has invalid EffectIndex %u, max is %u, skipped", effect->SpellID, effect->EffectIndex, uint32(MAX_SPELL_EFFECTS)); - continue; - } + ASSERT(effect->EffectIndex < MAX_SPELL_EFFECTS, "MAX_SPELL_EFFECTS must be at least %u", effect->EffectIndex); + ASSERT(effect->Effect < TOTAL_SPELL_EFFECTS, "TOTAL_SPELL_EFFECTS must be at least %u", effect->Effect); + ASSERT(effect->EffectAura < TOTAL_AURAS, "TOTAL_AURAS must be at least %u", effect->EffectAura); + ASSERT(effect->ImplicitTarget[0] < TOTAL_SPELL_TARGETS, "TOTAL_SPELL_TARGETS must be at least %u", effect->ImplicitTarget[0]); + ASSERT(effect->ImplicitTarget[1] < TOTAL_SPELL_TARGETS, "TOTAL_SPELL_TARGETS must be at least %u", effect->ImplicitTarget[1]); SpellEffectEntryVector& effectsForDifficulty = effectsBySpell[effect->SpellID][effect->DifficultyID]; if (effectsForDifficulty.size() <= effect->EffectIndex) @@ -2667,12 +2668,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)); } @@ -3073,12 +3132,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<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->Effect = SPELL_EFFECT_DUMMY; - const_cast<SpellEffectInfo*>(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<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); @@ -3429,6 +3482,11 @@ void SpellMgr::LoadSpellInfoCorrections() void SpellMgr::LoadPetFamilySpellsStore() { + std::unordered_map<uint32, SpellLevelsEntry const*> 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); @@ -3439,8 +3497,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..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" @@ -597,6 +596,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/game/Tools/CharacterDatabaseCleaner.cpp b/src/server/game/Tools/CharacterDatabaseCleaner.cpp index 255900b5414..a4d34f6088a 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() { @@ -149,7 +148,7 @@ bool CharacterDatabaseCleaner::TalentCheck(uint32 talent_id) void CharacterDatabaseCleaner::CleanCharacterTalent() { - CharacterDatabase.DirectPExecute("DELETE FROM character_talent WHERE spec > %u", MAX_TALENT_GROUPS); + CharacterDatabase.DirectPExecute("DELETE FROM character_talent WHERE spec > %u", MAX_SPECIALIZATIONS); CheckUnique("spell", "character_talent", &TalentCheck); } diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 37d35e5b46d..e2c80f16ca8 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" @@ -1480,7 +1481,7 @@ void World::SetInitialWorldSettings() ///- Initialize VMapManager function pointers (to untangle game/collision circular deps) if (VMAP::VMapManager2* vmmgr2 = dynamic_cast<VMAP::VMapManager2*>(VMAP::VMapFactory::createOrGetVMapManager())) { - vmmgr2->GetLiquidFlagsPtr = &GetLiquidFlags; + vmmgr2->GetLiquidFlagsPtr = &DB2Manager::GetLiquidFlags; vmmgr2->IsVMAPDisabledForPtr = &DisableMgr::IsVMAPDisabledFor; } @@ -1530,8 +1531,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..."); @@ -1539,7 +1538,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(); @@ -1954,9 +1953,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(); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index ef8668f2aa7..1851ffa6079 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -525,7 +525,7 @@ enum WorldStates WS_GUILD_WEEKLY_RESET_TIME = 20050, // Next guild week reset time }; -#define MAX_CHARACTERS_PER_REALM 11 +#define MAX_CHARACTERS_PER_REALM 12 /// Storage class for commands issued for delayed execution struct CliCommandHolder diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index 6f59e6e40da..b482716e059 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; @@ -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 b2094df08ef..0956b25dcdc 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); @@ -214,8 +214,8 @@ public: char* fail2 = strtok(NULL, " "); uint8 failArg2 = fail2 ? (uint8)atoi(fail2) : 0; - WorldPackets::Spells::CastFailed castFailed(SMSG_CAST_FAILED); - castFailed.CastID = 0; + WorldPackets::Spells::CastFailed castFailed; + castFailed.CastID = ObjectGuid::Empty; castFailed.SpellID = 133; castFailed.Reason = failNum; castFailed.FailedArg1 = failArg1; @@ -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 081280532fb..05b6a5c9713 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); + 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_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_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..01844aa937e 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; + } } } @@ -291,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; + } + + // 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); - if (!found) - found = true; + handler->SendSysMessage(ss.str().c_str()); + + if (!found) + found = true; + } } } @@ -425,27 +462,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) @@ -688,41 +743,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 +831,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"; + // include rank in link name + if (rank) + ss << handler->GetTrinityString(LANG_SPELL_RANK) << rank; - 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 (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); - handler->SendSysMessage(ss.str().c_str()); + handler->SendSysMessage(ss.str().c_str()); - if (!found) - found = true; + if (!found) + found = true; + } } } if (!found) @@ -836,56 +927,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; + // 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; + // include rank in link name + if (rank) + ss << handler->GetTrinityString(LANG_SPELL_RANK) << rank; - 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()); + 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); @@ -1037,36 +1128,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; + } } } } @@ -1091,18 +1200,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 5ce891a0105..26385221d65 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); @@ -235,14 +235,14 @@ 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()) handler->PSendSysMessage(LANG_TRANSPORT_POSITION, - transport->GetGOInfo()->moTransport.mapID, object->GetTransOffsetX(), object->GetTransOffsetY(), object->GetTransOffsetZ(), object->GetTransOffsetO(), + transport->GetGOInfo()->moTransport.SpawnMap, object->GetTransOffsetX(), object->GetTransOffsetY(), object->GetTransOffsetZ(), object->GetTransOffsetO(), transport->GetEntry(), transport->GetName().c_str()); handler->PSendSysMessage(LANG_GRID_POSITION, cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(), @@ -286,7 +286,10 @@ public: uint32 spellId = handler->extractSpellIdFromLink((char*)args); if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId)) - Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, target, target); + { + ObjectGuid castId = ObjectGuid::Create<HighGuid::Cast>(SPELL_CAST_SOURCE_NORMAL, target->GetMapId(), spellId, target->GetMap()->GenerateLowGuid<HighGuid::Cast>()); + Aura::TryRefreshStackOrCreate(spellInfo, castId, MAX_EFFECT_MASK, target, target); + } return true; } @@ -762,7 +765,7 @@ public: } target->GetSpellHistory()->ResetCooldown(spellIid, true); - target->GetSpellHistory()->ResetCharges(spellInfo->ChargeCategoryEntry); + target->GetSpellHistory()->ResetCharges(spellInfo->ChargeCategoryId); handler->PSendSysMessage(LANG_REMOVE_COOLDOWN, spellIid, owner == handler->GetSession()->GetPlayer() ? handler->GetTrinityString(LANG_YOU) : nameLink.c_str()); } return true; @@ -899,12 +902,15 @@ public: static bool HandleUnstuckCommand(ChatHandler* handler, char const* args) { +#define SPELL_UNSTUCK_ID 7355 +#define SPELL_UNSTUCK_VISUAL 2683 + // No args required for players if (handler->GetSession() && !handler->GetSession()->HasPermission(rbac::RBAC_PERM_COMMANDS_USE_UNSTUCK_WITH_ARGS)) { // 7355: "Stuck" if (Player* player = handler->GetSession()->GetPlayer()) - player->CastSpell(player, 7355, false); + player->CastSpell(player, SPELL_UNSTUCK_ID, false); return true; } @@ -925,12 +931,15 @@ public: if (player->IsInFlight() || player->IsInCombat()) { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(7355); + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_UNSTUCK_ID); if (!spellInfo) return false; if (Player* caster = handler->GetSession()->GetPlayer()) - Spell::SendCastResult(caster, spellInfo, 0, SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW); + { + ObjectGuid castId = ObjectGuid::Create<HighGuid::Cast>(SPELL_CAST_SOURCE_NORMAL, player->GetMapId(), SPELL_UNSTUCK_ID, player->GetMap()->GenerateLowGuid<HighGuid::Cast>()); + Spell::SendCastResult(caster, spellInfo, SPELL_UNSTUCK_VISUAL, castId, SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW); + } return false; } @@ -1175,10 +1184,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](ItemSparseEntry const* sparse) { for (uint32 i = 0; i < MAX_LOCALES; ++i) - if (itemName == itemSparse->Name->Str[i]) + if (itemName == sparse->Name->Str[i]) return true; return false; }); @@ -1476,7 +1485,7 @@ public: // add the skill to the player's book with step 1 (which is the first rank, in most cases something // like 'Apprentice <skill>'. 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; } @@ -1580,7 +1589,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); @@ -1801,8 +1810,8 @@ public: handler->PSendSysMessage(LANG_PINFO_CHR_LEVEL_HIGH, level); // Output XI. LANG_PINFO_CHR_RACE - raceStr = GetRaceName(raceid, locale); - classStr = GetClassName(classid, locale); + raceStr = DB2Manager::GetChrRaceName(raceid, 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 @@ -1823,15 +1832,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))); @@ -2607,7 +2616,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); @@ -2687,7 +2696,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/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/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index c71e0f01940..96acb89f1cb 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -268,7 +268,7 @@ public: Creature* creature = trans->CreateNPCPassenger(guid, &data); - creature->SaveToDB(trans->GetGOInfo()->moTransport.mapID, 1 << map->GetSpawnMode(), chr->GetPhaseMask()); + creature->SaveToDB(trans->GetGOInfo()->moTransport.SpawnMap, 1 << map->GetSpawnMode(), chr->GetPhaseMask()); sObjectMgr->AddCreatureToGrid(guid, &data); return true; 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/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/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index df66d6b32b8..2772402f83f 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -1338,7 +1338,7 @@ class spell_putricide_mutation_init : public SpellScriptLoader SpellCastResult result = CheckRequirementInternal(extension); if (result != SPELL_CAST_OK) { - Spell::SendCastResult(GetExplTargetUnit()->ToPlayer(), GetSpellInfo(), 0, result, extension); + Spell::SendCastResult(GetExplTargetUnit()->ToPlayer(), GetSpellInfo(), GetSpell()->m_SpellVisual, GetSpell()->m_castId, result, extension); return result; } @@ -1435,7 +1435,7 @@ class spell_putricide_mutated_transformation : public SpellScriptLoader if (putricide->AI()->GetData(DATA_ABOMINATION)) { if (Player* player = caster->ToPlayer()) - Spell::SendCastResult(player, GetSpellInfo(), 0, SPELL_FAILED_CUSTOM_ERROR, SPELL_CUSTOM_ERROR_TOO_MANY_ABOMINATIONS); + Spell::SendCastResult(player, GetSpellInfo(), GetSpell()->m_SpellVisual, GetSpell()->m_castId, SPELL_FAILED_CUSTOM_ERROR, SPELL_CUSTOM_ERROR_TOO_MANY_ABOMINATIONS); return; } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp index 7e5661e5dbc..3fec4db8803 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp @@ -60,7 +60,8 @@ class icecrown_citadel_teleport : public GameObjectScript if (player->IsInCombat()) { - Spell::SendCastResult(player, spell, 0, SPELL_FAILED_AFFECTING_COMBAT); + ObjectGuid castId = ObjectGuid::Create<HighGuid::Cast>(SPELL_CAST_SOURCE_NORMAL, player->GetMapId(), spell->Id, player->GetMap()->GenerateLowGuid<HighGuid::Cast>()); + Spell::SendCastResult(player, spell, 0, castId, SPELL_FAILED_AFFECTING_COMBAT); return true; } @@ -85,7 +86,10 @@ class at_frozen_throne_teleport : public AreaTriggerScript if (player->IsInCombat()) { if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(FROZEN_THRONE_TELEPORT)) - Spell::SendCastResult(player, spell, 0, SPELL_FAILED_AFFECTING_COMBAT); + { + ObjectGuid castId = ObjectGuid::Create<HighGuid::Cast>(SPELL_CAST_SOURCE_NORMAL, player->GetMapId(), spell->Id, player->GetMap()->GenerateLowGuid<HighGuid::Cast>()); + Spell::SendCastResult(player, spell, 0, castId, SPELL_FAILED_AFFECTING_COMBAT); + } return true; } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 7e8ddeda484..1a165780224 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -384,8 +384,8 @@ class instance_icecrown_citadel : public InstanceMapScript break; case NPC_ZAFOD_BOOMBOX: if (GameObjectTemplate const* go = sObjectMgr->GetGameObjectTemplate(GO_THE_SKYBREAKER_A)) - if ((TeamInInstance == ALLIANCE && data->mapid == go->moTransport.mapID) || - (TeamInInstance == HORDE && data->mapid != go->moTransport.mapID)) + if ((TeamInInstance == ALLIANCE && data->mapid == go->moTransport.SpawnMap) || + (TeamInInstance == HORDE && data->mapid != go->moTransport.SpawnMap)) return entry; return 0; case NPC_IGB_MURADIN_BRONZEBEARD: diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp index 0897c7e35e8..b006ee2341a 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp @@ -1265,7 +1265,7 @@ class spell_ulduar_teleporter : public SpellScriptLoader if (GetExplTargetUnit()->IsInCombat()) { - Spell::SendCastResult(GetExplTargetUnit()->ToPlayer(), GetSpellInfo(), 0, SPELL_FAILED_AFFECTING_COMBAT); + Spell::SendCastResult(GetExplTargetUnit()->ToPlayer(), GetSpellInfo(), GetSpell()->m_SpellVisual, GetSpell()->m_castId, SPELL_FAILED_AFFECTING_COMBAT); return SPELL_FAILED_AFFECTING_COMBAT; } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp index 8c371c6a244..057f0727526 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp @@ -885,7 +885,7 @@ class item_tainted_core : public ItemScript public: item_tainted_core() : ItemScript("item_tainted_core") { } - bool OnUse(Player* player, Item* /*item*/, SpellCastTargets const& targets) override + bool OnUse(Player* player, Item* /*item*/, SpellCastTargets const& targets, ObjectGuid /*castId*/) override { InstanceScript* instance = player->GetInstanceScript(); if (!instance) diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp index f191a0c3ad7..f4cb9d3aab0 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp @@ -232,10 +232,8 @@ class boss_kelidan_the_breaker : public CreatureScript Talk(SAY_NOVA); if (SpellInfo const* nova = sSpellMgr->GetSpellInfo(SPELL_BURNING_NOVA)) - { - if (Aura* aura = Aura::TryRefreshStackOrCreate(nova, MAX_EFFECT_MASK, me, me)) + if (Aura* aura = Aura::TryRefreshStackOrCreate(nova, ObjectGuid::Create<HighGuid::Cast>(SPELL_CAST_SOURCE_NORMAL, me->GetMapId(), nova->Id, me->GetMap()->GenerateLowGuid<HighGuid::Cast>()), MAX_EFFECT_MASK, me, me)) aura->ApplyForTargets(); - } if (IsHeroic()) DoTeleportAll(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); 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_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index d82e9920df2..bb7ad7a84c0 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) @@ -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..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 @@ -2706,7 +2705,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/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/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 7ad37ba5bc2..ad43ed92d3e 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/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 5cc25d87f99..6c6eec993ab 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -793,7 +793,7 @@ class spell_warl_health_funnel : public SpellScriptLoader if (Player* modOwner = caster->GetSpellModOwner()) modOwner->ApplySpellMod(GetId(), SPELLMOD_COST, damage); - SpellNonMeleeDamage damageInfo(caster, caster, GetSpellInfo()->Id, GetSpellInfo()->SchoolMask); + SpellNonMeleeDamage damageInfo(caster, caster, GetSpellInfo()->Id, GetSpellInfo()->SchoolMask, GetAura()->GetCastGUID()); damageInfo.periodicLog = true; damageInfo.damage = damage; caster->DealSpellDamage(&damageInfo, false); diff --git a/src/server/scripts/World/item_scripts.cpp b/src/server/scripts/World/item_scripts.cpp index 69376b62048..c86d56a31b2 100644 --- a/src/server/scripts/World/item_scripts.cpp +++ b/src/server/scripts/World/item_scripts.cpp @@ -49,7 +49,7 @@ class item_only_for_flight : public ItemScript public: item_only_for_flight() : ItemScript("item_only_for_flight") { } - bool OnUse(Player* player, Item* item, SpellCastTargets const& /*targets*/) override + bool OnUse(Player* player, Item* item, SpellCastTargets const& /*targets*/, ObjectGuid castId) override { uint32 itemId = item->GetEntry(); bool disabled = false; @@ -67,7 +67,7 @@ public: break; case 34475: if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_ARCANE_CHARGES)) - Spell::SendCastResult(player, spellInfo, 1, SPELL_FAILED_NOT_ON_GROUND); + Spell::SendCastResult(player, spellInfo, 0, castId, SPELL_FAILED_NOT_ON_GROUND); break; } @@ -90,7 +90,7 @@ class item_nether_wraith_beacon : public ItemScript public: item_nether_wraith_beacon() : ItemScript("item_nether_wraith_beacon") { } - bool OnUse(Player* player, Item* /*item*/, SpellCastTargets const& /*targets*/) override + bool OnUse(Player* player, Item* /*item*/, SpellCastTargets const& /*targets*/, ObjectGuid /*castId*/) override { if (player->GetQuestStatus(10832) == QUEST_STATUS_INCOMPLETE) { @@ -113,7 +113,7 @@ class item_gor_dreks_ointment : public ItemScript public: item_gor_dreks_ointment() : ItemScript("item_gor_dreks_ointment") { } - bool OnUse(Player* player, Item* item, SpellCastTargets const& targets) override + bool OnUse(Player* player, Item* item, SpellCastTargets const& targets, ObjectGuid /*castId*/) override { if (targets.GetUnitTarget() && targets.GetUnitTarget()->GetTypeId() == TYPEID_UNIT && targets.GetUnitTarget()->GetEntry() == 20748 && !targets.GetUnitTarget()->HasAura(32578)) @@ -133,7 +133,7 @@ class item_incendiary_explosives : public ItemScript public: item_incendiary_explosives() : ItemScript("item_incendiary_explosives") { } - bool OnUse(Player* player, Item* item, SpellCastTargets const & /*targets*/) override + bool OnUse(Player* player, Item* item, SpellCastTargets const& /*targets*/, ObjectGuid /*castId*/) override { if (player->FindNearestCreature(26248, 15) || player->FindNearestCreature(26249, 15)) return false; @@ -223,7 +223,7 @@ class item_pile_fake_furs : public ItemScript public: item_pile_fake_furs() : ItemScript("item_pile_fake_furs") { } - bool OnUse(Player* player, Item* /*item*/, SpellCastTargets const & /*targets*/) override + bool OnUse(Player* player, Item* /*item*/, SpellCastTargets const& /*targets*/, ObjectGuid /*castId*/) override { GameObject* go = NULL; for (uint8 i = 0; i < CaribouTrapsNum; ++i) @@ -268,7 +268,7 @@ class item_petrov_cluster_bombs : public ItemScript public: item_petrov_cluster_bombs() : ItemScript("item_petrov_cluster_bombs") { } - bool OnUse(Player* player, Item* /*item*/, const SpellCastTargets & /*targets*/) override + bool OnUse(Player* player, Item* /*item*/, SpellCastTargets const& /*targets*/, ObjectGuid castId) override { if (player->GetZoneId() != ZONE_ID_HOWLING) return false; @@ -276,7 +276,7 @@ public: if (!player->GetTransport() || player->GetAreaId() != AREA_ID_SHATTERED_STRAITS) { if (const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(SPELL_PETROV_BOMB)) - Spell::SendCastResult(player, spellInfo, 1, SPELL_FAILED_NOT_HERE); + Spell::SendCastResult(player, spellInfo, 0, castId, SPELL_FAILED_NOT_HERE); return true; } @@ -332,7 +332,7 @@ class item_dehta_trap_smasher : public ItemScript public: item_dehta_trap_smasher() : ItemScript("item_dehta_trap_smasher") { } - bool OnUse(Player* player, Item* /*item*/, const SpellCastTargets & /*targets*/) override + bool OnUse(Player* player, Item* /*item*/, SpellCastTargets const& /*targets*/, ObjectGuid /*castId*/) override { if (player->GetQuestStatus(QUEST_CANNOT_HELP_THEMSELVES) != QUEST_STATUS_INCOMPLETE) return false; @@ -368,7 +368,7 @@ class item_trident_of_nazjan : public ItemScript public: item_trident_of_nazjan() : ItemScript("item_Trident_of_Nazjan") { } - bool OnUse(Player* player, Item* item, const SpellCastTargets & /*targets*/) override + bool OnUse(Player* player, Item* item, SpellCastTargets const& /*targets*/, ObjectGuid /*castId*/) override { if (player->GetQuestStatus(QUEST_THE_EMISSARY) == QUEST_STATUS_INCOMPLETE) { @@ -395,7 +395,7 @@ class item_captured_frog : public ItemScript public: item_captured_frog() : ItemScript("item_captured_frog") { } - bool OnUse(Player* player, Item* item, SpellCastTargets const& /*targets*/) override + bool OnUse(Player* player, Item* item, SpellCastTargets const& /*targets*/, ObjectGuid /*castId*/) override { if (player->GetQuestStatus(QUEST_THE_PERFECT_SPIES) == QUEST_STATUS_INCOMPLETE) { diff --git a/src/server/shared/DataStores/DB2Meta.cpp b/src/server/shared/DataStores/DB2Meta.cpp new file mode 100644 index 00000000000..bf119b52150 --- /dev/null +++ b/src/server/shared/DataStores/DB2Meta.cpp @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "DB2Meta.h" + +DB2Meta::DB2Meta(int32 indexField, uint32 fieldCount, uint32 layoutHash, char const* types, uint8 const* arraySizes) + : IndexField(indexField), FieldCount(fieldCount), LayoutHash(layoutHash), 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..2c165b52d86 --- /dev/null +++ b/src/server/shared/DataStores/DB2Meta.h @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef DB2Meta_h__ +#define DB2Meta_h__ + +#include "Define.h" + +struct DB2Meta +{ + DB2Meta(int32 indexField, uint32 fieldCount, uint32 layoutHash, 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; + uint32 LayoutHash; + 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 new file mode 100644 index 00000000000..95e41cdced2 --- /dev/null +++ b/src/server/shared/DataStores/DB2SparseStorageLoader.cpp @@ -0,0 +1,710 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "Common.h" +#include "DB2SparseStorageLoader.h" +#include "DatabaseEnv.h" +#include "Log.h" + +DB2SparseFileLoader::DB2SparseFileLoader() +{ + fileName = nullptr; + meta = nullptr; + + recordCount = 0; + fieldCount = 0; + recordSize = 0; + offsetsPos = 0; + tableHash = 0; + layoutHash = 0; + minIndex = 0; + maxIndex = 0; + localeMask = 0; + copyIdSize = 0; + + dataStart = 0; + data = nullptr; + offsets = nullptr; + fields = nullptr; +} + +bool DB2SparseFileLoader::Load(const char *filename, DB2Meta const* meta) +{ + if (data) + { + delete[] data; + data = nullptr; + } + + FILE* f = fopen(filename, "rb"); + if (!f) + return false; + + fileName = filename; + this->meta = meta; + uint32 header; + if (fread(&header, 4, 1, f) != 1) // Signature + { + fclose(f); + return false; + } + + EndianConvert(header); + + if (header != 0x35424457) + { + fclose(f); + return false; //'WDB5' + } + + 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(&layoutHash, 4, 1, f) != 1) // Layout hash + { + fclose(f); + return false; + } + + EndianConvert(layoutHash); + + if (layoutHash != meta->LayoutHash) + { + fclose(f); + return false; + } + + 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); + + ASSERT((metaFlags & 0x1) != 0, "%s is not a sparse storage, use DB2Storage!", filename); + + 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]; + + 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; + delete[] fields; +} + +static char const* const nullStr = ""; + +char* DB2SparseFileLoader::AutoProduceData(IndexTable const& indexTable, uint32 locale, std::vector<char*>& stringPool) +{ + typedef char* ptr; + if (meta->FieldCount != fieldCount) + return NULL; + + //get struct size and index pos + uint32 recordsize = meta->GetRecordSize(); + + 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 = 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 stringHoldersRecordPoolSize = localizedStringFields * sizeof(LocalizedString) + (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 - (!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; + + 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; + + if (!meta->HasIndexFieldInData()) + { + *((uint32*)(&dataTable[offset])) = y + minIndex; + offset += 4; + } + + for (uint32 x = 0; x < fieldCount; ++x) + { + uint16 fieldBytes = 4 - fields[x].UnusedBits / 8; + for (uint32 z = 0; z < meta->ArraySizes[x]; ++z) + { + switch (meta->Types[x]) + { + case FT_FLOAT: + { + float val = *reinterpret_cast<float*>(&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<uint8*>(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + break; + case 2: + { + uint16 val16 = *reinterpret_cast<uint16*>(&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<dbcint24*>(&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<uint32*>(&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<uint8*>(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + offset += 1; + fieldOffset += 1; + break; + } + case FT_SHORT: + { + ASSERT(fieldBytes == 2); + uint16 val = *reinterpret_cast<uint16*>(&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; + } + } + } + + ++recordNum; + } + + return dataTable; +} + +char* DB2SparseFileLoader::AutoProduceStrings(char* dataTable, uint32 locale) +{ + if (meta->FieldCount != 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 = 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; + + for (uint32 y = 0; y < offsetCount; y++) + { + 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 z = 0; z < meta->ArraySizes[x]; ++z) + { + switch (meta->Types[x]) + { + 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; + } + } + } + } + + return stringTable; +} + +char* DB2SparseDatabaseLoader::Load(HotfixDatabaseStatements preparedStatement, IndexTable const& indexTable, std::vector<char*>& 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; + + if (_meta->GetDbFieldCount() != result->GetFieldCount()) + return nullptr; + + // get struct size and index pos + uint32 indexField = _meta->GetDbIndexField(); + uint32 recordSize = _meta->GetRecordSize(); + + // we store flat holders pool as single memory block + 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 stringHoldersRecordPoolSize = localizedStringFields * sizeof(LocalizedString) + (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[indexField].GetUInt32(); + + // Attempt to overwrite existing data + char* dataValue = indexTable.Get(indexValue); + if (!dataValue) + { + newIndexes[newRecords] = indexValue; + dataValue = &tempDataTable[newRecords++ * recordSize]; + } + + uint32 f = 0; + if (!_meta->HasIndexFieldInData()) + { + *((uint32*)(&dataValue[offset])) = indexValue; + offset += 4; + ++f; + } + + for (uint32 x = 0; x < _meta->FieldCount; ++x) + { + for (uint32 z = 0; z < _meta->ArraySizes[x]; ++z) + { + switch (_meta->Types[x]) + { + 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); + + 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); + + 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; + } + } + + 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(HotfixDatabaseStatements preparedStatement, uint32 locale, IndexTable const& indexTable, std::vector<char*>& stringPool) +{ + PreparedStatement* stmt = HotfixDatabase.GetPreparedStatement(preparedStatement); + stmt->setString(0, localeNames[locale]); + PreparedQueryResult result = HotfixDatabase.Query(stmt); + if (!result) + return; + + size_t stringFields = _meta->GetStringFieldCount(true); + if (result->GetFieldCount() != stringFields + 1 /*ID*/) + return; + + uint32 fieldCount = _meta->FieldCount; + uint32 recordSize = _meta->GetRecordSize(); + + 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)) + { + if (!_meta->HasIndexFieldInData()) + offset += 4; + + for (uint32 x = 0; x < fieldCount; ++x) + { + for (uint32 z = 0; z < _meta->ArraySizes[x]; ++z) + { + switch (_meta->Types[x]) + { + 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; + } + } + } + + 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<char*>(*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..0936947ea6a --- /dev/null +++ b/src/server/shared/DataStores/DB2SparseStorageLoader.h @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef DB2_SPARSE_FILE_LOADER_H +#define DB2_SPARSE_FILE_LOADER_H + +#include "DB2Meta.h" +#include "Utilities/ByteConverter.h" +#include "Implementation/HotfixDatabase.h" +#include <unordered_map> +#include <vector> + +class TC_SHARED_API IndexTable +{ +public: + virtual void Insert(uint32 index, char* data) const = 0; + virtual char* Get(uint32 index) const = 0; +}; + +template<typename T> +class IndexTableAdapter : public IndexTable +{ +public: + IndexTableAdapter(std::unordered_map<uint32, T const*>& 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<uint32, T const*>& _indexTable; +}; + +class TC_SHARED_API DB2SparseFileLoader +{ + public: + DB2SparseFileLoader(); + ~DB2SparseFileLoader(); + + bool Load(char const* filename, DB2Meta const* meta); + + uint32 GetNumRows() const { return recordCount; } + uint32 GetCols() const { return fieldCount; } + uint32 GetTableHash() const { return tableHash; } + uint32 GetLayoutHash() const { return layoutHash; } + bool IsLoaded() const { return (data != NULL); } + char* AutoProduceData(IndexTable const& indexTable, uint32 locale, std::vector<char*>& stringPool); + char* AutoProduceStrings(char* dataTable, uint32 locale); + +private: +#pragma pack(push, 1) + struct OffsetTableEntry + { + uint32 FileOffset; + uint16 RecordSize; + }; + struct FieldEntry + { + uint16 UnusedBits; + uint16 Offset; + }; +#pragma pack(pop) + + char const* fileName; + DB2Meta const* meta; + + // WDB2 / WCH2 fields + uint32 recordSize; + uint32 recordCount; + uint32 fieldCount; + uint32 offsetsPos; + uint32 tableHash; + uint32 layoutHash; + uint32 minIndex; + uint32 maxIndex; + uint32 localeMask; + uint32 copyIdSize; + uint32 metaFlags; + FieldEntry* fields; + + uint32 dataStart; + unsigned char* data; + OffsetTableEntry* offsets; +}; + +class TC_SHARED_API DB2SparseDatabaseLoader +{ +public: + DB2SparseDatabaseLoader(std::string const& storageName, DB2Meta const* meta) : _storageName(storageName), _meta(meta) { } + + char* Load(HotfixDatabaseStatements preparedStatement, IndexTable const& indexTable, std::vector<char*>& stringPool); + void LoadStrings(HotfixDatabaseStatements preparedStatement, uint32 locale, IndexTable const& indexTable, std::vector<char*>& 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 a1acd3b5eac..3515d77a586 100644 --- a/src/server/shared/DataStores/DB2StorageLoader.cpp +++ b/src/server/shared/DataStores/DB2StorageLoader.cpp @@ -23,25 +23,28 @@ DB2FileLoader::DB2FileLoader() { fileName = nullptr; + meta = nullptr; + recordSize = 0; recordCount = 0; fieldCount = 0; stringSize = 0; - fieldsOffset = nullptr; - data = nullptr; - stringTable = nullptr; - tableHash = 0; - build = 0; - - unk1 = 0; + layoutHash = 0; minIndex = 0; maxIndex = 0; localeMask = 0; - unk5 = 0; + copyIdSize = 0; + + 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) { @@ -54,8 +57,9 @@ 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 + if (fread(&header, 4, 1, f) != 1) // Signature { fclose(f); return false; @@ -63,13 +67,13 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(header); - if (header != 0x32424457) + if (header != 0x35424457) { fclose(f); - return false; //'WDB2' + return false; //'WDB5' } - 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 +81,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 +89,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 +97,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 +105,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,23 +113,21 @@ 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 + if (layoutHash != meta->LayoutHash) { fclose(f); return false; } - EndianConvert(unk1); + EndianConvert(layoutHash); - if (fread(&minIndex, 4, 1, f) != 1) // MinIndex WDB2 + if (fread(&minIndex, 4, 1, f) != 1) // MinIndex WDB2 { fclose(f); return false; @@ -134,7 +135,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 +143,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,33 +151,35 @@ 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; } - 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 // 4 byte fields (int32/float/strings) - fieldsOffset[i] += 4; + EndianConvert(metaFlags); + + ASSERT((metaFlags & 0x1) == 0, "%s is a sparse storage, use DB2SparseStorage!", filename); + ASSERT((meta->IndexField == -1) || (meta->IndexField == (metaFlags >> 16))); + + fields = new FieldEntry[fieldCount]; + if (fread(fields, fieldCount * sizeof(FieldEntry), 1, f) != 1) + { + fclose(f); + return false; } + if (!meta->HasIndexFieldInData()) + idTableSize = recordCount * sizeof(uint32); + data = new unsigned char[recordSize * recordCount + stringSize]; stringTable = data + recordSize * recordCount; @@ -186,151 +189,135 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) return false; } - fclose(f); - return true; -} - -DB2FileLoader::~DB2FileLoader() -{ - if (data) - delete [] data; - if (fieldsOffset) - delete [] fieldsOffset; -} - -DB2FileLoader::Record DB2FileLoader::getRecord(size_t id) -{ - assert(data); - 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) + if (idTableSize) { - switch (format[x]) + idTable = new unsigned char[idTableSize]; + if (fread(idTable, idTableSize, 1, f) != 1) { - case FT_FLOAT: - case FT_INT: - recordsize += 4; - break; - case FT_STRING: - case FT_STRING_NOT_LOCALIZED: - recordsize += sizeof(char*); - break; - case FT_SORT: - i = x; - break; - case FT_IND: - i = x; - recordsize += 4; - break; - case FT_BYTE: - recordsize += 1; - break; - case FT_LONG: - recordsize += 8; - break; + fclose(f); + return false; } } - if (index_pos) - *index_pos = i; + if (copyIdSize) + { + copyTable = new unsigned char[copyIdSize]; + if (fread(copyTable, copyIdSize, 1, f) != 1) + { + fclose(f); + return false; + } + } - return recordsize; + fclose(f); + return true; } -uint32 DB2FileLoader::GetFormatStringFieldCount(const char* format) +DB2FileLoader::~DB2FileLoader() { - uint32 stringfields = 0; - for (uint32 x = 0; format[x]; ++x) - if (format[x] == FT_STRING || format[x] == FT_STRING_NOT_LOCALIZED) - ++stringfields; - - return stringfields; + delete[] data; + delete[] idTable; + delete[] copyTable; + delete[] fields; } -uint32 DB2FileLoader::GetFormatLocalizedStringFieldCount(char const* format) +DB2FileLoader::Record DB2FileLoader::getRecord(size_t id) { - uint32 stringfields = 0; - for (uint32 x = 0; format[x]; ++x) - if (format[x] == FT_STRING) - ++stringfields; - - return stringfields; + assert(data); + return Record(*this, data + id * recordSize); } -char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char**& indexTable) +char* DB2FileLoader::AutoProduceData(uint32& records, char**& indexTable) { - typedef char * ptr; - if (strlen(format) != fieldCount) + typedef char* ptr; + 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 - for (uint32 y = 0; y < recordCount; y++) + for (uint32 y = 0; y < recordCount; ++y) { - uint32 ind = getRecord(y).getUInt(indexField); + uint32 ind = getRecord(y).getUInt(indexField, 0); if (ind > maxi) maxi = ind; } - - ++maxi; - records = maxi; - indexTable = new ptr[maxi]; - memset(indexTable, 0, maxi * sizeof(ptr)); } else { - records = recordCount; - indexTable = new ptr[recordCount]; + for (uint32 y = 0; y < recordCount; ++y) + { + uint32 ind = ((uint32*)idTable)[y]; + if (ind > maxi) + maxi = ind; + } } - char* dataTable = new char[recordCount * recordsize]; + for (uint32 y = 0; y < copyIdSize; y += 8) + { + 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++) { - if (indexField >= 0) - indexTable[getRecord(y).getUInt(indexField)] = &dataTable[offset]; - else - indexTable[y] = &dataTable[offset]; + Record rec = getRecord(y); + uint32 indexVal = meta->HasIndexFieldInData() ? rec.getUInt(indexField, 0) : ((uint32*)idTable)[y]; + + indexTable[indexVal] = &dataTable[offset]; - for (uint32 x = 0; x < fieldCount; x++) + if (!meta->HasIndexFieldInData()) { - switch (format[x]) + *((uint32*)(&dataTable[offset])) = indexVal; + offset += 4; + } + + for (uint32 x = 0; x < fieldCount; ++x) + { + for (uint32 z = 0; z < meta->ArraySizes[x]; ++z) { - 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_STRING: - case FT_STRING_NOT_LOCALIZED: - *((char**)(&dataTable[offset])) = nullptr; // will be replaces non-empty or "" strings in AutoProduceStrings - offset += sizeof(char*); - break; + 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; + } } } } @@ -340,17 +327,17 @@ 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) + 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 stringHoldersRecordPoolSize = localizedStringFields * sizeof(LocalizedString) + (stringFields - localizedStringFields) * sizeof(char*); @@ -369,37 +356,43 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da { uint32 stringFieldOffset = 0; - 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: - offset += 4; - break; - case FT_BYTE: - offset += 1; - break; - case FT_LONG: - offset += 8; - 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 (format[x] == FT_STRING) - stringFieldOffset += sizeof(LocalizedString); - else - stringFieldOffset += sizeof(char*); + 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; + 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", format[x]); } } } @@ -408,9 +401,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) + if (meta->FieldCount != fieldCount) return nullptr; if (!(localeMask & (1 << locale))) @@ -437,41 +430,49 @@ char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uin for (uint32 y = 0; y < recordCount; y++) { - 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: - offset += 4; - break; - case FT_BYTE: - offset += 1; - break; - case FT_LONG: - offset += 8; - 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; } } } @@ -480,24 +481,48 @@ 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<char*>& 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<char*>& 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 - std::size_t stringFields = DB2FileLoader::GetFormatStringFieldCount(format); - std::size_t localizedStringFields = DB2FileLoader::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 stringHoldersRecordPoolSize = localizedStringFields * sizeof(LocalizedString) + (stringFields - localizedStringFields) * sizeof(char*); @@ -516,15 +541,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) { @@ -546,11 +565,7 @@ char* DB2DatabaseLoader::Load(const char* format, HotfixDatabaseStatements prepa uint32 offset = 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]; @@ -560,55 +575,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()) { - switch (format[f]) + *((uint32*)(&dataValue[offset])) = indexValue; + offset += 4; + ++f; + } + + for (uint32 x = 0; x < _meta->FieldCount; ++x) + { + 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_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 += sizeof(LocalizedString); - offset += sizeof(char*); - break; - } - case FT_STRING_NOT_LOCALIZED: - { - char const** slot = (char const**)(&dataValue[offset]); - *slot = (char*)(&stringHolders[stringHoldersRecordPoolSize * rec + sizeof(LocalizedString) * 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 += sizeof(char*); - 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; } } @@ -639,7 +668,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<char*>& stringPool) +void DB2DatabaseLoader::LoadStrings(HotfixDatabaseStatements preparedStatement, uint32 locale, uint32 records, char** indexTable, std::vector<char*>& stringPool) { PreparedStatement* stmt = HotfixDatabase.GetPreparedStatement(preparedStatement); stmt->setString(0, localeNames[locale]); @@ -647,14 +676,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 { @@ -663,35 +690,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: - offset += 4; - break; - case FT_BYTE: - offset += 1; - break; - case FT_LONG: - offset += 8; - 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; } } } @@ -699,7 +740,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 41705c67f19..b302a1afe7d 100644 --- a/src/server/shared/DataStores/DB2StorageLoader.h +++ b/src/server/shared/DataStores/DB2StorageLoader.h @@ -18,11 +18,11 @@ #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 <cassert> -#include <list> +#include "Errors.h" +#include <vector> class TC_SHARED_API DB2FileLoader { @@ -30,46 +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<float*>(offset + file.GetOffset(field)); + ASSERT(field < file.fieldCount); + float val = *reinterpret_cast<float*>(offset + GetOffset(field) + arrayIndex * sizeof(float)); EndianConvert(val); return val; } - uint32 getUInt(size_t field) const + + uint32 getUInt(uint32 field, uint32 arrayIndex) const { - assert(field < file.fieldCount); - uint32 val = *reinterpret_cast<uint32*>(offset + file.GetOffset(field)); - EndianConvert(val); - return val; + ASSERT(field < file.fieldCount); + return GetVarInt(field, GetByteSize(field), arrayIndex); } - uint8 getUInt8(size_t field) const + + uint8 getUInt8(uint32 field, uint32 arrayIndex) const { - assert(field < file.fieldCount); - return *reinterpret_cast<uint8*>(offset + file.GetOffset(field)); + ASSERT(field < file.fieldCount); + ASSERT(GetByteSize(field) == 1); + return *reinterpret_cast<uint8*>(offset + GetOffset(field) + arrayIndex * sizeof(uint8)); } - uint64 getUInt64(size_t field) const + + uint16 getUInt16(uint32 field, uint32 arrayIndex) const { - assert(field < file.fieldCount); - uint64 val = *reinterpret_cast<uint64*>(offset + file.GetOffset(field)); + ASSERT(field < file.fieldCount); + ASSERT(GetByteSize(field) == 2); + uint16 val = *reinterpret_cast<uint16*>(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<uint32*>(offset + GetOffset(field) + arrayIndex * sizeof(uint32)); + EndianConvert(stringOffset); + ASSERT(stringOffset < file.stringSize); return reinterpret_cast<char*>(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<uint8*>(offset + GetOffset(field) + arrayIndex * sizeof(uint8)); + } + case 2: + { + uint16 val = *reinterpret_cast<uint16*>(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<dbcint24*>(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<uint32*>(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; @@ -79,52 +134,62 @@ 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 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; uint32 recordCount; uint32 fieldCount; uint32 stringSize; - uint32 *fieldsOffset; - unsigned char *data; - unsigned char *stringTable; - - // 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 tableHash; + uint32 layoutHash; + uint32 minIndex; + uint32 maxIndex; + uint32 localeMask; + uint32 copyIdSize; + uint32 metaFlags; + + 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::list<char*>& stringPool); - void LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, char**& indexTable, std::list<char*>& stringPool); + char* Load(HotfixDatabaseStatements preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::vector<char*>& stringPool); + void LoadStrings(HotfixDatabaseStatements preparedStatement, uint32 locale, uint32 records, char** indexTable, std::vector<char*>& 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 72271ce507b..bf10d78f37b 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,9 +28,20 @@ class DB2StorageBase { public: - virtual ~DB2StorageBase() { } + 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) { } - uint32 GetHash() const { return _tableHash; } + virtual ~DB2StorageBase() + { + delete[] reinterpret_cast<char*>(_dataTable); + delete[] reinterpret_cast<char*>(_dataTableEx); + for (char* strings : _stringPool) + delete[] strings; + } + + uint32 GetTableHash() const { return _tableHash; } + + uint32 GetLayoutHash() const { return _layoutHash; } virtual bool HasRecord(uint32 id) const = 0; @@ -37,19 +49,87 @@ public: virtual void EraseRecord(uint32 id) = 0; + std::string const& GetFileName() const { return _fileName; } + + uint32 GetFieldCount() const { return _fieldCount; } + + 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; + virtual void LoadFromDB() = 0; + virtual void LoadStringsFromDB(uint32 locale) = 0; + protected: + void WriteRecordData(char const* entry, uint32 locale, ByteBuffer& buffer) const + { + if (!_meta->HasIndexFieldInData()) + entry += 4; + + for (uint32 i = 0; i < _meta->FieldCount; ++i) + { + for (uint32 a = 0; a < _meta->ArraySizes[i]; ++a) + { + switch (_meta->Types[i]) + { + 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_SHORT: + buffer << *(uint16*)entry; + entry += 2; + break; + case FT_STRING: + { + LocalizedString* locStr = *(LocalizedString**)entry; + if (locStr->Str[locale][0] == '\0') + locale = 0; + + buffer << locStr->Str[locale]; + entry += sizeof(LocalizedString*); + break; + } + case FT_STRING_NOT_LOCALIZED: + { + buffer << *(char const**)entry; + entry += sizeof(char const*); + break; + } + } + } + } + } + uint32 _tableHash; + uint32 _layoutHash; + std::string _fileName; + uint32 _fieldCount; + DB2Meta const* _meta; + char* _dataTable; + char* _dataTableEx; + std::vector<char*> _stringPool; + HotfixDatabaseStatements _hotfixStatement; }; template<class T> class DB2Storage : public DB2StorageBase { - typedef std::list<char*> StringPoolList; + static_assert(std::is_standard_layout<T>::value, "T in DB2Storage must have standard layout."); + public: typedef DBStorageIterator<T> iterator; - DB2Storage(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex) - : _fileName(fileName), _indexTableSize(0), _fieldCount(0), _format(format), _dataTable(nullptr), _dataTableEx(nullptr), _hotfixStatement(preparedStmtIndex) + DB2Storage(char const* fileName, DB2Meta const* meta, HotfixDatabaseStatements preparedStmtIndex) : DB2StorageBase(fileName, meta, preparedStmtIndex), + _indexTableSize(0) { _indexTable.AsT = NULL; } @@ -57,69 +137,12 @@ public: ~DB2Storage() { delete[] reinterpret_cast<char*>(_indexTable.AsT); - delete[] reinterpret_cast<char*>(_dataTable); - delete[] reinterpret_cast<char*>(_dataTableEx); - for (char* stringPool : _stringPoolList) - delete[] stringPool; } bool HasRecord(uint32 id) const override { return id < _indexTableSize && _indexTable.AsT[id] != nullptr; } void WriteRecord(uint32 id, uint32 locale, ByteBuffer& buffer) const override { - ASSERT(id < _indexTableSize); - char const* entry = _indexTable.AsChar[id]; - ASSERT(entry); - - std::size_t fields = strlen(_format); - for (uint32 i = 0; i < fields; ++i) - { - switch (_format[i]) - { - 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: - { - 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; - } - 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) - { - buffer.append(str, len); - buffer << uint8(0); - } - entry += sizeof(char const*); - break; - } - } - } + WriteRecordData(reinterpret_cast<char const*>(AssertEntry(id)), locale, buffer); } void EraseRecord(uint32 id) override { if (id < _indexTableSize) _indexTable.AsT[id] = nullptr; } @@ -127,38 +150,38 @@ public: 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 - if (!db2.Load((path + _fileName).c_str(), _format)) + if (!db2.Load((path + _fileName).c_str(), _meta)) return false; _fieldCount = db2.GetCols(); - _tableHash = db2.GetHash(); + _tableHash = db2.GetTableHash(); + _layoutHash = db2.GetLayoutHash(); // load raw non-string data - _dataTable = reinterpret_cast<T*>(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, (char*)_dataTable)) + if (char* stringHolders = db2.AutoProduceStringsArrayHolders(_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(_dataTable, locale)) + _stringPool.push_back(stringBlock); } + db2.AutoProduceRecordCopies(_indexTableSize, _indexTable.AsChar, _dataTable); + // 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) @@ -166,59 +189,145 @@ 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, (char*)_dataTable, locale)) - _stringPoolList.push_back(stringBlock); + if (_meta->GetStringFieldCount(true)) + if (char* stringBlock = db2.AutoProduceStrings(_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<T*>(dataTable); - + _dataTableEx = DB2DatabaseLoader(_fileName, _meta).Load(_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)) + if (!_meta->GetStringFieldCount(true)) 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, _meta).LoadStrings(HotfixDatabaseStatements(_hotfixStatement + 1), locale, _indexTableSize, _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 T> +class DB2SparseStorage : public DB2StorageBase +{ + static_assert(std::is_pod<T>::value, "T in DB2SparseStorage must be POD-type."); + +public: + typedef struct iterator_wrapper : public std::unordered_map<uint32, T const*>::const_iterator + { + typedef typename std::unordered_map<uint32, T const*>::const_iterator Base; + + iterator_wrapper() = default; + iterator_wrapper(iterator_wrapper const& right) = default; + iterator_wrapper(Base const& baseItr) : Base(baseItr) { } + + T const* operator->() const { return Base::operator->()->second; } + T const* operator*() const { return Base::operator*().second; } + } iterator; + + DB2SparseStorage(char const* fileName, DB2Meta const* meta, HotfixDatabaseStatements preparedStmtIndex) + : DB2StorageBase(fileName, meta, 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<char const*>(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(), _meta)) + return false; + + _fieldCount = db2.GetCols(); + _tableHash = db2.GetTableHash(); + _layoutHash = db2.GetLayoutHash(); + + // load raw non-string data + _dataTable = db2.AutoProduceData(IndexTableAdapter<T>(_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(), _meta)) + return false; + + // load strings from another locale db2 data + if (_meta->GetStringFieldCount(true)) + if (char* stringBlock = db2.AutoProduceStrings(_dataTable, locale)) + _stringPool.push_back(stringBlock); + return true; + } + + void LoadFromDB() override + { + _dataTableEx = DB2SparseDatabaseLoader(_fileName, _meta).Load(_hotfixStatement, IndexTableAdapter<T>(_indexTable), _stringPool); + } + + void LoadStringsFromDB(uint32 locale) override + { + if (!_meta->GetStringFieldCount(true)) + return; + + DB2SparseDatabaseLoader(_fileName, _meta).LoadStrings(HotfixDatabaseStatements(_hotfixStatement + 1), locale, IndexTableAdapter<T>(_indexTable), _stringPool); + } + + iterator begin() const { return iterator(_indexTable.begin()); } + iterator end() const { return iterator(_indexTable.end()); } + +private: + std::unordered_map<uint32, T const*> _indexTable; }; #endif diff --git a/src/server/shared/DataStores/DBCFileLoader.cpp b/src/server/shared/DataStores/DBCFileLoader.cpp deleted file mode 100644 index 829c3708221..00000000000 --- a/src/server/shared/DataStores/DBCFileLoader.cpp +++ /dev/null @@ -1,325 +0,0 @@ -/* - * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#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) -{ - /* - 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; - - //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 <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef DBC_FILE_LOADER_H -#define DBC_FILE_LOADER_H - -#include "Define.h" -#include "Utilities/ByteConverter.h" -#include <cassert> - -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<float*>(offset + file.GetOffset(field)); - EndianConvert(val); - return val; - } - uint32 getUInt(size_t field) const - { - assert(field < file.fieldCount); - uint32 val = *reinterpret_cast<uint32*>(offset + file.GetOffset(field)); - EndianConvert(val); - return val; - } - uint8 getUInt8(size_t field) const - { - assert(field < file.fieldCount); - return *reinterpret_cast<uint8*>(offset + file.GetOffset(field)); - } - uint64 getUInt64(size_t field) const - { - assert(field < file.fieldCount); - uint64 val = *reinterpret_cast<uint64*>(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<char*>(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 <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef 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 T> -class DBCStorage -{ - typedef std::list<char*> StringPoolList; - - public: - typedef DBStorageIterator<T> 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<T*>(dbc.AutoProduceData(fmt, nCount, indexTable.asChar, - sqlRecordCount, sqlHighestIndex, sqlDataTable)); - - stringPoolList.push_back(dbc.AutoProduceStrings(fmt, reinterpret_cast<char*>(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<T*>(&sqlDataTable[offset]); - } - else - indexTable.asT[rowIndex]= reinterpret_cast<T*>(&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<float*>(&sqlDataTable[offset]) = 0.0f; - offset += 4; - break; - case FT_IND: - case FT_INT: - *reinterpret_cast<uint32*>(&sqlDataTable[offset]) = uint32(0); - offset += 4; - break; - case FT_BYTE: - *reinterpret_cast<uint8*>(&sqlDataTable[offset]) = uint8(0); - offset += 1; - break; - case FT_LONG: - *reinterpret_cast<uint64*>(&sqlDataTable[offset]) = uint64(0); - offset += 8; - break; - case FT_STRING: - // Beginning of the pool - empty string - *reinterpret_cast<char**>(&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<float*>(&sqlDataTable[offset]) = fields[sqlColumnNumber].GetFloat(); - offset += 4; - break; - case FT_IND: - case FT_INT: - *reinterpret_cast<uint32*>(&sqlDataTable[offset]) = fields[sqlColumnNumber].GetUInt32(); - offset += 4; - break; - case FT_BYTE: - *reinterpret_cast<uint8*>(&sqlDataTable[offset]) = fields[sqlColumnNumber].GetUInt8(); - offset += 1; - break; - case FT_LONG: - *reinterpret_cast<uint64*>(&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<char*>(dataTable))); - - return true; - } - - void Clear() - { - if (!indexTable.asT) - return; - - delete[] reinterpret_cast<char*>(indexTable.asT); - indexTable.asT = NULL; - delete[] reinterpret_cast<char*>(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 8148a2a5300..5568397b245 100644 --- a/src/server/shared/DataStores/DBStorageIterator.h +++ b/src/server/shared/DataStores/DBStorageIterator.h @@ -35,8 +35,8 @@ public: } } - T* operator->() { return _index[_pos]; } - T* operator*() { 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); } diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 20de1aac57f..49ddb92df24 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -788,10 +788,10 @@ CharactersPerAccount = 50 # # CharactersPerRealm # Description: Limit number of characters per account on this realm. -# Range: 1-11 -# Default: 11 - (Client limitation) +# Range: 1-12 +# Default: 12 - (Client limitation) -CharactersPerRealm = 11 +CharactersPerRealm = 12 # # HeroicCharactersPerRealm diff --git a/src/tools/connection_patcher/Patches/Mac.hpp b/src/tools/connection_patcher/Patches/Mac.hpp index 8a5c25955ea..86ee6f555f6 100644 --- a/src/tools/connection_patcher/Patches/Mac.hpp +++ b/src/tools/connection_patcher/Patches/Mac.hpp @@ -29,8 +29,8 @@ namespace Connection_Patcher { struct x64 { - static const std::vector<unsigned char> CertBundleCASCLocalFile() { return{ 0x48, 0x8D, 0x55, 0xC4, 0x31, 0xDB, 0xB1, 0x01 }; } - static const std::vector<unsigned char> CertBundleSignatureCheck() { return{ 0x45, 0x84, 0xED, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 }; } + static const std::vector<unsigned char> CertBundleCASCLocalFile() { return{ 0xBE, 0x01, 0x01, 0x00, 0x00, 0x41, 0xB1, 0x01 }; } + static const std::vector<unsigned char> CertBundleSignatureCheck() { return{ 0x90, 0xE9 }; } }; }; } diff --git a/src/tools/connection_patcher/Patches/Windows.hpp b/src/tools/connection_patcher/Patches/Windows.hpp index 5a12edb1588..a56a09b105d 100644 --- a/src/tools/connection_patcher/Patches/Windows.hpp +++ b/src/tools/connection_patcher/Patches/Windows.hpp @@ -35,7 +35,7 @@ namespace Connection_Patcher struct x64 { - static const std::vector<unsigned char> CertBundleCASCLocalFile() { return{ 0x41, 0xB1, 0x01 }; } + static const std::vector<unsigned char> CertBundleCASCLocalFile() { return{ 0xC6, 0x44, 0x24, 0x28, 0x01 }; } static const std::vector<unsigned char> CertBundleSignatureCheck() { return{ 0xEB }; } }; }; diff --git a/src/tools/connection_patcher/Patterns/Mac.hpp b/src/tools/connection_patcher/Patterns/Mac.hpp index 6c6f58cab32..748e79b0387 100644 --- a/src/tools/connection_patcher/Patterns/Mac.hpp +++ b/src/tools/connection_patcher/Patterns/Mac.hpp @@ -29,8 +29,8 @@ namespace Connection_Patcher { struct x64 { - static const std::vector<unsigned char> CertBundleCASCLocalFile() { return{ 0x48, 0x8D, 0x55, 0xC4, 0x31, 0xDB, 0x31, 0xC9 }; } - static const std::vector<unsigned char> CertBundleSignatureCheck() { return{ 0x45, 0x84, 0xED, 0x0F, 0x84, 0x00, 0x00, 0x00, 0x00, 0xE9 }; } + static const std::vector<unsigned char> CertBundleCASCLocalFile() { return{ 0xBE, 0x01, 0x01, 0x00, 0x00, 0x45, 0x31, 0xC9 }; } + static const std::vector<unsigned char> CertBundleSignatureCheck() { return{ 0x0F, 0x85, 0xCC, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x2E, 0x0F, 0x1F, 0x84 }; } }; }; } diff --git a/src/tools/connection_patcher/Patterns/Windows.hpp b/src/tools/connection_patcher/Patterns/Windows.hpp index 5b2de204a7b..3eb0c5e7b79 100644 --- a/src/tools/connection_patcher/Patterns/Windows.hpp +++ b/src/tools/connection_patcher/Patterns/Windows.hpp @@ -29,14 +29,14 @@ namespace Connection_Patcher { struct x86 { - static const std::vector<unsigned char> CertBundleCASCLocalFile() { return{ 0x6A, 0x00, 0x8D, 0x45, 0xFC, 0x50, 0x8D, 0x45, 0xF8, 0x50, 0x68 }; } - static const std::vector<unsigned char> CertBundleSignatureCheck() { return{ 0x59, 0x59, 0x84, 0xC0, 0x75, 0x08, 0x47, 0x83, 0xFF, 0x02 }; } + static const std::vector<unsigned char> CertBundleCASCLocalFile() { return{ 0x6A, 0x00, 0x50, 0x8D, 0x45, 0xF8, 0x50, 0x68 }; } + static const std::vector<unsigned char> CertBundleSignatureCheck() { return{ 0x59, 0x59, 0x84, 0xC0, 0x75, 0x08, 0x46, 0x83, 0xFE, 0x02 }; } }; struct x64 { - static const std::vector<unsigned char> CertBundleCASCLocalFile() { return{ 0x45, 0x33, 0xC9, 0x48, 0x89, 0x45, 0x90 }; } - static const std::vector<unsigned char> CertBundleSignatureCheck() { return{ 0x75, 0x19, 0x48, 0xFF, 0xC3, 0x48, 0x83, 0xFB, 0x02 }; } + static const std::vector<unsigned char> CertBundleCASCLocalFile() { return{ 0x44, 0x89, 0x74, 0x24, 0x28, 0xC7, 0x44, 0x24, 0x70 }; } + static const std::vector<unsigned char> CertBundleSignatureCheck() { return{ 0x75, 0x0B, 0x48, 0xFF, 0xC7, 0x48, 0x83, 0xFF, 0x02 }; } }; }; } |