diff options
214 files changed, 24336 insertions, 11792 deletions
diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index 2d5104196b6..1467f83d6a8 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', @@ -2579,6 +2581,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/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/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/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/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 67aa54c5679..14e7ac54bab 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -22,7 +22,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() if (!m_reconnecting) m_stmts.resize(MAX_CHARACTERDATABASE_STATEMENTS); -#define SelectItemInstanceContent "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, ii.transmogrification, ii.upgradeId, ii.enchantIllusion, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.bonusListIDs" +#define SelectItemInstanceContent "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, ii.transmogrification, ii.upgradeId, ii.enchantIllusion, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.bonusListIDs, ig.gemItemId1, ig.gemItemId2, ig.gemItemId3" PrepareStatement(CHAR_DEL_QUEST_POOL_SAVE, "DELETE FROM pool_quest_save WHERE pool_id = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_QUEST_POOL_SAVE, "INSERT INTO pool_quest_save (pool_id, quest_id) VALUES (?, ?)", CONNECTION_ASYNC); @@ -44,20 +44,20 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_MAIL_LIST_INFO, "SELECT id, sender, (SELECT name FROM characters WHERE guid = sender) AS sendername, receiver, (SELECT name FROM characters WHERE guid = receiver) AS receivername, " "subject, deliver_time, expire_time, money, has_items FROM mail WHERE receiver = ? ", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_MAIL_LIST_ITEMS, "SELECT itemEntry,count FROM item_instance WHERE guid = ?", CONNECTION_SYNCH); - PrepareStatement(CHAR_SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + PrepareStatement(CHAR_SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time " "FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid " "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.level, c.zone, c.map, " + PrepareStatement(CHAR_SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, " "c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " "cb.guid, c.slot, c.logout_time, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_UNDELETE_ENUM, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + PrepareStatement(CHAR_SEL_UNDELETE_ENUM, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time " "FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid " "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.level, c.zone, c.map, " + PrepareStatement(CHAR_SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, " "c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " "cb.guid, c.slot, c.logout_time, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " @@ -75,11 +75,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 +108,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_RESET_CHARACTER_QUESTSTATUS_SEASONAL_BY_EVENT, "DELETE FROM character_queststatus_seasonal WHERE event = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_REPUTATION, "SELECT faction, standing, flags FROM character_reputation WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_INVENTORY, "SELECT " SelectItemInstanceContent ", bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHARACTER_INVENTORY, "SELECT " SelectItemInstanceContent ", bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid WHERE ci.guid = ? ORDER BY bag, slot", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_ACTIONS, "SELECT a.button, a.action, a.type FROM character_action as a, characters as c WHERE a.guid = c.guid AND a.spec = c.activeTalentGroup AND a.guid = ? ORDER BY button", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_MAILCOUNT, "SELECT COUNT(id) FROM mail WHERE receiver = ? AND (checked & 1) = 0 AND deliver_time <= ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_MAILDATE, "SELECT MIN(deliver_time) FROM mail WHERE receiver = ? AND (checked & 1) = 0", CONNECTION_ASYNC); @@ -127,7 +127,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_CHARACTER_EQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, ignore_mask, item0, item1, item2, item3, item4, item5, item6, item7, item8, " "item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = ? ORDER BY setindex", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_BGDATA, "SELECT instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell FROM character_battleground_data WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_GLYPHS, "SELECT talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6 FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_TALENTS, "SELECT spell, talentGroup FROM character_talent WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_SKILLS, "SELECT skill, value, max FROM character_skills WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_RANDOMBG, "SELECT guid FROM character_battleground_random WHERE guid = ?", CONNECTION_ASYNC); @@ -136,8 +135,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_ACCOUNT_INSTANCELOCKTIMES, "SELECT instanceId, releaseTime FROM account_instance_times WHERE accountId = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_ACTIONS_SPEC, "SELECT button, action, type FROM character_action WHERE guid = ? AND spec = ? ORDER BY button", CONNECTION_SYNCH); - PrepareStatement(CHAR_SEL_MAILITEMS, "SELECT " SelectItemInstanceContent ", ii.owner_guid FROM mail_items mi JOIN item_instance ii ON mi.item_guid = ii.guid WHERE mail_id = ?", CONNECTION_SYNCH); - PrepareStatement(CHAR_SEL_AUCTION_ITEMS, "SELECT " SelectItemInstanceContent " FROM auctionhouse ah JOIN item_instance ii ON ah.itemguid = ii.guid", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_MAILITEMS, "SELECT " SelectItemInstanceContent ", ii.owner_guid FROM mail_items mi JOIN item_instance ii ON mi.item_guid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid WHERE mail_id = ?", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_AUCTION_ITEMS, "SELECT " SelectItemInstanceContent " FROM auctionhouse ah JOIN item_instance ii ON ah.itemguid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_AUCTIONS, "SELECT id, auctioneerguid, itemguid, itemEntry, count, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid", CONNECTION_SYNCH); PrepareStatement(CHAR_INS_AUCTION, "INSERT INTO auctionhouse (id, auctioneerguid, itemguid, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_AUCTION, "DELETE FROM auctionhouse WHERE id = ?", CONNECTION_ASYNC); @@ -164,6 +163,9 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER, "DELETE FROM item_instance WHERE owner_guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_ITEM_INSTANCE_GEMS, "INSERT INTO item_instance_gems (itemGuid, gemItemId1, gemItemId2, gemItemId3) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_ITEM_INSTANCE_GEMS, "DELETE FROM item_instance_gems WHERE itemGuid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_ITEM_INSTANCE_GEMS_BY_OWNER, "DELETE iig FROM item_instance_gems iig LEFT JOIN item_instance ii ON iig.itemGuid = ii.guid WHERE ii.owner_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_GIFT_OWNER, "UPDATE character_gifts SET guid = ? WHERE item_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GIFT, "DELETE FROM character_gifts WHERE item_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_GIFT_BY_ITEM, "SELECT entry, flags FROM character_gifts WHERE item_guid = ?", CONNECTION_SYNCH); @@ -195,7 +197,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() // 0: uint32, 1: uint8, 2: uint8, 3: uint32, 4: uint32 PrepareStatement(CHAR_INS_GUILD_BANK_ITEM, "INSERT INTO guild_bank_item (guildid, TabId, SlotId, item_guid) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GUILD_BANK_ITEM, "DELETE FROM guild_bank_item WHERE guildid = ? AND TabId = ? AND SlotId = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8, 2: uint8 - PrepareStatement(CHAR_SEL_GUILD_BANK_ITEMS, "SELECT " SelectItemInstanceContent ", guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_GUILD_BANK_ITEMS, "SELECT " SelectItemInstanceContent ", guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid", CONNECTION_SYNCH); PrepareStatement(CHAR_DEL_GUILD_BANK_ITEMS, "DELETE FROM guild_bank_item WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32 // 0: uint32, 1: uint8, 2: uint8, 3: uint8, 4: uint32 PrepareStatement(CHAR_INS_GUILD_BANK_RIGHT, "INSERT INTO guild_bank_right (guildid, TabId, rid, gbright, SlotPerDay) VALUES (?, ?, ?, ?, ?) " @@ -386,20 +388,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 +431,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA, "DELETE FROM character_achievement_progress WHERE criteria = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA_GUILD, "DELETE FROM guild_achievement_progress WHERE criteria = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_INVALID_ACHIEVMENT, "DELETE FROM character_achievement WHERE achievement = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_ADDON, "INSERT INTO addons (name, crc) VALUES (?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_INVALID_PET_SPELL, "DELETE FROM pet_spell WHERE spell = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GROUP_INSTANCE_BY_INSTANCE, "DELETE FROM group_instance WHERE instance = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GROUP_INSTANCE_BY_GUID, "DELETE FROM group_instance WHERE guid = ? AND instance = ?", CONNECTION_ASYNC); @@ -443,7 +444,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 +467,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_CHAR_GUID_NAME_BY_ACC, "SELECT guid, name FROM characters WHERE account = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_POOL_QUEST_SAVE, "SELECT quest_id FROM pool_quest_save WHERE pool_id = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_CUSTOMIZE_INFO, "SELECT name, race, class, gender, at_login FROM characters WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHAR_RACE_OR_FACTION_CHANGE_INFOS, "SELECT at_login, knownTitles, skin, face, hairStyle, hairColor, facialStyle FROM characters WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHAR_RACE_OR_FACTION_CHANGE_INFOS, "SELECT at_login, knownTitles FROM characters WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_INSTANCE, "SELECT data, completedEncounters FROM instance WHERE map = ? AND id = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_PERM_BIND_BY_INSTANCE, "SELECT guid FROM character_instance WHERE instance = ? and permanent = 1", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_COD_ITEM_MAIL, "SELECT id, messageType, mailTemplateId, sender, subject, body, money, has_items FROM mail WHERE receiver = ? AND has_items <> 0 AND cod <> 0", CONNECTION_SYNCH); @@ -551,7 +552,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_CHAR_EQUIPMENTSETS, "DELETE FROM character_equipmentsets WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER, "DELETE FROM guild_eventlog WHERE PlayerGuid1 = ? OR PlayerGuid2 = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER, "DELETE FROM guild_bank_eventlog WHERE PlayerGuid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_CHAR_GLYPHS, "DELETE FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_TALENT, "DELETE FROM character_talent WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_SKILLS, "DELETE FROM character_skills WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHAR_MONEY, "UPDATE characters SET money = ? WHERE guid = ?", CONNECTION_ASYNC); @@ -575,12 +575,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..ea6d9bd186f 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -110,7 +110,6 @@ enum CharacterDatabaseStatements CHAR_SEL_CHARACTER_CRITERIAPROGRESS, CHAR_SEL_CHARACTER_EQUIPMENTSETS, CHAR_SEL_CHARACTER_BGDATA, - CHAR_SEL_CHARACTER_GLYPHS, CHAR_SEL_CHARACTER_TALENTS, CHAR_SEL_CHARACTER_SKILLS, CHAR_SEL_CHARACTER_RANDOMBG, @@ -144,6 +143,9 @@ enum CharacterDatabaseStatements CHAR_UPD_ITEM_INSTANCE_ON_LOAD, CHAR_DEL_ITEM_INSTANCE, CHAR_DEL_ITEM_INSTANCE_BY_OWNER, + CHAR_INS_ITEM_INSTANCE_GEMS, + CHAR_DEL_ITEM_INSTANCE_GEMS, + CHAR_DEL_ITEM_INSTANCE_GEMS_BY_OWNER, CHAR_UPD_GIFT_OWNER, CHAR_DEL_GIFT, CHAR_SEL_CHARACTER_GIFT_BY_ITEM, @@ -346,7 +348,6 @@ enum CharacterDatabaseStatements CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA, CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA_GUILD, CHAR_DEL_INVALID_ACHIEVMENT, - CHAR_INS_ADDON, CHAR_DEL_INVALID_PET_SPELL, CHAR_DEL_GROUP_INSTANCE_BY_INSTANCE, CHAR_DEL_GROUP_INSTANCE_BY_GUID, @@ -467,7 +468,6 @@ enum CharacterDatabaseStatements CHAR_DEL_CHAR_EQUIPMENTSETS, CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER, CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER, - CHAR_DEL_CHAR_GLYPHS, CHAR_DEL_CHAR_TALENT, CHAR_DEL_CHAR_SKILLS, CHAR_UPD_CHAR_MONEY, @@ -494,7 +494,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 6749300000b..cf5ab499a6a 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -15,8 +15,8 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ - // DO NOT EDIT! - // Autogenerated from DB2Structure.h +// DO NOT EDIT! +// Autogenerated from DB2Structure.h #include "HotfixDatabase.h" @@ -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, ConditionID, MaskID, Flags FROM char_titles ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CHAR_TITLES, "SELECT ID, NameMale_lang, NameFemale_lang FROM char_titles_locale WHERE locale = ?", CONNECTION_SYNCH); + + // ChatChannels.db2 + PrepareStatement(HOTFIX_SEL_CHAT_CHANNELS, "SELECT ID, Flags, Name, Shortcut, FactionGroup FROM chat_channels ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CHAT_CHANNELS, "SELECT ID, Name_lang, Shortcut_lang FROM chat_channels_locale WHERE locale = ?", CONNECTION_SYNCH); + + // 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, CategoryEnumID FROM creature_family ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_FAMILY, "SELECT ID, Name_lang FROM creature_family_locale WHERE locale = ?", CONNECTION_SYNCH); + + // CreatureModelData.db2 + PrepareStatement(HOTFIX_SEL_CREATURE_MODEL_DATA, "SELECT ID, 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,119 +348,199 @@ 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); // 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); + // 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); - // 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); @@ -343,38 +556,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 @@ -383,116 +611,213 @@ void HotfixDatabaseConnection::DoPrepareStatements() // QuestXp.db2 PrepareStatement(HOTFIX_SEL_QUEST_XP, "SELECT ID, Exp1, Exp2, Exp3, Exp4, Exp5, Exp6, Exp7, Exp8, Exp9, Exp10 FROM quest_xp ORDER BY ID DESC", CONNECTION_SYNCH); + // RandPropPoints.db2 + PrepareStatement(HOTFIX_SEL_RAND_PROP_POINTS, "SELECT ID, EpicPropertiesPoints1, EpicPropertiesPoints2, EpicPropertiesPoints3, " + "EpicPropertiesPoints4, EpicPropertiesPoints5, RarePropertiesPoints1, RarePropertiesPoints2, RarePropertiesPoints3, RarePropertiesPoints4, " + "RarePropertiesPoints5, UncommonPropertiesPoints1, UncommonPropertiesPoints2, UncommonPropertiesPoints3, UncommonPropertiesPoints4, " + "UncommonPropertiesPoints5 FROM rand_prop_points ORDER BY ID DESC", CONNECTION_SYNCH); + // ScalingStatDistribution.db2 - PrepareStatement(HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, "SELECT ID, MinLevel, MaxLevel, ItemLevelCurveID FROM scaling_stat_distribution" + PrepareStatement(HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, "SELECT ID, ItemLevelCurveID, MinLevel, MaxLevel FROM scaling_stat_distribution" " ORDER BY ID DESC", CONNECTION_SYNCH); - // 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, AquireMethod, NumSkillUps, ClassMask" + " FROM skill_line_ability ORDER BY ID DESC", CONNECTION_SYNCH); + + // SkillRaceClassInfo.db2 + PrepareStatement(HOTFIX_SEL_SKILL_RACE_CLASS_INFO, "SELECT ID, RaceMask, 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 @@ -503,15 +828,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 999c9316dad..5c3b0ddb196 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -15,8 +15,8 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ - // DO NOT EDIT! - // Autogenerated from DB2Structure.h +// DO NOT EDIT! +// Autogenerated from DB2Structure.h #ifndef _HOTFIXDATABASE_H #define _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, @@ -144,12 +220,20 @@ enum HotfixDatabaseStatements HOTFIX_SEL_ITEM_CURRENCY_COST, + HOTFIX_SEL_ITEM_DAMAGE_AMMO, + + HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND, + + HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER, + + HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND, + + HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER, + HOTFIX_SEL_ITEM_DISENCHANT_LOOT, HOTFIX_SEL_ITEM_EFFECT, - HOTFIX_SEL_ITEM, - HOTFIX_SEL_ITEM_EXTENDED_COST, HOTFIX_SEL_ITEM_LIMIT_CATEGORY, @@ -165,6 +249,11 @@ enum HotfixDatabaseStatements HOTFIX_SEL_ITEM_RANDOM_SUFFIX, HOTFIX_SEL_ITEM_RANDOM_SUFFIX_LOCALE, + HOTFIX_SEL_ITEM_SET, + HOTFIX_SEL_ITEM_SET_LOCALE, + + HOTFIX_SEL_ITEM_SET_SPELL, + HOTFIX_SEL_ITEM_SPARSE, HOTFIX_SEL_ITEM_SPARSE_LOCALE, @@ -172,15 +261,29 @@ enum HotfixDatabaseStatements HOTFIX_SEL_ITEM_SPEC_OVERRIDE, - HOTFIX_SEL_ITEM_TO_BATTLE_PET_SPECIES, - HOTFIX_SEL_ITEM_X_BONUS_TREE, HOTFIX_SEL_KEY_CHAIN, + HOTFIX_SEL_LFG_DUNGEONS, + HOTFIX_SEL_LFG_DUNGEONS_LOCALE, + + HOTFIX_SEL_LIGHT, + + HOTFIX_SEL_LIQUID_TYPE, + HOTFIX_SEL_LIQUID_TYPE_LOCALE, + + HOTFIX_SEL_LOCK, + HOTFIX_SEL_MAIL_TEMPLATE, 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, @@ -190,6 +293,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY, + HOTFIX_SEL_MOVIE, + HOTFIX_SEL_NAME_GEN, HOTFIX_SEL_NAME_GEN_LOCALE, @@ -201,11 +306,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, @@ -217,28 +330,65 @@ enum HotfixDatabaseStatements HOTFIX_SEL_QUEST_XP, + HOTFIX_SEL_RAND_PROP_POINTS, + HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, - HOTFIX_SEL_SOUND_ENTRIES, - HOTFIX_SEL_SOUND_ENTRIES_LOCALE, + HOTFIX_SEL_SKILL_LINE, + HOTFIX_SEL_SKILL_LINE_LOCALE, + + HOTFIX_SEL_SKILL_LINE_ABILITY, + + HOTFIX_SEL_SKILL_RACE_CLASS_INFO, + + HOTFIX_SEL_SOUND_KIT, + HOTFIX_SEL_SOUND_KIT_LOCALE, HOTFIX_SEL_SPECIALIZATION_SPELLS, HOTFIX_SEL_SPECIALIZATION_SPELLS_LOCALE, + HOTFIX_SEL_SPELL, + HOTFIX_SEL_SPELL_LOCALE, + + HOTFIX_SEL_SPELL_AURA_OPTIONS, + HOTFIX_SEL_SPELL_AURA_RESTRICTIONS, + HOTFIX_SEL_SPELL_CAST_TIMES, + HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS, - HOTFIX_SEL_SPELL_CAST_TIMES, + HOTFIX_SEL_SPELL_CATEGORIES, + + HOTFIX_SEL_SPELL_CATEGORY, + HOTFIX_SEL_SPELL_CATEGORY_LOCALE, HOTFIX_SEL_SPELL_CLASS_OPTIONS, + HOTFIX_SEL_SPELL_COOLDOWNS, + HOTFIX_SEL_SPELL_DURATION, + HOTFIX_SEL_SPELL_EFFECT, + + HOTFIX_SEL_SPELL_EFFECT_SCALING, + + HOTFIX_SEL_SPELL_EQUIPPED_ITEMS, + + HOTFIX_SEL_SPELL_FOCUS_OBJECT, + HOTFIX_SEL_SPELL_FOCUS_OBJECT_LOCALE, + + HOTFIX_SEL_SPELL_INTERRUPTS, + + HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, + 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, @@ -256,12 +406,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, @@ -282,8 +444,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/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 642c21e3ff1..9c95eca9db1 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -522,6 +522,11 @@ void PlayerAchievementMgr::CompletedAchievement(AchievementEntry const* achievem } } +bool PlayerAchievementMgr::ModifierTreeSatisfied(uint32 modifierTreeId) const +{ + return AdditionalRequirementsSatisfied(sCriteriaMgr->GetModifierTree(modifierTreeId), 0, 0, nullptr, _owner); +} + void PlayerAchievementMgr::SendCriteriaUpdate(Criteria const* criteria, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted) const { WorldPackets::Achievement::CriteriaUpdate criteriaUpdate; diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index 33ba9021b5f..ef0ee5e87e6 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -91,6 +91,8 @@ public: void CompletedAchievement(AchievementEntry const* entry, Player* referencePlayer) override; + bool ModifierTreeSatisfied(uint32 modifierTreeId) const; + protected: void SendCriteriaUpdate(Criteria const* entry, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted) const override; void SendCriteriaProgressRemoved(uint32 criteriaId) override; diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index e8e418001ad..e9ec1299f96 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -18,7 +18,6 @@ #include "CriteriaHandler.h" #include "ArenaTeamMgr.h" #include "Battleground.h" -#include "DBCStores.h" #include "DB2Stores.h" #include "DisableMgr.h" #include "GameEventMgr.h" @@ -780,7 +779,7 @@ void CriteriaHandler::StartCriteriaTimer(CriteriaTimedTypes type, uint32 entry, if (_timeCriteriaTrees.find(tree->ID) == _timeCriteriaTrees.end() && !IsCompletedCriteriaTree(tree)) { // Start the timer - if (criteria->Entry->StartTimer * IN_MILLISECONDS > timeLost) + if (criteria->Entry->StartTimer * uint32(IN_MILLISECONDS) > timeLost) { _timeCriteriaTrees[tree->ID] = criteria->Entry->StartTimer * IN_MILLISECONDS - timeLost; canStart = true; @@ -2216,3 +2215,12 @@ Criteria const* CriteriaMgr::GetCriteria(uint32 criteriaId) const return itr->second; } + +ModifierTreeNode const* CriteriaMgr::GetModifierTree(uint32 modifierTreeId) const +{ + auto itr = _criteriaModifiers.find(modifierTreeId); + if (itr != _criteriaModifiers.end()) + return itr->second; + + return nullptr; +} diff --git a/src/server/game/Achievements/CriteriaHandler.h b/src/server/game/Achievements/CriteriaHandler.h index 03a4f30136e..4d269a894bd 100644 --- a/src/server/game/Achievements/CriteriaHandler.h +++ b/src/server/game/Achievements/CriteriaHandler.h @@ -370,6 +370,7 @@ public: void LoadCriteriaData(); CriteriaTree const* GetCriteriaTree(uint32 criteriaTreeId) const; Criteria const* GetCriteria(uint32 criteriaId) const; + ModifierTreeNode const* GetModifierTree(uint32 modifierTreeId) const; private: CriteriaDataMap _criteriaDataMap; diff --git a/src/server/game/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..3b3be37b0b3 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); } @@ -904,7 +906,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..233459de97b 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.h +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h @@ -21,7 +21,6 @@ #include "Common.h" #include "DatabaseEnv.h" -#include "DBCStructure.h" #include "ObjectGuid.h" #include "AuctionHousePackets.h" #include <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; @@ -188,7 +188,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..d5d5816f4c1 100644 --- a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp +++ b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp @@ -16,7 +16,6 @@ */ #include "Log.h" -#include "DBCStores.h" #include "ObjectMgr.h" #include "AuctionHouseMgr.h" #include "AuctionHouseBotSeller.h" @@ -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 e96286692d2..449e614a900 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..21dadfc3793 --- /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 = "sshhbbbi"; + static uint8 const arraySizes[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(7, 8, 0x144B4DF1, 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 = "sshhb"; + static uint8 const arraySizes[5] = { 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 5, 0x597835B2, 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 = "ffsShhbbbb"; + static uint8 const arraySizes[10] = { 1, 1, 1, 1, 2, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 10, 0xD3A903B4, 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 = "sshh"; + static uint8 const arraySizes[4] = { 1, 1, 5, 5 }; + static DB2Meta instance(-1, 4, 0x451B7E5A, 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 = "hhbb"; + static uint8 const arraySizes[4] = { 1, 1, 1, 1 }; + static DB2Meta instance(-1, 4, 0x2B6FCF8C, 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 = "hhhhhb"; + static uint8 const arraySizes[6] = { 1, 1, 1, 1, 1, 1 }; + static DB2Meta instance(-1, 6, 0xB4B42A70, 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 2fd9c22b080..ff6fb779650 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -18,120 +18,196 @@ #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<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<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<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<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<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<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; @@ -140,17 +216,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; @@ -173,10 +249,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); @@ -186,7 +262,7 @@ inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, D errlist.push_back(storage->GetFileName()); } - stores[storage->GetHash()] = storage; + stores[storage->GetTableHash()] = storage; } DB2Manager& DB2Manager::Instance() @@ -204,42 +280,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); @@ -248,52 +352,89 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sImportPriceShieldStore); LOAD_DB2(sImportPriceWeaponStore); LOAD_DB2(sItemAppearanceStore); + LOAD_DB2(sItemArmorQualityStore); + LOAD_DB2(sItemArmorShieldStore); + LOAD_DB2(sItemArmorTotalStore); + LOAD_DB2(sItemBagFamilyStore); LOAD_DB2(sItemBonusStore); LOAD_DB2(sItemBonusTreeNodeStore); LOAD_DB2(sItemClassStore); LOAD_DB2(sItemCurrencyCostStore); + LOAD_DB2(sItemDamageAmmoStore); + LOAD_DB2(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(sItemSetStore); + LOAD_DB2(sItemSetSpellStore); LOAD_DB2(sItemSparseStore); - LOAD_DB2(sItemSpecOverrideStore); LOAD_DB2(sItemSpecStore); - LOAD_DB2(sItemStore); - LOAD_DB2(sItemToBattlePetSpeciesStore); + LOAD_DB2(sItemSpecOverrideStore); LOAD_DB2(sItemXBonusTreeStore); LOAD_DB2(sKeyChainStore); + LOAD_DB2(sLfgDungeonsStore); + LOAD_DB2(sLightStore); + LOAD_DB2(sLiquidTypeStore); + LOAD_DB2(sLockStore); LOAD_DB2(sMailTemplateStore); + LOAD_DB2(sMapStore); + LOAD_DB2(sMapDifficultyStore); LOAD_DB2(sModifierTreeStore); LOAD_DB2(sMountCapabilityStore); LOAD_DB2(sMountStore); 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(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); @@ -302,45 +443,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 (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; + } + } - for (ChrClassesXPowerTypesEntry const* power : sChrClassesXPowerTypesStore) + 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); - _powersByClass[power->ClassID][power->PowerType] = index; + uint32 storageIndex = chrSpec->ClassID; + if (chrSpec->Flags & CHR_SPECIALIZATION_FLAG_PET_OVERRIDE_SPEC) + { + ASSERT(!chrSpec->ClassID); + storageIndex = PET_SPEC_OVERRIDE_CLASS_INDEX; + } + + _chrSpecializationsByIndex[storageIndex][chrSpec->OrderIndex] = chrSpec; + } + + ASSERT(MAX_DIFFICULTY >= sDifficultyStore.GetNumRows(), + "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 (GlyphSlotEntry const* glyphSlot : sGlyphSlotStore) - if (glyphSlot->Type == GLYPH_SLOT_MAJOR || glyphSlot->Type == GLYPH_SLOT_MINOR) - _glyphSlots.insert(glyphSlot); + for (HeirloomEntry const* heirloom : sHeirloomStore) + _heirlooms[heirloom->ItemID] = heirloom; for (ItemBonusEntry const* bonus : sItemBonusStore) _itemBonusLists[bonus->BonusListID].push_back(bonus); @@ -355,12 +594,18 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) } } + for (ItemCurrencyCostEntry const* itemCurrencyCost : sItemCurrencyCostStore) + _itemsWithCurrencyCost.insert(itemCurrencyCost->ItemId); + for (ItemModifiedAppearanceEntry const* appearanceMod : sItemModifiedAppearanceStore) if (ItemAppearanceEntry const* appearance = sItemAppearanceStore.LookupEntry(appearanceMod->AppearanceID)) _itemDisplayIDs[appearanceMod->ItemID | (appearanceMod->AppearanceModID << 24)] = appearance->DisplayID; - for (ItemSpecOverrideEntry const* entry : sItemSpecOverrideStore) - _itemSpecOverrides[entry->ItemID].push_back(entry); + for (ItemSetSpellEntry const* itemSetSpell : sItemSetSpellStore) + _itemSetSpells[itemSetSpell->ItemSetID].push_back(itemSetSpell); + + for (ItemSpecOverrideEntry const* itemSpecOverride : sItemSpecOverrideStore) + _itemSpecOverrides[itemSpecOverride->ItemID].push_back(itemSpecOverride); for (ItemXBonusTreeEntry const* itemBonusTreeAssignment : sItemXBonusTreeStore) _itemToBonusTree.insert({ itemBonusTreeAssignment->ItemID, itemBonusTreeAssignment->BonusTreeID }); @@ -375,14 +620,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) { @@ -419,11 +668,20 @@ 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 (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); @@ -450,6 +708,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); @@ -459,8 +726,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 @@ -516,8 +783,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) @@ -528,7 +798,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()); @@ -536,8 +806,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); @@ -630,6 +905,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)); @@ -639,11 +924,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 @@ -719,6 +1067,15 @@ uint32 DB2Manager::GetItemDisplayId(uint32 itemId, uint32 appearanceModId) const return 0; } +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 { auto itr = _itemSpecOverrides.find(itemId); @@ -728,21 +1085,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 @@ -768,6 +1206,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]) @@ -782,6 +1237,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); @@ -809,6 +1298,22 @@ std::set<uint32> DB2Manager::GetPhasesForGroup(uint32 group) const return std::set<uint32>(); } +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); @@ -869,11 +1374,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) @@ -881,16 +1503,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 b42d1dd8bab..78bebed07d0 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,16 +76,27 @@ 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; @@ -72,42 +105,91 @@ TC_GAME_API extern DB2Storage<ItemLimitCategoryEntry> sItemLimitCa 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<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<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 235 +typedef std::array<uint8, TaxiMaskSize> TaxiMask; TC_GAME_API extern TaxiMask sTaxiNodesMask; TC_GAME_API extern TaxiMask sOldContinentsNodesMask; @@ -136,13 +218,15 @@ 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; @@ -150,7 +234,9 @@ public: typedef std::unordered_multimap<uint32 /*itemId*/, uint32 /*bonusTreeId*/> ItemToBonusTreeContainer; typedef std::unordered_map<uint32 /*itemId | appearanceMod << 24*/, uint32> ItemDisplayIdContainer; 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; @@ -158,11 +244,16 @@ public: typedef std::array<std::vector<boost::regex>, TOTAL_LOCALES + 1> NameValidationRegexContainer; typedef std::unordered_map<uint32, std::set<uint32>> PhaseGroupContainer; typedef std::unordered_map<uint32, std::vector<QuestPackageItemEntry const*>> QuestPackageItemContainer; + 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(); @@ -175,15 +266,30 @@ 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; + bool HasItemCurrencyCost(uint32 itemId) const { return _itemsWithCurrencyCost.count(itemId) > 0; } uint32 GetItemDisplayId(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; @@ -192,37 +298,57 @@ public: std::vector<QuestPackageItemEntry const*> const* GetQuestPackageItems(uint32 questPackageID) const; uint32 GetQuestUniqueBitFlag(uint32 questId); std::set<uint32> GetPhasesForGroup(uint32 group) const; + static PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level); + static PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id); + SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_); std::vector<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; + std::unordered_set<uint32> _itemsWithCurrencyCost; ItemDisplayIdContainer _itemDisplayIDs; ItemToBonusTreeContainer _itemToBonusTree; + ItemSetSpellContainer _itemSetSpells; ItemSpecOverridesContainer _itemSpecOverrides; + MapDifficultyContainer _mapDifficulties; MountContainer _mountsBySpellId; MountCapabilitiesByTypeContainer _mountCapabilitiesByType; NameGenContainer _nameGenData; NameValidationRegexContainer _nameValidators; PhaseGroupContainer _phasesByGroup; QuestPackageItemContainer _questPackages; + 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 daebcf7375f..e5359fb4907 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,263 @@ 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 ConditionID; + 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; + uint8 CategoryEnumID; +}; + +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 +590,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 GlyphSlotEntry +struct GuildColorBorderEntry { - uint32 ID; // 0 - uint32 Type; // 1 - uint32 Tooltip; // 2 + uint32 ID; + uint8 Red; + uint8 Green; + uint8 Blue; +}; + +struct GuildColorEmblemEntry +{ + 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 +1076,186 @@ 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 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; // 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; + uint16 MinItemLevel; + uint16 MaxItemLevel; + uint16 RequiredDisenchantSkill; + uint8 ItemClass; + int8 ItemSubClass; + uint8 ItemQuality; +}; + +struct ItemEffectEntry +{ + 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 +1263,82 @@ 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; + LocalizedString* InternalName; + uint16 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; + uint16 AllocationPct[MAX_ITEM_RANDOM_PROPERTIES]; +}; + +#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,681 +1347,1335 @@ 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 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; // 1, 1, 1 + 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 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 AquireMethod; + 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 SpellCategoriesEntry +{ + uint32 ID; + uint32 SpellID; + uint16 Category; + uint16 StartRecoveryCategory; + uint16 ChargeCategory; + uint8 DifficultyID; + uint8 DefenseType; + uint8 DispelType; + uint8 Mechanic; + uint8 PreventionType; }; -struct SpellCastTimesEntry +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 SpellScalingEntry +{ + 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; }; -struct SpellRuneCostEntry +#define MAX_SHAPESHIFT_SPELLS 8 + +struct SpellShapeshiftFormEntry { - uint32 ID; // 0 - uint32 RuneCost[4]; // 1-4 (0=blood, 1=unholy, 2=frost, 3=death) - uint32 RunicPower; // 5 + 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 2a64a2d4eb5..00000000000 --- a/src/server/game/DataStores/DB2fmt.h +++ /dev/null @@ -1,130 +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 ItemXBonusTreeFormat[] = "nii"; -char const KeyChainFormat[] = "nbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; -char const MailTemplateFormat[] = "ns"; -char const ModifierTreeFormat[] = "niiiiii"; -char const MountCapabilityFormat[] = "niiiiiii"; -char const MountFormat[] = "niiiisssii"; -char const MountTypeXCapabilityFormat[] = "niii"; -char const NameGenFormat[] = "nsii"; -char const NamesProfanityFormat[] = "nSi"; -char const NamesReservedFormat[] = "nS"; -char const NamesReservedLocaleFormat[] = "nSi"; -char const OverrideSpellDataFormat[] = "niiiiiiiiiiii"; -char const PhaseXPhaseGroupFormat[] = "nii"; -char const PlayerConditionFormat[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiii"; -char const QuestMoneyRewardFormat[] = "niiiiiiiiii"; -char const QuestPackageItemfmt[] = "niiii"; -char const QuestSortFormat[] = "ns"; -char const QuestV2Format[] = "ni"; -char const QuestXPFormat[] = "niiiiiiiiii"; -char const ScalingStatDistributionFormat[] = "niii"; -char const SoundEntriesFormat[] = "nisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiififfiifffffii"; -char const SpecializationSpellsFormat[] = "niiiis"; -char const SpellAuraRestrictionsFormat[] = "niiiiiiii"; -char const SpellCastTimesFormat[] = "niii"; -char const SpellCastingRequirementsFormat[] = "niiiiii"; -char const SpellClassOptionsFormat[] = "niiiiii"; -char const SpellDurationFormat[] = "niii"; -char const SpellItemEnchantmentConditionFormat[] = "nbbbbbiiiiibbbbbbbbbbiiiiibbbbb"; -char const SpellLearnSpellFormat[] = "niii"; -char const SpellMiscFormat[] = "niiiiiiiiiiiiiiiiifiiif"; -char const SpellPowerDifficultyFormat[] = "nii"; -char const SpellPowerFormat[] = "niiiiiiiiiffif"; -char const SpellProcsPerMinuteFormat[] = "nfi"; -char const SpellProcsPerMinuteModFormat[] = "niifi"; -char const SpellRadiusFormat[] = "nffff"; -char const SpellRangeFormat[] = "nffffiss"; -char const SpellReagentsFormat[] = "niiiiiiiiiiiiiiii"; -char const SpellRuneCostFormat[] = "niiiii"; -char const SpellTotemsFormat[] = "niiii"; -char const SpellXSpellVisualFormat[] = "niiiifii"; -char const TaxiNodesFormat[] = "nifffsiiiiiff"; -char const TaxiPathFormat[] = "niii"; -char const TaxiPathNodeFormat[] = "niiifffiiii"; -char const TotemCategoryFormat[] = "nsii"; -char const ToyFormat[] = "niisi"; -char const TransportAnimationFormat[] = "niifffi"; -char const TransportRotationFormat[] = "niiffff"; -char const UnitPowerBarFormat[] = "niiiiffiiiiiiiiiiiiiissssff"; -char const WorldMapOverlayFormat[] = "niiiiisiiiiiiiii"; - -#endif diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 710e92ca712..50eeeaa7ad8 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -57,7 +57,7 @@ enum LevelLimit enum BattlegroundBracketId // bracketId for level ranges { BG_BRACKET_ID_FIRST = 0, - BG_BRACKET_ID_LAST = 10, + BG_BRACKET_ID_LAST = 11, // must be max value in PvPDificulty slot + 1 MAX_BATTLEGROUND_BRACKETS @@ -413,29 +413,59 @@ enum CriteriaTreeOperator 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 }; @@ -563,6 +593,11 @@ enum ItemLimitCategoryMode ITEM_LIMIT_CATEGORY_MODE_EQUIP = 1 // limit applied to amount equipped items (including used gems) }; +enum ItemSetFlags +{ + ITEM_SET_FLAG_LEGACY_INACTIVE = 0x01, +}; + enum ItemSpecStat { ITEM_SPEC_STAT_INTELLECT = 0, diff --git a/src/server/game/DataStores/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 5eed5ca0b6d..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 AquireMethod; // 9 - uint32 TrivialSkillLineRankHigh; // 10 - uint32 TrivialSkillLineRankLow; // 11 - uint32 NumSkillUps; // 12 - uint32 UniqueBit; // 13 - uint32 TradeSkillCategoryID; // 14 -}; - -struct SkillRaceClassInfoEntry -{ - //uint32 ID; // 0 - uint32 SkillID; // 1 - int32 RaceMask; // 2 - int32 ClassMask; // 3 - uint32 Flags; // 4 - uint32 Availability; // 5 - uint32 MinLevel; // 6 - uint32 SkillTierID; // 7 -}; - -// SpellEffect.dbc -struct SpellEffectEntry -{ - uint32 ID; // 0 - uint32 DifficultyID; // 1 - uint32 Effect; // 2 - float EffectAmplitude; // 3 - uint32 EffectAura; // 4 - uint32 EffectAuraPeriod; // 5 - uint32 EffectBasePoints; // 6 - float EffectBonusCoefficient; // 7 - float EffectChainAmplitude; // 8 - uint32 EffectChainTargets; // 9 - uint32 EffectDieSides; // 10 - uint32 EffectItemType; // 11 - uint32 EffectMechanic; // 12 - int32 EffectMiscValue; // 13 - int32 EffectMiscValueB; // 14 - float EffectPointsPerResource; // 15 - uint32 EffectRadiusIndex; // 16 - uint32 EffectRadiusMaxIndex; // 17 - float EffectRealPointsPerLevel; // 18 - flag128 EffectSpellClassMask; // 19-22 - uint32 EffectTriggerSpell; // 23 - float EffectPosFacing; // 24 - uint32 ImplicitTarget[2]; // 25-26 - uint32 SpellID; // 27 - uint32 EffectIndex; // 28 - uint32 EffectAttributes; // 29 - float BonusCoefficientFromAP; // 30 -}; - -#define MAX_SPELL_EFFECTS 32 -#define MAX_EFFECT_MASK 0xFFFFFFFF - -// SpellEffectScaling.dbc -struct SpellEffectScalingEntry -{ - uint32 ID; // 0 - float Coefficient; // 1 - float Variance; // 2 - float ResourceCoefficient; // 3 - uint32 SpellEffectID; // 4 -}; - -// SpellAuraOptions.dbc -struct SpellAuraOptionsEntry -{ - uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - uint32 CumulativeAura; // 3 - uint32 ProcChance; // 4 - uint32 ProcCharges; // 5 - uint32 ProcTypeMask; // 6 - uint32 ProcCategoryRecovery; // 7 - uint32 SpellProcsPerMinuteID; // 8 -}; - -// Spell.dbc -struct SpellEntry -{ - uint32 ID; // 0 - char* Name_lang; // 1 - //char* NameSubtext_lang; // 2 - //char* Description_lang; // 3 - //char* AuraDescription_lang; // 4 - uint32 RuneCostID; // 5 - uint32 SpellMissileID; // 6 - uint32 DescriptionVariablesID; // 7 - uint32 ScalingID; // 8 - uint32 AuraOptionsID; // 9 - uint32 AuraRestrictionsID; // 10 - uint32 CastingRequirementsID; // 11 - uint32 CategoriesID; // 12 - uint32 ClassOptionsID; // 13 - uint32 CooldownsID; // 14 - uint32 EquippedItemsID; // 15 - uint32 InterruptsID; // 16 - uint32 LevelsID; // 17 - uint32 ReagentsID; // 18 - uint32 ShapeshiftID; // 19 - uint32 TargetRestrictionsID; // 20 - uint32 TotemsID; // 21 - uint32 RequiredProjectID; // 22 - uint32 MiscID; // 23 -}; - -// SpellCategories.dbc -struct SpellCategoriesEntry -{ - //uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - uint32 Category; // 3 - uint32 DefenseType; // 4 - uint32 DispelType; // 5 - uint32 Mechanic; // 6 - uint32 PreventionType; // 7 - uint32 StartRecoveryCategory; // 8 - uint32 ChargeCategory; // 9 -}; - -struct SpellCategoryEntry -{ - uint32 ID; // 0 - uint32 Flags; // 1 - //uint8 UsesPerWeek; // 2 - //uint8 Padding[3]; // 2 - //char* Name_lang; // 3 - int32 MaxCharges; // 4 - int32 ChargeRecoveryTime; // 5 -}; - -struct SpellFocusObjectEntry -{ - uint32 ID; // 0 - //char* Name_lang; // 1 -}; - -// SpellEquippedItems.dbc -struct SpellEquippedItemsEntry -{ - //uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - int32 EquippedItemClass; // 3 m_equippedItemClass (value) - int32 EquippedItemInventoryTypeMask; // 4 m_equippedItemInvTypes (mask) - int32 EquippedItemSubClassMask; // 5 m_equippedItemSubclass (mask) -}; - -// SpellCooldowns.dbc -struct SpellCooldownsEntry -{ - //uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - uint32 CategoryRecoveryTime; // 3 - uint32 RecoveryTime; // 4 - uint32 StartRecoveryTime; // 5 -}; - -// SpellInterrupts.dbc -struct SpellInterruptsEntry -{ - //uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - uint32 AuraInterruptFlags[2]; // 3-4 - uint32 ChannelInterruptFlags[2]; // 5-6 - uint32 InterruptFlags; // 7 -}; - -// SpellLevels.dbc -struct SpellLevelsEntry -{ - //uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - uint32 BaseLevel; // 3 - uint32 MaxLevel; // 4 - uint32 SpellLevel; // 5 -}; - -#define MAX_SHAPESHIFT_SPELLS 8 - -struct SpellShapeshiftFormEntry -{ - uint32 ID; // 0 - //uint32 BonusActionBar; // 1 - //char* Name_lang; // 2 - uint32 Flags; // 3 - int32 CreatureType; // 4 <=0 humanoid, other normal creature types - //uint32 AttackIconID; // 5 unused, related to next field - uint32 CombatRoundTime; // 6 - uint32 CreatureDisplayID[4]; // 7-10 (0 - Alliance, 1 - Horde) - uint32 PresetSpellID[MAX_SHAPESHIFT_SPELLS]; // 11-18 spells which appear in the bar after shapeshifting - //uint32 MountTypeID; // 19 - //uint32 ExitSoundEntriesID; // 20 -}; - -// SpellShapeshift.dbc -struct SpellShapeshiftEntry -{ - uint32 ID; // 0 - uint32 ShapeshiftExclude[2]; // 1-2 - uint32 ShapeshiftMask[2]; // 3-4 - //uint32 StanceBarOrder; // 5 -}; - -// SpellTargetRestrictions.dbc -struct SpellTargetRestrictionsEntry -{ - uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - float ConeAngle; // 3 - float Width; // 4 - uint32 MaxAffectedTargets; // 5 - uint32 MaxTargetLevel; // 6 - uint32 TargetCreatureType; // 7 - uint32 Targets; // 8 -}; - -// SpellScaling.dbc -struct SpellScalingEntry -{ - uint32 ID; // 0 - int32 CastTimeMin; // 1 - int32 CastTimeMax; // 2 - uint32 CastTimeMaxLevel; // 3 - int32 ScalingClass; // 4 - float NerfFactor; // 5 - uint32 NerfMaxLevel; // 6 - uint32 MaxScalingLevel; // 7 - uint32 ScalesFromItemLevel; // 8 -}; - -#define MAX_ITEM_ENCHANTMENT_EFFECTS 3 - -struct SpellItemEnchantmentEntry -{ - 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..3197305b77f --- /dev/null +++ b/src/server/game/DataStores/GameTables.cpp @@ -0,0 +1,136 @@ +/* + * 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(), false); + if (values.size() == 0) + break; + + ASSERT(values.size() == columnDefs.size(), SZFMTD " == " SZFMTD, values.size(), columnDefs.size()); + + // as of 21796 blizz doesnt seem to care about id column and just puts in whatever there + ASSERT(strtol(values[0], nullptr, 10) == data.size(), + "Unexpected row identifier %u at row " SZFMTD " (expected " SZFMTD ")", + strtol(values[0], nullptr, 10), data.size(), data.size()); + + data.emplace_back(); + float* row = reinterpret_cast<float*>(&data.back()); + for (std::size_t col = 1; col < columnDefs.size(); ++col) + *row++ = strtof(values[col], nullptr); + } + + storage.SetData(std::move(data)); + return 1; +} + +void LoadGameTables(std::string const& dataPath) +{ + uint32 oldMSTime = getMSTime(); + + boost::filesystem::path gtPath(dataPath); + gtPath /= "gt"; + + std::vector<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..1d4e9126955 --- /dev/null +++ b/src/server/game/DataStores/GameTables.h @@ -0,0 +1,234 @@ +/* + * 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, uint32 class_) +{ + switch (class_) + { + case CLASS_WARRIOR: + return row->Warrior; + case CLASS_PALADIN: + return row->Paladin; + case CLASS_HUNTER: + return row->Hunter; + case CLASS_ROGUE: + return row->Rogue; + case CLASS_PRIEST: + return row->Priest; + case CLASS_DEATH_KNIGHT: + return row->DeathKnight; + case CLASS_SHAMAN: + return row->Shaman; + case CLASS_MAGE: + return row->Mage; + case CLASS_WARLOCK: + return row->Warlock; + case CLASS_MONK: + return row->Monk; + case CLASS_DRUID: + return row->Druid; + case CLASS_DEMON_HUNTER: + return row->DemonHunter; + default: + break; + } + + return 0.0f; +} + +#endif // GameTables_h__ diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 94885deeffe..7cd1751d589 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -17,7 +17,6 @@ #include "Common.h" #include "SharedDefines.h" -#include "DBCStores.h" #include "DisableMgr.h" #include "ObjectMgr.h" #include "SocialMgr.h" @@ -37,7 +36,21 @@ namespace lfg { -LFGMgr::LFGMgr(): m_QueueTimer(0), m_lfgProposalId(1), +LFGDungeonData::LFGDungeonData() : id(0), name(""), map(0), type(0), expansion(0), group(0), minlevel(0), +maxlevel(0), difficulty(DIFFICULTY_NONE), seasonal(false), x(0.0f), y(0.0f), z(0.0f), o(0.0f), +requiredItemLevel(0) +{ +} + +LFGDungeonData::LFGDungeonData(LfgDungeonsEntry const* dbc) : id(dbc->ID), name(dbc->Name->Str[sWorld->GetDefaultDbcLocale()]), map(dbc->MapID), +type(uint8(dbc->Type)), expansion(uint8(dbc->Expansion)), group(uint8(dbc->GroupID)), +minlevel(uint8(dbc->MinLevel)), maxlevel(uint8(dbc->MaxLevel)), difficulty(Difficulty(dbc->DifficultyID)), +seasonal((dbc->Flags & LFG_FLAG_SEASONAL) != 0), x(0.0f), y(0.0f), z(0.0f), o(0.0f), +requiredItemLevel(0) +{ +} + +LFGMgr::LFGMgr() : m_QueueTimer(0), m_lfgProposalId(1), m_options(sWorld->getIntConfig(CONFIG_LFG_OPTIONSMASK)) { } @@ -174,9 +187,9 @@ void LFGMgr::LoadLFGDungeons(bool reload /* = false */) LfgDungeonStore.clear(); // Initialize Dungeon map with data from dbcs - for (uint32 i = 0; i < sLFGDungeonStore.GetNumRows(); ++i) + for (uint32 i = 0; i < sLfgDungeonsStore.GetNumRows(); ++i) { - LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(i); + LfgDungeonsEntry const* dungeon = sLfgDungeonsStore.LookupEntry(i); if (!dungeon) continue; @@ -1597,7 +1610,7 @@ LfgLockMap const LFGMgr::GetLockedDungeons(ObjectGuid guid) for (LfgDungeonSet::const_iterator it = dungeons.begin(); it != dungeons.end(); ++it) { LFGDungeonData const* dungeon = GetLFGDungeon(*it); - if (!dungeon) // should never happen - We provide a list from sLFGDungeonStore + if (!dungeon) // should never happen - We provide a list from sLfgDungeonsStore continue; uint32 lockStatus = 0; diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index f38812549a6..63770e31d8f 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -18,7 +18,6 @@ #ifndef _LFGMGR_H #define _LFGMGR_H -#include "DBCStructure.h" #include "Field.h" #include "LFG.h" #include "LFGQueue.h" @@ -267,16 +266,8 @@ struct LfgPlayerBoot struct LFGDungeonData { - LFGDungeonData(): id(0), name(""), map(0), type(0), expansion(0), group(0), minlevel(0), - maxlevel(0), difficulty(DIFFICULTY_NONE), seasonal(false), x(0.0f), y(0.0f), z(0.0f), o(0.0f), - requiredItemLevel(0) - { } - LFGDungeonData(LFGDungeonEntry const* dbc): id(dbc->ID), name(dbc->Name_lang), map(dbc->MapID), - type(uint8(dbc->Type)), expansion(uint8(dbc->Expansion)), group(uint8(dbc->GroupID)), - minlevel(uint8(dbc->MinLevel)), maxlevel(uint8(dbc->MaxLevel)), difficulty(Difficulty(dbc->DifficultyID)), - seasonal((dbc->Flags & LFG_FLAG_SEASONAL) != 0), x(0.0f), y(0.0f), z(0.0f), o(0.0f), - requiredItemLevel(0) - { } + LFGDungeonData(); + LFGDungeonData(LfgDungeonsEntry const* dbc); uint32 id; std::string name; diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp index d80485afbf4..9288b7404fb 100644 --- a/src/server/game/DungeonFinding/LFGQueue.cpp +++ b/src/server/game/DungeonFinding/LFGQueue.cpp @@ -17,8 +17,6 @@ #include "ObjectDefines.h" #include "Containers.h" -#include "DBCStructure.h" -#include "DBCStores.h" #include "Group.h" #include "LFGQueue.h" #include "LFGMgr.h" diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 979390baaeb..679238ecb17 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 6e723a29191..d80c2eabe3b 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -181,12 +181,12 @@ struct TC_GAME_API CreatureTemplate case DIFFICULTY_NORMAL: case DIFFICULTY_10_N: case DIFFICULTY_40: - case DIFFICULTY_N_SCENARIO: + case DIFFICULTY_3_MAN_SCENARIO_N: case DIFFICULTY_NORMAL_RAID: return -1; case DIFFICULTY_HEROIC: case DIFFICULTY_25_N: - case DIFFICULTY_HC_SCENARIO: + case DIFFICULTY_3_MAN_SCENARIO_HC: case DIFFICULTY_HEROIC_RAID: return 0; case DIFFICULTY_10_HC: diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index ee7241a02d7..6ea2dfef591 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..40e00531497 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 @@ -222,7 +222,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 @@ -242,7 +242,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 +296,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 @@ -534,13 +534,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 +583,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 +606,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 +1117,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 20f1772ef00..ab6e26627be 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -31,6 +31,7 @@ #include "WorldSession.h" #include "ItemPackets.h" #include "TradeData.h" +#include "GameTables.h" void AddItemsSetItem(Player* player, Item* item) { @@ -48,6 +49,9 @@ void AddItemsSetItem(Player* player, Item* item) if (set->RequiredSkill && player->GetSkillValue(set->RequiredSkill) < set->RequiredSkillRank) return; + if (set->Flags & ITEM_SET_FLAG_LEGACY_INACTIVE) + return; + ItemSetEffect* eff = NULL; for (size_t x = 0; x < player->ItemSetEff.size(); ++x) @@ -78,28 +82,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 +137,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 @@ -373,6 +380,21 @@ void Item::SaveToDB(SQLTransaction& trans) stmt->setUInt64(1, GetGUID().GetCounter()); trans->Append(stmt); } + if (!GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).empty()) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_GEMS); + stmt->setUInt64(0, GetGUID().GetCounter()); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_GEMS); + stmt->setUInt64(0, GetGUID().GetCounter()); + uint32 i = 0; + for (; i < MAX_GEM_SOCKETS && i < GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size(); ++i) + stmt->setUInt32(1 + i, GetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, i)); + for (; i < MAX_GEM_SOCKETS; ++i) + stmt->setUInt32(1 + i, 0); + trans->Append(stmt); + } break; } case ITEM_REMOVED: @@ -381,6 +403,10 @@ void Item::SaveToDB(SQLTransaction& trans) stmt->setUInt64(0, GetGUID().GetCounter()); trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_GEMS); + stmt->setUInt64(0, GetGUID().GetCounter()); + trans->Append(stmt); + if (HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GIFT); @@ -413,7 +439,9 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie // 0 1 2 3 4 5 6 7 8 9 10 11 12 //result = CharacterDatabase.PQuery("SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, // 13 14 15 16 17 18 19 20 - // transmogrification, upgradeId, enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, bonusListIDs FROM item_instance WHERE guid = '%u'", guid); + // transmogrification, upgradeId, enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, bonusListIDs, + // 21 22 23 + // gemItemId1, gemItemId2, gemItemId3 FROM item_instance WHERE guid = '%u'", guid); // create item before any checks for store correct guid // and allow use "FSetState(ITEM_REMOVED); SaveToDB();" for deleting item from DB @@ -493,6 +521,17 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie SetModifier(ITEM_MODIFIER_BATTLE_PET_LEVEL, fields[18].GetUInt16()); SetModifier(ITEM_MODIFIER_BATTLE_PET_DISPLAY_ID, fields[19].GetUInt32()); + uint32 gemItemIds[3] = { fields[21].GetUInt32(), fields[22].GetUInt32(), fields[23].GetUInt32() }; + if (gemItemIds[0] || gemItemIds[1] || gemItemIds[2]) + { + // gem slots must be preserved, hence funky logic + AddDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, gemItemIds[0]); + if (gemItemIds[1] || gemItemIds[2]) + AddDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, gemItemIds[1]); + if (gemItemIds[2]) + AddDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, gemItemIds[2]); + } + Tokenizer bonusListIDs(fields[20].GetString(), ' '); for (char const* token : bonusListIDs) { @@ -582,27 +621,25 @@ int32 Item::GenerateItemRandomPropertyId(uint32 item_id) if (itemProto->GetRandomProperty()) { uint32 randomPropId = GetItemEnchantMod(itemProto->GetRandomProperty()); - ItemRandomPropertiesEntry const* random_id = sItemRandomPropertiesStore.LookupEntry(randomPropId); - if (!random_id) + if (!sItemRandomPropertiesStore.LookupEntry(randomPropId)) { TC_LOG_ERROR("sql.sql", "Enchantment id #%u used but it doesn't have records in 'ItemRandomProperties.dbc'", randomPropId); return 0; } - return random_id->ID; + return randomPropId; } // RandomSuffix case else { uint32 randomPropId = GetItemEnchantMod(itemProto->GetRandomSuffix()); - ItemRandomSuffixEntry const* random_id = sItemRandomSuffixStore.LookupEntry(randomPropId); - if (!random_id) + if (!sItemRandomSuffixStore.LookupEntry(randomPropId)) { TC_LOG_ERROR("sql.sql", "Enchantment id #%u used but it doesn't have records in sItemRandomSuffixStore.", randomPropId); return 0; } - return -int32(random_id->ID); + return -int32(randomPropId); } } @@ -613,12 +650,12 @@ void Item::SetItemRandomProperties(int32 randomPropId) if (randomPropId > 0) { - ItemRandomPropertiesEntry const* item_rand = sItemRandomPropertiesStore.LookupEntry(randomPropId); - if (item_rand) + ItemRandomPropertiesEntry const* item_rand = sItemRandomPropertiesStore.LookupEntry(-randomPropId); + if (sItemRandomPropertiesStore.LookupEntry(randomPropId)) { - if (GetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID) != int32(item_rand->ID)) + if (GetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID) != randomPropId) { - SetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID, item_rand->ID); + SetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID, randomPropId); SetState(ITEM_CHANGED, GetOwner()); } for (uint32 i = PROP_ENCHANTMENT_SLOT_1; i < PROP_ENCHANTMENT_SLOT_1 + 3; ++i) @@ -630,10 +667,9 @@ void Item::SetItemRandomProperties(int32 randomPropId) ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(-randomPropId); if (item_rand) { - if (GetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID) != -int32(item_rand->ID) || - !GetItemSuffixFactor()) + if (GetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID) != randomPropId || !GetItemSuffixFactor()) { - SetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID, -int32(item_rand->ID)); + SetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID, randomPropId); UpdateItemSuffixFactor(); SetState(ITEM_CHANGED, GetOwner()); } @@ -924,36 +960,24 @@ void Item::ClearEnchantment(EnchantmentSlot slot) bool Item::GemsFitSockets() const { - for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+MAX_GEM_SOCKETS; ++enchant_slot) + uint32 gemSlot = 0; + for (uint32 gemItemId : GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS)) { - uint8 SocketColor = GetTemplate()->GetSocketColor(enchant_slot - SOCK_ENCHANTMENT_SLOT); - + uint8 SocketColor = GetTemplate()->GetSocketColor(gemSlot); if (!SocketColor) // no socket slot continue; - uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot)); - if (!enchant_id) // no gems on this socket - return false; + uint32 GemColor = 0; - SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id); - if (!enchantEntry) // invalid gem id on this socket - return false; - - uint8 GemColor = 0; - - uint32 gemid = enchantEntry->SRCItemID; - if (gemid) + ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemItemId); + if (gemProto) { - ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemid); - if (gemProto) - { - GemPropertiesEntry const* gemProperty = sGemPropertiesStore.LookupEntry(gemProto->GetGemProperties()); - if (gemProperty) - GemColor = gemProperty->Type; - } + GemPropertiesEntry const* gemProperty = sGemPropertiesStore.LookupEntry(gemProto->GetGemProperties()); + if (gemProperty) + GemColor = gemProperty->Type; } - if (!(GemColor & SocketColor)) // bad gem color on this socket + if (!(GemColor & SocketColorToGemTypeMask[SocketColor])) // bad gem color on this socket return false; } return true; @@ -961,44 +985,22 @@ bool Item::GemsFitSockets() const uint8 Item::GetGemCountWithID(uint32 GemID) const { - uint8 count = 0; - for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+MAX_GEM_SOCKETS; ++enchant_slot) + return std::count_if(GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).begin(), GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).end(), [GemID](uint32 gemItemId) { - uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot)); - if (!enchant_id) - continue; - - SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id); - if (!enchantEntry) - continue; - - if (GemID == enchantEntry->SRCItemID) - ++count; - } - return count; + return gemItemId == GemID; + }); } uint8 Item::GetGemCountWithLimitCategory(uint32 limitCategory) const { - uint8 count = 0; - for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+MAX_GEM_SOCKETS; ++enchant_slot) + return std::count_if(GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).begin(), GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).end(), [limitCategory](uint32 gemItemId) { - uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot)); - if (!enchant_id) - continue; - - SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id); - if (!enchantEntry) - continue; - - ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(enchantEntry->SRCItemID); + ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemItemId); if (!gemProto) - continue; + return false; - if (gemProto->GetItemLimitCategory() == limitCategory) - ++count; - } - return count; + return gemProto->GetItemLimitCategory() == limitCategory; + }); } bool Item::IsLimitedToAnotherMapOrZone(uint32 cur_mapId, uint32 cur_zoneId) const @@ -1155,7 +1157,7 @@ void Item::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player* } - fieldBuffer << uint8(arrayMask.GetBlockCount()); + fieldBuffer << uint16(arrayMask.GetBlockCount()); arrayMask.AppendToPacket(&fieldBuffer); fieldBuffer.append(buffer); } @@ -1858,8 +1860,8 @@ int32 Item::GetItemStatValue(uint32 index, Player const* owner) const if (uint32 randomPropPoints = GetRandomPropertyPoints(itemLevel, GetQuality(), GetTemplate()->GetInventoryType(), GetTemplate()->GetSubClass())) { float statValue = float(_bonusData.ItemStatAllocation[index] * randomPropPoints) * 0.0001f; - if (GtItemSocketCostPerLevelEntry const* gtCost = sGtItemSocketCostPerLevelStore.EvaluateTable(itemLevel - 1, 0)) - statValue -= float(int32(_bonusData.ItemStatSocketCostMultiplier[index] * gtCost->ratio)); + if (GtItemSocketCostPerLevelEntry const* gtCost = sItemSocketCostPerLevelGameTable.GetRow(itemLevel)) + statValue -= float(int32(_bonusData.ItemStatSocketCostMultiplier[index] * gtCost->SocketCost)); return int32(std::floor(statValue + 0.5f)); } diff --git a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp index 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 ebed45eaaac..e33bea37e54 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])) @@ -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)); @@ -203,7 +218,7 @@ bool ItemTemplate::CanWinForPlayer(Player const* player) const if (specs.empty()) return true; - uint32 spec = player->GetSpecId(player->GetActiveTalentGroup()); + uint32 spec = player->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID); if (!spec) spec = player->GetDefaultSpecId(); diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index d69f1c88845..5fa6b5583af 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -317,15 +317,29 @@ enum BAG_FAMILY_MASK enum SocketColor { - SOCKET_COLOR_META = 1, - SOCKET_COLOR_RED = 2, - SOCKET_COLOR_YELLOW = 4, - SOCKET_COLOR_BLUE = 8, - SOCKET_COLOR_HYDRAULIC = 16, // not used - SOCKET_COLOR_COGWHEEL = 32, -}; - -#define SOCKET_COLOR_ALL (SOCKET_COLOR_META | SOCKET_COLOR_RED | SOCKET_COLOR_YELLOW | SOCKET_COLOR_BLUE | SOCKET_COLOR_COGWHEEL) + SOCKET_COLOR_META = 0x00001, + SOCKET_COLOR_RED = 0x00002, + SOCKET_COLOR_YELLOW = 0x00004, + SOCKET_COLOR_BLUE = 0x00008, + SOCKET_COLOR_HYDRAULIC = 0x00010, // not used + SOCKET_COLOR_COGWHEEL = 0x00020, + SOCKET_COLOR_PRISMATIC = 0x0000E, + SOCKET_COLOR_RELIC_IRON = 0x00040, + SOCKET_COLOR_RELIC_BLOOD = 0x00080, + SOCKET_COLOR_RELIC_SHADOW = 0x00100, + SOCKET_COLOR_RELIC_FEL = 0x00200, + SOCKET_COLOR_RELIC_ARCANE = 0x00400, + SOCKET_COLOR_RELIC_FROST = 0x00800, + SOCKET_COLOR_RELIC_FIRE = 0x01000, + SOCKET_COLOR_RELIC_WATER = 0x02000, + SOCKET_COLOR_RELIC_LIFE = 0x04000, + SOCKET_COLOR_RELIC_WIND = 0x08000, + SOCKET_COLOR_RELIC_HOLY = 0x10000 +}; + +extern uint32 const SocketColorToGemTypeMask[19]; + +#define SOCKET_COLOR_STANDARD (SOCKET_COLOR_RED | SOCKET_COLOR_YELLOW | SOCKET_COLOR_BLUE) enum InventoryType { @@ -658,7 +672,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); } diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 9493df4449c..0522ef13095 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -340,7 +340,6 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const bool NoBirthAnim = false; bool EnablePortals = false; bool PlayHoverAnim = false; - bool IsSuppressingGreetings = false; bool HasMovementUpdate = (flags & UPDATEFLAG_LIVING) != 0; bool HasMovementTransport = (flags & UPDATEFLAG_TRANSPORT_POSITION) != 0; bool Stationary = (flags & UPDATEFLAG_STATIONARY_POSITION) != 0; @@ -352,9 +351,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) @@ -363,7 +362,6 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const data->WriteBit(NoBirthAnim); data->WriteBit(EnablePortals); data->WriteBit(PlayHoverAnim); - data->WriteBit(IsSuppressingGreetings); data->WriteBit(HasMovementUpdate); data->WriteBit(HasMovementTransport); data->WriteBit(Stationary); @@ -374,11 +372,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) { @@ -389,7 +387,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()); @@ -398,15 +396,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 @@ -439,29 +436,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) { @@ -507,243 +501,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); + // *data << uint32(WorldEffectID); - // packet.ResetBitReader(); - - // 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 @@ -806,7 +820,7 @@ void Object::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player } } - fieldBuffer << uint8(arrayMask.GetBlockCount()); + fieldBuffer << uint16(arrayMask.GetBlockCount()); arrayMask.AppendToPacket(&fieldBuffer); fieldBuffer.append(buffer); } @@ -1341,6 +1355,13 @@ std::vector<uint32> const& Object::GetDynamicValues(uint16 index) const return _dynamicValues[index]; } +uint32 Object::GetDynamicValue(uint16 index, uint8 offset) const +{ + ASSERT(index < _dynamicValuesCount || PrintIndexError(index, false)); + ASSERT(offset < _dynamicValues[index].size()); + return _dynamicValues[index][offset]; +} + void Object::AddDynamicValue(uint16 index, uint32 value) { ASSERT(index < _dynamicValuesCount || PrintIndexError(index, false)); diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 503555037e1..bd31af9363c 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -168,6 +168,7 @@ class TC_GAME_API Object void ApplyModFlag64(uint16 index, uint64 flag, bool apply); std::vector<uint32> const& GetDynamicValues(uint16 index) const; + uint32 GetDynamicValue(uint16 index, uint8 offset) const; void AddDynamicValue(uint16 index, uint32 value); void RemoveDynamicValue(uint16 index, uint32 value); void ClearDynamicValue(uint16 index); diff --git a/src/server/game/Entities/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..9cc08c4ee7e 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 @@ -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,26 @@ 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 + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_VISUAL_ANIMATION }; uint32 SceneObjectUpdateFieldFlags[SCENEOBJECT_END] = @@ -4057,7 +4122,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..200478eeefe 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, 21796 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 + UNIT_FIELD_FLAGS_2 = OBJECT_END + 0x059, // Size: 1, Flags: PUBLIC + UNIT_FIELD_FLAGS_3 = OBJECT_END + 0x05A, // Size: 1, Flags: PUBLIC + 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,18 @@ 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_VISUAL_ANIMATION = OBJECT_END + 0x01A, // Size: 1, Flags: PUBLIC, URGENT + AREATRIGGER_END = OBJECT_END + 0x01B, }; enum AreaTriggerDynamicFields @@ -403,7 +417,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/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 1dd3f63097a..c35e9bc99ca 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -101,7 +101,6 @@ #include "WorldPacket.h" #include "WorldSession.h" #include "WorldStatePackets.h" -#include "DBCStructure.h" #define ZONE_UPDATE_INTERVAL (1*IN_MILLISECONDS) @@ -421,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()); @@ -464,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); @@ -560,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 @@ -1795,20 +1795,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; } } @@ -2045,8 +2046,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; @@ -2391,12 +2392,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) @@ -2433,12 +2434,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(); @@ -2502,16 +2502,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); } @@ -2526,8 +2520,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); @@ -2546,6 +2540,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); @@ -2557,7 +2552,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); @@ -2611,8 +2606,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); @@ -2652,7 +2646,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); @@ -3133,12 +3127,12 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent if (!pSkill) continue; - if (pSkill->ID == fromSkill) + if (_spell_idx->second->SkillLine == fromSkill) continue; // Runeforging special case - if ((_spell_idx->second->AquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(pSkill->ID)) || ((pSkill->ID == SKILL_RUNEFORGING_2) && _spell_idx->second->TrivialSkillLineRankHigh == 0)) - if (SkillRaceClassInfoEntry const* rcInfo = GetSkillRaceClassInfo(pSkill->ID, getRace(), getClass())) + if ((_spell_idx->second->AquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(_spell_idx->second->SkillLine)) || ((_spell_idx->second->SkillLine == SKILL_RUNEFORGING_2) && _spell_idx->second->TrivialSkillLineRankHigh == 0)) + if (SkillRaceClassInfoEntry const* rcInfo = sDB2Manager.GetSkillRaceClassInfo(_spell_idx->second->SkillLine, getRace(), getClass())) LearnDefaultSkill(rcInfo); } } @@ -3220,7 +3214,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; @@ -3959,6 +3953,10 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_GEMS_BY_OWNER); + stmt->setUInt64(0, guid); + trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER); stmt->setUInt64(0, guid); trans->Append(stmt); @@ -4008,10 +4006,6 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GLYPHS); - stmt->setUInt64(0, guid); - trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_QUESTSTATUS_DAILY); stmt->setUInt64(0, guid); trans->Append(stmt); @@ -4208,7 +4202,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 @@ -4713,11 +4707,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) @@ -4730,7 +4724,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; @@ -4817,111 +4811,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; } @@ -4941,24 +4975,6 @@ float Player::GetExpertiseDodgeOrParryReduction(WeaponAttackType attType) const return 0.0f; } -float Player::OCTRegenMPPerSpirit() const -{ - uint8 level = getLevel(); - uint32 pclass = getClass(); - - if (level >= sGtRegenMPPerSptStore.GetTableRowCount()) - level = sGtRegenMPPerSptStore.GetTableRowCount() - 1; - - GtRegenMPPerSptEntry const* moreRatio = sGtRegenMPPerSptStore.EvaluateTable(level - 1, pclass - 1); - if (moreRatio == nullptr) - return 0.0f; - - // Formula get from PaperDollFrame script - float spirit = GetStat(STAT_SPIRIT); - float regen = spirit * moreRatio->ratio; - return regen; -} - void Player::ApplyRatingMod(CombatRating combatRating, int32 value, bool apply) { float oldRating = m_baseRatingValue[combatRating]; @@ -5010,7 +5026,7 @@ void Player::UpdateRating(CombatRating cr) switch (cr) { - case CR_UNUSED_1: + case CR_AMPLIFY: case CR_DEFENSE_SKILL: break; case CR_DODGE: @@ -5049,7 +5065,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; @@ -5058,8 +5074,8 @@ void Player::UpdateRating(CombatRating cr) case CR_HASTE_SPELL: break; case CR_AVOIDANCE: - case CR_UNUSED_2: - case CR_WEAPON_SKILL_RANGED: + case CR_STURDINESS: + case CR_UNUSED_7: break; case CR_EXPERTISE: if (affectStats) @@ -5075,8 +5091,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; @@ -5317,7 +5333,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; @@ -5354,7 +5370,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; @@ -6071,7 +6087,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(); } @@ -6120,7 +6136,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]; @@ -6892,9 +6908,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); } @@ -7170,10 +7186,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); @@ -7221,7 +7237,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); @@ -7256,7 +7272,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); @@ -7709,7 +7725,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; } @@ -7741,7 +7757,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 @@ -7761,8 +7777,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; @@ -7786,8 +7807,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); @@ -7809,13 +7835,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); @@ -9755,7 +9786,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; } @@ -9768,7 +9799,7 @@ bool Player::HasItemTotemCategory(uint32 TotemCategory) const for (uint32 j = 0; j < bag->GetBagSize(); ++j) { item = GetUseableItemByPos(i, j); - if (item && IsTotemCategoryCompatibleWith(item->GetTemplate()->GetTotemCategory(), TotemCategory)) + if (item && DB2Manager::IsTotemCategoryCompatibleWith(item->GetTemplate()->GetTotemCategory(), TotemCategory)) return true; } } @@ -12754,20 +12785,23 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool if (pEnchant->RequiredSkillID > 0 && pEnchant->RequiredSkillRank > GetSkillValue(pEnchant->RequiredSkillID)) return; - // Cogwheel gems dont have requirement data set in SpellItemEnchantment.dbc, but they do have it in Item-sparse.db2 - if (ItemTemplate const* gem = sObjectMgr->GetItemTemplate(pEnchant->SRCItemID)) - if (gem->GetRequiredSkill() && GetSkillValue(gem->GetRequiredSkill()) < gem->GetRequiredSkillRank()) - return; // If we're dealing with a gem inside a prismatic socket we need to check the prismatic socket requirements // rather than the gem requirements itself. If the socket has no color it is a prismatic socket. - if ((slot == SOCK_ENCHANTMENT_SLOT || slot == SOCK_ENCHANTMENT_SLOT_2 || slot == SOCK_ENCHANTMENT_SLOT_3) - && !item->GetSocketColor(slot - SOCK_ENCHANTMENT_SLOT)) + if ((slot == SOCK_ENCHANTMENT_SLOT || slot == SOCK_ENCHANTMENT_SLOT_2 || slot == SOCK_ENCHANTMENT_SLOT_3)) { - // Check if the requirements for the prismatic socket are met before applying the gem stats - SpellItemEnchantmentEntry const* pPrismaticEnchant = sSpellItemEnchantmentStore.LookupEntry(item->GetEnchantmentId(PRISMATIC_ENCHANTMENT_SLOT)); - if (!pPrismaticEnchant || (pPrismaticEnchant->RequiredSkillID > 0 && pPrismaticEnchant->RequiredSkillRank > GetSkillValue(pPrismaticEnchant->RequiredSkillID))) - return; + if (!item->GetSocketColor(slot - SOCK_ENCHANTMENT_SLOT)) + { + // Check if the requirements for the prismatic socket are met before applying the gem stats + SpellItemEnchantmentEntry const* pPrismaticEnchant = sSpellItemEnchantmentStore.LookupEntry(item->GetEnchantmentId(PRISMATIC_ENCHANTMENT_SLOT)); + if (!pPrismaticEnchant || (pPrismaticEnchant->RequiredSkillID > 0 && pPrismaticEnchant->RequiredSkillRank > GetSkillValue(pPrismaticEnchant->RequiredSkillID))) + return; + } + + // Cogwheel gems dont have requirement data set in SpellItemEnchantment.dbc, but they do have it in Item-sparse.db2 + if (ItemTemplate const* gem = sObjectMgr->GetItemTemplate(item->GetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, uint32(slot - SOCK_ENCHANTMENT_SLOT)))) + if (gem->GetRequiredSkill() && GetSkillValue(gem->GetRequiredSkill()) < gem->GetRequiredSkillRank()) + return; } if (!item->IsBroken()) @@ -12892,11 +12926,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); @@ -12994,7 +13028,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: @@ -13256,8 +13290,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)) @@ -13461,16 +13494,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(); @@ -16234,18 +16257,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) { @@ -16313,8 +16336,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); @@ -16332,12 +16355,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 @@ -16347,14 +16371,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(); @@ -16382,18 +16407,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); } @@ -16418,9 +16443,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)); @@ -16493,7 +16518,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); @@ -16683,7 +16708,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. @@ -16696,18 +16721,22 @@ 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())); + SetPrimarySpecialization(fields[34].GetUInt32()); + ChrSpecializationEntry const* primarySpec = sChrSpecializationStore.LookupEntry(GetPrimarySpecialization()); + if (!primarySpec || primarySpec->ClassID != getClass()) + SetPrimarySpecialization(0); - 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", @@ -16715,7 +16744,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)) { @@ -16728,7 +16757,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; @@ -16760,12 +16789,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) { @@ -16773,7 +16802,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); @@ -16784,42 +16813,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()); + SetActiveTalentGroup(fields[62].GetUInt8()); - 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) + if (GetActiveTalentGroup() >= MAX_SPECIALIZATIONS) { - TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player %s (%s) has invalid SpecCount = %u and/or invalid ActiveSpec = %u.", - GetName().c_str(), GetGUID().ToString().c_str(), GetTalentGroupsCount(), GetActiveTalentGroup()); + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player %s (%s) has invalid invalid ActiveSpec = %u.", + GetName().c_str(), GetGUID().ToString().c_str(), GetActiveTalentGroup()); SetActiveTalentGroup(0); } - // Only load selected specializations, learning mastery spells requires this - Tokenizer talentSpecs(fields[31].GetString(), ' ', MAX_TALENT_GROUPS); - for (uint8 i = 0; i < MAX_TALENT_GROUPS; ++i) + if (ChrSpecializationEntry const* spec = sDB2Manager.GetChrSpecializationByIndex(getClass(), GetActiveTalentGroup())) { - if (i >= talentSpecs.size()) - break; - - uint32 talentSpec = atoul(talentSpecs[i]); - if (talentSpec) - { - if (sChrSpecializationStore.LookupEntry(talentSpec)) - SetSpecId(i, talentSpec); - else - SetAtLoginFlag(AT_LOGIN_RESET_TALENTS); - } + SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, spec->ID); + if (!GetPrimarySpecialization()) + SetPrimarySpecialization(spec->ID); } - - SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, GetSpecId(GetActiveTalentGroup())); + else + ResetTalentSpecialization(); _LoadTalents(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TALENTS)); _LoadSpells(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELLS)); @@ -16828,9 +16844,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) LearnSpecializationSpells(); - _LoadGlyphs(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_GLYPHS)); _LoadAuras(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AURAS), holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AURA_EFFECTS), time_diff); - _LoadGlyphAuras(); // add ghost flag (must be after aura load: PLAYER_FLAGS_GHOST set in aura) if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) m_deathState = DEAD; @@ -16870,7 +16884,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; @@ -16893,14 +16907,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) @@ -16911,7 +16925,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(); @@ -16965,7 +16979,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); @@ -17182,7 +17196,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()) { @@ -17200,36 +17215,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)) @@ -17254,8 +17239,8 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // SELECT ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, ii.transmogrification, ii.upgradeId - // 15 16 17 18 19 20 21 22 - // ii.enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, ii.bonusListIDs, bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot + // 15 16 17 18 19 20 21 22 23 24 25 + // ii.enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, ii.bonusListIDs, ig.gemItemId1, ig.gemItemId2, ig.gemItemId3, bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot //NOTE: the "order by `bag`" is important because it makes sure //the bagMap is filled before items in the bags are loaded //NOTE2: the "order by `slot`" is needed because mainhand weapons are (wrongly?) @@ -17277,8 +17262,8 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) Field* fields = result->Fetch(); if (Item* item = _LoadItem(trans, zoneId, timeDiff, fields)) { - ObjectGuid bagGuid = fields[21].GetUInt64() ? ObjectGuid::Create<HighGuid::Item>(fields[21].GetUInt64()) : ObjectGuid::Empty; - uint8 slot = fields[22].GetUInt8(); + ObjectGuid bagGuid = fields[21].GetUInt64() ? ObjectGuid::Create<HighGuid::Item>(fields[24].GetUInt64()) : ObjectGuid::Empty; + uint8 slot = fields[25].GetUInt8(); GetSession()->GetCollectionMgr()->CheckHeirloomUpgrades(item); @@ -18040,7 +18025,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()) { @@ -18056,7 +18041,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)", @@ -18094,7 +18079,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; @@ -18108,7 +18093,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; @@ -18340,14 +18325,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())); @@ -18544,8 +18529,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()); @@ -18578,11 +18565,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); @@ -18617,7 +18600,6 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt32(index++, GetSession()->GetLatency()); - stmt->setUInt8(index++, GetTalentGroupsCount()); stmt->setUInt8(index++, GetActiveTalentGroup()); stmt->setUInt32(index++, GetLootSpecId()); @@ -18671,8 +18653,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()) @@ -18722,11 +18706,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); @@ -18761,7 +18741,6 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt32(index++, GetSession()->GetLatency()); - stmt->setUInt8(index++, GetTalentGroupsCount()); stmt->setUInt8(index++, GetActiveTalentGroup()); stmt->setUInt32(index++, GetLootSpecId()); @@ -18829,7 +18808,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); @@ -19584,7 +19562,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); } @@ -19596,7 +19574,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)); @@ -20587,17 +20565,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*/) @@ -21545,23 +21523,11 @@ bool Player::EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot) if (i == slot) continue; Item* pItem2 = GetItemByPos(INVENTORY_SLOT_BAG_0, i); - if (pItem2 && !pItem2->IsBroken() && pItem2->GetTemplate()->GetSocketColor(0)) + if (pItem2 && !pItem2->IsBroken()) { - for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+3; ++enchant_slot) + for (uint32 gemItemId : pItem2->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS)) { - uint32 enchant_id = pItem2->GetEnchantmentId(EnchantmentSlot(enchant_slot)); - if (!enchant_id) - continue; - - SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id); - if (!enchantEntry) - continue; - - uint32 gemid = enchantEntry->SRCItemID; - if (!gemid) - continue; - - ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemid); + ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemItemId); if (!gemProto) continue; @@ -21569,13 +21535,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]; - } } } } @@ -21733,7 +21697,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 @@ -22274,8 +22238,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 @@ -23488,7 +23450,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); @@ -23784,7 +23746,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) @@ -23935,7 +23897,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; } @@ -23953,66 +23915,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; -} - -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); -} + 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::SetGlyph(uint8 slot, uint32 glyph) -{ - _talentMgr->GroupInfo[GetActiveTalentGroup()].Glyphs[slot] = glyph; - SetUInt32Value(PLAYER_FIELD_GLYPHS_1 + slot, glyph); + return cost; } bool Player::isTotalImmune() const @@ -24088,18 +24037,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); @@ -24127,72 +24075,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) +void Runes::SetRuneState(uint8 index, bool set /*= true*/) { - 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) -{ - 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::ConvertRune data; - data.Index = index; - data.Rune = newType; - GetSession()->SendPacket(data.Write()); -} + WorldPackets::Spells::ResyncRunes data(MAX_RUNES); + data.Runes.Start = 0; + data.Runes.Count = GetRunesState(); -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()); } @@ -24203,48 +24131,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) @@ -24360,7 +24268,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 } @@ -24389,7 +24297,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", @@ -24501,16 +24409,9 @@ InventoryResult Player::CanEquipUniqueItem(Item* pItem, uint8 eslot, uint32 limi return res; // check unique-equipped on gems - for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+3; ++enchant_slot) + for (uint32 gemItemId : pItem->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS)) { - uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot)); - if (!enchant_id) - continue; - SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id); - if (!enchantEntry) - continue; - - ItemTemplate const* pGem = sObjectMgr->GetItemTemplate(enchantEntry->SRCItemID); + ItemTemplate const* pGem = sObjectMgr->GetItemTemplate(gemItemId); if (!pGem) continue; @@ -24668,22 +24569,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: @@ -24692,11 +24609,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; @@ -24704,71 +24621,61 @@ 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; -} - -void Player::LearnTalentSpecialization(uint32 talentSpec) -{ - if (GetSpecId(GetActiveTalentGroup())) - return; - - SetSpecId(GetActiveTalentGroup(), talentSpec); - SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, talentSpec); - - // Reset only talents that have different spells for each spec - uint32 class_ = getClass(); - for (uint32 t = 0; t < MAX_TALENT_TIERS; ++t) - for (uint32 c = 0; c < MAX_TALENT_COLUMNS; ++c) - if (sTalentByPos[class_][t][c].size() > 1) - for (TalentEntry const* talent : sTalentByPos[class_][t][c]) - RemoveTalent(talent); - - LearnSpecializationSpells(); - SendTalentsInfoData(); - UpdateItemSetAuras(false); + return TALENT_LEARN_OK; } void Player::ResetTalentSpecialization() { - if (!GetSpecId(GetActiveTalentGroup())) + if (!GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID)) return; - SetSpecId(GetActiveTalentGroup(), 0); SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, 0); // Reset only talents that have different spells for each spec uint32 class_ = getClass(); for (uint32 t = 0; t < MAX_TALENT_TIERS; ++t) for (uint32 c = 0; c < MAX_TALENT_COLUMNS; ++c) - if (sTalentByPos[class_][t][c].size() > 1) - for (TalentEntry const* talent : sTalentByPos[class_][t][c]) + if (sDB2Manager.GetTalentsByPosition(class_, t, c).size() > 1) + for (TalentEntry const* talent : sDB2Manager.GetTalentsByPosition(class_, t, c)) RemoveTalent(talent); RemoveSpecializationSpells(); @@ -24845,16 +24752,17 @@ bool Player::CanSeeSpellClickOn(Creature const* c) const void Player::SendTalentsInfoData() { WorldPackets::Talent::UpdateTalentData packet; - + packet.Info.PrimarySpecialization = GetPrimarySpecialization(); packet.Info.ActiveGroup = GetActiveTalentGroup(); - uint8 groupsCount = GetTalentGroupsCount(); - - for (uint8 i = 0; i < groupsCount; ++i) + for (uint8 i = 0; i < MAX_SPECIALIZATIONS; ++i) { - WorldPackets::Talent::TalentGroupInfo groupInfoPkt; + ChrSpecializationEntry const* spec = sDB2Manager.GetChrSpecializationByIndex(getClass(), i); + if (!spec) + continue; - groupInfoPkt.SpecID = GetSpecId(i); + WorldPackets::Talent::TalentGroupInfo groupInfoPkt; + groupInfoPkt.SpecID = spec->ID; groupInfoPkt.TalentIDs.reserve(GetTalentMap(i)->size()); for (PlayerTalentMap::const_iterator itr = GetTalentMap(i)->begin(); itr != GetTalentMap(i)->end(); ++itr) @@ -24884,9 +24792,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); } @@ -25065,48 +24970,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)); @@ -25147,58 +25010,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)) @@ -25259,15 +25073,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) { @@ -25294,23 +25103,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(); @@ -25330,9 +25125,6 @@ void Player::ActivateTalentGroup(uint8 spec) SetPower(pw, 0); UpdateItemSetAuras(false); - - if (!sChrSpecializationStore.LookupEntry(GetSpecId(GetActiveTalentGroup()))) - ResetTalents(true); } void Player::ResetTimeSync() @@ -25844,9 +25636,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; @@ -25960,7 +25752,7 @@ Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetTy bool Player::CanUseMastery() const { - if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(GetSpecId(GetActiveTalentGroup()))) + if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID))) return HasSpell(chrSpec->MasterySpellID[0]) || HasSpell(chrSpec->MasterySpellID[1]); return false; @@ -26068,7 +25860,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; @@ -26081,7 +25885,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; @@ -26166,7 +25970,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) { @@ -26186,7 +25990,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)) { @@ -26212,58 +26016,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 3c630c42fda..4e4e116f65e 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" @@ -447,7 +446,8 @@ struct Areas float y2; }; -#define MAX_RUNES 6 +#define MAX_RUNES 7 +#define MAX_RECHARGING_RUNES 3 enum RuneCooldowns { @@ -455,36 +455,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 @@ -575,26 +552,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 @@ -625,6 +608,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, @@ -688,7 +681,7 @@ enum QuestSlotOffsets }; #define MAX_QUEST_COUNTS 24 -#define MAX_QUEST_OFFSET 15 +#define MAX_QUEST_OFFSET 16 enum QuestSlotStateMask { @@ -963,7 +956,6 @@ enum PlayerLoginQueryIndex PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS, PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS, PLAYER_LOGIN_QUERY_LOAD_BG_DATA, - PLAYER_LOGIN_QUERY_LOAD_GLYPHS, PLAYER_LOGIN_QUERY_LOAD_TALENTS, PLAYER_LOGIN_QUERY_LOAD_ACCOUNT_DATA, PLAYER_LOGIN_QUERY_LOAD_SKILLS, @@ -1144,43 +1136,38 @@ struct ResurrectionData uint32 Aura; }; +enum TalentLearnResult +{ + TALENT_LEARN_OK = 0, + TALENT_FAILED_UNKNOWN = 1, + TALENT_FAILED_NOT_ENOUGH_TALENTS_IN_PRIMARY_TREE = 2, + TALENT_FAILED_NO_PRIMARY_TREE_SELECTED = 3, + TALENT_FAILED_CANT_DO_THAT_RIGHT_NOW = 4, + TALENT_FAILED_AFFECTING_COMBAT = 5, + TALENT_FAILED_CANT_REMOVE_TALENT = 6, + TALENT_FAILED_CANT_DO_THAT_CHALLENGE_MODE_ACTIVE = 7, + TALENT_FAILED_REST_AREA = 8 +}; + static uint32 const DefaultTalentRowLevels[MAX_TALENT_TIERS] = { 15, 30, 45, 60, 75, 90, 100 }; static uint32 const DKTalentRowLevels[MAX_TALENT_TIERS] = { 57, 58, 59, 60, 75, 90, 100 }; +static uint32 const DHTalentRowLevels[MAX_TALENT_TIERS] = { 99, 100, 102, 104, 106, 108, 110 }; struct TC_GAME_API PlayerTalentInfo { - PlayerTalentInfo() : - ResetTalentsCost(0), ResetTalentsTime(0), - ActiveGroup(0), GroupsCount(1) - { - for (uint8 i = 0; i < MAX_TALENT_GROUPS; ++i) - { - GroupInfo[i].Talents = new PlayerTalentMap(); - memset(GroupInfo[i].Glyphs, 0, MAX_GLYPH_SLOT_INDEX * sizeof(uint32)); - GroupInfo[i].SpecId = 0; - } - } - - ~PlayerTalentInfo() + PlayerTalentInfo() : ResetTalentsCost(0), ResetTalentsTime(0), PrimarySpecialization(0), ActiveGroup(0) { - for (uint8 i = 0; i < MAX_TALENT_GROUPS; ++i) - delete GroupInfo[i].Talents; } - struct TalentGroupInfo - { - PlayerTalentMap* Talents; - uint32 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> @@ -1244,7 +1231,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(); @@ -1345,8 +1332,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> static bool IsBankPos(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; @@ -1632,7 +1619,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 ***/ @@ -1762,39 +1749,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); } @@ -1941,10 +1917,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; @@ -1969,7 +1942,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]; } @@ -2163,7 +2135,7 @@ 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(); @@ -2405,24 +2377,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(); @@ -2435,6 +2394,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); } @@ -2538,7 +2498,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); @@ -2561,7 +2520,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void _LoadArenaTeamInfo(PreparedQueryResult result); void _LoadEquipmentSets(PreparedQueryResult result); void _LoadBGData(PreparedQueryResult result); - void _LoadGlyphs(PreparedQueryResult result); void _LoadTalents(PreparedQueryResult result); void _LoadInstanceTimeRestrictions(PreparedQueryResult result); void _LoadCurrency(PreparedQueryResult result); @@ -2585,7 +2543,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 4fa79a91eee..035bc4d8703 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; } @@ -265,8 +264,8 @@ float Player::GetHealthBonusFromStamina() { // Taken from PaperDollFrame.lua - 6.0.3.19085 float ratio = 10.0f; - if (GtOCTHpPerStaminaEntry const* hpBase = sGtOCTHpPerStaminaStore.EvaluateTable(getLevel() - 1, 0)) - ratio = hpBase->ratio; + if (GtHpPerStaEntry const* hpBase = sHpPerStaGameTable.GetRow(getLevel())) + ratio = hpBase->Health; float stamina = GetStat(STAT_STAMINA); @@ -512,7 +511,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); @@ -535,15 +534,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()) @@ -657,9 +653,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 @@ -752,8 +746,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); @@ -763,36 +761,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() @@ -1037,7 +1021,6 @@ bool Guardian::UpdateStats(Stats stat) case STAT_AGILITY: UpdateArmor(); break; case STAT_STAMINA: UpdateMaxHealth(); break; case STAT_INTELLECT: UpdateMaxPower(POWER_MANA); break; - case STAT_SPIRIT: default: break; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 84494f5eff0..ab16b8275c9 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1430,7 +1430,7 @@ void Unit::HandleEmoteCommand(uint32 anim_id) SendMessageToSet(packet.Write(), true); } -bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* spellInfo, uint8 effIndex) +bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* spellInfo /*= nullptr*/, int8 effIndex /*= -1*/) { // only physical spells damage gets reduced by armor if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0) @@ -1441,13 +1441,16 @@ bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* s if (spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_ARMOR)) return false; - // bleeding effects are not reduced by armor - if (SpellEffectInfo const* effect = spellInfo->GetEffect(GetMap()->GetDifficultyID(), effIndex)) + if (effIndex != -1) { - if (effect->ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE || - effect->Effect == SPELL_EFFECT_SCHOOL_DAMAGE) - if (spellInfo->GetEffectMechanicMask(effIndex) & (1<<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; @@ -1500,14 +1503,14 @@ uint32 Unit::CalcArmorReducedDamage(Unit* attacker, Unit* victim, const uint32 d return damage; uint8 attackerLevel = attacker->getLevel(); - if (attackerLevel > sGtArmorMitigationByLvlStore.GetTableRowCount()) - attackerLevel = sGtArmorMitigationByLvlStore.GetTableRowCount(); + if (attackerLevel > sArmorMitigationByLvlGameTable.GetTableRowCount()) + attackerLevel = sArmorMitigationByLvlGameTable.GetTableRowCount(); - GtArmorMitigationByLvlEntry const* ambl = sGtArmorMitigationByLvlStore.EvaluateTable(attackerLevel - 1, 0); + GtArmorMitigationByLvlEntry const* ambl = sArmorMitigationByLvlGameTable.GetRow(attackerLevel); if (!ambl) return damage; - float mitigation = std::min(armor / (armor + ambl->KFactor), 0.85f); + float mitigation = std::min(armor / (armor + ambl->Mitigation), 0.85f); return std::max<uint32>(damage * (1.0f - mitigation), 1); } @@ -3305,7 +3308,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->GetSpellInfo()->GetSpellXSpellVisualId(caster->GetMap()->GetDifficultyID()), aura->GetCastGUID(), SPELL_FAILED_AURA_BOUNCED); } aura->Remove(); @@ -3670,7 +3673,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()) @@ -6056,78 +6059,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: @@ -6191,8 +6122,6 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 60233;stat = GetStat(STAT_AGILITY); } // intellect if (GetStat(STAT_INTELLECT)> stat) { trigger_spell_id = 60234;stat = GetStat(STAT_INTELLECT);} - // spirit - if (GetStat(STAT_SPIRIT) > stat) { trigger_spell_id = 60235; } break; } case 64568: // Blood Reserve @@ -6805,11 +6734,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; @@ -8234,7 +8163,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; @@ -9024,7 +8953,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()))); } } @@ -9666,23 +9595,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) { @@ -9703,28 +9632,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; @@ -10809,8 +10737,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; @@ -10923,8 +10850,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; } @@ -10992,7 +10917,7 @@ void Unit::SetLevel(uint8 lvl) } } -void Unit::SetHealth(uint32 val) +void Unit::SetHealth(uint64 val) { if (getDeathState() == JUST_DIED) val = 0; @@ -11000,12 +10925,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()) @@ -11020,13 +10945,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) @@ -11153,16 +11078,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; @@ -14061,7 +13986,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; @@ -14795,7 +14721,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 @@ -14803,7 +14729,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; @@ -15850,16 +15776,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; @@ -15879,7 +15801,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 05149a4cd0a..15792d4f543 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -19,7 +19,6 @@ #ifndef __UNIT_H #define __UNIT_H -#include "DBCStructure.h" #include "EventProcessor.h" #include "FollowerReference.h" #include "FollowerRefManager.h" @@ -381,6 +380,7 @@ enum InventorySlot }; struct FactionTemplateEntry; +struct LiquidTypeEntry; struct MountCapabilityEntry; struct SpellValue; @@ -482,11 +482,10 @@ enum TriggerCastFlags enum UnitMods { - UNIT_MOD_STAT_STRENGTH, // UNIT_MOD_STAT_STRENGTH..UNIT_MOD_STAT_SPIRIT must be in existed order, it's accessed by index values of Stats enum. + UNIT_MOD_STAT_STRENGTH, // UNIT_MOD_STAT_STRENGTH..UNIT_MOD_STAT_INTELLECT must be in existed order, it's accessed by index values of Stats enum. UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_STAMINA, UNIT_MOD_STAT_INTELLECT, - UNIT_MOD_STAT_SPIRIT, UNIT_MOD_HEALTH, UNIT_MOD_MANA, // UNIT_MOD_MANA..UNIT_MOD_RUNIC_POWER must be in existed order, it's accessed by index values of Powers enum. UNIT_MOD_RAGE, @@ -499,6 +498,14 @@ enum UnitMods UNIT_MOD_ECLIPSE, UNIT_MOD_HOLY_POWER, UNIT_MOD_ALTERNATIVE, + UNIT_MOD_MAELSTROM, + UNIT_MOD_CHI, + UNIT_MOD_INSANITY, + UNIT_MOD_BURNING_EMBERS, + UNIT_MOD_DEMONIC_FURY, + UNIT_MOD_ARCANE_CHARGES, + UNIT_MOD_FURY, + UNIT_MOD_PAIN, UNIT_MOD_ARMOR, // UNIT_MOD_ARMOR..UNIT_MOD_RESISTANCE_ARCANE must be in existed order, it's accessed by index values of SpellSchools enum. UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_FIRE, @@ -514,11 +521,11 @@ enum UnitMods UNIT_MOD_END, // synonyms UNIT_MOD_STAT_START = UNIT_MOD_STAT_STRENGTH, - UNIT_MOD_STAT_END = UNIT_MOD_STAT_SPIRIT + 1, + UNIT_MOD_STAT_END = UNIT_MOD_STAT_INTELLECT + 1, UNIT_MOD_RESISTANCE_START = UNIT_MOD_ARMOR, UNIT_MOD_RESISTANCE_END = UNIT_MOD_RESISTANCE_ARCANE + 1, UNIT_MOD_POWER_START = UNIT_MOD_MANA, - UNIT_MOD_POWER_END = UNIT_MOD_ALTERNATIVE + 1 + UNIT_MOD_POWER_END = UNIT_MOD_PAIN + 1 }; enum BaseModGroup @@ -623,8 +630,8 @@ enum WeaponAttackType : uint8 enum CombatRating { - CR_UNUSED_1 = 0, - CR_DEFENSE_SKILL = 1, // Removed in 4.0.1 + CR_AMPLIFY = 0, + CR_DEFENSE_SKILL = 1, CR_DODGE = 2, CR_PARRY = 3, CR_BLOCK = 4, @@ -638,22 +645,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 @@ -1425,8 +1433,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); } @@ -1434,19 +1442,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); } @@ -1539,7 +1547,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; @@ -2081,7 +2089,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 cd7e038508c..a1523db5d62 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -478,12 +478,12 @@ Vehicle* Vehicle::RemovePassenger(Unit* unit) _me->SetFlag64(UNIT_NPC_FLAGS, (_me->GetTypeId() == TYPEID_PLAYER ? UNIT_NPC_FLAG_PLAYER_VEHICLE : UNIT_NPC_FLAG_SPELLCLICK)); // Remove UNIT_FLAG_NOT_SELECTABLE if passenger did not have it before entering vehicle - if (seat->second.SeatInfo->Flags & VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE && !seat->second.Passenger.IsUnselectable) + if (seat->second.SeatInfo->Flags[0] & VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE && !seat->second.Passenger.IsUnselectable) unit->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); seat->second.Passenger.Reset(); - if (_me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->second.SeatInfo->Flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) + if (_me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->second.SeatInfo->Flags[0] & VEHICLE_SEAT_FLAG_CAN_CONTROL) _me->RemoveCharmedBy(unit); if (_me->IsInWorld()) @@ -785,11 +785,11 @@ bool VehicleJoinEvent::Execute(uint64, uint32) player->StopCastingCharm(); player->StopCastingBindSight(); player->SendOnCancelExpectedVehicleRideAura(); - if (!(veSeat->FlagsB & VEHICLE_SEAT_FLAG_B_KEEP_PET)) + if (!(veSeat->Flags[1] & VEHICLE_SEAT_FLAG_B_KEEP_PET)) player->UnsummonPetTemporaryIfAny(); } - if (Seat->second.SeatInfo->Flags & VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE) + if (Seat->second.SeatInfo->Flags[0] & VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE) Passenger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Passenger->m_movementInfo.transport.pos.Relocate(veSeat->AttachmentOffset.X, veSeat->AttachmentOffset.Y, veSeat->AttachmentOffset.Z); @@ -799,7 +799,7 @@ bool VehicleJoinEvent::Execute(uint64, uint32) Passenger->m_movementInfo.transport.vehicleId = Target->GetVehicleInfo()->ID; if (Target->GetBase()->GetTypeId() == TYPEID_UNIT && Passenger->GetTypeId() == TYPEID_PLAYER && - Seat->second.SeatInfo->Flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) + Seat->second.SeatInfo->Flags[0] & VEHICLE_SEAT_FLAG_CAN_CONTROL) ASSERT(Target->GetBase()->SetCharmedBy(Passenger, CHARM_TYPE_VEHICLE)); // SMSG_CLIENT_CONTROL Passenger->SendClearTarget(); // SMSG_BREAK_TARGET diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index dbaaa3b7b9f..6433004c744 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -65,6 +65,7 @@ class TC_GAME_API Vehicle : public TransportBase void SetLastShootPos(Position const& pos) { _lastShootPos.Relocate(pos); } Position const& GetLastShootPos() const { return _lastShootPos; } + SeatMap::iterator GetSeatIteratorForPassenger(Unit* passenger); SeatMap Seats; ///< The collection of all seats on the vehicle. Including vacant ones. VehicleSeatEntry const* GetSeatForPassenger(Unit const* passenger) const; @@ -83,7 +84,6 @@ class TC_GAME_API Vehicle : public TransportBase STATUS_UNINSTALLING, }; - SeatMap::iterator GetSeatIteratorForPassenger(Unit* passenger); void InitMovementInfoForBase(); /// This method transforms supplied transport offsets into global coordinates diff --git a/src/server/game/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp index 5a25f91876e..233fc1fa311 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; @@ -439,13 +441,13 @@ void Garrison::CancelBuildingConstruction(uint32 garrPlotInstanceId) if (constructing->Level > 1) { // Restore previous level building - GarrBuildingEntry const* restored = sGarrisonMgr.GetPreviousLevelBuilding(constructing->Type, constructing->Level); + uint32 restored = sGarrisonMgr.GetPreviousLevelBuildingId(constructing->Type, constructing->Level); ASSERT(restored); WorldPackets::Garrison::GarrisonPlaceBuildingResult placeBuildingResult; placeBuildingResult.Result = GARRISON_SUCCESS; placeBuildingResult.BuildingInfo.GarrPlotInstanceID = garrPlotInstanceId; - placeBuildingResult.BuildingInfo.GarrBuildingID = restored->ID; + placeBuildingResult.BuildingInfo.GarrBuildingID = restored; placeBuildingResult.BuildingInfo.TimeBuilt = time(nullptr); placeBuildingResult.BuildingInfo.Active = true; @@ -505,7 +507,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; @@ -742,9 +744,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)) 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 96936a82d08..24c2c52387a 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" @@ -1734,7 +1734,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); @@ -1826,7 +1826,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; @@ -1857,8 +1857,7 @@ void ObjectMgr::LoadCreatures() if (data.phaseid) { - PhaseEntry const* phase = sPhaseStore.LookupEntry(data.phaseid); - if (!phase) + if (!sPhaseStore.LookupEntry(data.phaseid)) { TC_LOG_ERROR("sql.sql", "Table `creature` have creature (GUID: " UI64FMTD " Entry: %u) with `phaseid` %u does not exist, set to 0", guid, data.id, data.phaseid); data.phaseid = 0; @@ -2047,7 +2046,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); @@ -2144,8 +2143,7 @@ void ObjectMgr::LoadGameobjects() if (data.phaseid) { - PhaseEntry const* phase = sPhaseStore.LookupEntry(data.phaseid); - if (!phase) + if (!sPhaseStore.LookupEntry(data.phaseid)) { TC_LOG_ERROR("sql.sql", "Table `gameobject` have gameobject (GUID: " UI64FMTD " Entry: %u) with `phaseid` %u does not exist, set to 0", guid, data.id, data.phaseid); data.phaseid = 0; @@ -2410,7 +2408,7 @@ void FillDisenchantFields(uint32* disenchantID, uint32* requiredDisenchantSkill, itemTemplate.GetMaxStackSize() > 1 || itemTemplate.GetQuality() < ITEM_QUALITY_UNCOMMON || itemTemplate.GetQuality() > ITEM_QUALITY_EPIC || !(itemTemplate.GetClass() == ITEM_CLASS_ARMOR || itemTemplate.GetClass() == ITEM_CLASS_WEAPON) || - !(Item::GetSpecialPrice(&itemTemplate) || sItemCurrencyCostStore.LookupEntry(itemTemplate.GetId()))) + !(Item::GetSpecialPrice(&itemTemplate) || sDB2Manager.HasItemCurrencyCost(itemTemplate.GetId()))) return; for (uint32 i = 0; i < sItemDisenchantLootStore.GetNumRows(); ++i) @@ -2424,18 +2422,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; } @@ -3448,6 +3446,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 +3479,14 @@ void ObjectMgr::LoadPlayerInfo() { uint32 oldMSTime = getMSTime(); - _playerXPperLevel.resize(sGtOCTLevelExperienceStore.GetTableRowCount() + 1, 0); + _playerXPperLevel.resize(sXpGameTable.GetTableRowCount() + 1, 0); // 0 1 QueryResult result = WorldDatabase.Query("SELECT Level, Experience FROM player_xp_for_level"); // load the DBC's levels at first... - GtOCTLevelExperienceEntry const* exp; - for (uint32 level = 0; level < sGtOCTLevelExperienceStore.GetTableRowCount(); ++level) - { - exp = sGtOCTLevelExperienceStore.EvaluateTable(level, 0); - _playerXPperLevel[level + 1] = exp->Data; - } + for (uint32 level = 0; level < sXpGameTable.GetTableRowCount(); ++level) + _playerXPperLevel[level + 1] = sXpGameTable.GetRow(level)->Total; uint32 count = 0; @@ -3531,7 +3531,7 @@ void ObjectMgr::LoadPlayerInfo() } } -void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& baseHP, uint32& baseMana) const +void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& baseMana) const { if (level < 1 || class_ >= MAX_CLASSES) return; @@ -3539,17 +3539,14 @@ void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& base if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); - GtOCTBaseHPByClassEntry const* hp = sGtOCTBaseHPByClassStore.EvaluateTable(level - 1, class_ - 1); - GtOCTBaseMPByClassEntry const* mp = sGtOCTBaseMPByClassStore.EvaluateTable(level - 1, class_ - 1); - - if (!hp || !mp) + GtBaseMPEntry const* mp = sBaseMPGameTable.GetRow(level); + if (!mp) { TC_LOG_ERROR("misc", "Tried to get non-existant Class-Level combination data for base hp/mp. Class %u Level %u", class_, level); return; } - baseHP = uint32(hp->ratio); - baseMana = uint32(mp->ratio); + baseMana = uint32(GetGameTableColumnForClass(mp, class_)); } void ObjectMgr::GetPlayerLevelInfo(uint32 race, uint32 class_, uint8 level, PlayerLevelInfo* info) const @@ -3582,63 +3579,54 @@ void ObjectMgr::BuildPlayerLevelInfo(uint8 race, uint8 _class, uint8 level, Play info->stats[STAT_STAMINA] += (lvl > 23 ? 2: (lvl > 1 ? 1: 0)); info->stats[STAT_AGILITY] += (lvl > 36 ? 1: (lvl > 6 && (lvl%2) ? 1: 0)); info->stats[STAT_INTELLECT] += (lvl > 9 && !(lvl%2) ? 1: 0); - info->stats[STAT_SPIRIT] += (lvl > 9 && !(lvl%2) ? 1: 0); break; case CLASS_PALADIN: info->stats[STAT_STRENGTH] += (lvl > 3 ? 1: 0); info->stats[STAT_STAMINA] += (lvl > 33 ? 2: (lvl > 1 ? 1: 0)); info->stats[STAT_AGILITY] += (lvl > 38 ? 1: (lvl > 7 && !(lvl%2) ? 1: 0)); info->stats[STAT_INTELLECT] += (lvl > 6 && (lvl%2) ? 1: 0); - info->stats[STAT_SPIRIT] += (lvl > 7 ? 1: 0); break; case CLASS_HUNTER: info->stats[STAT_STRENGTH] += (lvl > 4 ? 1: 0); info->stats[STAT_STAMINA] += (lvl > 4 ? 1: 0); info->stats[STAT_AGILITY] += (lvl > 33 ? 2: (lvl > 1 ? 1: 0)); info->stats[STAT_INTELLECT] += (lvl > 8 && (lvl%2) ? 1: 0); - info->stats[STAT_SPIRIT] += (lvl > 38 ? 1: (lvl > 9 && !(lvl%2) ? 1: 0)); break; case CLASS_ROGUE: info->stats[STAT_STRENGTH] += (lvl > 5 ? 1: 0); info->stats[STAT_STAMINA] += (lvl > 4 ? 1: 0); info->stats[STAT_AGILITY] += (lvl > 16 ? 2: (lvl > 1 ? 1: 0)); info->stats[STAT_INTELLECT] += (lvl > 8 && !(lvl%2) ? 1: 0); - info->stats[STAT_SPIRIT] += (lvl > 38 ? 1: (lvl > 9 && !(lvl%2) ? 1: 0)); break; case CLASS_PRIEST: info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl%2) ? 1: 0); info->stats[STAT_STAMINA] += (lvl > 5 ? 1: 0); info->stats[STAT_AGILITY] += (lvl > 38 ? 1: (lvl > 8 && (lvl%2) ? 1: 0)); info->stats[STAT_INTELLECT] += (lvl > 22 ? 2: (lvl > 1 ? 1: 0)); - info->stats[STAT_SPIRIT] += (lvl > 3 ? 1: 0); break; case CLASS_SHAMAN: info->stats[STAT_STRENGTH] += (lvl > 34 ? 1: (lvl > 6 && (lvl%2) ? 1: 0)); info->stats[STAT_STAMINA] += (lvl > 4 ? 1: 0); info->stats[STAT_AGILITY] += (lvl > 7 && !(lvl%2) ? 1: 0); info->stats[STAT_INTELLECT] += (lvl > 5 ? 1: 0); - info->stats[STAT_SPIRIT] += (lvl > 4 ? 1: 0); break; case CLASS_MAGE: info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl%2) ? 1: 0); info->stats[STAT_STAMINA] += (lvl > 5 ? 1: 0); info->stats[STAT_AGILITY] += (lvl > 9 && !(lvl%2) ? 1: 0); info->stats[STAT_INTELLECT] += (lvl > 24 ? 2: (lvl > 1 ? 1: 0)); - info->stats[STAT_SPIRIT] += (lvl > 33 ? 2: (lvl > 2 ? 1: 0)); break; case CLASS_WARLOCK: info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl%2) ? 1: 0); info->stats[STAT_STAMINA] += (lvl > 38 ? 2: (lvl > 3 ? 1: 0)); info->stats[STAT_AGILITY] += (lvl > 9 && !(lvl%2) ? 1: 0); info->stats[STAT_INTELLECT] += (lvl > 33 ? 2: (lvl > 2 ? 1: 0)); - info->stats[STAT_SPIRIT] += (lvl > 38 ? 2: (lvl > 3 ? 1: 0)); break; case CLASS_DRUID: info->stats[STAT_STRENGTH] += (lvl > 38 ? 2: (lvl > 6 && (lvl%2) ? 1: 0)); info->stats[STAT_STAMINA] += (lvl > 32 ? 2: (lvl > 4 ? 1: 0)); info->stats[STAT_AGILITY] += (lvl > 38 ? 2: (lvl > 8 && (lvl%2) ? 1: 0)); info->stats[STAT_INTELLECT] += (lvl > 38 ? 3: (lvl > 4 ? 1: 0)); - info->stats[STAT_SPIRIT] += (lvl > 38 ? 3: (lvl > 5 ? 1: 0)); } } } @@ -4388,7 +4376,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 +4386,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 +5125,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 +5143,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 +5260,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 +5277,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 +5302,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 +5312,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 +5327,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 +6220,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 +6725,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 +6768,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 +6875,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 @@ -8703,25 +8692,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 +9006,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..7883a445ebd 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1935,7 +1935,7 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* if (!reference) return ERR_BATTLEGROUND_JOIN_FAILED; - PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bgOrTemplate->GetMapId(), reference->getLevel()); + PvPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bgOrTemplate->GetMapId(), reference->getLevel()); if (!bracketEntry) return ERR_BATTLEGROUND_JOIN_FAILED; @@ -1959,7 +1959,7 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* return ERR_BATTLEGROUND_JOIN_TIMED_OUT; } // not in the same battleground level braket, don't let join - PvPDifficultyEntry const* memberBracketEntry = GetBattlegroundBracketByLevel(bracketEntry->MapID, member->getLevel()); + PvPDifficultyEntry const* memberBracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bracketEntry->MapID, member->getLevel()); if (memberBracketEntry != bracketEntry) return ERR_BATTLEGROUND_JOIN_RANGE_INDEX; // don't let join rated matches if the arena team id doesn't match @@ -2082,7 +2082,7 @@ Difficulty Group::GetDifficultyID(MapEntry const* mapEntry) const if (!mapEntry->IsRaid()) return m_dungeonDifficulty; - MapDifficultyEntry const* defaultDifficulty = GetDefaultMapDifficulty(mapEntry->ID); + MapDifficultyEntry const* defaultDifficulty = sDB2Manager.GetDefaultMapDifficulty(mapEntry->ID); if (!defaultDifficulty) return m_legacyRaidDifficulty; @@ -2212,7 +2212,7 @@ InstanceGroupBind* Group::GetBoundInstance(MapEntry const* mapEntry) InstanceGroupBind* Group::GetBoundInstance(Difficulty difficulty, uint32 mapId) { // some instances only have one difficulty - GetDownscaledMapDifficultyData(mapId, difficulty); + sDB2Manager.GetDownscaledMapDifficultyData(mapId, difficulty); BoundInstancesMap::iterator itr = m_boundInstances[difficulty].find(mapId); if (itr != m_boundInstances[difficulty].end()) diff --git a/src/server/game/Groups/GroupMgr.cpp b/src/server/game/Groups/GroupMgr.cpp index c6046c3a9aa..ad112c59a61 100644 --- a/src/server/game/Groups/GroupMgr.cpp +++ b/src/server/game/Groups/GroupMgr.cpp @@ -19,7 +19,6 @@ #include "GroupMgr.h" #include "InstanceSaveMgr.h" #include "World.h" -#include "DBCStores.h" GroupMgr::GroupMgr() { diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 86a59f04f23..9c217ea6888 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[25].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()); 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..20cbf22d40e 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -403,8 +403,8 @@ void GuildMgr::LoadGuilds() // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, transmogrification, upgradeId, enchantIllusion, - // 17 18 19 20 21 22 23 - // battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid + // 17 18 19 20 21 22 23 24 25 26 + // battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, ig.gemItemId1, ig.gemItemId2, ig.gemItemId3, guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid PreparedQueryResult result = CharacterDatabase.Query(CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_BANK_ITEMS)); if (!result) @@ -417,7 +417,7 @@ void GuildMgr::LoadGuilds() do { Field* fields = result->Fetch(); - uint64 guildId = fields[21].GetUInt64(); + uint64 guildId = fields[24].GetUInt64(); if (Guild* guild = GetGuildById(guildId)) guild->LoadBankItemFromDB(fields); diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index 43a0baa75a7..1fa50f1493e 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -55,7 +55,7 @@ void WorldSession::SendAuctionHello(ObjectGuid guid, Creature* unit) return; } - AuctionHouseEntry const* ahEntry = AuctionHouseMgr::GetAuctionHouseEntry(unit->getFaction()); + AuctionHouseEntry const* ahEntry = AuctionHouseMgr::GetAuctionHouseEntry(unit->getFaction(), nullptr); if (!ahEntry) return; @@ -139,7 +139,8 @@ void WorldSession::HandleAuctionSellItem(WorldPackets::AuctionHouse::AuctionSell return; } - AuctionHouseEntry const* auctionHouseEntry = AuctionHouseMgr::GetAuctionHouseEntry(creature->getFaction()); + uint32 houseId = 0; + AuctionHouseEntry const* auctionHouseEntry = AuctionHouseMgr::GetAuctionHouseEntry(creature->getFaction(), &houseId); if (!auctionHouseEntry) { TC_LOG_DEBUG("network", "WORLD: HandleAuctionSellItem - Unit (%s) has wrong faction.", packet.Auctioneer.ToString().c_str()); diff --git a/src/server/game/Handlers/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/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index c1455d355d7..b8c6072f60e 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -200,10 +200,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); @@ -268,6 +264,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(); @@ -280,7 +278,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()); @@ -301,6 +299,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()); @@ -334,6 +335,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) { @@ -1254,22 +1256,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)) @@ -1438,12 +1424,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); @@ -1459,7 +1458,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 @@ -1488,28 +1487,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)) @@ -1545,7 +1522,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; @@ -1607,7 +1585,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); } @@ -1867,29 +1848,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); } @@ -2545,12 +2514,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/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 8c7f8190e09..b5c8e6bdc67 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -901,29 +901,21 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) return; } - // tried to put normal gem in meta socket - if (itemTarget->GetSocketColor(i) == SOCKET_COLOR_META && GemProps[i]->Type != SOCKET_COLOR_META) - return; - - // tried to put meta gem in normal socket - if (itemTarget->GetSocketColor(i) != SOCKET_COLOR_META && GemProps[i]->Type == SOCKET_COLOR_META) - return; - - // tried to put normal gem in cogwheel socket - if (itemTarget->GetSocketColor(i) == SOCKET_COLOR_COGWHEEL && GemProps[i]->Type != SOCKET_COLOR_COGWHEEL) - return; - - // tried to put cogwheel gem in normal socket - if (itemTarget->GetSocketColor(i) != SOCKET_COLOR_COGWHEEL && GemProps[i]->Type == SOCKET_COLOR_COGWHEEL) - return; + // Gem must match socket color + if (SocketColorToGemTypeMask[itemTarget->GetSocketColor(i)] != GemProps[i]->Type) + { + // unless its red, blue, yellow or prismatic + if (!(SocketColorToGemTypeMask[itemTarget->GetSocketColor(i)] & SOCKET_COLOR_PRISMATIC) || !(GemProps[i]->Type & SOCKET_COLOR_PRISMATIC)) + return; + } } uint32 GemEnchants[MAX_GEM_SOCKETS]; - uint32 OldEnchants[MAX_GEM_SOCKETS]; + uint32 oldGemItemIds[MAX_GEM_SOCKETS]; for (int i = 0; i < MAX_GEM_SOCKETS; ++i) //get new and old enchantments { GemEnchants[i] = (GemProps[i]) ? GemProps[i]->EnchantID : 0; - OldEnchants[i] = itemTarget->GetEnchantmentId(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT+i)); + oldGemItemIds[i] = itemTarget->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size() > i ? itemTarget->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS)[i] : 0; } // check unique-equipped conditions @@ -951,15 +943,12 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) return; } } - else if (OldEnchants[j]) + else if (oldGemItemIds[j]) { - if (SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(OldEnchants[j])) + if (iGemProto->GetId() == oldGemItemIds[j]) { - if (iGemProto->GetId() == enchantEntry->SRCItemID) - { - _player->SendEquipError(EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED, itemTarget, NULL); - return; - } + _player->SendEquipError(EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED, itemTarget, NULL); + return; } } } @@ -980,13 +969,12 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) if (iGemProto->GetItemLimitCategory() == Gems[j]->GetTemplate()->GetItemLimitCategory()) ++limit_newcount; } - else if (OldEnchants[j]) + else if (oldGemItemIds[j]) { // existing gem - if (SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(OldEnchants[j])) - if (ItemTemplate const* jProto = sObjectMgr->GetItemTemplate(enchantEntry->SRCItemID)) - if (iGemProto->GetItemLimitCategory() == jProto->GetItemLimitCategory()) - ++limit_newcount; + if (ItemTemplate const* jProto = sObjectMgr->GetItemTemplate(oldGemItemIds[j])) + if (iGemProto->GetItemLimitCategory() == jProto->GetItemLimitCategory()) + ++limit_newcount; } } @@ -1018,16 +1006,25 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + MAX_GEM_SOCKETS; ++enchant_slot) _player->ApplyEnchantment(itemTarget, EnchantmentSlot(enchant_slot), false); + uint32 reqGemSlots = 0; + for (uint32 i = 0; i < MAX_GEM_SOCKETS; ++i) + if (Gems[i]) + reqGemSlots = i + 1; + + while (itemTarget->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size() < reqGemSlots) + itemTarget->AddDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, 0); + for (int i = 0; i < MAX_GEM_SOCKETS; ++i) { - if (GemEnchants[i]) + if (Item* guidItem = _player->GetItemByGuid(socketGems.GemItem[i])) { - itemTarget->SetEnchantment(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT+i), GemEnchants[i], 0, 0, _player->GetGUID()); - if (Item* guidItem = _player->GetItemByGuid(socketGems.GemItem[i])) - { - uint32 gemCount = 1; - _player->DestroyItemCount(guidItem, gemCount, true); - } + itemTarget->SetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, i, guidItem->GetEntry()); + + if (GemEnchants[i]) + itemTarget->SetEnchantment(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT+i), GemEnchants[i], 0, 0, _player->GetGUID()); + + uint32 gemCount = 1; + _player->DestroyItemCount(guidItem, gemCount, true); } } @@ -1281,14 +1278,19 @@ void WorldSession::HandleUseCritterItem(WorldPackets::Item::UseCritterItem& useC if (!item) return; - ItemToBattlePetSpeciesEntry const* itemToBattlePetSpecies = sItemToBattlePetSpeciesStore.LookupEntry(item->GetEntry()); - if (!itemToBattlePetSpecies) + if (item->GetTemplate()->Effects.size() < 2) return; - BattlePetSpeciesEntry const* battlePetSpecies = sBattlePetSpeciesStore.LookupEntry(itemToBattlePetSpecies->BattlePetSpeciesID); - if (!battlePetSpecies) - return; + uint32 spellToLearn = item->GetTemplate()->Effects[1]->SpellID; + for (BattlePetSpeciesEntry const* entry : sBattlePetSpeciesStore) + { + if (entry->SummonSpellID == spellToLearn) + { + GetBattlePetMgr()->AddPet(entry->ID, entry->CreatureID, BattlePetMgr::RollPetBreed(entry->ID), BattlePetMgr::GetDefaultPetQuality(entry->ID)); + _player->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..69bafe9bc11 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -26,7 +26,6 @@ #include "Player.h" #include "MailPackets.h" #include "Language.h" -#include "DBCStores.h" #include "Item.h" #include "AccountMgr.h" #include "BattlenetAccountMgr.h" diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 382b8d70f38..afcced346df 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 0f3dec166c3..7749f0f4ac4 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -58,7 +58,6 @@ void WorldSession::SendQueryTimeResponse() { WorldPackets::Query::QueryTimeResponse queryTimeResponse; queryTimeResponse.CurrentTime = time(nullptr); - queryTimeResponse.TimeOutRequest = sWorld->GetNextDailyQuestsResetTime() - queryTimeResponse.CurrentTime; SendPacket(queryTimeResponse.Write()); } @@ -129,7 +128,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)) @@ -157,19 +155,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 @@ -177,7 +176,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(); @@ -185,7 +184,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)) @@ -198,7 +197,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); } } } @@ -206,6 +205,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); @@ -244,55 +244,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..8ce4a88ef5a 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -19,7 +19,6 @@ #include "WorldSession.h" #include "Common.h" #include "Config.h" -#include "DBCStores.h" #include "GameObjectAI.h" #include "GameObjectPackets.h" #include "GuildMgr.h" @@ -301,7 +300,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 +514,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,7 +537,7 @@ 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)) || 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/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/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index 4d979ecb9b3..3a5c65a0932 100644 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -376,7 +376,7 @@ void InstanceSaveManager::LoadResetTimes() Difficulty difficulty = Difficulty(fields[1].GetUInt8()); uint64 oldresettime = fields[2].GetUInt32(); - MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapid, difficulty); + MapDifficultyEntry const* mapDiff = sDB2Manager.GetMapDifficultyData(mapid, difficulty); if (!mapDiff) { TC_LOG_ERROR("misc", "InstanceSaveManager::LoadResetTimes: invalid mapid(%u)/difficulty(%u) pair in instance_reset!", mapid, difficulty); @@ -395,7 +395,7 @@ void InstanceSaveManager::LoadResetTimes() // calculate new global reset times for expired instances and those that have never been reset yet // add the global reset times to the priority queue - for (auto& mapDifficultyPair : sMapDifficultyMap) + for (auto& mapDifficultyPair : sDB2Manager.GetMapDifficulties()) { uint32 mapid = mapDifficultyPair.first; @@ -403,11 +403,11 @@ void InstanceSaveManager::LoadResetTimes() { Difficulty difficulty = Difficulty(difficultyPair.first); MapDifficultyEntry const* mapDiff = difficultyPair.second; - if (!mapDiff->RaidDuration) + if (!mapDiff->GetRaidDuration()) continue; // the reset_delay must be at least one day - uint32 period = uint32(((mapDiff->RaidDuration * sWorld->getRate(RATE_INSTANCE_RESET_TIME)) / DAY) * DAY); + uint32 period = uint32(((mapDiff->GetRaidDuration() * sWorld->getRate(RATE_INSTANCE_RESET_TIME)) / DAY) * DAY); if (period < DAY) period = DAY; @@ -447,15 +447,15 @@ void InstanceSaveManager::LoadResetTimes() time_t InstanceSaveManager::GetSubsequentResetTime(uint32 mapid, Difficulty difficulty, time_t resetTime) const { - MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapid, difficulty); - if (!mapDiff || !mapDiff->RaidDuration) + MapDifficultyEntry const* mapDiff = sDB2Manager.GetMapDifficultyData(mapid, difficulty); + if (!mapDiff || !mapDiff->GetRaidDuration()) { TC_LOG_ERROR("misc", "InstanceSaveManager::GetSubsequentResetTime: not valid difficulty or no reset delay for map %u", mapid); return 0; } time_t diff = sWorld->getIntConfig(CONFIG_INSTANCE_RESET_TIME_HOUR) * HOUR; - time_t period = uint32(((mapDiff->RaidDuration * sWorld->getRate(RATE_INSTANCE_RESET_TIME)) / DAY) * DAY); + time_t period = uint32(((mapDiff->GetRaidDuration() * sWorld->getRate(RATE_INSTANCE_RESET_TIME)) / DAY) * DAY); if (period < DAY) period = DAY; @@ -501,7 +501,7 @@ void InstanceSaveManager::ScheduleReset(bool add, time_t time, InstResetEvent ev void InstanceSaveManager::ForceGlobalReset(uint32 mapId, Difficulty difficulty) { - if (!GetDownscaledMapDifficultyData(mapId, difficulty)) + if (!sDB2Manager.GetDownscaledMapDifficultyData(mapId, difficulty)) return; // remove currently scheduled reset times ScheduleReset(false, 0, InstResetEvent(1, mapId, difficulty, 0)); @@ -627,7 +627,7 @@ void InstanceSaveManager::_ResetOrWarnAll(uint32 mapid, Difficulty difficulty, b MapEntry const* mapEntry = sMapStore.LookupEntry(mapid); if (!mapEntry->Instanceable()) return; - TC_LOG_DEBUG("misc", "InstanceSaveManager::ResetOrWarnAll: Processing map %s (%u) on difficulty %u (warn? %u)", mapEntry->MapName_lang, mapid, uint8(difficulty), warn); + TC_LOG_DEBUG("misc", "InstanceSaveManager::ResetOrWarnAll: Processing map %s (%u) on difficulty %u (warn? %u)", mapEntry->MapName->Str[sWorld->GetDefaultDbcLocale()], mapid, uint8(difficulty), warn); time_t now = time(NULL); diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index dc008aa881e..a8d347a57a7 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -677,11 +677,12 @@ void InstanceScript::UpdateEncounterState(EncounterCreditType type, uint32 credi DungeonEncounter const* encounter = *itr; if (encounter->creditType == type && encounter->creditEntry == creditEntry) { - completedEncounters |= 1 << encounter->dbcEntry->OrderIndex; + completedEncounters |= 1 << encounter->dbcEntry->Bit; if (encounter->lastEncounterDungeon) { dungeonId = encounter->lastEncounterDungeon; - TC_LOG_DEBUG("lfg", "UpdateEncounterState: Instance %s (instanceId %u) completed encounter %s. Credit Dungeon: %u", instance->GetMapName(), instance->GetInstanceId(), encounter->dbcEntry->Name_lang, dungeonId); + TC_LOG_DEBUG("lfg", "UpdateEncounterState: Instance %s (instanceId %u) completed encounter %s. Credit Dungeon: %u", + instance->GetMapName(), instance->GetInstanceId(), encounter->dbcEntry->Name->Str[sWorld->GetDefaultDbcLocale()], dungeonId); break; } } diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index a7e11e81970..f110425c1a4 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -1557,7 +1557,7 @@ void LoadLootTemplates_Disenchant() if (!disenchant) continue; - uint32 lootid = disenchant->ID; + uint32 lootid = i; if (lootIdSet.find(lootid) == lootIdSet.end()) LootTemplates_Disenchant.ReportNonExistingId(lootid); else @@ -1586,10 +1586,9 @@ void LoadLootTemplates_Fishing() uint32 count = LootTemplates_Fishing.LoadAndCollectLootIds(lootIdSet); // remove real entries and check existence loot - for (uint32 i = 1; i < sAreaTableStore.GetNumRows(); ++i) - if (AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(i)) - if (lootIdSet.find(areaEntry->ID) != lootIdSet.end()) - lootIdSet.erase(areaEntry->ID); + for (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 81aa0fd174c..0b0868eddf4 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 4a69eadb6b1..7320119f739 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 @@ -851,9 +855,9 @@ enum SpellAttr13 #define MAX_TALENT_GROUP 1 #define MIN_TALENT_GROUPS 1 #define MAX_TALENT_GROUPS 2 -#define MAX_GLYPH_SLOT_INDEX 6 #define MIN_SPECIALIZATION_LEVEL 10 #define MAX_SPECIALIZATIONS 4 +#define PET_SPEC_OVERRIDE_CLASS_INDEX MAX_CLASSES // Custom values enum SpellClickUserTypes @@ -931,6 +935,18 @@ enum CharacterCustomizeFlags CHAR_CUSTOMIZE_FLAG_RACE = 0x00100000 // name, gender, race, etc... }; +enum CharacterFlags3 : uint32 +{ + CHARACTER_FLAG_3_LOCKED_BY_REVOKED_VAS_TRANSACTION = 0x00100000, + CHARACTER_FLAG_3_LOCKED_BY_REVOKED_CHARACTER_UPGRADE = 0x80000000, +}; + +enum CharacterFlags4 : uint32 +{ + CHARACTER_FLAG_4_TRIAL_BOOST = 0x00000080, + CHARACTER_FLAG_4_TRIAL_BOOST_LOCKED = 0x00040000, +}; + enum CharacterSlot { SLOT_HEAD = 0, @@ -1259,10 +1275,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 +1336,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 +1392,499 @@ 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_UNKNOWN = 278, + + // 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. }; enum StealthType @@ -2013,6 +2216,7 @@ enum Targets TARGET_UNK_145 = 145, TARGET_UNK_146 = 146, TARGET_UNK_147 = 147, + TARGET_UNK_148 = 148, TOTAL_SPELL_TARGETS }; @@ -2129,6 +2333,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 @@ -4203,11 +4408,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/PrecompiledHeaders/gamePCH.h b/src/server/game/PrecompiledHeaders/gamePCH.h index 8a407de3a82..7b0dad8f33d 100644 --- a/src/server/game/PrecompiledHeaders/gamePCH.h +++ b/src/server/game/PrecompiledHeaders/gamePCH.h @@ -8,4 +8,4 @@ #include "Opcodes.h" #include "SharedDefines.h" #include "ObjectMgr.h" -#include "Packets/AllPackets.h" +//#include "Packets/AllPackets.h" 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 5d3297b009d..70f0e717e7c 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -20,7 +20,6 @@ #include "ScriptReloadMgr.h" #include "Config.h" #include "DatabaseEnv.h" -#include "DBCStores.h" #include "ObjectMgr.h" #include "OutdoorPvPMgr.h" #include "ScriptSystem.h" diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index c3deab43ee6..17583bd9b5e 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -21,7 +21,6 @@ #include "Common.h" #include <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) diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp index 2540b9ce05a..69cb22659cd 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.cpp +++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp @@ -28,8 +28,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; @@ -37,22 +38,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() @@ -80,6 +72,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); @@ -90,6 +100,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); @@ -103,18 +119,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); @@ -132,18 +136,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 f8716521801..f17e079f0fb 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.h +++ b/src/server/game/Server/Packets/AuthenticationPackets.h @@ -64,7 +64,6 @@ namespace WorldPackets std::array<uint8, 16> LocalChallenge; std::array<uint8, DigestLength> Digest; uint64 DosResponse = 0; - ByteBuffer AddonInfo; std::string RealmJoinTicket; bool UseIPv6 = false; }; @@ -210,6 +209,14 @@ namespace WorldPackets ConnectToSerial Serial = ConnectToSerial::None; uint8 Con = 0; }; + + class EnableEncryption final : public ServerPacket + { + public: + EnableEncryption() : ServerPacket(SMSG_ENABLE_ENCRYPTION, 0) { } + + WorldPacket const* Write() override { return &_worldPacket; } + }; } } diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index 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/CombatPackets.h b/src/server/game/Server/Packets/CombatPackets.h index 5554ac9b0b5..4a8eddc2562 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 diff --git a/src/server/game/Server/Packets/GarrisonPackets.h b/src/server/game/Server/Packets/GarrisonPackets.h index a5ce42d7488..2b92ab1311f 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.h +++ b/src/server/game/Server/Packets/GarrisonPackets.h @@ -22,7 +22,8 @@ #include "ObjectGuid.h" #include "Position.h" #include "PacketUtilities.h" -#include "DB2Structure.h" + +struct GarrAbilityEntry; namespace WorldPackets { diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp index 21626fd8640..8cc97ca2557 100644 --- a/src/server/game/Server/Packets/GuildPackets.cpp +++ b/src/server/game/Server/Packets/GuildPackets.cpp @@ -69,14 +69,13 @@ WorldPacket const* WorldPackets::Guild::GuildRoster::Write() _worldPacket.AppendPackedTime(CreateDate); _worldPacket << GuildFlags; _worldPacket << uint32(MemberData.size()); + _worldPacket.WriteBits(WelcomeText.length(), 10); + _worldPacket.WriteBits(InfoText.length(), 11); + _worldPacket.FlushBits(); for (GuildRosterMemberData const& member : MemberData) _worldPacket << member; - _worldPacket.WriteBits(WelcomeText.length(), 10); - _worldPacket.WriteBits(InfoText.length(), 10); - _worldPacket.FlushBits(); - _worldPacket.WriteString(WelcomeText); _worldPacket.WriteString(InfoText); diff --git a/src/server/game/Server/Packets/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..ff8337c88c4 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,59 @@ 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 << uint32(movementSpline.Points.size()); + data << uint8(movementSpline.Mode); + data << uint8(movementSpline.VehicleExitVoluntary); data << movementSpline.TransportGUID; - data << movementSpline.VehicleSeat; - data << int32(movementSpline.PackedDeltas.size()); + data << int8(movementSpline.VehicleSeat); + data << uint32(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.WriteBits(movementSpline.Face, 2); 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; + if (movementSpline.SpellEffectExtraData) + data << *movementSpline.SpellEffectExtraData; return data; } @@ -254,16 +268,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 +285,43 @@ 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 + 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 << uint32(moveSpline.getPath().size()); + data.append<G3D::Vector3>(&moveSpline.getPath()[0], moveSpline.getPath().size()); + 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(uint8(moveSpline.spline.mode()), 2); // Mode + data.WriteBit(0); // HasSplineFilter + data.WriteBit(0); // HasSpellEffectExtraData + data.FlushBits(); - data.WriteBit(0); // HasSplineFilterKey - - data << int32(moveSpline.timePassed()); // Elapsed - data << uint32(moveSpline.Duration()); // Duration - data << float(1.0f); // DurationModifier - data << float(1.0f); // NextDurationModifier + //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 +340,13 @@ void WorldPackets::Movement::CommonMovement::WriteCreateObjectSplineDataBlock(:: if (HasSpecialTime) data << uint32(moveSpline.effect_start_time); // SpecialTime - //if (HasSplineFilterKey) + //if (HasSpellEffectExtraData) //{ - // data << uint32(FilterKeysCount); - // for (var i = 0; i < PointsCount; ++i) - // { - // data << float(In); - // data << float(Out); - // } - - // data.WriteBits(FilterFlags, 2); + // data << ObjectGuid(); + // data << uint32(); + // data << uint32(); + // data << uint32(); //} - - data.append<G3D::Vector3>(&moveSpline.getPath()[0], PointsCount); // Points } } @@ -353,25 +358,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 +377,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 +490,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 +498,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 +539,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 +667,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 +730,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..33721e23d5b 100644 --- a/src/server/game/Server/Packets/NPCPackets.cpp +++ b/src/server/game/Server/Packets/NPCPackets.cpp @@ -142,15 +142,6 @@ WorldPacket const* WorldPackets::NPC::PlayerTabardVendorActivate::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::NPC::SuppressNPCGreetings::Write() -{ - _worldPacket << UnitGUID; - _worldPacket.WriteBit(SuppressNPCGreeting); - _worldPacket.FlushBits(); - - return &_worldPacket; -} - WorldPacket const* WorldPackets::NPC::GossipPOI::Write() { _worldPacket.WriteBits(Flags, 14); diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h index 98fa079afaa..b18ce340ae0 100644 --- a/src/server/game/Server/Packets/NPCPackets.h +++ b/src/server/game/Server/Packets/NPCPackets.h @@ -172,17 +172,6 @@ namespace WorldPackets ObjectGuid Vendor; }; - class SuppressNPCGreetings final : public ServerPacket - { - public: - SuppressNPCGreetings() : ServerPacket(SMSG_SUPPRESS_NPC_GREETINGS, 16 + 1) { } - - WorldPacket const* Write() override; - - ObjectGuid UnitGUID; - bool SuppressNPCGreeting = false; - }; - class GossipPOI final : public ServerPacket { public: diff --git a/src/server/game/Server/Packets/PetPackets.cpp b/src/server/game/Server/Packets/PetPackets.cpp index 8bbf0b051e4..cb5593167f0 100644 --- a/src/server/game/Server/Packets/PetPackets.cpp +++ b/src/server/game/Server/Packets/PetPackets.cpp @@ -186,12 +186,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..813d82d4827 100644 --- a/src/server/game/Server/Packets/PetPackets.h +++ b/src/server/game/Server/Packets/PetPackets.h @@ -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/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 aa78cae6deb..36ce28478f0 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; } @@ -98,64 +102,95 @@ void WorldPackets::Spells::SpellCastLogData::Initialize(Unit const* unit) 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.WriteBit(false); - // data << float // Unk data if bit is true + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SandboxScalingData const& unknown) +{ + data.WriteBits(unknown.Type, 3); + data << int16(unknown.PlayerLevelDelta); + data << uint8(unknown.TargetLevel); + data << uint8(unknown.Expansion); + data << uint8(unknown.Class); + data << uint8(unknown.TargetMinScalingLevel); + data << uint8(unknown.TargetMaxScalingLevel); + data << int8(unknown.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 +209,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 +228,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 +250,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 +293,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 +312,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 +332,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 +343,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 +361,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 +401,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 +432,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; } @@ -419,9 +467,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(); @@ -431,7 +483,7 @@ WorldPacket const* WorldPackets::Spells::LearnedSpells::Write() WorldPacket const* WorldPackets::Spells::SpellFailure::Write() { _worldPacket << CasterUnit; - _worldPacket << uint8(CastID); + _worldPacket << CastID; _worldPacket << int32(SpellID); _worldPacket << uint32(SpelXSpellVisualID); _worldPacket << uint16(Reason); @@ -442,8 +494,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; @@ -451,11 +504,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; } @@ -665,8 +730,8 @@ WorldPacket const* WorldPackets::Spells::PlaySpellVisualKit::Write() void WorldPackets::Spells::CancelCast::Read() { - _worldPacket >> SpellID; _worldPacket >> CastID; + _worldPacket >> SpellID; } void WorldPackets::Spells::OpenItem::Read() @@ -717,15 +782,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); @@ -747,21 +809,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; } @@ -769,7 +831,7 @@ WorldPacket const* WorldPackets::Spells::MirrorImageComponentedData::Write() WorldPacket const* WorldPackets::Spells::MirrorImageCreatureData::Write() { _worldPacket << UnitGUID; - _worldPacket << DisplayID; + _worldPacket << int32(DisplayID); return &_worldPacket; } @@ -780,22 +842,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; } @@ -811,7 +860,7 @@ void WorldPackets::Spells::MissileTrajectoryCollision::Read() WorldPacket const* WorldPackets::Spells::NotifyMissileTrajectoryCollision::Write() { _worldPacket << Caster; - _worldPacket << uint8(CastID); + _worldPacket << CastID; _worldPacket << CollisionPos; return &_worldPacket; @@ -831,9 +880,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 b1cb39251de..901ebdd6b87 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -120,6 +120,7 @@ namespace WorldPackets bool InitialLogin = false; std::vector<uint32> KnownSpells; + std::vector<uint32> FavoriteSpells; // tradeskill recipes }; class UpdateActionButtons final : public ServerPacket @@ -173,7 +174,7 @@ namespace WorldPackets struct SpellCastLogData { - int32 Health = 0; + int64 Health = 0; int32 AttackPower = 0; int32 SpellPower = 0; std::vector<SpellLogPowerData> PowerData; @@ -181,10 +182,23 @@ namespace WorldPackets void Initialize(Unit const* unit); }; + struct SandboxScalingData + { + 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 +206,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 +244,7 @@ namespace WorldPackets Optional<TargetLocation> SrcLocation; Optional<TargetLocation> DstLocation; Optional<float> Orientation; + Optional<int32> MapID; std::string Name; }; @@ -246,7 +263,7 @@ namespace WorldPackets struct SpellCastRequest { - uint8 CastID = 0; + ObjectGuid CastID; int32 SpellID = 0; uint32 SpellXSpellVisualID = 0; uint8 SendCastFlags = 0; @@ -292,6 +309,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 +368,8 @@ namespace WorldPackets { ObjectGuid CasterGUID; ObjectGuid CasterUnit; - uint8 CastID = 0; + ObjectGuid CastID; + ObjectGuid OriginalCastID; int32 SpellID = 0; uint32 SpellXSpellVisualID = 0; uint32 CastFlags = 0; @@ -389,6 +418,7 @@ namespace WorldPackets WorldPacket const* Write() override; std::vector<int32> SpellID; + std::vector<int32> FavoriteSpellID; bool SuppressMessaging = false; }; @@ -403,7 +433,7 @@ namespace WorldPackets uint32 SpellID = 0; uint32 SpelXSpellVisualID = 0; uint16 Reason = 0; - uint8 CastID = 0; + ObjectGuid CastID; }; class SpellFailedOther final : public ServerPacket @@ -415,22 +445,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 @@ -659,7 +705,7 @@ namespace WorldPackets void Read() override; uint32 SpellID = 0; - uint8 CastID = 0; + ObjectGuid CastID; }; class OpenItem final : public ClientPacket @@ -763,7 +809,7 @@ namespace WorldPackets WorldPacket const* Write() override; ObjectGuid UnitGUID; - uint32 DisplayID = 0; + int32 DisplayID = 0; uint8 RaceID = 0; uint8 Gender = 0; uint8 ClassID = 0; @@ -772,9 +818,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 @@ -785,7 +832,7 @@ namespace WorldPackets WorldPacket const* Write() override; ObjectGuid UnitGUID; - uint32 DisplayID = 0; + int32 DisplayID = 0; }; class SpellClick final : public ClientPacket @@ -799,31 +846,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 @@ -835,7 +865,7 @@ namespace WorldPackets ObjectGuid Target; int32 SpellID = 0; - uint8 CastID = 0; + ObjectGuid CastID; G3D::Vector3 CollisionPos; }; @@ -847,7 +877,7 @@ namespace WorldPackets WorldPacket const* Write() override; ObjectGuid Caster; - uint8 CastID = 0; + ObjectGuid CastID; G3D::Vector3 CollisionPos; }; diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp index 68b835c85ab..e39182b280f 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,8 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatusGlueScreen::Write() _worldPacket.WriteBit(Unk14); _worldPacket.WriteBit(WillKickFromWorld); _worldPacket.WriteBit(IsExpansionPreorderInStore); + _worldPacket.WriteBit(KioskModeEnabled); + _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.h b/src/server/game/Server/Packets/TaxiPackets.h index c4d4cac3046..0f5bd82d079 100644 --- a/src/server/game/Server/Packets/TaxiPackets.h +++ b/src/server/game/Server/Packets/TaxiPackets.h @@ -20,7 +20,6 @@ #include "Packet.h" #include "ObjectGuid.h" -#include "DB2Structure.h" namespace WorldPackets { diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index a2e4bfe6321..1f9badfbdef 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -120,21 +120,25 @@ 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); DEFINE_HANDLER(CMSG_AUCTION_LIST_BIDDER_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionListBidderItems, &WorldSession::HandleAuctionListBidderItems); - DEFINE_HANDLER(CMSG_AUCTION_LIST_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionListItems, &WorldSession::HandleAuctionListItems); + DEFINE_HANDLER(CMSG_AUCTION_LIST_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionListItems, &WorldSession::HandleAuctionListItems); DEFINE_HANDLER(CMSG_AUCTION_LIST_OWNER_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionListOwnerItems, &WorldSession::HandleAuctionListOwnerItems); DEFINE_HANDLER(CMSG_AUCTION_LIST_PENDING_SALES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionListPendingSales, &WorldSession::HandleAuctionListPendingSales); DEFINE_HANDLER(CMSG_AUCTION_PLACE_BID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionPlaceBid, &WorldSession::HandleAuctionPlaceBid); @@ -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,19 +185,18 @@ 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_BID_ON_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::BlackMarket::BlackMarketBidOnItem, &WorldSession::HandleBlackMarketBidOnItem); DEFINE_HANDLER(CMSG_BLACK_MARKET_OPEN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::BlackMarket::BlackMarketOpen, &WorldSession::HandleBlackMarketOpen); DEFINE_HANDLER(CMSG_BLACK_MARKET_REQUEST_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::BlackMarket::BlackMarketRequestItems, &WorldSession::HandleBlackMarketRequestItems); DEFINE_HANDLER(CMSG_BUG_REPORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::BugReport, &WorldSession::HandleBugReportOpcode); DEFINE_HANDLER(CMSG_BUSY_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::BusyTrade, &WorldSession::HandleBusyTradeOpcode); DEFINE_HANDLER(CMSG_BUY_BACK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::BuyBackItem, &WorldSession::HandleBuybackItem); DEFINE_HANDLER(CMSG_BUY_BANK_SLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Bank::BuyBankSlot, &WorldSession::HandleBuyBankSlotOpcode); - DEFINE_HANDLER(CMSG_BUY_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::BuyItem, &WorldSession::HandleBuyItemOpcode); + DEFINE_HANDLER(CMSG_BUY_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::BuyItem, &WorldSession::HandleBuyItemOpcode); DEFINE_HANDLER(CMSG_BUY_REAGENT_BANK, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BUY_WOW_TOKEN_CONFIRM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BUY_WOW_TOKEN_START, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -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); @@ -305,8 +312,8 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_DECLINE_GUILD_INVITES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::DeclineGuildInvites, &WorldSession::HandleDeclineGuildInvites); DEFINE_HANDLER(CMSG_DECLINE_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::DeclinePetition, &WorldSession::HandleDeclinePetition); DEFINE_HANDLER(CMSG_DELETE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::DeleteEquipmentSet, &WorldSession::HandleDeleteEquipmentSet); - DEFINE_HANDLER(CMSG_DEL_FRIEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::DelFriend, &WorldSession::HandleDelFriendOpcode); - DEFINE_HANDLER(CMSG_DEL_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::DelIgnore, &WorldSession::HandleDelIgnoreOpcode); + DEFINE_HANDLER(CMSG_DEL_FRIEND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Social::DelFriend, &WorldSession::HandleDelFriendOpcode); + DEFINE_HANDLER(CMSG_DEL_IGNORE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Social::DelIgnore, &WorldSession::HandleDelIgnoreOpcode); DEFINE_HANDLER(CMSG_DEPOSIT_REAGENT_BANK, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_DESTROY_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::DestroyItem, &WorldSession::HandleDestroyItemOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_BOOT_PLAYER_VOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgSetBootVoteOpcode ); @@ -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); @@ -381,7 +391,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_GUILD_BANK_LOG_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankLogQuery, &WorldSession::HandleGuildBankLogQuery); DEFINE_HANDLER(CMSG_GUILD_BANK_QUERY_TAB, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankQueryTab, &WorldSession::HandleGuildBankQueryTab); DEFINE_HANDLER(CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankRemainingWithdrawMoneyQuery, &WorldSession::HandleGuildBankMoneyWithdrawn); - DEFINE_HANDLER(CMSG_GUILD_BANK_SET_TAB_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankSetTabText, &WorldSession::HandleGuildBankSetTabText); + DEFINE_HANDLER(CMSG_GUILD_BANK_SET_TAB_TEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankSetTabText, &WorldSession::HandleGuildBankSetTabText); DEFINE_HANDLER(CMSG_GUILD_BANK_SWAP_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankSwapItems, &WorldSession::HandleGuildBankSwapItems); DEFINE_HANDLER(CMSG_GUILD_BANK_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankTextQuery, &WorldSession::HandleGuildBankTextQuery); DEFINE_HANDLER(CMSG_GUILD_BANK_UPDATE_TAB, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankUpdateTab, &WorldSession::HandleGuildBankUpdateTab); @@ -399,7 +409,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_GUILD_INVITE_BY_NAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildInviteByName, &WorldSession::HandleGuildInviteByName); DEFINE_HANDLER(CMSG_GUILD_LEAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildLeave, &WorldSession::HandleGuildLeave); DEFINE_HANDLER(CMSG_GUILD_MEMBER_SEND_SOR_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GUILD_NEWS_UPDATE_STICKY, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Guild::GuildNewsUpdateSticky, &WorldSession::HandleGuildNewsUpdateSticky); + DEFINE_HANDLER(CMSG_GUILD_NEWS_UPDATE_STICKY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Guild::GuildNewsUpdateSticky, &WorldSession::HandleGuildNewsUpdateSticky); DEFINE_HANDLER(CMSG_GUILD_OFFICER_REMOVE_MEMBER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildOfficerRemoveMember, &WorldSession::HandleGuildOfficerRemoveMember); DEFINE_HANDLER(CMSG_GUILD_PERMISSIONS_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildPermissionsQuery, &WorldSession::HandleGuildPermissionsQuery); DEFINE_HANDLER(CMSG_GUILD_PROMOTE_MEMBER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildPromoteMember, &WorldSession::HandleGuildPromoteMember); @@ -411,14 +421,13 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_GUILD_SET_ACHIEVEMENT_TRACKING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetAchievementTracking, &WorldSession::HandleGuildSetAchievementTracking); DEFINE_HANDLER(CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Achievement::GuildSetFocusedAchievement, &WorldSession::HandleGuildSetFocusedAchievement); DEFINE_HANDLER(CMSG_GUILD_SET_GUILD_MASTER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetGuildMaster, &WorldSession::HandleGuildSetGuildMaster); - DEFINE_HANDLER(CMSG_GUILD_SET_MEMBER_NOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetMemberNote, &WorldSession::HandleGuildSetMemberNote); + DEFINE_HANDLER(CMSG_GUILD_SET_MEMBER_NOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetMemberNote, &WorldSession::HandleGuildSetMemberNote); DEFINE_HANDLER(CMSG_GUILD_SET_RANK_PERMISSIONS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetRankPermissions, &WorldSession::HandleGuildSetRankPermissions); DEFINE_HANDLER(CMSG_GUILD_SHIFT_RANK, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GUILD_UPDATE_INFO_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildUpdateInfoText, &WorldSession::HandleGuildUpdateInfoText); 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); @@ -463,7 +475,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_LOOT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootItem, &WorldSession::HandleAutostoreLootItemOpcode); DEFINE_HANDLER(CMSG_LOOT_MONEY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootMoney, &WorldSession::HandleLootMoneyOpcode); DEFINE_HANDLER(CMSG_LOOT_RELEASE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootRelease, &WorldSession::HandleLootReleaseOpcode); - DEFINE_HANDLER(CMSG_LOOT_ROLL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootRoll, &WorldSession::HandleLootRoll); + DEFINE_HANDLER(CMSG_LOOT_ROLL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootRoll, &WorldSession::HandleLootRoll); DEFINE_HANDLER(CMSG_LOOT_UNIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootUnit, &WorldSession::HandleLootOpcode); DEFINE_HANDLER(CMSG_LOW_LEVEL_RAID1, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LOW_LEVEL_RAID2, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -477,11 +489,12 @@ 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); DEFINE_HANDLER(CMSG_MOVE_CHANGE_TRANSPORT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes); - DEFINE_HANDLER(CMSG_MOVE_CHANGE_VEHICLE_SEATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::MoveChangeVehicleSeats, &WorldSession::HandleMoveChangeVehicleSeats); + DEFINE_HANDLER(CMSG_MOVE_CHANGE_VEHICLE_SEATS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::MoveChangeVehicleSeats, &WorldSession::HandleMoveChangeVehicleSeats); DEFINE_HANDLER(CMSG_MOVE_CHARM_TELEPORT_CHEAT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_MOVE_DISMISS_VEHICLE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::MoveDismissVehicle, &WorldSession::HandleMoveDismissVehicle); DEFINE_HANDLER(CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MovementAckMessage, &WorldSession::HandleMovementAckMessage); @@ -516,7 +529,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_MOVE_SET_PITCH, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes); DEFINE_HANDLER(CMSG_MOVE_SET_RELATIVE_POSITION, STATUS_UNHANDLED, PROCESS_THREADSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_MOVE_SET_RUN_MODE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes); - DEFINE_HANDLER(CMSG_MOVE_SET_VEHICLE_REC_ID_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Vehicle::MoveSetVehicleRecIdAck, &WorldSession::HandleMoveSetVehicleRecAck); + DEFINE_HANDLER(CMSG_MOVE_SET_VEHICLE_REC_ID_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, WorldPackets::Vehicle::MoveSetVehicleRecIdAck, &WorldSession::HandleMoveSetVehicleRecAck); DEFINE_HANDLER(CMSG_MOVE_SET_WALK_MODE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes); DEFINE_HANDLER(CMSG_MOVE_SPLINE_DONE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MoveSplineDone, &WorldSession::HandleMoveSplineDoneOpcode); DEFINE_HANDLER(CMSG_MOVE_START_ASCEND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes); @@ -542,7 +555,7 @@ 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); @@ -552,7 +565,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_OPEN_SHIPMENT_NPC, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_OPEN_TRADESKILL_NPC, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_OPT_OUT_OF_LOOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::OptOutOfLoot, &WorldSession::HandleOptOutOfLootOpcode); - DEFINE_HANDLER(CMSG_PARTY_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyInviteClient, &WorldSession::HandlePartyInviteOpcode); + DEFINE_HANDLER(CMSG_PARTY_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyInviteClient, &WorldSession::HandlePartyInviteOpcode); DEFINE_HANDLER(CMSG_PARTY_INVITE_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyInviteResponse, &WorldSession::HandlePartyInviteResponseOpcode); DEFINE_HANDLER(CMSG_PARTY_UNINVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyUninvite, &WorldSession::HandlePartyUninviteOpcode); DEFINE_HANDLER(CMSG_PETITION_BUY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionBuy, &WorldSession::HandlePetitionBuy); @@ -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); @@ -580,7 +594,8 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_PLAYER_LOGIN, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::PlayerLogin, &WorldSession::HandlePlayerLoginOpcode); 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_LOG_DATA, STATUS_UNHANDLED, 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); @@ -657,7 +676,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_REVERT_MONUMENT_APPEARANCE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_RIDE_VEHICLE_INTERACT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RideVehicleInteract, &WorldSession::HandleRideVehicleInteract); DEFINE_HANDLER(CMSG_SAVE_CUF_PROFILES, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::SaveCUFProfiles, &WorldSession::HandleSaveCUFProfiles); - DEFINE_HANDLER(CMSG_SAVE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::SaveEquipmentSet, &WorldSession::HandleEquipmentSetSave); + DEFINE_HANDLER(CMSG_SAVE_EQUIPMENT_SET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::SaveEquipmentSet, &WorldSession::HandleEquipmentSetSave); DEFINE_HANDLER(CMSG_SAVE_GUILD_EMBLEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::SaveGuildEmblem, &WorldSession::HandleSaveGuildEmblem); DEFINE_HANDLER(CMSG_SCENE_PLAYBACK_CANCELED, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Scenes::ScenePlaybackCanceled, &WorldSession::HandleScenePlaybackCanceled); DEFINE_HANDLER(CMSG_SCENE_PLAYBACK_COMPLETE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Scenes::ScenePlaybackComplete, &WorldSession::HandleScenePlaybackComplete); @@ -667,7 +686,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_SELL_WOW_TOKEN_CONFIRM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SELL_WOW_TOKEN_START, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SEND_CONTACT_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::SendContactList, &WorldSession::HandleContactListOpcode); - DEFINE_HANDLER(CMSG_SEND_MAIL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::SendMail, &WorldSession::HandleSendMail); + DEFINE_HANDLER(CMSG_SEND_MAIL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Mail::SendMail, &WorldSession::HandleSendMail); DEFINE_HANDLER(CMSG_SEND_SOR_REQUEST_VIA_ADDRESS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SEND_TEXT_EMOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::CTextEmote, &WorldSession::HandleTextEmoteOpcode); DEFINE_HANDLER(CMSG_SET_ACHIEVEMENTS_HIDDEN, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -704,7 +723,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,12 +730,10 @@ 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); - DEFINE_HANDLER(CMSG_SOCKET_GEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SocketGems, &WorldSession::HandleSocketGems); + DEFINE_HANDLER(CMSG_SOCKET_GEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::SocketGems, &WorldSession::HandleSocketGems); DEFINE_HANDLER(CMSG_SORT_BAGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SORT_BANK_BAGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SORT_REAGENT_BANK_BAGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -725,11 +741,12 @@ 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); DEFINE_HANDLER(CMSG_SUPPORT_TICKET_SUBMIT_BUG, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::SupportTicketSubmitBug, &WorldSession::HandleSupportTicketSubmitBug); - DEFINE_HANDLER(CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::SupportTicketSubmitComplaint, &WorldSession::HandleSupportTicketSubmitComplaint); + DEFINE_HANDLER(CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Ticket::SupportTicketSubmitComplaint, &WorldSession::HandleSupportTicketSubmitComplaint); DEFINE_HANDLER(CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::SupportTicketSubmitSuggestion, &WorldSession::HandleSupportTicketSubmitSuggestion); DEFINE_HANDLER(CMSG_SUSPEND_COMMS_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SUSPEND_TOKEN_RESPONSE, STATUS_TRANSFER, PROCESS_THREADUNSAFE, WorldPackets::Movement::SuspendTokenResponse, &WorldSession::HandleSuspendTokenResponse); @@ -742,6 +759,7 @@ void OpcodeTable::Initialize() 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 +769,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_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::TransmogrifyItems, &WorldSession::HandleTransmogrifyItems); + DEFINE_HANDLER(CMSG_TRANSMOG_APPEARANCE_SET_FAVORITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_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); @@ -786,11 +806,11 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_VOICE_SESSION_ENABLE, STATUS_UNHANDLED, 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); + DEFINE_HANDLER(CMSG_WHO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Who::WhoRequestPkt, &WorldSession::HandleWhoOpcode); DEFINE_HANDLER(CMSG_WHO_IS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Who::WhoIsRequest, &WorldSession::HandleWhoIsOpcode); DEFINE_HANDLER(CMSG_WORLD_PORT_RESPONSE, STATUS_TRANSFER, PROCESS_THREADUNSAFE, WorldPackets::Movement::WorldPortResponse, &WorldSession::HandleMoveWorldportAckOpcode); DEFINE_HANDLER(CMSG_WORLD_TELEPORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::WorldTeleport, &WorldSession::HandleWorldTeleportOpcode); - DEFINE_HANDLER(CMSG_WRAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::WrapItem, &WorldSession::HandleWrapItem); + DEFINE_HANDLER(CMSG_WRAP_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::WrapItem, &WorldSession::HandleWrapItem); #undef DEFINE_OPCODE_HANDLER_OLD #undef DEFINE_HANDLER @@ -800,15 +820,15 @@ 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); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_TOYS_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_DELETED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_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_ACTIVATE_TAXI_REPLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVE_GLYPHS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_BATTLENET_FRIEND_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); 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 +837,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,22 +848,26 @@ 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_ATTACKER_STATE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + 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_UNHANDLED, 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); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACK_SWING_ERROR, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACK_SWING_LANDED_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_CLOSED_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_CLOSED_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_HELLO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_ITEMS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_PENDING_SALES_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_OUTBID_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_OWNER_BID_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_REPLICATE_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_WON_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_ITEMS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_PENDING_SALES_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_OUTBID_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_OWNER_BID_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_REPLICATE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_WON_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURA_POINTS_DEPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURA_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_CHALLENGE, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -882,35 +906,36 @@ 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_JOURNAL, 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_UNHANDLED, 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_BATTLE_PET_UPDATES, 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_BID_ON_ITEM_RESULT, STATUS_UNHANDLED, 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_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_BLACK_MARKET_REQUEST_ITEMS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_WON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BONUS_ROLL_EMPTY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BOSS_KILL_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BREAK_TARGET, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -934,15 +959,16 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_RAID_LOCKOUT_ADDED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_RAID_LOCKOUT_REMOVED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_RAID_LOCKOUT_UPDATED, STATUS_NEVER, CONNECTION_TYPE_REALM); - 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_CALENDAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_EVENT, STATUS_UNHANDLED, 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); @@ -960,11 +986,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 +1025,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,12 +1071,13 @@ 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); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENUM_CHARACTERS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENVIRONMENTAL_DAMAGE_LOG, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_ID, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENVIRONMENTAL_DAMAGE_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_ID, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPECTED_SPAM_RECORDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPLORATION_EXPERIENCE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FACTION_BONUS_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); @@ -1071,28 +1098,30 @@ 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); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_TIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_FOLLOWER_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_FOLLOWER_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_ACTIVATED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_LANDMARKS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_REMOVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_CLEAR_ALL_FOLLOWERS_EXHAUSTION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_COMPLETE_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); 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); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_IS_UPGRADEABLE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LEARN_BLUEPRINT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LEARN_BLUEPRINT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LIST_MISSIONS_CHEAT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); @@ -1104,8 +1133,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_OPEN_MISSION_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_OPEN_RECRUITMENT_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_OPEN_TRADESKILL_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLACE_BUILDING_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLOT_PLACED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLACE_BUILDING_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLOT_PLACED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLOT_REMOVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RECALL_PORTAL_LAST_USED_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RECALL_PORTAL_USED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); @@ -1113,15 +1142,15 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOTE_INFO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOVE_FOLLOWER_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOVE_FOLLOWER_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_START_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UPGRADE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_GARRISON_INFO_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_GARRISON_INFO_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_SHIPMENT_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_TROPHY_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); @@ -1131,8 +1160,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_SYSTEM_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOD_MODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_POI, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_POI, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_ACTION_THROTTLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DECLINE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DESTROYED, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1141,10 +1170,10 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DELETED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_EARNED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_MEMBERS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_LOG_QUERY_RESULTS, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_QUERY_RESULTS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_LOG_QUERY_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_QUERY_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); 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_BANK_TEXT_QUERY_RESULT, STATUS_UNHANDLED, 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_CHANGE_NAME_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1170,6 +1199,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,13 +1223,12 @@ 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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); 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); @@ -1217,6 +1246,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); @@ -1225,15 +1255,18 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ENCHANT_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_EXPIRE_PURCHASE_REFUND, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - 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_PURCHASE_REFUND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PUSH_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_KICK_REASON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARN_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); @@ -1249,7 +1282,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); @@ -1264,7 +1297,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIVE_REGION_CHARACTER_COPY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOAD_CUF_PROFILES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOAD_EQUIPMENT_SET, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOAD_EQUIPMENT_SET, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOAD_SELECTED_TROPHY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_SET_TIME_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_VERIFY_WORLD, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1273,20 +1306,19 @@ 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); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE_ALL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_REMOVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLLS_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLL_WON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOSS_OF_CONTROL_AURA_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_LIST_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_QUERY_NEXT_TIME_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJECTIVES_INIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJ_EVENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1296,7 +1328,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); @@ -1361,17 +1396,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); @@ -1379,7 +1414,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); @@ -1397,10 +1431,10 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_OVERRIDE_LIGHT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAGE_TEXT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_INVITE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_INVITE, STATUS_UNHANDLED, 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_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_UPDATE, STATUS_UNHANDLED, 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); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_ALREADY_SIGNED, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1425,7 +1459,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_REPLACEMENTS_MADE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_REQUEST_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_ROUND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_SLOT_UPDATES, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_SLOT_UPDATES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_CAST_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_CLEAR_SPELLS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_DISMISS_SOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1435,7 +1469,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_MODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_NAME_INVALID, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_SLOT_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_SPELLS_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_SPELLS_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_STABLE_LIST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_STABLE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_TAME_FAILURE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1458,52 +1492,59 @@ 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_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_PUSH_SPELL_TO_ACTION_BAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_LOG_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_SEASON, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_BATTLE_PET_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_CREATURE_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GAME_OBJECT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GUILD_INFO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GUILD_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_ITEM_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_NPC_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PAGE_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PETITION_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); 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_INFO_RESPONSE, STATUS_UNHANDLED, 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); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_FORCE_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_INVALID_QUEST, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_DETAILS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_DETAILS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_REQUEST_ITEMS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_REQUEST_ITEMS, STATUS_UNHANDLED, 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); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_DIFFICULTY_SET, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_GROUP_ONLY, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_INSTANCE_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_INSTANCE_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_MARKERS_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RANDOM_ROLL, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RATED_BATTLEFIELD_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1526,12 +1567,13 @@ 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_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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_CAST_BAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_COMMS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_TOKEN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1543,9 +1585,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); @@ -1580,7 +1622,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_VISIBLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FLAT_SPELL_MODIFIER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FORCED_REACTIONS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ITEM_PURCHASE_DATA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ITEM_PURCHASE_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_LOOT_METHOD_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MAX_WEEKLY_QUANTITY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MELEE_ANIM_KIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1594,34 +1636,39 @@ 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, STATUS_UNHANDLED, 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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DAMAGE_SHIELD, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DAMAGE_SHIELD, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DELAYED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DISPELL_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_ENERGIZE_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_ENERGIZE_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_EXECUTE_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILED_OTHER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILURE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_GO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_HEAL_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_HEAL_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); 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_NON_MELEE_DAMAGE_LOG, STATUS_UNHANDLED, 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_PERIODIC_AURA_LOG, STATUS_UNHANDLED, 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); @@ -1639,7 +1686,6 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_REQUEST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUPERCEDED_SPELLS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUPPRESS_NPC_GREETINGS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_COMMS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_TOKEN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_INVOLUNTARILY_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1655,15 +1701,18 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOTEM_CREATED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOTEM_MOVED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_STATUS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_UPDATED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_BUY_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_LIST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_ABORTED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_PENDING, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSMOG_COLLECTION_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_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); @@ -1685,16 +1734,16 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_REMOVE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_USE_EQUIPMENT_SET_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VENDOR_INVENTORY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VENDOR_INVENTORY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VIGNETTE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_CHAT_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_PARENTAL_CONTROLS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_SESSION_LEAVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_SESSION_ROSTER_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_ITEM_SWAP_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_CONTENTS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_CONTENTS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_FAILED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_TRANSFER_CHANGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_TRANSFER_CHANGES, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_TRANSFER_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WAIT_QUEUE_FINISH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WAIT_QUEUE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1702,13 +1751,16 @@ 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_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_UNHANDLED, 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); @@ -1720,5 +1772,8 @@ void OpcodeTable::Initialize() 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 37f8500fe84..a3346f5e6cb 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -45,1611 +45,1662 @@ 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 = 0x35F9, + CMSG_ACCEPT_LEVEL_GRANT = 0x34E9, + CMSG_ACCEPT_TRADE = 0x315A, + CMSG_ACCEPT_WARGAME_INVITE = 0x35DF, + CMSG_ACTIVATE_TAXI = 0x34A6, + CMSG_ADDON_LIST = 0x35D7, + CMSG_ADD_BATTLENET_FRIEND = 0x365E, + CMSG_ADD_FRIEND = 0x36D5, + CMSG_ADD_IGNORE = 0x36D9, + CMSG_ADD_TOY = 0x3272, + CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0x31E8, + CMSG_ADVENTURE_JOURNAL_START_QUEST = 0x331A, + CMSG_ALTER_APPEARANCE = 0x34E5, + CMSG_AREA_SPIRIT_HEALER_QUERY = 0x34AB, + CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x34AC, + CMSG_AREA_TRIGGER = 0x31BF, + CMSG_ARTIFACT_ADD_POWER = 0x31A3, + CMSG_ARTIFACT_SET_APPEARANCE = 0x31A5, + CMSG_ATTACK_STOP = 0x3238, + CMSG_ATTACK_SWING = 0x3237, + CMSG_AUCTION_HELLO_REQUEST = 0x34BB, + CMSG_AUCTION_LIST_BIDDER_ITEMS = 0x34C1, + CMSG_AUCTION_LIST_ITEMS = 0x34BE, + CMSG_AUCTION_LIST_OWNER_ITEMS = 0x34C0, + CMSG_AUCTION_LIST_PENDING_SALES = 0x34C3, + CMSG_AUCTION_PLACE_BID = 0x34C2, + CMSG_AUCTION_REMOVE_ITEM = 0x34BD, + CMSG_AUCTION_REPLICATE_ITEMS = 0x34BF, + CMSG_AUCTION_SELL_ITEM = 0x34BC, + CMSG_AUTH_CONTINUED_SESSION = 0x3766, + CMSG_AUTH_SESSION = 0x3765, + CMSG_AUTOBANK_ITEM = 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 = 0x34AE, + CMSG_BATTLEFIELD_LEAVE = 0x3171, + CMSG_BATTLEFIELD_LIST = 0x317C, + CMSG_BATTLEFIELD_PORT = 0x3513, + CMSG_BATTLEMASTER_HELLO = 0x3287, + CMSG_BATTLEMASTER_JOIN = 0x3510, + CMSG_BATTLEMASTER_JOIN_ARENA = 0x3511, + CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x3512, + CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x36D8, + CMSG_BATTLENET_REQUEST = 0x36FC, + CMSG_BATTLENET_REQUEST_REALM_LIST_TICKET = 0x36FD, + CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x36CF, + CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x36CE, + CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x36C6, + CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x36C1, + CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x36C2, + CMSG_BATTLE_PAY_QUERY_CLASS_TRIAL_BOOST_RESULT = 0x36C8, + CMSG_BATTLE_PAY_START_PURCHASE = 0x36F8, + CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x36F9, + CMSG_BATTLE_PAY_TRIAL_BOOST_CHARACTER = 0x36C7, + CMSG_BATTLE_PET_CLEAR_FANFARE = 0x312C, + CMSG_BATTLE_PET_DELETE_PET = 0x3623, + CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x3624, + CMSG_BATTLE_PET_MODIFY_NAME = 0x3626, + CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x3622, + CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x3621, + CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x362A, + CMSG_BATTLE_PET_SET_FLAGS = 0x362E, + CMSG_BATTLE_PET_SUMMON = 0x3627, + CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x31C8, + CMSG_BEGIN_TRADE = 0x3157, + CMSG_BINDER_ACTIVATE = 0x34AD, + CMSG_BLACK_MARKET_BID_ON_ITEM = 0x351A, + CMSG_BLACK_MARKET_OPEN = 0x3518, + CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x3519, + CMSG_BUG_REPORT = 0x368C, + CMSG_BUSY_TRADE = 0x3158, + CMSG_BUY_BACK_ITEM = 0x349F, + CMSG_BUY_BANK_SLOT = 0x34AF, + CMSG_BUY_ITEM = 0x349E, + CMSG_BUY_REAGENT_BANK = 0x34B0, + CMSG_BUY_WOW_TOKEN_CONFIRM = 0x36F1, + CMSG_BUY_WOW_TOKEN_START = 0x36F0, + CMSG_CAGE_BATTLE_PET = 0x31D8, + CMSG_CALENDAR_ADD_EVENT = 0x3682, + CMSG_CALENDAR_COMPLAIN = 0x367E, + CMSG_CALENDAR_COPY_EVENT = 0x367D, + CMSG_CALENDAR_EVENT_INVITE = 0x3677, + CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x367B, + CMSG_CALENDAR_EVENT_RSVP = 0x3679, + CMSG_CALENDAR_EVENT_SIGN_UP = 0x3680, + CMSG_CALENDAR_EVENT_STATUS = 0x367A, + CMSG_CALENDAR_GET = 0x3674, + CMSG_CALENDAR_GET_EVENT = 0x3675, + CMSG_CALENDAR_GET_NUM_PENDING = 0x367F, + CMSG_CALENDAR_GUILD_FILTER = 0x3676, + CMSG_CALENDAR_REMOVE_EVENT = 0x367C, + CMSG_CALENDAR_REMOVE_INVITE = 0x3678, + CMSG_CALENDAR_UPDATE_EVENT = 0x3683, + CMSG_CANCEL_AURA = 0x31A7, + CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x34D7, + CMSG_CANCEL_CAST = 0x3277, + CMSG_CANCEL_CHANNELLING = 0x3245, + CMSG_CANCEL_GROWTH_AURA = 0x324A, + CMSG_CANCEL_MASTER_LOOT_ROLL = 0x31F6, + CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x31A6, + CMSG_CANCEL_MOUNT_AURA = 0x325B, + CMSG_CANCEL_QUEUED_SPELL = 0x317D, + CMSG_CANCEL_TEMP_ENCHANTMENT = 0x34E2, + CMSG_CANCEL_TRADE = 0x315C, + CMSG_CAN_DUEL = 0x3667, + CMSG_CAST_SPELL = 0x3275, + CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x308F, + CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS = 0x308E, + CMSG_CHANGE_BAG_SLOT_FLAG = 0x32FC, + CMSG_CHANGE_MONUMENT_APPEARANCE = 0x32DC, + CMSG_CHANGE_SUB_GROUP = 0x364C, + CMSG_CHARACTER_RENAME_REQUEST = 0x36C4, + CMSG_CHAR_CUSTOMIZE = 0x3694, + CMSG_CHAR_DELETE = 0x36A1, + CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x369A, + CMSG_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 = 0x3279, + CMSG_CLEAR_RAID_MARKER = 0x319F, + CMSG_CLEAR_TRADE_ITEM = 0x315E, + CMSG_CLIENT_PORT_GRAVEYARD = 0x3515, + CMSG_CLOSE_INTERACTION = 0x348A, + CMSG_COMMENTATOR_ENABLE = 0x35EE, + CMSG_COMMENTATOR_ENTER_INSTANCE = 0x35F1, + CMSG_COMMENTATOR_EXIT_INSTANCE = 0x35F2, + CMSG_COMMENTATOR_GET_MAP_INFO = 0x35EF, + CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x35F0, + CMSG_COMMENTATOR_START_WARGAME = 0x35ED, + CMSG_COMPLAINT = 0x3671, + CMSG_COMPLETE_CINEMATIC = 0x3532, + CMSG_COMPLETE_MOVIE = 0x34CD, + CMSG_CONFIRM_ARTIFACT_RESPEC = 0x31A4, + CMSG_CONFIRM_RESPEC_WIPE = 0x31F0, + CMSG_CONNECT_TO_FAILED = 0x35D4, + CMSG_CONVERT_RAID = 0x364E, + CMSG_CREATE_CHARACTER = 0x3643, + CMSG_CREATE_SHIPMENT = 0x32C8, + CMSG_DB_QUERY_BULK = 0x35E4, + CMSG_DECLINE_GUILD_INVITES = 0x350E, + CMSG_DECLINE_PETITION = 0x3521, + CMSG_DELETE_EQUIPMENT_SET = 0x34FC, + CMSG_DEL_FRIEND = 0x36D6, + CMSG_DEL_IGNORE = 0x36DA, + CMSG_DEPOSIT_REAGENT_BANK = 0x3305, + CMSG_DESTROY_ITEM = 0x326C, + CMSG_DF_BOOT_PLAYER_VOTE = 0x3614, + CMSG_DF_GET_JOIN_STATUS = 0x3612, + CMSG_DF_GET_SYSTEM_INFO = 0x3611, + CMSG_DF_JOIN = 0x3605, + CMSG_DF_LEAVE = 0x3610, + CMSG_DF_PROPOSAL_RESPONSE = 0x3604, + CMSG_DF_READY_CHECK_RESPONSE = 0x3617, + CMSG_DF_SET_ROLES = 0x3613, + CMSG_DF_TELEPORT = 0x3615, + CMSG_DISCARDED_TIME_SYNC_ACKS = 0x3A3C, + CMSG_DISMISS_CRITTER = 0x34EB, + CMSG_DO_MASTER_LOOT_ROLL = 0x31F5, + CMSG_DO_READY_CHECK = 0x3633, + CMSG_DUEL_RESPONSE = 0x34D2, + CMSG_EJECT_PASSENGER = 0x321E, + CMSG_EMOTE = 0x352E, + CMSG_ENABLE_ENCRYPTION_ACK = 0x3767, + CMSG_ENABLE_NAGLE = 0x376B, + CMSG_ENABLE_TAXI_NODE = 0x34A4, + CMSG_ENGINE_SURVEY = 0x36E9, + CMSG_ENUM_CHARACTERS = 0x35E6, + CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x36E3, + CMSG_FAR_SIGHT = 0x34D8, + CMSG_GAME_OBJ_REPORT_USE = 0x34DF, + CMSG_GAME_OBJ_USE = 0x34DE, + CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x32B3, + CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x32A4, + CMSG_GARRISON_CHECK_UPGRADEABLE = 0x32F8, + CMSG_GARRISON_COMPLETE_MISSION = 0x32E9, + CMSG_GARRISON_GENERATE_RECRUITS = 0x32B6, + CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x32C4, + CMSG_GARRISON_MISSION_BONUS_ROLL = 0x32EB, + CMSG_GARRISON_PURCHASE_BUILDING = 0x32A0, + CMSG_GARRISON_RECRUIT_FOLLOWER = 0x32B8, + CMSG_GARRISON_REMOVE_FOLLOWER = 0x32E0, + CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x32B4, + CMSG_GARRISON_RENAME_FOLLOWER = 0x32B5, + CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x329F, + CMSG_GARRISON_REQUEST_CLASS_SPEC_CATEGORY_INFO = 0x32BD, + CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x32C7, + CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x32C6, + CMSG_GARRISON_RESEARCH_TALENT = 0x32B9, + CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x32A1, + CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x32B1, + CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x32AD, + CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x32B7, + CMSG_GARRISON_START_MISSION = 0x32E8, + CMSG_GARRISON_SWAP_BUILDINGS = 0x32A5, + CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x35E5, + CMSG_GET_CHALLENGE_MODE_REWARDS = 0x3688, + CMSG_GET_GARRISON_INFO = 0x329A, + CMSG_GET_ITEM_PURCHASE_DATA = 0x351C, + CMSG_GET_MIRROR_IMAGE_DATA = 0x3270, + CMSG_GET_PVP_OPTIONS_ENABLED = 0x35EC, + CMSG_GET_REMAINING_GAME_TIME = 0x36F2, + CMSG_GET_TROPHY_LIST = 0x32D9, + CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x36E5, + CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3698, + CMSG_GM_TICKET_GET_CASE_STATUS = 0x3697, + CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x3696, + CMSG_GOSSIP_SELECT_OPTION = 0x348B, + CMSG_GRANT_LEVEL = 0x34E7, + 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 = 0x34B1, + CMSG_GUILD_BANK_BUY_TAB = 0x34B4, + CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x34B6, + CMSG_GUILD_BANK_LOG_QUERY = 0x3082, + CMSG_GUILD_BANK_QUERY_TAB = 0x34B3, + CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x3083, + CMSG_GUILD_BANK_SET_TAB_TEXT = 0x3086, + CMSG_GUILD_BANK_SWAP_ITEMS = 0x34B2, + CMSG_GUILD_BANK_TEXT_QUERY = 0x3087, + CMSG_GUILD_BANK_UPDATE_TAB = 0x34B5, + CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x34B7, + CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x307B, + CMSG_GUILD_CHANGE_NAME_REQUEST = 0x307E, + CMSG_GUILD_DECLINE_INVITATION = 0x3060, + 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 = 0x3603, + 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 = 0x34F8, + CMSG_IGNORE_TRADE = 0x3159, + CMSG_INITIATE_ROLE_POLL = 0x35D9, + CMSG_INITIATE_TRADE = 0x3156, + CMSG_INSPECT = 0x3517, + CMSG_INSPECT_PVP = 0x36A7, + CMSG_INSTANCE_LOCK_RESPONSE = 0x34FD, + CMSG_ITEM_PURCHASE_REFUND = 0x351D, + CMSG_ITEM_TEXT_QUERY = 0x32F9, + CMSG_JOIN_PET_BATTLE_QUEUE = 0x31C6, + CMSG_JOIN_RATED_BATTLEGROUND = 0x3175, + CMSG_KEEP_ALIVE = 0x3684, + CMSG_KEYBOUND_OVERRIDE = 0x3207, + CMSG_LEARN_PVP_TALENTS = 0x3540, + CMSG_LEARN_TALENTS = 0x353F, + CMSG_LEAVE_GROUP = 0x3649, + CMSG_LEAVE_PET_BATTLE_QUEUE = 0x31C7, + CMSG_LFG_LIST_APPLY_TO_GROUP = 0x360B, + CMSG_LFG_LIST_CANCEL_APPLICATION = 0x360C, + CMSG_LFG_LIST_DECLINE_APPLICANT = 0x360D, + CMSG_LFG_LIST_GET_STATUS = 0x3609, + CMSG_LFG_LIST_INVITE_APPLICANT = 0x360E, + CMSG_LFG_LIST_INVITE_RESPONSE = 0x360F, + CMSG_LFG_LIST_JOIN = 0x3606, + CMSG_LFG_LIST_LEAVE = 0x3608, + CMSG_LFG_LIST_SEARCH = 0x360A, + CMSG_LFG_LIST_UPDATE_REQUEST = 0x3607, + CMSG_LF_GUILD_ADD_RECRUIT = 0x361A, + CMSG_LF_GUILD_BROWSE = 0x361C, + 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 = 0x361B, + CMSG_LIST_INVENTORY = 0x349C, + CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x36C0, + CMSG_LIVE_REGION_CHARACTER_COPY = 0x36BF, + CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x36BE, + CMSG_LOADING_SCREEN_NOTIFY = 0x35F5, + CMSG_LOAD_SELECTED_TROPHY = 0x32DA, + CMSG_LOGOUT_CANCEL = 0x34C8, + CMSG_LOGOUT_INSTANT = 0x34C9, + CMSG_LOGOUT_REQUEST = 0x34C7, + CMSG_LOG_DISCONNECT = 0x3769, + CMSG_LOG_STREAMING_ERROR = 0x376D, + CMSG_LOOT_ITEM = 0x31F3, + CMSG_LOOT_MONEY = 0x31F2, + CMSG_LOOT_RELEASE = 0x31F7, + CMSG_LOOT_ROLL = 0x31F8, + CMSG_LOOT_UNIT = 0x31F1, + CMSG_LOW_LEVEL_RAID1 = 0x36A5, + CMSG_LOW_LEVEL_RAID2 = 0x3503, + CMSG_MAIL_CREATE_TEXT_ITEM = 0x3528, + CMSG_MAIL_DELETE = 0x3209, + CMSG_MAIL_GET_LIST = 0x3523, + CMSG_MAIL_MARK_AS_READ = 0x3527, + CMSG_MAIL_RETURN_TO_SENDER = 0x3658, + CMSG_MAIL_TAKE_ITEM = 0x3525, + CMSG_MAIL_TAKE_MONEY = 0x3524, + CMSG_MASTER_LOOT_ITEM = 0x31F4, + CMSG_MINIMAP_PING = 0x364B, + CMSG_MISSILE_TRAJECTORY_COLLISION = 0x3188, + CMSG_MOUNT_CLEAR_FANFARE = 0x312D, + CMSG_MOUNT_SET_FAVORITE = 0x3630, + CMSG_MOUNT_SPECIAL_ANIM = 0x325C, + 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 = 0x3531, + CMSG_OBJECT_UPDATE_FAILED = 0x317E, + CMSG_OBJECT_UPDATE_RESCUED = 0x317F, + CMSG_OFFER_PETITION = 0x36B5, + CMSG_OPENING_CINEMATIC = 0x3530, + CMSG_OPEN_ITEM = 0x32FA, + CMSG_OPEN_MISSION_NPC = 0x32BF, + CMSG_OPEN_SHIPMENT_NPC = 0x32C5, + CMSG_OPEN_TRADESKILL_NPC = 0x32D0, + CMSG_OPT_OUT_OF_LOOT = 0x34E6, + CMSG_PARTY_INVITE = 0x35FF, + CMSG_PARTY_INVITE_RESPONSE = 0x3600, + CMSG_PARTY_UNINVITE = 0x3647, + CMSG_PETITION_BUY = 0x34B9, + CMSG_PETITION_RENAME_GUILD = 0x36CB, + CMSG_PETITION_SHOW_LIST = 0x34B8, + CMSG_PETITION_SHOW_SIGNATURES = 0x34BA, + CMSG_PET_ABANDON = 0x3484, + CMSG_PET_ACTION = 0x3482, + CMSG_PET_BATTLE_FINAL_NOTIFY = 0x31CA, + CMSG_PET_BATTLE_INPUT = 0x3640, + CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x3208, + CMSG_PET_BATTLE_QUIT_NOTIFY = 0x31C9, + CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x3641, + 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 = 0x3485, + CMSG_PET_CAST_SPELL = 0x3274, + CMSG_PET_RENAME = 0x368B, + CMSG_PET_SET_ACTION = 0x3481, + CMSG_PET_SPELL_AUTOCAST = 0x3486, + CMSG_PET_STOP_ATTACK = 0x3483, + CMSG_PING = 0x3768, + CMSG_PLAYER_LOGIN = 0x35E8, + CMSG_PROTOCOL_MISMATCH = 0x376E, + CMSG_PUSH_QUEST_TO_PARTY = 0x349A, + CMSG_PVP_LOG_DATA = 0x3179, + CMSG_PVP_PRESTIGE_RANK_UP = 0x331E, + CMSG_QUERY_BATTLE_PET_NAME = 0x3251, + CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x3665, + CMSG_QUERY_CORPSE_TRANSPORT = 0x3666, + CMSG_QUERY_COUNTDOWN_TIMER = 0x31A2, + CMSG_QUERY_CREATURE = 0x324B, + CMSG_QUERY_GAME_OBJECT = 0x324C, + CMSG_QUERY_GARRISON_CREATURE_NAME = 0x3252, + CMSG_QUERY_GUILD_INFO = 0x3693, + CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x34F2, + CMSG_QUERY_NEXT_MAIL_TIME = 0x3526, + CMSG_QUERY_NPC_TEXT = 0x324D, + CMSG_QUERY_PAGE_TEXT = 0x324F, + CMSG_QUERY_PETITION = 0x3253, + CMSG_QUERY_PET_NAME = 0x3250, + CMSG_QUERY_PLAYER_NAME = 0x3691, + CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x3172, + CMSG_QUERY_QUEST_INFO = 0x324E, + CMSG_QUERY_QUEST_REWARDS = 0x3321, + CMSG_QUERY_REALM_NAME = 0x3692, + CMSG_QUERY_SCENARIO_POI = 0x3659, + CMSG_QUERY_TIME = 0x34C6, + CMSG_QUERY_VOID_STORAGE = 0x319B, + CMSG_QUEST_CONFIRM_ACCEPT = 0x3499, + CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x3490, + CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x3495, + CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x3493, + CMSG_QUEST_GIVER_HELLO = 0x348D, + CMSG_QUEST_GIVER_IGNORE_QUEST = 0x3491, + CMSG_QUEST_GIVER_QUERY_QUEST = 0x348E, + CMSG_QUEST_GIVER_REQUEST_REWARD = 0x3496, + CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x3498, + CMSG_QUEST_GIVER_STATUS_QUERY = 0x3497, + CMSG_QUEST_GIVER_UNIGNORE_QUEST = 0x3492, + CMSG_QUEST_LOG_REMOVE_QUEST = 0x351B, + CMSG_QUEST_POI_QUERY = 0x36B6, + CMSG_QUEST_PUSH_RESULT = 0x349B, + CMSG_QUEUED_MESSAGES_END = 0x376C, + CMSG_RAID_OR_BATTLEGROUND_ENGINE_SURVEY = 0x36EA, + CMSG_RANDOM_ROLL = 0x3654, + CMSG_READY_CHECK_RESPONSE = 0x3634, + CMSG_READ_ITEM = 0x32FB, + CMSG_RECLAIM_CORPSE = 0x34CB, + CMSG_RECRUIT_A_FRIEND = 0x36D1, + CMSG_REDEEM_WOW_TOKEN_CONFIRM = 0x36F4, + CMSG_REDEEM_WOW_TOKEN_START = 0x36F3, + CMSG_REORDER_CHARACTERS = 0x35E7, + CMSG_REPAIR_ITEM = 0x34DC, + CMSG_REPLACE_TROPHY = 0x32DB, + CMSG_REPOP_REQUEST = 0x3514, + CMSG_REPORT_PVP_PLAYER_AFK = 0x34E4, + CMSG_REQUEST_ACCOUNT_DATA = 0x369B, + CMSG_REQUEST_BATTLEFIELD_STATUS = 0x35DB, + CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x317B, + CMSG_REQUEST_CEMETERY_LIST = 0x3173, + CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x328A, + CMSG_REQUEST_FORCED_REACTIONS = 0x31ED, + CMSG_REQUEST_GUILD_PARTY_STATE = 0x31A1, + CMSG_REQUEST_GUILD_REWARDS_LIST = 0x31A0, + CMSG_REQUEST_HONOR_STATS = 0x3178, + CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x327B, + CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x35F4, + CMSG_REQUEST_PARTY_MEMBER_STATS = 0x3653, + CMSG_REQUEST_PET_INFO = 0x3487, + CMSG_REQUEST_PLAYED_TIME = 0x3256, + CMSG_REQUEST_PVP_REWARDS = 0x318F, + CMSG_REQUEST_RAID_INFO = 0x36CC, + CMSG_REQUEST_RATED_BATTLEFIELD_INFO = 0x35E2, + CMSG_REQUEST_RESEARCH_HISTORY = 0x3167, + CMSG_REQUEST_STABLED_PETS = 0x3488, + CMSG_REQUEST_VEHICLE_EXIT = 0x3219, + CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x321B, + CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x321A, + CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x321C, + CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x36EC, + CMSG_RESET_CHALLENGE_MODE = 0x31EA, + CMSG_RESET_INSTANCES = 0x366D, + CMSG_RESURRECT_RESPONSE = 0x368A, + CMSG_REVERT_MONUMENT_APPEARANCE = 0x32DD, + CMSG_RIDE_VEHICLE_INTERACT = 0x321D, + CMSG_SAVE_CUF_PROFILES = 0x3189, + CMSG_SAVE_EQUIPMENT_SET = 0x34FB, + CMSG_SAVE_GUILD_EMBLEM = 0x327F, + CMSG_SCENE_PLAYBACK_CANCELED = 0x3204, + CMSG_SCENE_PLAYBACK_COMPLETE = 0x3203, + CMSG_SCENE_TRIGGER_EVENT = 0x3205, + CMSG_SELF_RES = 0x351E, + CMSG_SELL_ITEM = 0x349D, + CMSG_SELL_WOW_TOKEN_CONFIRM = 0x36EE, + CMSG_SELL_WOW_TOKEN_START = 0x36ED, + CMSG_SEND_CONTACT_LIST = 0x36D4, + CMSG_SEND_MAIL = 0x35F7, + CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x361F, + CMSG_SEND_TEXT_EMOTE = 0x347E, + CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x320A, + CMSG_SET_ACTION_BAR_TOGGLES = 0x351F, + CMSG_SET_ACTION_BUTTON = 0x3635, + CMSG_SET_ACTIVE_MOVER = 0x3A37, + CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x3655, + CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x328B, + CMSG_SET_ASSISTANT_LEADER = 0x364F, + CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x32FE, + CMSG_SET_BANK_AUTOSORT_DISABLED = 0x32FF, + CMSG_SET_BANK_BAG_SLOT_FLAG = 0x32FD, + CMSG_SET_CONTACT_NOTES = 0x36D7, + CMSG_SET_CURRENCY_FLAGS = 0x3169, + CMSG_SET_DIFFICULTY_ID = 0x3206, + CMSG_SET_DUNGEON_DIFFICULTY = 0x3687, + CMSG_SET_EVERYONE_IS_ASSISTANT = 0x3616, + CMSG_SET_FACTION_AT_WAR = 0x34CE, + CMSG_SET_FACTION_INACTIVE = 0x34D0, + CMSG_SET_FACTION_NOT_AT_WAR = 0x34CF, + CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x3301, + CMSG_SET_LFG_BONUS_FACTION_ID = 0x327A, + CMSG_SET_LOOT_METHOD = 0x3648, + CMSG_SET_LOOT_SPECIALIZATION = 0x352C, + CMSG_SET_PARTY_ASSIGNMENT = 0x3651, + CMSG_SET_PARTY_LEADER = 0x364A, + CMSG_SET_PET_SLOT = 0x3168, + CMSG_SET_PLAYER_DECLINED_NAMES = 0x3690, + CMSG_SET_PREFERRED_CEMETERY = 0x3174, + CMSG_SET_PVP = 0x3283, + CMSG_SET_RAID_DIFFICULTY = 0x36E1, + CMSG_SET_ROLE = 0x35D8, + CMSG_SET_SAVED_INSTANCE_EXTEND = 0x368E, + CMSG_SET_SELECTION = 0x3516, + CMSG_SET_SHEATHED = 0x347F, + CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x3300, + CMSG_SET_TAXI_BENCHMARK_MODE = 0x34E3, + CMSG_SET_TITLE = 0x325A, + CMSG_SET_TRADE_CURRENCY = 0x3160, + CMSG_SET_TRADE_GOLD = 0x315F, + CMSG_SET_TRADE_ITEM = 0x315D, + CMSG_SET_USING_PARTY_GARRISON = 0x32C1, + CMSG_SET_WATCHED_FACTION = 0x34D1, + CMSG_SHOW_TRADE_SKILL = 0x36C5, + CMSG_SIGN_PETITION = 0x3520, + CMSG_SILENCE_PARTY_TALKER = 0x3652, + CMSG_SOCKET_GEMS = 0x34DB, + CMSG_SORT_BAGS = 0x3302, + CMSG_SORT_BANK_BAGS = 0x3303, + CMSG_SORT_REAGENT_BANK_BAGS = 0x3304, + CMSG_SPELL_CLICK = 0x348C, + CMSG_SPIRIT_HEALER_ACTIVATE = 0x34AA, + CMSG_SPLIT_ITEM = 0x399E, + CMSG_STAND_STATE_CHANGE = 0x3187, + CMSG_START_CHALLENGE_MODE = 0x3537, + CMSG_START_SPECTATOR_WAR_GAME = 0x35DE, + CMSG_START_WAR_GAME = 0x35DD, + CMSG_SUMMON_RESPONSE = 0x366F, + CMSG_SUPPORT_TICKET_SUBMIT_BUG = 0x3645, + CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x3644, + CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x3646, + CMSG_SUSPEND_COMMS_ACK = 0x3764, + CMSG_SUSPEND_TOKEN_RESPONSE = 0x376A, + CMSG_SWAP_INV_ITEM = 0x399D, + CMSG_SWAP_ITEM = 0x399C, + CMSG_SWAP_SUB_GROUPS = 0x364D, + CMSG_SWAP_VOID_ITEM = 0x319D, + CMSG_TABARD_VENDOR_ACTIVATE = 0x3280, + CMSG_TALK_TO_GOSSIP = 0x3489, + CMSG_TAXI_NODE_STATUS_QUERY = 0x34A3, + CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x34A5, + CMSG_TAXI_REQUEST_EARLY_LANDING = 0x34A7, + CMSG_TELEPORT_TO_GUID = 0x39F5, + CMSG_TELEPORT_TO_UNIT = 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 = 0x365A, + CMSG_TOGGLE_PVP = 0x3282, + CMSG_TOTEM_DESTROYED = 0x34EA, + CMSG_TOY_SET_FAVORITE = 0x3631, + CMSG_TRADE_SKILL_SET_FAVORITE = 0x3320, + CMSG_TRAINER_BUY_SPELL = 0x34A9, + CMSG_TRAINER_LIST = 0x34A8, + CMSG_TRANSMOGRIFY_ITEMS = 0x3190, + CMSG_TRANSMOG_APPEARANCE_SET_FAVORITE = 0x3632, + CMSG_TURN_IN_PETITION = 0x3522, + CMSG_TUTORIAL = 0x36E2, + CMSG_TWITTER_CHECK_STATUS = 0x312A, + CMSG_TWITTER_CONNECT = 0x3127, + CMSG_TWITTER_DISCONNECT = 0x312B, + CMSG_TWITTER_POST = 0x3306, + CMSG_UI_TIME_REQUEST = 0x36A0, + CMSG_UNACCEPT_TRADE = 0x315B, + CMSG_UNDELETE_CHARACTER = 0x36E4, + CMSG_UNLEARN_SKILL = 0x34D5, + CMSG_UNLEARN_SPECIALIZATION = 0x319E, + CMSG_UNLOCK_VOID_STORAGE = 0x319A, + CMSG_UPDATE_ACCOUNT_DATA = 0x369C, + CMSG_UPDATE_CLIENT_SETTINGS = 0x3669, + CMSG_UPDATE_MISSILE_TRAJECTORY = 0x3A3E, + CMSG_UPDATE_RAID_TARGET = 0x3650, + CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36FA, + CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST = 0x36F5, + CMSG_UPDATE_WOW_TOKEN_COUNT = 0x36EB, + CMSG_UPGRADE_GARRISON = 0x3293, + CMSG_UPGRADE_ITEM = 0x320B, + CMSG_USED_FOLLOW = 0x3184, + CMSG_USE_CRITTER_ITEM = 0x3224, + CMSG_USE_EQUIPMENT_SET = 0x3995, + CMSG_USE_ITEM = 0x3271, + CMSG_USE_TOY = 0x3273, + CMSG_VIOLENCE_LEVEL = 0x3182, + CMSG_VOICE_ADD_IGNORE = 0x3656, + CMSG_VOICE_DEL_IGNORE = 0x3657, + CMSG_VOICE_SESSION_ENABLE = 0x3689, + CMSG_VOID_STORAGE_TRANSFER = 0x319C, + CMSG_WARDEN_DATA = 0x35EA, + CMSG_WHO = 0x3686, + CMSG_WHO_IS = 0x3685, + CMSG_WORLD_PORT_RESPONSE = 0x35F6, + CMSG_WORLD_TELEPORT = 0x3326, + 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 = 0x264D, + SMSG_ACCOUNT_DATA_TIMES = 0x2744, + SMSG_ACCOUNT_MOUNT_UPDATE = 0x25C1, + SMSG_ACCOUNT_TOYS_UPDATE = 0x25C2, + SMSG_ACHIEVEMENT_DELETED = 0x271A, + SMSG_ACHIEVEMENT_EARNED = 0x265B, + SMSG_ACTIVATE_TAXI_REPLY = 0x26A1, + SMSG_ACTIVE_GLYPHS = 0x2C52, + SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x2655, + SMSG_ADD_ITEM_PASSIVE = 0x25BD, + SMSG_ADD_LOSS_OF_CONTROL = 0x2691, + SMSG_ADD_RUNE_POWER = 0x26DE, + SMSG_ADJUST_SPLINE_DURATION = 0x25E4, + SMSG_AE_LOOT_TARGETS = 0x2628, + SMSG_AE_LOOT_TARGET_ACK = 0x2629, + SMSG_AI_REACTION = 0x26DB, + SMSG_ALL_ACCOUNT_CRITERIA = 0x2570, + SMSG_ALL_ACHIEVEMENT_DATA = 0x256F, + SMSG_ALL_GUILD_ACHIEVEMENTS = 0x29B8, + SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x2586, + SMSG_AREA_SPIRIT_HEALER_TIME = 0x277E, + SMSG_AREA_TRIGGER_DENIED = 0x2698, + SMSG_AREA_TRIGGER_NO_CORPSE = 0x2750, + SMSG_AREA_TRIGGER_RE_PATH = 0x263B, + SMSG_AREA_TRIGGER_RE_SHAPE = 0x2639, + SMSG_ARENA_ERROR = 0x270D, + SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2660, + SMSG_ARTIFACT_APPEARANCE_CHANGED = 0x27DE, + SMSG_ARTIFACT_FORGE_OPENED = 0x27DC, + SMSG_ARTIFACT_POWERS_UPDATED = 0x27DD, + SMSG_ARTIFACT_XP_GAIN = 0x281D, + SMSG_ATTACKER_STATE_UPDATE = 0x27C9, + SMSG_ATTACK_START = 0x2668, + SMSG_ATTACK_STOP = 0x2669, + SMSG_ATTACK_SWING_ERROR = 0x272F, + SMSG_ATTACK_SWING_LANDED_LOG = 0x2730, + SMSG_AUCTION_CLOSED_NOTIFICATION = 0x2724, + SMSG_AUCTION_COMMAND_RESULT = 0x2721, + SMSG_AUCTION_HELLO_RESPONSE = 0x271F, + SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT = 0x2728, + SMSG_AUCTION_LIST_ITEMS_RESULT = 0x2726, + SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT = 0x2727, + SMSG_AUCTION_LIST_PENDING_SALES_RESULT = 0x2729, + SMSG_AUCTION_OUTBID_NOTIFICATION = 0x2723, + SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x2725, + SMSG_AUCTION_REPLICATE_RESPONSE = 0x2720, + SMSG_AUCTION_WON_NOTIFICATION = 0x2722, + SMSG_AURA_POINTS_DEPLETED = 0x2C22, + SMSG_AURA_UPDATE = 0x2C21, + SMSG_AUTH_CHALLENGE = 0x3048, + SMSG_AUTH_RESPONSE = 0x256C, + SMSG_AVAILABLE_VOICE_CHANNEL = 0x2BB2, + SMSG_BAN_REASON = 0x26AD, + SMSG_BARBER_SHOP_RESULT = 0x26E4, + 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 = 0x279C, + SMSG_BATTLEGROUND_PLAYER_JOINED = 0x2598, + SMSG_BATTLEGROUND_PLAYER_LEFT = 0x2599, + SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x2595, + SMSG_BATTLEGROUND_POINTS = 0x279B, + SMSG_BATTLENET_CHALLENGE_ABORT = 0x27C8, + SMSG_BATTLENET_CHALLENGE_START = 0x27C7, + SMSG_BATTLENET_NOTIFICATION = 0x2832, + SMSG_BATTLENET_REALM_LIST_TICKET = 0x2834, + SMSG_BATTLENET_RESPONSE = 0x2831, + SMSG_BATTLENET_SET_SESSION_STATE = 0x2833, + SMSG_BATTLE_PAY_ACK_FAILED = 0x27C0, + SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x27BF, + SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x27B6, + SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x27B5, + SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x27B4, + SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x27B2, + SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x27B0, + SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x27B1, + SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x27BE, + SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x27BC, + SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x27BB, + SMSG_BATTLE_PAY_VAS_BOOST_CONSUMED = 0x27B3, + SMSG_BATTLE_PAY_VAS_CHARACTER_LIST = 0x2821, + SMSG_BATTLE_PAY_VAS_PURCHASE_COMPLETE = 0x2824, + SMSG_BATTLE_PAY_VAS_PURCHASE_LIST = 0x2825, + SMSG_BATTLE_PAY_VAS_PURCHASE_STARTED = 0x2823, + SMSG_BATTLE_PETS_HEALED = 0x2606, + SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x269B, + SMSG_BATTLE_PET_DELETED = 0x2603, + SMSG_BATTLE_PET_ERROR = 0x2650, + SMSG_BATTLE_PET_JOURNAL = 0x2602, + SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x2600, + SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x2601, + SMSG_BATTLE_PET_LICENSE_CHANGED = 0x2607, + SMSG_BATTLE_PET_MAX_COUNT_CHANGED = 0x25FE, + SMSG_BATTLE_PET_RESTORED = 0x2605, + SMSG_BATTLE_PET_REVOKED = 0x2604, + SMSG_BATTLE_PET_TRAP_LEVEL = 0x25FD, + SMSG_BATTLE_PET_UPDATES = 0x25FC, + SMSG_BINDER_CONFIRM = 0x2735, + SMSG_BIND_POINT_UPDATE = 0x257C, + SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x2640, + SMSG_BLACK_MARKET_OPEN_RESULT = 0x263E, + SMSG_BLACK_MARKET_OUTBID = 0x2641, + SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x263F, + SMSG_BLACK_MARKET_WON = 0x2642, + SMSG_BONUS_ROLL_EMPTY = 0x265D, + SMSG_BOSS_KILL_CREDIT = 0x27BA, + SMSG_BREAK_TARGET = 0x2667, + SMSG_BUY_FAILED = 0x26ED, + SMSG_BUY_SUCCEEDED = 0x26EC, + SMSG_CACHE_VERSION = 0x273E, + SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x26C1, + SMSG_CALENDAR_COMMAND_RESULT = 0x26C2, + SMSG_CALENDAR_EVENT_INITIAL_INVITES = 0x26B1, + SMSG_CALENDAR_EVENT_INVITE = 0x26B2, + SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x26B3, + SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS = 0x26B6, + SMSG_CALENDAR_EVENT_INVITE_NOTES = 0x26BB, + SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT = 0x26BC, + SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x26B7, + SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x26B8, + SMSG_CALENDAR_EVENT_INVITE_STATUS = 0x26B4, + SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x26B5, + SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x26B9, + SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x26BA, + SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x26BD, + SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x26BE, + SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x26BF, + SMSG_CALENDAR_SEND_CALENDAR = 0x26AF, + SMSG_CALENDAR_SEND_EVENT = 0x26B0, + SMSG_CALENDAR_SEND_NUM_PENDING = 0x26C0, + SMSG_CAMERA_EFFECT = 0x2762, + SMSG_CAMERA_SHAKE = 0x2763, + SMSG_CANCEL_AUTO_REPEAT = 0x270E, + SMSG_CANCEL_COMBAT = 0x272D, + SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x2C45, + SMSG_CANCEL_SCENE = 0x264F, + SMSG_CANCEL_SPELL_VISUAL = 0x2C43, + SMSG_CANCEL_SPELL_VISUAL_KIT = 0x2C47, + SMSG_CAN_DUEL_RESULT = 0x2671, + SMSG_CAST_FAILED = 0x2C55, + SMSG_CATEGORY_COOLDOWN = 0x2C16, + SMSG_CHALLEGE_MODE_REWARDS = 0x261D, + SMSG_CHALLENGE_MODE_ALL_MAP_STATS = 0x261E, + SMSG_CHALLENGE_MODE_COMPLETE = 0x261C, + SMSG_CHALLENGE_MODE_MAP_STATS_UPDATE = 0x261F, + SMSG_CHALLENGE_MODE_NEW_PLAYER_RECORD = 0x2621, + SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x2620, + SMSG_CHALLENGE_MODE_RESET = 0x261B, + SMSG_CHALLENGE_MODE_START = 0x261A, + SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x2731, + SMSG_CHANNEL_LIST = 0x2BC8, + SMSG_CHANNEL_NOTIFY = 0x2BC5, + SMSG_CHANNEL_NOTIFY_JOINED = 0x2BC6, + SMSG_CHANNEL_NOTIFY_LEFT = 0x2BC7, + SMSG_CHARACTER_CLASS_TRIAL_CREATE = 0x27F7, + SMSG_CHARACTER_ITEM_FIXUP = 0x283C, + SMSG_CHARACTER_LOGIN_FAILED = 0x273F, + SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x27C6, + SMSG_CHARACTER_RENAME_RESULT = 0x27A2, + SMSG_CHARACTER_UPGRADE_COMPLETE = 0x27F6, + SMSG_CHARACTER_UPGRADE_QUEUED = 0x27F5, + SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET = 0x25F1, + SMSG_CHARACTER_UPGRADE_STARTED = 0x27F4, + SMSG_CHAR_CUSTOMIZE = 0x2715, + SMSG_CHAR_CUSTOMIZE_FAILED = 0x2714, + SMSG_CHAR_FACTION_CHANGE_RESULT = 0x27E3, + SMSG_CHAT = 0x2BAD, + SMSG_CHAT_AUTO_RESPONDED = 0x2BBD, + SMSG_CHAT_DOWN = 0x2BC2, + 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 = 0x26E0, + SMSG_CLEAR_COOLDOWNS = 0x2C25, + SMSG_CLEAR_LOSS_OF_CONTROL = 0x2693, + SMSG_CLEAR_SPELL_CHARGES = 0x2C27, + SMSG_CLEAR_TARGET = 0x26D7, + SMSG_COIN_REMOVED = 0x2627, + SMSG_COMBAT_EVENT_FAILED = 0x266A, + SMSG_COMMENTATOR_MAP_INFO = 0x2741, + SMSG_COMMENTATOR_PLAYER_INFO = 0x2742, + SMSG_COMMENTATOR_STATE_CHANGED = 0x2740, + SMSG_COMPLAINT_RESULT = 0x26CF, + SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x27D8, + SMSG_CONNECT_TO = 0x304D, + SMSG_CONQUEST_FORMULA_CONSTANTS = 0x27C1, + SMSG_CONSOLE_WRITE = 0x264C, + SMSG_CONTACT_LIST = 0x27C4, + SMSG_CONTROL_UPDATE = 0x265F, + SMSG_COOLDOWN_CHEAT = 0x2777, + SMSG_COOLDOWN_EVENT = 0x26DF, + SMSG_CORPSE_LOCATION = 0x2666, + SMSG_CORPSE_RECLAIM_DELAY = 0x278A, + SMSG_CORPSE_TRANSPORT_QUERY = 0x274C, + SMSG_CREATE_CHAR = 0x273A, + SMSG_CREATE_SHIPMENT_RESPONSE = 0x27D7, + SMSG_CRITERIA_DELETED = 0x2719, + SMSG_CRITERIA_UPDATE = 0x2713, + SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26E8, + SMSG_CUSTOM_LOAD_SCREEN = 0x25DF, + SMSG_DAILY_QUESTS_RESET = 0x2A80, + SMSG_DAMAGE_CALC_LOG = 0x27FE, + SMSG_DANCE_STUDIO_CREATE_RESULT = 0x279F, + SMSG_DB_REPLY = 0x25A0, + SMSG_DEATH_RELEASE_LOC = 0x2701, + SMSG_DEFENSE_MESSAGE = 0x2BBB, + SMSG_DELETE_CHAR = 0x273B, + SMSG_DESTROY_ARENA_UNIT = 0x2780, + SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x272E, + SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x258A, + SMSG_DISENCHANT_CREDIT = 0x25BA, + SMSG_DISMOUNT = 0x26D6, + SMSG_DISMOUNT_RESULT = 0x257B, + SMSG_DISPEL_FAILED = 0x2C2F, + SMSG_DISPLAY_GAME_ERROR = 0x25B3, + SMSG_DISPLAY_PLAYER_CHOICE = 0x269C, + SMSG_DISPLAY_PROMOTION = 0x2663, + 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 = 0x266F, + SMSG_DUEL_COUNTDOWN = 0x266E, + SMSG_DUEL_IN_BOUNDS = 0x266D, + SMSG_DUEL_OUT_OF_BOUNDS = 0x266C, + SMSG_DUEL_REQUESTED = 0x266B, + SMSG_DUEL_WINNER = 0x2670, + SMSG_DURABILITY_DAMAGE_DEATH = 0x2786, + SMSG_EMOTE = 0x27FF, + SMSG_ENABLE_BARBER_SHOP = 0x26E3, + SMSG_ENABLE_ENCRYPTION = 0x3049, + SMSG_ENCHANTMENT_LOG = 0x274D, + SMSG_ENCOUNTER_END = 0x27B9, + SMSG_ENCOUNTER_START = 0x27B8, + SMSG_ENUM_CHARACTERS_RESULT = 0x2582, + SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x2C20, + SMSG_EQUIPMENT_SET_ID = 0x26D8, + SMSG_EXPECTED_SPAM_RECORDS = 0x2BB1, + SMSG_EXPLORATION_EXPERIENCE = 0x279E, + SMSG_FACTION_BONUS_INFO = 0x2761, + SMSG_FAILED_PLAYER_CONDITION = 0x25DE, + SMSG_FEATURE_SYSTEM_STATUS = 0x25CE, + SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x25CF, + SMSG_FEIGN_DEATH_RESISTED = 0x2783, + SMSG_FISH_ESCAPED = 0x26F5, + SMSG_FISH_NOT_HOOKED = 0x26F4, + SMSG_FLIGHT_SPLINE_SYNC = 0x2DF7, + SMSG_FORCED_DEATH_UPDATE = 0x2702, + SMSG_FORCE_ANIM = 0x2790, + SMSG_FORCE_OBJECT_RELINK = 0x2662, + SMSG_FRIEND_STATUS = 0x27C5, + SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x25D2, + SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x25D3, + SMSG_GAME_OBJECT_DESPAWN = 0x25D4, + SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x2C4A, + SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x2C49, + SMSG_GAME_OBJECT_RESET_STATE = 0x2758, + SMSG_GAME_OBJECT_SET_STATE = 0x2830, + SMSG_GAME_OBJECT_UI_ACTION = 0x2755, + SMSG_GAME_SPEED_SET = 0x26A5, + SMSG_GAME_TIME_SET = 0x2746, + SMSG_GAME_TIME_UPDATE = 0x2745, + SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x2902, + SMSG_GARRISON_ADD_MISSION_RESULT = 0x2906, + SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x2918, + 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 = 0x27DA, + 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 = 0x27A0, + SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE = 0x2928, + SMSG_GET_GARRISON_INFO_RESULT = 0x28F0, + SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x27D9, + SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x27D5, + SMSG_GET_TROPHY_LIST_RESPONSE = 0x27FA, + SMSG_GM_PLAYER_INFO = 0x2776, + SMSG_GM_REQUEST_PLAYER_INFO = 0x25E9, + SMSG_GM_TICKET_CASE_STATUS = 0x26C8, + SMSG_GM_TICKET_SYSTEM_STATUS = 0x26C7, + SMSG_GOD_MODE = 0x2734, + SMSG_GOSSIP_COMPLETE = 0x2A96, + SMSG_GOSSIP_MESSAGE = 0x2A97, + SMSG_GOSSIP_POI = 0x27D2, + SMSG_GROUP_ACTION_THROTTLED = 0x259C, + SMSG_GROUP_DECLINE = 0x27CD, + SMSG_GROUP_DESTROYED = 0x27CF, + SMSG_GROUP_NEW_LEADER = 0x2645, + SMSG_GROUP_UNINVITE = 0x27CE, + SMSG_GUILD_ACHIEVEMENT_DELETED = 0x29C5, + SMSG_GUILD_ACHIEVEMENT_EARNED = 0x29C4, + SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x29C7, + 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 = 0x26F8, + SMSG_HIGHEST_THREAT_UPDATE = 0x2708, + SMSG_HOTFIX_NOTIFY = 0x25A1, + SMSG_HOTFIX_NOTIFY_BLOB = 0x25A2, + SMSG_INITIALIZE_FACTIONS = 0x2760, + SMSG_INITIAL_SETUP = 0x257F, + SMSG_INIT_WORLD_STATES = 0x2787, + SMSG_INSPECT_HONOR_STATS = 0x25B0, + SMSG_INSPECT_PVP = 0x275C, + SMSG_INSPECT_RESULT = 0x2649, + SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x27E9, + SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x27E8, + SMSG_INSTANCE_ENCOUNTER_END = 0x27EF, + SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x27E7, + SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x27F1, + SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x27F0, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x27EC, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x27EB, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x27EE, + SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x27F2, + SMSG_INSTANCE_ENCOUNTER_START = 0x27ED, + SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x27EA, + SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x2732, + SMSG_INSTANCE_INFO = 0x264B, + SMSG_INSTANCE_RESET = 0x26AA, + SMSG_INSTANCE_RESET_FAILED = 0x26AB, + SMSG_INSTANCE_SAVE_CREATED = 0x27B7, + SMSG_INVALIDATE_PAGE_TEXT = 0x26FD, + SMSG_INVALIDATE_PLAYER = 0x26CE, + SMSG_INVALID_PROMOTION_CODE = 0x2791, + SMSG_INVENTORY_CHANGE_FAILURE = 0x275E, + SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x2A83, + SMSG_ITEM_CHANGED = 0x271C, + SMSG_ITEM_COOLDOWN = 0x27FD, + SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x2793, + SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x25AF, + SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x25AD, + SMSG_ITEM_PUSH_RESULT = 0x2634, + SMSG_ITEM_TIME_UPDATE = 0x2792, + SMSG_KICK_REASON = 0x2820, + SMSG_LEARNED_SPELLS = 0x2C4C, + SMSG_LEARN_PVP_TALENTS_FAILED = 0x25E6, + SMSG_LEARN_TALENTS_FAILED = 0x25E5, + SMSG_LEVEL_UPDATE = 0x2587, + SMSG_LEVEL_UP_INFO = 0x271B, + 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 = 0x27AE, + SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x27AC, + SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A1, + SMSG_LOAD_CUF_PROFILES = 0x25CB, + SMSG_LOAD_EQUIPMENT_SET = 0x2748, + SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x27FB, + SMSG_LOGIN_SET_TIME_SPEED = 0x2747, + SMSG_LOGIN_VERIFY_WORLD = 0x25AA, + SMSG_LOGOUT_CANCEL_ACK = 0x26A9, + SMSG_LOGOUT_COMPLETE = 0x26A8, + SMSG_LOGOUT_RESPONSE = 0x26A7, + SMSG_LOG_XP_GAIN = 0x2717, + SMSG_LOOT_ALL_PASSED = 0x2632, + SMSG_LOOT_ITEM_LIST = 0x2630, + SMSG_LOOT_LIST = 0x277F, + SMSG_LOOT_MONEY_NOTIFY = 0x262C, + SMSG_LOOT_RELEASE = 0x262B, + SMSG_LOOT_RELEASE_ALL = 0x262A, + SMSG_LOOT_REMOVED = 0x2625, + SMSG_LOOT_RESPONSE = 0x2624, + SMSG_LOOT_ROLL = 0x262E, + SMSG_LOOT_ROLLS_COMPLETE = 0x2631, + SMSG_LOOT_ROLL_WON = 0x2633, + SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x2690, + SMSG_MAIL_COMMAND_RESULT = 0x2653, + SMSG_MAIL_LIST_RESULT = 0x2794, + SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x2795, + SMSG_MAP_OBJECTIVES_INIT = 0x279D, + SMSG_MAP_OBJ_EVENTS = 0x25D5, + SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x262F, + SMSG_MESSAGE_BOX = 0x2575, + SMSG_MINIMAP_PING = 0x26F3, + SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x2C14, + SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x2C13, + SMSG_MISSILE_CANCEL = 0x25D6, + SMSG_MODIFY_CHARGE_RECOVERY_SPEED = 0x27A5, + SMSG_MODIFY_COOLDOWN = 0x27A3, + SMSG_MODIFY_COOLDOWN_RECOVERY_SPEED = 0x27A4, + SMSG_MODIFY_PARTY_RANGE = 0x2782, + SMSG_MOTD = 0x2BAF, + SMSG_MOUNT_RESULT = 0x257A, + SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x2DE1, + 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 = 0x26A2, + SMSG_NEW_WORLD = 0x25A9, + SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x2C42, + SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x26CD, + SMSG_NOTIFY_MONEY = 0x25AC, + SMSG_NOTIFY_RECEIVED_MAIL = 0x2654, + SMSG_OFFER_PETITION_ERROR = 0x26DC, + SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x2718, + SMSG_ON_MONSTER_MOVE = 0x2DA2, + SMSG_OPEN_CONTAINER = 0x275F, + SMSG_OPEN_LFG_DUNGEON_FINDER = 0x2A32, + SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x27D4, + SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x27D6, + SMSG_OVERRIDE_LIGHT = 0x26E2, + SMSG_PAGE_TEXT = 0x2754, + SMSG_PARTY_COMMAND_RESULT = 0x27D1, + SMSG_PARTY_INVITE = 0x25CC, + SMSG_PARTY_KILL_LOG = 0x2799, + SMSG_PARTY_MEMBER_STATE = 0x2797, + SMSG_PARTY_UPDATE = 0x2608, + SMSG_PAUSE_MIRROR_TIMER = 0x274A, + SMSG_PENDING_RAID_LOCK = 0x272C, + SMSG_PETITION_ALREADY_SIGNED = 0x25B6, + SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x29F7, + SMSG_PETITION_SHOW_LIST = 0x26E5, + SMSG_PETITION_SHOW_SIGNATURES = 0x26E6, + SMSG_PETITION_SIGN_RESULTS = 0x278B, + SMSG_PET_ACTION_FEEDBACK = 0x2789, + SMSG_PET_ACTION_SOUND = 0x26C4, + SMSG_PET_ADDED = 0x25A6, + SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x2615, + SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x2697, + SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x260E, + SMSG_PET_BATTLE_FINAL_ROUND = 0x2613, + SMSG_PET_BATTLE_FINISHED = 0x2614, + SMSG_PET_BATTLE_FIRST_ROUND = 0x2610, + SMSG_PET_BATTLE_INITIAL_UPDATE = 0x260F, + SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x2616, + SMSG_PET_BATTLE_PVP_CHALLENGE = 0x260D, + SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x2651, + SMSG_PET_BATTLE_QUEUE_STATUS = 0x2652, + SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x2612, + SMSG_PET_BATTLE_REQUEST_FAILED = 0x260C, + SMSG_PET_BATTLE_ROUND_RESULT = 0x2611, + SMSG_PET_BATTLE_SLOT_UPDATES = 0x25FF, + SMSG_PET_CAST_FAILED = 0x2C56, + SMSG_PET_CLEAR_SPELLS = 0x2C23, + SMSG_PET_DISMISS_SOUND = 0x26C5, + SMSG_PET_GOD_MODE = 0x269F, + SMSG_PET_GUIDS = 0x273D, + SMSG_PET_LEARNED_SPELLS = 0x2C4E, + SMSG_PET_MODE = 0x2589, + SMSG_PET_NAME_INVALID = 0x26EA, + SMSG_PET_SLOT_UPDATED = 0x2588, + SMSG_PET_SPELLS_MESSAGE = 0x2C24, + SMSG_PET_STABLE_LIST = 0x25A7, + SMSG_PET_STABLE_RESULT = 0x25A8, + SMSG_PET_TAME_FAILURE = 0x26D9, + SMSG_PET_UNLEARNED_SPELLS = 0x2C4F, + SMSG_PHASE_SHIFT_CHANGE = 0x2577, + SMSG_PLAYED_TIME = 0x2704, + SMSG_PLAYER_BOUND = 0x257D, + SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x29F6, + SMSG_PLAYER_SKINNED = 0x2784, + SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x2798, + SMSG_PLAY_MUSIC = 0x27A8, + SMSG_PLAY_OBJECT_SOUND = 0x27A9, + SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x276E, + SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x2C46, + SMSG_PLAY_SCENE = 0x264E, + SMSG_PLAY_SOUND = 0x27A7, + SMSG_PLAY_SPEAKERBOT_SOUND = 0x27AA, + SMSG_PLAY_SPELL_VISUAL = 0x2C44, + SMSG_PLAY_SPELL_VISUAL_KIT = 0x2C48, + SMSG_PLAY_TIME_WARNING = 0x2736, + SMSG_PONG = 0x304E, + SMSG_POWER_UPDATE = 0x26F9, + SMSG_PRESTIGE_AND_HONOR_INVOLUNTARILY_CHANGED = 0x2753, + SMSG_PRE_RESSURECT = 0x27A6, + SMSG_PRINT_NOTIFICATION = 0x25DD, + SMSG_PROC_RESIST = 0x279A, + SMSG_PROPOSE_LEVEL_GRANT = 0x270C, + SMSG_PUSH_SPELL_TO_ACTION_BAR = 0x2C50, + SMSG_PVP_CREDIT = 0x2712, + SMSG_PVP_LOG_DATA = 0x25B1, + SMSG_PVP_OPTIONS_ENABLED = 0x25B4, + SMSG_PVP_SEASON = 0x25D0, + SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x26FF, + SMSG_QUERY_CREATURE_RESPONSE = 0x26F6, + SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x26F7, + SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE = 0x292B, + SMSG_QUERY_GUILD_INFO_RESPONSE = 0x29E5, + SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x27FC, + SMSG_QUERY_NPC_TEXT_RESPONSE = 0x26FA, + SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x26FC, + SMSG_QUERY_PETITION_RESPONSE = 0x2700, + SMSG_QUERY_PET_NAME_RESPONSE = 0x26FE, + SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x26FB, + SMSG_QUERY_QUEST_INFO_RESPONSE = 0x2A95, + SMSG_QUERY_QUEST_REWARD_RESPONSE = 0x2835, + SMSG_QUERY_TIME_RESPONSE = 0x2716, + 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 = 0x27C2, + SMSG_RAID_DIFFICULTY_SET = 0x27E4, + SMSG_RAID_GROUP_ONLY = 0x27E6, + SMSG_RAID_INSTANCE_MESSAGE = 0x2BB9, + SMSG_RAID_MARKERS_CHANGED = 0x25B7, + SMSG_RANDOM_ROLL = 0x2648, + 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 = 0x27E0, + SMSG_READ_ITEM_RESULT_OK = 0x27DB, + SMSG_REALM_QUERY_RESPONSE = 0x26E1, + SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x27C3, + SMSG_REFER_A_FRIEND_EXPIRED = 0x275D, + SMSG_REFER_A_FRIEND_FAILURE = 0x26E7, + SMSG_REFRESH_COMPONENT = 0x2673, + SMSG_REFRESH_SPELL_HISTORY = 0x2C2B, + SMSG_REMOVE_ITEM_PASSIVE = 0x25BE, + SMSG_REMOVE_LOSS_OF_CONTROL = 0x2692, + SMSG_REPLACE_TROPHY_RESPONSE = 0x27F9, + SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x26D5, + SMSG_REQUEST_ADDON_LIST = 0x265A, + SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x259D, + SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x25D1, + SMSG_RESEARCH_COMPLETE = 0x2585, + SMSG_RESET_AREA_TRIGGER = 0x263C, + SMSG_RESET_COMPRESSION_CONTEXT = 0x304F, + SMSG_RESET_FAILED_NOTIFY = 0x26DD, + SMSG_RESET_RANGED_COMBAT_TIMER = 0x270F, + SMSG_RESET_WEEKLY_CURRENCY = 0x2574, + SMSG_RESPEC_WIPE_CONFIRM = 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 = 0x2739, + SMSG_ROLE_CHANGED_INFORM = 0x258C, + SMSG_ROLE_CHOSEN = 0x2A3A, + SMSG_ROLE_POLL_INFORM = 0x258D, + SMSG_RUNE_REGEN_DEBUG = 0x25C5, + SMSG_SCENARIO_BOOT = 0x27E1, + SMSG_SCENARIO_COMPLETED = 0x281C, + SMSG_SCENARIO_POIS = 0x264A, + SMSG_SCENARIO_PROGRESS_UPDATE = 0x2644, + SMSG_SCENARIO_SPELL_UPDATE = 0x2828, + SMSG_SCENARIO_STATE = 0x2643, + SMSG_SCENE_OBJECT_EVENT = 0x25F4, + SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x25F9, + SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x25FA, + SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x25F6, + SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x25F5, + SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x25F8, + SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x25F7, + SMSG_SCRIPT_CAST = 0x2C54, + SMSG_SELL_RESPONSE = 0x26EB, + SMSG_SEND_ITEM_PASSIVES = 0x25BF, + SMSG_SEND_KNOWN_SPELLS = 0x2C29, + SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x2646, + SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x2647, + SMSG_SEND_SPELL_CHARGES = 0x2C2C, + SMSG_SEND_SPELL_HISTORY = 0x2C2A, + SMSG_SEND_UNLEARN_SPELLS = 0x2C2D, + SMSG_SERVER_FIRST_ACHIEVEMENT = 0x2BC1, + SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x2665, + SMSG_SERVER_TIME = 0x26A6, + SMSG_SETUP_CURRENCY = 0x2572, + SMSG_SETUP_RESEARCH_HISTORY = 0x2584, + SMSG_SET_AI_ANIM_KIT = 0x276D, + SMSG_SET_ALL_TASK_PROGRESS = 0x27CB, + SMSG_SET_ANIM_TIER = 0x2771, + SMSG_SET_CURRENCY = 0x2573, + SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x2A2E, + SMSG_SET_DUNGEON_DIFFICULTY = 0x26C9, + SMSG_SET_FACTION_AT_WAR = 0x2738, + SMSG_SET_FACTION_NOT_VISIBLE = 0x2768, + SMSG_SET_FACTION_STANDING = 0x2769, + SMSG_SET_FACTION_VISIBLE = 0x2767, + SMSG_SET_FLAT_SPELL_MODIFIER = 0x2C36, + SMSG_SET_FORCED_REACTIONS = 0x2757, + SMSG_SET_ITEM_PURCHASE_DATA = 0x25AE, + SMSG_SET_LOOT_METHOD_FAILED = 0x2808, + SMSG_SET_MAX_WEEKLY_QUANTITY = 0x25B5, + SMSG_SET_MELEE_ANIM_KIT = 0x2770, + SMSG_SET_MOVEMENT_ANIM_KIT = 0x276F, + SMSG_SET_PCT_SPELL_MODIFIER = 0x2C37, + SMSG_SET_PET_SPECIALIZATION = 0x263D, + SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x2703, + SMSG_SET_PLAY_HOVER_ANIM = 0x25C9, + SMSG_SET_PROFICIENCY = 0x2772, + SMSG_SET_SPELL_CHARGES = 0x2C28, + SMSG_SET_TASK_COMPLETE = 0x27CC, + SMSG_SET_TIME_ZONE_INFORMATION = 0x269A, + SMSG_SET_VEHICLE_REC_ID = 0x272B, + SMSG_SHOW_ADVENTURE_MAP = 0x2826, + SMSG_SHOW_BANK = 0x26A3, + SMSG_SHOW_MAILBOX = 0x27E2, + SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x25ED, + SMSG_SHOW_TAXI_NODES = 0x26F2, + SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x27AF, + SMSG_SOCKET_GEMS = 0x2764, + SMSG_SOCKET_GEMS_FAILURE = 0x2765, + SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x25EF, + SMSG_SPECIALIZATION_CHANGED = 0x25E8, + SMSG_SPECIAL_MOUNT_ANIM = 0x26C3, + SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x2752, + SMSG_SPELL_ABSORB_LOG = 0x2C1E, + SMSG_SPELL_CATEGORY_COOLDOWN = 0x2C17, + SMSG_SPELL_CHANNEL_START = 0x2C34, + 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 = 0x274F, + SMSG_STAND_STATE_UPDATE = 0x2756, + SMSG_START_ELAPSED_TIMER = 0x2617, + SMSG_START_ELAPSED_TIMERS = 0x2619, + SMSG_START_LOOT_ROLL = 0x262D, + SMSG_START_MIRROR_TIMER = 0x2749, + SMSG_START_TIMER = 0x25B9, + SMSG_STOP_ELAPSED_TIMER = 0x2618, + SMSG_STOP_MIRROR_TIMER = 0x274B, + SMSG_STOP_SPEAKERBOT_SOUND = 0x27AB, + SMSG_STREAMING_MOVIES = 0x25B8, + SMSG_SUMMON_CANCEL = 0x26D4, + SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x258E, + SMSG_SUMMON_REQUEST = 0x275B, + SMSG_SUPERCEDED_SPELLS = 0x2C4B, + SMSG_SUSPEND_COMMS = 0x304A, + SMSG_SUSPEND_TOKEN = 0x25BB, + SMSG_TALENTS_INVOLUNTARILY_RESET = 0x2751, + SMSG_TAXI_NODE_STATUS = 0x26A0, + SMSG_TEXT_EMOTE = 0x269E, + SMSG_THREAT_CLEAR = 0x270B, + SMSG_THREAT_REMOVE = 0x270A, + SMSG_THREAT_UPDATE = 0x2709, + SMSG_TIME_ADJUSTMENT = 0x2DA1, + SMSG_TIME_SYNC_REQUEST = 0x2DA0, + SMSG_TITLE_EARNED = 0x2706, + SMSG_TITLE_LOST = 0x2707, + SMSG_TOTEM_CREATED = 0x26EE, + SMSG_TOTEM_MOVED = 0x26EF, + SMSG_TRADE_STATUS = 0x2581, + SMSG_TRADE_UPDATED = 0x2580, + SMSG_TRAINER_BUY_FAILED = 0x2711, + SMSG_TRAINER_LIST = 0x2710, + SMSG_TRANSFER_ABORTED = 0x273C, + SMSG_TRANSFER_PENDING = 0x25E1, + SMSG_TRANSMOG_COLLECTION_UPDATE = 0x25C4, + SMSG_TRIGGER_CINEMATIC = 0x2800, + SMSG_TRIGGER_MOVIE = 0x26F0, + SMSG_TURN_IN_PETITION_RESULT = 0x278D, + SMSG_TUTORIAL_FLAGS = 0x27F3, + SMSG_TUTORIAL_HIGHLIGHT_SPELL = 0x282F, + SMSG_TUTORIAL_UNHIGHLIGHT_SPELL = 0x282E, + SMSG_TWITTER_STATUS = 0x2FFD, + SMSG_UI_TIME = 0x274E, + SMSG_UNDELETE_CHARACTER_RESPONSE = 0x2803, + SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x2804, + SMSG_UNLEARNED_SPELLS = 0x2C4D, + SMSG_UPDATE_ACCOUNT_DATA = 0x2743, + SMSG_UPDATE_ACTION_BUTTONS = 0x25F2, + SMSG_UPDATE_CHARACTER_FLAGS = 0x27F8, + SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT = 0x2A31, + SMSG_UPDATE_EXPANSION_LEVEL = 0x265E, + SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x26CC, + SMSG_UPDATE_LAST_INSTANCE = 0x26AC, + SMSG_UPDATE_OBJECT = 0x2801, + SMSG_UPDATE_TALENT_DATA = 0x25E7, + SMSG_UPDATE_TASK_PROGRESS = 0x27CA, + SMSG_UPDATE_WEEKLY_SPELL_USAGE = 0x2C19, + SMSG_UPDATE_WORLD_STATE = 0x2788, + SMSG_USERLIST_ADD = 0x2BBE, + SMSG_USERLIST_REMOVE = 0x2BBF, + SMSG_USERLIST_UPDATE = 0x2BC0, + SMSG_USE_EQUIPMENT_SET_RESULT = 0x278E, + SMSG_VENDOR_INVENTORY = 0x25C7, + SMSG_VIGNETTE_UPDATE = 0x27AD, + SMSG_VOICE_CHAT_STATUS = 0x2BB3, + SMSG_VOICE_PARENTAL_CONTROLS = 0x2BB4, + SMSG_VOICE_SESSION_LEAVE = 0x2BB6, + SMSG_VOICE_SESSION_ROSTER_UPDATE = 0x2BB5, + SMSG_VOID_ITEM_SWAP_RESPONSE = 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 = 0x26CB, + SMSG_WEEKLY_SPELL_USAGE = 0x2C18, + SMSG_WHO = 0x2BAE, + SMSG_WHO_IS = 0x26CA, + SMSG_WORLD_SERVER_INFO = 0x25C0, + SMSG_WORLD_TEXT = 0x281E, + SMSG_WOW_TOKEN_AUCTION_SOLD = 0x280E, + SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION = 0x2810, + SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION = 0x2811, + SMSG_WOW_TOKEN_CAN_VETERAN_BUY_RESULT = 0x280F, + SMSG_WOW_TOKEN_DISTRIBUTION_GLUE_UPDATE = 0x2809, + SMSG_WOW_TOKEN_DISTRIBUTION_UPDATE = 0x280A, + SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE = 0x280B, + SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED = 0x2812, + SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION = 0x2813, + SMSG_WOW_TOKEN_REDEEM_RESULT = 0x2814, + SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION = 0x280C, + SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION = 0x280D, + SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE = 0x2815, + SMSG_XP_GAIN_ABORTED = 0x25DC, + SMSG_XP_GAIN_ENABLED = 0x27E5, + SMSG_ZONE_UNDER_ATTACK = 0x2BBA, // Opcodes that are not generated automatically - SMSG_ACCOUNT_HEIRLOOM_UPDATE = 0x254B, // no client handler - SMSG_COMPRESSED_PACKET = 0x2FCF, - SMSG_MULTIPLE_PACKETS = 0x2FCE, + SMSG_ACCOUNT_HEIRLOOM_UPDATE = 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) @@ -1780,9 +1831,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"; @@ -1794,7 +1845,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..937961ad571 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 @@ -1236,7 +1153,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 26e8329ee9c..3093b05163c 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; @@ -507,7 +504,6 @@ namespace WorldPackets class PetAction; class PetCancelAura; class PetSetAction; - class LearnPetSpecializationGroup; } namespace Petition @@ -618,7 +614,6 @@ namespace WorldPackets namespace Talent { - class SetSpecialization; class LearnTalents; class ConfirmRespecWipe; } @@ -900,8 +895,6 @@ class TC_GAME_API WorldSession bool PlayerRecentlyLoggedOut() const { return m_playerRecentlyLogout; } bool PlayerDisconnected() const; - void ReadAddonsInfo(ByteBuffer& data); - void SendAddonsInfo(); bool IsAddonRegistered(const std::string& prefix) const; void SendPacket(WorldPacket const* packet, bool forced = false); @@ -1164,10 +1157,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); @@ -1445,7 +1434,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); @@ -1519,7 +1507,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); @@ -1660,7 +1647,6 @@ class TC_GAME_API WorldSession // Miscellaneous void HandleSpellClick(WorldPackets::Spells::SpellClick& spellClick); void HandleMirrorImageDataRequest(WorldPackets::Spells::GetMirrorImageData& getMirrorImageData); - void HandleRemoveGlyph(WorldPacket& recvData); void HandleGuildSetFocusedAchievement(WorldPackets::Achievement::GuildSetFocusedAchievement& setFocusedAchievement); void HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipmentSet& saveEquipmentSet); void HandleDeleteEquipmentSet(WorldPackets::EquipmentSet::DeleteEquipmentSet& deleteEquipmentSet); @@ -1826,8 +1812,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 @@ -1844,7 +1828,6 @@ class TC_GAME_API WorldSession AccountData _accountData[NUM_ACCOUNT_DATA_TYPES]; uint32 _tutorials[MAX_ACCOUNT_TUTORIAL_VALUES]; bool _tutorialsChanged; - AddonsList m_addonsList; std::vector<std::string> _registeredAddonPrefixes; bool _filterAddonMessages; uint32 recruiterId; diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 82acf2b1811..12a62619798 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -56,24 +56,23 @@ private: using boost::asio::ip::tcp; -uint32 const WorldSocket::ConnectionInitializeMagic = 0xF5EB1CE; std::string const WorldSocket::ServerConnectionInitialize("WORLD OF WARCRAFT CONNECTION - SERVER TO CLIENT"); -std::string const WorldSocket::ClientConnectionInitialize("WORLD OF WARCRAFT CONNECTION - CLIENT TO SERVER", 48); +std::string const WorldSocket::ClientConnectionInitialize("WORLD OF WARCRAFT CONNECTION - CLIENT TO SERVER"); uint32 const WorldSocket::MinSizeForCompression = 0x400; -uint32 const SizeOfClientHeader[2] = { sizeof(uint16) + sizeof(uint16), sizeof(uint32) + sizeof(uint16) }; -uint32 const SizeOfServerHeader[2] = { sizeof(uint16) + sizeof(uint16), sizeof(uint32) + sizeof(uint16) }; +uint32 const SizeOfClientHeader = sizeof(uint32) + sizeof(uint16); +uint32 const SizeOfServerHeader = sizeof(uint32) + sizeof(uint16); uint8 const WorldSocket::AuthCheckSeed[16] = { 0xC5, 0xC6, 0x98, 0x95, 0x76, 0x3F, 0x1D, 0xCD, 0xB6, 0xA1, 0x37, 0x28, 0xB3, 0x12, 0xFF, 0x8A }; uint8 const WorldSocket::SessionKeySeed[16] = { 0x58, 0xCB, 0xCF, 0x40, 0xFE, 0x2E, 0xCE, 0xA6, 0x5A, 0x90, 0xB8, 0x01, 0x68, 0x6C, 0x28, 0x0B }; uint8 const WorldSocket::ContinuedSessionSeed[16] = { 0x16, 0xAD, 0x0C, 0xD4, 0x46, 0xF9, 0x4F, 0xB2, 0xEF, 0x7D, 0xEA, 0x2A, 0x17, 0x66, 0x4D, 0x2F }; WorldSocket::WorldSocket(tcp::socket&& socket) : Socket(std::move(socket)), - _type(CONNECTION_TYPE_REALM), _OverSpeedPings(0), + _type(CONNECTION_TYPE_REALM), _key(0), _OverSpeedPings(0), _worldSession(nullptr), _authed(false), _compressionStream(nullptr) { _serverChallenge.SetRand(8 * 16); - _headerBuffer.Resize(SizeOfClientHeader[0]); + _headerBuffer.Resize(SizeOfClientHeader); } WorldSocket::~WorldSocket() @@ -120,16 +119,13 @@ void WorldSocket::CheckIpCallback(PreparedQueryResult result) } } - _packetBuffer.Resize(4 + 2 + ClientConnectionInitialize.length()); + _packetBuffer.Resize(ClientConnectionInitialize.length() + 1); AsyncReadWithCallback(&WorldSocket::InitializeHandler); MessageBuffer initializer; - ServerPktHeader header; - header.Setup.Size = ServerConnectionInitialize.size(); - initializer.Write(&ConnectionInitializeMagic, sizeof(ConnectionInitializeMagic)); - initializer.Write(&header, sizeof(header.Setup.Size)); initializer.Write(ServerConnectionInitialize.c_str(), ServerConnectionInitialize.length()); + initializer.Write("\n", 1); // - io_service.run thread, safe. QueuePacket(std::move(initializer)); @@ -163,26 +159,17 @@ void WorldSocket::InitializeHandler(boost::system::error_code error, std::size_t return; } - uint32 magic; - uint16 length; ByteBuffer buffer(std::move(_packetBuffer)); - - buffer >> magic; - if (magic != ConnectionInitializeMagic) - { - CloseSocket(); - return; - } - - buffer >> length; - if (length > ClientConnectionInitialize.length()) + std::string initializer = buffer.ReadString(ClientConnectionInitialize.length()); + if (initializer != ClientConnectionInitialize) { CloseSocket(); return; } - std::string initializer = buffer.ReadString(length); - if (initializer != ClientConnectionInitialize) + uint8 terminator; + buffer >> terminator; + if (terminator != '\n') { CloseSocket(); return; @@ -218,22 +205,21 @@ bool WorldSocket::Update() MessageBuffer buffer; while (_bufferQueue.Dequeue(queued)) { - uint32 sizeOfHeader = SizeOfServerHeader[queued->NeedsEncryption()]; uint32 packetSize = queued->size(); if (packetSize > MinSizeForCompression && queued->NeedsEncryption()) packetSize = compressBound(packetSize) + sizeof(CompressedWorldPacket); - if (buffer.GetRemainingSpace() < packetSize + sizeOfHeader) + if (buffer.GetRemainingSpace() < packetSize + SizeOfServerHeader) { QueuePacket(std::move(buffer)); buffer.Resize(4096); } - if (buffer.GetRemainingSpace() >= packetSize + sizeOfHeader) + if (buffer.GetRemainingSpace() >= packetSize + SizeOfServerHeader) WritePacketToBuffer(*queued, buffer); else // single packet larger than 4096 bytes { - MessageBuffer packetBuffer(packetSize + sizeOfHeader); + MessageBuffer packetBuffer(packetSize + SizeOfServerHeader); WritePacketToBuffer(*queued, packetBuffer); QueuePacket(std::move(packetBuffer)); } @@ -340,20 +326,6 @@ void WorldSocket::ReadHandler() AsyncRead(); } -void WorldSocket::ExtractOpcodeAndSize(ClientPktHeader const* header, uint32& opcode, uint32& size) const -{ - if (_authCrypt.IsInitialized()) - { - opcode = header->Normal.Command; - size = header->Normal.Size - 2; - } - else - { - opcode = header->Setup.Command; - size = header->Setup.Size - 2; - } -} - void WorldSocket::SetWorldSession(WorldSession* session) { std::lock_guard<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()); @@ -459,6 +423,10 @@ WorldSocket::ReadDataHandlerResult WorldSocket::ReadDataHandler() HandleConnectToFailed(connectToFailed); break; } + case CMSG_ENABLE_ENCRYPTION_ACK: + LogOpcodeText(opcode, sessionGuard); + HandleEnableEncryptionAck(); + break; default: { sessionGuard.lock(); @@ -523,14 +491,12 @@ void WorldSocket::SendPacket(WorldPacket const& packet) void WorldSocket::WritePacketToBuffer(EncryptablePacket const& packet, MessageBuffer& buffer) { - ServerPktHeader header; - uint32 sizeOfHeader = SizeOfServerHeader[packet.NeedsEncryption()]; uint32 opcode = packet.GetOpcode(); uint32 packetSize = packet.size(); // Reserve space for buffer uint8* headerPos = buffer.GetWritePointer(); - buffer.WriteCompleted(sizeOfHeader); + buffer.WriteCompleted(SizeOfServerHeader); if (packetSize > MinSizeForCompression && packet.NeedsEncryption()) { @@ -557,19 +523,12 @@ void WorldSocket::WritePacketToBuffer(EncryptablePacket const& packet, MessageBu packetSize += 2 /*opcode*/; - if (packet.NeedsEncryption()) - { - header.Normal.Size = packetSize; - header.Normal.Command = opcode; - _authCrypt.EncryptSend((uint8*)&header, 4); - } - else - { - header.Setup.Size = packetSize; - header.Setup.Command = opcode; - } + PacketHeader header; + header.Size = packetSize; + header.Command = opcode; + _authCrypt.EncryptSend((uint8*)&header, 4); - memcpy(headerPos, &header, sizeOfHeader); + memcpy(headerPos, &header, SizeOfServerHeader); } uint32 WorldSocket::CompressPacket(uint8* buffer, WorldPacket const& packet) @@ -666,9 +625,6 @@ struct AccountInfo void WorldSocket::HandleAuthSession(std::shared_ptr<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)); @@ -718,10 +674,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); @@ -731,7 +684,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); @@ -838,11 +791,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(); @@ -854,7 +806,7 @@ void WorldSocket::LoadSessionPermissionsCallback(PreparedQueryResult result) // RBAC must be loaded before adding session to check for skip queue permission _worldSession->GetRBACData()->LoadFromDBCallback(result); - sWorld->AddSession(_worldSession); + SendPacketAndLogOpcode(*WorldPackets::Auth::EnableEncryption().Write()); } void WorldSocket::HandleAuthContinuedSession(std::shared_ptr<WorldPackets::Auth::AuthContinuedSession> authSession) @@ -870,9 +822,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); @@ -891,17 +840,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); @@ -915,7 +861,7 @@ void WorldSocket::HandleAuthContinuedSessionCallback(std::shared_ptr<WorldPacket return; } - sWorld->AddInstanceSocket(shared_from_this(), authSession->Key); + SendPacketAndLogOpcode(*WorldPackets::Auth::EnableEncryption().Write()); AsyncRead(); } @@ -957,6 +903,20 @@ void WorldSocket::HandleConnectToFailed(WorldPackets::Auth::ConnectToFailed& con } } +void WorldSocket::HandleEnableEncryptionAck() +{ + if (_type == CONNECTION_TYPE_REALM) + { + _authCrypt.Init(&_sessionKey); + sWorld->AddSession(_worldSession); + } + else + { + _authCrypt.Init(&_sessionKey, _encryptSeed.AsByteArray().get(), _decryptSeed.AsByteArray().get()); + sWorld->AddInstanceSocket(shared_from_this(), _key); + } +} + void WorldSocket::SendAuthResponseError(uint32 code) { WorldPackets::Auth::AuthResponse response; diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index 5aed861e613..44f253d0864 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -21,7 +21,6 @@ #include "Common.h" #include "WorldPacketCrypt.h" -#include "ServerPktHeader.h" #include "Socket.h" #include "Util.h" #include "WorldPacket.h" @@ -47,29 +46,19 @@ namespace WorldPackets #pragma pack(push, 1) -union ClientPktHeader +struct PacketHeader { - struct - { - uint16 Size; - uint16 Command; - } Setup; - - struct - { - uint32 Size; - uint16 Command; - } Normal; + uint32 Size; + uint16 Command; - static bool IsValidSize(uint32 size) { return size < 10240; } - static bool IsValidOpcode(uint32 opcode) { return opcode < NUM_OPCODE_HANDLERS; } + bool IsValidSize() { return Size < 10240; } + bool IsValidOpcode() { return Command < NUM_OPCODE_HANDLERS; } }; #pragma pack(pop) class TC_GAME_API WorldSocket : public Socket<WorldSocket> { - static uint32 const ConnectionInitializeMagic; static std::string const ServerConnectionInitialize; static std::string const ClientConnectionInitialize; static uint32 const MinSizeForCompression; @@ -129,17 +118,18 @@ private: void HandleAuthContinuedSessionCallback(std::shared_ptr<WorldPackets::Auth::AuthContinuedSession> authSession, PreparedQueryResult result); void LoadSessionPermissionsCallback(PreparedQueryResult result); void HandleConnectToFailed(WorldPackets::Auth::ConnectToFailed& connectToFailed); + void HandleEnableEncryptionAck(); bool HandlePing(WorldPacket& recvPacket); - void ExtractOpcodeAndSize(ClientPktHeader const* header, uint32& opcode, uint32& size) const; - ConnectionType _type; + uint64 _key; BigNumber _serverChallenge; WorldPacketCrypt _authCrypt; BigNumber _encryptSeed; BigNumber _decryptSeed; + BigNumber _sessionKey; std::chrono::steady_clock::time_point _LastPingTime; uint32 _OverSpeedPings; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index db1767fa8d4..58375e3f0df 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? @@ -1367,23 +1367,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)) { @@ -4017,7 +4000,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 } @@ -5243,39 +5226,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(); @@ -5568,19 +5518,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; @@ -6695,7 +6632,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 7d1df37eb42..8df069df7f3 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -293,7 +293,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 e7c932e8a3b..d0af2af8f97 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->GetSpellInfo()->GetSpellXSpellVisualId(_target->GetMap()->GetDifficultyID()); 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_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 27e2333bd97..253b07768f0 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; } Unit* GetCaster() const; WorldObject* GetOwner() const { return m_owner; } Unit* GetUnitOwner() const { ASSERT(GetType() == UNIT_AURA_TYPE); return (Unit*)m_owner; } @@ -297,6 +298,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; @@ -334,9 +336,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; @@ -355,9 +357,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 31bcfc39980..d109667cd85 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -589,7 +589,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 = m_spellInfo->GetSpellXSpellVisualId(caster->GetMap()->GetDifficultyID()); m_preCastSpell = 0; @@ -2617,7 +2617,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) @@ -2923,7 +2923,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); @@ -3338,7 +3338,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); } } @@ -3714,39 +3714,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; @@ -3862,7 +3833,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()); } @@ -3890,8 +3901,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; @@ -3903,7 +3913,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; @@ -3936,7 +3947,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 } } @@ -3993,7 +4004,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)) { @@ -4019,7 +4029,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; @@ -4054,7 +4065,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 } } @@ -4299,7 +4310,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; @@ -4307,7 +4318,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); @@ -4520,9 +4531,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(); @@ -4532,36 +4544,12 @@ SpellCastResult Spell::CheckRuneCost(uint32 runeCostID) if (player->getClass() != CLASS_DEATH_KNIGHT) return SPELL_CAST_OK; - SpellRuneCostEntry const* src = sSpellRuneCostStore.LookupEntry(runeCostID); - if (!src) - return SPELL_CAST_OK; - - if (src->NoRuneCost()) - return SPELL_CAST_OK; - - int32 runeCost[NUM_RUNE_TYPES]; // blood, frost, unholy, death - - for (uint32 i = 0; i < NUM_RUNE_TYPES; ++i) - { - runeCost[i] = src->RuneCost[i]; - if (Player* modOwner = m_caster->GetSpellModOwner()) - modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_COST, runeCost[i], this); - } - - runeCost[RUNE_DEATH] += MAX_RUNES; - - for (uint32 i = 0; i < MAX_RUNES; ++i) - { - RuneType rune = player->GetCurrentRune(i); - if ((player->GetRuneCooldown(i) == 0) && (runeCost[rune] > 0)) - runeCost[rune]--; - } - - for (uint32 i = 0; i < RUNE_DEATH; ++i) - if (runeCost[i] > 0) - runeCost[RUNE_DEATH] += runeCost[i]; + int32 readyRunes = 0; + for (int32 i = 0; i < player->GetMaxPower(POWER_RUNES); ++i) + if (player->GetRuneCooldown(i) == 0) + ++readyRunes; - if (runeCost[RUNE_DEATH] > MAX_RUNES) + if (readyRunes < runeCost->Amount) return SPELL_FAILED_NO_POWER; // not sure if result code is correct return SPELL_CAST_OK; @@ -4572,95 +4560,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) - { - 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) + int32 runeCost = std::find_if(m_powerCost.begin(), m_powerCost.end(), [](SpellInfo::CostData const& cost) { - 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); + return cost.Power == POWER_RUNES; + })->Amount; - if (runeCost[RUNE_DEATH] == 0) - break; - } - } - } - - // 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() @@ -5488,6 +5403,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()) @@ -5928,7 +5847,7 @@ SpellCastResult Spell::CheckRange(bool strict) { // check needed by 68766 51693 - both spells are cast on enemies and have 0 max range // these are triggered by other spells - possibly we should omit range check in that case? - if (m_spellInfo->RangeEntry->ID == 1) + if (m_spellInfo->RangeIndex == 1) return SPELL_CAST_OK; range_type = m_spellInfo->RangeEntry->Flags; @@ -6001,7 +5920,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; } @@ -7410,7 +7329,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..5917ed512c3 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 diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index d9930ce890a..11a92fd67b8 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -226,7 +226,7 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectMilling, //158 SPELL_EFFECT_MILLING milling &Spell::EffectRenamePet, //159 SPELL_EFFECT_ALLOW_RENAME_PET allow rename pet once again &Spell::EffectForceCast, //160 SPELL_EFFECT_FORCE_CAST_2 - &Spell::EffectSpecCount, //161 SPELL_EFFECT_TALENT_SPEC_COUNT second talent spec (learn/revert) + &Spell::EffectNULL, //161 SPELL_EFFECT_TALENT_SPEC_COUNT second talent spec (learn/revert) &Spell::EffectActivateSpec, //162 SPELL_EFFECT_TALENT_SPEC_SELECT activate primary/secondary spec &Spell::EffectUnused, //163 SPELL_EFFECT_163 unused &Spell::EffectRemoveAura, //164 SPELL_EFFECT_REMOVE_AURA @@ -317,6 +317,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*/) @@ -1548,7 +1552,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(); @@ -1618,7 +1622,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); @@ -2034,7 +2038,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: @@ -2435,7 +2439,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; @@ -3917,72 +3921,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*/) @@ -5167,7 +5108,7 @@ void Spell::EffectQuestStart(SpellEffIndex /*effIndex*/) } } -void Spell::EffectActivateRune(SpellEffIndex effIndex) +void Spell::EffectActivateRune(SpellEffIndex /*effIndex*/) { if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH) return; @@ -5184,52 +5125,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; } } @@ -5309,7 +5222,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); } @@ -5425,7 +5338,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; @@ -5434,17 +5347,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) @@ -5453,7 +5355,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*/) @@ -5479,7 +5381,7 @@ void Spell::EffectPlaySound(SpellEffIndex /*effIndex*/) uint32 soundId = effectInfo->MiscValue; - if (!sSoundEntriesStore.LookupEntry(soundId)) + if (!sSoundKitStore.LookupEntry(soundId)) { TC_LOG_ERROR("spells", "EffectPlaySound: Sound (Id: %u) does not exist in spell %u.", soundId, m_spellInfo->Id); return; diff --git a/src/server/game/Spells/SpellHistory.cpp b/src/server/game/Spells/SpellHistory.cpp index fe56eb3c01b..b6c7fdc17ec 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 e7ac181e69f..362d5e8df35 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 = GetGameTableColumnForClass(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; @@ -1041,18 +1031,14 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef _visuals = std::move(visuals); // SpellScalingEntry - SpellScalingEntry const* _scaling = GetSpellScaling(); - Scaling.CastTimeMin = _scaling ? _scaling->CastTimeMin : 0; - Scaling.CastTimeMax = _scaling ?_scaling->CastTimeMax : 0; - Scaling.CastTimeMaxLevel = _scaling ? _scaling->CastTimeMaxLevel : 0; + SpellScalingEntry const* _scaling = data.Scaling; Scaling.Class = _scaling ? _scaling->ScalingClass : 0; - Scaling.NerfFactor = _scaling ? _scaling->NerfFactor : 0; - Scaling.NerfMaxLevel = _scaling ? _scaling->NerfMaxLevel : 0; + Scaling.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; @@ -1064,7 +1050,7 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef StackAmount = _options ? _options->CumulativeAura : 0; // SpellAuraRestrictionsEntry - SpellAuraRestrictionsEntry const* _aura = GetSpellAuraRestrictions(); + SpellAuraRestrictionsEntry const* _aura = data.AuraRestrictions; CasterAuraState = _aura ? _aura->CasterAuraState : 0; TargetAuraState = _aura ? _aura->TargetAuraState : 0; ExcludeCasterAuraState = _aura ? _aura->ExcludeCasterAuraState : 0; @@ -1075,47 +1061,47 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef ExcludeTargetAuraSpell = _aura ? _aura->ExcludeTargetAuraSpell : 0; // SpellCastingRequirementsEntry - SpellCastingRequirementsEntry const* _castreq = GetSpellCastingRequirements(); + SpellCastingRequirementsEntry const* _castreq = data.CastingRequirements; RequiresSpellFocus = _castreq ? _castreq->RequiresSpellFocus : 0; FacingCasterFlags = _castreq ? _castreq->FacingCasterFlags : 0; RequiredAreasID = _castreq ? _castreq->RequiredAreasID : -1; // SpellCategoriesEntry - SpellCategoriesEntry const* _categorie = GetSpellCategories(); - CategoryEntry = _categorie ? sSpellCategoryStore.LookupEntry(_categorie->Category) : NULL; + SpellCategoriesEntry const* _categorie = data.Categories; + CategoryId = _categorie ? _categorie->Category : 0; Dispel = _categorie ? _categorie->DispelType : 0; Mechanic = _categorie ? _categorie->Mechanic : 0; StartRecoveryCategory = _categorie ? _categorie->StartRecoveryCategory : 0; DmgClass = _categorie ? _categorie->DefenseType : 0; PreventionType = _categorie ? _categorie->PreventionType : 0; - ChargeCategoryEntry = _categorie ? sSpellCategoryStore.LookupEntry(_categorie->ChargeCategory) : 0; + ChargeCategoryId = _categorie ? _categorie->ChargeCategory : 0; // SpellClassOptionsEntry - SpellClassOptionsEntry const* _class = GetSpellClassOptions(); + SpellClassOptionsEntry const* _class = data.ClassOptions; SpellFamilyName = _class ? _class->SpellClassSet : 0; SpellFamilyFlags = _class ? _class->SpellClassMask : flag128(); // SpellCooldownsEntry - SpellCooldownsEntry const* _cooldowns = GetSpellCooldowns(); + SpellCooldownsEntry const* _cooldowns = data.Cooldowns; RecoveryTime = _cooldowns ? _cooldowns->RecoveryTime : 0; CategoryRecoveryTime = _cooldowns ? _cooldowns->CategoryRecoveryTime : 0; StartRecoveryTime = _cooldowns ? _cooldowns->StartRecoveryTime : 0; // SpellEquippedItemsEntry - SpellEquippedItemsEntry const* _equipped = GetSpellEquippedItems(); + SpellEquippedItemsEntry const* _equipped = data.EquippedItems; EquippedItemClass = _equipped ? _equipped->EquippedItemClass : -1; EquippedItemSubClassMask = _equipped ?_equipped->EquippedItemSubClassMask : -1; EquippedItemInventoryTypeMask = _equipped ? _equipped->EquippedItemInventoryTypeMask : -1; // SpellInterruptsEntry - SpellInterruptsEntry const* _interrupt = GetSpellInterrupts(); + SpellInterruptsEntry const* _interrupt = data.Interrupts; InterruptFlags = _interrupt ? _interrupt->InterruptFlags : 0; // TODO: 6.x these flags have 2 parts AuraInterruptFlags = _interrupt ? _interrupt->AuraInterruptFlags[0] : 0; ChannelInterruptFlags = _interrupt ? _interrupt->ChannelInterruptFlags[0] : 0; // SpellLevelsEntry - SpellLevelsEntry const* _levels = GetSpellLevels(); + SpellLevelsEntry const* _levels = data.Levels; MaxLevel = _levels ? _levels->MaxLevel : 0; BaseLevel = _levels ? _levels->BaseLevel : 0; SpellLevel = _levels ? _levels->SpellLevel : 0; @@ -1124,26 +1110,26 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef PowerCosts = sDB2Manager.GetSpellPowers(Id, DIFFICULTY_NONE, &_hasPowerDifficultyData); // SpellReagentsEntry - SpellReagentsEntry const* _reagents = GetSpellReagents(); + SpellReagentsEntry const* _reagents = data.Reagents; for (uint8 i = 0; i < MAX_SPELL_REAGENTS; ++i) Reagent[i] = _reagents ? _reagents->Reagent[i] : 0; for (uint8 i = 0; i < MAX_SPELL_REAGENTS; ++i) ReagentCount[i] = _reagents ? _reagents->ReagentCount[i] : 0; // SpellShapeshiftEntry - SpellShapeshiftEntry const* _shapeshift = GetSpellShapeshift(); + SpellShapeshiftEntry const* _shapeshift = data.Shapeshift; Stances = _shapeshift ? MAKE_PAIR64(_shapeshift->ShapeshiftMask[0], _shapeshift->ShapeshiftMask[1]) : 0; StancesNot = _shapeshift ? MAKE_PAIR64(_shapeshift->ShapeshiftExclude[0], _shapeshift->ShapeshiftExclude[1]) : 0; // SpellTargetRestrictionsEntry - SpellTargetRestrictionsEntry const* _target = GetSpellTargetRestrictions(); + SpellTargetRestrictionsEntry const* _target = data.TargetRestrictions; Targets = _target ? _target->Targets : 0; TargetCreatureType = _target ? _target->TargetCreatureType : 0; MaxAffectedTargets = _target ? _target->MaxAffectedTargets : 0; MaxTargetLevel = _target ? _target->MaxTargetLevel : 0; // SpellTotemsEntry - SpellTotemsEntry const* _totem = GetSpellTotems(); + SpellTotemsEntry const* _totem = data.Totems; for (uint8 i = 0; i < 2; ++i) TotemCategory[i] = _totem ? _totem->RequiredTotemCategoryID[i] : 0; for (uint8 i = 0; i < 2; ++i) @@ -1169,7 +1155,7 @@ void SpellInfo::_UnloadSpellEffects() uint32 SpellInfo::GetCategory() const { - return CategoryEntry ? CategoryEntry->ID : 0; + return CategoryId; } bool SpellInfo::HasEffect(uint32 difficulty, SpellEffectName effect) const @@ -1475,7 +1461,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 @@ -1751,7 +1741,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; @@ -2101,11 +2091,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())) { @@ -2505,33 +2495,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) @@ -2688,10 +2688,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; } } @@ -2846,7 +2846,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; } @@ -3347,81 +3347,6 @@ bool SpellInfo::_IsPositiveTarget(uint32 targetA, uint32 targetB) return true; } -SpellTargetRestrictionsEntry const* SpellInfo::GetSpellTargetRestrictions() const -{ - return SpellTargetRestrictionsId ? sSpellTargetRestrictionsStore.LookupEntry(SpellTargetRestrictionsId) : NULL; -} - -SpellEquippedItemsEntry const* SpellInfo::GetSpellEquippedItems() const -{ - return SpellEquippedItemsId ? sSpellEquippedItemsStore.LookupEntry(SpellEquippedItemsId) : NULL; -} - -SpellInterruptsEntry const* SpellInfo::GetSpellInterrupts() const -{ - return SpellInterruptsId ? sSpellInterruptsStore.LookupEntry(SpellInterruptsId) : NULL; -} - -SpellLevelsEntry const* SpellInfo::GetSpellLevels() const -{ - return SpellLevelsId ? sSpellLevelsStore.LookupEntry(SpellLevelsId) : NULL; -} - -SpellReagentsEntry const* SpellInfo::GetSpellReagents() const -{ - return SpellReagentsId ? sSpellReagentsStore.LookupEntry(SpellReagentsId) : NULL; -} - -SpellScalingEntry const* SpellInfo::GetSpellScaling() const -{ - return SpellScalingId ? sSpellScalingStore.LookupEntry(SpellScalingId) : NULL; -} - -SpellShapeshiftEntry const* SpellInfo::GetSpellShapeshift() const -{ - return SpellShapeshiftId ? sSpellShapeshiftStore.LookupEntry(SpellShapeshiftId) : NULL; -} - -SpellTotemsEntry const* SpellInfo::GetSpellTotems() const -{ - return SpellTotemsId ? sSpellTotemsStore.LookupEntry(SpellTotemsId) : NULL; -} - -SpellMiscEntry const* SpellInfo::GetSpellMisc() const -{ - return SpellMiscId ? sSpellMiscStore.LookupEntry(SpellMiscId) : NULL; -} - -SpellAuraOptionsEntry const* SpellInfo::GetSpellAuraOptions() const -{ - return SpellAuraOptionsId ? sSpellAuraOptionsStore.LookupEntry(SpellAuraOptionsId) : NULL; -} - -SpellAuraRestrictionsEntry const* SpellInfo::GetSpellAuraRestrictions() const -{ - return SpellAuraRestrictionsId ? sSpellAuraRestrictionsStore.LookupEntry(SpellAuraRestrictionsId) : NULL; -} - -SpellCastingRequirementsEntry const* SpellInfo::GetSpellCastingRequirements() const -{ - return SpellCastingRequirementsId ? sSpellCastingRequirementsStore.LookupEntry(SpellCastingRequirementsId) : NULL; -} - -SpellCategoriesEntry const* SpellInfo::GetSpellCategories() const -{ - return SpellCategoriesId ? sSpellCategoriesStore.LookupEntry(SpellCategoriesId) : NULL; -} - -SpellClassOptionsEntry const* SpellInfo::GetSpellClassOptions() const -{ - return SpellClassOptionsId ? sSpellClassOptionsStore.LookupEntry(SpellClassOptionsId) : NULL; -} - -SpellCooldownsEntry const* SpellInfo::GetSpellCooldowns() const -{ - return SpellCooldownsId ? sSpellCooldownsStore.LookupEntry(SpellCooldownsId) : NULL; -} - void SpellInfo::_UnloadImplicitTargetConditionLists() { // find the same instances of ConditionList and delete them. diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index 4faf98a0791..a5d620571a3 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -20,8 +20,6 @@ #include "SharedDefines.h" #include "Util.h" -#include "DBCStructure.h" -#include "DB2Structure.h" #include "Object.h" #include "SpellAuraDefines.h" @@ -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 beeb1109dce..84cbbe90b7e 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" @@ -2386,7 +2385,7 @@ void SpellMgr::LoadPetLevelupSpellMap() if (!spell->SpellLevel) continue; - PetLevelupSpellSet& spellSet = mPetLevelupSpellMap[creatureFamily->ID]; + PetLevelupSpellSet& spellSet = mPetLevelupSpellMap[i]; if (spellSet.empty()) ++family_count; @@ -2690,17 +2689,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) @@ -2709,12 +2710,70 @@ void SpellMgr::LoadSpellInfoStore() effectsForDifficulty[effect->EffectIndex] = effect; } + for (SpellAuraOptionsEntry const* auraOptions : sSpellAuraOptionsStore) + if (!auraOptions->DifficultyID) // TODO: implement + loadData[auraOptions->SpellID].AuraOptions = auraOptions; + + for (SpellAuraRestrictionsEntry const* auraRestrictions : sSpellAuraRestrictionsStore) + if (!auraRestrictions->DifficultyID) // TODO: implement + loadData[auraRestrictions->SpellID].AuraRestrictions = auraRestrictions; + + for (SpellCastingRequirementsEntry const* castingRequirements : sSpellCastingRequirementsStore) + loadData[castingRequirements->SpellID].CastingRequirements = castingRequirements; + + for (SpellCategoriesEntry const* categories : sSpellCategoriesStore) + if (!categories->DifficultyID) // TODO: implement + loadData[categories->SpellID].Categories = categories; + + for (SpellClassOptionsEntry const* classOptions : sSpellClassOptionsStore) + loadData[classOptions->SpellID].ClassOptions = classOptions; + + for (SpellCooldownsEntry const* cooldowns : sSpellCooldownsStore) + if (!cooldowns->DifficultyID) // TODO: implement + loadData[cooldowns->SpellID].Cooldowns = cooldowns; + + for (SpellEffectScalingEntry const* spellEffectScaling : sSpellEffectScalingStore) + spellEffectScallingByEffectId[spellEffectScaling->SpellEffectID] = spellEffectScaling; + + for (SpellEquippedItemsEntry const* equippedItems : sSpellEquippedItemsStore) + loadData[equippedItems->SpellID].EquippedItems = equippedItems; + + for (SpellInterruptsEntry const* interrupts : sSpellInterruptsStore) + if (!interrupts->DifficultyID) // TODO: implement + loadData[interrupts->SpellID].Interrupts = interrupts; + + for (SpellLevelsEntry const* levels : sSpellLevelsStore) + if (!levels->DifficultyID) // TODO: implement + loadData[levels->SpellID].Levels = levels; + + for (SpellReagentsEntry const* reagents : sSpellReagentsStore) + loadData[reagents->SpellID].Reagents = reagents; + + for (SpellScalingEntry const* scaling : sSpellScalingStore) + loadData[scaling->SpellID].Scaling = scaling; + + for (SpellShapeshiftEntry const* shapeshift : sSpellShapeshiftStore) + loadData[shapeshift->SpellID].Shapeshift = shapeshift; + + for (SpellTargetRestrictionsEntry const* targetRestrictions : sSpellTargetRestrictionsStore) + if (!targetRestrictions->DifficultyID) // TODO: implement + loadData[targetRestrictions->SpellID].TargetRestrictions = targetRestrictions; + + for (SpellTotemsEntry const* totems : sSpellTotemsStore) + loadData[totems->SpellID].Totems = totems; + for (SpellXSpellVisualEntry const* visual : sSpellXSpellVisualStore) visualsBySpell[visual->SpellID][visual->DifficultyID].push_back(visual); for (uint32 i = 0; i < sSpellStore.GetNumRows(); ++i) + { if (SpellEntry const* spellEntry = sSpellStore.LookupEntry(i)) - mSpellInfoMap[i] = new SpellInfo(spellEntry, effectsBySpell[i], std::move(visualsBySpell[i])); + { + loadData[i].Entry = spellEntry; + loadData[i].Misc = sSpellMiscStore.LookupEntry(spellEntry->MiscID); + mSpellInfoMap[i] = new SpellInfo(loadData[i], effectsBySpell[i], std::move(visualsBySpell[i]), spellEffectScallingByEffectId); + } + } TC_LOG_INFO("server.loading", ">> Loaded SpellInfo store in %u ms", GetMSTimeDiffToNow(oldMSTime)); } @@ -3115,12 +3174,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); @@ -3467,6 +3520,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); @@ -3477,8 +3535,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..04614d65ded 100644 --- a/src/server/game/Tools/CharacterDatabaseCleaner.cpp +++ b/src/server/game/Tools/CharacterDatabaseCleaner.cpp @@ -23,7 +23,6 @@ #include "Database/DatabaseEnv.h" #include "SpellMgr.h" #include "SpellInfo.h" -#include "DBCStores.h" void CharacterDatabaseCleaner::CleanDatabase() { diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 5513c8e94dd..bf536765901 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" @@ -1470,7 +1471,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; } @@ -1520,8 +1521,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..."); @@ -1529,7 +1528,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(); @@ -1944,9 +1943,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 1cbcb747279..e37e0daa011 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -517,7 +517,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 7ad80352995..dd087a63146 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; } @@ -755,7 +758,7 @@ public: } target->GetSpellHistory()->ResetCooldown(spellIid, true); - target->GetSpellHistory()->ResetCharges(spellInfo->ChargeCategoryEntry); + target->GetSpellHistory()->ResetCharges(spellInfo->ChargeCategoryId); handler->PSendSysMessage(LANG_REMOVE_COOLDOWN, spellIid, target == handler->GetSession()->GetPlayer() ? handler->GetTrinityString(LANG_YOU) : nameLink.c_str()); } return true; @@ -892,12 +895,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; } @@ -918,12 +924,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; } @@ -1168,10 +1177,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; }); @@ -1469,7 +1478,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; } @@ -1573,7 +1582,7 @@ public: uint8 raceid, classid = 0; //RACE_NONE, CLASS_NONE std::string raceStr, classStr = handler->GetTrinityString(LANG_UNKNOWN); uint8 gender = 0; - int8 locale = handler->GetSessionDbcLocale(); + LocaleConstant locale = handler->GetSessionDbcLocale(); uint32 totalPlayerTime = 0; uint8 level = 0; std::string alive = handler->GetTrinityString(LANG_ERROR); @@ -1794,8 +1803,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 @@ -1816,15 +1825,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))); @@ -2608,7 +2617,7 @@ public: uint32 soundId = atoi((char*)args); - if (!sSoundEntriesStore.LookupEntry(soundId)) + if (!sSoundKitStore.LookupEntry(soundId)) { handler->PSendSysMessage(LANG_SOUND_NOT_EXIST, soundId); handler->SetSentErrorMessage(true); @@ -2688,7 +2697,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/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/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 4488561589f..2c941a4f757 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -162,7 +162,7 @@ class spell_dru_eclipse_energize : public SpellScriptLoader Player* caster = GetCaster()->ToPlayer(); // No boomy, no deal. - if (caster->GetSpecId(caster->GetActiveTalentGroup()) != TALENT_SPEC_DRUID_BALANCE) + if (caster->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID) != TALENT_SPEC_DRUID_BALANCE) return; switch (GetSpellInfo()->Id) @@ -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/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..c6e1c495b00 --- /dev/null +++ b/src/server/shared/DataStores/DB2SparseStorageLoader.cpp @@ -0,0 +1,708 @@ +/* + * 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); + + 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..fd3e0a257cd 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,34 @@ 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((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 +188,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]; + uint32 indexVal = meta->HasIndexFieldInData() ? getRecord(y).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; + } + + Record rec = getRecord(y); + 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 +326,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 +355,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 +400,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 +429,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 +480,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 +540,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 +564,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 +574,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 +667,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 +675,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 +689,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 +739,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 2bf6b42d703..73b5719ec18 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -782,10 +782,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/Patterns/Windows.hpp b/src/tools/connection_patcher/Patterns/Windows.hpp index 5b2de204a7b..239d2a19b36 100644 --- a/src/tools/connection_patcher/Patterns/Windows.hpp +++ b/src/tools/connection_patcher/Patterns/Windows.hpp @@ -29,8 +29,8 @@ namespace Connection_Patcher { struct x86 { - static const std::vector<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 |