diff options
author | Shauren <shauren.trinity@gmail.com> | 2016-01-24 15:56:10 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-05-20 23:46:17 +0200 |
commit | 5c2c9a684f1458da0cea1f3536622add77ef1324 (patch) | |
tree | d3a2a349e8bed9a31cf417ce93830d508ecea46b | |
parent | 65c0a0ee4d5c299f3caab04b6cb3fcd7a4a93e2e (diff) |
Core/DataStores: Updated dbc/db2 to 7.0.1.20810
82 files changed, 8041 insertions, 3506 deletions
diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index bccc4176530..1d9fc2dcfcc 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -1619,6 +1619,9 @@ CREATE TABLE `characters` ( `hairStyle` tinyint(3) unsigned NOT NULL DEFAULT '0', `hairColor` tinyint(3) unsigned NOT NULL DEFAULT '0', `facialStyle` tinyint(3) unsigned NOT NULL DEFAULT '0', + `customDisplay1` tinyint(3) unsigned NOT NULL DEFAULT '0', + `customDisplay2` tinyint(3) unsigned NOT NULL DEFAULT '0', + `customDisplay3` tinyint(3) unsigned NOT NULL DEFAULT '0', `bankSlots` tinyint(3) unsigned NOT NULL DEFAULT '0', `restState` tinyint(3) unsigned NOT NULL DEFAULT '0', `playerFlags` int(10) unsigned NOT NULL DEFAULT '0', @@ -2578,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_02.sql b/sql/updates/characters/2016_xx_xx_xx_characters_legion_02.sql new file mode 100644 index 00000000000..a2a74c11cb2 --- /dev/null +++ b/sql/updates/characters/2016_xx_xx_xx_characters_legion_02.sql @@ -0,0 +1,1293 @@ +-- +-- Table structure for table `item_instance_gems` +-- + +DROP TABLE IF EXISTS `item_instance_gems`; +CREATE TABLE `item_instance_gems` ( + `itemGuid` bigint(20) unsigned NOT NULL, + `gemItemId1` int(10) unsigned DEFAULT '0', + `gemItemId2` int(10) unsigned DEFAULT '0', + `gemItemId3` int(10) unsigned DEFAULT '0', + PRIMARY KEY (`itemGuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO `item_instance_gems` +SELECT +`guid`, +SUBSTRING_INDEX(CONCAT('0 0 ', SUBSTRING_INDEX(enchantments,' ',7)), ' ', -1) AS gemEnchantId1, +SUBSTRING_INDEX(CONCAT('0 0 ', SUBSTRING_INDEX(enchantments,' ',10)), ' ', -1) AS gemEnchantId2, +SUBSTRING_INDEX(CONCAT('0 0 ',SUBSTRING_INDEX(enchantments,' ',13)), ' ', -1) AS gemEnchantId3 +FROM `item_instance` +HAVING gemEnchantId1 != 0 OR gemEnchantId1 != 0 OR gemEnchantId3 != 0; + +DROP TABLE IF EXISTS `enchant_gem_ids`; +CREATE TABLE `enchant_gem_ids` ( + `enchantId` int(11) unsigned NOT NULL DEFAULT '0', + `gemItemId` int(11) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`enchantId`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Export of SpellItemEnchantment.dbc'; + +INSERT INTO `enchant_gem_ids` (`enchantId`,`gemItemId`) VALUES +(2686,23233), +(2687,23234), +(2688,23235), +(2689,23359), +(2690,23094), +(2691,23095), +(2692,23096), +(2693,23097), +(2694,23113), +(2695,23114), +(2696,23115), +(2697,23116), +(2698,23118), +(2699,23119), +(2700,23120), +(2701,23121), +(2703,23364), +(2704,23366), +(2705,23099), +(2706,23105), +(2707,23106), +(2708,23108), +(2709,23109), +(2710,23110), +(2711,23111), +(2725,24027), +(2726,24028), +(2727,24029), +(2728,24030), +(2729,24031), +(2730,24032), +(2731,24033), +(2732,24035), +(2733,24037), +(2734,24047), +(2735,24048), +(2736,24050), +(2737,24052), +(2738,24054), +(2739,24055), +(2740,24056), +(2741,24057), +(2742,24060), +(2743,24062), +(2744,24065), +(2752,23098), +(2753,24058), +(2754,24036), +(2755,23100), +(2756,24061), +(2757,23104), +(2758,24067), +(2759,24053), +(2760,23101), +(2761,24059), +(2762,23103), +(2763,24066), +(2764,24051), +(2765,24039), +(2827,25890), +(2828,25893), +(2829,25894), +(2830,25895), +(2831,25896), +(2832,25897), +(2833,25898), +(2834,25899), +(2835,25901), +(2891,27679), +(2894,27774), +(2896,27777), +(2897,27782), +(2898,27785), +(2899,27786), +(2911,28117), +(2912,28118), +(2913,28119), +(2914,28120), +(2915,28122), +(2916,28123), +(2917,27864), +(2918,27786), +(2921,27809), +(2922,27811), +(2923,27820), +(2924,27812), +(2942,28290), +(2943,28360), +(2944,28361), +(2945,28362), +(2946,28363), +(2947,22460), +(2948,22459), +(2949,28388), +(2950,28389), +(2956,28458), +(2957,28459), +(2958,28460), +(2959,28461), +(2960,28462), +(2961,28463), +(2962,28464), +(2963,28465), +(2964,28466), +(2965,28467), +(2966,28468), +(2967,28469), +(2968,28470), +(2969,28556), +(2970,28557), +(2971,28595), +(3045,30546), +(3046,30547), +(3047,30548), +(3048,30549), +(3049,30550), +(3050,30551), +(3051,30552), +(3052,30553), +(3053,30554), +(3054,30555), +(3055,30556), +(3056,30558), +(3057,30559), +(3058,30560), +(3059,30562), +(3060,30563), +(3061,30564), +(3062,30565), +(3063,30566), +(3064,30572), +(3065,30571), +(3066,30573), +(3067,30574), +(3068,30575), +(3069,30581), +(3070,30582), +(3071,30583), +(3072,30584), +(3073,30585), +(3074,30586), +(3075,30587), +(3076,30588), +(3077,30589), +(3078,30590), +(3079,30591), +(3080,30592), +(3081,30593), +(3082,30594), +(3083,30600), +(3084,30601), +(3085,30602), +(3086,30603), +(3087,30604), +(3088,30605), +(3089,30606), +(3090,30607), +(3091,30608), +(3099,31116), +(3100,31117), +(3101,31118), +(3103,30598), +(3104,31860), +(3105,31861), +(3106,31862), +(3107,31863), +(3108,31864), +(3109,31865), +(3110,31866), +(3111,31867), +(3112,31868), +(3113,31869), +(3115,32193), +(3116,32194), +(3117,32195), +(3118,32196), +(3119,32197), +(3120,32198), +(3121,32199), +(3122,32200), +(3123,32201), +(3124,32202), +(3125,32203), +(3126,32204), +(3127,32205), +(3128,32206), +(3129,32207), +(3130,32208), +(3131,32209), +(3132,32210), +(3133,32211), +(3134,32212), +(3135,32213), +(3136,32214), +(3137,32215), +(3138,32216), +(3139,32217), +(3140,32218), +(3141,32219), +(3142,32220), +(3143,32221), +(3144,32222), +(3145,32223), +(3146,32224), +(3147,32225), +(3148,32226), +(3154,32409), +(3155,32410), +(3156,32634), +(3157,32635), +(3158,32636), +(3159,32637), +(3160,32638), +(3161,32639), +(3162,32640), +(3163,32641), +(3197,32735), +(3201,32833), +(3202,32836), +(3206,33060), +(3207,33130), +(3208,33131), +(3209,33132), +(3210,33133), +(3211,33134), +(3212,33135), +(3213,33136), +(3214,33137), +(3215,33138), +(3216,33139), +(3217,33140), +(3218,33141), +(3219,33142), +(3220,33143), +(3221,33144), +(3226,33782), +(3242,34142), +(3254,34143), +(3261,34220), +(3262,34256), +(3264,34627), +(3268,34831), +(3270,35315), +(3271,35316), +(3272,35318), +(3274,35501), +(3275,35503), +(3276,35487), +(3277,35488), +(3278,35489), +(3280,35707), +(3281,35487), +(3282,35488), +(3283,35489), +(3284,35758), +(3285,35759), +(3286,35760), +(3287,35761), +(3292,36766), +(3293,36767), +(3317,37430), +(3318,37503), +(3321,38292), +(3324,34835), +(3333,38498), +(3334,38538), +(3335,38545), +(3336,38546), +(3337,38547), +(3338,38548), +(3339,38549), +(3340,38550), +(3371,39900), +(3374,39905), +(3375,39906), +(3376,39907), +(3377,39908), +(3378,39909), +(3379,39910), +(3380,39911), +(3381,39912), +(3382,39914), +(3383,39915), +(3384,39916), +(3385,39917), +(3386,39918), +(3387,39919), +(3388,39920), +(3389,39927), +(3390,39932), +(3391,39933), +(3392,39934), +(3393,39935), +(3394,39936), +(3395,39937), +(3396,39938), +(3397,39939), +(3398,39940), +(3399,39941), +(3400,39942), +(3401,39943), +(3402,39944), +(3403,39945), +(3404,39946), +(3405,39947), +(3406,39953), +(3407,39949), +(3408,39950), +(3409,39951), +(3410,39952), +(3411,39948), +(3412,39954), +(3413,39955), +(3414,39956), +(3415,39957), +(3416,39958), +(3417,39959), +(3418,39964), +(3419,39965), +(3420,39966), +(3421,39967), +(3422,39960), +(3423,39961), +(3424,39962), +(3426,39963), +(3427,39968), +(3428,39974), +(3429,39975), +(3430,39976), +(3431,39977), +(3432,39978), +(3433,39979), +(3434,39980), +(3435,39981), +(3436,39982), +(3437,39983), +(3438,39984), +(3439,39985), +(3440,39986), +(3441,39988), +(3442,39989), +(3443,39990), +(3444,39991), +(3445,39992), +(3446,39996), +(3447,39997), +(3448,39998), +(3449,39999), +(3450,40000), +(3451,40001), +(3452,40002), +(3453,40003), +(3454,40008), +(3455,40009), +(3456,40010), +(3457,40011), +(3458,40012), +(3459,40013), +(3460,40014), +(3461,40015), +(3462,40016), +(3463,40017), +(3464,40022), +(3465,40023), +(3466,40025), +(3467,40029), +(3468,40031), +(3469,40032), +(3470,40033), +(3471,40034), +(3472,40026), +(3473,40027), +(3474,40024), +(3475,40030), +(3476,40028), +(3477,40037), +(3478,40038), +(3479,40039), +(3480,40040), +(3481,40041), +(3482,40043), +(3483,40044), +(3484,40045), +(3485,40046), +(3486,40047), +(3487,40048), +(3488,40049), +(3489,40050), +(3490,40051), +(3491,40052), +(3492,40053), +(3493,40054), +(3494,40055), +(3495,40056), +(3496,40057), +(3497,40058), +(3498,40059), +(3499,40085), +(3500,40086), +(3501,40088), +(3502,40089), +(3503,40090), +(3504,40091), +(3505,40092), +(3506,40095), +(3507,40099), +(3508,40102), +(3509,40104), +(3510,40094), +(3511,40096), +(3512,40100), +(3513,40103), +(3514,40105), +(3515,40098), +(3516,40101), +(3517,40106), +(3518,40111), +(3519,40112), +(3520,40113), +(3521,40114), +(3522,40115), +(3523,40116), +(3524,40118), +(3525,40117), +(3526,40123), +(3527,40124), +(3528,40125), +(3529,40126), +(3530,40127), +(3531,40128), +(3532,40119), +(3533,40120), +(3534,40121), +(3535,40122), +(3536,40129), +(3537,40130), +(3538,40132), +(3539,40136), +(3540,40138), +(3541,40139), +(3542,40141), +(3543,40140), +(3544,40131), +(3545,40133), +(3546,40134), +(3547,40137), +(3548,40135), +(3549,40142), +(3550,40143), +(3551,40144), +(3552,40145), +(3553,40146), +(3554,40147), +(3555,40148), +(3556,40149), +(3557,40150), +(3558,40151), +(3559,40152), +(3560,40153), +(3561,40154), +(3563,40155), +(3564,40156), +(3565,40157), +(3566,40158), +(3567,40159), +(3568,40160), +(3569,40161), +(3570,40162), +(3571,40163), +(3572,40164), +(3573,40165), +(3574,40166), +(3575,40167), +(3576,40168), +(3577,40169), +(3578,40170), +(3579,40171), +(3580,40172), +(3581,40173), +(3582,40174), +(3583,40175), +(3584,40176), +(3585,40177), +(3586,40178), +(3587,40179), +(3588,40180), +(3589,40181), +(3590,40182), +(3591,40232), +(3621,41285), +(3622,41307), +(3623,41333), +(3624,41335), +(3625,41339), +(3626,41395), +(3627,41401), +(3628,41398), +(3631,41396), +(3632,41375), +(3633,41376), +(3634,41377), +(3635,41378), +(3636,41379), +(3637,41380), +(3638,41381), +(3639,41382), +(3640,41385), +(3641,41389), +(3642,41397), +(3643,41400), +(3644,41434), +(3646,41439), +(3647,41437), +(3648,41435), +(3649,41432), +(3650,41438), +(3651,41433), +(3652,41436), +(3653,41442), +(3654,41440), +(3655,41441), +(3656,41443), +(3657,41448), +(3658,41449), +(3659,41446), +(3660,41447), +(3661,41444), +(3662,41445), +(3663,41454), +(3664,41450), +(3665,41456), +(3666,41462), +(3667,41460), +(3668,41458), +(3669,41453), +(3670,41451), +(3671,41461), +(3672,41459), +(3673,41457), +(3674,41455), +(3675,41452), +(3677,41485), +(3678,41501), +(3679,41496), +(3680,41487), +(3681,41492), +(3682,41488), +(3683,41483), +(3684,41499), +(3685,41489), +(3686,41484), +(3687,41491), +(3688,41493), +(3689,41494), +(3690,41495), +(3691,41502), +(3692,41486), +(3693,41497), +(3694,41500), +(3695,41490), +(3696,41482), +(3697,41498), +(3698,41470), +(3699,41468), +(3700,41464), +(3701,41467), +(3702,41466), +(3703,41475), +(3704,41481), +(3705,41473), +(3706,41479), +(3707,41480), +(3708,41476), +(3709,41472), +(3710,41477), +(3711,41463), +(3712,41469), +(3713,41471), +(3714,41465), +(3715,41478), +(3716,41474), +(3732,42142), +(3733,42143), +(3734,42144), +(3735,42145), +(3736,42146), +(3737,42148), +(3738,42149), +(3739,42150), +(3740,42151), +(3741,42152), +(3742,42156), +(3743,42157), +(3744,42158), +(3745,42153), +(3746,42154), +(3747,42155), +(3749,42701), +(3750,42702), +(3767,41429), +(3792,44066), +(3798,44076), +(3799,44078), +(3800,44082), +(3801,44081), +(3802,44084), +(3803,44087), +(3804,44088), +(3805,44089), +(3861,45862), +(3862,45879), +(3863,45880), +(3864,45881), +(3865,45882), +(3866,45883), +(3867,45987), +(3879,49110), +(3884,52070), +(3885,52127), +(3886,52128), +(3887,52130), +(3888,52129), +(3889,52081), +(3890,52082), +(3891,52083), +(3892,52084), +(3893,52085), +(3894,52086), +(3895,52087), +(3896,52088), +(3897,52089), +(3898,52090), +(3899,52092), +(3900,52093), +(3901,52094), +(3902,52095), +(3903,52097), +(3904,52096), +(3905,52098), +(3906,52099), +(3907,52100), +(3908,52101), +(3909,52102), +(3910,52103), +(3911,52104), +(3912,52105), +(3913,52106), +(3914,52107), +(3915,52108), +(3916,52109), +(3917,52110), +(3918,52111), +(3919,52112), +(3920,52113), +(3921,52114), +(3922,52115), +(3923,52116), +(3924,52117), +(3925,52118), +(3926,52119), +(3927,52120), +(3928,52121), +(3929,52122), +(3930,52123), +(3931,52124), +(3932,52125), +(3933,52126), +(3936,52091), +(3937,52156), +(3938,52157), +(3939,52158), +(3940,52159), +(3941,52160), +(3942,52161), +(3943,52162), +(3944,52163), +(3945,52164), +(3946,52165), +(3947,52166), +(3948,52167), +(3949,52168), +(3950,52169), +(3951,52170), +(3952,52171), +(3953,52172), +(3954,52173), +(3955,52174), +(3956,52175), +(3957,52176), +(3958,52131), +(3959,52132), +(3960,52133), +(3961,52134), +(3962,52135), +(3963,52136), +(3964,52137), +(3965,52138), +(3966,52139), +(3967,52140), +(3968,52141), +(3969,52142), +(3970,52143), +(3971,52144), +(3972,52145), +(3973,52146), +(3974,52147), +(3975,52148), +(3976,52149), +(3977,52150), +(3978,52151), +(3979,52152), +(3980,52153), +(3981,52154), +(3982,52155), +(3983,52203), +(3984,52210), +(3985,52213), +(3986,52217), +(3987,52220), +(3988,52221), +(3989,52234), +(3990,52236), +(3991,52238), +(3992,52243), +(3993,52248), +(3994,52206), +(3995,52207), +(3996,52212), +(3997,52216), +(3998,52230), +(3999,52219), +(4000,52226), +(4001,52232), +(4002,52241), +(4003,52247), +(4004,52235), +(4005,52242), +(4006,52244), +(4007,52246), +(4008,52204), +(4009,52205), +(4010,52208), +(4011,52209), +(4012,52211), +(4013,52214), +(4014,52215), +(4015,52222), +(4016,52224), +(4017,52229), +(4018,52239), +(4019,52240), +(4020,52249), +(4021,52218), +(4022,52223), +(4023,52225), +(4024,52227), +(4025,52228), +(4026,52231), +(4027,52233), +(4028,52237), +(4029,52245), +(4030,52250), +(4031,52255), +(4032,52257), +(4033,52258), +(4034,52259), +(4035,52269), +(4036,52267), +(4037,52260), +(4038,52268), +(4039,52264), +(4040,52266), +(4041,52261), +(4042,52262), +(4043,52263), +(4044,52265), +(4045,52289), +(4046,52291), +(4047,52292), +(4048,52293), +(4049,52294), +(4050,52295), +(4051,52296), +(4052,52297), +(4053,52298), +(4054,52299), +(4055,52300), +(4056,52301), +(4057,52302), +(4119,54616), +(4166,59477), +(4167,59478), +(4168,59479), +(4169,59480), +(4170,59489), +(4171,59491), +(4172,59493), +(4173,59496), +(4212,63696), +(4213,63697), +(4236,68356), +(4237,68357), +(4238,68358), +(4239,68660), +(4244,68741), +(4251,68778), +(4252,68779), +(4253,68780), +(4265,69922), +(4266,69923), +(4273,71817), +(4274,71818), +(4275,71819), +(4276,71820), +(4277,71822), +(4278,71823), +(4279,71824), +(4280,71825), +(4281,71826), +(4282,71827), +(4283,71828), +(4284,71829), +(4285,71830), +(4286,71831), +(4287,71832), +(4288,71833), +(4289,71834), +(4290,71835), +(4291,71836), +(4292,71837), +(4293,71838), +(4294,71839), +(4295,71840), +(4296,71841), +(4297,71842), +(4298,71843), +(4299,71844), +(4300,71845), +(4301,71846), +(4302,71847), +(4303,71848), +(4304,71849), +(4305,71850), +(4306,71851), +(4307,71852), +(4308,71853), +(4309,71854), +(4310,71855), +(4311,71856), +(4312,71857), +(4313,71858), +(4314,71859), +(4315,71860), +(4316,71861), +(4317,71862), +(4318,71863), +(4319,71864), +(4320,71865), +(4321,71866), +(4322,71867), +(4323,71868), +(4324,71869), +(4325,71870), +(4326,71871), +(4327,71872), +(4328,71873), +(4329,71879), +(4330,71880), +(4331,71881), +(4332,71882), +(4333,71883), +(4334,71874), +(4335,71875), +(4336,71876), +(4337,71877), +(4338,71878), +(4453,76502), +(4454,76504), +(4455,76505), +(4456,76506), +(4457,76507), +(4458,76508), +(4459,76509), +(4460,76510), +(4461,76511), +(4462,76512), +(4463,76513), +(4464,76514), +(4465,76515), +(4466,76517), +(4467,76518), +(4468,76519), +(4469,76520), +(4470,76521), +(4471,76522), +(4472,76523), +(4473,76524), +(4474,76525), +(4475,76526), +(4476,76527), +(4477,76528), +(4478,76529), +(4479,76530), +(4480,76531), +(4481,76532), +(4482,76533), +(4483,76534), +(4484,76535), +(4485,76536), +(4486,76537), +(4487,76538), +(4488,76539), +(4489,76540), +(4490,76541), +(4491,76542), +(4492,76543), +(4493,76544), +(4494,76545), +(4495,76546), +(4496,76547), +(4497,76548), +(4498,76549), +(4499,76550), +(4500,76551), +(4501,76552), +(4502,76553), +(4503,76554), +(4504,76555), +(4505,76556), +(4506,76557), +(4507,76558), +(4508,76559), +(4509,76560), +(4511,76561), +(4512,76562), +(4513,76563), +(4514,76564), +(4515,76565), +(4516,76566), +(4517,76567), +(4518,76568), +(4519,76569), +(4520,76570), +(4521,76571), +(4522,76572), +(4523,76573), +(4524,76574), +(4525,76575), +(4526,76576), +(4527,76577), +(4528,76578), +(4529,76579), +(4530,76580), +(4531,76581), +(4532,76582), +(4533,76583), +(4535,76584), +(4536,76585), +(4537,76586), +(4538,76587), +(4539,76588), +(4540,76589), +(4541,76590), +(4542,76591), +(4543,76592), +(4544,76593), +(4545,76594), +(4546,76595), +(4547,76596), +(4548,76597), +(4549,76598), +(4550,76599), +(4551,76600), +(4552,76601), +(4553,76602), +(4554,76603), +(4555,76604), +(4556,76605), +(4557,76606), +(4558,76607), +(4559,76608), +(4560,76609), +(4561,76610), +(4562,76611), +(4563,76612), +(4564,76613), +(4565,76614), +(4566,76615), +(4567,76616), +(4568,76617), +(4569,76618), +(4570,76619), +(4571,76620), +(4572,76621), +(4573,76622), +(4574,76623), +(4575,76624), +(4576,76625), +(4577,76626), +(4578,76627), +(4579,76628), +(4580,76629), +(4581,76630), +(4582,76631), +(4583,76632), +(4584,76633), +(4585,76634), +(4586,76635), +(4587,76636), +(4588,76637), +(4589,76638), +(4590,76639), +(4591,76640), +(4592,76641), +(4593,76642), +(4594,76643), +(4595,76644), +(4596,76645), +(4597,76646), +(4598,76647), +(4599,76648), +(4600,76649), +(4601,76650), +(4602,76651), +(4603,76652), +(4604,76653), +(4605,76654), +(4606,76655), +(4607,76656), +(4608,76657), +(4609,76658), +(4610,76659), +(4611,76660), +(4612,76661), +(4613,76662), +(4614,76663), +(4615,76664), +(4616,76665), +(4617,76666), +(4618,76667), +(4619,76668), +(4620,76669), +(4621,76670), +(4622,76671), +(4623,76672), +(4624,76673), +(4625,76674), +(4626,76675), +(4627,76676), +(4628,76677), +(4629,76678), +(4630,76679), +(4631,76680), +(4632,76681), +(4633,76682), +(4634,76683), +(4635,76684), +(4636,76685), +(4637,76686), +(4638,76687), +(4640,76689), +(4641,76690), +(4642,76691), +(4643,76692), +(4644,76694), +(4645,76695), +(4646,76696), +(4647,76697), +(4648,76698), +(4649,76699), +(4650,76700), +(4651,76701), +(4652,76688), +(4653,76693), +(4654,76714), +(4655,76879), +(4656,76884), +(4657,76886), +(4658,76885), +(4659,76887), +(4660,76888), +(4661,76890), +(4662,76891), +(4664,76892), +(4665,76893), +(4666,76894), +(4667,76895), +(4668,76896), +(4669,76897), +(4672,77130), +(4673,77131), +(4674,77132), +(4675,77133), +(4676,77134), +(4677,77154), +(4678,77136), +(4679,77137), +(4680,77138), +(4681,77139), +(4682,77140), +(4683,77141), +(4684,77142), +(4685,77143), +(4686,77144), +(4810,83141), +(4811,83150), +(4812,83151), +(4813,83152), +(4814,83143), +(4815,83147), +(4816,83142), +(4817,83144), +(4818,83146), +(4819,83145), +(4820,83148), +(4821,83149), +(4899,77544), +(4900,77547), +(4901,77543), +(4902,77542), +(4903,77545), +(4904,77541), +(4905,77546), +(4906,77540), +(4921,88952), +(4922,88953), +(4923,88954), +(4924,88955), +(4925,88956), +(4926,88958), +(4927,88959), +(4928,88960), +(4929,88961), +(4930,88962), +(4931,88963), +(4932,88911), +(4933,88912), +(4934,88913), +(4936,88914), +(4937,88915), +(4938,88916), +(4939,88917), +(4940,88918), +(4941,88919), +(4942,88920), +(4943,88921), +(4944,88922), +(4945,88923), +(4946,88924), +(4947,88925), +(4948,88926), +(4949,88927), +(4950,88928), +(4951,88930), +(4952,88931), +(4953,88932), +(4954,88933), +(4955,88934), +(4956,88935), +(4957,88936), +(4958,88937), +(4959,88938), +(4960,88939), +(4961,88940), +(4962,88941), +(4963,88942), +(4964,88943), +(4965,88944), +(4966,88945), +(4967,88946), +(4968,88947), +(4969,88948), +(4970,88949), +(4971,88950), +(4972,88951), +(4973,88987), +(4984,89674), +(4985,89675), +(4986,89676), +(4987,89677), +(4988,89678), +(4989,89679), +(4990,89680), +(4991,89681), +(4996,89873), +(4997,89881), +(4998,89882), +(5011,93364), +(5012,93366), +(5013,93365), +(5016,93404), +(5017,93405), +(5018,93406), +(5019,93408), +(5020,93409), +(5021,93410), +(5024,93705), +(5025,93706), +(5026,93707), +(5027,93708), +(5030,95344), +(5031,95345), +(5032,95346), +(5033,95347), +(5034,95348), +(5047,97306), +(5048,97307), +(5049,97308), +(5050,97309), +(5051,97310), +(5052,97311), +(5053,97312), +(5054,97313), +(5070,97534), +(5071,97535), +(5072,97536), +(5073,97537), +(5074,97538), +(5075,97547), +(5085,97937), +(5086,97938), +(5088,97939), +(5089,97941), +(5090,97943), +(5106,98025), +(5107,98026), +(5108,98027), +(5109,98028), +(5114,98051), +(5115,98056), +(5117,98088), +(5118,98089), +(5119,98090), +(5120,98094), +(5147,100942), +(5333,111294), +(5339,115803), +(5340,115804), +(5342,115805), +(5343,115806), +(5344,115807), +(5345,115808), +(5346,115809), +(5347,115811), +(5348,115812), +(5349,115813), +(5350,115814), +(5351,115815), +(5413,127760), +(5414,127761), +(5415,127762), +(5416,127763), +(5417,127764), +(5418,127765), +(5419,127414), +(5420,127415), +(5421,127416); + +UPDATE `item_instance_gems` SET `gemItemId1`=IFNULL((SELECT `gemItemId` FROM `enchant_gem_ids` WHERE `enchantId`=`gemItemId1`), 0); +UPDATE `item_instance_gems` SET `gemItemId2`=IFNULL((SELECT `gemItemId` FROM `enchant_gem_ids` WHERE `enchantId`=`gemItemId2`), 0); +UPDATE `item_instance_gems` SET `gemItemId3`=IFNULL((SELECT `gemItemId` FROM `enchant_gem_ids` WHERE `enchantId`=`gemItemId3`), 0); + +DROP TABLE IF EXISTS `enchant_gem_ids`; diff --git a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql new file mode 100644 index 00000000000..f90c81333a9 --- /dev/null +++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql @@ -0,0 +1,2433 @@ +-- +-- Table structure for table `achievement` +-- +ALTER TABLE `achievement` + MODIFY `Title` text AFTER `ID`, + MODIFY `Description` text AFTER `Title`, + MODIFY `Flags` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `Reward` text AFTER `Flags`, + MODIFY `MapID` smallint(6) NOT NULL DEFAULT '0' AFTER `Reward`, + MODIFY `Supercedes` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `Category` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Supercedes`, + MODIFY `UIOrder` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Category`, + MODIFY `IconID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `UIOrder`, + MODIFY `SharesCriteria` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `IconID`, + MODIFY `CriteriaTree` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SharesCriteria`, + MODIFY `Faction` tinyint(4) NOT NULL DEFAULT '0' AFTER `CriteriaTree`, + MODIFY `Points` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Faction`, + MODIFY `MinimumCriteria` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Points`; + +-- +-- Table structure for table `anim_kit` +-- +DROP TABLE IF EXISTS `anim_kit`; +CREATE TABLE `anim_kit` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `OneShotDuration` int(10) unsigned NOT NULL DEFAULT '0', + `OneShotStopAnimKitID` smallint(5) unsigned NOT NULL DEFAULT '0', + `LowDefAnimKitID` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `area_group_member` +-- +ALTER TABLE `area_group_member` + MODIFY `AreaGroupID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `AreaID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaGroupID`; + +-- +-- Table structure for table `armor_location` +-- +DROP TABLE IF EXISTS `armor_location`; +CREATE TABLE `armor_location` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Modifier1` float NOT NULL DEFAULT '0', + `Modifier2` float NOT NULL DEFAULT '0', + `Modifier3` float NOT NULL DEFAULT '0', + `Modifier4` float NOT NULL DEFAULT '0', + `Modifier5` float NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `auction_house` +-- +ALTER TABLE `auction_house` + MODIFY `Name` text AFTER `ID`, + MODIFY `FactionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `DepositRate` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `FactionID`, + MODIFY `ConsignmentRate` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DepositRate`; + +-- +-- Table structure for table `bank_bag_slot_prices` +-- +DROP TABLE IF EXISTS `bank_bag_slot_prices`; +CREATE TABLE `bank_bag_slot_prices` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Cost` int(10) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `barber_shop_style` +-- +ALTER TABLE `barber_shop_style` + MODIFY `DisplayName` text AFTER `ID`, + MODIFY `Description` text AFTER `DisplayName`, + MODIFY `CostModifier` float NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CostModifier`, + MODIFY `Race` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Type`, + MODIFY `Sex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Race`, + MODIFY `Data` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Sex`; + +-- +-- Table structure for table `battle_pet_breed_quality` +-- +ALTER TABLE `battle_pet_breed_quality` + MODIFY `Modifier` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Quality` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Modifier`; + +-- +-- Table structure for table `battle_pet_breed_state` +-- +ALTER TABLE `battle_pet_breed_state` + MODIFY `Value` smallint(6) NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `BreedID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Value`, + MODIFY `State` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BreedID`; + +-- +-- Table structure for table `battle_pet_species` +-- +ALTER TABLE `battle_pet_species` + MODIFY `SourceText` text AFTER `SummonSpellID`, + MODIFY `Description` text AFTER `SourceText`, + MODIFY `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `PetType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `Source` tinyint(4) NOT NULL DEFAULT '0' AFTER `PetType`; + +-- +-- Table structure for table `battle_pet_species_locale` +-- +ALTER TABLE `battle_pet_species_locale` + CHANGE `SourceText` `SourceText_lang` text AFTER `locale`, + CHANGE `Description` `Description_lang` text AFTER `SourceText_lang`; + +-- +-- Table structure for table `battle_pet_species_state` +-- +ALTER TABLE `battle_pet_species_state` + MODIFY `Value` int(11) NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `SpeciesID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Value`, + MODIFY `State` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpeciesID`; + +-- +-- Table structure for table `broadcast_text` +-- +ALTER TABLE `broadcast_text` + MODIFY `MaleText` text AFTER `ID`, + MODIFY `FemaleText` text AFTER `MaleText`, + MODIFY `EmoteID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `FemaleText`, + MODIFY `EmoteID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EmoteID1`, + MODIFY `EmoteID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EmoteID2`, + MODIFY `EmoteDelay1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EmoteID3`, + MODIFY `EmoteDelay2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EmoteDelay1`, + MODIFY `EmoteDelay3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EmoteDelay2`, + MODIFY `SoundID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EmoteDelay3`, + MODIFY `UnkEmoteID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SoundID`, + MODIFY `Language` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `UnkEmoteID`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Language`, + MODIFY `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0' AFTER `Type`; + +-- +-- Table structure for table `char_start_outfit` +-- +ALTER TABLE `char_start_outfit` + MODIFY `ItemID1` int(11) NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `ItemID2` int(11) NOT NULL DEFAULT '0' AFTER `ItemID1`, + MODIFY `ItemID3` int(11) NOT NULL DEFAULT '0' AFTER `ItemID2`, + MODIFY `ItemID4` int(11) NOT NULL DEFAULT '0' AFTER `ItemID3`, + MODIFY `ItemID5` int(11) NOT NULL DEFAULT '0' AFTER `ItemID4`, + MODIFY `ItemID6` int(11) NOT NULL DEFAULT '0' AFTER `ItemID5`, + MODIFY `ItemID7` int(11) NOT NULL DEFAULT '0' AFTER `ItemID6`, + MODIFY `ItemID8` int(11) NOT NULL DEFAULT '0' AFTER `ItemID7`, + MODIFY `ItemID9` int(11) NOT NULL DEFAULT '0' AFTER `ItemID8`, + MODIFY `ItemID10` int(11) NOT NULL DEFAULT '0' AFTER `ItemID9`, + MODIFY `ItemID11` int(11) NOT NULL DEFAULT '0' AFTER `ItemID10`, + MODIFY `ItemID12` int(11) NOT NULL DEFAULT '0' AFTER `ItemID11`, + MODIFY `ItemID13` int(11) NOT NULL DEFAULT '0' AFTER `ItemID12`, + MODIFY `ItemID14` int(11) NOT NULL DEFAULT '0' AFTER `ItemID13`, + MODIFY `ItemID15` int(11) NOT NULL DEFAULT '0' AFTER `ItemID14`, + MODIFY `ItemID16` int(11) NOT NULL DEFAULT '0' AFTER `ItemID15`, + MODIFY `ItemID17` int(11) NOT NULL DEFAULT '0' AFTER `ItemID16`, + MODIFY `ItemID18` int(11) NOT NULL DEFAULT '0' AFTER `ItemID17`, + MODIFY `ItemID19` int(11) NOT NULL DEFAULT '0' AFTER `ItemID18`, + MODIFY `ItemID20` int(11) NOT NULL DEFAULT '0' AFTER `ItemID19`, + MODIFY `ItemID21` int(11) NOT NULL DEFAULT '0' AFTER `ItemID20`, + MODIFY `ItemID22` int(11) NOT NULL DEFAULT '0' AFTER `ItemID21`, + MODIFY `ItemID23` int(11) NOT NULL DEFAULT '0' AFTER `ItemID22`, + MODIFY `ItemID24` int(11) NOT NULL DEFAULT '0' AFTER `ItemID23`, + MODIFY `PetDisplayID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemID24`, + MODIFY `PetFamilyID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `OutfitID`; + +-- +-- Table structure for table `chr_classes_x_power_types` +-- +ALTER TABLE `chr_classes_x_power_types` + MODIFY `ClassID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `PowerType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ClassID`; + +-- +-- Table structure for table `chr_races` +-- +DROP TABLE IF EXISTS `chr_races`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `chr_races` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Flags` int(10) unsigned NOT NULL DEFAULT '0', + `ClientPrefix` text, + `ClientFileString` text, + `Name` text, + `NameFemale` text, + `NameMale` text, + `FacialHairCustomization1` text, + `FacialHairCustomization2` text, + `HairCustomization` text, + `CreateScreenFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `SelectScreenFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `MaleCustomizeOffset1` float NOT NULL DEFAULT '0', + `MaleCustomizeOffset2` float NOT NULL DEFAULT '0', + `MaleCustomizeOffset3` float NOT NULL DEFAULT '0', + `FemaleCustomizeOffset1` float NOT NULL DEFAULT '0', + `FemaleCustomizeOffset2` float NOT NULL DEFAULT '0', + `FemaleCustomizeOffset3` float NOT NULL DEFAULT '0', + `LowResScreenFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `FactionID` smallint(5) unsigned NOT NULL DEFAULT '0', + `ExplorationSoundID` smallint(5) unsigned NOT NULL DEFAULT '0', + `MaleDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0', + `FemaleDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0', + `ResSicknessSpellID` smallint(5) unsigned NOT NULL DEFAULT '0', + `SplashSoundID` smallint(5) unsigned NOT NULL DEFAULT '0', + `CinematicSequenceID` smallint(5) unsigned NOT NULL DEFAULT '0', + `UAMaleCreatureSoundDataID` smallint(5) unsigned NOT NULL DEFAULT '0', + `UAFemaleCreatureSoundDataID` smallint(5) unsigned NOT NULL DEFAULT '0', + `HighResMaleDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0', + `HighResFemaleDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0', + `Unk` smallint(5) unsigned NOT NULL DEFAULT '0', + `BaseLanguage` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CreatureType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `TeamID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `RaceRelated` tinyint(3) unsigned NOT NULL DEFAULT '0', + `UnalteredVisualRaceID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CharComponentTextureLayoutID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DefaultClassID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `NeutralRaceID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CharComponentTexLayoutHiResID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `chr_races_locale` +-- +DROP TABLE IF EXISTS `chr_races_locale`; +CREATE TABLE `chr_races_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `NameFemale_lang` text, + `NameMale_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- +-- Table structure for table `cinematic_sequences` +-- +ALTER TABLE `cinematic_sequences` + MODIFY `SoundID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Camera1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SoundID`, + MODIFY `Camera2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Camera1`, + MODIFY `Camera3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Camera2`, + MODIFY `Camera4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Camera3`, + MODIFY `Camera5` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Camera4`, + MODIFY `Camera6` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Camera5`, + MODIFY `Camera7` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Camera6`, + MODIFY `Camera8` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Camera7`; + +-- +-- Table structure for table `creature_display_info` +-- +ALTER TABLE `creature_display_info` + MODIFY `ExtendedDisplayInfoID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `CreatureModelScale` float NOT NULL DEFAULT '0' AFTER `ExtendedDisplayInfoID`, + MODIFY `Unknown620` float NOT NULL DEFAULT '0' AFTER `CreatureModelScale`, + DROP `TextureVariation1`, + DROP `TextureVariation2`, + DROP `TextureVariation3`, + MODIFY `PortraitTextureName` text AFTER `Unknown620`, + MODIFY `PortraitCreatureDisplayInfoID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `PortraitTextureName`, + MODIFY `CreatureGeosetData` int(10) unsigned NOT NULL DEFAULT '0' AFTER `PortraitCreatureDisplayInfoID`, + MODIFY `StateSpellVisualKitID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `CreatureGeosetData`, + MODIFY `ModelID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StateSpellVisualKitID`, + MODIFY `SoundID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ModelID`, + MODIFY `NPCSoundID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SoundID`, + MODIFY `ParticleColorID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `NPCSoundID`, + MODIFY `ObjectEffectPackageID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ParticleColorID`, + MODIFY `AnimReplacementSetID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ObjectEffectPackageID`, + MODIFY `CreatureModelAlpha` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AnimReplacementSetID`, + MODIFY `SizeClass` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CreatureModelAlpha`, + MODIFY `BloodID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SizeClass`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BloodID`, + MODIFY `Gender` tinyint(4) NOT NULL DEFAULT '0' AFTER `Flags`, + ADD `Unk700` tinyint(4) NOT NULL DEFAULT '0' AFTER `Gender`; + +ALTER TABLE `creature_display_info` + ADD `TextureVariation1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Unknown620`, + ADD `TextureVariation2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `TextureVariation1`, + ADD `TextureVariation3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `TextureVariation2`; + +-- +-- Table structure for table `creature_display_info_extra` +-- +DROP TABLE IF EXISTS `creature_display_info_extra`; +CREATE TABLE `creature_display_info_extra` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay1` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay2` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay3` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay4` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay5` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay6` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay7` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay8` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay9` int(10) unsigned NOT NULL DEFAULT '0', + `NPCItemDisplay10` int(10) unsigned NOT NULL DEFAULT '0', + `FileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `HDFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `DisplayRaceID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DisplaySexID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DisplayClassID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `SkinID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `FaceID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `HairStyleID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `HairColorID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `FacialHairID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CustomDisplayOption1` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CustomDisplayOption2` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CustomDisplayOption3` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `creature_type` +-- +ALTER TABLE `creature_type` MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Name`; + +-- +-- Table structure for table `criteria` +-- +ALTER TABLE `criteria` + MODIFY `Asset` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `StartAsset` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Asset`, + MODIFY `FailAsset` int(10) unsigned NOT NULL DEFAULT '0' AFTER `StartAsset`, + MODIFY `StartTimer` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `FailAsset`, + MODIFY `ModifierTreeId` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StartTimer`, + MODIFY `EligibilityWorldStateID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ModifierTreeId`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `EligibilityWorldStateID`, + MODIFY `StartEvent` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Type`, + MODIFY `FailEvent` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StartEvent`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `FailEvent`, + MODIFY `EligibilityWorldStateValue` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`; + +-- +-- Table structure for table `criteria_tree` +-- +ALTER TABLE `criteria_tree` + MODIFY `Amount` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Description` text AFTER `Amount`, + MODIFY `CriteriaID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `Parent` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CriteriaID`, + MODIFY `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Parent`, + MODIFY `OrderIndex` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `Operator` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `OrderIndex`; + +-- +-- Table structure for table `currency_types` +-- +ALTER TABLE `currency_types` + MODIFY `Name` text AFTER `ID`, + MODIFY `InventoryIcon1` text AFTER `Name`, + MODIFY `InventoryIcon2` text AFTER `InventoryIcon1`, + MODIFY `MaxQty` int(10) unsigned NOT NULL DEFAULT '0' AFTER `InventoryIcon2`, + MODIFY `MaxEarnablePerWeek` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MaxQty`, + MODIFY `Flags` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MaxEarnablePerWeek`, + MODIFY `Description` text AFTER `Flags`, + MODIFY `CategoryID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `SpellWeight` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CategoryID`, + MODIFY `SpellCategory` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpellWeight`, + MODIFY `Quality` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpellCategory`; + +-- +-- Table structure for table `currency_types_locale` +-- +ALTER TABLE `currency_types_locale` DROP `InventoryIcon1_lang`; +ALTER TABLE `currency_types_locale` DROP `InventoryIcon2_lang`; + +-- +-- Table structure for table `curve_point` +-- +ALTER TABLE `curve_point` + MODIFY `X` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Y` float NOT NULL DEFAULT '0' AFTER `X`, + MODIFY `CurveID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Y`, + MODIFY `Index` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurveID`; + +-- +-- Table structure for table `destructible_model_data` +-- +ALTER TABLE `destructible_model_data` + MODIFY `StateDamagedDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `StateDestroyedDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StateDamagedDisplayID`, + MODIFY `StateRebuildingDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StateDestroyedDisplayID`, + MODIFY `StateSmokeDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StateRebuildingDisplayID`, + MODIFY `HealEffectSpeed` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StateSmokeDisplayID`, + MODIFY `StateDamagedImpactEffectDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HealEffectSpeed`, + MODIFY `StateDamagedAmbientDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateDamagedImpactEffectDoodadSet`, + MODIFY `StateDamagedNameSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateDamagedAmbientDoodadSet`, + MODIFY `StateDestroyedDestructionDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateDamagedNameSet`, + MODIFY `StateDestroyedImpactEffectDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateDestroyedDestructionDoodadSet`, + MODIFY `StateDestroyedAmbientDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateDestroyedImpactEffectDoodadSet`, + MODIFY `StateDestroyedNameSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateDestroyedAmbientDoodadSet`, + MODIFY `StateRebuildingDestructionDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateDestroyedNameSet`, + MODIFY `StateRebuildingImpactEffectDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateRebuildingDestructionDoodadSet`, + MODIFY `StateRebuildingAmbientDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateRebuildingImpactEffectDoodadSet`, + MODIFY `StateRebuildingNameSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateRebuildingAmbientDoodadSet`, + MODIFY `StateSmokeInitDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateRebuildingNameSet`, + MODIFY `StateSmokeAmbientDoodadSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateSmokeInitDoodadSet`, + MODIFY `StateSmokeNameSet` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateSmokeAmbientDoodadSet`, + MODIFY `EjectDirection` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `StateSmokeNameSet`, + MODIFY `DoNotHighlight` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `EjectDirection`, + MODIFY `HealEffect` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DoNotHighlight`, + DROP `RepairGroundFx`; + +-- +-- Table structure for table `durability_costs` +-- +DROP TABLE IF EXISTS `durability_costs`; +CREATE TABLE `durability_costs` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost1` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost2` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost3` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost4` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost5` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost6` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost7` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost8` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost9` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost10` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost11` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost12` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost13` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost14` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost15` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost16` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost17` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost18` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost19` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost20` smallint(5) unsigned NOT NULL DEFAULT '0', + `WeaponSubClassCost21` smallint(5) unsigned NOT NULL DEFAULT '0', + `ArmorSubClassCost1` smallint(5) unsigned NOT NULL DEFAULT '0', + `ArmorSubClassCost2` smallint(5) unsigned NOT NULL DEFAULT '0', + `ArmorSubClassCost3` smallint(5) unsigned NOT NULL DEFAULT '0', + `ArmorSubClassCost4` smallint(5) unsigned NOT NULL DEFAULT '0', + `ArmorSubClassCost5` smallint(5) unsigned NOT NULL DEFAULT '0', + `ArmorSubClassCost6` smallint(5) unsigned NOT NULL DEFAULT '0', + `ArmorSubClassCost7` smallint(5) unsigned NOT NULL DEFAULT '0', + `ArmorSubClassCost8` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `emotes_text_sound` +-- +DROP TABLE IF EXISTS `emotes_text_sound`; +CREATE TABLE `emotes_text_sound` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `EmotesTextId` smallint(5) unsigned NOT NULL DEFAULT '0', + `SoundId` smallint(5) unsigned NOT NULL DEFAULT '0', + `RaceId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `SexId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ClassId` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `gameobjects` +-- +ALTER TABLE `gameobjects` + MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST , + MODIFY `PositionX` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `PositionY` float NOT NULL DEFAULT '0' AFTER `PositionX`, + MODIFY `PositionZ` float NOT NULL DEFAULT '0' AFTER `PositionY`, + MODIFY `RotationX` float NOT NULL DEFAULT '0' AFTER `PositionZ`, + MODIFY `RotationY` float NOT NULL DEFAULT '0' AFTER `RotationX`, + MODIFY `RotationZ` float NOT NULL DEFAULT '0' AFTER `RotationY`, + MODIFY `RotationW` float NOT NULL DEFAULT '0' AFTER `RotationZ`, + MODIFY `Size` float NOT NULL DEFAULT '0' AFTER `RotationW`, + MODIFY `Data0` int(10) NOT NULL DEFAULT '0' AFTER `Size`, + MODIFY `Data1` int(10) NOT NULL DEFAULT '0' AFTER `Data0`, + MODIFY `Data2` int(10) NOT NULL DEFAULT '0' AFTER `Data1`, + MODIFY `Data3` int(10) NOT NULL DEFAULT '0' AFTER `Data2`, + MODIFY `Data4` int(10) NOT NULL DEFAULT '0' AFTER `Data3`, + MODIFY `Data5` int(10) NOT NULL DEFAULT '0' AFTER `Data4`, + MODIFY `Data6` int(10) NOT NULL DEFAULT '0' AFTER `Data5`, + MODIFY `Data7` int(10) NOT NULL DEFAULT '0' AFTER `Data6`, + MODIFY `Name` text AFTER `Data7`, + MODIFY `MapID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `DisplayID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `PhaseID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `DisplayID`, + MODIFY `PhaseGroupID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PhaseID`, + MODIFY `PhaseUseFlags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PhaseGroupID`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PhaseUseFlags`, + MODIFY `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0' AFTER `Type`; + +ALTER TABLE `gameobjects` CHANGE `Data7` `Data8` int(10) NOT NULL DEFAULT '0' AFTER `Data6`; +ALTER TABLE `gameobjects` CHANGE `Data6` `Data7` int(10) NOT NULL DEFAULT '0' AFTER `Data5`; +ALTER TABLE `gameobjects` CHANGE `Data5` `Data6` int(10) NOT NULL DEFAULT '0' AFTER `Data4`; +ALTER TABLE `gameobjects` CHANGE `Data4` `Data5` int(10) NOT NULL DEFAULT '0' AFTER `Data3`; +ALTER TABLE `gameobjects` CHANGE `Data3` `Data4` int(10) NOT NULL DEFAULT '0' AFTER `Data2`; +ALTER TABLE `gameobjects` CHANGE `Data2` `Data3` int(10) NOT NULL DEFAULT '0' AFTER `Data1`; +ALTER TABLE `gameobjects` CHANGE `Data1` `Data2` int(10) NOT NULL DEFAULT '0' AFTER `Data0`; +ALTER TABLE `gameobjects` CHANGE `Data0` `Data1` int(10) NOT NULL DEFAULT '0' AFTER `Size`; + +-- +-- Table structure for table `gameobject_display_info` +-- +DROP TABLE IF EXISTS `gameobject_display_info`; +CREATE TABLE `gameobject_display_info` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `FileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `GeoBoxMinX` float NOT NULL DEFAULT '0', + `GeoBoxMinY` float NOT NULL DEFAULT '0', + `GeoBoxMinZ` float NOT NULL DEFAULT '0', + `GeoBoxMaxX` float NOT NULL DEFAULT '0', + `GeoBoxMaxY` float NOT NULL DEFAULT '0', + `GeoBoxMaxZ` float NOT NULL DEFAULT '0', + `OverrideLootEffectScale` float NOT NULL DEFAULT '0', + `OverrideNameScale` float NOT NULL DEFAULT '0', + `Sound1` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound2` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound3` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound4` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound5` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound6` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound7` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound8` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound9` smallint(5) unsigned NOT NULL DEFAULT '0', + `Sound10` smallint(5) unsigned NOT NULL DEFAULT '0', + `ObjectEffectPackageID` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `game_tables` +-- +ALTER TABLE `game_tables` ENGINE=MyISAM, DEFAULT CHARSET=utf8; +ALTER TABLE `game_tables` + MODIFY `Name` text AFTER `ID`, + MODIFY `NumRows` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `NumColumns` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `NumRows`, + MODIFY `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0' AFTER `NumColumns`; + +-- +-- Table structure for table `game_tables_locale` +-- +ALTER TABLE `game_tables_locale` MODIFY `Name_lang` text AFTER `locale`; + +-- +-- Table structure for table `garr_ability` +-- +ALTER TABLE `garr_ability` + MODIFY `Name` text AFTER `ID`, + MODIFY `Description` text AFTER `Name`, + MODIFY `IconFileDataID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `OtherFactionGarrAbilityID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `IconFileDataID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `OtherFactionGarrAbilityID`, + MODIFY `GarrAbilityCategoryID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `FollowerTypeID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrAbilityCategoryID`; + +-- +-- Table structure for table `garr_building` +-- +ALTER TABLE `garr_building` + MODIFY `NameAlliance` text AFTER `AllianceGameObjectID`, + MODIFY `NameHorde` text AFTER `NameAlliance`, + MODIFY `Description` text AFTER `NameHorde`, + MODIFY `Tooltip` text AFTER `Description`, + MODIFY `IconFileDataID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Tooltip`, + MODIFY `BuildDuration` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `IconFileDataID`, + MODIFY `CostCurrencyID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `BuildDuration`, + MODIFY `CostCurrencyAmount` smallint(6) NOT NULL DEFAULT '0' AFTER `CostCurrencyID`, + MODIFY `AllianceActivationScenePackageID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CostCurrencyAmount`, + MODIFY `HordeActivationScenePackageID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AllianceActivationScenePackageID`, + MODIFY `CostMoney` smallint(6) NOT NULL DEFAULT '0' AFTER `HordeActivationScenePackageID`, + MODIFY `Unknown` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CostMoney`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Unknown`, + MODIFY `Level` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Type`, + MODIFY `HordeTexPrefixKitID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Level`, + MODIFY `AllianceTexPrefixKitID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HordeTexPrefixKitID`, + MODIFY `BonusAmount` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AllianceTexPrefixKitID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BonusAmount`, + MODIFY `MaxShipments` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `FollowerRequiredGarrAbilityID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxShipments`, + MODIFY `FollowerGarrAbilityEffectID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `FollowerRequiredGarrAbilityID`, + ADD `GarrTypeID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `FollowerGarrAbilityEffectID`; + +-- +-- Table structure for table `garr_building_plot_inst` +-- +ALTER TABLE `garr_building_plot_inst` + MODIFY `LandmarkOffsetX` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `LandmarkOffsetY` float NOT NULL DEFAULT '0' AFTER `LandmarkOffsetX`, + MODIFY `UiTextureAtlasMemberID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `LandmarkOffsetY`, + MODIFY `GarrSiteLevelPlotInstID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `UiTextureAtlasMemberID`, + MODIFY `GarrBuildingID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrSiteLevelPlotInstID`; + +-- +-- Table structure for table `garr_class_spec` +-- +ALTER TABLE `garr_class_spec` + MODIFY `ClassAtlasID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `NameGenderless`, + MODIFY `GarrFollItemSetID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ClassAtlasID`; + +-- +-- Table structure for table `garr_follower` +-- +ALTER TABLE `garr_follower` + MODIFY `HordeCreatureID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `AllianceCreatureID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `HordeCreatureID`, + MODIFY `HordeSourceText` text AFTER `AllianceCreatureID`, + MODIFY `AllianceSourceText` text AFTER `HordeSourceText`, + MODIFY `HordePortraitIconID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AllianceSourceText`, + MODIFY `AlliancePortraitIconID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `HordePortraitIconID`, + MODIFY `ItemLevelWeapon` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AlliancePortraitIconID`, + MODIFY `ItemLevelArmor` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemLevelWeapon`, + MODIFY `FollowerTypeID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemLevelArmor`, + MODIFY `HordeUiAnimRaceInfoID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `FollowerTypeID`, + MODIFY `AllianceUiAnimRaceInfoID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HordeUiAnimRaceInfoID`, + MODIFY `Quality` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AllianceUiAnimRaceInfoID`, + MODIFY `HordeGarrClassSpecID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Quality`, + MODIFY `AllianceGarrClassSpecID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HordeGarrClassSpecID`, + MODIFY `HordeGarrFollItemSetID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AllianceGarrClassSpecID`, + MODIFY `AllianceGarrFollItemSetID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HordeGarrFollItemSetID`, + MODIFY `Level` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AllianceGarrFollItemSetID`, + MODIFY `Unknown1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Level`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Unknown1`, + MODIFY `Unknown2` tinyint(4) NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `Unknown3` tinyint(4) NOT NULL DEFAULT '0' AFTER `Unknown2`, + MODIFY `HordeListPortraitTextureKitID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Unknown3`, + MODIFY `AllianceListPortraitTextureKitID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HordeListPortraitTextureKitID`, + ADD `GarrTypeID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AllianceListPortraitTextureKitID`; + +-- +-- Table structure for table `garr_follower_x_ability` +-- +ALTER TABLE `garr_follower_x_ability` + MODIFY `GarrFollowerID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `GarrAbilityID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `GarrFollowerID`, + MODIFY `FactionIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrAbilityID`; + +-- +-- Table structure for table `garr_plot` +-- +ALTER TABLE `garr_plot` + MODIFY `Name` text AFTER `ID`, + MODIFY `AllianceConstructionGameObjectID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `HordeConstructionGameObjectID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AllianceConstructionGameObjectID`, + MODIFY `GarrPlotUICategoryID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HordeConstructionGameObjectID`, + MODIFY `PlotType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrPlotUICategoryID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PlotType`, + MODIFY `MinCount` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `MaxCount` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinCount`; + +-- +-- Table structure for table `garr_plot_building` +-- +ALTER TABLE `garr_plot_building` + MODIFY `GarrPlotID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `GarrBuildingID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrPlotID`; + +-- +-- Table structure for table `garr_plot_instance` +-- +ALTER TABLE `garr_plot_instance` + MODIFY `Name` text AFTER `ID`, + MODIFY `GarrPlotID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Name`; + +-- +-- Table structure for table `garr_site_level` +-- +ALTER TABLE `garr_site_level` + MODIFY `TownHallX` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `TownHallY` float NOT NULL DEFAULT '0' AFTER `TownHallX`, + MODIFY `MapID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `TownHallY`, + MODIFY `UpgradeResourceCost` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `UpgradeMoneyCost` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `UpgradeResourceCost`, + MODIFY `Level` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `UpgradeMoneyCost`, + MODIFY `SiteID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Level`, + MODIFY `UITextureKitID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SiteID`, + MODIFY `MovieID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `UITextureKitID`, + MODIFY `Level2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MovieID`; + +-- +-- Table structure for table `garr_site_level_plot_inst` +-- +ALTER TABLE `garr_site_level_plot_inst` + MODIFY `LandmarkX` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `LandmarkY` float NOT NULL DEFAULT '0' AFTER `LandmarkX`, + MODIFY `GarrSiteLevelID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `LandmarkY`, + MODIFY `GarrPlotInstanceID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrSiteLevelID`, + MODIFY `Unknown` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrPlotInstanceID`; + +-- +-- Table structure for table `glyph_slot` +-- +ALTER TABLE `glyph_slot` + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Tooltip` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Type`; + +-- +-- Table structure for table `guild_color_background` +-- +DROP TABLE IF EXISTS `guild_color_background`; +CREATE TABLE `guild_color_background` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Red` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Green` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Blue` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `guild_color_border` +-- +DROP TABLE IF EXISTS `guild_color_border`; +CREATE TABLE `guild_color_border` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Red` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Green` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Blue` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- +-- Table structure for table `guild_color_emblem` +-- +DROP TABLE IF EXISTS `guild_color_emblem`; +CREATE TABLE `guild_color_emblem` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Red` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Green` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Blue` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `guild_perk_spells` +-- +ALTER TABLE `guild_perk_spells` + MODIFY `SpellID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `GuildLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpellID`; + +-- +-- Table structure for table `heirloom` +-- +ALTER TABLE `heirloom` + MODIFY `SourceText` text AFTER `ItemID`, + MODIFY `OldItem1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SourceText`, + MODIFY `OldItem2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `OldItem1`, + MODIFY `NextDifficultyItemID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `OldItem2`, + MODIFY `UpgradeItemID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `NextDifficultyItemID`, + MODIFY `UpgradeItemID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `UpgradeItemID1`, + MODIFY `ItemBonusListID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `UpgradeItemID2`, + MODIFY `ItemBonusListID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemBonusListID1`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemBonusListID2`, + MODIFY `Source` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`; + +-- +-- Table structure for table `holidays` +-- +ALTER TABLE `holidays` + MODIFY `Date1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Date2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date1`, + MODIFY `Date3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date2`, + MODIFY `Date4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date3`, + MODIFY `Date5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date4`, + MODIFY `Date6` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date5`, + MODIFY `Date7` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date6`, + MODIFY `Date8` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date7`, + MODIFY `Date9` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date8`, + MODIFY `Date10` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date9`, + MODIFY `Date11` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date10`, + MODIFY `Date12` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date11`, + MODIFY `Date13` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date12`, + MODIFY `Date14` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date13`, + MODIFY `Date15` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date14`, + MODIFY `Date16` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Date15`, + MODIFY `TextureFilename` text AFTER `Date16`, + MODIFY `Duration1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `TextureFilename`, + MODIFY `Duration2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration1`, + MODIFY `Duration3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration2`, + MODIFY `Duration4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration3`, + MODIFY `Duration5` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration4`, + MODIFY `Duration6` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration5`, + MODIFY `Duration7` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration6`, + MODIFY `Duration8` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration7`, + MODIFY `Duration9` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration8`, + MODIFY `Duration10` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration9`, + MODIFY `Region` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Duration10`, + MODIFY `Looping` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Region`, + MODIFY `CalendarFlags1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Looping`, + MODIFY `CalendarFlags2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags1`, + MODIFY `CalendarFlags3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags2`, + MODIFY `CalendarFlags4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags3`, + MODIFY `CalendarFlags5` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags4`, + MODIFY `CalendarFlags6` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags5`, + MODIFY `CalendarFlags7` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags6`, + MODIFY `CalendarFlags8` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags7`, + MODIFY `CalendarFlags9` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags8`, + MODIFY `CalendarFlags10` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags9`, + MODIFY `HolidayNameID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFlags10`, + MODIFY `HolidayDescriptionID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HolidayNameID`, + MODIFY `Priority` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `HolidayDescriptionID`, + MODIFY `CalendarFilterType` tinyint(4) NOT NULL DEFAULT '0' AFTER `Priority`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CalendarFilterType`; + +-- +-- Table structure for table `item` +-- +ALTER TABLE `item` + MODIFY `FileDataID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Class` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID`, + MODIFY `SubClass` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Class`, + MODIFY `SoundOverrideSubclass` tinyint(4) NOT NULL DEFAULT '0' AFTER `SubClass`, + MODIFY `Material` tinyint(4) NOT NULL DEFAULT '0' AFTER `SoundOverrideSubclass`, + MODIFY `InventoryType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Material`, + MODIFY `Sheath` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `InventoryType`, + MODIFY `GroupSoundsID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Sheath`; + +-- +-- Table structure for table `item_appearance` +-- +ALTER TABLE `item_appearance` ADD `ObjectComponentSlot` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `IconFileDataID`; + +-- +-- Table structure for table `item_armor_quality` +-- +DROP TABLE IF EXISTS `item_armor_quality`; +CREATE TABLE `item_armor_quality` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `QualityMod1` float NOT NULL DEFAULT '0', + `QualityMod2` float NOT NULL DEFAULT '0', + `QualityMod3` float NOT NULL DEFAULT '0', + `QualityMod4` float NOT NULL DEFAULT '0', + `QualityMod5` float NOT NULL DEFAULT '0', + `QualityMod6` float NOT NULL DEFAULT '0', + `QualityMod7` float NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_armor_shield` +-- +DROP TABLE IF EXISTS `item_armor_shield`; +CREATE TABLE `item_armor_shield` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Quality1` float NOT NULL DEFAULT '0', + `Quality2` float NOT NULL DEFAULT '0', + `Quality3` float NOT NULL DEFAULT '0', + `Quality4` float NOT NULL DEFAULT '0', + `Quality5` float NOT NULL DEFAULT '0', + `Quality6` float NOT NULL DEFAULT '0', + `Quality7` float NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_armor_total` +-- +DROP TABLE IF EXISTS `item_armor_total`; +CREATE TABLE `item_armor_total` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Value1` float NOT NULL DEFAULT '0', + `Value2` float NOT NULL DEFAULT '0', + `Value3` float NOT NULL DEFAULT '0', + `Value4` float NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_bag_family` +-- +DROP TABLE IF EXISTS `item_bag_family`; +CREATE TABLE `item_bag_family` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_bag_family_locale` +-- +DROP TABLE IF EXISTS `item_bag_family_locale`; +CREATE TABLE `item_bag_family_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_bonus` +-- +ALTER TABLE `item_bonus` + MODIFY `Value1` int(11) NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Value2` int(11) NOT NULL DEFAULT '0' AFTER `Value1`, + MODIFY `BonusListID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Value2`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BonusListID`, + MODIFY `Index` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Type`; + +-- +-- Table structure for table `item_bonus_tree_node` +-- +ALTER TABLE `item_bonus_tree_node` + MODIFY `BonusTreeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `SubTreeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `BonusTreeID`, + MODIFY `BonusListID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SubTreeID`, + MODIFY `BonusTreeModID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BonusListID`; + +-- +-- Table structure for table `item_class` +-- +ALTER TABLE `item_class` + MODIFY `PriceMod` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Name` text AFTER `PriceMod`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Name`; + +-- +-- Table structure for table `item_currency_cost` +-- +ALTER TABLE `item_currency_cost` DROP INDEX `idx_itemId`; + +-- +-- Table structure for table `item_damage_ammo` +-- +DROP TABLE IF EXISTS `item_damage_ammo`; +CREATE TABLE `item_damage_ammo` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `DPS1` float NOT NULL DEFAULT '0', + `DPS2` float NOT NULL DEFAULT '0', + `DPS3` float NOT NULL DEFAULT '0', + `DPS4` float NOT NULL DEFAULT '0', + `DPS5` float NOT NULL DEFAULT '0', + `DPS6` float NOT NULL DEFAULT '0', + `DPS7` float NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_damage_one_hand` +-- +DROP TABLE IF EXISTS `item_damage_one_hand`; +CREATE TABLE `item_damage_one_hand` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `DPS1` float NOT NULL DEFAULT '0', + `DPS2` float NOT NULL DEFAULT '0', + `DPS3` float NOT NULL DEFAULT '0', + `DPS4` float NOT NULL DEFAULT '0', + `DPS5` float NOT NULL DEFAULT '0', + `DPS6` float NOT NULL DEFAULT '0', + `DPS7` float NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_damage_one_hand_caster` +-- +DROP TABLE IF EXISTS `item_damage_one_hand_caster`; +CREATE TABLE `item_damage_one_hand_caster` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `DPS1` float NOT NULL DEFAULT '0', + `DPS2` float NOT NULL DEFAULT '0', + `DPS3` float NOT NULL DEFAULT '0', + `DPS4` float NOT NULL DEFAULT '0', + `DPS5` float NOT NULL DEFAULT '0', + `DPS6` float NOT NULL DEFAULT '0', + `DPS7` float NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_damage_two_hand` +-- +DROP TABLE IF EXISTS `item_damage_two_hand`; +CREATE TABLE `item_damage_two_hand` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `DPS1` float NOT NULL DEFAULT '0', + `DPS2` float NOT NULL DEFAULT '0', + `DPS3` float NOT NULL DEFAULT '0', + `DPS4` float NOT NULL DEFAULT '0', + `DPS5` float NOT NULL DEFAULT '0', + `DPS6` float NOT NULL DEFAULT '0', + `DPS7` float NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_damage_two_hand_caster` +-- +DROP TABLE IF EXISTS `item_damage_two_hand_caster`; +CREATE TABLE `item_damage_two_hand_caster` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `DPS1` float NOT NULL DEFAULT '0', + `DPS2` float NOT NULL DEFAULT '0', + `DPS3` float NOT NULL DEFAULT '0', + `DPS4` float NOT NULL DEFAULT '0', + `DPS5` float NOT NULL DEFAULT '0', + `DPS6` float NOT NULL DEFAULT '0', + `DPS7` float NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_disenchant_loot` +-- +ALTER TABLE `item_disenchant_loot` + MODIFY `MinItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `MaxItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinItemLevel`, + MODIFY `RequiredDisenchantSkill` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MaxItemLevel`, + MODIFY `ItemClass` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredDisenchantSkill`, + MODIFY `ItemSubClass` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemClass`, + MODIFY `ItemQuality` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemSubClass`; + +-- +-- Table structure for table `item_effect` +-- +ALTER TABLE `item_effect` + MODIFY `SpellID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemID`, + MODIFY `Cooldown` int(11) NOT NULL DEFAULT '0' AFTER `SpellID`, + MODIFY `CategoryCooldown` int(11) NOT NULL DEFAULT '0' AFTER `Cooldown`, + MODIFY `Charges` smallint(6) NOT NULL DEFAULT '0' AFTER `CategoryCooldown`, + MODIFY `Category` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Charges`, + MODIFY `ChrSpecializationID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Category`, + MODIFY `OrderIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ChrSpecializationID`, + MODIFY `Trigger` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `OrderIndex`; + +-- +-- Table structure for table `item_extended_cost` +-- +ALTER TABLE `item_extended_cost` + MODIFY `RequiredItem1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `RequiredItem2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItem1`, + MODIFY `RequiredItem3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItem2`, + MODIFY `RequiredItem4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItem3`, + MODIFY `RequiredItem5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItem4`, + MODIFY `RequiredCurrencyCount1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItem5`, + MODIFY `RequiredCurrencyCount2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrencyCount1`, + MODIFY `RequiredCurrencyCount3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrencyCount2`, + MODIFY `RequiredCurrencyCount4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrencyCount3`, + MODIFY `RequiredCurrencyCount5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrencyCount4`, + MODIFY `RequiredMoney` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrencyCount5`, + MODIFY `RequiredItemCount1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredMoney`, + MODIFY `RequiredItemCount2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItemCount1`, + MODIFY `RequiredItemCount3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItemCount2`, + MODIFY `RequiredItemCount4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItemCount3`, + MODIFY `RequiredItemCount5` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItemCount4`, + MODIFY `RequiredPersonalArenaRating` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredItemCount5`, + MODIFY `RequiredCurrency1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredPersonalArenaRating`, + MODIFY `RequiredCurrency2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrency1`, + MODIFY `RequiredCurrency3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrency2`, + MODIFY `RequiredCurrency4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrency3`, + MODIFY `RequiredCurrency5` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrency4`, + MODIFY `RequiredArenaSlot` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCurrency5`, + MODIFY `RequiredFactionId` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredArenaSlot`, + MODIFY `RequiredFactionStanding` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredFactionId`, + MODIFY `RequirementFlags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredFactionStanding`, + MODIFY `RequiredAchievement` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequirementFlags`, + DROP `ItemPurchaseGroup`; + +-- +-- Table structure for table `item_limit_category` +-- +ALTER TABLE `item_limit_category` + MODIFY `Quantity` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Quantity`; + +-- +-- Table structure for table `item_modified_appearance` +-- +ALTER TABLE `item_modified_appearance` + MODIFY `AppearanceID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemID`, + MODIFY `AppearanceModID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AppearanceID`, + MODIFY `Index` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AppearanceModID`, + DROP `IconFileDataID`; + +-- +-- Table structure for table `item_price_base` +-- +ALTER TABLE `item_price_base` + MODIFY `ArmorFactor` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `WeaponFactor` float NOT NULL DEFAULT '0' AFTER `ArmorFactor`, + MODIFY `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `WeaponFactor`; + +-- +-- Table structure for table `item_random_properties` +-- +ALTER TABLE `item_random_properties` + MODIFY `Name` text AFTER `ID`, + MODIFY `Enchantment1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `Enchantment2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment1`, + MODIFY `Enchantment3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment2`, + MODIFY `Enchantment4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment3`, + MODIFY `Enchantment5` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment4`, + DROP `InternalName`; + +-- +-- Table structure for table `item_random_properties_locale` +-- +ALTER TABLE `item_random_properties_locale` DROP `InternalName_lang`; + +-- +-- Table structure for table `item_random_suffix` +-- +ALTER TABLE `item_random_suffix` + MODIFY `Enchantment1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `InternalName`, + MODIFY `Enchantment2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment1`, + MODIFY `Enchantment3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment2`, + MODIFY `Enchantment4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment3`, + MODIFY `Enchantment5` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment4`, + MODIFY `AllocationPct1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Enchantment5`, + MODIFY `AllocationPct2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AllocationPct1`, + MODIFY `AllocationPct3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AllocationPct2`, + MODIFY `AllocationPct4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AllocationPct3`, + MODIFY `AllocationPct5` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AllocationPct4`; + +-- +-- Table structure for table `item_set_spell` +-- +DROP TABLE IF EXISTS `item_set_spell`; +CREATE TABLE `item_set_spell` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `ItemSetID` smallint(5) unsigned NOT NULL DEFAULT '0', + `ChrSpecID` smallint(5) unsigned NOT NULL DEFAULT '0', + `Threshold` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `item_sparse` +-- +ALTER TABLE `item_sparse` + MODIFY `Flags1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Flags2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Flags1`, + MODIFY `Flags3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Flags2`, + MODIFY `Unk1` float NOT NULL DEFAULT '0' AFTER `Flags3`, + MODIFY `Unk2` float NOT NULL DEFAULT '0' AFTER `Unk1`, + MODIFY `BuyPrice` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Unk2`, + MODIFY `SellPrice` int(10) unsigned NOT NULL DEFAULT '0' AFTER `BuyPrice`, + MODIFY `AllowableClass` int(11) NOT NULL DEFAULT '0' AFTER `SellPrice`, + MODIFY `AllowableRace` int(11) NOT NULL DEFAULT '0' AFTER `AllowableClass`, + MODIFY `RequiredSpell` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AllowableRace`, + MODIFY `MaxCount` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredSpell`, + MODIFY `Stackable` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MaxCount`, + MODIFY `ItemStatAllocation1` int(11) NOT NULL DEFAULT '0' AFTER `Stackable`, + MODIFY `ItemStatAllocation2` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation1`, + MODIFY `ItemStatAllocation3` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation2`, + MODIFY `ItemStatAllocation4` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation3`, + MODIFY `ItemStatAllocation5` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation4`, + MODIFY `ItemStatAllocation6` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation5`, + MODIFY `ItemStatAllocation7` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation6`, + MODIFY `ItemStatAllocation8` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation7`, + MODIFY `ItemStatAllocation9` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation8`, + MODIFY `ItemStatAllocation10` int(11) NOT NULL DEFAULT '0' AFTER `ItemStatAllocation9`, + MODIFY `ItemStatSocketCostMultiplier1` float NOT NULL DEFAULT '0' AFTER `ItemStatAllocation10`, + MODIFY `ItemStatSocketCostMultiplier2` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier1`, + MODIFY `ItemStatSocketCostMultiplier3` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier2`, + MODIFY `ItemStatSocketCostMultiplier4` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier3`, + MODIFY `ItemStatSocketCostMultiplier5` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier4`, + MODIFY `ItemStatSocketCostMultiplier6` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier5`, + MODIFY `ItemStatSocketCostMultiplier7` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier6`, + MODIFY `ItemStatSocketCostMultiplier8` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier7`, + MODIFY `ItemStatSocketCostMultiplier9` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier8`, + MODIFY `ItemStatSocketCostMultiplier10` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier9`, + MODIFY `RangedModRange` float NOT NULL DEFAULT '0' AFTER `ItemStatSocketCostMultiplier10`, + MODIFY `Name` text AFTER `RangedModRange`, + MODIFY `Name2` text AFTER `Name`, + MODIFY `Name3` text AFTER `Name2`, + MODIFY `Name4` text AFTER `Name3`, + MODIFY `Description` text AFTER `Name4`, + MODIFY `BagFamily` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `ArmorDamageModifier` float NOT NULL DEFAULT '0' AFTER `BagFamily`, + MODIFY `Duration` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ArmorDamageModifier`, + MODIFY `StatScalingFactor` float NOT NULL DEFAULT '0' AFTER `Duration`, + MODIFY `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StatScalingFactor`, + MODIFY `RequiredSkill` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemLevel`, + MODIFY `RequiredSkillRank` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredSkill`, + MODIFY `RequiredReputationFaction` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredSkillRank`, + MODIFY `ItemStatValue1` smallint(6) NOT NULL DEFAULT '0' AFTER `RequiredReputationFaction`, + MODIFY `ItemStatValue2` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue1`, + MODIFY `ItemStatValue3` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue2`, + MODIFY `ItemStatValue4` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue3`, + MODIFY `ItemStatValue5` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue4`, + MODIFY `ItemStatValue6` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue5`, + MODIFY `ItemStatValue7` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue6`, + MODIFY `ItemStatValue8` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue7`, + MODIFY `ItemStatValue9` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue8`, + MODIFY `ItemStatValue10` smallint(6) NOT NULL DEFAULT '0' AFTER `ItemStatValue9`, + MODIFY `ScalingStatDistribution` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemStatValue10`, + MODIFY `Delay` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ScalingStatDistribution`, + MODIFY `PageText` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Delay`, + MODIFY `StartQuest` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PageText`, + MODIFY `LockID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StartQuest`, + MODIFY `RandomProperty` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `LockID`, + MODIFY `RandomSuffix` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RandomProperty`, + MODIFY `ItemSet` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RandomSuffix`, + MODIFY `Area` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemSet`, + MODIFY `Map` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Area`, + MODIFY `SocketBonus` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Map`, + MODIFY `GemProperties` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SocketBonus`, + MODIFY `ItemLimitCategory` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `GemProperties`, + MODIFY `HolidayID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemLimitCategory`, + MODIFY `ItemNameDescriptionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HolidayID`, + MODIFY `Quality` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemNameDescriptionID`, + MODIFY `BuyCount` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Quality`, + MODIFY `InventoryType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BuyCount`, + MODIFY `RequiredLevel` tinyint(4) NOT NULL DEFAULT '0' AFTER `InventoryType`, + MODIFY `RequiredHonorRank` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredLevel`, + MODIFY `RequiredCityRank` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredHonorRank`, + MODIFY `RequiredReputationRank` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredCityRank`, + MODIFY `ContainerSlots` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredReputationRank`, + MODIFY `ItemStatType1` tinyint(4) NOT NULL DEFAULT '0' AFTER `ContainerSlots`, + MODIFY `ItemStatType2` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType1`, + MODIFY `ItemStatType3` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType2`, + MODIFY `ItemStatType4` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType3`, + MODIFY `ItemStatType5` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType4`, + MODIFY `ItemStatType6` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType5`, + MODIFY `ItemStatType7` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType6`, + MODIFY `ItemStatType8` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType7`, + MODIFY `ItemStatType9` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType8`, + MODIFY `ItemStatType10` tinyint(4) NOT NULL DEFAULT '0' AFTER `ItemStatType9`, + MODIFY `DamageType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemStatType10`, + MODIFY `Bonding` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DamageType`, + MODIFY `LanguageID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Bonding`, + MODIFY `PageMaterial` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LanguageID`, + MODIFY `Material` tinyint(4) NOT NULL DEFAULT '0' AFTER `PageMaterial`, + MODIFY `Sheath` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Material`, + MODIFY `TotemCategory` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Sheath`, + MODIFY `SocketColor1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `TotemCategory`, + MODIFY `SocketColor2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SocketColor1`, + MODIFY `SocketColor3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SocketColor2`, + MODIFY `CurrencySubstitutionID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SocketColor3`, + MODIFY `CurrencySubstitutionCount` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencySubstitutionID`, + ADD `ArtifactID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencySubstitutionCount`; + +-- +-- Table structure for table `item_spec` +-- +ALTER TABLE `item_spec` + MODIFY `SpecID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `MinLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpecID`, + MODIFY `MaxLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinLevel`, + MODIFY `ItemType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxLevel`, + MODIFY `PrimaryStat` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemType`, + MODIFY `SecondaryStat` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PrimaryStat`; + +-- +-- Table structure for table `item_spec_override` +-- +ALTER TABLE `item_spec_override` MODIFY `SpecID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemID`; + +-- +-- Table structure for table `item_to_battle_pet_species` +-- +ALTER TABLE `item_to_battle_pet_species` + MODIFY `BattlePetSpeciesID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + ADD `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0' AFTER `BattlePetSpeciesID`; + +ALTER TABLE `item_to_battle_pet_species` ADD PRIMARY KEY (`ID`); + +-- +-- Table structure for table `item_x_bonus_tree` +-- +ALTER TABLE `item_x_bonus_tree` MODIFY `BonusTreeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemID`; + +-- +-- Table structure for table `key_chain` +-- +ALTER TABLE `key_chain` DROP PRIMARY KEY; +ALTER TABLE `key_chain` CHANGE `Id` `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST; +ALTER TABLE `key_chain` ADD PRIMARY KEY (`ID`); + +-- +-- Table structure for table `modifier_tree` +-- +ALTER TABLE `modifier_tree` + MODIFY `Asset1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Asset2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Asset1`, + MODIFY `Parent` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Asset2`, + MODIFY `Type` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Parent`, + ADD `Unk700` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Type`, + MODIFY `Operator` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Unk700`, + MODIFY `Amount` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Operator`; + +-- +-- Table structure for table `mount` +-- +ALTER TABLE `mount` DROP PRIMARY KEY; +ALTER TABLE `mount` + CHANGE `Id` `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST , + MODIFY `SpellId` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `DisplayId` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellId`, + MODIFY `Name` text AFTER `DisplayId`, + MODIFY `Description` text AFTER `Name`, + MODIFY `SourceDescription` text AFTER `Description`, + MODIFY `MountTypeId` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SourceDescription`, + MODIFY `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MountTypeId`, + MODIFY `PlayerConditionId` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `Source` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PlayerConditionId`; +ALTER TABLE `mount` ADD PRIMARY KEY (`ID`); + +-- +-- Dumping data for table `mount` +-- +ALTER TABLE `mount_locale` DROP PRIMARY KEY; +ALTER TABLE `mount_locale` CHANGE `Id` `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST; +ALTER TABLE `mount_locale` ADD PRIMARY KEY (`ID`, `locale`); + +-- +-- Table structure for table `mount_capability` +-- +ALTER TABLE `mount_capability` + MODIFY `RequiredSpell` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `SpeedModSpell` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RequiredSpell`, + MODIFY `RequiredRidingSkill` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SpeedModSpell`, + MODIFY `RequiredArea` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RequiredRidingSkill`, + MODIFY `RequiredMap` smallint(6) NOT NULL DEFAULT '0' AFTER `RequiredArea`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RequiredMap`, + MODIFY `RequiredAura` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`; + +-- +-- Table structure for table `mount_type_x_capability` +-- +ALTER TABLE `mount_type_x_capability` + MODIFY `MountTypeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `MountCapabilityID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MountTypeID`, + MODIFY `OrderIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MountCapabilityID`; + +-- +-- Table structure for table `movie` +-- +DROP TABLE IF EXISTS `movie`; +CREATE TABLE `movie` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `AudioFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `SubtitleFileDataID` int(10) unsigned NOT NULL DEFAULT '0', + `Volume` tinyint(3) unsigned NOT NULL DEFAULT '0', + `KeyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `names_profanity` +-- +ALTER TABLE `names_profanity` MODIFY `Language` tinyint(4) NOT NULL DEFAULT '0' AFTER `Name`; + +-- +-- Table structure for table `names_reserved_locale` +-- +ALTER TABLE `names_reserved_locale` MODIFY `LocaleMask` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Name`; + +-- +-- Table structure for table `name_gen` +-- +ALTER TABLE `name_gen` + MODIFY `Race` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `Sex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Race`; + +-- +-- Table structure for table `override_spell_data` +-- +ALTER TABLE `override_spell_data` + MODIFY `PlayerActionbarFileDataID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellID10`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PlayerActionbarFileDataID`; + +-- +-- Table structure for table `phase_x_phase_group` +-- +ALTER TABLE `phase_group` + RENAME `phase_x_phase_group`, + MODIFY `PhaseID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `PhaseGroupID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PhaseID`, + MODIFY `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0' AFTER `PhaseGroupID`; + +-- +-- Table structure for table `player_condition` +-- +ALTER TABLE `player_condition` + MODIFY `RaceMask` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `SkillLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RaceMask`, + MODIFY `ReputationLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SkillLogic`, + MODIFY `PrevQuestLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ReputationLogic`, + MODIFY `CurrQuestLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `PrevQuestLogic`, + MODIFY `CurrentCompletedQuestLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `CurrQuestLogic`, + MODIFY `SpellLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestLogic`, + MODIFY `SpellID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellLogic`, + MODIFY `SpellID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellID1`, + MODIFY `SpellID3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellID2`, + MODIFY `SpellID4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellID3`, + MODIFY `ItemLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellID4`, + MODIFY `ItemID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemLogic`, + MODIFY `ItemID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemID1`, + MODIFY `ItemID3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemID2`, + MODIFY `ItemID4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemID3`, + MODIFY `Time1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemID4`, + MODIFY `Time2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Time1`, + MODIFY `AuraSpellLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Time2`, + MODIFY `AuraSpellID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AuraSpellLogic`, + MODIFY `AuraSpellID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AuraSpellID1`, + MODIFY `AuraSpellID3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AuraSpellID2`, + MODIFY `AuraSpellID4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AuraSpellID3`, + MODIFY `AchievementLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AuraSpellID4`, + MODIFY `AreaLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AchievementLogic`, + MODIFY `QuestKillLogic` int(10) unsigned NOT NULL DEFAULT '0' AFTER `AreaLogic`, + MODIFY `QuestKillMonster1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `QuestKillLogic`, + MODIFY `QuestKillMonster2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `QuestKillMonster1`, + MODIFY `QuestKillMonster3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `QuestKillMonster2`, + MODIFY `QuestKillMonster4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `QuestKillMonster3`, + ADD `QuestKillMonster5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `QuestKillMonster4`, + ADD `QuestKillMonster6` int(10) unsigned NOT NULL DEFAULT '0' AFTER `QuestKillMonster5`, + MODIFY `FailureDescription` text AFTER `QuestKillMonster6`, + ADD `Unknown700_1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FailureDescription`, + ADD `Unknown700_2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Unknown700_1`, + MODIFY `MinLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Unknown700_2`, + MODIFY `MaxLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinLevel`, + MODIFY `ClassMask` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MaxLevel`, + MODIFY `SkillID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ClassMask`, + MODIFY `SkillID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SkillID1`, + MODIFY `SkillID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SkillID2`, + MODIFY `SkillID4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SkillID3`, + MODIFY `MinSkill1` smallint(6) NOT NULL DEFAULT '0' AFTER `SkillID4`, + MODIFY `MinSkill2` smallint(6) NOT NULL DEFAULT '0' AFTER `MinSkill1`, + MODIFY `MinSkill3` smallint(6) NOT NULL DEFAULT '0' AFTER `MinSkill2`, + MODIFY `MinSkill4` smallint(6) NOT NULL DEFAULT '0' AFTER `MinSkill3`, + MODIFY `MaxSkill1` smallint(6) NOT NULL DEFAULT '0' AFTER `MinSkill4`, + MODIFY `MaxSkill2` smallint(6) NOT NULL DEFAULT '0' AFTER `MaxSkill1`, + MODIFY `MaxSkill3` smallint(6) NOT NULL DEFAULT '0' AFTER `MaxSkill2`, + MODIFY `MaxSkill4` smallint(6) NOT NULL DEFAULT '0' AFTER `MaxSkill3`, + MODIFY `MinFactionID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MaxSkill4`, + MODIFY `MinFactionID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinFactionID1`, + MODIFY `MinFactionID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinFactionID2`, + MODIFY `MaxFactionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinFactionID3`, + MODIFY `PrevQuestID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MaxFactionID`, + MODIFY `PrevQuestID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PrevQuestID1`, + MODIFY `PrevQuestID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PrevQuestID2`, + MODIFY `PrevQuestID4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PrevQuestID3`, + MODIFY `CurrQuestID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PrevQuestID4`, + MODIFY `CurrQuestID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrQuestID1`, + MODIFY `CurrQuestID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrQuestID2`, + MODIFY `CurrQuestID4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrQuestID3`, + MODIFY `CurrentCompletedQuestID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrQuestID4`, + MODIFY `CurrentCompletedQuestID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID1`, + MODIFY `CurrentCompletedQuestID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID2`, + MODIFY `CurrentCompletedQuestID4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID3`, + MODIFY `Explored1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrentCompletedQuestID4`, + MODIFY `Explored2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Explored1`, + MODIFY `WorldStateExpressionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Explored2`, + MODIFY `Achievement1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `WorldStateExpressionID`, + MODIFY `Achievement2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Achievement1`, + MODIFY `Achievement3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Achievement2`, + MODIFY `Achievement4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Achievement3`, + MODIFY `AreaID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Achievement4`, + MODIFY `AreaID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID1`, + MODIFY `AreaID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID2`, + MODIFY `AreaID4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID3`, + MODIFY `QuestKillID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID4`, + MODIFY `PhaseID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `QuestKillID`, + MODIFY `MinAvgItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PhaseID`, + MODIFY `MaxAvgItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinAvgItemLevel`, + MODIFY `MinAvgEquippedItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MaxAvgItemLevel`, + MODIFY `MaxAvgEquippedItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinAvgEquippedItemLevel`, + ADD `ModifierTreeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MaxAvgEquippedItemLevel`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ModifierTreeID`, + MODIFY `Gender` tinyint(4) NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `NativeGender` tinyint(4) NOT NULL DEFAULT '0' AFTER `Gender`, + MODIFY `LanguageID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `NativeGender`, + MODIFY `MinLanguage` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LanguageID`, + MODIFY `MaxLanguage` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinLanguage`, + MODIFY `MinReputation1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxLanguage`, + MODIFY `MinReputation2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinReputation1`, + MODIFY `MinReputation3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinReputation2`, + MODIFY `MaxReputation` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinReputation3`, + MODIFY `Unknown1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxReputation`, + MODIFY `MinPVPRank` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Unknown1`, + MODIFY `MaxPVPRank` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinPVPRank`, + MODIFY `PvpMedal` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxPVPRank`, + MODIFY `ItemCount1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PvpMedal`, + MODIFY `ItemCount2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemCount1`, + MODIFY `ItemCount3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemCount2`, + MODIFY `ItemCount4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemCount3`, + MODIFY `ItemFlags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemCount4`, + ADD `AuraCount1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemFlags`, + ADD `AuraCount2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AuraCount1`, + ADD `AuraCount3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AuraCount2`, + ADD `AuraCount4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AuraCount3`, + MODIFY `WeatherID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `AuraCount4`, + MODIFY `PartyStatus` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `WeatherID`, + MODIFY `LifetimeMaxPVPRank` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PartyStatus`, + MODIFY `LfgLogic` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LifetimeMaxPVPRank`, + MODIFY `LfgStatus1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgLogic`, + MODIFY `LfgStatus2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgStatus1`, + MODIFY `LfgStatus3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgStatus2`, + MODIFY `LfgStatus4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgStatus3`, + MODIFY `LfgCompare1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgStatus4`, + MODIFY `LfgCompare2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgCompare1`, + MODIFY `LfgCompare3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgCompare2`, + MODIFY `LfgCompare4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgCompare3`, + MODIFY `LfgValue1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgCompare4`, + MODIFY `LfgValue2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgValue1`, + MODIFY `LfgValue3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgValue2`, + MODIFY `LfgValue4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgValue3`, + MODIFY `CurrencyLogic` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LfgValue4`, + MODIFY `CurrencyID1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyLogic`, + MODIFY `CurrencyID2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyID1`, + MODIFY `CurrencyID3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyID2`, + MODIFY `CurrencyID4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyID3`, + MODIFY `CurrencyCount1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyID4`, + MODIFY `CurrencyCount2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyCount1`, + MODIFY `CurrencyCount3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyCount2`, + MODIFY `CurrencyCount4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyCount3`, + MODIFY `MinExpansionLevel` tinyint(4) NOT NULL DEFAULT '0' AFTER `CurrencyCount4`, + MODIFY `MaxExpansionLevel` tinyint(4) NOT NULL DEFAULT '0' AFTER `MinExpansionLevel`, + MODIFY `MinExpansionTier` tinyint(4) NOT NULL DEFAULT '0' AFTER `MaxExpansionLevel`, + MODIFY `MaxExpansionTier` tinyint(4) NOT NULL DEFAULT '0' AFTER `MinExpansionTier`, + MODIFY `MinGuildLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxExpansionTier`, + MODIFY `MaxGuildLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinGuildLevel`, + MODIFY `PhaseUseFlags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxGuildLevel`, + MODIFY `PhaseGroupID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PhaseUseFlags`, + MODIFY `ChrSpecializationIndex` tinyint(4) NOT NULL DEFAULT '0' AFTER `PhaseGroupID`, + MODIFY `ChrSpecializationRole` tinyint(4) NOT NULL DEFAULT '0' AFTER `ChrSpecializationIndex`, + MODIFY `PowerType` tinyint(4) NOT NULL DEFAULT '0' AFTER `ChrSpecializationRole`, + MODIFY `PowerTypeComp` tinyint(4) NOT NULL DEFAULT '0' AFTER `PowerType`, + MODIFY `PowerTypeValue` tinyint(4) NOT NULL DEFAULT '0' AFTER `PowerTypeComp`; + +-- +-- Table structure for table `power_display` +-- +DROP TABLE IF EXISTS `power_display`; +CREATE TABLE `power_display` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `GlobalStringBaseTag` text, + `PowerType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Red` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Green` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Blue` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `quest_faction_reward` +-- +DROP TABLE IF EXISTS `quest_faction_reward`; +CREATE TABLE `quest_faction_reward` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `QuestRewFactionValue1` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue2` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue3` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue4` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue5` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue6` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue7` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue8` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue9` smallint(6) NOT NULL DEFAULT '0', + `QuestRewFactionValue10` smallint(6) NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `quest_money_reward` +-- +ALTER TABLE `quest_money_reward` DROP PRIMARY KEY; +ALTER TABLE `quest_money_reward` CHANGE `Level` `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST; +ALTER TABLE `quest_money_reward` ADD PRIMARY KEY (`ID`); + +-- +-- Table structure for table `quest_package_item` +-- +ALTER TABLE `quest_package_item` + MODIFY `ItemID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `QuestPackageID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemID`, + MODIFY `ItemCount` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `QuestPackageID`, + MODIFY `FilterType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemCount`; + +-- +-- Table structure for table `quest_v2` +-- +ALTER TABLE `quest_v2` MODIFY `UniqueBitFlag` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`; + +-- +-- Table structure for table `quest_x_p` +-- +ALTER TABLE `quest_xp` + MODIFY `Exp1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `Exp2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp1`, + MODIFY `Exp3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp2`, + MODIFY `Exp4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp3`, + MODIFY `Exp5` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp4`, + MODIFY `Exp6` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp5`, + MODIFY `Exp7` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp6`, + MODIFY `Exp8` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp7`, + MODIFY `Exp9` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp8`, + MODIFY `Exp10` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Exp9`; + +-- +-- Table structure for table `rand_prop_points` +-- +DROP TABLE IF EXISTS `rand_prop_points`; +CREATE TABLE `rand_prop_points` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `EpicPropertiesPoints1` smallint(5) unsigned NOT NULL DEFAULT '0', + `EpicPropertiesPoints2` smallint(5) unsigned NOT NULL DEFAULT '0', + `EpicPropertiesPoints3` smallint(5) unsigned NOT NULL DEFAULT '0', + `EpicPropertiesPoints4` smallint(5) unsigned NOT NULL DEFAULT '0', + `EpicPropertiesPoints5` smallint(5) unsigned NOT NULL DEFAULT '0', + `RarePropertiesPoints1` smallint(5) unsigned NOT NULL DEFAULT '0', + `RarePropertiesPoints2` smallint(5) unsigned NOT NULL DEFAULT '0', + `RarePropertiesPoints3` smallint(5) unsigned NOT NULL DEFAULT '0', + `RarePropertiesPoints4` smallint(5) unsigned NOT NULL DEFAULT '0', + `RarePropertiesPoints5` smallint(5) unsigned NOT NULL DEFAULT '0', + `UncommonPropertiesPoints1` smallint(5) unsigned NOT NULL DEFAULT '0', + `UncommonPropertiesPoints2` smallint(5) unsigned NOT NULL DEFAULT '0', + `UncommonPropertiesPoints3` smallint(5) unsigned NOT NULL DEFAULT '0', + `UncommonPropertiesPoints4` smallint(5) unsigned NOT NULL DEFAULT '0', + `UncommonPropertiesPoints5` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `scaling_stat_distribution` +-- +ALTER TABLE `scaling_stat_distribution` + MODIFY `ItemLevelCurveID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `MinLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemLevelCurveID`, + MODIFY `MaxLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinLevel`; + +-- +-- Table structure for table `skill_line` +-- +DROP TABLE IF EXISTS `skill_line`; +CREATE TABLE `skill_line` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `DisplayName` text, + `Description` text, + `AlternateVerb` text, + `SpellIconID` smallint(5) unsigned NOT NULL DEFAULT '0', + `Flags` smallint(5) unsigned NOT NULL DEFAULT '0', + `CategoryID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CanLink` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ParentSkillLineID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `skill_line_locale` +-- + +DROP TABLE IF EXISTS `skill_line_locale`; +CREATE TABLE `skill_line_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `DisplayName_lang` text, + `Description_lang` text, + `AlternateVerb_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `skill_line_ability` +-- +DROP TABLE IF EXISTS `skill_line_ability`; +CREATE TABLE `skill_line_ability` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `RaceMask` int(10) unsigned NOT NULL DEFAULT '0', + `ClassMask` int(10) unsigned NOT NULL DEFAULT '0', + `SupercedesSpell` int(10) unsigned NOT NULL DEFAULT '0', + `SkillLine` smallint(5) unsigned NOT NULL DEFAULT '0', + `MinSkillLineRank` smallint(5) unsigned NOT NULL DEFAULT '0', + `TrivialSkillLineRankHigh` smallint(5) unsigned NOT NULL DEFAULT '0', + `TrivialSkillLineRankLow` smallint(5) unsigned NOT NULL DEFAULT '0', + `UniqueBit` smallint(5) unsigned NOT NULL DEFAULT '0', + `TradeSkillCategoryID` smallint(5) unsigned NOT NULL DEFAULT '0', + `AquireMethod` tinyint(3) unsigned NOT NULL DEFAULT '0', + `NumSkillUps` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `skill_race_class_info` +-- +DROP TABLE IF EXISTS `skill_race_class_info`; +CREATE TABLE `skill_race_class_info` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `RaceMask` int(11) NOT NULL DEFAULT '0', + `SkillID` smallint(5) unsigned NOT NULL DEFAULT '0', + `ClassMask` smallint(6) NOT NULL DEFAULT '0', + `Flags` smallint(5) unsigned NOT NULL DEFAULT '0', + `SkillTierID` smallint(5) unsigned NOT NULL DEFAULT '0', + `Availability` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `sound_kit` +-- +DROP TABLE IF EXISTS `sound_kit`; +CREATE TABLE `sound_kit` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SoundType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Name` text, + `VolumeFloat` float NOT NULL DEFAULT '0', + `MinDistance` float NOT NULL DEFAULT '0', + `DistanceCutoff` float NOT NULL DEFAULT '0', + `VolumeVariationPlus` float NOT NULL DEFAULT '0', + `VolumeVariationMinus` float NOT NULL DEFAULT '0', + `PitchVariationPlus` float NOT NULL DEFAULT '0', + `PitchVariationMinus` float NOT NULL DEFAULT '0', + `PitchAdjust` float NOT NULL DEFAULT '0', + `Flags` smallint(5) unsigned NOT NULL DEFAULT '0', + `SoundEntriesAdvancedID` smallint(5) unsigned NOT NULL DEFAULT '0', + `EAXDef` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DialogType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `BusOverwriteID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Unk700` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `sound_kit_locale` +-- +DROP TABLE IF EXISTS `sound_kit_locale`; +CREATE TABLE `sound_kit_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `specialization_spells` +-- +ALTER TABLE `specialization_spells` + MODIFY `SpellID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `OverridesSpellID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellID`, + MODIFY `Description` text AFTER `OverridesSpellID`, + MODIFY `SpecID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `OrderIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpecID`; + +-- +-- Table structure for table `spell` +-- +DROP TABLE IF EXISTS `spell`; +CREATE TABLE `spell` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `NameSubtext` text, + `Description` text, + `AuraDescription` text, + `MiscID` int(10) unsigned NOT NULL DEFAULT '0', + `DescriptionVariablesID` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_locale` +-- +DROP TABLE IF EXISTS `spell_locale`; +CREATE TABLE `spell_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `NameSubtext_lang` text, + `Description_lang` text, + `AuraDescription_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_aura_options` +-- +DROP TABLE IF EXISTS `spell_aura_options`; +CREATE TABLE `spell_aura_options` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `ProcCharges` int(10) unsigned NOT NULL DEFAULT '0', + `ProcTypeMask` int(10) unsigned NOT NULL DEFAULT '0', + `ProcCategoryRecovery` int(10) unsigned NOT NULL DEFAULT '0', + `CumulativeAura` smallint(5) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ProcChance` tinyint(3) unsigned NOT NULL DEFAULT '0', + `SpellProcsPerMinuteID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_aura_restrictions` +-- +DROP TABLE IF EXISTS `spell_aura_restrictions`; +CREATE TABLE `spell_aura_restrictions` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `CasterAuraSpell` int(10) unsigned NOT NULL DEFAULT '0', + `TargetAuraSpell` int(10) unsigned NOT NULL DEFAULT '0', + `ExcludeCasterAuraSpell` int(10) unsigned NOT NULL DEFAULT '0', + `ExcludeTargetAuraSpell` int(10) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `CasterAuraState` tinyint(3) unsigned NOT NULL DEFAULT '0', + `TargetAuraState` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ExcludeCasterAuraState` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ExcludeTargetAuraState` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_casting_requirements` +-- +DROP TABLE IF EXISTS `spell_casting_requirements`; +CREATE TABLE `spell_casting_requirements` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `MinFactionID` smallint(5) unsigned NOT NULL DEFAULT '0', + `RequiredAreasID` smallint(5) unsigned NOT NULL DEFAULT '0', + `RequiresSpellFocus` smallint(5) unsigned NOT NULL DEFAULT '0', + `FacingCasterFlags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MinReputation` tinyint(3) unsigned NOT NULL DEFAULT '0', + `RequiredAuraVision` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_cast_times` +-- +ALTER TABLE `spell_cast_times` + MODIFY `MinCastTime` int(11) NOT NULL DEFAULT '0' AFTER `CastTime`, + MODIFY `CastTimePerLevel` smallint(6) NOT NULL DEFAULT '0' AFTER `MinCastTime`; + +-- +-- Table structure for table `spell_categories` +-- +DROP TABLE IF EXISTS `spell_categories`; +CREATE TABLE `spell_categories` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `Category` smallint(5) unsigned NOT NULL DEFAULT '0', + `StartRecoveryCategory` smallint(5) unsigned NOT NULL DEFAULT '0', + `ChargeCategory` smallint(5) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DefenseType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `DispelType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Mechanic` tinyint(3) unsigned NOT NULL DEFAULT '0', + `PreventionType` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_category` +-- +DROP TABLE IF EXISTS `spell_category`; +CREATE TABLE `spell_category` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `ChargeRecoveryTime` int(11) NOT NULL DEFAULT '0', + `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `UsesPerWeek` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MaxCharges` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_category_locale` +-- +DROP TABLE IF EXISTS `spell_category_locale`; +CREATE TABLE `spell_category_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_class_options` +-- +DROP TABLE IF EXISTS `spell_class_options`; +CREATE TABLE `spell_class_options` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellClassMask1` int(10) unsigned NOT NULL DEFAULT '0', + `SpellClassMask2` int(10) unsigned NOT NULL DEFAULT '0', + `SpellClassMask3` int(10) unsigned NOT NULL DEFAULT '0', + `SpellClassMask4` int(10) unsigned NOT NULL DEFAULT '0', + `ModalNextSpell` smallint(5) unsigned NOT NULL DEFAULT '0', + `SpellClassSet` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_cooldowns` +-- +DROP TABLE IF EXISTS `spell_cooldowns`; +CREATE TABLE `spell_cooldowns` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `CategoryRecoveryTime` int(10) unsigned NOT NULL DEFAULT '0', + `RecoveryTime` int(10) unsigned NOT NULL DEFAULT '0', + `StartRecoveryTime` int(10) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_duration` +-- +ALTER TABLE `spell_duration` + CHANGE `Duration1` `Duration` int(11) NOT NULL DEFAULT '0' AFTER `ID`, + CHANGE `Duration3` `MaxDuration` int(11) NOT NULL DEFAULT '0' AFTER `Duration`, + CHANGE `Duration2` `DurationPerLevel` smallint(6) NOT NULL DEFAULT '0' AFTER `MaxDuration`; + +-- +-- Table structure for table `spell_effect` +-- +DROP TABLE IF EXISTS `spell_effect`; +CREATE TABLE `spell_effect` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `EffectAmplitude` float NOT NULL DEFAULT '0', + `EffectAuraPeriod` int(10) unsigned NOT NULL DEFAULT '0', + `EffectBasePoints` int(10) unsigned NOT NULL DEFAULT '0', + `EffectBonusCoefficient` float NOT NULL DEFAULT '0', + `EffectChainAmplitude` float NOT NULL DEFAULT '0', + `EffectDieSides` int(10) unsigned NOT NULL DEFAULT '0', + `EffectItemType` int(10) unsigned NOT NULL DEFAULT '0', + `EffectMiscValue` int(11) NOT NULL DEFAULT '0', + `EffectMiscValueB` int(11) NOT NULL DEFAULT '0', + `EffectPointsPerResource` float NOT NULL DEFAULT '0', + `EffectRealPointsPerLevel` float NOT NULL DEFAULT '0', + `EffectSpellClassMask1` int(10) unsigned NOT NULL DEFAULT '0', + `EffectSpellClassMask2` int(10) unsigned NOT NULL DEFAULT '0', + `EffectSpellClassMask3` int(10) unsigned NOT NULL DEFAULT '0', + `EffectSpellClassMask4` int(10) unsigned NOT NULL DEFAULT '0', + `EffectTriggerSpell` int(10) unsigned NOT NULL DEFAULT '0', + `EffectPosFacing` float NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `EffectAttributes` int(10) unsigned NOT NULL DEFAULT '0', + `BonusCoefficientFromAP` float NOT NULL DEFAULT '0', + `EffectAura` smallint(5) unsigned NOT NULL DEFAULT '0', + `EffectChainTargets` smallint(5) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `Effect` tinyint(3) unsigned NOT NULL DEFAULT '0', + `EffectMechanic` tinyint(3) unsigned NOT NULL DEFAULT '0', + `EffectRadiusIndex` tinyint(3) unsigned NOT NULL DEFAULT '0', + `EffectRadiusMaxIndex` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ImplicitTarget1` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ImplicitTarget2` tinyint(3) unsigned NOT NULL DEFAULT '0', + `EffectIndex` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_effect_scaling` +-- +DROP TABLE IF EXISTS `spell_effect_scaling`; +CREATE TABLE `spell_effect_scaling` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Coefficient` float NOT NULL DEFAULT '0', + `Variance` float NOT NULL DEFAULT '0', + `ResourceCoefficient` float NOT NULL DEFAULT '0', + `SpellEffectID` int(10) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_equipped_items` +-- +DROP TABLE IF EXISTS `spell_equipped_items`; +CREATE TABLE `spell_equipped_items` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `EquippedItemInventoryTypeMask` int(11) NOT NULL DEFAULT '0', + `EquippedItemSubClassMask` int(11) NOT NULL DEFAULT '0', + `EquippedItemClass` tinyint(4) NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_focus_object` +-- +DROP TABLE IF EXISTS `spell_focus_object`; +CREATE TABLE `spell_focus_object` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_focus_object_locale` +-- +DROP TABLE IF EXISTS `spell_focus_object_locale`; +CREATE TABLE `spell_focus_object_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_interrupts` +-- +DROP TABLE IF EXISTS `spell_interrupts`; +CREATE TABLE `spell_interrupts` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `AuraInterruptFlags1` int(10) unsigned NOT NULL DEFAULT '0', + `AuraInterruptFlags2` int(10) unsigned NOT NULL DEFAULT '0', + `ChannelInterruptFlags1` int(10) unsigned NOT NULL DEFAULT '0', + `ChannelInterruptFlags2` int(10) unsigned NOT NULL DEFAULT '0', + `InterruptFlags` smallint(5) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_item_enchantment_condition` +-- +ALTER TABLE `spell_item_enchantment_condition` + MODIFY `LTOperand1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LTOperandType5`, + MODIFY `LTOperand2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LTOperand1`, + MODIFY `LTOperand3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LTOperand2`, + MODIFY `LTOperand4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LTOperand3`, + MODIFY `LTOperand5` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LTOperand4`, + MODIFY `RTOperand1` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperandType5`, + MODIFY `RTOperand2` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperand1`, + MODIFY `RTOperand3` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperand2`, + MODIFY `RTOperand4` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperand3`, + MODIFY `RTOperand5` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `RTOperand4`; + +-- +-- Table structure for table `spell_levels` +-- +DROP TABLE IF EXISTS `spell_levels`; +CREATE TABLE `spell_levels` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `BaseLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `MaxLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `SpellLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_misc` +-- +ALTER TABLE `spell_misc` + MODIFY `Speed` float NOT NULL DEFAULT '0' AFTER `AttributesExM`, + MODIFY `MultistrikeSpeedMod` float NOT NULL DEFAULT '0' AFTER `Speed`, + MODIFY `CastingTimeIndex` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MultistrikeSpeedMod`, + MODIFY `DurationIndex` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CastingTimeIndex`, + MODIFY `RangeIndex` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `DurationIndex`, + MODIFY `SpellIconID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `RangeIndex`, + MODIFY `ActiveIconID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SpellIconID`, + MODIFY `SchoolMask` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ActiveIconID`; + +-- +-- Table structure for table `spell_power` +-- +ALTER TABLE `spell_power` + MODIFY `ManaCost` int(10) unsigned NOT NULL DEFAULT '0' AFTER `SpellID`, + MODIFY `ManaCostPercentage` float NOT NULL DEFAULT '0' AFTER `ManaCost`, + MODIFY `ManaCostPercentagePerSecond` float NOT NULL DEFAULT '0' AFTER `ManaCostPercentage`, + MODIFY `RequiredAura` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ManaCostPercentagePerSecond`, + MODIFY `HealthCostPercentage` float NOT NULL DEFAULT '0' AFTER `RequiredAura`, + MODIFY `ManaCostPerSecond` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HealthCostPercentage`, + MODIFY `ManaCostAdditional` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ManaCostPerSecond`, + MODIFY `PowerDisplayID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ManaCostAdditional`, + MODIFY `UnitPowerBarID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PowerDisplayID`, + MODIFY `PowerIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `UnitPowerBarID`, + MODIFY `PowerType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PowerIndex`, + MODIFY `ManaCostPerLevel` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PowerType`; + +-- +-- Table structure for table `spell_power_difficulty` +-- +ALTER TABLE `spell_power_difficulty` DROP PRIMARY KEY; +ALTER TABLE `spell_power_difficulty` ADD `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST, + MODIFY `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpellPowerID`, + MODIFY `PowerIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DifficultyID`; +ALTER TABLE `spell_power_difficulty` ADD PRIMARY KEY (`ID`); + +ALTER TABLE `spell_range` + MODIFY `DisplayName` text AFTER `MaxRangeFriend`, + MODIFY `DisplayNameShort` text AFTER `DisplayName`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DisplayNameShort`; + +-- +-- Table structure for table `spell_reagents` +-- +DROP TABLE IF EXISTS `spell_reagents`; +CREATE TABLE `spell_reagents` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `Reagent1` int(11) NOT NULL DEFAULT '0', + `Reagent2` int(11) NOT NULL DEFAULT '0', + `Reagent3` int(11) NOT NULL DEFAULT '0', + `Reagent4` int(11) NOT NULL DEFAULT '0', + `Reagent5` int(11) NOT NULL DEFAULT '0', + `Reagent6` int(11) NOT NULL DEFAULT '0', + `Reagent7` int(11) NOT NULL DEFAULT '0', + `Reagent8` int(11) NOT NULL DEFAULT '0', + `ReagentCount1` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReagentCount2` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReagentCount3` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReagentCount4` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReagentCount5` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReagentCount6` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReagentCount7` smallint(5) unsigned NOT NULL DEFAULT '0', + `ReagentCount8` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_scaling` +-- +DROP TABLE IF EXISTS `spell_scaling`; +CREATE TABLE `spell_scaling` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `ScalesFromItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `ScalingClass` tinyint(4) NOT NULL DEFAULT '0', + `MaxScalingLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_shapeshift` +-- +DROP TABLE IF EXISTS `spell_shapeshift`; +CREATE TABLE `spell_shapeshift` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `ShapeshiftExclude1` int(10) unsigned NOT NULL DEFAULT '0', + `ShapeshiftExclude2` int(10) unsigned NOT NULL DEFAULT '0', + `ShapeshiftMask1` int(10) unsigned NOT NULL DEFAULT '0', + `ShapeshiftMask2` int(10) unsigned NOT NULL DEFAULT '0', + `StanceBarOrder` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_shapeshift_form` +-- +DROP TABLE IF EXISTS `spell_shapeshift_form`; +CREATE TABLE `spell_shapeshift_form` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Name` text, + `WeaponDamageVariance` float NOT NULL DEFAULT '0', + `Flags` int(10) unsigned NOT NULL DEFAULT '0', + `AttackIconID` smallint(5) unsigned NOT NULL DEFAULT '0', + `CombatRoundTime` smallint(5) unsigned NOT NULL DEFAULT '0', + `CreatureDisplayID1` smallint(5) unsigned NOT NULL DEFAULT '0', + `CreatureDisplayID2` smallint(5) unsigned NOT NULL DEFAULT '0', + `CreatureDisplayID3` smallint(5) unsigned NOT NULL DEFAULT '0', + `CreatureDisplayID4` smallint(5) unsigned NOT NULL DEFAULT '0', + `PresetSpellID1` smallint(5) unsigned NOT NULL DEFAULT '0', + `PresetSpellID2` smallint(5) unsigned NOT NULL DEFAULT '0', + `PresetSpellID3` smallint(5) unsigned NOT NULL DEFAULT '0', + `PresetSpellID4` smallint(5) unsigned NOT NULL DEFAULT '0', + `PresetSpellID5` smallint(5) unsigned NOT NULL DEFAULT '0', + `PresetSpellID6` smallint(5) unsigned NOT NULL DEFAULT '0', + `PresetSpellID7` smallint(5) unsigned NOT NULL DEFAULT '0', + `PresetSpellID8` smallint(5) unsigned NOT NULL DEFAULT '0', + `CreatureType` tinyint(4) NOT NULL DEFAULT '0', + `MountTypeID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `BonusActionBar` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_shapeshift_form_locale` +-- +DROP TABLE IF EXISTS `spell_shapeshift_form_locale`; +CREATE TABLE `spell_shapeshift_form_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_target_restrictions` +-- +DROP TABLE IF EXISTS `spell_target_restrictions`; +CREATE TABLE `spell_target_restrictions` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `ConeAngle` float NOT NULL DEFAULT '0', + `Width` float NOT NULL DEFAULT '0', + `Targets` int(10) unsigned NOT NULL DEFAULT '0', + `MaxTargetLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `TargetCreatureType` smallint(5) unsigned NOT NULL DEFAULT '0', + `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `MaxAffectedTargets` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_totems` +-- +DROP TABLE IF EXISTS `spell_totems`; +CREATE TABLE `spell_totems` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `SpellID` int(10) unsigned NOT NULL DEFAULT '0', + `Totem1` int(10) unsigned NOT NULL DEFAULT '0', + `Totem2` int(10) unsigned NOT NULL DEFAULT '0', + `RequiredTotemCategoryID1` tinyint(3) unsigned NOT NULL DEFAULT '0', + `RequiredTotemCategoryID2` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `spell_x_spell_visual` +-- +ALTER TABLE `spell_x_spell_visual` + MODIFY `Unk620` float NOT NULL DEFAULT '0' AFTER `SpellID`, + MODIFY `SpellVisualID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Unk620`, + MODIFY `SpellVisualID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SpellVisualID1`, + MODIFY `PlayerConditionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SpellVisualID2`, + MODIFY `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PlayerConditionID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DifficultyID`; + +-- +-- Table structure for table `taxi_nodes` +-- +ALTER TABLE `taxi_nodes` + MODIFY `PosX` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `PosY` float NOT NULL DEFAULT '0' AFTER `PosX`, + MODIFY `PosZ` float NOT NULL DEFAULT '0' AFTER `PosY`, + MODIFY `Name` text AFTER `PosZ`, + MODIFY `MountCreatureID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `MountCreatureID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `MountCreatureID1`, + MODIFY `MapOffsetX` float NOT NULL DEFAULT '0' AFTER `MountCreatureID2`, + MODIFY `MapOffsetY` float NOT NULL DEFAULT '0' AFTER `MapOffsetX`, + MODIFY `MapID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapOffsetY`, + MODIFY `ConditionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `LearnableIndex` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ConditionID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `LearnableIndex`; + +-- +-- Table structure for table `taxi_path` +-- +ALTER TABLE `taxi_path` + MODIFY `From` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `To` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `From`, + MODIFY `Cost` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `To`; + +-- +-- Table structure for table `taxi_path_node` +-- +ALTER TABLE `taxi_path_node` + MODIFY `LocX` float NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `LocY` float NOT NULL DEFAULT '0' AFTER `LocX`, + MODIFY `LocZ` float NOT NULL DEFAULT '0' AFTER `LocY`, + MODIFY `Delay` int(10) unsigned NOT NULL DEFAULT '0' AFTER `LocZ`, + MODIFY `PathID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `Delay`, + MODIFY `MapID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PathID`, + MODIFY `ArrivalEventID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapID`, + MODIFY `DepartureEventID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ArrivalEventID`, + MODIFY `NodeIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DepartureEventID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `NodeIndex`; + +-- +-- Table structure for table `totem_category` +-- +ALTER TABLE `totem_category` + MODIFY `CategoryMask` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Name`, + MODIFY `CategoryType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CategoryMask`; + +-- +-- Table structure for table `toy` +-- +ALTER TABLE `toy` + MODIFY `Description` text AFTER `ItemID`, + MODIFY `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Description`, + MODIFY `CategoryFilter` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`; + +-- +-- Table structure for table `toy_locale` +-- +ALTER TABLE `toy_locale` MODIFY `Description_lang` text AFTER `locale`; + +-- +-- Table structure for table `transport_animation` +-- +ALTER TABLE `transport_animation` MODIFY `SequenceID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PosZ`; + +-- +-- Table structure for table `unit_power_bar` +-- +ALTER TABLE `unit_power_bar` + MODIFY `MaxPower` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`, + MODIFY `RegenerationPeace` float NOT NULL DEFAULT '0' AFTER `MaxPower`, + MODIFY `RegenerationCombat` float NOT NULL DEFAULT '0' AFTER `RegenerationPeace`, + MODIFY `FileDataID1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RegenerationCombat`, + MODIFY `FileDataID2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID1`, + MODIFY `FileDataID3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID2`, + MODIFY `FileDataID4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID3`, + MODIFY `FileDataID5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID4`, + MODIFY `FileDataID6` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID5`, + MODIFY `Color1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `FileDataID6`, + MODIFY `Color2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Color1`, + MODIFY `Color3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Color2`, + MODIFY `Color4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Color3`, + MODIFY `Color5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Color4`, + MODIFY `Color6` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Color5`, + MODIFY `Name` text AFTER `Color6`, + MODIFY `Cost` text AFTER `Name`, + MODIFY `OutOfError` text AFTER `Cost`, + MODIFY `ToolTip` text AFTER `OutOfError`, + MODIFY `StartInset` float NOT NULL DEFAULT '0' AFTER `ToolTip`, + MODIFY `EndInset` float NOT NULL DEFAULT '0' AFTER `StartInset`, + MODIFY `StartPower` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `EndInset`, + MODIFY `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `StartPower`, + MODIFY `MinPower` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Flags`, + MODIFY `CenterPower` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MinPower`, + MODIFY `BarType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CenterPower`; + +-- +-- Table structure for table `world_map_overlay` +-- +ALTER TABLE `world_map_overlay` + MODIFY `TextureName` text AFTER `ID`, + MODIFY `MapAreaID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `TextureName`, + MODIFY `AreaID1` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MapAreaID`, + MODIFY `AreaID2` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID1`, + MODIFY `AreaID3` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID2`, + MODIFY `AreaID4` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID3`, + MODIFY `TextureWidth` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AreaID4`, + MODIFY `TextureHeight` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `TextureWidth`, + MODIFY `OffsetX` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `TextureHeight`, + MODIFY `OffsetY` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `OffsetX`, + MODIFY `HitRectTop` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `OffsetY`, + MODIFY `HitRectLeft` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HitRectTop`, + MODIFY `HitRectBottom` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HitRectLeft`, + MODIFY `HitRectRight` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HitRectBottom`, + MODIFY `PlayerConditionID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HitRectRight`; + +-- +-- Table structure for table `world_map_transforms` +-- +DROP TABLE IF EXISTS `world_map_transforms`; +CREATE TABLE `world_map_transforms` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `RegionMinX` float NOT NULL DEFAULT '0', + `RegionMinY` float NOT NULL DEFAULT '0', + `RegionMinZ` float NOT NULL DEFAULT '0', + `RegionMaxX` float NOT NULL DEFAULT '0', + `RegionMaxY` float NOT NULL DEFAULT '0', + `RegionMaxZ` float NOT NULL DEFAULT '0', + `RegionOffsetX` float NOT NULL DEFAULT '0', + `RegionOffsetY` float NOT NULL DEFAULT '0', + `RegionScale` float NOT NULL DEFAULT '0', + `MapID` smallint(5) unsigned NOT NULL DEFAULT '0', + `NewMapID` smallint(5) unsigned NOT NULL DEFAULT '0', + `NewDungeonMapID` smallint(5) unsigned NOT NULL DEFAULT '0', + `NewAreaID` smallint(5) unsigned NOT NULL DEFAULT '0', + `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +DROP TABLE `creature_display_info_locale`; +DROP TABLE `holidays_locale`; +DROP TABLE `sound_entries`; +DROP TABLE `sound_entries_locale`; +DROP TABLE `spell_rune_cost`; +DROP TABLE `world_map_overlay_locale`; diff --git a/src/common/Define.h b/src/common/Define.h index 35a4dad3e1b..c9eb42791e9 100644 --- a/src/common/Define.h +++ b/src/common/Define.h @@ -167,6 +167,7 @@ enum DBCFormer FT_INT = 'i', //uint32 FT_BYTE = 'b', //uint8 FT_LONG = 'l', //uint64 + FT_SHORT = 'h', //uint16 FT_SORT = 'd', //sorted by this field, field is not included FT_IND = 'n', //the same, but parsed to data FT_SQL_PRESENT = 'p', //Used in sql format to mark column present in sql dbc diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 6450946aaa4..6399b588b5d 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -22,7 +22,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() if (!m_reconnecting) m_stmts.resize(MAX_CHARACTERDATABASE_STATEMENTS); -#define SelectItemInstanceContent "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, ii.transmogrification, ii.upgradeId, ii.enchantIllusion, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.bonusListIDs" +#define SelectItemInstanceContent "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, ii.transmogrification, ii.upgradeId, ii.enchantIllusion, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.bonusListIDs, ig.gemItemId1, ig.gemItemId2, ig.gemItemId3" PrepareStatement(CHAR_DEL_QUEST_POOL_SAVE, "DELETE FROM pool_quest_save WHERE pool_id = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_QUEST_POOL_SAVE, "INSERT INTO pool_quest_save (pool_id, quest_id) VALUES (?, ?)", CONNECTION_ASYNC); @@ -108,7 +108,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_RESET_CHARACTER_QUESTSTATUS_SEASONAL_BY_EVENT, "DELETE FROM character_queststatus_seasonal WHERE event = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_REPUTATION, "SELECT faction, standing, flags FROM character_reputation WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_INVENTORY, "SELECT " SelectItemInstanceContent ", bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHARACTER_INVENTORY, "SELECT " SelectItemInstanceContent ", bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid WHERE ci.guid = ? ORDER BY bag, slot", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_ACTIONS, "SELECT a.button, a.action, a.type FROM character_action as a, characters as c WHERE a.guid = c.guid AND a.spec = c.activeTalentGroup AND a.guid = ? ORDER BY button", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_MAILCOUNT, "SELECT COUNT(id) FROM mail WHERE receiver = ? AND (checked & 1) = 0 AND deliver_time <= ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_MAILDATE, "SELECT MIN(deliver_time) FROM mail WHERE receiver = ? AND (checked & 1) = 0", CONNECTION_ASYNC); @@ -136,8 +136,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_ACCOUNT_INSTANCELOCKTIMES, "SELECT instanceId, releaseTime FROM account_instance_times WHERE accountId = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_ACTIONS_SPEC, "SELECT button, action, type FROM character_action WHERE guid = ? AND spec = ? ORDER BY button", CONNECTION_SYNCH); - PrepareStatement(CHAR_SEL_MAILITEMS, "SELECT " SelectItemInstanceContent ", ii.owner_guid FROM mail_items mi JOIN item_instance ii ON mi.item_guid = ii.guid WHERE mail_id = ?", CONNECTION_SYNCH); - PrepareStatement(CHAR_SEL_AUCTION_ITEMS, "SELECT " SelectItemInstanceContent " FROM auctionhouse ah JOIN item_instance ii ON ah.itemguid = ii.guid", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_MAILITEMS, "SELECT " SelectItemInstanceContent ", ii.owner_guid FROM mail_items mi JOIN item_instance ii ON mi.item_guid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid WHERE mail_id = ?", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_AUCTION_ITEMS, "SELECT " SelectItemInstanceContent " FROM auctionhouse ah JOIN item_instance ii ON ah.itemguid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_AUCTIONS, "SELECT id, auctioneerguid, itemguid, itemEntry, count, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid", CONNECTION_SYNCH); PrepareStatement(CHAR_INS_AUCTION, "INSERT INTO auctionhouse (id, auctioneerguid, itemguid, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_AUCTION, "DELETE FROM auctionhouse WHERE id = ?", CONNECTION_ASYNC); @@ -164,6 +164,9 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER, "DELETE FROM item_instance WHERE owner_guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_ITEM_INSTANCE_GEMS, "INSERT INTO item_instance_gems (itemGuid, gemItemId1, gemItemId2, gemItemId3) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_ITEM_INSTANCE_GEMS, "DELETE FROM item_instance_gems WHERE itemGuid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_ITEM_INSTANCE_GEMS_BY_OWNER, "DELETE iig FROM item_instance_gems iig LEFT JOIN item_instance ii ON iig.itemGuid = ii.guid WHERE ii.owner_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_GIFT_OWNER, "UPDATE character_gifts SET guid = ? WHERE item_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GIFT, "DELETE FROM character_gifts WHERE item_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_GIFT_BY_ITEM, "SELECT entry, flags FROM character_gifts WHERE item_guid = ?", CONNECTION_SYNCH); @@ -195,7 +198,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() // 0: uint32, 1: uint8, 2: uint8, 3: uint32, 4: uint32 PrepareStatement(CHAR_INS_GUILD_BANK_ITEM, "INSERT INTO guild_bank_item (guildid, TabId, SlotId, item_guid) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GUILD_BANK_ITEM, "DELETE FROM guild_bank_item WHERE guildid = ? AND TabId = ? AND SlotId = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8, 2: uint8 - PrepareStatement(CHAR_SEL_GUILD_BANK_ITEMS, "SELECT " SelectItemInstanceContent ", guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_GUILD_BANK_ITEMS, "SELECT " SelectItemInstanceContent ", guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid", CONNECTION_SYNCH); PrepareStatement(CHAR_DEL_GUILD_BANK_ITEMS, "DELETE FROM guild_bank_item WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32 // 0: uint32, 1: uint8, 2: uint8, 3: uint8, 4: uint32 PrepareStatement(CHAR_INS_GUILD_BANK_RIGHT, "INSERT INTO guild_bank_right (guildid, TabId, rid, gbright, SlotPerDay) VALUES (?, ?, ?, ?, ?) " diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index 18faea4c5b0..e35bedfd587 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -144,6 +144,9 @@ enum CharacterDatabaseStatements CHAR_UPD_ITEM_INSTANCE_ON_LOAD, CHAR_DEL_ITEM_INSTANCE, CHAR_DEL_ITEM_INSTANCE_BY_OWNER, + CHAR_INS_ITEM_INSTANCE_GEMS, + CHAR_DEL_ITEM_INSTANCE_GEMS, + CHAR_DEL_ITEM_INSTANCE_GEMS_BY_OWNER, CHAR_UPD_GIFT_OWNER, CHAR_DEL_GIFT, CHAR_SEL_CHARACTER_GIFT_BY_ITEM, diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index 6749300000b..666b697a4c3 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -31,120 +31,158 @@ void HotfixDatabaseConnection::DoPrepareStatements() m_stmts.resize(MAX_HOTFIXDATABASE_STATEMENTS); // Achievement.db2 - PrepareStatement(HOTFIX_SEL_ACHIEVEMENT, "SELECT ID, Faction, MapID, Supercedes, Title, Description, Category, Points, UIOrder, Flags, IconID, " - "Reward, MinimumCriteria, SharesCriteria, CriteriaTree FROM achievement ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ACHIEVEMENT, "SELECT ID, Title, Description, Flags, Reward, MapID, Supercedes, Category, UIOrder, IconID, " + "SharesCriteria, CriteriaTree, Faction, Points, MinimumCriteria FROM achievement ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ACHIEVEMENT, "SELECT ID, Title_lang, Description_lang, Reward_lang FROM achievement_locale WHERE locale = ?", CONNECTION_SYNCH); + // AnimKit.db2 + PrepareStatement(HOTFIX_SEL_ANIM_KIT, "SELECT ID, OneShotDuration, OneShotStopAnimKitID, LowDefAnimKitID FROM anim_kit ORDER BY ID DESC", CONNECTION_SYNCH); + // AreaGroupMember.db2 PrepareStatement(HOTFIX_SEL_AREA_GROUP_MEMBER, "SELECT ID, AreaGroupID, AreaID FROM area_group_member ORDER BY ID DESC", CONNECTION_SYNCH); + // ArmorLocation.db2 + PrepareStatement(HOTFIX_SEL_ARMOR_LOCATION, "SELECT ID, Modifier1, Modifier2, Modifier3, Modifier4, Modifier5 FROM armor_location ORDER BY ID DESC", CONNECTION_SYNCH); + // AuctionHouse.db2 - PrepareStatement(HOTFIX_SEL_AUCTION_HOUSE, "SELECT ID, FactionID, DepositRate, ConsignmentRate, Name FROM auction_house ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_AUCTION_HOUSE, "SELECT ID, Name, FactionID, DepositRate, ConsignmentRate FROM auction_house ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_AUCTION_HOUSE, "SELECT ID, Name_lang FROM auction_house_locale WHERE locale = ?", CONNECTION_SYNCH); + // BankBagSlotPrices.db2 + PrepareStatement(HOTFIX_SEL_BANK_BAG_SLOT_PRICES, "SELECT ID, Cost FROM bank_bag_slot_prices ORDER BY ID DESC", CONNECTION_SYNCH); + // BarberShopStyle.db2 - PrepareStatement(HOTFIX_SEL_BARBER_SHOP_STYLE, "SELECT ID, Type, DisplayName, Description, CostModifier, Race, Sex, Data FROM barber_shop_style" + PrepareStatement(HOTFIX_SEL_BARBER_SHOP_STYLE, "SELECT ID, DisplayName, Description, CostModifier, Type, Race, Sex, Data FROM barber_shop_style" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_BARBER_SHOP_STYLE, "SELECT ID, DisplayName_lang, Description_lang FROM barber_shop_style_locale WHERE locale = ?", CONNECTION_SYNCH); // BattlePetBreedQuality.db2 - PrepareStatement(HOTFIX_SEL_BATTLE_PET_BREED_QUALITY, "SELECT ID, Quality, Modifier FROM battle_pet_breed_quality ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_BATTLE_PET_BREED_QUALITY, "SELECT ID, Modifier, Quality FROM battle_pet_breed_quality ORDER BY ID DESC", CONNECTION_SYNCH); // BattlePetBreedState.db2 - PrepareStatement(HOTFIX_SEL_BATTLE_PET_BREED_STATE, "SELECT ID, BreedID, State, Value FROM battle_pet_breed_state ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_BATTLE_PET_BREED_STATE, "SELECT ID, Value, BreedID, State FROM battle_pet_breed_state ORDER BY ID DESC", CONNECTION_SYNCH); // BattlePetSpecies.db2 - PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT ID, CreatureID, IconFileID, SummonSpellID, PetType, Source, Flags, SourceText, " - "Description FROM battle_pet_species ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT ID, CreatureID, IconFileID, SummonSpellID, SourceText, Description, Flags, PetType, " + "Source FROM battle_pet_species ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT ID, SourceText_lang, Description_lang FROM battle_pet_species_locale WHERE locale = ?", CONNECTION_SYNCH); // BattlePetSpeciesState.db2 - PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES_STATE, "SELECT ID, SpeciesID, State, Value FROM battle_pet_species_state ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES_STATE, "SELECT ID, Value, SpeciesID, State FROM battle_pet_species_state ORDER BY ID DESC", CONNECTION_SYNCH); // BroadcastText.db2 - PrepareStatement(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, Language, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, " - "EmoteDelay3, SoundID, UnkEmoteID, Type FROM broadcast_text ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, " + "EmoteDelay3, SoundID, UnkEmoteID, Language, Type FROM broadcast_text ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, MaleText_lang, FemaleText_lang FROM broadcast_text_locale WHERE locale = ?", CONNECTION_SYNCH); // CharStartOutfit.db2 - PrepareStatement(HOTFIX_SEL_CHAR_START_OUTFIT, "SELECT ID, RaceID, ClassID, GenderID, OutfitID, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, " - "ItemID6, ItemID7, ItemID8, ItemID9, ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, ItemID18, ItemID19, " - "ItemID20, ItemID21, ItemID22, ItemID23, ItemID24, PetDisplayID, PetFamilyID FROM char_start_outfit ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CHAR_START_OUTFIT, "SELECT ID, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, " + "ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, ItemID18, ItemID19, ItemID20, ItemID21, ItemID22, ItemID23, " + "ItemID24, PetDisplayID, RaceID, ClassID, GenderID, OutfitID, PetFamilyID FROM char_start_outfit ORDER BY ID DESC", CONNECTION_SYNCH); // ChrClassesXPowerTypes.db2 PrepareStatement(HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES, "SELECT ID, ClassID, PowerType FROM chr_classes_x_power_types ORDER BY ID DESC", CONNECTION_SYNCH); + // ChrRaces.db2 + PrepareStatement(HOTFIX_SEL_CHR_RACES, "SELECT ID, Flags, ClientPrefix, ClientFileString, Name, NameFemale, NameMale, FacialHairCustomization1, " + "FacialHairCustomization2, HairCustomization, CreateScreenFileDataID, SelectScreenFileDataID, MaleCustomizeOffset1, MaleCustomizeOffset2, " + "MaleCustomizeOffset3, FemaleCustomizeOffset1, FemaleCustomizeOffset2, FemaleCustomizeOffset3, LowResScreenFileDataID, FactionID, " + "ExplorationSoundID, MaleDisplayID, FemaleDisplayID, ResSicknessSpellID, SplashSoundID, CinematicSequenceID, UAMaleCreatureSoundDataID, " + "UAFemaleCreatureSoundDataID, HighResMaleDisplayID, HighResFemaleDisplayID, Unk, BaseLanguage, CreatureType, TeamID, RaceRelated, " + "UnalteredVisualRaceID, CharComponentTextureLayoutID, DefaultClassID, NeutralRaceID, CharComponentTexLayoutHiResID FROM chr_races" + " ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_RACES, "SELECT ID, Name_lang, NameFemale_lang, NameMale_lang FROM chr_races_locale WHERE locale = ?", CONNECTION_SYNCH); + // CinematicSequences.db2 PrepareStatement(HOTFIX_SEL_CINEMATIC_SEQUENCES, "SELECT ID, SoundID, Camera1, Camera2, Camera3, Camera4, Camera5, Camera6, Camera7, Camera8" " FROM cinematic_sequences ORDER BY ID DESC", CONNECTION_SYNCH); // CreatureDisplayInfo.db2 - PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO, "SELECT ID, ModelID, SoundID, ExtendedDisplayInfoID, CreatureModelScale, PlayerModelScale, " - "CreatureModelAlpha, TextureVariation1, TextureVariation2, TextureVariation3, PortraitTextureName, PortraitCreatureDisplayInfoID, SizeClass, " - "BloodID, NPCSoundID, ParticleColorID, CreatureGeosetData, ObjectEffectPackageID, AnimReplacementSetID, Flags, Gender, StateSpellVisualKitID" - " FROM creature_display_info ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_DISPLAY_INFO, "SELECT ID, TextureVariation1_lang, TextureVariation2_lang, TextureVariation3_lang, " - "PortraitTextureName_lang FROM creature_display_info_locale WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO, "SELECT ID, ExtendedDisplayInfoID, CreatureModelScale, PlayerModelScale, TextureVariation1, " + "TextureVariation2, TextureVariation3, PortraitTextureName, PortraitCreatureDisplayInfoID, CreatureGeosetData, StateSpellVisualKitID, " + "ModelID, SoundID, NPCSoundID, ParticleColorID, ObjectEffectPackageID, AnimReplacementSetID, CreatureModelAlpha, SizeClass, BloodID, Flags, " + "Gender, Unk700 FROM creature_display_info ORDER BY ID DESC", CONNECTION_SYNCH); + + // CreatureDisplayInfoExtra.db2 + PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, NPCItemDisplay1, NPCItemDisplay2, NPCItemDisplay3, NPCItemDisplay4, " + "NPCItemDisplay5, NPCItemDisplay6, NPCItemDisplay7, NPCItemDisplay8, NPCItemDisplay9, NPCItemDisplay10, FileDataID, HDFileDataID, " + "DisplayRaceID, DisplaySexID, DisplayClassID, SkinID, FaceID, HairStyleID, HairColorID, FacialHairID, CustomDisplayOption1, " + "CustomDisplayOption2, CustomDisplayOption3, Flags FROM creature_display_info_extra ORDER BY ID DESC", CONNECTION_SYNCH); // CreatureType.db2 PrepareStatement(HOTFIX_SEL_CREATURE_TYPE, "SELECT ID, Name, Flags FROM creature_type ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_TYPE, "SELECT ID, Name_lang FROM creature_type_locale WHERE locale = ?", CONNECTION_SYNCH); // Criteria.db2 - PrepareStatement(HOTFIX_SEL_CRITERIA, "SELECT ID, Type, Asset, StartEvent, StartAsset, StartTimer, FailEvent, FailAsset, ModifierTreeId, Flags, " - "EligibilityWorldStateID, EligibilityWorldStateValue FROM criteria ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CRITERIA, "SELECT ID, Asset, StartAsset, FailAsset, StartTimer, ModifierTreeId, EligibilityWorldStateID, Type, " + "StartEvent, FailEvent, Flags, EligibilityWorldStateValue FROM criteria ORDER BY ID DESC", CONNECTION_SYNCH); // CriteriaTree.db2 - PrepareStatement(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, CriteriaID, Amount, Operator, Parent, Flags, Description, OrderIndex FROM criteria_tree" + PrepareStatement(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, Amount, Description, CriteriaID, Parent, Flags, OrderIndex, Operator FROM criteria_tree" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, Description_lang FROM criteria_tree_locale WHERE locale = ?", CONNECTION_SYNCH); // CurrencyTypes.db2 - PrepareStatement(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, CategoryID, Name, InventoryIcon1, InventoryIcon2, SpellWeight, SpellCategory, MaxQty, " - "MaxEarnablePerWeek, Flags, Quality, Description FROM currency_types ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, Name_lang, InventoryIcon1_lang, InventoryIcon2_lang, Description_lang" - " FROM currency_types_locale WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, Name, InventoryIcon1, InventoryIcon2, MaxQty, MaxEarnablePerWeek, Flags, Description, " + "CategoryID, SpellWeight, SpellCategory, Quality FROM currency_types ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, Name_lang, Description_lang FROM currency_types_locale WHERE locale = ?", CONNECTION_SYNCH); // CurvePoint.db2 - PrepareStatement(HOTFIX_SEL_CURVE_POINT, "SELECT ID, CurveID, `Index`, X, Y FROM curve_point ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CURVE_POINT, "SELECT ID, X, Y, CurveID, `Index` FROM curve_point ORDER BY ID DESC", CONNECTION_SYNCH); // DestructibleModelData.db2 - PrepareStatement(HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA, "SELECT ID, StateDamagedDisplayID, StateDamagedImpactEffectDoodadSet, " - "StateDamagedAmbientDoodadSet, StateDamagedNameSet, StateDestroyedDisplayID, StateDestroyedDestructionDoodadSet, " - "StateDestroyedImpactEffectDoodadSet, StateDestroyedAmbientDoodadSet, StateDestroyedNameSet, StateRebuildingDisplayID, " + PrepareStatement(HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA, "SELECT ID, StateDamagedDisplayID, StateDestroyedDisplayID, StateRebuildingDisplayID, " + "StateSmokeDisplayID, HealEffectSpeed, StateDamagedImpactEffectDoodadSet, StateDamagedAmbientDoodadSet, StateDamagedNameSet, " + "StateDestroyedDestructionDoodadSet, StateDestroyedImpactEffectDoodadSet, StateDestroyedAmbientDoodadSet, StateDestroyedNameSet, " "StateRebuildingDestructionDoodadSet, StateRebuildingImpactEffectDoodadSet, StateRebuildingAmbientDoodadSet, StateRebuildingNameSet, " - "StateSmokeDisplayID, StateSmokeInitDoodadSet, StateSmokeAmbientDoodadSet, StateSmokeNameSet, EjectDirection, RepairGroundFx, DoNotHighlight, " - "HealEffect, HealEffectSpeed FROM destructible_model_data ORDER BY ID DESC", CONNECTION_SYNCH); + "StateSmokeInitDoodadSet, StateSmokeAmbientDoodadSet, StateSmokeNameSet, EjectDirection, DoNotHighlight, HealEffect" + " FROM destructible_model_data ORDER BY ID DESC", CONNECTION_SYNCH); + + // DurabilityCosts.db2 + PrepareStatement(HOTFIX_SEL_DURABILITY_COSTS, "SELECT ID, WeaponSubClassCost1, WeaponSubClassCost2, WeaponSubClassCost3, WeaponSubClassCost4, " + "WeaponSubClassCost5, WeaponSubClassCost6, WeaponSubClassCost7, WeaponSubClassCost8, WeaponSubClassCost9, WeaponSubClassCost10, " + "WeaponSubClassCost11, WeaponSubClassCost12, WeaponSubClassCost13, WeaponSubClassCost14, WeaponSubClassCost15, WeaponSubClassCost16, " + "WeaponSubClassCost17, WeaponSubClassCost18, WeaponSubClassCost19, WeaponSubClassCost20, WeaponSubClassCost21, ArmorSubClassCost1, " + "ArmorSubClassCost2, ArmorSubClassCost3, ArmorSubClassCost4, ArmorSubClassCost5, ArmorSubClassCost6, ArmorSubClassCost7, ArmorSubClassCost8" + " FROM durability_costs ORDER BY ID DESC", CONNECTION_SYNCH); // DurabilityQuality.db2 PrepareStatement(HOTFIX_SEL_DURABILITY_QUALITY, "SELECT ID, QualityMod FROM durability_quality ORDER BY ID DESC", CONNECTION_SYNCH); + // EmotesTextSound.db2 + PrepareStatement(HOTFIX_SEL_EMOTES_TEXT_SOUND, "SELECT ID, EmotesTextId, SoundId, RaceId, SexId, ClassId FROM emotes_text_sound ORDER BY ID DESC", CONNECTION_SYNCH); + // Gameobjects.db2 - PrepareStatement(HOTFIX_SEL_GAMEOBJECTS, "SELECT ID, MapID, DisplayID, PositionX, PositionY, PositionZ, RotationX, RotationY, RotationZ, " - "RotationW, Size, PhaseUseFlags, PhaseID, PhaseGroupID, Type, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Name FROM gameobjects" + PrepareStatement(HOTFIX_SEL_GAMEOBJECTS, "SELECT ID, PositionX, PositionY, PositionZ, RotationX, RotationY, RotationZ, RotationW, Size, Data1, " + "Data2, Data3, Data4, Data5, Data6, Data7, Data8, Name, MapID, DisplayID, PhaseID, PhaseGroupID, PhaseUseFlags, Type FROM gameobjects" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GAMEOBJECTS, "SELECT ID, Name_lang FROM gameobjects_locale WHERE locale = ?", CONNECTION_SYNCH); + // GameobjectDisplayInfo.db2 + PrepareStatement(HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO, "SELECT ID, FileDataID, GeoBoxMinX, GeoBoxMinY, GeoBoxMinZ, GeoBoxMaxX, GeoBoxMaxY, " + "GeoBoxMaxZ, OverrideLootEffectScale, OverrideNameScale, Sound1, Sound2, Sound3, Sound4, Sound5, Sound6, Sound7, Sound8, Sound9, Sound10, " + "ObjectEffectPackageID FROM gameobject_display_info ORDER BY ID DESC", CONNECTION_SYNCH); + // GameTables.db2 PrepareStatement(HOTFIX_SEL_GAME_TABLES, "SELECT ID, Name, NumRows, NumColumns FROM game_tables ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GAME_TABLES, "SELECT ID, Name_lang FROM game_tables_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrAbility.db2 - PrepareStatement(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Flags, Name, Description, IconFileDataID, OtherFactionGarrAbilityID, GarrAbilityCategoryID, " + PrepareStatement(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Name, Description, IconFileDataID, OtherFactionGarrAbilityID, Flags, GarrAbilityCategoryID, " "FollowerTypeID FROM garr_ability ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Name_lang, Description_lang FROM garr_ability_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrBuilding.db2 - PrepareStatement(HOTFIX_SEL_GARR_BUILDING, "SELECT ID, HordeGameObjectID, AllianceGameObjectID, Unknown, Type, Level, NameAlliance, NameHorde, " - "Description, Tooltip, BuildDuration, CostCurrencyID, CostCurrencyAmount, HordeTexPrefixKitID, AllianceTexPrefixKitID, IconFileDataID, " - "BonusAmount, Flags, AllianceActivationScenePackageID, HordeActivationScenePackageID, MaxShipments, FollowerRequiredGarrAbilityID, " - "FollowerGarrAbilityEffectID, CostMoney FROM garr_building ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_BUILDING, "SELECT ID, HordeGameObjectID, AllianceGameObjectID, NameAlliance, NameHorde, Description, Tooltip, " + "IconFileDataID, BuildDuration, CostCurrencyID, CostCurrencyAmount, AllianceActivationScenePackageID, HordeActivationScenePackageID, " + "CostMoney, Unknown, Type, Level, HordeTexPrefixKitID, AllianceTexPrefixKitID, BonusAmount, Flags, MaxShipments, " + "FollowerRequiredGarrAbilityID, FollowerGarrAbilityEffectID, GarrTypeID FROM garr_building ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_BUILDING, "SELECT ID, NameAlliance_lang, NameHorde_lang, Description_lang, Tooltip_lang" " FROM garr_building_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrBuildingPlotInst.db2 - PrepareStatement(HOTFIX_SEL_GARR_BUILDING_PLOT_INST, "SELECT ID, GarrBuildingID, UiTextureAtlasMemberID, GarrSiteLevelPlotInstID, " - "LandmarkOffsetX, LandmarkOffsetY FROM garr_building_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_BUILDING_PLOT_INST, "SELECT ID, LandmarkOffsetX, LandmarkOffsetY, UiTextureAtlasMemberID, " + "GarrSiteLevelPlotInstID, GarrBuildingID FROM garr_building_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); // GarrClassSpec.db2 PrepareStatement(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, NameMale, NameFemale, NameGenderless, ClassAtlasID, GarrFollItemSetID" @@ -153,10 +191,11 @@ void HotfixDatabaseConnection::DoPrepareStatements() " WHERE locale = ?", CONNECTION_SYNCH); // GarrFollower.db2 - PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, FollowerTypeID, HordeCreatureID, AllianceCreatureID, HordeUiAnimRaceInfoID, " + PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, HordeCreatureID, AllianceCreatureID, HordeSourceText, AllianceSourceText, " + "HordePortraitIconID, AlliancePortraitIconID, ItemLevelWeapon, ItemLevelArmor, FollowerTypeID, HordeUiAnimRaceInfoID, " "AllianceUiAnimRaceInfoID, Quality, HordeGarrClassSpecID, AllianceGarrClassSpecID, HordeGarrFollItemSetID, AllianceGarrFollItemSetID, Level, " - "ItemLevelWeapon, ItemLevelArmor, Unknown1, Flags, HordeSourceText, AllianceSourceText, Unknown2, Unknown3, HordePortraitIconID, " - "AlliancePortraitIconID, HordeListPortraitTextureKitID, AllianceListPortraitTextureKitID FROM garr_follower ORDER BY ID DESC", CONNECTION_SYNCH); + "Unknown1, Flags, Unknown2, Unknown3, HordeListPortraitTextureKitID, AllianceListPortraitTextureKitID, GarrTypeID FROM garr_follower" + " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, HordeSourceText_lang, AllianceSourceText_lang FROM garr_follower_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrFollowerXAbility.db2 @@ -164,43 +203,51 @@ void HotfixDatabaseConnection::DoPrepareStatements() " ORDER BY ID DESC", CONNECTION_SYNCH); // GarrPlot.db2 - PrepareStatement(HOTFIX_SEL_GARR_PLOT, "SELECT ID, GarrPlotUICategoryID, PlotType, Flags, Name, MinCount, MaxCount, " - "AllianceConstructionGameObjectID, HordeConstructionGameObjectID FROM garr_plot ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_PLOT, "SELECT ID, Name, AllianceConstructionGameObjectID, HordeConstructionGameObjectID, GarrPlotUICategoryID, " + "PlotType, Flags, MinCount, MaxCount FROM garr_plot ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_PLOT, "SELECT ID, Name_lang FROM garr_plot_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrPlotBuilding.db2 PrepareStatement(HOTFIX_SEL_GARR_PLOT_BUILDING, "SELECT ID, GarrPlotID, GarrBuildingID FROM garr_plot_building ORDER BY ID DESC", CONNECTION_SYNCH); // GarrPlotInstance.db2 - PrepareStatement(HOTFIX_SEL_GARR_PLOT_INSTANCE, "SELECT ID, GarrPlotID, Name FROM garr_plot_instance ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_PLOT_INSTANCE, "SELECT ID, Name, GarrPlotID FROM garr_plot_instance ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_PLOT_INSTANCE, "SELECT ID, Name_lang FROM garr_plot_instance_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrSiteLevel.db2 - PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL, "SELECT ID, Level, MapID, SiteID, UITextureKitID, TownHallX, TownHallY, MovieID, Level2, " - "UpgradeResourceCost, UpgradeMoneyCost FROM garr_site_level ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL, "SELECT ID, TownHallX, TownHallY, MapID, UpgradeResourceCost, UpgradeMoneyCost, Level, SiteID, " + "UITextureKitID, MovieID, Level2 FROM garr_site_level ORDER BY ID DESC", CONNECTION_SYNCH); // GarrSiteLevelPlotInst.db2 - PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST, "SELECT ID, GarrSiteLevelID, GarrPlotInstanceID, LandmarkX, LandmarkY, Unknown" + PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST, "SELECT ID, LandmarkX, LandmarkY, GarrSiteLevelID, GarrPlotInstanceID, Unknown" " FROM garr_site_level_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); // GlyphSlot.db2 PrepareStatement(HOTFIX_SEL_GLYPH_SLOT, "SELECT ID, Type, Tooltip FROM glyph_slot ORDER BY ID DESC", CONNECTION_SYNCH); + // GuildColorBackground.db2 + PrepareStatement(HOTFIX_SEL_GUILD_COLOR_BACKGROUND, "SELECT ID, Red, Green, Blue FROM guild_color_background ORDER BY ID DESC", CONNECTION_SYNCH); + + // GuildColorBorder.db2 + PrepareStatement(HOTFIX_SEL_GUILD_COLOR_BORDER, "SELECT ID, Red, Green, Blue FROM guild_color_border ORDER BY ID DESC", CONNECTION_SYNCH); + + // GuildColorEmblem.db2 + PrepareStatement(HOTFIX_SEL_GUILD_COLOR_EMBLEM, "SELECT ID, Red, Green, Blue FROM guild_color_emblem ORDER BY ID DESC", CONNECTION_SYNCH); + // GuildPerkSpells.db2 - PrepareStatement(HOTFIX_SEL_GUILD_PERK_SPELLS, "SELECT ID, GuildLevel, SpellID FROM guild_perk_spells ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GUILD_PERK_SPELLS, "SELECT ID, SpellID, GuildLevel FROM guild_perk_spells ORDER BY ID DESC", CONNECTION_SYNCH); // Heirloom.db2 - PrepareStatement(HOTFIX_SEL_HEIRLOOM, "SELECT ID, ItemID, Flags, SourceText, Source, OldItem1, OldItem2, NextDifficultyItemID, UpgradeItemID1, " - "UpgradeItemID2, ItemBonusListID1, ItemBonusListID2 FROM heirloom ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_HEIRLOOM, "SELECT ID, ItemID, SourceText, OldItem1, OldItem2, NextDifficultyItemID, UpgradeItemID1, UpgradeItemID2, " + "ItemBonusListID1, ItemBonusListID2, Flags, Source FROM heirloom ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_HEIRLOOM, "SELECT ID, SourceText_lang FROM heirloom_locale WHERE locale = ?", CONNECTION_SYNCH); // Holidays.db2 - PrepareStatement(HOTFIX_SEL_HOLIDAYS, "SELECT ID, Duration1, Duration2, Duration3, Duration4, Duration5, Duration6, Duration7, Duration8, " - "Duration9, Duration10, Date1, Date2, Date3, Date4, Date5, Date6, Date7, Date8, Date9, Date10, Date11, Date12, Date13, Date14, Date15, " - "Date16, Region, Looping, CalendarFlags1, CalendarFlags2, CalendarFlags3, CalendarFlags4, CalendarFlags5, CalendarFlags6, CalendarFlags7, " - "CalendarFlags8, CalendarFlags9, CalendarFlags10, HolidayNameID, HolidayDescriptionID, TextureFilename, Priority, CalendarFilterType, Flags" - " FROM holidays ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_HOLIDAYS, "SELECT ID, TextureFilename_lang FROM holidays_locale WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_HOLIDAYS, "SELECT ID, Date1, Date2, Date3, Date4, Date5, Date6, Date7, Date8, Date9, Date10, Date11, Date12, Date13, " + "Date14, Date15, Date16, TextureFilename, Duration1, Duration2, Duration3, Duration4, Duration5, Duration6, Duration7, Duration8, Duration9, " + "Duration10, Region, Looping, CalendarFlags1, CalendarFlags2, CalendarFlags3, CalendarFlags4, CalendarFlags5, CalendarFlags6, CalendarFlags7, " + "CalendarFlags8, CalendarFlags9, CalendarFlags10, HolidayNameID, HolidayDescriptionID, Priority, CalendarFilterType, Flags FROM holidays" + " ORDER BY ID DESC", CONNECTION_SYNCH); // ImportPriceArmor.db2 PrepareStatement(HOTFIX_SEL_IMPORT_PRICE_ARMOR, "SELECT ID, ClothFactor, LeatherFactor, MailFactor, PlateFactor FROM import_price_armor" @@ -215,83 +262,120 @@ void HotfixDatabaseConnection::DoPrepareStatements() // ImportPriceWeapon.db2 PrepareStatement(HOTFIX_SEL_IMPORT_PRICE_WEAPON, "SELECT ID, Factor FROM import_price_weapon ORDER BY ID DESC", CONNECTION_SYNCH); + // Item.db2 + PrepareStatement(HOTFIX_SEL_ITEM, "SELECT ID, FileDataID, Class, SubClass, SoundOverrideSubclass, Material, InventoryType, Sheath, GroupSoundsID" + " FROM item ORDER BY ID DESC", CONNECTION_SYNCH); + // ItemAppearance.db2 - PrepareStatement(HOTFIX_SEL_ITEM_APPEARANCE, "SELECT ID, DisplayID, IconFileDataID FROM item_appearance ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_APPEARANCE, "SELECT ID, DisplayID, IconFileDataID, ObjectComponentSlot FROM item_appearance ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemArmorQuality.db2 + PrepareStatement(HOTFIX_SEL_ITEM_ARMOR_QUALITY, "SELECT ID, QualityMod1, QualityMod2, QualityMod3, QualityMod4, QualityMod5, QualityMod6, " + "QualityMod7, ItemLevel FROM item_armor_quality ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemArmorShield.db2 + PrepareStatement(HOTFIX_SEL_ITEM_ARMOR_SHIELD, "SELECT ID, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7, ItemLevel" + " FROM item_armor_shield ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemArmorTotal.db2 + PrepareStatement(HOTFIX_SEL_ITEM_ARMOR_TOTAL, "SELECT ID, Value1, Value2, Value3, Value4, ItemLevel FROM item_armor_total ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemBagFamily.db2 + PrepareStatement(HOTFIX_SEL_ITEM_BAG_FAMILY, "SELECT ID, Name FROM item_bag_family ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_BAG_FAMILY, "SELECT ID, Name_lang FROM item_bag_family_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemBonus.db2 - PrepareStatement(HOTFIX_SEL_ITEM_BONUS, "SELECT ID, BonusListID, Type, Value1, Value2, `Index` FROM item_bonus ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_BONUS, "SELECT ID, Value1, Value2, BonusListID, Type, `Index` FROM item_bonus ORDER BY ID DESC", CONNECTION_SYNCH); // ItemBonusTreeNode.db2 - PrepareStatement(HOTFIX_SEL_ITEM_BONUS_TREE_NODE, "SELECT ID, BonusTreeID, BonusTreeModID, SubTreeID, BonusListID FROM item_bonus_tree_node" + PrepareStatement(HOTFIX_SEL_ITEM_BONUS_TREE_NODE, "SELECT ID, BonusTreeID, SubTreeID, BonusListID, BonusTreeModID FROM item_bonus_tree_node" " ORDER BY ID DESC", CONNECTION_SYNCH); // ItemClass.db2 - PrepareStatement(HOTFIX_SEL_ITEM_CLASS, "SELECT ID, Flags, PriceMod, Name FROM item_class ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_CLASS, "SELECT ID, PriceMod, Name, Flags FROM item_class ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_CLASS, "SELECT ID, Name_lang FROM item_class_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemCurrencyCost.db2 PrepareStatement(HOTFIX_SEL_ITEM_CURRENCY_COST, "SELECT ID, ItemId FROM item_currency_cost ORDER BY ID DESC", CONNECTION_SYNCH); + // ItemDamageAmmo.db2 + PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_AMMO, "SELECT ID, DPS1, DPS2, DPS3, DPS4, DPS5, DPS6, DPS7, ItemLevel FROM item_damage_ammo" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemDamageOneHand.db2 + PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND, "SELECT ID, DPS1, DPS2, DPS3, DPS4, DPS5, DPS6, DPS7, ItemLevel FROM item_damage_one_hand" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemDamageOneHandCaster.db2 + PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER, "SELECT ID, DPS1, DPS2, DPS3, DPS4, DPS5, DPS6, DPS7, ItemLevel" + " FROM item_damage_one_hand_caster ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemDamageTwoHand.db2 + PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND, "SELECT ID, DPS1, DPS2, DPS3, DPS4, DPS5, DPS6, DPS7, ItemLevel FROM item_damage_two_hand" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemDamageTwoHandCaster.db2 + PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER, "SELECT ID, DPS1, DPS2, DPS3, DPS4, DPS5, DPS6, DPS7, ItemLevel" + " FROM item_damage_two_hand_caster ORDER BY ID DESC", CONNECTION_SYNCH); + // ItemDisenchantLoot.db2 - PrepareStatement(HOTFIX_SEL_ITEM_DISENCHANT_LOOT, "SELECT ID, ItemClass, ItemSubClass, ItemQuality, MinItemLevel, MaxItemLevel, " - "RequiredDisenchantSkill FROM item_disenchant_loot ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_DISENCHANT_LOOT, "SELECT ID, MinItemLevel, MaxItemLevel, RequiredDisenchantSkill, ItemClass, ItemSubClass, " + "ItemQuality FROM item_disenchant_loot ORDER BY ID DESC", CONNECTION_SYNCH); // ItemEffect.db2 - PrepareStatement(HOTFIX_SEL_ITEM_EFFECT, "SELECT ID, ItemID, OrderIndex, SpellID, `Trigger`, Charges, Cooldown, Category, CategoryCooldown, " - "ChrSpecializationID FROM item_effect ORDER BY ID DESC", CONNECTION_SYNCH); - - // Item.db2 - PrepareStatement(HOTFIX_SEL_ITEM, "SELECT ID, Class, SubClass, SoundOverrideSubclass, Material, InventoryType, Sheath, FileDataID, GroupSoundsID" - " FROM item ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_EFFECT, "SELECT ID, ItemID, SpellID, Cooldown, CategoryCooldown, Charges, Category, ChrSpecializationID, " + "OrderIndex, `Trigger` FROM item_effect ORDER BY ID DESC", CONNECTION_SYNCH); // ItemExtendedCost.db2 - PrepareStatement(HOTFIX_SEL_ITEM_EXTENDED_COST, "SELECT ID, RequiredArenaSlot, RequiredItem1, RequiredItem2, RequiredItem3, RequiredItem4, " - "RequiredItem5, RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, " - "RequiredPersonalArenaRating, ItemPurchaseGroup, RequiredCurrency1, RequiredCurrency2, RequiredCurrency3, RequiredCurrency4, " - "RequiredCurrency5, RequiredCurrencyCount1, RequiredCurrencyCount2, RequiredCurrencyCount3, RequiredCurrencyCount4, RequiredCurrencyCount5, " - "RequiredFactionId, RequiredFactionStanding, RequirementFlags, RequiredAchievement, RequiredMoney FROM item_extended_cost ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_EXTENDED_COST, "SELECT ID, RequiredItem1, RequiredItem2, RequiredItem3, RequiredItem4, RequiredItem5, " + "RequiredCurrencyCount1, RequiredCurrencyCount2, RequiredCurrencyCount3, RequiredCurrencyCount4, RequiredCurrencyCount5, RequiredMoney, " + "RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredPersonalArenaRating, " + "RequiredCurrency1, RequiredCurrency2, RequiredCurrency3, RequiredCurrency4, RequiredCurrency5, RequiredArenaSlot, RequiredFactionId, " + "RequiredFactionStanding, RequirementFlags, RequiredAchievement FROM item_extended_cost ORDER BY ID DESC", CONNECTION_SYNCH); // ItemLimitCategory.db2 PrepareStatement(HOTFIX_SEL_ITEM_LIMIT_CATEGORY, "SELECT ID, Name, Quantity, Flags FROM item_limit_category ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_LIMIT_CATEGORY, "SELECT ID, Name_lang FROM item_limit_category_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemModifiedAppearance.db2 - PrepareStatement(HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ID, ItemID, AppearanceModID, AppearanceID, IconFileDataID, `Index`" - " FROM item_modified_appearance ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ID, ItemID, AppearanceID, AppearanceModID, `Index` FROM item_modified_appearance" + " ORDER BY ID DESC", CONNECTION_SYNCH); // ItemPriceBase.db2 - PrepareStatement(HOTFIX_SEL_ITEM_PRICE_BASE, "SELECT ID, ItemLevel, ArmorFactor, WeaponFactor FROM item_price_base ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_PRICE_BASE, "SELECT ID, ArmorFactor, WeaponFactor, ItemLevel FROM item_price_base ORDER BY ID DESC", CONNECTION_SYNCH); // ItemRandomProperties.db2 - PrepareStatement(HOTFIX_SEL_ITEM_RANDOM_PROPERTIES, "SELECT ID, InternalName, Enchantment1, Enchantment2, Enchantment3, Enchantment4, " - "Enchantment5, Name FROM item_random_properties ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_RANDOM_PROPERTIES, "SELECT ID, InternalName_lang, Name_lang FROM item_random_properties_locale" - " WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_RANDOM_PROPERTIES, "SELECT ID, Name, Enchantment1, Enchantment2, Enchantment3, Enchantment4, Enchantment5" + " FROM item_random_properties ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_RANDOM_PROPERTIES, "SELECT ID, Name_lang FROM item_random_properties_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemRandomSuffix.db2 PrepareStatement(HOTFIX_SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name, InternalName, Enchantment1, Enchantment2, Enchantment3, Enchantment4, " "Enchantment5, AllocationPct1, AllocationPct2, AllocationPct3, AllocationPct4, AllocationPct5 FROM item_random_suffix ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name_lang, InternalName_lang FROM item_random_suffix_locale WHERE locale = ?", CONNECTION_SYNCH); + // ItemSetSpell.db2 + PrepareStatement(HOTFIX_SEL_ITEM_SET_SPELL, "SELECT ID, SpellID, ItemSetID, ChrSpecID, Threshold FROM item_set_spell ORDER BY ID DESC", CONNECTION_SYNCH); + // ItemSparse.db2 - PrepareStatement(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Quality, Flags1, Flags2, Flags3, Unk1, Unk2, BuyCount, BuyPrice, SellPrice, InventoryType, " - "AllowableClass, AllowableRace, ItemLevel, RequiredLevel, RequiredSkill, RequiredSkillRank, RequiredSpell, RequiredHonorRank, " - "RequiredCityRank, RequiredReputationFaction, RequiredReputationRank, MaxCount, Stackable, ContainerSlots, ItemStatType1, ItemStatType2, " - "ItemStatType3, ItemStatType4, ItemStatType5, ItemStatType6, ItemStatType7, ItemStatType8, ItemStatType9, ItemStatType10, ItemStatValue1, " - "ItemStatValue2, ItemStatValue3, ItemStatValue4, ItemStatValue5, ItemStatValue6, ItemStatValue7, ItemStatValue8, ItemStatValue9, " - "ItemStatValue10, ItemStatAllocation1, ItemStatAllocation2, ItemStatAllocation3, ItemStatAllocation4, ItemStatAllocation5, " + PrepareStatement(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Flags1, Flags2, Flags3, Unk1, Unk2, BuyPrice, SellPrice, AllowableClass, AllowableRace, " + "RequiredSpell, MaxCount, Stackable, ItemStatAllocation1, ItemStatAllocation2, ItemStatAllocation3, ItemStatAllocation4, ItemStatAllocation5, " "ItemStatAllocation6, ItemStatAllocation7, ItemStatAllocation8, ItemStatAllocation9, ItemStatAllocation10, ItemStatSocketCostMultiplier1, " "ItemStatSocketCostMultiplier2, ItemStatSocketCostMultiplier3, ItemStatSocketCostMultiplier4, ItemStatSocketCostMultiplier5, " "ItemStatSocketCostMultiplier6, ItemStatSocketCostMultiplier7, ItemStatSocketCostMultiplier8, ItemStatSocketCostMultiplier9, " - "ItemStatSocketCostMultiplier10, ScalingStatDistribution, DamageType, Delay, RangedModRange, Bonding, Name, Name2, Name3, Name4, Description, " - "PageText, LanguageID, PageMaterial, StartQuest, LockID, Material, Sheath, RandomProperty, RandomSuffix, ItemSet, Area, Map, BagFamily, " - "TotemCategory, SocketColor1, SocketColor2, SocketColor3, SocketBonus, GemProperties, ArmorDamageModifier, Duration, ItemLimitCategory, " - "HolidayID, StatScalingFactor, CurrencySubstitutionID, CurrencySubstitutionCount, ItemNameDescriptionID FROM item_sparse ORDER BY ID DESC", CONNECTION_SYNCH); + "ItemStatSocketCostMultiplier10, RangedModRange, Name, Name2, Name3, Name4, Description, BagFamily, ArmorDamageModifier, Duration, " + "StatScalingFactor, ItemLevel, RequiredSkill, RequiredSkillRank, RequiredReputationFaction, ItemStatValue1, ItemStatValue2, ItemStatValue3, " + "ItemStatValue4, ItemStatValue5, ItemStatValue6, ItemStatValue7, ItemStatValue8, ItemStatValue9, ItemStatValue10, ScalingStatDistribution, " + "Delay, PageText, StartQuest, LockID, RandomProperty, RandomSuffix, ItemSet, Area, Map, SocketBonus, GemProperties, ItemLimitCategory, " + "HolidayID, ItemNameDescriptionID, Quality, BuyCount, InventoryType, RequiredLevel, RequiredHonorRank, RequiredCityRank, " + "RequiredReputationRank, ContainerSlots, ItemStatType1, ItemStatType2, ItemStatType3, ItemStatType4, ItemStatType5, ItemStatType6, " + "ItemStatType7, ItemStatType8, ItemStatType9, ItemStatType10, DamageType, Bonding, LanguageID, PageMaterial, Material, Sheath, TotemCategory, " + "SocketColor1, SocketColor2, SocketColor3, CurrencySubstitutionID, CurrencySubstitutionCount, ArtifactID FROM item_sparse ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Name_lang, Name2_lang, Name3_lang, Name4_lang, Description_lang FROM item_sparse_locale" " WHERE locale = ?", CONNECTION_SYNCH); // ItemSpec.db2 - PrepareStatement(HOTFIX_SEL_ITEM_SPEC, "SELECT ID, MinLevel, MaxLevel, ItemType, PrimaryStat, SecondaryStat, SpecID FROM item_spec" + PrepareStatement(HOTFIX_SEL_ITEM_SPEC, "SELECT ID, SpecID, MinLevel, MaxLevel, ItemType, PrimaryStat, SecondaryStat FROM item_spec" " ORDER BY ID DESC", CONNECTION_SYNCH); // ItemSpecOverride.db2 @@ -304,30 +388,33 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_ITEM_X_BONUS_TREE, "SELECT ID, ItemID, BonusTreeID FROM item_x_bonus_tree ORDER BY ID DESC", CONNECTION_SYNCH); // KeyChain.db2 - PrepareStatement(HOTFIX_SEL_KEY_CHAIN, "SELECT Id, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9, Key10, Key11, Key12, Key13, Key14, " + PrepareStatement(HOTFIX_SEL_KEY_CHAIN, "SELECT ID, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9, Key10, Key11, Key12, Key13, Key14, " "Key15, Key16, Key17, Key18, Key19, Key20, Key21, Key22, Key23, Key24, Key25, Key26, Key27, Key28, Key29, Key30, Key31, Key32 FROM key_chain" - " ORDER BY Id DESC", CONNECTION_SYNCH); + " ORDER BY ID DESC", CONNECTION_SYNCH); // MailTemplate.db2 PrepareStatement(HOTFIX_SEL_MAIL_TEMPLATE, "SELECT ID, Body FROM mail_template ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_MAIL_TEMPLATE, "SELECT ID, Body_lang FROM mail_template_locale WHERE locale = ?", CONNECTION_SYNCH); // ModifierTree.db2 - PrepareStatement(HOTFIX_SEL_MODIFIER_TREE, "SELECT ID, Type, Asset1, Asset2, Operator, Amount, Parent FROM modifier_tree ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MODIFIER_TREE, "SELECT ID, Asset1, Asset2, Parent, Type, Unk700, Operator, Amount FROM modifier_tree ORDER BY ID DESC", CONNECTION_SYNCH); // Mount.db2 - PrepareStatement(HOTFIX_SEL_MOUNT, "SELECT Id, SpellId, MountTypeId, DisplayId, Flags, Name, Description, SourceDescription, Source, " - "PlayerConditionId FROM mount ORDER BY Id DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_MOUNT, "SELECT Id, Name_lang, Description_lang, SourceDescription_lang FROM mount_locale WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MOUNT, "SELECT ID, SpellId, DisplayId, Name, Description, SourceDescription, MountTypeId, Flags, PlayerConditionId, " + "Source FROM mount ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_MOUNT, "SELECT ID, Name_lang, Description_lang, SourceDescription_lang FROM mount_locale WHERE locale = ?", CONNECTION_SYNCH); // MountCapability.db2 - PrepareStatement(HOTFIX_SEL_MOUNT_CAPABILITY, "SELECT ID, Flags, RequiredRidingSkill, RequiredArea, RequiredAura, RequiredSpell, SpeedModSpell, " - "RequiredMap FROM mount_capability ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MOUNT_CAPABILITY, "SELECT ID, RequiredSpell, SpeedModSpell, RequiredRidingSkill, RequiredArea, RequiredMap, Flags, " + "RequiredAura FROM mount_capability ORDER BY ID DESC", CONNECTION_SYNCH); // MountTypeXCapability.db2 - PrepareStatement(HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, OrderIndex, MountCapabilityID FROM mount_type_x_capability" + PrepareStatement(HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, MountCapabilityID, OrderIndex FROM mount_type_x_capability" " ORDER BY ID DESC", CONNECTION_SYNCH); + // Movie.db2 + PrepareStatement(HOTFIX_SEL_MOVIE, "SELECT ID, AudioFileDataID, SubtitleFileDataID, Volume, KeyID FROM movie ORDER BY ID DESC", CONNECTION_SYNCH); + // NameGen.db2 PrepareStatement(HOTFIX_SEL_NAME_GEN, "SELECT ID, Name, Race, Sex FROM name_gen ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_NAME_GEN, "SELECT ID, Name_lang FROM name_gen_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -343,35 +430,44 @@ void HotfixDatabaseConnection::DoPrepareStatements() // OverrideSpellData.db2 PrepareStatement(HOTFIX_SEL_OVERRIDE_SPELL_DATA, "SELECT ID, SpellID1, SpellID2, SpellID3, SpellID4, SpellID5, SpellID6, SpellID7, SpellID8, " - "SpellID9, SpellID10, Flags, PlayerActionbarFileDataID FROM override_spell_data ORDER BY ID DESC", CONNECTION_SYNCH); + "SpellID9, SpellID10, PlayerActionbarFileDataID, Flags FROM override_spell_data ORDER BY ID DESC", CONNECTION_SYNCH); // PhaseXPhaseGroup.db2 PrepareStatement(HOTFIX_SEL_PHASE_X_PHASE_GROUP, "SELECT ID, PhaseID, PhaseGroupID FROM phase_x_phase_group ORDER BY ID DESC", CONNECTION_SYNCH); // PlayerCondition.db2 - PrepareStatement(HOTFIX_SEL_PLAYER_CONDITION, "SELECT ID, Flags, MinLevel, MaxLevel, RaceMask, ClassMask, Gender, NativeGender, SkillID1, " - "SkillID2, SkillID3, SkillID4, MinSkill1, MinSkill2, MinSkill3, MinSkill4, MaxSkill1, MaxSkill2, MaxSkill3, MaxSkill4, SkillLogic, " - "LanguageID, MinLanguage, MaxLanguage, MinFactionID1, MinFactionID2, MinFactionID3, MaxFactionID, MinReputation1, MinReputation2, " - "MinReputation3, MaxReputation, ReputationLogic, Unknown1, MinPVPRank, MaxPVPRank, PvpMedal, PrevQuestLogic, PrevQuestID1, PrevQuestID2, " - "PrevQuestID3, PrevQuestID4, CurrQuestLogic, CurrQuestID1, CurrQuestID2, CurrQuestID3, CurrQuestID4, CurrentCompletedQuestLogic, " - "CurrentCompletedQuestID1, CurrentCompletedQuestID2, CurrentCompletedQuestID3, CurrentCompletedQuestID4, SpellLogic, SpellID1, SpellID2, " - "SpellID3, SpellID4, ItemLogic, ItemID1, ItemID2, ItemID3, ItemID4, ItemCount1, ItemCount2, ItemCount3, ItemCount4, ItemFlags, Explored1, " - "Explored2, Time1, Time2, AuraSpellLogic, AuraSpellID1, AuraSpellID2, AuraSpellID3, AuraSpellID4, WorldStateExpressionID, WeatherID, " - "PartyStatus, LifetimeMaxPVPRank, AchievementLogic, Achievement1, Achievement2, Achievement3, Achievement4, LfgLogic, LfgStatus1, LfgStatus2, " - "LfgStatus3, LfgStatus4, LfgCompare1, LfgCompare2, LfgCompare3, LfgCompare4, LfgValue1, LfgValue2, LfgValue3, LfgValue4, AreaLogic, AreaID1, " - "AreaID2, AreaID3, AreaID4, CurrencyLogic, CurrencyID1, CurrencyID2, CurrencyID3, CurrencyID4, CurrencyCount1, CurrencyCount2, " - "CurrencyCount3, CurrencyCount4, QuestKillID, QuestKillLogic, QuestKillMonster1, QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, " - "MinExpansionLevel, MaxExpansionLevel, MinExpansionTier, MaxExpansionTier, MinGuildLevel, MaxGuildLevel, PhaseUseFlags, PhaseID, " - "PhaseGroupID, MinAvgItemLevel, MaxAvgItemLevel, MinAvgEquippedItemLevel, MaxAvgEquippedItemLevel, ChrSpecializationIndex, " - "ChrSpecializationRole, FailureDescription, PowerType, PowerTypeComp, PowerTypeValue FROM player_condition ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_PLAYER_CONDITION, "SELECT ID, RaceMask, SkillLogic, ReputationLogic, PrevQuestLogic, CurrQuestLogic, " + "CurrentCompletedQuestLogic, SpellLogic, SpellID1, SpellID2, SpellID3, SpellID4, ItemLogic, ItemID1, ItemID2, ItemID3, ItemID4, Time1, Time2, " + "AuraSpellLogic, AuraSpellID1, AuraSpellID2, AuraSpellID3, AuraSpellID4, AchievementLogic, AreaLogic, QuestKillLogic, QuestKillMonster1, " + "QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, QuestKillMonster5, QuestKillMonster6, FailureDescription, Unknown700_1, " + "Unknown700_2, MinLevel, MaxLevel, ClassMask, SkillID1, SkillID2, SkillID3, SkillID4, MinSkill1, MinSkill2, MinSkill3, MinSkill4, MaxSkill1, " + "MaxSkill2, MaxSkill3, MaxSkill4, MinFactionID1, MinFactionID2, MinFactionID3, MaxFactionID, PrevQuestID1, PrevQuestID2, PrevQuestID3, " + "PrevQuestID4, CurrQuestID1, CurrQuestID2, CurrQuestID3, CurrQuestID4, CurrentCompletedQuestID1, CurrentCompletedQuestID2, " + "CurrentCompletedQuestID3, CurrentCompletedQuestID4, Explored1, Explored2, WorldStateExpressionID, Achievement1, Achievement2, Achievement3, " + "Achievement4, AreaID1, AreaID2, AreaID3, AreaID4, QuestKillID, PhaseID, MinAvgItemLevel, MaxAvgItemLevel, MinAvgEquippedItemLevel, " + "MaxAvgEquippedItemLevel, ModifierTreeID, Flags, Gender, NativeGender, LanguageID, MinLanguage, MaxLanguage, MinReputation1, MinReputation2, " + "MinReputation3, MaxReputation, Unknown1, MinPVPRank, MaxPVPRank, PvpMedal, ItemCount1, ItemCount2, ItemCount3, ItemCount4, ItemFlags, " + "AuraCount1, AuraCount2, AuraCount3, AuraCount4, WeatherID, PartyStatus, LifetimeMaxPVPRank, LfgLogic, LfgStatus1, LfgStatus2, LfgStatus3, " + "LfgStatus4, LfgCompare1, LfgCompare2, LfgCompare3, LfgCompare4, LfgValue1, LfgValue2, LfgValue3, LfgValue4, CurrencyLogic, CurrencyID1, " + "CurrencyID2, CurrencyID3, CurrencyID4, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, MinExpansionLevel, MaxExpansionLevel, " + "MinExpansionTier, MaxExpansionTier, MinGuildLevel, MaxGuildLevel, PhaseUseFlags, PhaseGroupID, ChrSpecializationIndex, " + "ChrSpecializationRole, PowerType, PowerTypeComp, PowerTypeValue FROM player_condition ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_PLAYER_CONDITION, "SELECT ID, FailureDescription_lang FROM player_condition_locale WHERE locale = ?", CONNECTION_SYNCH); + // PowerDisplay.db2 + PrepareStatement(HOTFIX_SEL_POWER_DISPLAY, "SELECT ID, GlobalStringBaseTag, PowerType, Red, Green, Blue FROM power_display ORDER BY ID DESC", CONNECTION_SYNCH); + + // QuestFactionReward.db2 + PrepareStatement(HOTFIX_SEL_QUEST_FACTION_REWARD, "SELECT ID, QuestRewFactionValue1, QuestRewFactionValue2, QuestRewFactionValue3, " + "QuestRewFactionValue4, QuestRewFactionValue5, QuestRewFactionValue6, QuestRewFactionValue7, QuestRewFactionValue8, QuestRewFactionValue9, " + "QuestRewFactionValue10 FROM quest_faction_reward ORDER BY ID DESC", CONNECTION_SYNCH); + // QuestMoneyReward.db2 - PrepareStatement(HOTFIX_SEL_QUEST_MONEY_REWARD, "SELECT Level, Money1, Money2, Money3, Money4, Money5, Money6, Money7, Money8, Money9, Money10" - " FROM quest_money_reward ORDER BY Level DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_QUEST_MONEY_REWARD, "SELECT ID, Money1, Money2, Money3, Money4, Money5, Money6, Money7, Money8, Money9, Money10" + " FROM quest_money_reward ORDER BY ID DESC", CONNECTION_SYNCH); // QuestPackageItem.db2 - PrepareStatement(HOTFIX_SEL_QUEST_PACKAGE_ITEM, "SELECT ID, QuestPackageID, ItemID, ItemCount, FilterType FROM quest_package_item ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_QUEST_PACKAGE_ITEM, "SELECT ID, ItemID, QuestPackageID, ItemCount, FilterType FROM quest_package_item ORDER BY ID DESC", CONNECTION_SYNCH); // QuestSort.db2 PrepareStatement(HOTFIX_SEL_QUEST_SORT, "SELECT ID, SortName FROM quest_sort ORDER BY ID DESC", CONNECTION_SYNCH); @@ -383,42 +479,106 @@ void HotfixDatabaseConnection::DoPrepareStatements() // QuestXp.db2 PrepareStatement(HOTFIX_SEL_QUEST_XP, "SELECT ID, Exp1, Exp2, Exp3, Exp4, Exp5, Exp6, Exp7, Exp8, Exp9, Exp10 FROM quest_xp ORDER BY ID DESC", CONNECTION_SYNCH); + // RandPropPoints.db2 + PrepareStatement(HOTFIX_SEL_RAND_PROP_POINTS, "SELECT ID, EpicPropertiesPoints1, EpicPropertiesPoints2, EpicPropertiesPoints3, " + "EpicPropertiesPoints4, EpicPropertiesPoints5, RarePropertiesPoints1, RarePropertiesPoints2, RarePropertiesPoints3, RarePropertiesPoints4, " + "RarePropertiesPoints5, UncommonPropertiesPoints1, UncommonPropertiesPoints2, UncommonPropertiesPoints3, UncommonPropertiesPoints4, " + "UncommonPropertiesPoints5 FROM rand_prop_points ORDER BY ID DESC", CONNECTION_SYNCH); + // ScalingStatDistribution.db2 - PrepareStatement(HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, "SELECT ID, MinLevel, MaxLevel, ItemLevelCurveID FROM scaling_stat_distribution" + PrepareStatement(HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, "SELECT ID, ItemLevelCurveID, MinLevel, MaxLevel FROM scaling_stat_distribution" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // SkillLine.db2 + PrepareStatement(HOTFIX_SEL_SKILL_LINE, "SELECT ID, DisplayName, Description, AlternateVerb, SpellIconID, Flags, CategoryID, CanLink, " + "ParentSkillLineID FROM skill_line ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SKILL_LINE, "SELECT ID, DisplayName_lang, Description_lang, AlternateVerb_lang FROM skill_line_locale" + " WHERE locale = ?", CONNECTION_SYNCH); + + // SkillLineAbility.db2 + PrepareStatement(HOTFIX_SEL_SKILL_LINE_ABILITY, "SELECT ID, SpellID, RaceMask, ClassMask, SupercedesSpell, SkillLine, MinSkillLineRank, " + "TrivialSkillLineRankHigh, TrivialSkillLineRankLow, UniqueBit, TradeSkillCategoryID, AquireMethod, NumSkillUps FROM skill_line_ability" " ORDER BY ID DESC", CONNECTION_SYNCH); - // SoundEntries.db2 - PrepareStatement(HOTFIX_SEL_SOUND_ENTRIES, "SELECT ID, SoundType, Name, FileDataID1, FileDataID2, FileDataID3, FileDataID4, FileDataID5, " - "FileDataID6, FileDataID7, FileDataID8, FileDataID9, FileDataID10, FileDataID11, FileDataID12, FileDataID13, FileDataID14, FileDataID15, " - "FileDataID16, FileDataID17, FileDataID18, FileDataID19, FileDataID20, Freq1, Freq2, Freq3, Freq4, Freq5, Freq6, Freq7, Freq8, Freq9, Freq10, " - "Freq11, Freq12, Freq13, Freq14, Freq15, Freq16, Freq17, Freq18, Freq19, Freq20, VolumeFloat, Flags, MinDistance, DistanceCutoff, EAXDef, " - "SoundEntriesAdvancedID, VolumeVariationPlus, VolumeVariationMinus, PitchVariationPlus, PitchVariationMinus, PitchAdjust, DialogType, " - "BusOverwriteID FROM sound_entries ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_SOUND_ENTRIES, "SELECT ID, Name_lang FROM sound_entries_locale WHERE locale = ?", CONNECTION_SYNCH); + // SkillRaceClassInfo.db2 + PrepareStatement(HOTFIX_SEL_SKILL_RACE_CLASS_INFO, "SELECT ID, RaceMask, SkillID, ClassMask, Flags, SkillTierID, Availability, MinLevel" + " FROM skill_race_class_info ORDER BY ID DESC", CONNECTION_SYNCH); + + // SoundKit.db2 + PrepareStatement(HOTFIX_SEL_SOUND_KIT, "SELECT ID, SoundType, Name, VolumeFloat, MinDistance, DistanceCutoff, VolumeVariationPlus, " + "VolumeVariationMinus, PitchVariationPlus, PitchVariationMinus, PitchAdjust, Flags, SoundEntriesAdvancedID, EAXDef, DialogType, " + "BusOverwriteID, Unk700 FROM sound_kit ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SOUND_KIT, "SELECT ID, Name_lang FROM sound_kit_locale WHERE locale = ?", CONNECTION_SYNCH); // SpecializationSpells.db2 - PrepareStatement(HOTFIX_SEL_SPECIALIZATION_SPELLS, "SELECT ID, SpecID, OrderIndex, SpellID, OverridesSpellID, Description" + PrepareStatement(HOTFIX_SEL_SPECIALIZATION_SPELLS, "SELECT ID, SpellID, OverridesSpellID, Description, SpecID, OrderIndex" " FROM specialization_spells ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SPECIALIZATION_SPELLS, "SELECT ID, Description_lang FROM specialization_spells_locale WHERE locale = ?", CONNECTION_SYNCH); - // SpellAuraRestrictions.db2 - PrepareStatement(HOTFIX_SEL_SPELL_AURA_RESTRICTIONS, "SELECT ID, CasterAuraState, TargetAuraState, ExcludeCasterAuraState, " - "ExcludeTargetAuraState, CasterAuraSpell, TargetAuraSpell, ExcludeCasterAuraSpell, ExcludeTargetAuraSpell FROM spell_aura_restrictions" + // Spell.db2 + PrepareStatement(HOTFIX_SEL_SPELL, "SELECT ID, Name, NameSubtext, Description, AuraDescription, MiscID, DescriptionVariablesID FROM spell" " ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL, "SELECT ID, Name_lang, NameSubtext_lang, Description_lang, AuraDescription_lang FROM spell_locale" + " WHERE locale = ?", CONNECTION_SYNCH); - // SpellCastingRequirements.db2 - PrepareStatement(HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS, "SELECT ID, FacingCasterFlags, MinFactionID, MinReputation, RequiredAreasID, " - "RequiredAuraVision, RequiresSpellFocus FROM spell_casting_requirements ORDER BY ID DESC", CONNECTION_SYNCH); + // SpellAuraOptions.db2 + PrepareStatement(HOTFIX_SEL_SPELL_AURA_OPTIONS, "SELECT ID, SpellID, ProcCharges, ProcTypeMask, ProcCategoryRecovery, CumulativeAura, " + "DifficultyID, ProcChance, SpellProcsPerMinuteID FROM spell_aura_options ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellAuraRestrictions.db2 + PrepareStatement(HOTFIX_SEL_SPELL_AURA_RESTRICTIONS, "SELECT ID, SpellID, CasterAuraSpell, TargetAuraSpell, ExcludeCasterAuraSpell, " + "ExcludeTargetAuraSpell, DifficultyID, CasterAuraState, TargetAuraState, ExcludeCasterAuraState, ExcludeTargetAuraState" + " FROM spell_aura_restrictions ORDER BY ID DESC", CONNECTION_SYNCH); // SpellCastTimes.db2 - PrepareStatement(HOTFIX_SEL_SPELL_CAST_TIMES, "SELECT ID, CastTime, CastTimePerLevel, MinCastTime FROM spell_cast_times ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_CAST_TIMES, "SELECT ID, CastTime, MinCastTime, CastTimePerLevel FROM spell_cast_times ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellCastingRequirements.db2 + PrepareStatement(HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS, "SELECT ID, SpellID, MinFactionID, RequiredAreasID, RequiresSpellFocus, " + "FacingCasterFlags, MinReputation, RequiredAuraVision FROM spell_casting_requirements ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellCategories.db2 + PrepareStatement(HOTFIX_SEL_SPELL_CATEGORIES, "SELECT ID, SpellID, Category, StartRecoveryCategory, ChargeCategory, DifficultyID, DefenseType, " + "DispelType, Mechanic, PreventionType FROM spell_categories ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellCategory.db2 + PrepareStatement(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name, ChargeRecoveryTime, Flags, UsesPerWeek, MaxCharges FROM spell_category" + " ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name_lang FROM spell_category_locale WHERE locale = ?", CONNECTION_SYNCH); // SpellClassOptions.db2 - PrepareStatement(HOTFIX_SEL_SPELL_CLASS_OPTIONS, "SELECT ID, ModalNextSpell, SpellClassMask1, SpellClassMask2, SpellClassMask3, SpellClassMask4, " - "SpellClassSet FROM spell_class_options ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_CLASS_OPTIONS, "SELECT ID, SpellID, SpellClassMask1, SpellClassMask2, SpellClassMask3, SpellClassMask4, " + "ModalNextSpell, SpellClassSet FROM spell_class_options ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellCooldowns.db2 + PrepareStatement(HOTFIX_SEL_SPELL_COOLDOWNS, "SELECT ID, SpellID, CategoryRecoveryTime, RecoveryTime, StartRecoveryTime, DifficultyID" + " FROM spell_cooldowns ORDER BY ID DESC", CONNECTION_SYNCH); // SpellDuration.db2 - PrepareStatement(HOTFIX_SEL_SPELL_DURATION, "SELECT ID, Duration1, Duration2, Duration3 FROM spell_duration ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_DURATION, "SELECT ID, Duration, MaxDuration, DurationPerLevel FROM spell_duration ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellEffect.db2 + PrepareStatement(HOTFIX_SEL_SPELL_EFFECT, "SELECT ID, EffectAmplitude, EffectAuraPeriod, EffectBasePoints, EffectBonusCoefficient, " + "EffectChainAmplitude, EffectDieSides, EffectItemType, EffectMiscValue, EffectMiscValueB, EffectPointsPerResource, EffectRealPointsPerLevel, " + "EffectSpellClassMask1, EffectSpellClassMask2, EffectSpellClassMask3, EffectSpellClassMask4, EffectTriggerSpell, EffectPosFacing, SpellID, " + "EffectAttributes, BonusCoefficientFromAP, EffectAura, EffectChainTargets, DifficultyID, Effect, EffectMechanic, EffectRadiusIndex, " + "EffectRadiusMaxIndex, ImplicitTarget1, ImplicitTarget2, EffectIndex FROM spell_effect ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellEffectScaling.db2 + PrepareStatement(HOTFIX_SEL_SPELL_EFFECT_SCALING, "SELECT ID, Coefficient, Variance, ResourceCoefficient, SpellEffectID FROM spell_effect_scaling" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellEquippedItems.db2 + PrepareStatement(HOTFIX_SEL_SPELL_EQUIPPED_ITEMS, "SELECT ID, SpellID, EquippedItemInventoryTypeMask, EquippedItemSubClassMask, " + "EquippedItemClass FROM spell_equipped_items ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellFocusObject.db2 + PrepareStatement(HOTFIX_SEL_SPELL_FOCUS_OBJECT, "SELECT ID, Name FROM spell_focus_object ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_FOCUS_OBJECT, "SELECT ID, Name_lang FROM spell_focus_object_locale WHERE locale = ?", CONNECTION_SYNCH); + + // SpellInterrupts.db2 + PrepareStatement(HOTFIX_SEL_SPELL_INTERRUPTS, "SELECT ID, SpellID, AuraInterruptFlags1, AuraInterruptFlags2, ChannelInterruptFlags1, " + "ChannelInterruptFlags2, InterruptFlags, DifficultyID FROM spell_interrupts ORDER BY ID DESC", CONNECTION_SYNCH); // SpellItemEnchantmentCondition.db2 PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION, "SELECT ID, LTOperandType1, LTOperandType2, LTOperandType3, LTOperandType4, " @@ -429,19 +589,22 @@ void HotfixDatabaseConnection::DoPrepareStatements() // SpellLearnSpell.db2 PrepareStatement(HOTFIX_SEL_SPELL_LEARN_SPELL, "SELECT ID, LearnSpellID, SpellID, OverridesSpellID FROM spell_learn_spell ORDER BY ID DESC", CONNECTION_SYNCH); + // SpellLevels.db2 + PrepareStatement(HOTFIX_SEL_SPELL_LEVELS, "SELECT ID, SpellID, BaseLevel, MaxLevel, SpellLevel, DifficultyID FROM spell_levels ORDER BY ID DESC", CONNECTION_SYNCH); + // SpellMisc.db2 PrepareStatement(HOTFIX_SEL_SPELL_MISC, "SELECT ID, Attributes, AttributesEx, AttributesExB, AttributesExC, AttributesExD, AttributesExE, " - "AttributesExF, AttributesExG, AttributesExH, AttributesExI, AttributesExJ, AttributesExK, AttributesExL, AttributesExM, CastingTimeIndex, " - "DurationIndex, RangeIndex, Speed, SpellIconID, ActiveIconID, SchoolMask, MultistrikeSpeedMod FROM spell_misc ORDER BY ID DESC", CONNECTION_SYNCH); + "AttributesExF, AttributesExG, AttributesExH, AttributesExI, AttributesExJ, AttributesExK, AttributesExL, AttributesExM, Speed, " + "MultistrikeSpeedMod, CastingTimeIndex, DurationIndex, RangeIndex, SpellIconID, ActiveIconID, SchoolMask FROM spell_misc ORDER BY ID DESC", CONNECTION_SYNCH); // SpellPower.db2 - PrepareStatement(HOTFIX_SEL_SPELL_POWER, "SELECT ID, SpellID, PowerIndex, PowerType, ManaCost, ManaCostPerLevel, ManaCostPerSecond, " - "ManaCostAdditional, PowerDisplayID, UnitPowerBarID, ManaCostPercentage, ManaCostPercentagePerSecond, RequiredAura, HealthCostPercentage" + PrepareStatement(HOTFIX_SEL_SPELL_POWER, "SELECT ID, SpellID, ManaCost, ManaCostPercentage, ManaCostPercentagePerSecond, RequiredAura, " + "HealthCostPercentage, ManaCostPerSecond, ManaCostAdditional, PowerDisplayID, UnitPowerBarID, PowerIndex, PowerType, ManaCostPerLevel" " FROM spell_power ORDER BY ID DESC", CONNECTION_SYNCH); // SpellPowerDifficulty.db2 - PrepareStatement(HOTFIX_SEL_SPELL_POWER_DIFFICULTY, "SELECT SpellPowerID, DifficultyID, PowerIndex FROM spell_power_difficulty" - " ORDER BY SpellPowerID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_POWER_DIFFICULTY, "SELECT ID, SpellPowerID, DifficultyID, PowerIndex FROM spell_power_difficulty" + " ORDER BY ID DESC", CONNECTION_SYNCH); // SpellProcsPerMinute.db2 PrepareStatement(HOTFIX_SEL_SPELL_PROCS_PER_MINUTE, "SELECT ID, BaseProcRate, Flags FROM spell_procs_per_minute ORDER BY ID DESC", CONNECTION_SYNCH); @@ -454,45 +617,60 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_SPELL_RADIUS, "SELECT ID, Radius, RadiusPerLevel, RadiusMin, RadiusMax FROM spell_radius ORDER BY ID DESC", CONNECTION_SYNCH); // SpellRange.db2 - PrepareStatement(HOTFIX_SEL_SPELL_RANGE, "SELECT ID, MinRangeHostile, MinRangeFriend, MaxRangeHostile, MaxRangeFriend, Flags, DisplayName, " - "DisplayNameShort FROM spell_range ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_RANGE, "SELECT ID, MinRangeHostile, MinRangeFriend, MaxRangeHostile, MaxRangeFriend, DisplayName, " + "DisplayNameShort, Flags FROM spell_range ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_RANGE, "SELECT ID, DisplayName_lang, DisplayNameShort_lang FROM spell_range_locale WHERE locale = ?", CONNECTION_SYNCH); // SpellReagents.db2 - PrepareStatement(HOTFIX_SEL_SPELL_REAGENTS, "SELECT ID, Reagent1, Reagent2, Reagent3, Reagent4, Reagent5, Reagent6, Reagent7, Reagent8, " + PrepareStatement(HOTFIX_SEL_SPELL_REAGENTS, "SELECT ID, SpellID, Reagent1, Reagent2, Reagent3, Reagent4, Reagent5, Reagent6, Reagent7, Reagent8, " "ReagentCount1, ReagentCount2, ReagentCount3, ReagentCount4, ReagentCount5, ReagentCount6, ReagentCount7, ReagentCount8 FROM spell_reagents" " ORDER BY ID DESC", CONNECTION_SYNCH); - // SpellRuneCost.db2 - PrepareStatement(HOTFIX_SEL_SPELL_RUNE_COST, "SELECT ID, Blood, Unholy, Frost, Chromatic, RunicPower FROM spell_rune_cost" + // SpellScaling.db2 + PrepareStatement(HOTFIX_SEL_SPELL_SCALING, "SELECT ID, SpellID, ScalesFromItemLevel, ScalingClass, MaxScalingLevel FROM spell_scaling" " ORDER BY ID DESC", CONNECTION_SYNCH); + // SpellShapeshift.db2 + PrepareStatement(HOTFIX_SEL_SPELL_SHAPESHIFT, "SELECT ID, SpellID, ShapeshiftExclude1, ShapeshiftExclude2, ShapeshiftMask1, ShapeshiftMask2, " + "StanceBarOrder FROM spell_shapeshift ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellShapeshiftForm.db2 + PrepareStatement(HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name, WeaponDamageVariance, Flags, AttackIconID, CombatRoundTime, " + "CreatureDisplayID1, CreatureDisplayID2, CreatureDisplayID3, CreatureDisplayID4, PresetSpellID1, PresetSpellID2, PresetSpellID3, " + "PresetSpellID4, PresetSpellID5, PresetSpellID6, PresetSpellID7, PresetSpellID8, CreatureType, MountTypeID, BonusActionBar" + " FROM spell_shapeshift_form ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name_lang FROM spell_shapeshift_form_locale WHERE locale = ?", CONNECTION_SYNCH); + + // SpellTargetRestrictions.db2 + PrepareStatement(HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS, "SELECT ID, SpellID, ConeAngle, Width, Targets, MaxTargetLevel, TargetCreatureType, " + "DifficultyID, MaxAffectedTargets FROM spell_target_restrictions ORDER BY ID DESC", CONNECTION_SYNCH); + // SpellTotems.db2 - PrepareStatement(HOTFIX_SEL_SPELL_TOTEMS, "SELECT ID, RequiredTotemCategoryID1, RequiredTotemCategoryID2, Totem1, Totem2 FROM spell_totems" - " ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_TOTEMS, "SELECT ID, SpellID, Totem1, Totem2, RequiredTotemCategoryID1, RequiredTotemCategoryID2" + " FROM spell_totems ORDER BY ID DESC", CONNECTION_SYNCH); // SpellXSpellVisual.db2 - PrepareStatement(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, SpellID, DifficultyID, SpellVisualID1, SpellVisualID2, Unk620, PlayerConditionID, " + PrepareStatement(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, SpellID, Unk620, SpellVisualID1, SpellVisualID2, PlayerConditionID, DifficultyID, " "Flags FROM spell_x_spell_visual ORDER BY ID DESC", CONNECTION_SYNCH); // TaxiNodes.db2 - PrepareStatement(HOTFIX_SEL_TAXI_NODES, "SELECT ID, MapID, PosX, PosY, PosZ, Name, MountCreatureID1, MountCreatureID2, ConditionID, " - "LearnableIndex, Flags, MapOffsetX, MapOffsetY FROM taxi_nodes ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TAXI_NODES, "SELECT ID, PosX, PosY, PosZ, Name, MountCreatureID1, MountCreatureID2, MapOffsetX, MapOffsetY, MapID, " + "ConditionID, LearnableIndex, Flags FROM taxi_nodes ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_TAXI_NODES, "SELECT ID, Name_lang FROM taxi_nodes_locale WHERE locale = ?", CONNECTION_SYNCH); // TaxiPath.db2 PrepareStatement(HOTFIX_SEL_TAXI_PATH, "SELECT ID, `From`, `To`, Cost FROM taxi_path ORDER BY ID DESC", CONNECTION_SYNCH); // TaxiPathNode.db2 - PrepareStatement(HOTFIX_SEL_TAXI_PATH_NODE, "SELECT ID, PathID, NodeIndex, MapID, LocX, LocY, LocZ, Flags, Delay, ArrivalEventID, " - "DepartureEventID FROM taxi_path_node ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TAXI_PATH_NODE, "SELECT ID, LocX, LocY, LocZ, Delay, PathID, MapID, ArrivalEventID, DepartureEventID, NodeIndex, " + "Flags FROM taxi_path_node ORDER BY ID DESC", CONNECTION_SYNCH); // TotemCategory.db2 - PrepareStatement(HOTFIX_SEL_TOTEM_CATEGORY, "SELECT ID, Name, CategoryType, CategoryMask FROM totem_category ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TOTEM_CATEGORY, "SELECT ID, Name, CategoryMask, CategoryType FROM totem_category ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_TOTEM_CATEGORY, "SELECT ID, Name_lang FROM totem_category_locale WHERE locale = ?", CONNECTION_SYNCH); // Toy.db2 - PrepareStatement(HOTFIX_SEL_TOY, "SELECT ID, ItemID, Flags, Description, CategoryFilter FROM toy ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TOY, "SELECT ID, ItemID, Description, Flags, CategoryFilter FROM toy ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_TOY, "SELECT ID, Description_lang FROM toy_locale WHERE locale = ?", CONNECTION_SYNCH); // TransportAnimation.db2 @@ -503,15 +681,18 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_TRANSPORT_ROTATION, "SELECT ID, TransportID, TimeIndex, X, Y, Z, W FROM transport_rotation ORDER BY ID DESC", CONNECTION_SYNCH); // UnitPowerBar.db2 - PrepareStatement(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, MinPower, MaxPower, StartPower, CenterPower, RegenerationPeace, RegenerationCombat, " - "BarType, FileDataID1, FileDataID2, FileDataID3, FileDataID4, FileDataID5, FileDataID6, Color1, Color2, Color3, Color4, Color5, Color6, " - "Flags, Name, Cost, OutOfError, ToolTip, StartInset, EndInset FROM unit_power_bar ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, MaxPower, RegenerationPeace, RegenerationCombat, FileDataID1, FileDataID2, FileDataID3, " + "FileDataID4, FileDataID5, FileDataID6, Color1, Color2, Color3, Color4, Color5, Color6, Name, Cost, OutOfError, ToolTip, StartInset, " + "EndInset, StartPower, Flags, MinPower, CenterPower, BarType FROM unit_power_bar ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, Name_lang, Cost_lang, OutOfError_lang, ToolTip_lang FROM unit_power_bar_locale" " WHERE locale = ?", CONNECTION_SYNCH); // WorldMapOverlay.db2 - PrepareStatement(HOTFIX_SEL_WORLD_MAP_OVERLAY, "SELECT ID, MapAreaID, AreaID1, AreaID2, AreaID3, AreaID4, TextureName, TextureWidth, " + PrepareStatement(HOTFIX_SEL_WORLD_MAP_OVERLAY, "SELECT ID, TextureName, MapAreaID, AreaID1, AreaID2, AreaID3, AreaID4, TextureWidth, " "TextureHeight, OffsetX, OffsetY, HitRectTop, HitRectLeft, HitRectBottom, HitRectRight, PlayerConditionID FROM world_map_overlay" " ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_WORLD_MAP_OVERLAY, "SELECT ID, TextureName_lang FROM world_map_overlay_locale WHERE locale = ?", CONNECTION_SYNCH); + + // WorldMapTransforms.db2 + PrepareStatement(HOTFIX_SEL_WORLD_MAP_TRANSFORMS, "SELECT ID, RegionMinX, RegionMinY, RegionMinZ, RegionMaxX, RegionMaxY, RegionMaxZ, " + "RegionOffsetX, RegionOffsetY, RegionScale, MapID, NewMapID, NewDungeonMapID, NewAreaID, Flags FROM world_map_transforms ORDER BY ID DESC", CONNECTION_SYNCH); } diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index 999c9316dad..322df76d74d 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -35,11 +35,17 @@ enum HotfixDatabaseStatements HOTFIX_SEL_ACHIEVEMENT, HOTFIX_SEL_ACHIEVEMENT_LOCALE, + HOTFIX_SEL_ANIM_KIT, + HOTFIX_SEL_AREA_GROUP_MEMBER, + HOTFIX_SEL_ARMOR_LOCATION, + HOTFIX_SEL_AUCTION_HOUSE, HOTFIX_SEL_AUCTION_HOUSE_LOCALE, + HOTFIX_SEL_BANK_BAG_SLOT_PRICES, + HOTFIX_SEL_BARBER_SHOP_STYLE, HOTFIX_SEL_BARBER_SHOP_STYLE_LOCALE, @@ -59,10 +65,14 @@ enum HotfixDatabaseStatements HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES, + HOTFIX_SEL_CHR_RACES, + HOTFIX_SEL_CHR_RACES_LOCALE, + HOTFIX_SEL_CINEMATIC_SEQUENCES, HOTFIX_SEL_CREATURE_DISPLAY_INFO, - HOTFIX_SEL_CREATURE_DISPLAY_INFO_LOCALE, + + HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA, HOTFIX_SEL_CREATURE_TYPE, HOTFIX_SEL_CREATURE_TYPE_LOCALE, @@ -79,11 +89,17 @@ enum HotfixDatabaseStatements HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA, + HOTFIX_SEL_DURABILITY_COSTS, + HOTFIX_SEL_DURABILITY_QUALITY, + HOTFIX_SEL_EMOTES_TEXT_SOUND, + HOTFIX_SEL_GAMEOBJECTS, HOTFIX_SEL_GAMEOBJECTS_LOCALE, + HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO, + HOTFIX_SEL_GAME_TABLES, HOTFIX_SEL_GAME_TABLES_LOCALE, @@ -117,13 +133,18 @@ enum HotfixDatabaseStatements HOTFIX_SEL_GLYPH_SLOT, + HOTFIX_SEL_GUILD_COLOR_BACKGROUND, + + HOTFIX_SEL_GUILD_COLOR_BORDER, + + HOTFIX_SEL_GUILD_COLOR_EMBLEM, + HOTFIX_SEL_GUILD_PERK_SPELLS, HOTFIX_SEL_HEIRLOOM, HOTFIX_SEL_HEIRLOOM_LOCALE, HOTFIX_SEL_HOLIDAYS, - HOTFIX_SEL_HOLIDAYS_LOCALE, HOTFIX_SEL_IMPORT_PRICE_ARMOR, @@ -133,8 +154,19 @@ enum HotfixDatabaseStatements HOTFIX_SEL_IMPORT_PRICE_WEAPON, + HOTFIX_SEL_ITEM, + HOTFIX_SEL_ITEM_APPEARANCE, + HOTFIX_SEL_ITEM_ARMOR_QUALITY, + + HOTFIX_SEL_ITEM_ARMOR_SHIELD, + + HOTFIX_SEL_ITEM_ARMOR_TOTAL, + + HOTFIX_SEL_ITEM_BAG_FAMILY, + HOTFIX_SEL_ITEM_BAG_FAMILY_LOCALE, + HOTFIX_SEL_ITEM_BONUS, HOTFIX_SEL_ITEM_BONUS_TREE_NODE, @@ -144,12 +176,20 @@ enum HotfixDatabaseStatements HOTFIX_SEL_ITEM_CURRENCY_COST, + HOTFIX_SEL_ITEM_DAMAGE_AMMO, + + HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND, + + HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER, + + HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND, + + HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER, + HOTFIX_SEL_ITEM_DISENCHANT_LOOT, HOTFIX_SEL_ITEM_EFFECT, - HOTFIX_SEL_ITEM, - HOTFIX_SEL_ITEM_EXTENDED_COST, HOTFIX_SEL_ITEM_LIMIT_CATEGORY, @@ -165,6 +205,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_ITEM_RANDOM_SUFFIX, HOTFIX_SEL_ITEM_RANDOM_SUFFIX_LOCALE, + HOTFIX_SEL_ITEM_SET_SPELL, + HOTFIX_SEL_ITEM_SPARSE, HOTFIX_SEL_ITEM_SPARSE_LOCALE, @@ -190,6 +232,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY, + HOTFIX_SEL_MOVIE, + HOTFIX_SEL_NAME_GEN, HOTFIX_SEL_NAME_GEN_LOCALE, @@ -206,6 +250,10 @@ enum HotfixDatabaseStatements HOTFIX_SEL_PLAYER_CONDITION, HOTFIX_SEL_PLAYER_CONDITION_LOCALE, + HOTFIX_SEL_POWER_DISPLAY, + + HOTFIX_SEL_QUEST_FACTION_REWARD, + HOTFIX_SEL_QUEST_MONEY_REWARD, HOTFIX_SEL_QUEST_PACKAGE_ITEM, @@ -217,28 +265,62 @@ enum HotfixDatabaseStatements HOTFIX_SEL_QUEST_XP, + HOTFIX_SEL_RAND_PROP_POINTS, + HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, - HOTFIX_SEL_SOUND_ENTRIES, - HOTFIX_SEL_SOUND_ENTRIES_LOCALE, + HOTFIX_SEL_SKILL_LINE, + HOTFIX_SEL_SKILL_LINE_LOCALE, + + HOTFIX_SEL_SKILL_LINE_ABILITY, + + HOTFIX_SEL_SKILL_RACE_CLASS_INFO, + + HOTFIX_SEL_SOUND_KIT, + HOTFIX_SEL_SOUND_KIT_LOCALE, HOTFIX_SEL_SPECIALIZATION_SPELLS, HOTFIX_SEL_SPECIALIZATION_SPELLS_LOCALE, + HOTFIX_SEL_SPELL, + HOTFIX_SEL_SPELL_LOCALE, + + HOTFIX_SEL_SPELL_AURA_OPTIONS, + HOTFIX_SEL_SPELL_AURA_RESTRICTIONS, + HOTFIX_SEL_SPELL_CAST_TIMES, + HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS, - HOTFIX_SEL_SPELL_CAST_TIMES, + HOTFIX_SEL_SPELL_CATEGORIES, + + HOTFIX_SEL_SPELL_CATEGORY, + HOTFIX_SEL_SPELL_CATEGORY_LOCALE, HOTFIX_SEL_SPELL_CLASS_OPTIONS, + HOTFIX_SEL_SPELL_COOLDOWNS, + HOTFIX_SEL_SPELL_DURATION, + HOTFIX_SEL_SPELL_EFFECT, + + HOTFIX_SEL_SPELL_EFFECT_SCALING, + + HOTFIX_SEL_SPELL_EQUIPPED_ITEMS, + + HOTFIX_SEL_SPELL_FOCUS_OBJECT, + HOTFIX_SEL_SPELL_FOCUS_OBJECT_LOCALE, + + HOTFIX_SEL_SPELL_INTERRUPTS, + HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION, HOTFIX_SEL_SPELL_LEARN_SPELL, + HOTFIX_SEL_SPELL_LEVELS, + HOTFIX_SEL_SPELL_MISC, HOTFIX_SEL_SPELL_POWER, @@ -256,7 +338,14 @@ enum HotfixDatabaseStatements HOTFIX_SEL_SPELL_REAGENTS, - HOTFIX_SEL_SPELL_RUNE_COST, + HOTFIX_SEL_SPELL_SCALING, + + HOTFIX_SEL_SPELL_SHAPESHIFT, + + HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, + HOTFIX_SEL_SPELL_SHAPESHIFT_FORM_LOCALE, + + HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS, HOTFIX_SEL_SPELL_TOTEMS, @@ -283,7 +372,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_UNIT_POWER_BAR_LOCALE, HOTFIX_SEL_WORLD_MAP_OVERLAY, - HOTFIX_SEL_WORLD_MAP_OVERLAY_LOCALE, + + HOTFIX_SEL_WORLD_MAP_TRANSFORMS, MAX_HOTFIXDATABASE_STATEMENTS }; diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index e60b9776cba..4f2298858ca 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -165,7 +165,7 @@ void ScriptedAI::DoPlaySoundToSet(WorldObject* source, uint32 soundId) if (!source) return; - if (!sSoundEntriesStore.LookupEntry(soundId)) + if (!sSoundKitStore.LookupEntry(soundId)) { TC_LOG_ERROR("scripts", "Invalid soundId %u used in DoPlaySoundToSet (Source: %s)", soundId, source->GetGUID().ToString().c_str()); return; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 85c5e2f017a..c47bbfb3282 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -1647,7 +1647,7 @@ class TC_GAME_API SmartAIMgr bool IsSoundValid(SmartScriptHolder const& e, uint32 entry) { - if (!sSoundEntriesStore.LookupEntry(entry)) + if (!sSoundKitStore.LookupEntry(entry)) { TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " SourceType %u Event %u Action %u uses non-existent Sound entry %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), entry); return false; diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 642c21e3ff1..f4b51eba6f4 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -924,6 +924,12 @@ CriteriaList const& GuildAchievementMgr::GetCriteriaByType(CriteriaTypes type) c return sCriteriaMgr->GetGuildCriteriaByType(type); } +bool PlayerAchievementMgr::ModifierTreeSatisfied(uint32 modifierTreeId) const +{ + return AdditionalRequirementsSatisfied(sAchievementMgr->GetModifierTree(modifierTreeId), 0, 0, nullptr, _owner); +} + + std::string PlayerAchievementMgr::GetOwnerInfo() const { return Trinity::StringFormat("%s %s", _owner->GetGUID().ToString().c_str(), _owner->GetName().c_str()); diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index b937f2194e2..3e2ec0ef7ff 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -513,7 +513,7 @@ void AuctionHouseMgr::Update() mNeutralAuctions.Update(); } -AuctionHouseEntry const* AuctionHouseMgr::GetAuctionHouseEntry(uint32 factionTemplateId) +AuctionHouseEntry const* AuctionHouseMgr::GetAuctionHouseEntry(uint32 factionTemplateId, uint32* houseId) { uint32 houseid = 7; // goblin auction house @@ -550,6 +550,9 @@ AuctionHouseEntry const* AuctionHouseMgr::GetAuctionHouseEntry(uint32 factionTem } } + if (houseId) + *houseId = houseid; + return sAuctionHouseStore.LookupEntry(houseid); } @@ -904,7 +907,7 @@ bool AuctionEntry::LoadFromDB(Field* fields) } factionTemplateId = auctioneerInfo->faction; - auctionHouseEntry = AuctionHouseMgr::GetAuctionHouseEntry(factionTemplateId); + auctionHouseEntry = AuctionHouseMgr::GetAuctionHouseEntry(factionTemplateId, &houseId); if (!auctionHouseEntry) { TC_LOG_ERROR("misc", "Auction %u has auctioneer (GUID : " UI64FMTD " Entry: %u) with wrong faction %u", Id, auctioneer, auctioneerData->id, factionTemplateId); diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h index 17b72a24c22..160cab40771 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.h +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h @@ -79,11 +79,12 @@ struct TC_GAME_API AuctionEntry ObjectGuid::LowType bidder; uint32 deposit; //deposit can be calculated only when creating auction uint32 etime; + uint32 houseId; AuctionHouseEntry const* auctionHouseEntry; // in AuctionHouse.dbc uint32 factionTemplateId; // helpers - uint32 GetHouseId() const { return auctionHouseEntry->ID; } + uint32 GetHouseId() const { return houseId; } uint32 GetHouseFaction() const { return auctionHouseEntry->FactionID; } uint32 GetAuctionCut() const; uint32 GetAuctionOutBid() const; @@ -188,7 +189,7 @@ class TC_GAME_API AuctionHouseMgr void SendAuctionCancelledToBidderMail(AuctionEntry* auction, SQLTransaction& trans); static uint32 GetAuctionDeposit(AuctionHouseEntry const* entry, uint32 time, Item* pItem, uint32 count); - static AuctionHouseEntry const* GetAuctionHouseEntry(uint32 factionTemplateId); + static AuctionHouseEntry const* GetAuctionHouseEntry(uint32 factionTemplateId, uint32* houseId); public: diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp index 8a45d40988d..d7e17b266f3 100644 --- a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp +++ b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp @@ -1026,6 +1026,7 @@ void AuctionBotSeller::AddNewAuctions(SellerConfiguration& config) auctionEntry->bidder = UI64LIT(0); auctionEntry->bid = 0; auctionEntry->deposit = sAuctionMgr->GetAuctionDeposit(ahEntry, etime, item, stackCount); + auctionEntry->houseId = houseid; auctionEntry->auctionHouseEntry = ahEntry; auctionEntry->expire_time = time(NULL) + urand(config.GetMinTime(), config.GetMaxTime()) * HOUR; diff --git a/src/server/game/Chat/ChatLink.cpp b/src/server/game/Chat/ChatLink.cpp index 3e523cad4fb..c11c25219a5 100644 --- a/src/server/game/Chat/ChatLink.cpp +++ b/src/server/game/Chat/ChatLink.cpp @@ -348,18 +348,23 @@ bool SpellChatLink::ValidateName(char* buffer, const char* context) return false; } - uint32 skillLineNameLength = strlen(skillLine->DisplayName_lang); - if (skillLineNameLength > 0 && strncmp(skillLine->DisplayName_lang, buffer, skillLineNameLength) == 0) + for (uint8 i = 0; i < TOTAL_LOCALES; ++i) { - // found the prefix, remove it to perform spellname validation below - // -2 = strlen(": ") - uint32 spellNameLength = strlen(buffer) - skillLineNameLength - 2; - memmove(buffer, buffer + skillLineNameLength + 2, spellNameLength + 1); + uint32 skillLineNameLength = strlen(skillLine->DisplayName->Str[i]); + if (skillLineNameLength > 0 && strncmp(skillLine->DisplayName->Str[i], buffer, skillLineNameLength) == 0) + { + // found the prefix, remove it to perform spellname validation below + // -2 = strlen(": ") + uint32 spellNameLength = strlen(buffer) - skillLineNameLength - 2; + memmove(buffer, buffer + skillLineNameLength + 2, spellNameLength + 1); + break; + } } } - if (*_spell->SpellName && strcmp(_spell->SpellName, buffer) == 0) - return true; + for (uint8 i = 0; i < TOTAL_LOCALES; ++i) + if (*_spell->SpellName->Str[i] && strcmp(_spell->SpellName->Str[i], buffer) == 0) + return true; TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): linked spell (id: %u) name wasn't found in any localization", context, _spell->Id); return false; diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 2ff7196a2dc..a1ca9bd5f73 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -2621,8 +2621,15 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player* player, PlayerConditionEntry std::array<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* player, PlayerConditionEntry if (condition->MaxAvgEquippedItemLevel && uint32(std::floor(player->GetFloatValue(PLAYER_FIELD_AVG_ITEM_LEVEL + 1))) > condition->MaxAvgEquippedItemLevel) return false; + if (condition->ModifierTreeID && !player->ModifierTreeSatisfied(condition->ModifierTreeID)) + return false; + return true; } diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 2fd9c22b080..ae01936ff0e 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -25,8 +25,11 @@ #include "World.h" DB2Storage<AchievementEntry> sAchievementStore("Achievement.db2", AchievementFormat, HOTFIX_SEL_ACHIEVEMENT); +DB2Storage<AnimKitEntry> sAnimKitStore("AnimKit.db2", AnimKitFormat, HOTFIX_SEL_ANIM_KIT); DB2Storage<AreaGroupMemberEntry> sAreaGroupMemberStore("AreaGroupMember.db2", AreaGroupMemberFormat, HOTFIX_SEL_AREA_GROUP_MEMBER); +DB2Storage<ArmorLocationEntry> sArmorLocationStore("ArmorLocation.db2", ArmorLocationFormat, HOTFIX_SEL_ARMOR_LOCATION); DB2Storage<AuctionHouseEntry> sAuctionHouseStore("AuctionHouse.db2", AuctionHouseFormat, HOTFIX_SEL_AUCTION_HOUSE); +DB2Storage<BankBagSlotPricesEntry> sBankBagSlotPricesStore("BankBagSlotPrices.db2", BankBagSlotPricesFormat, HOTFIX_SEL_BANK_BAG_SLOT_PRICES); 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); @@ -35,16 +38,21 @@ DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore("Bat 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<ChrRacesEntry> sChrRacesStore("ChrRaces.db2", ChrRacesFormat, HOTFIX_SEL_CHR_RACES); DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore("CinematicSequences.db2", CinematicSequencesFormat, HOTFIX_SEL_CINEMATIC_SEQUENCES); DB2Storage<CreatureDisplayInfoEntry> sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", CreatureDisplayInfoFormat, HOTFIX_SEL_CREATURE_DISPLAY_INFO); +DB2Storage<CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore("CreatureDisplayInfoExtra.db2", CreatureDisplayInfoExtraFormat, HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA); 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<DurabilityCostsEntry> sDurabilityCostsStore("DurabilityCosts.db2", DurabilityCostsFormat, HOTFIX_SEL_DURABILITY_COSTS); DB2Storage<DurabilityQualityEntry> sDurabilityQualityStore("DurabilityQuality.db2", DurabilityQualityFormat, HOTFIX_SEL_DURABILITY_QUALITY); +DB2Storage<EmotesTextSoundEntry> sEmotesTextSoundStore("EmotesTextSound.db2", EmotesTextSoundFormat, HOTFIX_SEL_EMOTES_TEXT_SOUND); DB2Storage<GameObjectsEntry> sGameObjectsStore("GameObjects.db2", GameObjectsFormat, HOTFIX_SEL_GAMEOBJECTS); +DB2Storage<GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore("GameObjectDisplayInfo.db2", GameObjectDisplayInfoFormat, HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO); 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); @@ -58,6 +66,9 @@ DB2Storage<GarrPlotInstanceEntry> sGarrPlotInstanceStore("GarrPlot 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<GuildColorBackgroundEntry> sGuildColorBackgroundStore("GuildColorBackground.db2", GuildColorBackgroundFormat, HOTFIX_SEL_GUILD_COLOR_BACKGROUND); +DB2Storage<GuildColorBorderEntry> sGuildColorBorderStore("GuildColorBorder.db2", GuildColorBorderFormat, HOTFIX_SEL_GUILD_COLOR_BORDER); +DB2Storage<GuildColorEmblemEntry> sGuildColorEmblemStore("GuildColorEmblem.db2", GuildColorEmblemFormat, HOTFIX_SEL_GUILD_COLOR_EMBLEM); 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); @@ -66,10 +77,19 @@ DB2Storage<ImportPriceQualityEntry> sImportPriceQualityStore("Import 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<ItemArmorQualityEntry> sItemArmorQualityStore("ItemArmorQuality.db2", ItemArmorQualityFormat, HOTFIX_SEL_ITEM_ARMOR_QUALITY); +DB2Storage<ItemArmorShieldEntry> sItemArmorShieldStore("ItemArmorShield.db2", ItemArmorShieldFormat, HOTFIX_SEL_ITEM_ARMOR_SHIELD); +DB2Storage<ItemArmorTotalEntry> sItemArmorTotalStore("ItemArmorTotal.db2", ItemArmorTotalFormat, HOTFIX_SEL_ITEM_ARMOR_TOTAL); +DB2Storage<ItemBagFamilyEntry> sItemBagFamilyStore("ItemBagFamily.db2", ItemBagFamilyFormat, HOTFIX_SEL_ITEM_BAG_FAMILY); 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<ItemDamageAmmoEntry> sItemDamageAmmoStore("ItemDamageAmmo.db2", ItemDamageAmmoFormat, HOTFIX_SEL_ITEM_DAMAGE_AMMO); +DB2Storage<ItemDamageOneHandEntry> sItemDamageOneHandStore("ItemDamageOneHand.db2", ItemDamageOneHandFormat, HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND); +DB2Storage<ItemDamageOneHandCasterEntry> sItemDamageOneHandCasterStore("ItemDamageOneHandCaster.db2", ItemDamageOneHandCasterFormat, HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER); +DB2Storage<ItemDamageTwoHandEntry> sItemDamageTwoHandStore("ItemDamageTwoHand.db2", ItemDamageTwoHandFormat, HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND); +DB2Storage<ItemDamageTwoHandCasterEntry> sItemDamageTwoHandCasterStore("ItemDamageTwoHandCaster.db2", ItemDamageTwoHandCasterFormat, HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER); 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); @@ -79,7 +99,8 @@ DB2Storage<ItemModifiedAppearanceEntry> sItemModifiedAppearanceStore("It 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<ItemSetSpellEntry> sItemSetSpellStore("ItemSetSpell.db2", ItemSetSpellFormat, HOTFIX_SEL_ITEM_SET_SPELL); +DB2SparseStorage<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); @@ -90,6 +111,7 @@ DB2Storage<ModifierTreeEntry> sModifierTreeStore("ModifierTree 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<MovieEntry> sMovieStore("Movie.db2", MovieFormat, HOTFIX_SEL_MOVIE); 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); @@ -97,21 +119,38 @@ DB2Storage<NamesReservedLocaleEntry> sNamesReservedLocaleStore("Names 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<PowerDisplayEntry> sPowerDisplayStore("PowerDisplay.db2", PowerDisplayFormat, HOTFIX_SEL_POWER_DISPLAY); +DB2Storage<QuestFactionRewardEntry> sQuestFactionRewardStore("QuestFactionReward.db2", QuestFactionRewardFormat, HOTFIX_SEL_QUEST_FACTION_REWARD); DB2Storage<QuestMoneyRewardEntry> sQuestMoneyRewardStore("QuestMoneyReward.db2", QuestMoneyRewardFormat, HOTFIX_SEL_QUEST_MONEY_REWARD); -DB2Storage<QuestPackageItemEntry> sQuestPackageItemStore("QuestPackageItem.db2", QuestPackageItemfmt, HOTFIX_SEL_QUEST_PACKAGE_ITEM); +DB2Storage<QuestPackageItemEntry> sQuestPackageItemStore("QuestPackageItem.db2", QuestPackageItemFormat, 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<RandPropPointsEntry> sRandPropPointsStore("RandPropPoints.db2", RandPropPointsFormat, HOTFIX_SEL_RAND_PROP_POINTS); DB2Storage<ScalingStatDistributionEntry> sScalingStatDistributionStore("ScalingStatDistribution.db2", ScalingStatDistributionFormat, HOTFIX_SEL_SCALING_STAT_DISTRIBUTION); -DB2Storage<SoundEntriesEntry> sSoundEntriesStore("SoundEntries.db2", SoundEntriesFormat, HOTFIX_SEL_SOUND_ENTRIES); +DB2Storage<SkillLineEntry> sSkillLineStore("SkillLine.db2", SkillLineFormat, HOTFIX_SEL_SKILL_LINE); +DB2Storage<SkillLineAbilityEntry> sSkillLineAbilityStore("SkillLineAbility.db2", SkillLineAbilityFormat, HOTFIX_SEL_SKILL_LINE_ABILITY); +DB2Storage<SkillRaceClassInfoEntry> sSkillRaceClassInfoStore("SkillRaceClassInfo.db2", SkillRaceClassInfoFormat, HOTFIX_SEL_SKILL_RACE_CLASS_INFO); +DB2Storage<SoundKitEntry> sSoundKitStore("SoundKit.db2", SoundKitFormat, HOTFIX_SEL_SOUND_KIT); DB2Storage<SpecializationSpellsEntry> sSpecializationSpellsStore("SpecializationSpells.db2", SpecializationSpellsFormat, HOTFIX_SEL_SPECIALIZATION_SPELLS); +DB2Storage<SpellEntry> sSpellStore("Spell.db2", SpellFormat, HOTFIX_SEL_SPELL); +DB2Storage<SpellAuraOptionsEntry> sSpellAuraOptionsStore("SpellAuraOptions.db2", SpellAuraOptionsFormat, HOTFIX_SEL_SPELL_AURA_OPTIONS); 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<SpellCategoriesEntry> sSpellCategoriesStore("SpellCategories.db2", SpellCategoriesFormat, HOTFIX_SEL_SPELL_CATEGORIES); +DB2Storage<SpellCategoryEntry> sSpellCategoryStore("SpellCategory.db2", SpellCategoryFormat, HOTFIX_SEL_SPELL_CATEGORY); DB2Storage<SpellClassOptionsEntry> sSpellClassOptionsStore("SpellClassOptions.db2", SpellClassOptionsFormat, HOTFIX_SEL_SPELL_CLASS_OPTIONS); +DB2Storage<SpellCooldownsEntry> sSpellCooldownsStore("SpellCooldowns.db2", SpellCooldownsFormat, HOTFIX_SEL_SPELL_COOLDOWNS); DB2Storage<SpellDurationEntry> sSpellDurationStore("SpellDuration.db2", SpellDurationFormat, HOTFIX_SEL_SPELL_DURATION); +DB2Storage<SpellEffectEntry> sSpellEffectStore("SpellEffect.db2", SpellEffectFormat, HOTFIX_SEL_SPELL_EFFECT); +DB2Storage<SpellEffectScalingEntry> sSpellEffectScalingStore("SpellEffectScaling.db2", SpellEffectScalingFormat, HOTFIX_SEL_SPELL_EFFECT_SCALING); +DB2Storage<SpellEquippedItemsEntry> sSpellEquippedItemsStore("SpellEquippedItems.db2", SpellEquippedItemsFormat, HOTFIX_SEL_SPELL_EQUIPPED_ITEMS); +DB2Storage<SpellFocusObjectEntry> sSpellFocusObjectStore("SpellFocusObject.db2", SpellFocusObjectFormat, HOTFIX_SEL_SPELL_FOCUS_OBJECT); +DB2Storage<SpellInterruptsEntry> sSpellInterruptsStore("SpellInterrupts.db2", SpellInterruptsFormat, HOTFIX_SEL_SPELL_INTERRUPTS); DB2Storage<SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore("SpellItemEnchantmentCondition.db2", SpellItemEnchantmentConditionFormat, HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION); DB2Storage<SpellLearnSpellEntry> sSpellLearnSpellStore("SpellLearnSpell.db2", SpellLearnSpellFormat, HOTFIX_SEL_SPELL_LEARN_SPELL); +DB2Storage<SpellLevelsEntry> sSpellLevelsStore("SpellLevels.db2", SpellLevelsFormat, HOTFIX_SEL_SPELL_LEVELS); 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); @@ -120,7 +159,10 @@ DB2Storage<SpellProcsPerMinuteModEntry> sSpellProcsPerMinuteModStore("Sp 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<SpellScalingEntry> sSpellScalingStore("SpellScaling.db2", SpellScalingFormat, HOTFIX_SEL_SPELL_SCALING); +DB2Storage<SpellShapeshiftEntry> sSpellShapeshiftStore("SpellShapeshift.db2", SpellShapeshiftFormat, HOTFIX_SEL_SPELL_SHAPESHIFT); +DB2Storage<SpellShapeshiftFormEntry> sSpellShapeshiftFormStore("SpellShapeshiftForm.db2", SpellShapeshiftFormFormat, HOTFIX_SEL_SPELL_SHAPESHIFT_FORM); +DB2Storage<SpellTargetRestrictionsEntry> sSpellTargetRestrictionsStore("SpellTargetRestrictions.db2", SpellTargetRestrictionsFormat, HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS); 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); @@ -132,6 +174,7 @@ DB2Storage<TransportAnimationEntry> sTransportAnimationStore("Transp 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<WorldMapTransformsEntry> sWorldMapTransformsStore("WorldMapTransforms.db2", WorldMapTransformsFormat, HOTFIX_SEL_WORLD_MAP_TRANSFORMS); TaxiMask sTaxiNodesMask; TaxiMask sOldContinentsNodesMask; @@ -140,12 +183,12 @@ TaxiMask sAllianceTaxiNodesMask; TaxiPathSetBySource sTaxiPathSetBySource; TaxiPathNodesByPath sTaxiPathNodesByPath; -typedef std::list<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), @@ -204,10 +247,13 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) DB2StoreProblemList bad_db2_files; uint32 availableDb2Locales = 0xFF; -#define LOAD_DB2(store) LoadDB2(availableDb2Locales, bad_db2_files, _stores, &store, db2Path, defaultLocale) +#define LOAD_DB2(store) LoadDB2(availableDb2Locales, bad_db2_files, _stores, &store, db2Path, defaultLocale, store) LOAD_DB2(sAchievementStore); + LOAD_DB2(sAnimKitStore); + LOAD_DB2(sArmorLocationStore); LOAD_DB2(sAreaGroupMemberStore); + LOAD_DB2(sBankBagSlotPricesStore); LOAD_DB2(sBattlePetBreedQualityStore); LOAD_DB2(sBattlePetBreedStateStore); LOAD_DB2(sAuctionHouseStore); @@ -217,16 +263,21 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sBroadcastTextStore); LOAD_DB2(sCharStartOutfitStore); LOAD_DB2(sChrClassesXPowerTypesStore); + LOAD_DB2(sChrRacesStore); LOAD_DB2(sCinematicSequencesStore); LOAD_DB2(sCreatureDisplayInfoStore); + LOAD_DB2(sCreatureDisplayInfoExtraStore); LOAD_DB2(sCreatureTypeStore); LOAD_DB2(sCriteriaStore); LOAD_DB2(sCriteriaTreeStore); LOAD_DB2(sCurrencyTypesStore); LOAD_DB2(sCurvePointStore); LOAD_DB2(sDestructibleModelDataStore); + LOAD_DB2(sDurabilityCostsStore); LOAD_DB2(sDurabilityQualityStore); + LOAD_DB2(sEmotesTextSoundStore); LOAD_DB2(sGameObjectsStore); + LOAD_DB2(sGameObjectDisplayInfoStore); LOAD_DB2(sGameTablesStore); LOAD_DB2(sGarrAbilityStore); LOAD_DB2(sGarrBuildingPlotInstStore); @@ -240,6 +291,9 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sGarrSiteLevelPlotInstStore); LOAD_DB2(sGarrSiteLevelStore); LOAD_DB2(sGlyphSlotStore); + LOAD_DB2(sGuildColorBackgroundStore); + LOAD_DB2(sGuildColorBorderStore); + LOAD_DB2(sGuildColorEmblemStore); LOAD_DB2(sGuildPerkSpellsStore); LOAD_DB2(sHeirloomStore); LOAD_DB2(sHolidaysStore); @@ -248,10 +302,19 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sImportPriceShieldStore); LOAD_DB2(sImportPriceWeaponStore); LOAD_DB2(sItemAppearanceStore); + LOAD_DB2(sItemArmorQualityStore); + LOAD_DB2(sItemArmorShieldStore); + LOAD_DB2(sItemArmorTotalStore); + LOAD_DB2(sItemBagFamilyStore); LOAD_DB2(sItemBonusStore); LOAD_DB2(sItemBonusTreeNodeStore); LOAD_DB2(sItemClassStore); LOAD_DB2(sItemCurrencyCostStore); + LOAD_DB2(sItemDamageAmmoStore); + LOAD_DB2(sItemDamageOneHandCasterStore); + LOAD_DB2(sItemDamageOneHandStore); + LOAD_DB2(sItemDamageTwoHandCasterStore); + LOAD_DB2(sItemDamageTwoHandStore); LOAD_DB2(sItemDisenchantLootStore); LOAD_DB2(sItemEffectStore); LOAD_DB2(sItemExtendedCostStore); @@ -260,6 +323,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sItemPriceBaseStore); LOAD_DB2(sItemRandomPropertiesStore); LOAD_DB2(sItemRandomSuffixStore); + LOAD_DB2(sItemSetSpellStore); LOAD_DB2(sItemSparseStore); LOAD_DB2(sItemSpecOverrideStore); LOAD_DB2(sItemSpecStore); @@ -272,6 +336,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sMountCapabilityStore); LOAD_DB2(sMountStore); LOAD_DB2(sMountTypeXCapabilityStore); + LOAD_DB2(sMovieStore); LOAD_DB2(sNameGenStore); LOAD_DB2(sNamesProfanityStore); LOAD_DB2(sNamesReservedStore); @@ -279,21 +344,37 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sOverrideSpellDataStore); LOAD_DB2(sPhaseXPhaseGroupStore); LOAD_DB2(sPlayerConditionStore); + LOAD_DB2(sPowerDisplayStore); + LOAD_DB2(sQuestFactionRewardStore); LOAD_DB2(sQuestMoneyRewardStore); LOAD_DB2(sQuestPackageItemStore); LOAD_DB2(sQuestSortStore); LOAD_DB2(sQuestV2Store); LOAD_DB2(sQuestXPStore); LOAD_DB2(sScalingStatDistributionStore); - LOAD_DB2(sSoundEntriesStore); + LOAD_DB2(sSkillLineStore); + LOAD_DB2(sSkillLineAbilityStore); + LOAD_DB2(sSkillRaceClassInfoStore); + LOAD_DB2(sSoundKitStore); LOAD_DB2(sSpecializationSpellsStore); + LOAD_DB2(sSpellStore); + LOAD_DB2(sSpellAuraOptionsStore); LOAD_DB2(sSpellAuraRestrictionsStore); LOAD_DB2(sSpellCastTimesStore); LOAD_DB2(sSpellCastingRequirementsStore); + LOAD_DB2(sSpellCategoriesStore); + LOAD_DB2(sSpellCategoryStore); LOAD_DB2(sSpellClassOptionsStore); + LOAD_DB2(sSpellCooldownsStore); LOAD_DB2(sSpellDurationStore); + LOAD_DB2(sSpellEffectScalingStore); + LOAD_DB2(sSpellEffectStore); + LOAD_DB2(sSpellEquippedItemsStore); + LOAD_DB2(sSpellFocusObjectStore); + LOAD_DB2(sSpellInterruptsStore); LOAD_DB2(sSpellItemEnchantmentConditionStore); LOAD_DB2(sSpellLearnSpellStore); + LOAD_DB2(sSpellLevelsStore); LOAD_DB2(sSpellMiscStore); LOAD_DB2(sSpellPowerStore); LOAD_DB2(sSpellPowerDifficultyStore); @@ -302,7 +383,10 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sSpellRadiusStore); LOAD_DB2(sSpellRangeStore); LOAD_DB2(sSpellReagentsStore); - LOAD_DB2(sSpellRuneCostStore); + LOAD_DB2(sSpellScalingStore); + LOAD_DB2(sSpellShapeshiftFormStore); + LOAD_DB2(sSpellShapeshiftStore); + LOAD_DB2(sSpellTargetRestrictionsStore); LOAD_DB2(sSpellTotemsStore); LOAD_DB2(sSpellXSpellVisualStore); LOAD_DB2(sTaxiNodesStore); @@ -314,6 +398,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sTransportRotationStore); LOAD_DB2(sUnitPowerBarStore); LOAD_DB2(sWorldMapOverlayStore); + LOAD_DB2(sWorldMapTransformsStore); #undef LOAD_DB2 @@ -323,21 +408,38 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) for (CharStartOutfitEntry const* outfit : sCharStartOutfitStore) _charStartOutfits[outfit->RaceID | (outfit->ClassID << 8) | (outfit->GenderID << 16)] = outfit; - sChrClassesXPowerTypesStore.Sort(&ChrClassesXPowerTypesEntryComparator::Compare); + std::set<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 : sChrClassesXPowerTypesStore) + for (ChrClassesXPowerTypesEntry const* power : powers) { uint32 index = 0; for (uint32 j = 0; j < MAX_POWERS; ++j) if (_powersByClass[power->ClassID][j] != MAX_POWERS) ++index; + ASSERT(power->PowerType < MAX_POWERS); _powersByClass[power->ClassID][power->PowerType] = index; } + for (EmotesTextSoundEntry const* emoteTextSound : sEmotesTextSoundStore) + _emoteTextSounds[EmotesTextSoundContainer::key_type(emoteTextSound->EmotesTextId, emoteTextSound->RaceId, emoteTextSound->SexId, emoteTextSound->ClassId)] = emoteTextSound; + + for (GameObjectDisplayInfoEntry const* gameObjectDisplayInfo : sGameObjectDisplayInfoStore) + { + if (gameObjectDisplayInfo->GeoBoxMax.X < gameObjectDisplayInfo->GeoBoxMin.X) + std::swap(*(float*)(&gameObjectDisplayInfo->GeoBoxMax.X), *(float*)(&gameObjectDisplayInfo->GeoBoxMin.X)); + if (gameObjectDisplayInfo->GeoBoxMax.Y < gameObjectDisplayInfo->GeoBoxMin.Y) + std::swap(*(float*)(&gameObjectDisplayInfo->GeoBoxMax.Y), *(float*)(&gameObjectDisplayInfo->GeoBoxMin.Y)); + if (gameObjectDisplayInfo->GeoBoxMax.Z < gameObjectDisplayInfo->GeoBoxMin.Z) + std::swap(*(float*)(&gameObjectDisplayInfo->GeoBoxMax.Z), *(float*)(&gameObjectDisplayInfo->GeoBoxMin.Z)); + } + for (GlyphSlotEntry const* glyphSlot : sGlyphSlotStore) if (glyphSlot->Type == GLYPH_SLOT_MAJOR || glyphSlot->Type == GLYPH_SLOT_MINOR) _glyphSlots.insert(glyphSlot); @@ -355,10 +457,16 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) } } + for (ItemCurrencyCostEntry const* itemCurrencyCost : sItemCurrencyCostStore) + _itemsWithCurrencyCost.insert(itemCurrencyCost->ItemId); + for (ItemModifiedAppearanceEntry const* appearanceMod : sItemModifiedAppearanceStore) if (ItemAppearanceEntry const* appearance = sItemAppearanceStore.LookupEntry(appearanceMod->AppearanceID)) _itemDisplayIDs[appearanceMod->ItemID | (appearanceMod->AppearanceModID << 24)] = appearance->DisplayID; + for (ItemSetSpellEntry const* entry : sItemSetSpellStore) + _itemSetSpells[entry->ItemSetID].push_back(entry); + for (ItemSpecOverrideEntry const* entry : sItemSpecOverrideStore) _itemSpecOverrides[entry->ItemID].push_back(entry); @@ -424,6 +532,10 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) for (QuestPackageItemEntry const* questPackageItem : sQuestPackageItemStore) _questPackages[questPackageItem->QuestPackageID].push_back(questPackageItem); + for (SkillRaceClassInfoEntry const* entry : sSkillRaceClassInfoStore) + if (sSkillLineStore.LookupEntry(entry->SkillID)) + _skillRaceClassInfoBySkill.insert(SkillRaceClassInfoContainer::value_type(entry->SkillID, entry)); + for (SpecializationSpellsEntry const* specSpells : sSpecializationSpellsStore) _specializationSpellsBySpec[specSpells->SpecID].push_back(specSpells); @@ -459,8 +571,8 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) std::vector<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 @@ -528,7 +640,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) else if (!bad_db2_files.empty()) { std::string str; - for (std::list<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 +648,9 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) } // Check loaded DB2 files proper version - if (!sItemStore.LookupEntry(128706) || // last item added in 6.2.0 (20216) - !sItemExtendedCostStore.LookupEntry(5923) ) // last item extended cost added in 6.2.0 (20216) + if (!sItemStore.LookupEntry(136350) || // last item added in 7.0.1 (20810) + !sItemExtendedCostStore.LookupEntry(5951) || // last item extended cost added in 7.0.1 (20810) + !sSpellStore.LookupEntry(207511)) // last spell added in 7.0.1 (20810) { TC_LOG_ERROR("misc", "You have _outdated_ DB2 files. Please extract correct versions from current using client."); exit(1); @@ -644,6 +757,31 @@ uint32 DB2Manager::GetPowerIndexByClass(uint32 powerType, uint32 classId) const return _powersByClass[classId][powerType]; } +char const* DB2Manager::GetChrRaceName(uint8 race, LocaleConstant locale /*= DEFAULT_LOCALE*/) +{ + ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(race); + if (!raceEntry) + return ""; + + if (raceEntry->Name->Str[locale][0] != '\0') + return raceEntry->Name->Str[locale]; + + return raceEntry->Name->Str[DEFAULT_LOCALE]; +} + +EmotesTextSoundEntry const* DB2Manager::GetTextSoundEmoteFor(uint32 emote, uint8 race, uint8 gender, uint8 class_) const +{ + auto itr = _emoteTextSounds.find(EmotesTextSoundContainer::key_type(emote, race, gender, class_)); + if (itr != _emoteTextSounds.end()) + return itr->second; + + itr = _emoteTextSounds.find(EmotesTextSoundContainer::key_type(emote, race, gender, 0)); + if (itr != _emoteTextSounds.end()) + return itr->second; + + return nullptr; +} + uint32 DB2Manager::GetHeirloomItemLevel(uint32 curveId, uint32 level) const { // Assuming linear item level scaling for heirlooms @@ -719,6 +857,15 @@ uint32 DB2Manager::GetItemDisplayId(uint32 itemId, uint32 appearanceModId) const return 0; } +std::vector<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); @@ -809,6 +956,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 +1032,80 @@ std::vector<SpellProcsPerMinuteModEntry const*> DB2Manager::GetSpellProcsPerMinu return std::vector<SpellProcsPerMinuteModEntry const*>(); } +bool DB2Manager::IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId) +{ + if (requiredTotemCategoryId == 0) + return true; + if (itemTotemCategoryId == 0) + return false; + + TotemCategoryEntry const* itemEntry = sTotemCategoryStore.LookupEntry(itemTotemCategoryId); + if (!itemEntry) + return false; + TotemCategoryEntry const* reqEntry = sTotemCategoryStore.LookupEntry(requiredTotemCategoryId); + if (!reqEntry) + return false; + + if (itemEntry->CategoryType != reqEntry->CategoryType) + return false; + + return (itemEntry->CategoryMask & reqEntry->CategoryMask) == reqEntry->CategoryMask; +} + bool DB2Manager::IsToyItem(uint32 toy) const { return _toys.count(toy) > 0; } +void DB2Manager::DeterminaAlternateMapPosition(uint32 mapId, float x, float y, float z, uint32* newMapId /*= nullptr*/, DBCPosition2D* newPos /*= nullptr*/) +{ + ASSERT(newMapId || newPos); + WorldMapTransformsEntry const* transformation = nullptr; + for (WorldMapTransformsEntry const* transform : sWorldMapTransformsStore) + { + if (transform->MapID != mapId) + continue; + + if (transform->RegionMin.X > x || transform->RegionMax.X < x) + continue; + if (transform->RegionMin.Y > y || transform->RegionMax.Y < y) + continue; + if (transform->RegionMin.Z > z || transform->RegionMax.Z < z) + continue; + + transformation = transform; + break; + } + + if (!transformation) + { + if (newMapId) + *newMapId = mapId; + + if (newPos) + { + newPos->X = x; + newPos->Y = y; + } + return; + } + + if (newMapId) + *newMapId = transformation->NewMapID; + + if (!newPos) + return; + + if (transformation->RegionScale > 0.0f && transformation->RegionScale < 1.0f) + { + x = (x - transformation->RegionMin.X) * transformation->RegionScale + transformation->RegionMin.X; + y = (y - transformation->RegionMin.Y) * transformation->RegionScale + transformation->RegionMin.Y; + } + + newPos->X = x + transformation->RegionOffset.X; + newPos->Y = y + transformation->RegionOffset.Y; +} + bool DB2Manager::ChrClassesXPowerTypesEntryComparator::Compare(ChrClassesXPowerTypesEntry const* left, ChrClassesXPowerTypesEntry const* right) { if (left->ClassID != right->ClassID) @@ -892,5 +1124,5 @@ bool DB2Manager::MountTypeXCapabilityEntryComparator::Compare(MountTypeXCapabili { if (left->MountTypeID == right->MountTypeID) return left->OrderIndex < right->OrderIndex; - return left->ID < right->ID; + return left->MountTypeID < right->MountTypeID; } diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index b42d1dd8bab..4e3f7bdd70b 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -25,7 +25,10 @@ #include <array> TC_GAME_API extern DB2Storage<AchievementEntry> sAchievementStore; +TC_GAME_API extern DB2Storage<AnimKitEntry> sAnimKitStore; +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<BarberShopStyleEntry> sBarberShopStyleStore; TC_GAME_API extern DB2Storage<BattlePetBreedQualityEntry> sBattlePetBreedQualityStore; TC_GAME_API extern DB2Storage<BattlePetBreedStateEntry> sBattlePetBreedStateStore; @@ -33,15 +36,19 @@ TC_GAME_API extern DB2Storage<BattlePetSpeciesEntry> sBattlePetSp TC_GAME_API extern DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore; TC_GAME_API extern DB2Storage<BroadcastTextEntry> sBroadcastTextStore; TC_GAME_API extern DB2Storage<CharStartOutfitEntry> sCharStartOutfitStore; +TC_GAME_API extern DB2Storage<ChrRacesEntry> sChrRacesStore; 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<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<DurabilityCostsEntry> sDurabilityCostsStore; TC_GAME_API extern DB2Storage<DurabilityQualityEntry> sDurabilityQualityStore; TC_GAME_API extern DB2Storage<GameObjectsEntry> sGameObjectsStore; +TC_GAME_API extern DB2Storage<GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore; TC_GAME_API extern DB2Storage<GameTablesEntry> sGameTablesStore; TC_GAME_API extern DB2Storage<GarrAbilityEntry> sGarrAbilityStore; TC_GAME_API extern DB2Storage<GarrBuildingEntry> sGarrBuildingStore; @@ -55,15 +62,25 @@ TC_GAME_API extern DB2Storage<GarrPlotInstanceEntry> sGarrPlotIns 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<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,40 +89,60 @@ 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<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<MailTemplateEntry> sMailTemplateStore; 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<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<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<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<WorldMapOverlayEntry> sWorldMapOverlayStore; @@ -142,6 +179,7 @@ public: typedef std::map<uint32 /*hash*/, DB2StorageBase*> StorageMap; typedef std::unordered_map<uint32 /*areaGroupId*/, std::vector<uint32/*areaId*/>> AreaGroupMemberContainer; typedef std::unordered_map<uint32, CharStartOutfitEntry const*> CharStartOutfitContainer; + typedef std::map<std::tuple<uint32, uint8, uint8, uint8>, EmotesTextSoundEntry const*> EmotesTextSoundContainer; typedef std::set<GlyphSlotEntry const*, GlyphSlotEntryComparator> GlyphSlotContainer; typedef std::map<uint32 /*curveID*/, std::map<uint32/*index*/, CurvePointEntry const*, std::greater<uint32>>> HeirloomCurvesContainer; typedef std::unordered_map<uint32, HeirloomEntry const*> HeirloomItemsContainer; @@ -150,6 +188,7 @@ 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, MountEntry const*> MountContainer; typedef std::set<MountTypeXCapabilityEntry const*, MountTypeXCapabilityEntryComparator> MountTypeXCapabilitySet; @@ -158,6 +197,7 @@ 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; @@ -177,12 +217,16 @@ public: static char const* GetBroadcastTextValue(BroadcastTextEntry const* broadcastText, LocaleConstant locale = DEFAULT_LOCALE, uint8 gender = GENDER_MALE, bool forceGender = false); CharStartOutfitEntry const* GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender) const; uint32 GetPowerIndexByClass(uint32 powerType, uint32 classId) const; + static char const* GetChrRaceName(uint8 race, LocaleConstant locale = DEFAULT_LOCALE); + EmotesTextSoundEntry const* GetTextSoundEmoteFor(uint32 emote, uint8 race, uint8 gender, uint8 class_) const; GlyphSlotContainer const& GetGlyphSlots() const { return _glyphSlots; } uint32 GetHeirloomItemLevel(uint32 curveId, uint32 level) const; HeirloomEntry const* GetHeirloomByItemId(uint32 itemId) const; ItemBonusList const* GetItemBonusList(uint32 bonusListId) const; std::set<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; std::string GetNameGenEntry(uint8 race, uint8 gender, LocaleConstant locale) const; MountEntry const* GetMount(uint32 spellId) const; @@ -192,10 +236,13 @@ public: std::vector<QuestPackageItemEntry const*> const* GetQuestPackageItems(uint32 questPackageID) const; uint32 GetQuestUniqueBitFlag(uint32 questId); std::set<uint32> GetPhasesForGroup(uint32 group) const; + SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_); std::vector<SpecializationSpellsEntry const*> const* GetSpecializationSpells(uint32 specId) const; std::vector<SpellPowerEntry const*> GetSpellPowers(uint32 spellId, Difficulty difficulty = DIFFICULTY_NONE, bool* hasDifficultyPowers = nullptr) const; std::vector<SpellProcsPerMinuteModEntry const*> GetSpellProcsPerMinuteMods(uint32 spellprocsPerMinuteId) const; + static bool IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId); bool IsToyItem(uint32 toy) const; + static void DeterminaAlternateMapPosition(uint32 mapId, float x, float y, float z, uint32* newMapId = nullptr, DBCPosition2D* newPos = nullptr); private: StorageMap _stores; @@ -204,13 +251,16 @@ private: AreaGroupMemberContainer _areaGroupMembers; CharStartOutfitContainer _charStartOutfits; uint32 _powersByClass[MAX_CLASSES][MAX_POWERS]; + EmotesTextSoundContainer _emoteTextSounds; GlyphSlotContainer _glyphSlots; HeirloomItemsContainer _heirlooms; HeirloomCurvesContainer _heirloomCurvePoints; ItemBonusListContainer _itemBonusLists; ItemBonusTreeContainer _itemBonusTrees; + std::unordered_set<uint32> _itemsWithCurrencyCost; ItemDisplayIdContainer _itemDisplayIDs; ItemToBonusTreeContainer _itemToBonusTree; + ItemSetSpellContainer _itemSetSpells; ItemSpecOverridesContainer _itemSpecOverrides; MountContainer _mountsBySpellId; MountCapabilitiesByTypeContainer _mountCapabilitiesByType; @@ -218,6 +268,7 @@ private: NameValidationRegexContainer _nameValidators; PhaseGroupContainer _phasesByGroup; QuestPackageItemContainer _questPackages; + SkillRaceClassInfoContainer _skillRaceClassInfoBySkill; SpecializationSpellsContainer _specializationSpellsBySpec; SpellPowerContainer _spellPowers; SpellPowerDifficultyContainer _spellPowerDifficulties; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index daebcf7375f..ff3b9efc9c1 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -26,165 +26,229 @@ struct AchievementEntry { - uint32 ID; // 0 - int32 Faction; // 1 -1=all, 0=horde, 1=alliance - int32 MapID; // 2 -1=none - uint32 Supercedes; // 3 its Achievement parent (can`t start while parent uncomplete, use its Criteria if don`t have own, use its progress on begin) - LocalizedString* Title; // 4 - LocalizedString* Description; // 5 - uint32 Category; // 6 - uint32 Points; // 7 reward points - uint32 UIOrder; // 8 - uint32 Flags; // 9 - uint32 IconID; // 10 icon (from SpellIcon.dbc) - LocalizedString* Reward; // 11 - uint32 MinimumCriteria; // 12 - need this count of completed criterias (own or referenced achievement criterias) - uint32 SharesCriteria; // 13 - referenced achievement (counting of all completed criterias) - uint32 CriteriaTree; // 14 + uint32 ID; + LocalizedString* Title; + LocalizedString* Description; + uint32 Flags; + LocalizedString* Reward; + int16 MapID; // -1 = none + uint16 Supercedes; // its Achievement parent (can`t start while parent uncomplete, use its Criteria if don`t have own, use its progress on begin) + uint16 Category; + uint16 UIOrder; + uint16 IconID; + uint16 SharesCriteria; // referenced achievement (counting of all completed criterias) + uint16 CriteriaTree; + int8 Faction; // -1 = all, 0 = horde, 1 = alliance + uint8 Points; + uint8 MinimumCriteria; // need this count of completed criterias (own or referenced achievement criterias) +}; + +struct AnimKitEntry +{ + uint32 OneShotDuration; + uint16 OneShotStopAnimKitID; + uint16 LowDefAnimKitID; }; struct AreaGroupMemberEntry { - uint32 ID; // 0 - uint32 AreaGroupID; // 1 - uint32 AreaID; // 2 + uint16 AreaGroupID; + uint16 AreaID; +}; + +struct ArmorLocationEntry +{ + float Modifier[5]; }; struct AuctionHouseEntry { - uint32 ID; // 0 - uint32 FactionID; // 1 id of faction.dbc for player factions associated with city - uint32 DepositRate; // 2 1/3 from real - uint32 ConsignmentRate; // 3 - LocalizedString* Name; // 4 + LocalizedString* Name; + uint16 FactionID; // id of faction.dbc for player factions associated with city + uint8 DepositRate; + uint8 ConsignmentRate; +}; + +struct BankBagSlotPricesEntry +{ + uint32 Cost; }; struct BarberShopStyleEntry { - uint32 ID; // 0 - uint32 Type; // 1 value 0 -> hair, value 2 -> facialhair - LocalizedString* DisplayName; // 2 - LocalizedString* Description; // 3 - float CostModifier; // 4 - uint32 Race; // 5 - uint32 Sex; // 6 - uint32 Data; // 7 (real ID to hair/facial hair) + uint32 ID; + LocalizedString* DisplayName; + LocalizedString* Description; + float CostModifier; + uint8 Type; // value 0 -> hair, value 2 -> facialhair + uint8 Race; + uint8 Sex; + uint8 Data; // real ID to hair/facial hair }; struct BattlePetBreedQualityEntry { - uint32 ID; // 0 - uint32 Quality; // 1 - float Modifier; // 2 + float Modifier; + uint8 Quality; }; struct BattlePetBreedStateEntry { - uint32 ID; // 0 - uint32 BreedID; // 1 - uint32 State; // 2 - int32 Value; // 3 + uint32 ID; + int16 Value; + uint8 BreedID; + uint8 State; }; struct BattlePetSpeciesEntry { - uint32 ID; // 0 - uint32 CreatureID; // 1 - uint32 IconFileID; // 2 - uint32 SummonSpellID; // 3 - uint32 PetType; // 4 - int32 Source; // 5 - uint32 Flags; // 6 - LocalizedString* SourceText; // 7 - LocalizedString* Description; // 8 + uint32 ID; + uint32 CreatureID; + uint32 IconFileID; + uint32 SummonSpellID; + LocalizedString* SourceText; + LocalizedString* Description; + uint16 Flags; + uint8 PetType; + int8 Source; }; struct BattlePetSpeciesStateEntry { - uint32 ID; // 0 - uint32 SpeciesID; // 1 - uint32 State; // 2 - int32 Value; // 3 + uint32 ID; + int32 Value; + uint16 SpeciesID; + uint8 State; }; #define MAX_BROADCAST_TEXT_EMOTES 3 struct BroadcastTextEntry { - uint32 ID; - int32 Language; LocalizedString* MaleText; LocalizedString* FemaleText; - uint32 EmoteID[MAX_BROADCAST_TEXT_EMOTES]; - uint32 EmoteDelay[MAX_BROADCAST_TEXT_EMOTES]; - uint32 SoundID; - uint32 UnkEmoteID; - uint32 Type; + uint16 EmoteID[MAX_BROADCAST_TEXT_EMOTES]; + uint16 EmoteDelay[MAX_BROADCAST_TEXT_EMOTES]; + uint16 SoundID; + uint16 UnkEmoteID; + uint8 Language; + uint8 Type; }; #define MAX_OUTFIT_ITEMS 24 struct CharStartOutfitEntry { - uint32 ID; // 0 - uint8 RaceID; // 1 - uint8 ClassID; // 2 - uint8 GenderID; // 3 - uint8 OutfitID; // 4 - int32 ItemID[MAX_OUTFIT_ITEMS]; // 5-28 - uint32 PetDisplayID; // 29 Pet Model ID for starting pet - uint32 PetFamilyID; // 30 Pet Family Entry for starting pet + int32 ItemID[MAX_OUTFIT_ITEMS]; + uint32 PetDisplayID; // Pet Model ID for starting pet + uint8 RaceID; + uint8 ClassID; + uint8 GenderID; + uint8 OutfitID; + uint8 PetFamilyID; // Pet Family Entry for starting pet }; struct ChrClassesXPowerTypesEntry { - uint32 ID; // 0 - uint32 ClassID; // 1 - uint32 PowerType; // 2 + uint8 ClassID; + uint8 PowerType; +}; + +struct ChrRacesEntry +{ + uint32 ID; + uint32 Flags; + char const* ClientPrefix; + char const* ClientFileString; + LocalizedString* Name; + LocalizedString* NameFemale; + LocalizedString* NameMale; + char const* FacialHairCustomization[2]; + char const* HairCustomization; + uint32 CreateScreenFileDataID; + uint32 SelectScreenFileDataID; + float MaleCustomizeOffset[3]; + float FemaleCustomizeOffset[3]; + uint32 LowResScreenFileDataID; + uint16 FactionID; + uint16 ExplorationSoundID; + uint16 MaleDisplayID; + uint16 FemaleDisplayID; + uint16 ResSicknessSpellID; + uint16 SplashSoundID; + uint16 CinematicSequenceID; + uint16 UAMaleCreatureSoundDataID; + uint16 UAFemaleCreatureSoundDataID; + uint16 HighResMaleDisplayID; + uint16 HighResFemaleDisplayID; + uint16 Unk; + uint8 BaseLanguage; + uint8 CreatureType; + uint8 TeamID; + uint8 RaceRelated; + uint8 UnalteredVisualRaceID; + uint8 CharComponentTextureLayoutID; + uint8 DefaultClassID; + uint8 NeutralRaceID; + uint8 CharComponentTexLayoutHiResID; }; struct CinematicSequencesEntry { - uint32 ID; // 0 - uint32 SoundID; // 1 - uint32 Camera[8]; // 2-9 + uint16 SoundID; + uint16 Camera[8]; }; struct CreatureDisplayInfoEntry { - uint32 ID; // 0 - uint32 ModelID; // 1 - uint32 SoundID; // 2 - uint32 ExtendedDisplayInfoID; // 3 - float CreatureModelScale; // 4 - float PlayerModelScale; // 5 Used for players if greater than 0, see client's CGUnit_C::GetModelScale - uint32 CreatureModelAlpha; // 6 - LocalizedString* TextureVariation[3]; // 7-9 - LocalizedString* PortraitTextureName; // 10 - uint32 PortraitCreatureDisplayInfoID; // 11 - uint32 SizeClass; // 12 - uint32 BloodID; // 13 - uint32 NPCSoundID; // 14 - uint32 ParticleColorID; // 15 - uint32 CreatureGeosetData; // 16 - uint32 ObjectEffectPackageID; // 17 - uint32 AnimReplacementSetID; // 18 - uint32 Flags; // 19 - int32 Gender; // 20 - uint32 StateSpellVisualKitID; // 21 + uint32 ID; + uint32 ExtendedDisplayInfoID; + float CreatureModelScale; + float PlayerModelScale; + uint32 TextureVariation[3]; + char const* PortraitTextureName; + uint32 PortraitCreatureDisplayInfoID; + uint32 CreatureGeosetData; + uint32 StateSpellVisualKitID; + uint16 ModelID; + uint16 SoundID; + uint16 NPCSoundID; + uint16 ParticleColorID; + uint16 ObjectEffectPackageID; + uint16 AnimReplacementSetID; + uint8 CreatureModelAlpha; + uint8 SizeClass; + uint8 BloodID; + uint8 Flags; + int8 Gender; + int8 Unk700; +}; + +struct CreatureDisplayInfoExtraEntry +{ + uint32 NPCItemDisplay[10]; + uint32 FileDataID; + uint32 HDFileDataID; + uint8 DisplayRaceID; + uint8 DisplaySexID; + uint8 DisplayClassID; + uint8 SkinID; + uint8 FaceID; + uint8 HairStyleID; + uint8 HairColorID; + uint8 FacialHairID; + uint8 CustomDisplayOption[3]; + uint8 Flags; }; struct CreatureTypeEntry { - uint32 ID; // 0 - LocalizedString* Name; // 1 - uint32 Flags; // 2 no exp? critters, non-combat pets, gas cloud. + LocalizedString* Name; + uint8 Flags; // no exp? critters, non-combat pets, gas cloud. }; struct CriteriaEntry { - uint32 ID; // 0 - uint32 Type; // 1 union { uint32 ID; @@ -303,297 +367,319 @@ struct CriteriaEntry // CRITERIA_TYPE_COMPLETE_GARRISON_SHIPMENT = 182 uint32 CharShipmentContainerID; - } Asset; // 2 - uint32 StartEvent; // 3 - uint32 StartAsset; // 4 - uint32 StartTimer; // 5 - uint32 FailEvent; // 6 - uint32 FailAsset; // 7 - uint32 ModifierTreeId; // 8 - uint32 Flags; // 9 - uint32 EligibilityWorldStateID; // 10 - uint32 EligibilityWorldStateValue; // 11 + } Asset; + uint32 StartAsset; + uint32 FailAsset; + uint16 StartTimer; + uint16 ModifierTreeId; + uint16 EligibilityWorldStateID; + uint8 Type; + uint8 StartEvent; + uint8 FailEvent; + uint8 Flags; + uint8 EligibilityWorldStateValue; }; struct CriteriaTreeEntry { - uint32 ID; // 0 - uint32 CriteriaID; // 1 - uint64 Amount; // 2 - uint32 Operator; // 3 - uint32 Parent; // 4 - uint32 Flags; // 5 - LocalizedString* Description; // 6 - uint32 OrderIndex; // 7 + uint32 Amount; + LocalizedString* Description; + uint16 CriteriaID; + uint16 Parent; + uint16 Flags; + uint16 OrderIndex; + uint8 Operator; }; struct CurrencyTypesEntry { - uint32 ID; // 0 - uint32 CategoryID; // 1 - LocalizedString* Name; // 2 - LocalizedString* InventoryIcon[2]; // 3-4 - uint32 SpellWeight; // 5 - uint32 SpellCategory; // 6 - uint32 MaxQty; // 7 - uint32 MaxEarnablePerWeek; // 8 - uint32 Flags; // 9 - uint32 Quality; // 10 - LocalizedString* Description; // 11 + uint32 ID; + LocalizedString* Name; + char const* InventoryIcon[2]; + uint32 MaxQty; + uint32 MaxEarnablePerWeek; + uint32 Flags; + LocalizedString* Description; + uint8 CategoryID; + uint8 SpellWeight; + uint8 SpellCategory; + uint8 Quality; }; struct CurvePointEntry { - uint32 ID; // 0 - uint32 CurveID; // 1 - uint32 Index; // 2 - float X; // 3 - float Y; // 4 + float X; + float Y; + uint16 CurveID; + uint8 Index; }; struct DestructibleModelDataEntry { - uint32 ID; // 0 - struct - { - uint32 DisplayID; // 1 - uint32 ImpactEffectDoodadSet; // 2 - uint32 AmbientDoodadSet; // 3 - uint32 NameSet; // 4 - } StateDamaged; - struct - { - uint32 DisplayID; // 5 - uint32 DestructionDoodadSet; // 6 - uint32 ImpactEffectDoodadSet; // 7 - uint32 AmbientDoodadSet; // 8 - uint32 NameSet; // 9 - } StateDestroyed; - struct - { - uint32 DisplayID; // 10 - uint32 DestructionDoodadSet; // 11 - uint32 ImpactEffectDoodadSet; // 12 - uint32 AmbientDoodadSet; // 13 - uint32 NameSet; // 14 - } StateRebuilding; - struct - { - uint32 DisplayID; // 15 - uint32 InitDoodadSet; // 16 - uint32 AmbientDoodadSet; // 17 - uint32 NameSet; // 18 - } StateSmoke; - uint32 EjectDirection; // 19 - uint32 RepairGroundFx; // 20 - uint32 DoNotHighlight; // 21 - uint32 HealEffect; // 22 - uint32 HealEffectSpeed; // 23 + uint16 StateDamagedDisplayID; + uint16 StateDestroyedDisplayID; + uint16 StateRebuildingDisplayID; + uint16 StateSmokeDisplayID; + uint16 HealEffectSpeed; + uint8 StateDamagedImpactEffectDoodadSet; + uint8 StateDamagedAmbientDoodadSet; + uint8 StateDamagedNameSet; + uint8 StateDestroyedDestructionDoodadSet; + uint8 StateDestroyedImpactEffectDoodadSet; + uint8 StateDestroyedAmbientDoodadSet; + uint8 StateDestroyedNameSet; + uint8 StateRebuildingDestructionDoodadSet; + uint8 StateRebuildingImpactEffectDoodadSet; + uint8 StateRebuildingAmbientDoodadSet; + uint8 StateRebuildingNameSet; + uint8 StateSmokeInitDoodadSet; + uint8 StateSmokeAmbientDoodadSet; + uint8 StateSmokeNameSet; + uint8 EjectDirection; + uint8 DoNotHighlight; + uint8 HealEffect; +}; + +struct DurabilityCostsEntry +{ + uint16 WeaponSubClassCost[21]; + uint16 ArmorSubClassCost[8]; }; struct DurabilityQualityEntry { - uint32 ID; // 0 - float QualityMod; // 1 + float QualityMod; +}; + +struct EmotesTextSoundEntry +{ + uint16 EmotesTextId; + uint16 SoundId; + uint8 RaceId; + uint8 SexId; + uint8 ClassId; }; struct GameObjectsEntry { - uint32 ID; // 0 - uint32 MapID; // 1 - uint32 DisplayID; // 2 - DBCPosition3D Position; // 3-5 - float RotationX; // 6 - float RotationY; // 7 - float RotationZ; // 8 - float RotationW; // 9 - float Size; // 10 - uint32 PhaseUseFlags; // 11 - uint32 PhaseID; // 12 - uint32 PhaseGroupID; // 13 - uint32 Type; // 14 - uint32 Data[8]; // 15-22 - LocalizedString* Name; // 23 + uint32 ID; + DBCPosition3D Position; + float RotationX; + float RotationY; + float RotationZ; + float RotationW; + float Size; + int32 Data[8]; + LocalizedString* Name; + uint16 MapID; + uint16 DisplayID; + uint16 PhaseID; + uint16 PhaseGroupID; + uint8 PhaseUseFlags; + uint8 Type; +}; + +struct GameObjectDisplayInfoEntry +{ + uint32 FileDataID; + DBCPosition3D GeoBoxMin; + DBCPosition3D GeoBoxMax; + float OverrideLootEffectScale; + float OverrideNameScale; + uint16 Sound[10]; + uint16 ObjectEffectPackageID; }; struct GameTablesEntry { - uint32 ID; // 0 - LocalizedString* Name; // 1 - uint32 NumRows; // 2 - uint32 NumColumns; // 3 + LocalizedString* Name; + uint16 NumRows; + uint8 NumColumns; }; struct GarrAbilityEntry { - uint32 ID; // 0 - uint32 Flags; // 1 - LocalizedString* Name; // 2 - LocalizedString* Description; // 3 - uint32 IconFileDataID; // 4 - uint32 OtherFactionGarrAbilityID; // 5 - uint32 GarrAbilityCategoryID; // 6 - uint32 FollowerTypeID; // 7 + uint32 ID; + LocalizedString* Name; + LocalizedString* Description; + uint32 IconFileDataID; + uint16 OtherFactionGarrAbilityID; + uint8 Flags; + uint8 GarrAbilityCategoryID; + uint8 FollowerTypeID; }; struct GarrBuildingEntry { - uint32 ID; // 0 - uint32 HordeGameObjectID; // 1 - uint32 AllianceGameObjectID; // 2 - uint32 Unknown; // 3 - uint32 Type; // 4 - uint32 Level; // 5 - LocalizedString* NameAlliance; // 6 - LocalizedString* NameHorde; // 7 - LocalizedString* Description; // 8 - LocalizedString* Tooltip; // 9 - uint32 BuildDuration; // 10 - uint32 CostCurrencyID; // 11 - int32 CostCurrencyAmount; // 12 - uint32 HordeTexPrefixKitID; // 13 - uint32 AllianceTexPrefixKitID; // 14 - uint32 IconFileDataID; // 15 - uint32 BonusAmount; // 16 - uint32 Flags; // 17 - uint32 AllianceActivationScenePackageID; // 18 - uint32 HordeActivationScenePackageID; // 19 - uint32 MaxShipments; // 20 - uint32 FollowerRequiredGarrAbilityID; // 21 - uint32 FollowerGarrAbilityEffectID; // 22 - int32 CostMoney; // 23 + uint32 HordeGameObjectID; + uint32 AllianceGameObjectID; + LocalizedString* NameAlliance; + LocalizedString* NameHorde; + LocalizedString* Description; + LocalizedString* Tooltip; + uint32 IconFileDataID; + uint16 BuildDuration; + uint16 CostCurrencyID; + int16 CostCurrencyAmount; + uint16 AllianceActivationScenePackageID; + uint16 HordeActivationScenePackageID; + int16 CostMoney; + uint8 Unknown; + uint8 Type; + uint8 Level; + uint8 HordeTexPrefixKitID; + uint8 AllianceTexPrefixKitID; + uint8 BonusAmount; + uint8 Flags; + uint8 MaxShipments; + uint8 FollowerRequiredGarrAbilityID; + uint8 FollowerGarrAbilityEffectID; + uint8 GarrTypeID; }; struct GarrBuildingPlotInstEntry { - uint32 ID; // 0 - uint32 GarrBuildingID; // 1 - uint32 UiTextureAtlasMemberID; // 2 - uint32 GarrSiteLevelPlotInstID; // 3 - DBCPosition2D LandmarkOffset; // 4-5 + uint32 ID; + DBCPosition2D LandmarkOffset; + uint16 UiTextureAtlasMemberID; + uint16 GarrSiteLevelPlotInstID; + uint8 GarrBuildingID; }; struct GarrClassSpecEntry { - uint32 ID; // 0 - LocalizedString* NameMale; // 1 - LocalizedString* NameFemale; // 2 - LocalizedString* NameGenderless; // 3 - uint32 ClassAtlasID; // 4 UiTextureAtlasMember.db2 ref - uint32 GarrFollItemSetID; // 5 + uint32 ID; + LocalizedString* NameMale; + LocalizedString* NameFemale; + LocalizedString* NameGenderless; + uint16 ClassAtlasID; // UiTextureAtlasMember.db2 ref + uint8 GarrFollItemSetID; }; struct GarrFollowerEntry { - uint32 ID; // 0 - uint32 FollowerTypeID; // 1 - uint32 HordeCreatureID; // 2 - uint32 AllianceCreatureID; // 3 - uint32 HordeUiAnimRaceInfoID; // 4 - uint32 AllianceUiAnimRaceInfoID; // 5 - uint32 Quality; // 6 - uint32 HordeGarrClassSpecID; // 7 - uint32 AllianceGarrClassSpecID; // 8 - uint32 HordeGarrFollItemSetID; // 9 - uint32 AllianceGarrFollItemSetID; // 10 - uint32 Level; // 11 - uint32 ItemLevelWeapon; // 12 - uint32 ItemLevelArmor; // 13 - uint32 Unknown1; // 14 - uint32 Flags; // 15 - LocalizedString* HordeSourceText; // 16 - LocalizedString* AllianceSourceText; // 17 - int32 Unknown2; // 18 - int32 Unknown3; // 19 - uint32 HordePortraitIconID; // 20 - uint32 AlliancePortraitIconID; // 21 - uint32 HordeListPortraitTextureKitID; // 22 - uint32 AllianceListPortraitTextureKitID; // 23 + uint32 HordeCreatureID; + uint32 AllianceCreatureID; + LocalizedString* HordeSourceText; + LocalizedString* AllianceSourceText; + uint32 HordePortraitIconID; + uint32 AlliancePortraitIconID; + uint16 ItemLevelWeapon; + uint16 ItemLevelArmor; + uint8 FollowerTypeID; + uint8 HordeUiAnimRaceInfoID; + uint8 AllianceUiAnimRaceInfoID; + uint8 Quality; + uint8 HordeGarrClassSpecID; + uint8 AllianceGarrClassSpecID; + uint8 HordeGarrFollItemSetID; + uint8 AllianceGarrFollItemSetID; + uint8 Level; + uint8 Unknown1; + uint8 Flags; + int8 Unknown2; + int8 Unknown3; + uint8 HordeListPortraitTextureKitID; + uint8 AllianceListPortraitTextureKitID; + uint8 GarrTypeID; }; struct GarrFollowerXAbilityEntry { - uint32 ID; // 0 - uint32 GarrFollowerID; // 1 - uint32 GarrAbilityID; // 2 - uint32 FactionIndex; // 3 + uint16 GarrFollowerID; + uint16 GarrAbilityID; + uint8 FactionIndex; }; struct GarrPlotEntry { - uint32 ID; // 0 - uint32 GarrPlotUICategoryID; // 1 - uint32 PlotType; // 2 - uint32 Flags; // 3 - LocalizedString* Name; // 4 - uint32 MinCount; // 5 - uint32 MaxCount; // 6 - uint32 AllianceConstructionGameObjectID; // 7 - uint32 HordeConstructionGameObjectID; // 8 + LocalizedString* Name; + uint32 AllianceConstructionGameObjectID; + uint32 HordeConstructionGameObjectID; + uint8 GarrPlotUICategoryID; + uint8 PlotType; + uint8 Flags; + uint8 MinCount; + uint8 MaxCount; }; struct GarrPlotBuildingEntry { - uint32 ID; // 0 - uint32 GarrPlotID; // 1 - uint32 GarrBuildingID; // 2 + uint8 GarrPlotID; + uint8 GarrBuildingID; }; struct GarrPlotInstanceEntry { - uint32 ID; // 0 - uint32 GarrPlotID; // 1 - LocalizedString* Name; // 2 + LocalizedString* Name; + uint8 GarrPlotID; }; struct GarrSiteLevelEntry { - uint32 ID; // 0 - uint32 Level; // 1 - uint32 MapID; // 2 - uint32 SiteID; // 3 - uint32 UITextureKitID; // 4 - DBCPosition2D TownHall; // 5-6 - uint32 MovieID; // 7 - uint32 Level2; // 8 - uint32 UpgradeResourceCost; // 9 - uint32 UpgradeMoneyCost; // 10 + DBCPosition2D TownHall; + uint16 MapID; + uint16 UpgradeResourceCost; + uint16 UpgradeMoneyCost; + uint8 Level; + uint8 SiteID; + uint8 UITextureKitID; + uint8 MovieID; + uint8 Level2; }; struct GarrSiteLevelPlotInstEntry { - uint32 ID; // 0 - uint32 GarrSiteLevelID; // 1 - uint32 GarrPlotInstanceID; // 2 - DBCPosition2D Landmark; // 3-4 - uint32 Unknown; // 5 + DBCPosition2D Landmark; + uint16 GarrSiteLevelID; + uint8 GarrPlotInstanceID; + uint8 Unknown; }; struct GlyphSlotEntry { - uint32 ID; // 0 - uint32 Type; // 1 - uint32 Tooltip; // 2 + uint8 Type; + uint8 Tooltip; +}; + +struct GuildColorBackgroundEntry +{ + uint8 Red; + uint8 Green; + uint8 Blue; +}; + +struct GuildColorBorderEntry +{ + uint8 Red; + uint8 Green; + uint8 Blue; +}; + +struct GuildColorEmblemEntry +{ + uint8 Red; + uint8 Green; + uint8 Blue; }; struct GuildPerkSpellsEntry { - uint32 ID; // 0 - uint32 GuildLevel; // 1 - uint32 SpellID; // 2 + uint32 SpellID; + uint8 GuildLevel; }; struct HeirloomEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 Flags; // 2 - LocalizedString* SourceText; // 3 - uint32 Source; // 4 - uint32 OldItem[2]; // 5-6 - uint32 NextDifficultyItemID; // 7 - uint32 UpgradeItemID[2]; // 8-9 - uint32 ItemBonusListID[2]; // 10-11 + uint32 ID; + uint32 ItemID; + LocalizedString* SourceText; + uint32 OldItem[2]; + uint32 NextDifficultyItemID; + uint32 UpgradeItemID[2]; + uint16 ItemBonusListID[2]; + uint8 Flags; + uint8 Source; }; #define MAX_HOLIDAY_DURATIONS 10 @@ -602,122 +688,164 @@ struct HeirloomEntry struct HolidaysEntry { - uint32 ID; // 0 - uint32 Duration[MAX_HOLIDAY_DURATIONS]; // 1-10 - uint32 Date[MAX_HOLIDAY_DATES]; // 11-26 (dates in unix time starting at January, 1, 2000) - uint32 Region; // 27 - uint32 Looping; // 28 - uint32 CalendarFlags[MAX_HOLIDAY_FLAGS]; // 29-38 - uint32 HolidayNameID; // 39 HolidayNames.dbc - uint32 HolidayDescriptionID; // 40 HolidayDescriptions.dbc - LocalizedString* TextureFilename; // 41 - uint32 Priority; // 42 - uint32 CalendarFilterType; // 43 (-1 = Fishing Contest, 0 = Unk, 1 = Darkmoon Festival, 2 = Yearly holiday) - uint32 Flags; // 44 (0 = Darkmoon Faire, Fishing Contest and Wotlk Launch, rest is 1) + uint32 Date[MAX_HOLIDAY_DATES]; // dates in unix time starting at January, 1, 2000 + char const* TextureFilename; + uint16 Duration[MAX_HOLIDAY_DURATIONS]; + uint16 Region; + uint8 Looping; + uint8 CalendarFlags[MAX_HOLIDAY_FLAGS]; + uint8 HolidayNameID; + uint8 HolidayDescriptionID; + uint8 Priority; + int8 CalendarFilterType; + uint8 Flags; }; struct ImportPriceArmorEntry { - uint32 ID; // 0 - float ClothFactor; // 1 - float LeatherFactor; // 2 - float MailFactor; // 3 - float PlateFactor; // 4 + float ClothFactor; + float LeatherFactor; + float MailFactor; + float PlateFactor; }; struct ImportPriceQualityEntry { - uint32 ID; // 0 - float Factor; // 1 + float Factor; }; struct ImportPriceShieldEntry { - uint32 ID; // 0 - float Factor; // 1 + float Factor; }; struct ImportPriceWeaponEntry { - uint32 ID; // 0 - float Factor; // 1 + float Factor; +}; + +struct ItemEntry +{ + uint32 FileDataID; + uint8 Class; + uint8 SubClass; + int8 SoundOverrideSubclass; + int8 Material; + uint8 InventoryType; + uint8 Sheath; + uint8 GroupSoundsID; }; struct ItemAppearanceEntry { - uint32 ID; // 0 - uint32 DisplayID; // 1 - uint32 IconFileDataID; // 2 + uint32 DisplayID; + uint32 IconFileDataID; + uint8 ObjectComponentSlot; +}; + +struct ItemArmorQualityEntry +{ + float QualityMod[7]; + uint16 ItemLevel; +}; + +struct ItemArmorShieldEntry +{ + float Quality[7]; + uint16 ItemLevel; +}; + +struct ItemArmorTotalEntry +{ + float Value[4]; + uint16 ItemLevel; +}; + +struct ItemBagFamilyEntry +{ + LocalizedString* Name; }; struct ItemBonusEntry { - uint32 ID; // 0 - uint32 BonusListID; // 1 - uint32 Type; // 2 - int32 Value[2]; // 3-4 - uint32 Index; // 5 + uint32 ID; + int32 Value[2]; + uint16 BonusListID; + uint8 Type; + uint8 Index; }; struct ItemBonusTreeNodeEntry { - uint32 ID; // 0 - uint32 BonusTreeID; // 1 - uint32 BonusTreeModID; // 2 - uint32 SubTreeID; // 3 - uint32 BonusListID; // 4 + uint16 BonusTreeID; + uint16 SubTreeID; + uint16 BonusListID; + uint8 BonusTreeModID; }; struct ItemClassEntry { - uint32 ID; // 0 - uint32 Flags; // 1 - float PriceMod; // 2 - LocalizedString* Name; // 3 + float PriceMod; + LocalizedString* Name; + uint8 Flags; }; struct ItemCurrencyCostEntry { - uint32 ID; // 0 - uint32 ItemId; // 1 + uint32 ItemId; }; -struct ItemDisenchantLootEntry +struct ItemDamageAmmoEntry { - uint32 ID; // 0 - uint32 ItemClass; // 1 - int32 ItemSubClass; // 2 - uint32 ItemQuality; // 3 - uint32 MinItemLevel; // 4 - uint32 MaxItemLevel; // 5 - uint32 RequiredDisenchantSkill; // 6 + float DPS[7]; + uint16 ItemLevel; }; -struct ItemEffectEntry +struct ItemDamageOneHandEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 OrderIndex; // 2 - uint32 SpellID; // 3 - uint32 Trigger; // 4 - int32 Charges; // 5 - int32 Cooldown; // 6 - uint32 Category; // 7 - int32 CategoryCooldown; // 8 - uint32 ChrSpecializationID; // 9 + float DPS[7]; + uint16 ItemLevel; }; -struct ItemEntry +struct ItemDamageOneHandCasterEntry +{ + float DPS[7]; + uint16 ItemLevel; +}; + +struct ItemDamageTwoHandEntry +{ + float DPS[7]; + uint16 ItemLevel; +}; + +struct ItemDamageTwoHandCasterEntry +{ + float DPS[7]; + uint16 ItemLevel; +}; + +struct ItemDisenchantLootEntry +{ + uint16 MinItemLevel; + uint16 MaxItemLevel; + uint16 RequiredDisenchantSkill; + uint8 ItemClass; + int8 ItemSubClass; + uint8 ItemQuality; +}; + +struct ItemEffectEntry { - uint32 ID; // 0 - uint32 Class; // 1 - uint32 SubClass; // 2 - int32 SoundOverrideSubclass; // 3 - int32 Material; // 4 - uint32 InventoryType; // 5 - uint32 Sheath; // 6 - uint32 FileDataID; // 7 - uint32 GroupSoundsID; // 8 + uint32 ItemID; + uint32 SpellID; + int32 Cooldown; + int32 CategoryCooldown; + int16 Charges; + uint16 Category; + uint16 ChrSpecializationID; + uint8 OrderIndex; + uint8 Trigger; }; #define MAX_ITEM_EXT_COST_ITEMS 5 @@ -725,64 +853,64 @@ struct ItemEntry struct ItemExtendedCostEntry { - uint32 ID; // 0 extended-cost entry id - uint32 RequiredArenaSlot; // 3 arena slot restrictions (min slot value) - uint32 RequiredItem[MAX_ITEM_EXT_COST_ITEMS]; // 3-6 required item id - uint32 RequiredItemCount[MAX_ITEM_EXT_COST_ITEMS]; // 7-11 required count of 1st item - uint32 RequiredPersonalArenaRating; // 12 required personal arena rating - uint32 ItemPurchaseGroup; // 13 - uint32 RequiredCurrency[MAX_ITEM_EXT_COST_CURRENCIES]; // 14-18 required curency id - uint32 RequiredCurrencyCount[MAX_ITEM_EXT_COST_CURRENCIES]; // 19-23 required curency count - uint32 RequiredFactionId; // 24 - uint32 RequiredFactionStanding; // 25 - uint32 RequirementFlags; // 26 - uint32 RequiredAchievement; // 27 - uint32 RequiredMoney; // 28 + uint32 RequiredItem[MAX_ITEM_EXT_COST_ITEMS]; // required item id + uint32 RequiredCurrencyCount[MAX_ITEM_EXT_COST_CURRENCIES]; // required curency count + uint32 RequiredMoney; + uint16 RequiredItemCount[MAX_ITEM_EXT_COST_ITEMS]; // required count of 1st item + uint16 RequiredPersonalArenaRating; // required personal arena rating + uint16 RequiredCurrency[MAX_ITEM_EXT_COST_CURRENCIES]; // required curency id + uint8 RequiredArenaSlot; // arena slot restrictions (min slot value) + uint8 RequiredFactionId; + uint8 RequiredFactionStanding; + uint8 RequirementFlags; + uint8 RequiredAchievement; }; struct ItemLimitCategoryEntry { - uint32 ID; // 0 - LocalizedString* Name; // 1 - uint32 Quantity; // 2 - uint32 Flags; // 3 + LocalizedString* Name; + uint8 Quantity; + uint8 Flags; }; struct ItemModifiedAppearanceEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 AppearanceModID; // 2 - uint32 AppearanceID; // 3 - uint32 IconFileDataID; // 4 - uint32 Index; // 5 + uint32 ID; + uint32 ItemID; + uint16 AppearanceID; + uint8 AppearanceModID; + uint8 Index; }; struct ItemPriceBaseEntry { - uint32 ID; // 0 - uint32 ItemLevel; // 1 Item level (1 - 1000) - float ArmorFactor; // 2 Price factor for armor - float WeaponFactor; // 3 Price factor for weapons + float ArmorFactor; + float WeaponFactor; + uint16 ItemLevel; }; #define MAX_ITEM_RANDOM_PROPERTIES 5 struct ItemRandomPropertiesEntry { - uint32 ID; // 0 - LocalizedString* InternalName; // 1 - uint32 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; // 2-6 - LocalizedString* Name; // 7 + LocalizedString* Name; + uint16 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; }; struct ItemRandomSuffixEntry { - uint32 ID; // 0 - LocalizedString* Name; // 1 - LocalizedString* InternalName; // 2 - uint32 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; // 3-7 - uint32 AllocationPct[MAX_ITEM_RANDOM_PROPERTIES]; // 8-12 + LocalizedString* Name; + LocalizedString* InternalName; + uint16 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; + uint16 AllocationPct[MAX_ITEM_RANDOM_PROPERTIES]; +}; + +struct ItemSetSpellEntry +{ + uint32 SpellID; + uint16 ItemSetID; + uint16 ChrSpecID; + uint8 Threshold; }; #define MAX_ITEM_PROTO_FLAGS 3 @@ -791,474 +919,650 @@ struct ItemRandomSuffixEntry struct ItemSparseEntry { - uint32 ID; // 0 - uint32 Quality; // 1 - uint32 Flags[MAX_ITEM_PROTO_FLAGS]; // 2-4 - float Unk1; // 5 - float Unk2; // 6 - uint32 BuyCount; // 7 - uint32 BuyPrice; // 8 - uint32 SellPrice; // 9 - uint32 InventoryType; // 10 - int32 AllowableClass; // 11 - int32 AllowableRace; // 12 - uint32 ItemLevel; // 13 - int32 RequiredLevel; // 14 - uint32 RequiredSkill; // 15 - uint32 RequiredSkillRank; // 16 - uint32 RequiredSpell; // 17 - uint32 RequiredHonorRank; // 18 - uint32 RequiredCityRank; // 19 - uint32 RequiredReputationFaction; // 20 - uint32 RequiredReputationRank; // 21 - uint32 MaxCount; // 22 - uint32 Stackable; // 23 - uint32 ContainerSlots; // 24 - int32 ItemStatType[MAX_ITEM_PROTO_STATS]; // 25 - 34 - int32 ItemStatValue[MAX_ITEM_PROTO_STATS]; // 35 - 44 - int32 ItemStatAllocation[MAX_ITEM_PROTO_STATS]; // 45 - 54 - float ItemStatSocketCostMultiplier[MAX_ITEM_PROTO_STATS]; // 55 - 64 - uint32 ScalingStatDistribution; // 65 - uint32 DamageType; // 66 - uint32 Delay; // 67 - float RangedModRange; // 68 - uint32 Bonding; // 69 - LocalizedString* Name; // 70 - LocalizedString* Name2; // 71 - LocalizedString* Name3; // 72 - LocalizedString* Name4; // 73 - LocalizedString* Description; // 74 - uint32 PageText; // 75 - uint32 LanguageID; // 76 - uint32 PageMaterial; // 77 - uint32 StartQuest; // 78 - uint32 LockID; // 79 - int32 Material; // 80 - uint32 Sheath; // 81 - uint32 RandomProperty; // 82 - uint32 RandomSuffix; // 83 - uint32 ItemSet; // 84 - uint32 Area; // 85 - uint32 Map; // 86 - uint32 BagFamily; // 87 - uint32 TotemCategory; // 88 - uint32 SocketColor[MAX_ITEM_PROTO_SOCKETS]; // 89-91 - uint32 SocketBonus; // 92 - uint32 GemProperties; // 93 - float ArmorDamageModifier; // 94 - uint32 Duration; // 95 - uint32 ItemLimitCategory; // 96 - uint32 HolidayID; // 97 - float StatScalingFactor; // 98 - uint32 CurrencySubstitutionID; // 99 - uint32 CurrencySubstitutionCount; // 100 - uint32 ItemNameDescriptionID; // 101 + uint32 Flags[MAX_ITEM_PROTO_FLAGS]; + float Unk1; + float Unk2; + uint32 BuyPrice; + uint32 SellPrice; + int32 AllowableClass; + int32 AllowableRace; + uint32 RequiredSpell; + uint32 MaxCount; + uint32 Stackable; + int32 ItemStatAllocation[MAX_ITEM_PROTO_STATS]; + float ItemStatSocketCostMultiplier[MAX_ITEM_PROTO_STATS]; + float RangedModRange; + LocalizedString* Name; + LocalizedString* Name2; + LocalizedString* Name3; + LocalizedString* Name4; + LocalizedString* Description; + uint32 BagFamily; + float ArmorDamageModifier; + uint32 Duration; + float StatScalingFactor; + uint16 ItemLevel; + uint16 RequiredSkill; + uint16 RequiredSkillRank; + uint16 RequiredReputationFaction; + int16 ItemStatValue[MAX_ITEM_PROTO_STATS]; + uint16 ScalingStatDistribution; + uint16 Delay; + uint16 PageText; + uint16 StartQuest; + uint16 LockID; + uint16 RandomProperty; + uint16 RandomSuffix; + uint16 ItemSet; + uint16 Area; + uint16 Map; + uint16 SocketBonus; + uint16 GemProperties; + uint16 ItemLimitCategory; + uint16 HolidayID; + uint16 ItemNameDescriptionID; + uint8 Quality; + uint8 BuyCount; + uint8 InventoryType; + int8 RequiredLevel; + uint8 RequiredHonorRank; + uint8 RequiredCityRank; + uint8 RequiredReputationRank; + uint8 ContainerSlots; + int8 ItemStatType[MAX_ITEM_PROTO_STATS]; + uint8 DamageType; + uint8 Bonding; + uint8 LanguageID; + uint8 PageMaterial; + int8 Material; + uint8 Sheath; + uint8 TotemCategory; + uint8 SocketColor[MAX_ITEM_PROTO_SOCKETS]; + uint8 CurrencySubstitutionID; + uint8 CurrencySubstitutionCount; + uint8 ArtifactID; }; struct ItemSpecEntry { - uint32 ID; // 0 - uint32 MinLevel; // 1 - uint32 MaxLevel; // 2 - uint32 ItemType; // 3 - uint32 PrimaryStat; // 4 - uint32 SecondaryStat; // 5 - uint32 SpecID; // 6 + uint16 SpecID; + uint8 MinLevel; + uint8 MaxLevel; + uint8 ItemType; + uint8 PrimaryStat; + uint8 SecondaryStat; }; struct ItemSpecOverrideEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 SpecID; // 2 + uint32 ItemID; + uint16 SpecID; }; struct ItemToBattlePetSpeciesEntry { - uint32 ID; // 0 - uint32 BattlePetSpeciesID; // 1 + uint16 BattlePetSpeciesID; }; struct ItemXBonusTreeEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 BonusTreeID; // 2 + uint32 ItemID; + uint16 BonusTreeID; }; #define KEYCHAIN_SIZE 32 struct KeyChainEntry { - uint32 Id; - uint8 Key[KEYCHAIN_SIZE]; + uint8 Key[KEYCHAIN_SIZE]; }; struct MailTemplateEntry { - uint32 ID; // 0 - LocalizedString* Body; // 1 + LocalizedString* Body; }; struct ModifierTreeEntry { - uint32 ID; // 0 - uint32 Type; // 1 - uint32 Asset[2]; // 2-3 - uint32 Operator; // 4 - uint32 Amount; // 5 - uint32 Parent; // 6 + uint32 Asset[2]; + uint16 Parent; + uint8 Type; + uint8 Unk700; + uint8 Operator; + uint8 Amount; }; struct MountEntry { - uint32 Id; + uint32 ID; uint32 SpellId; - uint32 MountTypeId; uint32 DisplayId; - uint32 Flags; LocalizedString* Name; LocalizedString* Description; LocalizedString* SourceDescription; - uint32 Source; - uint32 PlayerConditionId; + uint16 MountTypeId; + uint16 Flags; + uint16 PlayerConditionId; + uint8 Source; }; struct MountCapabilityEntry { - uint32 ID; // 0 - uint32 Flags; // 1 - uint32 RequiredRidingSkill; // 2 - uint32 RequiredArea; // 3 - uint32 RequiredAura; // 4 - uint32 RequiredSpell; // 5 - uint32 SpeedModSpell; // 6 - int32 RequiredMap; // 7 + uint32 ID; + uint32 RequiredSpell; + uint32 SpeedModSpell; + uint16 RequiredRidingSkill; + uint16 RequiredArea; + int16 RequiredMap; + uint8 Flags; + uint8 RequiredAura; }; struct MountTypeXCapabilityEntry { - uint32 ID; // 0 - uint32 MountTypeID; // 1 - uint32 OrderIndex; // 2 - uint32 MountCapabilityID; // 3 + uint16 MountTypeID; + uint16 MountCapabilityID; + uint8 OrderIndex; +}; + +struct MovieEntry +{ + uint32 AudioFileDataID; + uint32 SubtitleFileDataID; + uint8 Volume; + uint8 KeyID; }; struct NameGenEntry { - uint32 ID; // 0 - LocalizedString* Name; // 1 - uint32 Race; // 2 - uint32 Sex; // 3 + LocalizedString* Name; + uint8 Race; + uint8 Sex; }; struct NamesProfanityEntry { - uint32 ID; // 0 - char const* Name; // 1 - int32 Language; // 2 + char const* Name; + int8 Language; }; struct NamesReservedEntry { - uint32 ID; // 0 - char const* Name; // 1 + char const* Name; }; struct NamesReservedLocaleEntry { - uint32 ID; // 0 - char const* Name; // 1 - uint32 LocaleMask; // 2 + char const* Name; + uint8 LocaleMask; }; #define MAX_OVERRIDE_SPELL 10 struct OverrideSpellDataEntry { - uint32 ID; // 0 - uint32 SpellID[MAX_OVERRIDE_SPELL]; // 1-10 - uint32 Flags; // 11 - uint32 PlayerActionbarFileDataID; // 12 + uint32 SpellID[MAX_OVERRIDE_SPELL]; + uint32 PlayerActionbarFileDataID; + uint8 Flags; }; struct PhaseXPhaseGroupEntry { - uint32 ID; - uint32 PhaseID; - uint32 PhaseGroupID; + uint16 PhaseID; + uint16 PhaseGroupID; }; struct PlayerConditionEntry { - uint32 ID; // 0 - uint32 Flags; // 1 - uint32 MinLevel; // 2 - uint32 MaxLevel; // 3 - uint32 RaceMask; // 4 - uint32 ClassMask; // 5 - int32 Gender; // 6 - int32 NativeGender; // 7 - uint32 SkillID[4]; // 8-11 - int32 MinSkill[4]; // 12-15 - int32 MaxSkill[4]; // 16-19 - uint32 SkillLogic; // 20 - uint32 LanguageID; // 21 - uint32 MinLanguage; // 22 - uint32 MaxLanguage; // 23 - uint32 MinFactionID[3]; // 24-26 - uint32 MaxFactionID; // 27 - uint32 MinReputation[3]; // 28-30 - uint32 MaxReputation; // 31 - uint32 ReputationLogic; // 32 - uint32 Unknown1; // 33 - uint32 MinPVPRank; // 34 - uint32 MaxPVPRank; // 35 - uint32 PvpMedal; // 36 - uint32 PrevQuestLogic; // 37 - uint32 PrevQuestID[4]; // 38-41 - uint32 CurrQuestLogic; // 42 - uint32 CurrQuestID[4]; // 43-46 - uint32 CurrentCompletedQuestLogic; // 47 - uint32 CurrentCompletedQuestID[4]; // 48-51 - uint32 SpellLogic; // 52 - uint32 SpellID[4]; // 53-56 - uint32 ItemLogic; // 57 - uint32 ItemID[4]; // 58-61 - uint32 ItemCount[4]; // 62-65 - uint32 ItemFlags; // 66 - uint32 Explored[2]; // 67-68 - uint32 Time[2]; // 69-70 - uint32 AuraSpellLogic; // 71 - uint32 AuraSpellID[4]; // 72-75 - uint32 WorldStateExpressionID; // 76 - uint32 WeatherID; // 77 - uint32 PartyStatus; // 78 - uint32 LifetimeMaxPVPRank; // 79 - uint32 AchievementLogic; // 80 - uint32 Achievement[4]; // 81-84 - uint32 LfgLogic; // 85 - uint32 LfgStatus[4]; // 86-89 - uint32 LfgCompare[4]; // 90-93 - uint32 LfgValue[4]; // 94-97 - uint32 AreaLogic; // 98 - uint32 AreaID[4]; // 99-102 - uint32 CurrencyLogic; // 103 - uint32 CurrencyID[4]; // 104-107 - uint32 CurrencyCount[4]; // 108-111 - uint32 QuestKillID; // 112 - uint32 QuestKillLogic; // 113 - uint32 QuestKillMonster[4]; // 114-117 - int32 MinExpansionLevel; // 118 - int32 MaxExpansionLevel; // 119 - int32 MinExpansionTier; // 120 - int32 MaxExpansionTier; // 121 - uint32 MinGuildLevel; // 122 - uint32 MaxGuildLevel; // 123 - uint32 PhaseUseFlags; // 124 - uint32 PhaseID; // 125 - uint32 PhaseGroupID; // 126 - uint32 MinAvgItemLevel; // 127 - uint32 MaxAvgItemLevel; // 128 - uint32 MinAvgEquippedItemLevel; // 129 - uint32 MaxAvgEquippedItemLevel; // 130 - int32 ChrSpecializationIndex; // 131 - int32 ChrSpecializationRole; // 132 - LocalizedString* FailureDescription_lang; // 133 - int32 PowerType; // 134 - int32 PowerTypeComp; // 135 - int32 PowerTypeValue; // 136 + uint32 RaceMask; + uint32 SkillLogic; + uint32 ReputationLogic; + uint32 PrevQuestLogic; + uint32 CurrQuestLogic; + uint32 CurrentCompletedQuestLogic; + uint32 SpellLogic; + uint32 SpellID[4]; + uint32 ItemLogic; + uint32 ItemID[4]; + uint32 Time[2]; + uint32 AuraSpellLogic; + uint32 AuraSpellID[4]; + uint32 AchievementLogic; + uint32 AreaLogic; + uint32 QuestKillLogic; + uint32 QuestKillMonster[6]; + LocalizedString* FailureDescription; + uint32 Unknown700_1; + uint32 Unknown700_2; + uint16 MinLevel; + uint16 MaxLevel; + uint16 ClassMask; + uint16 SkillID[4]; + int16 MinSkill[4]; + int16 MaxSkill[4]; + uint16 MinFactionID[3]; + uint16 MaxFactionID; + uint16 PrevQuestID[4]; + uint16 CurrQuestID[4]; + uint16 CurrentCompletedQuestID[4]; + uint16 Explored[2]; + uint16 WorldStateExpressionID; + uint16 Achievement[4]; + uint16 AreaID[4]; + uint16 QuestKillID; + uint16 PhaseID; + uint16 MinAvgItemLevel; + uint16 MaxAvgItemLevel; + uint16 MinAvgEquippedItemLevel; + uint16 MaxAvgEquippedItemLevel; + uint16 ModifierTreeID; + uint8 Flags; + int8 Gender; + int8 NativeGender; + uint8 LanguageID; + uint8 MinLanguage; + uint8 MaxLanguage; + uint8 MinReputation[3]; + uint8 MaxReputation; + uint8 Unknown1; + uint8 MinPVPRank; + uint8 MaxPVPRank; + uint8 PvpMedal; + uint8 ItemCount[4]; + uint8 ItemFlags; + uint8 AuraCount[4]; + uint8 WeatherID; + uint8 PartyStatus; + uint8 LifetimeMaxPVPRank; + uint8 LfgLogic; + uint8 LfgStatus[4]; + uint8 LfgCompare[4]; + uint8 LfgValue[4]; + uint8 CurrencyLogic; + uint8 CurrencyID[4]; + uint8 CurrencyCount[4]; + int8 MinExpansionLevel; + int8 MaxExpansionLevel; + int8 MinExpansionTier; + int8 MaxExpansionTier; + uint8 MinGuildLevel; + uint8 MaxGuildLevel; + uint8 PhaseUseFlags; + uint8 PhaseGroupID; + int8 ChrSpecializationIndex; + int8 ChrSpecializationRole; + int8 PowerType; + int8 PowerTypeComp; + int8 PowerTypeValue; +}; + +struct PowerDisplayEntry +{ + char const* GlobalStringBaseTag; + uint8 PowerType; + uint8 Red; + uint8 Green; + uint8 Blue; +}; + +struct QuestFactionRewardEntry +{ + int16 QuestRewFactionValue[10]; }; struct QuestMoneyRewardEntry { - uint32 Level; // 0 - uint32 Money[10]; // 1 + uint32 Money[10]; }; struct QuestPackageItemEntry { - uint32 ID; // 0 - uint32 QuestPackageID; // 1 - uint32 ItemID; // 2 - uint32 ItemCount; // 3 - uint32 FilterType; // 4 + uint32 ItemID; + uint16 QuestPackageID; + uint8 ItemCount; + uint8 FilterType; }; struct QuestSortEntry { - uint32 ID; // 0 - LocalizedString* SortName; // 1 + LocalizedString* SortName; }; struct QuestV2Entry { - uint32 ID; // 0 - uint32 UniqueBitFlag; // 1 + uint16 UniqueBitFlag; }; struct QuestXPEntry { - uint32 ID; // 0 - uint32 Exp[10]; // 1 + uint16 Exp[10]; +}; + +struct RandPropPointsEntry +{ + uint16 EpicPropertiesPoints[5]; + uint16 RarePropertiesPoints[5]; + uint16 UncommonPropertiesPoints[5]; }; struct ScalingStatDistributionEntry { - uint32 ID; // 0 - uint32 MinLevel; // 1 - uint32 MaxLevel; // 2 - uint32 ItemLevelCurveID; // 3 -}; - -struct SoundEntriesEntry -{ - uint32 ID; // 0 - uint32 SoundType; // 1 - LocalizedString* Name; // 2 - uint32 FileDataID[20]; // 3-22 - uint32 Freq[20]; // 23-42 - float VolumeFloat; // 43 - uint32 Flags; // 44 - float MinDistance; // 45 - float DistanceCutoff; // 46 - uint32 EAXDef; // 47 - uint32 SoundEntriesAdvancedID; // 48 - float VolumeVariationPlus; // 49 - float VolumeVariationMinus; // 50 - float PitchVariationPlus; // 51 - float PitchVariationMinus; // 52 - float PitchAdjust; // 53 - uint32 DialogType; // 54 - uint32 BusOverwriteID; // 55 + uint16 ItemLevelCurveID; + uint8 MinLevel; + uint8 MaxLevel; +}; + +struct SkillLineEntry +{ + LocalizedString* DisplayName; + LocalizedString* Description; + LocalizedString* AlternateVerb; + uint16 SpellIconID; + uint16 Flags; + uint8 CategoryID; + uint8 CanLink; + uint8 ParentSkillLineID; +}; + +struct SkillLineAbilityEntry +{ + uint32 SpellID; + uint32 RaceMask; + uint32 ClassMask; + uint32 SupercedesSpell; + uint16 SkillLine; + uint16 MinSkillLineRank; + uint16 TrivialSkillLineRankHigh; + uint16 TrivialSkillLineRankLow; + uint16 UniqueBit; + uint16 TradeSkillCategoryID; + uint8 AquireMethod; + uint8 NumSkillUps; +}; + +struct SkillRaceClassInfoEntry +{ + int32 RaceMask; + uint16 SkillID; + int16 ClassMask; + uint16 Flags; + uint16 SkillTierID; + uint8 Availability; + uint8 MinLevel; +}; + +struct SoundKitEntry +{ + uint32 ID; + uint8 SoundType; + LocalizedString* Name; + float VolumeFloat; + float MinDistance; + float DistanceCutoff; + float VolumeVariationPlus; + float VolumeVariationMinus; + float PitchVariationPlus; + float PitchVariationMinus; + float PitchAdjust; + uint16 Flags; + uint16 SoundEntriesAdvancedID; + uint8 EAXDef; + uint8 DialogType; + uint8 BusOverwriteID; + uint8 Unk700; }; struct SpecializationSpellsEntry { - uint32 ID; // 0 - uint32 SpecID; // 1 - uint32 OrderIndex; // 2 - uint32 SpellID; // 3 - uint32 OverridesSpellID; // 4 - LocalizedString* Description; // 5 + uint32 ID; + uint32 SpellID; + uint32 OverridesSpellID; + LocalizedString* Description; + uint16 SpecID; + uint8 OrderIndex; +}; + +struct SpellEntry +{ + uint32 ID; + LocalizedString* Name; + LocalizedString* NameSubtext; + LocalizedString* Description; + LocalizedString* AuraDescription; + uint32 MiscID; + uint16 DescriptionVariablesID; +}; + +struct SpellAuraOptionsEntry +{ + uint32 SpellID; + uint32 ProcCharges; + uint32 ProcTypeMask; + uint32 ProcCategoryRecovery; + uint16 CumulativeAura; + uint8 DifficultyID; + uint8 ProcChance; + uint8 SpellProcsPerMinuteID; }; struct SpellAuraRestrictionsEntry { - uint32 ID; // 0 - uint32 CasterAuraState; // 1 - uint32 TargetAuraState; // 2 - uint32 ExcludeCasterAuraState; // 3 - uint32 ExcludeTargetAuraState; // 4 - uint32 CasterAuraSpell; // 5 - uint32 TargetAuraSpell; // 6 - uint32 ExcludeCasterAuraSpell; // 7 - uint32 ExcludeTargetAuraSpell; // 8 + uint32 SpellID; + uint32 CasterAuraSpell; + uint32 TargetAuraSpell; + uint32 ExcludeCasterAuraSpell; + uint32 ExcludeTargetAuraSpell; + uint8 DifficultyID; + uint8 CasterAuraState; + uint8 TargetAuraState; + uint8 ExcludeCasterAuraState; + uint8 ExcludeTargetAuraState; +}; + +struct SpellCastTimesEntry +{ + int32 CastTime; + int32 MinCastTime; + int16 CastTimePerLevel; }; struct SpellCastingRequirementsEntry { - uint32 ID; // 0 - uint32 FacingCasterFlags; // 1 - uint32 MinFactionID; // 1 - uint32 MinReputation; // 3 - uint32 RequiredAreasID; // 4 - uint32 RequiredAuraVision; // 5 - uint32 RequiresSpellFocus; // 6 + uint32 SpellID; + uint16 MinFactionID; + uint16 RequiredAreasID; + uint16 RequiresSpellFocus; + uint8 FacingCasterFlags; + uint8 MinReputation; + uint8 RequiredAuraVision; }; -struct SpellCastTimesEntry +struct SpellCategoriesEntry +{ + uint32 SpellID; + uint16 Category; + uint16 StartRecoveryCategory; + uint16 ChargeCategory; + uint8 DifficultyID; + uint8 DefenseType; + uint8 DispelType; + uint8 Mechanic; + uint8 PreventionType; +}; + +struct SpellCategoryEntry { - uint32 ID; // 0 - int32 CastTime; // 1 - int32 CastTimePerLevel; // 2 - int32 MinCastTime; // 3 + LocalizedString* Name; + int32 ChargeRecoveryTime; + uint8 Flags; + uint8 UsesPerWeek; + uint8 MaxCharges; }; struct SpellClassOptionsEntry { - uint32 ID; // 0 - uint32 ModalNextSpell; // 1 - flag128 SpellClassMask; // 2-5 - uint32 SpellClassSet; // 6 + uint32 SpellID; + flag128 SpellClassMask; + uint16 ModalNextSpell; + uint8 SpellClassSet; +}; + +struct SpellCooldownsEntry +{ + uint32 SpellID; + uint32 CategoryRecoveryTime; + uint32 RecoveryTime; + uint32 StartRecoveryTime; + uint8 DifficultyID; }; struct SpellDurationEntry { - uint32 ID; // 0 - int32 Duration[3]; // 1-3 + int32 Duration; + int32 MaxDuration; + int16 DurationPerLevel; +}; + +struct SpellEffectEntry +{ + uint32 ID; + float EffectAmplitude; + uint32 EffectAuraPeriod; + uint32 EffectBasePoints; + float EffectBonusCoefficient; + float EffectChainAmplitude; + uint32 EffectDieSides; + uint32 EffectItemType; + int32 EffectMiscValue; + int32 EffectMiscValueB; + float EffectPointsPerResource; + float EffectRealPointsPerLevel; + flag128 EffectSpellClassMask; + uint32 EffectTriggerSpell; + float EffectPosFacing; + uint32 SpellID; + uint32 EffectAttributes; + float BonusCoefficientFromAP; + uint16 EffectAura; + uint16 EffectChainTargets; + uint8 DifficultyID; + uint8 Effect; + uint8 EffectMechanic; + uint8 EffectRadiusIndex; + uint8 EffectRadiusMaxIndex; + uint8 ImplicitTarget[2]; + uint8 EffectIndex; +}; + +#define MAX_SPELL_EFFECTS 32 +#define MAX_EFFECT_MASK 0xFFFFFFFF + +struct SpellEffectScalingEntry +{ + float Coefficient; + float Variance; + float ResourceCoefficient; + uint32 SpellEffectID; +}; + +struct SpellEquippedItemsEntry +{ + uint32 SpellID; + int32 EquippedItemInventoryTypeMask; + int32 EquippedItemSubClassMask; + int8 EquippedItemClass; +}; + +struct SpellFocusObjectEntry +{ + LocalizedString* Name; +}; + +struct SpellInterruptsEntry +{ + uint32 SpellID; + uint32 AuraInterruptFlags[2]; + uint32 ChannelInterruptFlags[2]; + uint16 InterruptFlags; + uint8 DifficultyID; }; struct SpellItemEnchantmentConditionEntry { - uint32 ID; // 0 - uint8 LTOperandType[5]; // 1-2 - uint32 LTOperand[5]; // 2-6 - uint8 Operator[5]; // 7-8 - uint8 RTOperandType[5]; // 8-9 - uint32 RTOperand[5]; // 10-14 - uint8 Logic[5]; // 15-16 + uint8 LTOperandType[5]; + uint8 LTOperand[5]; + uint8 Operator[5]; + uint8 RTOperandType[5]; + uint8 RTOperand[5]; + uint8 Logic[5]; }; struct SpellLearnSpellEntry { - uint32 ID; // 0 - uint32 LearnSpellID; // 1 - uint32 SpellID; // 2 - uint32 OverridesSpellID; // 3 + uint32 LearnSpellID; + uint32 SpellID; + uint32 OverridesSpellID; +}; + +struct SpellLevelsEntry +{ + uint32 SpellID; + uint16 BaseLevel; + uint16 MaxLevel; + uint16 SpellLevel; + uint8 DifficultyID; }; struct SpellMiscEntry { - uint32 ID; // 0 - uint32 Attributes; // 1 - uint32 AttributesEx; // 2 - uint32 AttributesExB; // 3 - uint32 AttributesExC; // 4 - uint32 AttributesExD; // 5 - uint32 AttributesExE; // 6 - uint32 AttributesExF; // 7 - uint32 AttributesExG; // 8 - uint32 AttributesExH; // 9 - uint32 AttributesExI; // 10 - uint32 AttributesExJ; // 11 - uint32 AttributesExK; // 12 - uint32 AttributesExL; // 13 - uint32 AttributesExM; // 14 - uint32 CastingTimeIndex; // 15 - uint32 DurationIndex; // 16 - uint32 RangeIndex; // 17 - float Speed; // 18 - uint32 SpellIconID; // 21 - uint32 ActiveIconID; // 22 - uint32 SchoolMask; // 23 - float MultistrikeSpeedMod; // 24 + uint32 Attributes; + uint32 AttributesEx; + uint32 AttributesExB; + uint32 AttributesExC; + uint32 AttributesExD; + uint32 AttributesExE; + uint32 AttributesExF; + uint32 AttributesExG; + uint32 AttributesExH; + uint32 AttributesExI; + uint32 AttributesExJ; + uint32 AttributesExK; + uint32 AttributesExL; + uint32 AttributesExM; + float Speed; + float MultistrikeSpeedMod; + uint16 CastingTimeIndex; + uint16 DurationIndex; + uint16 RangeIndex; + uint16 SpellIconID; + uint16 ActiveIconID; + uint8 SchoolMask; }; struct SpellPowerEntry { - uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 PowerIndex; // 2 - uint32 PowerType; // 3 - uint32 ManaCost; // 4 - uint32 ManaCostPerLevel; // 5 - uint32 ManaCostPerSecond; // 6 - uint32 ManaCostAdditional; // 7 Spell uses [ManaCost, ManaCost+ManaCostAdditional] power - affects tooltip parsing as multiplier on SpellEffectEntry::EffectPointsPerResource + uint32 ID; + uint32 SpellID; + uint32 ManaCost; + float ManaCostPercentage; + float ManaCostPercentagePerSecond; + uint32 RequiredAura; + float HealthCostPercentage; + uint16 ManaCostPerSecond; + uint16 ManaCostAdditional; // Spell uses [ManaCost, ManaCost+ManaCostAdditional] power - affects tooltip parsing as multiplier on SpellEffectEntry::EffectPointsPerResource // only SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL, SPELL_EFFECT_WEAPON_PERCENT_DAMAGE, SPELL_EFFECT_WEAPON_DAMAGE, SPELL_EFFECT_NORMALIZED_WEAPON_DMG - uint32 PowerDisplayID; // 8 - uint32 UnitPowerBarID; // 9 - float ManaCostPercentage; // 10 - float ManaCostPercentagePerSecond; // 11 - uint32 RequiredAura; // 12 - float HealthCostPercentage; // 13 + uint16 PowerDisplayID; + uint16 UnitPowerBarID; + uint8 PowerIndex; + uint8 PowerType; + uint8 ManaCostPerLevel; }; struct SpellPowerDifficultyEntry { - uint32 SpellPowerID; // 0 - uint32 DifficultyID; // 1 - uint32 PowerIndex; // 2 + uint32 SpellPowerID; + uint8 DifficultyID; + uint8 PowerIndex; }; struct SpellProcsPerMinuteEntry @@ -1279,173 +1583,213 @@ struct SpellProcsPerMinuteModEntry struct SpellRadiusEntry { - uint32 ID; // 0 - float Radius; // 1 - float RadiusPerLevel; // 2 - float RadiusMin; // 3 - float RadiusMax; // 4 + float Radius; + float RadiusPerLevel; + float RadiusMin; + float RadiusMax; }; struct SpellRangeEntry { - uint32 ID; // 0 - float MinRangeHostile; // 1 - float MinRangeFriend; // 2 - float MaxRangeHostile; // 3 - float MaxRangeFriend; // 4 - uint32 Flags; // 5 - LocalizedString* DisplayName; // 6 - LocalizedString* DisplayNameShort; // 7 + float MinRangeHostile; + float MinRangeFriend; + float MaxRangeHostile; + float MaxRangeFriend; + LocalizedString* DisplayName; + LocalizedString* DisplayNameShort; + uint8 Flags; }; #define MAX_SPELL_REAGENTS 8 struct SpellReagentsEntry { - uint32 ID; // 0 - int32 Reagent[MAX_SPELL_REAGENTS]; // 1-8 - uint32 ReagentCount[MAX_SPELL_REAGENTS]; // 9-16 + uint32 SpellID; + int32 Reagent[MAX_SPELL_REAGENTS]; + uint16 ReagentCount[MAX_SPELL_REAGENTS]; +}; + +struct SpellScalingEntry +{ + uint32 SpellID; + uint16 ScalesFromItemLevel; + int8 ScalingClass; + uint8 MaxScalingLevel; +}; + +struct SpellShapeshiftEntry +{ + uint32 SpellID; + uint32 ShapeshiftExclude[2]; + uint32 ShapeshiftMask[2]; + uint8 StanceBarOrder; }; -struct SpellRuneCostEntry +#define MAX_SHAPESHIFT_SPELLS 8 + +struct SpellShapeshiftFormEntry { - uint32 ID; // 0 - uint32 RuneCost[4]; // 1-4 (0=blood, 1=unholy, 2=frost, 3=death) - uint32 RunicPower; // 5 + LocalizedString* Name; + float WeaponDamageVariance; + uint32 Flags; + uint16 AttackIconID; + uint16 CombatRoundTime; + uint16 CreatureDisplayID[4]; + uint16 PresetSpellID[MAX_SHAPESHIFT_SPELLS]; + int8 CreatureType; + uint8 MountTypeID; + uint8 BonusActionBar; +}; - bool NoRuneCost() const { return RuneCost[0] == 0 && RuneCost[1] == 0 && RuneCost[2] == 0 && RuneCost[3] == 0; } - bool NoRunicPowerGain() const { return RunicPower == 0; } +struct SpellTargetRestrictionsEntry +{ + uint32 SpellID; + float ConeAngle; + float Width; + uint32 Targets; + uint16 MaxTargetLevel; + uint16 TargetCreatureType; + uint8 DifficultyID; + uint8 MaxAffectedTargets; }; #define MAX_SPELL_TOTEMS 2 struct SpellTotemsEntry { - uint32 ID; // 0 - uint32 RequiredTotemCategoryID[MAX_SPELL_TOTEMS]; // 1 - uint32 Totem[MAX_SPELL_TOTEMS]; // 2 + uint32 SpellID; + uint32 Totem[MAX_SPELL_TOTEMS]; + uint8 RequiredTotemCategoryID[MAX_SPELL_TOTEMS]; }; struct SpellXSpellVisualEntry { - uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - uint32 SpellVisualID[2]; // 3-4 - float Unk620; // 5 - uint32 PlayerConditionID; // 6 - uint32 Flags; // 7 + uint32 ID; + uint32 SpellID; + float Unk620; + uint16 SpellVisualID[2]; + uint16 PlayerConditionID; + uint8 DifficultyID; + uint8 Flags; }; struct TaxiNodesEntry { - uint32 ID; // 0 - uint32 MapID; // 1 - DBCPosition3D Pos; // 2-4 - LocalizedString* Name; // 5 - uint32 MountCreatureID[2]; // 6-7 - uint32 ConditionID; // 8 - uint32 LearnableIndex; // 9 - some kind of index only for learnable nodes - uint32 Flags; // 10 - DBCPosition2D MapOffset; // 11-12 + uint32 ID; + DBCPosition3D Pos; + LocalizedString* Name; + uint32 MountCreatureID[2]; + DBCPosition2D MapOffset; + uint16 MapID; + uint16 ConditionID; + uint16 LearnableIndex; + uint8 Flags; }; struct TaxiPathEntry { - uint32 ID; // 0 - uint32 From; // 1 - uint32 To; // 2 - uint32 Cost; // 3 + uint32 ID; + uint16 From; + uint16 To; + uint16 Cost; }; struct TaxiPathNodeEntry { - uint32 ID; // 0 - uint32 PathID; // 1 - uint32 NodeIndex; // 2 - uint32 MapID; // 3 - DBCPosition3D Loc; // 4-6 - uint32 Flags; // 7 - uint32 Delay; // 8 - uint32 ArrivalEventID; // 9 - uint32 DepartureEventID; // 10 + uint32 ID; + DBCPosition3D Loc; + uint32 Delay; + uint16 PathID; + uint16 MapID; + uint16 ArrivalEventID; + uint16 DepartureEventID; + uint8 NodeIndex; + uint8 Flags; }; struct TotemCategoryEntry { - uint32 ID; // 0 - LocalizedString* Name; // 1 - uint32 CategoryType; // 2 - uint32 CategoryMask; // 3 + LocalizedString* Name; + uint32 CategoryMask; + uint8 CategoryType; }; struct ToyEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 Flags; // 2 - LocalizedString* Description; // 3 - uint32 CategoryFilter; // 4 + uint32 ID; + uint32 ItemID; + LocalizedString* Description; + uint8 Flags; + uint8 CategoryFilter; }; struct TransportAnimationEntry { - uint32 ID; // 0 - uint32 TransportID; // 1 - uint32 TimeIndex; // 2 - DBCPosition3D Pos; // 3-5 - uint32 SequenceID; // 6 + uint32 TransportID; + uint32 TimeIndex; + DBCPosition3D Pos; + uint8 SequenceID; }; struct TransportRotationEntry { - uint32 ID; // 0 - uint32 TransportID; // 1 - uint32 TimeIndex; // 2 - float X; // 3 - float Y; // 4 - float Z; // 5 - float W; // 6 + uint32 TransportID; + uint32 TimeIndex; + float X; + float Y; + float Z; + float W; }; struct UnitPowerBarEntry { - uint32 ID; // 0 - uint32 MinPower; // 1 - uint32 MaxPower; // 2 - uint32 StartPower; // 3 - uint32 CenterPower; // 4 - float RegenerationPeace; // 5 - float RegenerationCombat; // 6 - uint32 BarType; // 7 - uint32 FileDataID[6]; // 8-13 - uint32 Color[6]; // 14-19 - uint32 Flags; // 20 - LocalizedString* Name; // 21 - LocalizedString* Cost; // 22 - LocalizedString* OutOfError; // 23 - LocalizedString* ToolTip; // 24 - float StartInset; // 25 - float EndInset; // 26 + uint32 MaxPower; + float RegenerationPeace; + float RegenerationCombat; + uint32 FileDataID[6]; + uint32 Color[6]; + LocalizedString* Name; + LocalizedString* Cost; + LocalizedString* OutOfError; + LocalizedString* ToolTip; + float StartInset; + float EndInset; + uint16 StartPower; + uint16 Flags; + uint8 MinPower; + uint8 CenterPower; + uint8 BarType; }; #define MAX_WORLD_MAP_OVERLAY_AREA_IDX 4 struct WorldMapOverlayEntry { - uint32 ID; // 0 - uint32 MapAreaID; // 1 idx in WorldMapArea.dbc - uint32 AreaID[MAX_WORLD_MAP_OVERLAY_AREA_IDX]; // 2-5 - LocalizedString* TextureName; // 6 - uint32 TextureWidth; // 7 - uint32 TextureHeight; // 8 - uint32 OffsetX; // 9 - uint32 OffsetY; // 10 - uint32 HitRectTop; // 11 - uint32 HitRectLeft; // 12 - uint32 HitRectBottom; // 13 - uint32 HitRectRight; // 14 - uint32 PlayerConditionID; // 15 + char const* TextureName; + uint16 MapAreaID; // idx in WorldMapArea.dbc + uint16 AreaID[MAX_WORLD_MAP_OVERLAY_AREA_IDX]; + uint16 TextureWidth; + uint16 TextureHeight; + uint16 OffsetX; + uint16 OffsetY; + uint16 HitRectTop; + uint16 HitRectLeft; + uint16 HitRectBottom; + uint16 HitRectRight; + uint16 PlayerConditionID; +}; + +struct WorldMapTransformsEntry +{ + DBCPosition3D RegionMin; + DBCPosition3D RegionMax; + DBCPosition2D RegionOffset; + float RegionScale; + uint16 MapID; + uint16 NewMapID; + uint16 NewDungeonMapID; + uint16 NewAreaID; + uint8 Flags; }; #pragma pack(pop) @@ -1465,7 +1809,7 @@ typedef std::map<uint32, TaxiPathSetForSource> TaxiPathSetBySource; typedef std::vector<TaxiPathNodeEntry const*> TaxiPathNodeList; typedef std::vector<TaxiPathNodeList> TaxiPathNodesByPath; -#define TaxiMaskSize 217 +#define TaxiMaskSize 226 typedef std::array<uint8, TaxiMaskSize> TaxiMask; #endif diff --git a/src/server/game/DataStores/DB2fmt.h b/src/server/game/DataStores/DB2fmt.h index 2a64a2d4eb5..1e8c3be57ea 100644 --- a/src/server/game/DataStores/DB2fmt.h +++ b/src/server/game/DataStores/DB2fmt.h @@ -18,113 +18,154 @@ #ifndef TRINITY_DB2SFRM_H #define TRINITY_DB2SFRM_H -char const AchievementFormat[] = "niiissiiiiisiii"; -char const AreaGroupMemberFormat[] = "nii"; -char const AuctionHouseFormat[] = "niiis"; -char const BarberShopStyleFormat[] = "nissfiii"; -char const BattlePetBreedQualityFormat[] = "nif"; -char const BattlePetBreedStateFormat[] = "niii"; -char const BattlePetSpeciesFormat[] = "niiiiiiss"; -char const BattlePetSpeciesStateFormat[] = "niii"; -char const BroadcastTextFormat[] = "nissiiiiiiiii"; -char const CharStartOutfitFormat[] = "nbbbbiiiiiiiiiiiiiiiiiiiiiiiiii"; -char const ChrClassesXPowerTypesFormat[] = "iii"; -char const CinematicSequencesFormat[] = "niiiiiiiii"; -char const CreatureDisplayInfoFormat[] = "niiiffissssiiiiiiiiiii"; -char const CreatureTypeFormat[] = "nsi"; -char const CriteriaFormat[] = "niiiiiiiiiii"; -char const CriteriaTreeFormat[] = "niliiisi"; -char const CurrencyTypesFormat[] = "nisssiiiiiis"; -char const CurvePointFormat[] = "niiff"; -char const DestructibleModelDataFormat[] = "niiiiiiiiiiiiiiiiiiiiiii"; -char const DurabilityQualityFormat[] = "nf"; -char const GameObjectsFormat[] = "niiffffffffiiiiiiiiiiiis"; -char const GameTablesFormat[] = "nsii"; -char const GarrAbilityFormat[] = "nissiiii"; -char const GarrBuildingFormat[] = "niiiiissssiiiiiiiiiiiiii"; -char const GarrBuildingPlotInstFormat[] = "niiiff"; -char const GarrClassSpecFormat[] = "nsssii"; -char const GarrFollowerFormat[] = "niiiiiiiiiiiiiiissiiiiii"; -char const GarrFollowerXAbilityFormat[] = "niii"; -char const GarrPlotBuildingFormat[] = "nii"; -char const GarrPlotFormat[] = "niiisiiii"; -char const GarrPlotInstanceFormat[] = "nis"; -char const GarrSiteLevelFormat[] = "niiiiffiiii"; -char const GarrSiteLevelPlotInstFormat[] = "niiffi"; -char const GlyphSlotFormat[] = "nii"; -char const HeirloomFormat[] = "niisiiiiiiii"; -char const GuildPerkSpellsFormat[] = "nii"; -char const HolidaysEntryFormat[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiii"; -char const ImportPriceArmorFormat[] = "nffff"; -char const ImportPriceQualityFormat[] = "nf"; -char const ImportPriceShieldFormat[] = "nf"; -char const ImportPriceWeaponFormat[] = "nf"; -char const ItemAppearanceFormat[] = "nii"; -char const ItemBonusFormat[] = "niiiii"; -char const ItemBonusTreeNodeFormat[] = "niiii"; -char const ItemClassFormat[] = "nifs"; -char const ItemCurrencyCostFormat[] = "in"; -char const ItemDisenchantLootFormat[] = "niiiiii"; -char const ItemEffectFormat[] = "niiiiiiiii"; -char const ItemExtendedCostFormat[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiii"; -char const ItemFormat[] = "niiiiiiii"; -char const ItemLimitCategoryFormat[] = "nsii"; -char const ItemModifiedAppearanceFormat[] = "niiiii"; -char const ItemPriceBaseFormat[] = "niff"; -char const ItemRandomPropertiesFormat[] = "nsiiiiis"; -char const ItemRandomSuffixFormat[] = "nssiiiiiiiiii"; -char const ItemSparseFormat[] = "niiiiffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffffffiiifisssssiiiiiiiiiiiiiiiiiiifiiifiii"; -char const ItemSpecFormat[] = "niiiiii"; -char const ItemSpecOverrideFormat[] = "nii"; -char const ItemToBattlePetSpeciesFormat[] = "ni"; -char const ItemXBonusTreeFormat[] = "nii"; -char const KeyChainFormat[] = "nbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; -char const MailTemplateFormat[] = "ns"; -char const ModifierTreeFormat[] = "niiiiii"; -char const MountCapabilityFormat[] = "niiiiiii"; -char const MountFormat[] = "niiiisssii"; -char const MountTypeXCapabilityFormat[] = "niii"; -char const NameGenFormat[] = "nsii"; -char const NamesProfanityFormat[] = "nSi"; -char const NamesReservedFormat[] = "nS"; -char const NamesReservedLocaleFormat[] = "nSi"; -char const OverrideSpellDataFormat[] = "niiiiiiiiiiii"; -char const PhaseXPhaseGroupFormat[] = "nii"; -char const PlayerConditionFormat[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiii"; -char const QuestMoneyRewardFormat[] = "niiiiiiiiii"; -char const QuestPackageItemfmt[] = "niiii"; -char const QuestSortFormat[] = "ns"; -char const QuestV2Format[] = "ni"; -char const QuestXPFormat[] = "niiiiiiiiii"; -char const ScalingStatDistributionFormat[] = "niii"; -char const SoundEntriesFormat[] = "nisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiififfiifffffii"; -char const SpecializationSpellsFormat[] = "niiiis"; -char const SpellAuraRestrictionsFormat[] = "niiiiiiii"; -char const SpellCastTimesFormat[] = "niii"; -char const SpellCastingRequirementsFormat[] = "niiiiii"; -char const SpellClassOptionsFormat[] = "niiiiii"; -char const SpellDurationFormat[] = "niii"; -char const SpellItemEnchantmentConditionFormat[] = "nbbbbbiiiiibbbbbbbbbbiiiiibbbbb"; -char const SpellLearnSpellFormat[] = "niii"; -char const SpellMiscFormat[] = "niiiiiiiiiiiiiiiiifiiif"; -char const SpellPowerDifficultyFormat[] = "nii"; -char const SpellPowerFormat[] = "niiiiiiiiiffif"; -char const SpellProcsPerMinuteFormat[] = "nfi"; -char const SpellProcsPerMinuteModFormat[] = "niifi"; -char const SpellRadiusFormat[] = "nffff"; -char const SpellRangeFormat[] = "nffffiss"; -char const SpellReagentsFormat[] = "niiiiiiiiiiiiiiii"; -char const SpellRuneCostFormat[] = "niiiii"; -char const SpellTotemsFormat[] = "niiii"; -char const SpellXSpellVisualFormat[] = "niiiifii"; -char const TaxiNodesFormat[] = "nifffsiiiiiff"; -char const TaxiPathFormat[] = "niii"; -char const TaxiPathNodeFormat[] = "niiifffiiii"; -char const TotemCategoryFormat[] = "nsii"; -char const ToyFormat[] = "niisi"; -char const TransportAnimationFormat[] = "niifffi"; -char const TransportRotationFormat[] = "niiffff"; -char const UnitPowerBarFormat[] = "niiiiffiiiiiiiiiiiiiissssff"; -char const WorldMapOverlayFormat[] = "niiiiisiiiiiiiii"; +char const AchievementFormat[] = "nssishhhhhhhbbb"; +char const AnimKitFormat[] = "dihh"; +char const AreaGroupMemberFormat[] = "dhh"; +char const ArmorLocationFormat[] = "dfffff"; +char const AuctionHouseFormat[] = "dshbb"; +char const BankBagSlotPricesFormat[] = "di"; +char const BarberShopStyleFormat[] = "nssfbbbb"; +char const BattlePetBreedQualityFormat[] = "dfb"; +char const BattlePetBreedStateFormat[] = "nhbb"; +char const BattlePetSpeciesFormat[] = "niiisshbb"; +char const BattlePetSpeciesStateFormat[] = "nihb"; +char const BroadcastTextFormat[] = "dsshhhhhhhhbb"; +char const CharStartOutfitFormat[] = "diiiiiiiiiiiiiiiiiiiiiiiiibbbbb"; +char const ChrClassesXPowerTypesFormat[] = "dbb"; +char const ChrRacesFormat[] = "niSSsssSSSiiffffffihhhhhhhhhhhhbbbbbbbbb"; +char const CinematicSequencesFormat[] = "dhhhhhhhhh"; +char const CreatureDisplayInfoFormat[] = "niffiiiSiiihhhhhhbbbbbb"; +char const CreatureDisplayInfoExtraFormat[] = "diiiiiiiiiiiibbbbbbbbbbbb"; +char const CreatureTypeFormat[] = "dsb"; +char const CriteriaFormat[] = "diiihhhbbbbb"; +char const CriteriaTreeFormat[] = "dishhhhb"; +char const CurrencyTypesFormat[] = "nSSsiiisbbbb"; +char const CurvePointFormat[] = "dffhb"; +char const DestructibleModelDataFormat[] = "dhhhhhbbbbbbbbbbbbbbbbb"; +char const DurabilityCostsFormat[] = "dhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"; +char const DurabilityQualityFormat[] = "df"; +char const EmotesTextSoundFormat[] = "dhhbbb"; +char const GameObjectsFormat[] = "nffffffffiiiiiiiishhhhbb"; +char const GameObjectDisplayInfoFormat[] = "diffffffffhhhhhhhhhhh"; +char const GameTablesFormat[] = "dshb"; +char const GarrAbilityFormat[] = "nssihbbb"; +char const GarrBuildingFormat[] = "diissssihhhhhhbbbbbbbbbbb"; +char const GarrBuildingPlotInstFormat[] = "nffhhb"; +char const GarrClassSpecFormat[] = "nssshb"; +char const GarrFollowerFormat[] = "diissiihhbbbbbbbbbbbbbbbb"; +char const GarrFollowerXAbilityFormat[] = "dhhb"; +char const GarrPlotFormat[] = "dsiibbbbb"; +char const GarrPlotBuildingFormat[] = "dbb"; +char const GarrPlotInstanceFormat[] = "dsb"; +char const GarrSiteLevelFormat[] = "dffhhhbbbbb"; +char const GarrSiteLevelPlotInstFormat[] = "dffhbb"; +char const GlyphSlotFormat[] = "dbb"; +char const GuildColorBackgroundFormat[] = "dbbb"; +char const GuildColorBorderFormat[] = "dbbb"; +char const GuildColorEmblemFormat[] = "dbbb"; +char const GuildPerkSpellsFormat[] = "dib"; +char const HeirloomFormat[] = "nisiiiiihhbb"; +char const HolidaysEntryFormat[] = "diiiiiiiiiiiiiiiiShhhhhhhhhhhbbbbbbbbbbbbbbbb"; +char const ImportPriceArmorFormat[] = "dffff"; +char const ImportPriceQualityFormat[] = "df"; +char const ImportPriceShieldFormat[] = "df"; +char const ImportPriceWeaponFormat[] = "df"; +char const ItemFormat[] = "dibbbbbbb"; +char const ItemAppearanceFormat[] = "diib"; +char const ItemArmorQualityFormat[] = "dfffffffh"; +char const ItemArmorShieldFormat[] = "dfffffffh"; +char const ItemArmorTotalFormat[] = "dffffh"; +char const ItemBagFamilyFormat[] = "ds"; +char const ItemBonusFormat[] = "niihbb"; +char const ItemBonusTreeNodeFormat[] = "dhhhb"; +char const ItemClassFormat[] = "dfsb"; +char const ItemCurrencyCostFormat[] = "di"; +char const ItemDamageAmmoFormat[] = "dfffffffh"; +char const ItemDamageOneHandFormat[] = "dfffffffh"; +char const ItemDamageOneHandCasterFormat[] = "dfffffffh"; +char const ItemDamageTwoHandFormat[] = "dfffffffh"; +char const ItemDamageTwoHandCasterFormat[] = "dfffffffh"; +char const ItemDisenchantLootFormat[] = "dhhhbbb"; +char const ItemEffectFormat[] = "diiiihhhbb"; +char const ItemExtendedCostFormat[] = "diiiiiiiiiiihhhhhhhhhhhbbbbb"; +char const ItemLimitCategoryFormat[] = "dsbb"; +char const ItemModifiedAppearanceFormat[] = "nihbb"; +char const ItemPriceBaseFormat[] = "dffh"; +char const ItemRandomPropertiesFormat[] = "dshhhhh"; +char const ItemRandomSuffixFormat[] = "dsshhhhhhhhhh"; +char const ItemSetSpellFormat[] = "dihhb"; +char const ItemSparseFormat[] = "iiiffiiiiiiiiiiiiiiiiifffffffffffsssssififhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; +char const ItemSpecFormat[] = "dhbbbbb"; +char const ItemSpecOverrideFormat[] = "dih"; +char const ItemToBattlePetSpeciesFormat[] = "dh"; +char const ItemXBonusTreeFormat[] = "dih"; +char const KeyChainFormat[] = "dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; +char const MailTemplateFormat[] = "ds"; +char const ModifierTreeFormat[] = "diihbbbb"; +char const MountFormat[] = "niissshhhb"; +char const MountCapabilityFormat[] = "niihhhbb"; +char const MountTypeXCapabilityFormat[] = "dhhb"; +char const MovieFormat[] = "diibb"; +char const NameGenFormat[] = "dsbb"; +char const NamesProfanityFormat[] = "dSb"; +char const NamesReservedFormat[] = "dS"; +char const NamesReservedLocaleFormat[] = "dSb"; +char const OverrideSpellDataFormat[] = "diiiiiiiiiiib"; +char const PhaseXPhaseGroupFormat[] = "dhh"; +char const PlayerConditionFormat[] = "diiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; +char const PowerDisplayFormat[] = "dSbbbb"; +char const QuestFactionRewardFormat[] = "dhhhhhhhhhh"; +char const QuestMoneyRewardFormat[] = "diiiiiiiiii"; +char const QuestPackageItemFormat[] = "dihbb"; +char const QuestSortFormat[] = "ds"; +char const QuestV2Format[] = "dh"; +char const QuestXPFormat[] = "dhhhhhhhhhh"; +char const RandPropPointsFormat[] = "dhhhhhhhhhhhhhhh"; +char const ScalingStatDistributionFormat[] = "dhbb"; +char const SkillLineFormat[] = "dssshhbbb"; +char const SkillLineAbilityFormat[] = "diiiihhhhhhbb"; +char const SkillRaceClassInfoFormat[] = "dihhhhbb"; +char const SoundKitFormat[] = "nsffffffffhhbbbbb"; +char const SpecializationSpellsFormat[] = "niishb"; +char const SpellFormat[] = "nssssih"; +char const SpellAuraOptionsFormat[] = "diiiihbbb"; +char const SpellAuraRestrictionsFormat[] = "diiiiibbbbb"; +char const SpellCastTimesFormat[] = "diih"; +char const SpellCastingRequirementsFormat[] = "dihhhbbb"; +char const SpellCategoriesFormat[] = "dihhhbbbbb"; +char const SpellCategoryFormat[] = "dsibbb"; +char const SpellClassOptionsFormat[] = "diiiiihb"; +char const SpellCooldownsFormat[] = "diiiib"; +char const SpellDurationFormat[] = "diih"; +char const SpellEffectFormat[] = "nfiiffiiiiffiiiiifiifhhbbbbbbbb"; +char const SpellEffectScalingFormat[] = "dfffi"; +char const SpellEquippedItemsFormat[] = "diiib"; +char const SpellFocusObjectFormat[] = "ds"; +char const SpellInterruptsFormat[] = "diiiiihb"; +char const SpellItemEnchantmentConditionFormat[] = "dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; +char const SpellLearnSpellFormat[] = "diii"; +char const SpellLevelsFormat[] = "dihhhb"; +char const SpellMiscFormat[] = "diiiiiiiiiiiiiiffhhhhhb"; +char const SpellPowerFormat[] = "niiffifhhhhbbb"; +char const SpellPowerDifficultyFormat[] = "nbb"; +char const SpellRadiusFormat[] = "dffff"; +char const SpellRangeFormat[] = "dffffssb"; +char const SpellReagentsFormat[] = "diiiiiiiiihhhhhhhh"; +char const SpellScalingFormat[] = "dihbb"; +char const SpellShapeshiftFormat[] = "diiiiib"; +char const SpellShapeshiftFormFormat[] = "dsfihhhhhhhhhhhhhhbbb"; +char const SpellTargetRestrictionsFormat[] = "diffihhbb"; +char const SpellTotemsFormat[] = "diiibb"; +char const SpellXSpellVisualFormat[] = "nifhhhbb"; +char const TaxiNodesFormat[] = "nfffsiiffhhhb"; +char const TaxiPathFormat[] = "nhhh"; +char const TaxiPathNodeFormat[] = "nfffihhhhbb"; +char const TotemCategoryFormat[] = "dsib"; +char const ToyFormat[] = "nisbb"; +char const TransportAnimationFormat[] = "diifffb"; +char const TransportRotationFormat[] = "diiffff"; +char const UnitPowerBarFormat[] = "diffiiiiiiiiiiiissssffhhbbb"; +char const WorldMapOverlayFormat[] = "dShhhhhhhhhhhhhh"; +char const WorldMapTransformsFormat[] = "dfffffffffhhhhb"; #endif diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 710e92ca712..739b4ac51a0 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -436,6 +436,7 @@ enum Difficulty : uint8 DIFFICULTY_EVENT_SCENARIO = 20, DIFFICULTY_MYTHIC = 23, DIFFICULTY_TIMEWALKER = 24, + DIFFICULTY_PVP_SCENARIO = 25, MAX_DIFFICULTY }; diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 79c42c4fc7b..0e0375826ce 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -23,10 +23,8 @@ #include "DBCfmt.h" #include "Timer.h" #include "DB2Stores.h" - #include <map> - struct WMOAreaTableTripple { WMOAreaTableTripple(int32 r, int32 a, int32 g) : groupId(g), rootId(r), adtId(a) @@ -48,12 +46,9 @@ 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); @@ -62,48 +57,24 @@ 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); @@ -113,37 +84,11 @@ 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); @@ -155,30 +100,24 @@ 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); +GameTable<GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore; +GameTable<GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore; +GameTable<GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore; +GameTable<GtChanceToSpellCritBaseEntry> sGtChanceToSpellCritBaseStore; +GameTable<GtChanceToSpellCritEntry> sGtChanceToSpellCritStore; +GameTable<GtCombatRatingsEntry> sGtCombatRatingsStore; +GameTable<GtItemSocketCostPerLevelEntry> sGtItemSocketCostPerLevelStore; +GameTable<GtNPCManaCostScalerEntry> sGtNPCManaCostScalerStore; +GameTable<GtNpcTotalHpEntry> sGtNpcTotalHpStore[MAX_EXPANSIONS]; +GameTable<GtNpcDamageByClassEntry> sGtNpcDamageByClassStore[MAX_EXPANSIONS]; +GameTable<GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore; +GameTable<GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore; +GameTable<GtOCTHpPerStaminaEntry> sGtOCTHpPerStaminaStore; +GameTable<GtOCTLevelExperienceEntry> sGtOCTLevelExperienceStore; +GameTable<GtRegenMPPerSptEntry> sGtRegenMPPerSptStore; +GameTable<GtSpellScalingEntry> sGtSpellScalingStore; typedef std::list<std::string> StoreProblemList; @@ -297,88 +236,41 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) #define LOAD_DBC(store, file) LoadDBC(availableDbcLocales, bad_dbc_files, store, dbcPath, file, defaultLocale) - LOAD_DBC(sAnimKitStore, "AnimKit.dbc");//20444 - LOAD_DBC(sAreaTableStore, "AreaTable.dbc");//20444 - LOAD_DBC(sAreaTriggerStore, "AreaTrigger.dbc");//20444 - LOAD_DBC(sArmorLocationStore, "ArmorLocation.dbc");//20444 - LOAD_DBC(sBankBagSlotPricesStore, "BankBagSlotPrices.dbc");//20444 - LOAD_DBC(sBannedAddOnsStore, "BannedAddOns.dbc");//20444 - LOAD_DBC(sBattlemasterListStore, "BattlemasterList.dbc");//20444 - LOAD_DBC(sCharSectionsStore, "CharSections.dbc");//20444 - LOAD_DBC(sCharTitlesStore, "CharTitles.dbc");//20444 - LOAD_DBC(sChatChannelsStore, "ChatChannels.dbc");//20444 - LOAD_DBC(sChrClassesStore, "ChrClasses.dbc");//20444 - LOAD_DBC(sChrRacesStore, "ChrRaces.dbc");//20444 - LOAD_DBC(sChrSpecializationStore, "ChrSpecialization.dbc");//20444 - LOAD_DBC(sCreatureDisplayInfoExtraStore, "CreatureDisplayInfoExtra.dbc");//20444 - LOAD_DBC(sCreatureFamilyStore, "CreatureFamily.dbc");//20444 - LOAD_DBC(sCreatureModelDataStore, "CreatureModelData.dbc");//20444 - LOAD_DBC(sDifficultyStore, "Difficulty.dbc");//20444 - LOAD_DBC(sDungeonEncounterStore, "DungeonEncounter.dbc");//20444 - LOAD_DBC(sDurabilityCostsStore, "DurabilityCosts.dbc");//20444 - LOAD_DBC(sEmotesStore, "Emotes.dbc");//20444 - LOAD_DBC(sEmotesTextStore, "EmotesText.dbc");//20444 - LOAD_DBC(sEmotesTextSoundStore, "EmotesTextSound.dbc"); - LOAD_DBC(sFactionStore, "Faction.dbc");//20444 - LOAD_DBC(sFactionTemplateStore, "FactionTemplate.dbc");//20444 - LOAD_DBC(sGameObjectDisplayInfoStore, "GameObjectDisplayInfo.dbc");//20444 - LOAD_DBC(sGemPropertiesStore, "GemProperties.dbc");//20444 - LOAD_DBC(sGlyphPropertiesStore, "GlyphProperties.dbc");//20444 - LOAD_DBC(sGuildColorBackgroundStore, "GuildColorBackground.dbc");//20444 - LOAD_DBC(sGuildColorBorderStore, "GuildColorBorder.dbc"); //20444 - LOAD_DBC(sGuildColorEmblemStore, "GuildColorEmblem.dbc");//20444 - LOAD_DBC(sItemArmorQualityStore, "ItemArmorQuality.dbc");//20444 - LOAD_DBC(sItemArmorShieldStore, "ItemArmorShield.dbc");//20444 - LOAD_DBC(sItemArmorTotalStore, "ItemArmorTotal.dbc");//20444 - LOAD_DBC(sItemBagFamilyStore, "ItemBagFamily.dbc");//20444 - LOAD_DBC(sItemDamageAmmoStore, "ItemDamageAmmo.dbc");//20444 - LOAD_DBC(sItemDamageOneHandCasterStore, "ItemDamageOneHandCaster.dbc");//20444 - LOAD_DBC(sItemDamageOneHandStore, "ItemDamageOneHand.dbc");//20444 - LOAD_DBC(sItemDamageRangedStore, "ItemDamageRanged.dbc");//20444 - LOAD_DBC(sItemDamageThrownStore, "ItemDamageThrown.dbc");//20444 - LOAD_DBC(sItemDamageTwoHandCasterStore, "ItemDamageTwoHandCaster.dbc");//20444 - LOAD_DBC(sItemDamageTwoHandStore, "ItemDamageTwoHand.dbc");//20444 - LOAD_DBC(sItemDamageWandStore, "ItemDamageWand.dbc");//20444 - LOAD_DBC(sItemSetSpellStore, "ItemSetSpell.dbc");//20444 - LOAD_DBC(sItemSetStore, "ItemSet.dbc");//20444 - LOAD_DBC(sLFGDungeonStore, "LfgDungeons.dbc");//20444 - LOAD_DBC(sLightStore, "Light.dbc"); //20444 - LOAD_DBC(sLiquidTypeStore, "LiquidType.dbc");//20444 - LOAD_DBC(sLockStore, "Lock.dbc");//20444 - LOAD_DBC(sMapDifficultyStore, "MapDifficulty.dbc");//20444 - LOAD_DBC(sMapStore, "Map.dbc");//20444 - LOAD_DBC(sMovieStore, "Movie.dbc");//20444 - LOAD_DBC(sPhaseStore, "Phase.dbc"); // 20444 - LOAD_DBC(sPowerDisplayStore, "PowerDisplay.dbc");//20444 - LOAD_DBC(sPvpDifficultyStore, "PvpDifficulty.dbc");//20444 - LOAD_DBC(sQuestFactionRewardStore, "QuestFactionReward.dbc");//20444 - LOAD_DBC(sRandomPropertiesPointsStore, "RandPropPoints.dbc");//20444 - LOAD_DBC(sSkillLineAbilityStore, "SkillLineAbility.dbc");//20444 - LOAD_DBC(sSkillLineStore, "SkillLine.dbc");//20444 - LOAD_DBC(sSkillRaceClassInfoStore, "SkillRaceClassInfo.dbc");//20444 - LOAD_DBC(sSpellAuraOptionsStore, "SpellAuraOptions.dbc");//20444 - LOAD_DBC(sSpellCategoriesStore, "SpellCategories.dbc");//20444 - LOAD_DBC(sSpellCategoryStore, "SpellCategory.dbc");//20444 - LOAD_DBC(sSpellCooldownsStore, "SpellCooldowns.dbc");//20444 - LOAD_DBC(sSpellEffectScalingStore, "SpellEffectScaling.dbc");//20444 - LOAD_DBC(sSpellEffectStore, "SpellEffect.dbc"/*, &CustomSpellEffectfmt, &CustomSpellEffectEntryIndex*/);//20444 - LOAD_DBC(sSpellEquippedItemsStore, "SpellEquippedItems.dbc");//20444 - LOAD_DBC(sSpellFocusObjectStore, "SpellFocusObject.dbc");//20444 - LOAD_DBC(sSpellInterruptsStore, "SpellInterrupts.dbc");//20444 - LOAD_DBC(sSpellItemEnchantmentStore, "SpellItemEnchantment.dbc");//20444 - LOAD_DBC(sSpellLevelsStore, "SpellLevels.dbc");//20444 - LOAD_DBC(sSpellScalingStore, "SpellScaling.dbc");//20444 - LOAD_DBC(sSpellShapeshiftFormStore, "SpellShapeshiftForm.dbc");//20444 - LOAD_DBC(sSpellShapeshiftStore, "SpellShapeshift.dbc");//20444 - LOAD_DBC(sSpellStore, "Spell.dbc"/*, &CustomSpellfmt, &CustomSpellEntryIndex*/);//20444 - LOAD_DBC(sSpellTargetRestrictionsStore, "SpellTargetRestrictions.dbc");//20444 - LOAD_DBC(sSummonPropertiesStore, "SummonProperties.dbc");//20444 - LOAD_DBC(sTalentStore, "Talent.dbc");//20444 - LOAD_DBC(sVehicleSeatStore, "VehicleSeat.dbc");//20444 - LOAD_DBC(sVehicleStore, "Vehicle.dbc");//20444 - LOAD_DBC(sWMOAreaTableStore, "WMOAreaTable.dbc");//20444 + LOAD_DBC(sAreaTableStore, "AreaTable.dbc");//20810 + LOAD_DBC(sAreaTriggerStore, "AreaTrigger.dbc");//20810 + LOAD_DBC(sBannedAddOnsStore, "BannedAddOns.dbc");//20810 + LOAD_DBC(sBattlemasterListStore, "BattlemasterList.dbc");//20810 + LOAD_DBC(sCharSectionsStore, "CharSections.dbc");//20810 + LOAD_DBC(sCharTitlesStore, "CharTitles.dbc");//20810 + LOAD_DBC(sChatChannelsStore, "ChatChannels.dbc");//20810 + LOAD_DBC(sChrClassesStore, "ChrClasses.dbc");//20810 + LOAD_DBC(sChrSpecializationStore, "ChrSpecialization.dbc");//20810 + LOAD_DBC(sCreatureFamilyStore, "CreatureFamily.dbc");//20810 + LOAD_DBC(sCreatureModelDataStore, "CreatureModelData.dbc");//20810 + LOAD_DBC(sDifficultyStore, "Difficulty.dbc");//20810 + LOAD_DBC(sDungeonEncounterStore, "DungeonEncounter.dbc");//20810 + LOAD_DBC(sEmotesStore, "Emotes.dbc");//20810 + LOAD_DBC(sEmotesTextStore, "EmotesText.dbc");//20810 + LOAD_DBC(sFactionStore, "Faction.dbc");//20810 + LOAD_DBC(sFactionTemplateStore, "FactionTemplate.dbc");//20810 + LOAD_DBC(sGemPropertiesStore, "GemProperties.dbc");//20810 + LOAD_DBC(sGlyphPropertiesStore, "GlyphProperties.dbc");//20810 + LOAD_DBC(sItemSetStore, "ItemSet.dbc");//20810 + LOAD_DBC(sLFGDungeonStore, "LfgDungeons.dbc");//20810 + LOAD_DBC(sLightStore, "Light.dbc"); //20810 + LOAD_DBC(sLiquidTypeStore, "LiquidType.dbc");//20810 + LOAD_DBC(sLockStore, "Lock.dbc");//20810 + LOAD_DBC(sMapDifficultyStore, "MapDifficulty.dbc");//20810 + LOAD_DBC(sMapStore, "Map.dbc");//20810 + LOAD_DBC(sPhaseStore, "Phase.dbc");//20810 + LOAD_DBC(sPvpDifficultyStore, "PvpDifficulty.dbc");//20810 + LOAD_DBC(sSpellItemEnchantmentStore, "SpellItemEnchantment.dbc");//20810 + LOAD_DBC(sSummonPropertiesStore, "SummonProperties.dbc");//20810 + LOAD_DBC(sTalentStore, "Talent.dbc");//20810 + LOAD_DBC(sVehicleSeatStore, "VehicleSeat.dbc");//20810 + LOAD_DBC(sVehicleStore, "Vehicle.dbc");//20810 + LOAD_DBC(sWMOAreaTableStore, "WMOAreaTable.dbc");//20810 LOAD_DBC(sWorldMapAreaStore, "WorldMapArea.dbc");//20444 - LOAD_DBC(sWorldMapTransformsStore, "WorldMapTransforms.dbc");//20444 LOAD_DBC(sWorldSafeLocsStore, "WorldSafeLocs.dbc"); // 20444 #undef LOAD_DBC @@ -408,10 +300,6 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) "MAX_DIFFICULTY is not large enough to contain all difficulties! (current value %d, required %d)", MAX_DIFFICULTY, sDifficultyStore.GetNumRows()); - for (uint32 i = 0; i < sEmotesTextSoundStore.GetNumRows(); ++i) - if (EmotesTextSoundEntry const* entry = sEmotesTextSoundStore.LookupEntry(i)) - sEmotesTextSoundMap[EmotesTextSoundKey(entry->EmotesTextId, entry->RaceId, entry->SexId)] = entry; - for (uint32 i = 0; i < sFactionStore.GetNumRows(); ++i) { FactionEntry const* faction = sFactionStore.LookupEntry(i); @@ -422,22 +310,6 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) } } - for (uint32 i = 0; i < sGameObjectDisplayInfoStore.GetNumRows(); ++i) - { - if (GameObjectDisplayInfoEntry const* info = sGameObjectDisplayInfoStore.LookupEntry(i)) - { - if (info->GeoBoxMax.X < info->GeoBoxMin.X) - std::swap(*(float*)(&info->GeoBoxMax.X), *(float*)(&info->GeoBoxMin.X)); - if (info->GeoBoxMax.Y < info->GeoBoxMin.Y) - std::swap(*(float*)(&info->GeoBoxMax.Y), *(float*)(&info->GeoBoxMin.Y)); - if (info->GeoBoxMax.Z < info->GeoBoxMin.Z) - std::swap(*(float*)(&info->GeoBoxMax.Z), *(float*)(&info->GeoBoxMin.Z)); - } - } - - for (ItemSetSpellEntry const* entry : sItemSetSpellStore) - sItemSetSpellsStore[entry->ItemSetID].push_back(entry); - // fill data for (uint32 i = 0; i < sMapDifficultyStore.GetNumRows(); ++i) if (MapDifficultyEntry const* entry = sMapDifficultyStore.LookupEntry(i)) @@ -449,20 +321,6 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) if (entry->BracketID > MAX_BATTLEGROUND_BRACKETS) ASSERT(false && "Need update MAX_BATTLEGROUND_BRACKETS by DBC data"); - for (uint32 i = 0; i < sSkillRaceClassInfoStore.GetNumRows(); ++i) - if (SkillRaceClassInfoEntry const* entry = sSkillRaceClassInfoStore.LookupEntry(i)) - if (sSkillLineStore.LookupEntry(entry->SkillID)) - SkillRaceClassInfoBySkill.emplace(entry->SkillID, entry); - - for (uint32 j = 0; j < sSpellEffectScalingStore.GetNumRows(); j++) - { - SpellEffectScalingEntry const* spellEffectScaling = sSpellEffectScalingStore.LookupEntry(j); - if (!spellEffectScaling) - continue; - - sSpellEffectScallingByEffectId.insert(std::make_pair(spellEffectScaling->SpellEffectID, j)); - } - for (uint32 i = 0; i < sTalentStore.GetNumRows(); ++i) { if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(i)) @@ -496,11 +354,10 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) } // Check loaded DBC files proper version - if (!sAreaTableStore.LookupEntry(7941) || // last area added in 6.2.2 (20444) - !sCharTitlesStore.LookupEntry(457) || // last char title added in 6.2.2 (20444) - !sGemPropertiesStore.LookupEntry(2544) || // last gem property added in 6.2.2 (20444) - !sMapStore.LookupEntry(1497) || // last map added in 6.2.2 (20444) - !sSpellStore.LookupEntry(197204) ) // last spell added in 6.2.2 (20444) + if (!sAreaTableStore.LookupEntry(6719) || // last area (areaflag) added in 7.0.1 (20810) + !sCharTitlesStore.LookupEntry(469) || // last char title added in 7.0.1 (20810) + !sGemPropertiesStore.LookupEntry(2952) || // last gem property added in 7.0.1 (20810) + !sMapStore.LookupEntry(1602) ) // last map added in 7.0.1 (20810) { TC_LOG_ERROR("misc", "You have _outdated_ DBC files. Please extract correct versions from current using client."); exit(1); @@ -519,27 +376,34 @@ void LoadGameTables(const std::string& dataPath, uint32 defaultLocale) #define LOAD_GT(tableName, store, file) LoadGameTable(bad_dbc_files, tableName, store, dbcPath, file) - LOAD_GT("ArmorMitigationByLvl", sGtArmorMitigationByLvlStore, "gtArmorMitigationByLvl.dbc"); // 21463 - LOAD_GT("BarberShopCostBase", sGtBarberShopCostBaseStore, "gtBarberShopCostBase.dbc"); // 20444 - LOAD_GT("CombatRatings", sGtCombatRatingsStore, "gtCombatRatings.dbc"); // 20444 - LOAD_GT("ChanceToMeleeCritBase", sGtChanceToMeleeCritBaseStore, "gtChanceToMeleeCritBase.dbc"); // 20444 - LOAD_GT("ChanceToMeleeCrit", sGtChanceToMeleeCritStore, "gtChanceToMeleeCrit.dbc"); // 20444 - LOAD_GT("ChanceToSpellCritBase", sGtChanceToSpellCritBaseStore, "gtChanceToSpellCritBase.dbc"); // 20444 - LOAD_GT("ChanceToSpellCrit", sGtChanceToSpellCritStore, "gtChanceToSpellCrit.dbc"); // 20444 - LOAD_GT("ItemSocketCostPerLevel", sGtItemSocketCostPerLevelStore, "gtItemSocketCostPerLevel.dbc"); // 20444 - LOAD_GT("NPCManaCostScaler", sGtNPCManaCostScalerStore, "gtNPCManaCostScaler.dbc"); // 20444 - LOAD_GT("NpcTotalHp", sGtNpcTotalHpStore, "gtNpcTotalHp.dbc"); // 20444 - LOAD_GT("NpcTotalHpExp1", sGtNpcTotalHpExp1Store, "gtNpcTotalHpExp1.dbc"); // 20444 - LOAD_GT("NpcTotalHpExp2", sGtNpcTotalHpExp2Store, "gtNpcTotalHpExp2.dbc"); // 20444 - LOAD_GT("NpcTotalHpExp3", sGtNpcTotalHpExp3Store, "gtNpcTotalHpExp3.dbc"); // 20444 - LOAD_GT("NpcTotalHpExp4", sGtNpcTotalHpExp4Store, "gtNpcTotalHpExp4.dbc"); // 20444 - LOAD_GT("NpcTotalHpExp5", sGtNpcTotalHpExp5Store, "gtNpcTotalHpExp5.dbc"); // 20444 - LOAD_GT("OCTHPPerStamina", sGtOCTHpPerStaminaStore, "gtOCTHpPerStamina.dbc"); // 20444 - LOAD_GT("OCTLevelExperience", sGtOCTLevelExperienceStore, "gtOCTLevelExperience.dbc"); // 20444 - LOAD_GT("RegenMPPerSpt", sGtRegenMPPerSptStore, "gtRegenMPPerSpt.dbc"); // 20444 - LOAD_GT("SpellScaling", sGtSpellScalingStore, "gtSpellScaling.dbc"); // 20444 - LOAD_GT("OCTBaseHPByClass", sGtOCTBaseHPByClassStore, "gtOCTBaseHPByClass.dbc"); // 20444 - LOAD_GT("OCTBaseMPByClass", sGtOCTBaseMPByClassStore, "gtOCTBaseMPByClass.dbc"); // 20444 + LOAD_GT("BarberShopCostBase", sGtBarberShopCostBaseStore, "gtBarberShopCostBase.dbc"); // 20810 + LOAD_GT("CombatRatings", sGtCombatRatingsStore, "gtCombatRatings.dbc"); // 20810 + LOAD_GT("ChanceToMeleeCritBase", sGtChanceToMeleeCritBaseStore, "gtChanceToMeleeCritBase.dbc"); // 20810 + LOAD_GT("ChanceToMeleeCrit", sGtChanceToMeleeCritStore, "gtChanceToMeleeCrit.dbc"); // 20810 + LOAD_GT("ChanceToSpellCritBase", sGtChanceToSpellCritBaseStore, "gtChanceToSpellCritBase.dbc"); // 20810 + LOAD_GT("ChanceToSpellCrit", sGtChanceToSpellCritStore, "gtChanceToSpellCrit.dbc"); // 20810 + LOAD_GT("ItemSocketCostPerLevel", sGtItemSocketCostPerLevelStore, "gtItemSocketCostPerLevel.dbc"); // 20810 + LOAD_GT("NPCManaCostScaler", sGtNPCManaCostScalerStore, "gtNPCManaCostScaler.dbc"); // 20810 + LOAD_GT("NpcTotalHp", sGtNpcTotalHpStore[0], "gtNpcTotalHp.dbc"); // 20810 + LOAD_GT("NpcTotalHpExp1", sGtNpcTotalHpStore[1], "gtNpcTotalHpExp1.dbc"); // 20810 + LOAD_GT("NpcTotalHpExp2", sGtNpcTotalHpStore[2], "gtNpcTotalHpExp2.dbc"); // 20810 + LOAD_GT("NpcTotalHpExp3", sGtNpcTotalHpStore[3], "gtNpcTotalHpExp3.dbc"); // 20810 + LOAD_GT("NpcTotalHpExp4", sGtNpcTotalHpStore[4], "gtNpcTotalHpExp4.dbc"); // 20810 + LOAD_GT("NpcTotalHpExp5", sGtNpcTotalHpStore[5], "gtNpcTotalHpExp5.dbc"); // 20810 + LOAD_GT("NpcTotalHpExp6", sGtNpcTotalHpStore[6], "gtNpcTotalHpExp6.dbc"); // 20810 + LOAD_GT("NpcDamageByClass", sGtNpcDamageByClassStore[0], "gtNpcDamageByClass.dbc"); // 20810 + LOAD_GT("NpcDamageByClassExp1", sGtNpcDamageByClassStore[1], "gtNpcDamageByClassExp1.dbc"); // 20810 + LOAD_GT("NpcDamageByClassExp2", sGtNpcDamageByClassStore[2], "gtNpcDamageByClassExp2.dbc"); // 20810 + LOAD_GT("NpcDamageByClassExp3", sGtNpcDamageByClassStore[3], "gtNpcDamageByClassExp3.dbc"); // 20810 + LOAD_GT("NpcDamageByClassExp4", sGtNpcDamageByClassStore[4], "gtNpcDamageByClassExp4.dbc"); // 20810 + LOAD_GT("NpcDamageByClassExp5", sGtNpcDamageByClassStore[5], "gtNpcDamageByClassExp5.dbc"); // 20810 + LOAD_GT("NpcDamageByClassExp6", sGtNpcDamageByClassStore[6], "gtNpcDamageByClassExp6.dbc"); // 20810 + LOAD_GT("OCTHPPerStamina", sGtOCTHpPerStaminaStore, "gtOCTHpPerStamina.dbc"); // 20810 + LOAD_GT("OCTLevelExperience", sGtOCTLevelExperienceStore, "gtOCTLevelExperience.dbc"); // 20810 + LOAD_GT("RegenMPPerSpt", sGtRegenMPPerSptStore, "gtRegenMPPerSpt.dbc"); // 20810 + LOAD_GT("SpellScaling", sGtSpellScalingStore, "gtSpellScaling.dbc"); // 20810 + LOAD_GT("OCTBaseHPByClass", sGtOCTBaseHPByClassStore, "gtOCTBaseHPByClass.dbc"); // 20810 + LOAD_GT("OCTBaseMPByClass", sGtOCTBaseMPByClassStore, "gtOCTBaseMPByClass.dbc"); // 20810 #undef LOAD_GT @@ -583,12 +447,6 @@ char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 /*locale*/) return pet_family->Name_lang ? pet_family->Name_lang : NULL; } -EmotesTextSoundEntry const* FindTextSoundEmoteFor(uint32 emote, uint32 race, uint32 gender) -{ - auto itr = sEmotesTextSoundMap.find(EmotesTextSoundKey(emote, race, gender)); - return itr != sEmotesTextSoundMap.end() ? itr->second : nullptr; -} - WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid, int32 groupid) { WMOAreaInfoByTripple::iterator i = sWMOAreaInfoByTripple.find(WMOAreaTableTripple(rootid, adtid, groupid)); @@ -597,12 +455,6 @@ WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid return i->second; } -char const* GetRaceName(uint8 race, uint8 /*locale*/) -{ - ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(race); - return raceEntry ? raceEntry->Name_lang : NULL; -} - char const* GetClassName(uint8 class_, uint8 /*locale*/) { ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(class_); @@ -636,6 +488,8 @@ uint32 GetMaxLevelForExpansion(uint32 expansion) return 90; case EXPANSION_WARLORDS_OF_DRAENOR: return 100; + case EXPANSION_LEGION: + return 110; default: break; } @@ -654,30 +508,12 @@ uint32 GetExpansionForLevel(uint32 level) return EXPANSION_CATACLYSM; else if (level < 90) return EXPANSION_MISTS_OF_PANDARIA; + else if (level < 100) + return EXPANSION_WARLORDS_OF_DRAENOR; else return CURRENT_EXPANSION; } -bool IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId) -{ - if (requiredTotemCategoryId == 0) - return true; - if (itemTotemCategoryId == 0) - return false; - - TotemCategoryEntry const* itemEntry = sTotemCategoryStore.LookupEntry(itemTotemCategoryId); - if (!itemEntry) - return false; - TotemCategoryEntry const* reqEntry = sTotemCategoryStore.LookupEntry(requiredTotemCategoryId); - if (!reqEntry) - return false; - - if (itemEntry->CategoryType != reqEntry->CategoryType) - return false; - - return (itemEntry->CategoryMask & reqEntry->CategoryMask) == reqEntry->CategoryMask; -} - void Zone2MapCoordinates(float& x, float& y, uint32 worldMapAreaId) { WorldMapAreaEntry const* maEntry = sWorldMapAreaStore.LookupEntry(worldMapAreaId); @@ -854,68 +690,3 @@ uint32 GetDefaultMapLight(uint32 mapId) return 0; } - -SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_) -{ - SkillRaceClassInfoBounds bounds = SkillRaceClassInfoBySkill.equal_range(skill); - for (SkillRaceClassInfoMap::iterator itr = bounds.first; itr != bounds.second; ++itr) - { - if (itr->second->RaceMask && !(itr->second->RaceMask & (1 << (race - 1)))) - continue; - if (itr->second->ClassMask && !(itr->second->ClassMask & (1 << (class_ - 1)))) - continue; - - return itr->second; - } - - return NULL; -} - -void DeterminaAlternateMapPosition(uint32 mapId, float x, float y, float z, uint32* newMapId /*= nullptr*/, DBCPosition2D* newPos /*= nullptr*/) -{ - ASSERT(newMapId || newPos); - WorldMapTransformsEntry const* transformation = nullptr; - for (WorldMapTransformsEntry const* transform : sWorldMapTransformsStore) - { - if (transform->MapID != mapId) - continue; - - if (transform->RegionMin.X > x || transform->RegionMax.X < x) - continue; - if (transform->RegionMin.Y > y || transform->RegionMax.Y < y) - continue; - if (transform->RegionMin.Z > z || transform->RegionMax.Z < z) - continue; - - transformation = transform; - break; - } - - if (!transformation) - { - if (newMapId) - *newMapId = mapId; - - if (newPos) - { - newPos->X = x; - newPos->Y = y; - } - return; - } - - if (newMapId) - *newMapId = transformation->NewMapID; - - if (!newPos) - return; - - if (transformation->RegionScale > 0.0f && transformation->RegionScale < 1.0f) - { - x = (x - transformation->RegionMin.X) * transformation->RegionScale + transformation->RegionMin.X; - y = (y - transformation->RegionMin.Y) * transformation->RegionScale + transformation->RegionMin.Y; - } - - newPos->X = x + transformation->RegionOffset.X; - newPos->Y = y + transformation->RegionOffset.Y; -} diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index 4ab1769c69f..a1986effa48 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -30,9 +30,6 @@ TC_GAME_API CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSection // ChrClasses TC_GAME_API char const* GetClassName(uint8 class_, uint8 locale); -// ChrRaces -TC_GAME_API char const* GetRaceName(uint8 race, uint8 locale); - // ChrSpecialization #define PET_SPEC_OVERRIDE_CLASS_INDEX MAX_CLASSES typedef ChrSpecializationEntry const* ChrSpecializationByIndexArray[MAX_CLASSES + 1][MAX_SPECIALIZATIONS]; @@ -40,16 +37,9 @@ typedef ChrSpecializationEntry const* ChrSpecializationByIndexArray[MAX_CLASSES // CreatureFamilty TC_GAME_API char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 locale); -// EmotesText -TC_GAME_API EmotesTextSoundEntry const* FindTextSoundEmoteFor(uint32 emote, uint32 race, uint32 gender); - // Faction TC_GAME_API std::vector<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); @@ -69,20 +59,9 @@ TC_GAME_API MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapI TC_GAME_API PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level); TC_GAME_API PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id); -// SkillRaceClassInfo -typedef std::unordered_multimap<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); @@ -91,9 +70,6 @@ TC_GAME_API uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId); TC_GAME_API void Zone2MapCoordinates(float &x, float &y, uint32 worldMapAreaId); TC_GAME_API void Map2ZoneCoordinates(float &x, float &y, uint32 worldMapAreaId); -// WorldMapTransforms -TC_GAME_API void DeterminaAlternateMapPosition(uint32 mapId, float x, float y, float z, uint32* newMapId = nullptr, DBCPosition2D* newPos = nullptr); - TC_GAME_API uint32 GetMaxLevelForExpansion(uint32 expansion); TC_GAME_API uint32 GetExpansionForLevel(uint32 level); @@ -101,7 +77,7 @@ template<class T> class GameTable { public: - GameTable(char const* format) : _storage(format), _gtEntry(nullptr) { } + GameTable() : _storage("df"), _gtEntry(nullptr) { } void SetGameTableEntry(GameTablesEntry const* gtEntry) { _gtEntry = gtEntry; } @@ -125,81 +101,34 @@ private: GameTablesEntry const* _gtEntry; }; -TC_GAME_API extern DBCStorage<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; @@ -217,12 +146,8 @@ TC_GAME_API extern GameTable<GtChanceToSpellCritEntry> sGtChanceToSpell 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<GtNpcTotalHpEntry> sGtNpcTotalHpStore[MAX_EXPANSIONS]; +TC_GAME_API extern GameTable<GtNpcDamageByClassEntry> sGtNpcDamageByClassStore[MAX_EXPANSIONS]; TC_GAME_API extern GameTable<GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore; TC_GAME_API extern GameTable<GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore; TC_GAME_API extern GameTable<GtOCTLevelExperienceEntry> sGtOCTLevelExperienceStore; diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 5eed5ca0b6d..30704aaadad 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -26,14 +26,6 @@ // Structures using to access raw DBC data and required packing to portability #pragma pack(push, 1) -struct AnimKitEntry -{ - uint32 ID; // 0 - //uint32 OneShotDuration; // 1 - //uint32 OneShotStopAnimKitID; // 2 - //uint32 LowDefAnimKitID; // 3 -}; - struct AreaTableEntry { uint32 ID; // 0 @@ -56,7 +48,6 @@ struct AreaTableEntry //uint32 UWIntroMusic; // 21 //uint32 UWZoneMusic; // 22 //uint32 UWAmbience; // 23 - //uint32 WorldPvPID; // 24 World_PVP_Area.dbc //uint32 PvPCombastWorldStateID; // 25 //uint32 WildBattlePetLevelMin; // 26 //uint32 WildBattlePetLevelMax; // 27 @@ -90,18 +81,6 @@ struct AreaTriggerEntry //uint32 Flags // 16 }; -struct ArmorLocationEntry -{ - uint32 ID; // 0 - float Modifier[5]; // 1-5 multiplier for armor types (cloth...plate, no armor?) -}; - -struct BankBagSlotPricesEntry -{ - uint32 ID; // 0 - uint32 Cost; // 1 -}; - struct BannedAddOnsEntry { uint32 ID; // 0 @@ -134,7 +113,8 @@ struct BattlemasterListEntry enum CharSectionFlags { SECTION_FLAG_PLAYER = 0x01, - SECTION_FLAG_DEATH_KNIGHT = 0x04 + SECTION_FLAG_DEATH_KNIGHT = 0x04, + SECTION_FLAG_DEMON_HUNTER = 0x40 }; enum CharSectionType @@ -143,7 +123,10 @@ enum CharSectionType SECTION_TYPE_FACE = 1, SECTION_TYPE_FACIAL_HAIR = 2, SECTION_TYPE_HAIR = 3, - SECTION_TYPE_UNDERWEAR = 4 + SECTION_TYPE_UNDERWEAR = 4, + SECTION_TYPE_CUSTOM_DISPLAY_1 = 10, + SECTION_TYPE_CUSTOM_DISPLAY_2 = 12, + SECTION_TYPE_CUSTOM_DISPLAY_3 = 14 }; struct CharSectionsEntry @@ -152,13 +135,12 @@ struct CharSectionsEntry uint32 Race; uint32 Gender; uint32 GenType; - //char* TexturePath[3]; + //uint32 TextureFileDataID[3]; uint32 Flags; uint32 Type; uint32 Color; }; - struct CharTitlesEntry { uint32 ID; // 0, title ids, for example in Quest::GetCharTitleId() @@ -201,53 +183,12 @@ struct ChrClassesEntry //uint32 Unk1; // 18 }; -struct ChrRacesEntry -{ - uint32 ID; // 0 - uint32 Flags; // 1 - uint32 FactionID; // 2 faction template id - //uint32 ExplorationSoundID; // 3 - uint32 MaleDisplayID; // 4 - uint32 FemaleDisplayID; // 5 - //char* ClientPrefix; // 6 - //uint32 BaseLanguage; // 7 - //uint32 CreatureType; // 8 - //uint32 ResSicknessSpellID; // 9 - //uint32 SplashSoundID; // 10 - //char* ClientFileString; // 11 - uint32 CinematicSequenceID; // 12 - uint32 TeamID; // 13 m_alliance (0 alliance, 1 horde, 2 neutral) - char* Name_lang; // 14 - //char* NameFemale_lang; // 15 - //char* NameMale_lang; // 16 - //char* FacialHairCustomization[2]; // 17-18 - //char* HairCustomization; // 19 - //uint32 RaceRelated; // 20 - //uint32 UnalteredVisualRaceID; // 21 - //uint32 UAMaleCreatureSoundDataID; // 22 - //uint32 UAFemaleCreatureSoundDataID; // 23 - //uint32 CharComponentTextureLayoutID; // 24 - //uint32 DefaultClassID; // 25 - //uint32 CreateScreenFileDataID; // 26 - //uint32 SelectScreenFileDataID; // 27 - //float MaleCustomizeOffset[3]; // 28-30 - //float FemaleCustomizeOffset[3]; // 31-33 - //uint32 NeutralRaceID; // 34 - //uint32 LowResScreenFileDataID; // 35 - //uint32 HighResMaleDisplayID; // 36 - //uint32 HighResFemaleDisplayID; // 37 - //uint32 CharComponentTexLayoutHiResID; // 38 - //uint32 Unk; // 39 -}; - -#define MAX_MASTERY_SPELLS 2 - struct ChrSpecializationEntry { uint32 ID; // 0 Specialization ID //char* BackgroundFile; // 1 uint32 ClassID; // 2 - uint32 MasterySpellID[MAX_MASTERY_SPELLS]; // 3 + uint32 MasterySpellID; // 3 uint32 OrderIndex; // 4 uint32 PetTalentType; // 5 uint32 Role; // 6 (0 - Tank, 1 - Healer, 2 - DPS) @@ -257,23 +198,8 @@ struct ChrSpecializationEntry //char* Name_lang; // 10 //char* Name2_lang; // 11 Same as name_lang? //char* Description_lang; // 12 - uint32 PrimaryStatOrder[2]; // 13-14 -}; - -struct CreatureDisplayInfoExtraEntry -{ - //uint32 ID; // 0 - uint32 DisplayRaceID; // 1 - //uint32 DisplaySexID; // 2 - //uint32 SkinID; // 3 - //uint32 FaceID; // 4 - //uint32 HairStyleID; // 5 - //uint32 HairColorID; // 6 - //uint32 FacialHairID; // 7 - //uint32 NPCItemDisplay[11]; // 8-18 - //uint32 Flags; // 19 - //uint32 FileDataID; // 20 - //uint32 Unk; // 21 + //uint32 PrimaryStatOrder; // 13 + //uint32 AnimReplacementSetID; // 14 }; struct CreatureFamilyEntry @@ -304,25 +230,27 @@ struct CreatureModelDataEntry //float FootprintTextureWidth; // 8 //float FootprintParticleScale; // 9 //uint32 FoleyMaterialID; // 10 - //uint32 FootstepShakeSize; // 11 - //uint32 DeathThudShakeSize; // 12 - //uint32 SoundID; // 13 - //float CollisionWidth; // 14 - float CollisionHeight; // 15 - float MountHeight; // 16 - //float GeoBoxMin[3]; // 17-19 - //float GeoBoxMax[3]; // 20-22 - //float WorldEffectScale; // 23 - //float AttachedEffectScale; // 24 - //float MissileCollisionRadius; // 25 - //float MissileCollisionPush; // 26 - //float MissileCollisionRaise; // 27 - //float OverrideLootEffectScale; // 28 - //float OverrideNameScale; // 29 - //float OverrideSelectionRadius; // 30 - //float TamedPetBaseScale; // 31 - //uint32 CreatureGeosetDataID; // 32 - //float HoverHeight; // 33 + //uint32 Unk700_1; // 11 + //uint32 Unk700_2; // 12 + //uint32 FootstepShakeSize; // 13 + //uint32 DeathThudShakeSize; // 14 + //uint32 SoundID; // 15 + //float CollisionWidth; // 16 + float CollisionHeight; // 17 + float MountHeight; // 18 + //float GeoBoxMin[3]; // 19-21 + //float GeoBoxMax[3]; // 22-24 + //float WorldEffectScale; // 25 + //float AttachedEffectScale; // 26 + //float MissileCollisionRadius; // 27 + //float MissileCollisionPush; // 28 + //float MissileCollisionRaise; // 29 + //float OverrideLootEffectScale; // 30 + //float OverrideNameScale; // 31 + //float OverrideSelectionRadius; // 32 + //float TamedPetBaseScale; // 33 + //uint32 CreatureGeosetDataID; // 34 + //float HoverHeight; // 35 }; /* not used @@ -366,13 +294,6 @@ struct DungeonEncounterEntry //uint32 Unk; // 8 Flags2? }; -struct DurabilityCostsEntry -{ - uint32 ID; // 0 - uint32 WeaponSubClassCost[21]; // 1-22 - uint32 ArmorSubClassCost[8]; // 23-30 -}; - struct EmotesEntry { uint32 ID; // 0 @@ -393,15 +314,6 @@ struct EmotesTextEntry //uint32 EmoteText[16]; // 3-18 }; -struct EmotesTextSoundEntry -{ - uint32 Id; // 0 - uint32 EmotesTextId; // 1 - uint32 RaceId; // 2 - uint32 SexId; // 3, 0 male / 1 female - uint32 SoundId; // 4 -}; - struct FactionEntry { uint32 ID; // 0 @@ -484,18 +396,6 @@ struct FactionTemplateEntry bool IsContestedGuardFaction() const { return (Flags & FACTION_TEMPLATE_FLAG_CONTESTED_GUARD) != 0; } }; -struct GameObjectDisplayInfoEntry -{ - uint32 ID; // 0 - uint32 FileDataID; // 1 - //uint32 Sound[10]; // 2-11 - DBCPosition3D GeoBoxMin; // 12-14 - DBCPosition3D GeoBoxMax; // 15-17 - //uint32 ObjectEffectPackageID; // 18 - //float OverrideLootEffectScale; // 19 - //float OverrideNameScale; // 20 -}; - struct GemPropertiesEntry { uint32 ID; // 0 @@ -560,32 +460,12 @@ struct GtNPCManaCostScalerEntry float ratio; }; -struct GtNpcTotalHpEntry -{ - float HP; -}; - -struct GtNpcTotalHpExp1Entry -{ - float HP; -}; - -struct GtNpcTotalHpExp2Entry -{ - float HP; -}; - -struct GtNpcTotalHpExp3Entry -{ - float HP; -}; - -struct GtNpcTotalHpExp4Entry +struct GtNpcDamageByClassEntry { - float HP; + float Damage; }; -struct GtNpcTotalHpExp5Entry +struct GtNpcTotalHpEntry { float HP; }; @@ -640,76 +520,6 @@ struct GtOCTBaseMPByClassEntry float ratio; }; -// GuildColorBackground.dbc -struct GuildColorBackgroundEntry -{ - uint32 ID; - //uint8 Red; - //uint8 Green; - //uint8 Blue; -}; - -// GuildColorBorder.dbc -struct GuildColorBorderEntry -{ - uint32 ID; - //uint8 Red; - //uint8 Green; - //uint8 Blue; -}; - -// GuildColorEmblem.dbc -struct GuildColorEmblemEntry -{ - uint32 ID; - //uint8 Red; - //uint8 Green; - //uint8 Blue; -}; - -// common struct for: -// ItemDamageAmmo.dbc -// ItemDamageOneHand.dbc -// ItemDamageOneHandCaster.dbc -// ItemDamageRanged.dbc -// ItemDamageThrown.dbc -// ItemDamageTwoHand.dbc -// ItemDamageTwoHandCaster.dbc -// ItemDamageWand.dbc -struct ItemDamageEntry -{ - uint32 ID; // 0 item level - float DPS[7]; // 1-7 multiplier for item quality - uint32 ItemLevel; // 8 item level -}; - -struct ItemArmorQualityEntry -{ - uint32 ID; // 0 item level - float QualityMod[7]; // 1-7 multiplier for item quality - uint32 ItemLevel; // 8 item level -}; - -struct ItemArmorShieldEntry -{ - uint32 ID; // 0 item level - uint32 ItemLevel; // 1 item level - float Quality[7]; // 2-8 quality -}; - -struct ItemArmorTotalEntry -{ - uint32 ID; // 0 item level - uint32 ItemLevel; // 1 item level - float Value[4]; // 2-5 multiplier for armor types (cloth...plate) -}; - -struct ItemBagFamilyEntry -{ - uint32 ID; // 0 - //char* Name_lang; // 1 m_name_lang -}; - struct ItemDisplayInfoEntry { uint32 ID; // 0 @@ -736,15 +546,6 @@ struct ItemSetEntry uint32 RequiredSkillRank; // 20 }; -struct ItemSetSpellEntry -{ - uint32 ID; // 0 - uint32 ItemSetID; // 1 - uint32 SpellID; // 2 - uint32 Threshold; // 3 - uint32 ChrSpecID; // 4 -}; - struct LFGDungeonEntry { uint32 ID; // 0 @@ -910,25 +711,6 @@ struct MinorTalentEntry uint32 OrderIndex; // 3 }; -struct MovieEntry -{ - uint32 ID; // 0 index - //uint32 Volume; // 1 - //uint32 KeyID; // 2 - //uint32 AudioFileDataID; // 3 - //uint32 SubtitleFileDataID; // 4 -}; - -struct PowerDisplayEntry -{ - uint32 ID; // 0 - uint32 PowerType; // 1 - //char* GlobalStringBaseTag; // 2 - //uint8 Red; // 3 - //uint8 Green; // 4 - //uint8 Blue; // 5 -}; - struct PvPDifficultyEntry { //uint32 ID; // 0 @@ -941,280 +723,6 @@ struct PvPDifficultyEntry BattlegroundBracketId GetBracketId() const { return BattlegroundBracketId(BracketID); } }; -struct QuestFactionRewEntry -{ - uint32 ID; // 0 - int32 QuestRewFactionValue[10]; // 1-10 -}; - -struct RandomPropertiesPointsEntry -{ - uint32 ItemLevel; // 0 - uint32 EpicPropertiesPoints[5]; // 1-5 - uint32 RarePropertiesPoints[5]; // 6-10 - uint32 UncommonPropertiesPoints[5]; // 11-15 -}; - -struct SkillLineEntry -{ - uint32 ID; // 0 m_ID - int32 CategoryID; // 1 m_categoryID - char* DisplayName_lang; // 2 m_displayName_lang - //char* Description_lang; // 3 m_description_lang - uint32 SpellIconID; // 4 m_spellIconID - //char* AlternateVerb_lang; // 5 m_alternateVerb_lang - uint32 CanLink; // 6 m_canLink (prof. with recipes) - //uint32 ParentSkillLineID; // 7 - //uint32 Flags; // 8 -}; - -struct SkillLineAbilityEntry -{ - uint32 ID; // 0 - uint32 SkillLine; // 1 - uint32 SpellID; // 2 - uint32 RaceMask; // 3 - uint32 ClassMask; // 4 - uint32 MinSkillLineRank; // 7 - uint32 SupercedesSpell; // 8 - uint32 AquireMethod; // 9 - uint32 TrivialSkillLineRankHigh; // 10 - uint32 TrivialSkillLineRankLow; // 11 - uint32 NumSkillUps; // 12 - uint32 UniqueBit; // 13 - uint32 TradeSkillCategoryID; // 14 -}; - -struct SkillRaceClassInfoEntry -{ - //uint32 ID; // 0 - uint32 SkillID; // 1 - int32 RaceMask; // 2 - int32 ClassMask; // 3 - uint32 Flags; // 4 - uint32 Availability; // 5 - uint32 MinLevel; // 6 - uint32 SkillTierID; // 7 -}; - -// SpellEffect.dbc -struct SpellEffectEntry -{ - uint32 ID; // 0 - uint32 DifficultyID; // 1 - uint32 Effect; // 2 - float EffectAmplitude; // 3 - uint32 EffectAura; // 4 - uint32 EffectAuraPeriod; // 5 - uint32 EffectBasePoints; // 6 - float EffectBonusCoefficient; // 7 - float EffectChainAmplitude; // 8 - uint32 EffectChainTargets; // 9 - uint32 EffectDieSides; // 10 - uint32 EffectItemType; // 11 - uint32 EffectMechanic; // 12 - int32 EffectMiscValue; // 13 - int32 EffectMiscValueB; // 14 - float EffectPointsPerResource; // 15 - uint32 EffectRadiusIndex; // 16 - uint32 EffectRadiusMaxIndex; // 17 - float EffectRealPointsPerLevel; // 18 - flag128 EffectSpellClassMask; // 19-22 - uint32 EffectTriggerSpell; // 23 - float EffectPosFacing; // 24 - uint32 ImplicitTarget[2]; // 25-26 - uint32 SpellID; // 27 - uint32 EffectIndex; // 28 - uint32 EffectAttributes; // 29 - float BonusCoefficientFromAP; // 30 -}; - -#define MAX_SPELL_EFFECTS 32 -#define MAX_EFFECT_MASK 0xFFFFFFFF - -// SpellEffectScaling.dbc -struct SpellEffectScalingEntry -{ - uint32 ID; // 0 - float Coefficient; // 1 - float Variance; // 2 - float ResourceCoefficient; // 3 - uint32 SpellEffectID; // 4 -}; - -// SpellAuraOptions.dbc -struct SpellAuraOptionsEntry -{ - uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - uint32 CumulativeAura; // 3 - uint32 ProcChance; // 4 - uint32 ProcCharges; // 5 - uint32 ProcTypeMask; // 6 - uint32 ProcCategoryRecovery; // 7 - uint32 SpellProcsPerMinuteID; // 8 -}; - -// Spell.dbc -struct SpellEntry -{ - uint32 ID; // 0 - char* Name_lang; // 1 - //char* NameSubtext_lang; // 2 - //char* Description_lang; // 3 - //char* AuraDescription_lang; // 4 - uint32 RuneCostID; // 5 - uint32 SpellMissileID; // 6 - uint32 DescriptionVariablesID; // 7 - uint32 ScalingID; // 8 - uint32 AuraOptionsID; // 9 - uint32 AuraRestrictionsID; // 10 - uint32 CastingRequirementsID; // 11 - uint32 CategoriesID; // 12 - uint32 ClassOptionsID; // 13 - uint32 CooldownsID; // 14 - uint32 EquippedItemsID; // 15 - uint32 InterruptsID; // 16 - uint32 LevelsID; // 17 - uint32 ReagentsID; // 18 - uint32 ShapeshiftID; // 19 - uint32 TargetRestrictionsID; // 20 - uint32 TotemsID; // 21 - uint32 RequiredProjectID; // 22 - uint32 MiscID; // 23 -}; - -// SpellCategories.dbc -struct SpellCategoriesEntry -{ - //uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - uint32 Category; // 3 - uint32 DefenseType; // 4 - uint32 DispelType; // 5 - uint32 Mechanic; // 6 - uint32 PreventionType; // 7 - uint32 StartRecoveryCategory; // 8 - uint32 ChargeCategory; // 9 -}; - -struct SpellCategoryEntry -{ - uint32 ID; // 0 - uint32 Flags; // 1 - //uint8 UsesPerWeek; // 2 - //uint8 Padding[3]; // 2 - //char* Name_lang; // 3 - int32 MaxCharges; // 4 - int32 ChargeRecoveryTime; // 5 -}; - -struct SpellFocusObjectEntry -{ - uint32 ID; // 0 - //char* Name_lang; // 1 -}; - -// SpellEquippedItems.dbc -struct SpellEquippedItemsEntry -{ - //uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - int32 EquippedItemClass; // 3 m_equippedItemClass (value) - int32 EquippedItemInventoryTypeMask; // 4 m_equippedItemInvTypes (mask) - int32 EquippedItemSubClassMask; // 5 m_equippedItemSubclass (mask) -}; - -// SpellCooldowns.dbc -struct SpellCooldownsEntry -{ - //uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - uint32 CategoryRecoveryTime; // 3 - uint32 RecoveryTime; // 4 - uint32 StartRecoveryTime; // 5 -}; - -// SpellInterrupts.dbc -struct SpellInterruptsEntry -{ - //uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - uint32 AuraInterruptFlags[2]; // 3-4 - uint32 ChannelInterruptFlags[2]; // 5-6 - uint32 InterruptFlags; // 7 -}; - -// SpellLevels.dbc -struct SpellLevelsEntry -{ - //uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - uint32 BaseLevel; // 3 - uint32 MaxLevel; // 4 - uint32 SpellLevel; // 5 -}; - -#define MAX_SHAPESHIFT_SPELLS 8 - -struct SpellShapeshiftFormEntry -{ - uint32 ID; // 0 - //uint32 BonusActionBar; // 1 - //char* Name_lang; // 2 - uint32 Flags; // 3 - int32 CreatureType; // 4 <=0 humanoid, other normal creature types - //uint32 AttackIconID; // 5 unused, related to next field - uint32 CombatRoundTime; // 6 - uint32 CreatureDisplayID[4]; // 7-10 (0 - Alliance, 1 - Horde) - uint32 PresetSpellID[MAX_SHAPESHIFT_SPELLS]; // 11-18 spells which appear in the bar after shapeshifting - //uint32 MountTypeID; // 19 - //uint32 ExitSoundEntriesID; // 20 -}; - -// SpellShapeshift.dbc -struct SpellShapeshiftEntry -{ - uint32 ID; // 0 - uint32 ShapeshiftExclude[2]; // 1-2 - uint32 ShapeshiftMask[2]; // 3-4 - //uint32 StanceBarOrder; // 5 -}; - -// SpellTargetRestrictions.dbc -struct SpellTargetRestrictionsEntry -{ - uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 DifficultyID; // 2 - float ConeAngle; // 3 - float Width; // 4 - uint32 MaxAffectedTargets; // 5 - uint32 MaxTargetLevel; // 6 - uint32 TargetCreatureType; // 7 - uint32 Targets; // 8 -}; - -// SpellScaling.dbc -struct SpellScalingEntry -{ - uint32 ID; // 0 - int32 CastTimeMin; // 1 - int32 CastTimeMax; // 2 - uint32 CastTimeMaxLevel; // 3 - int32 ScalingClass; // 4 - float NerfFactor; // 5 - uint32 NerfMaxLevel; // 6 - uint32 MaxScalingLevel; // 7 - uint32 ScalesFromItemLevel; // 8 -}; - #define MAX_ITEM_ENCHANTMENT_EFFECTS 3 struct SpellItemEnchantmentEntry @@ -1227,16 +735,18 @@ struct SpellItemEnchantmentEntry //char* Name_lang // 11 uint32 ItemVisual; // 12 uint32 Flags; // 13 - uint32 SRCItemID; // 14 - uint32 ConditionID; // 15 - uint32 RequiredSkillID; // 16 - uint32 RequiredSkillRank; // 17 - uint32 MinLevel; // 18 - uint32 MaxLevel; // 19 - uint32 ItemLevel; // 20 - int32 ScalingClass; // 21 - int32 ScalingClassRestricted; // 22 - float EffectScalingPoints[MAX_ITEM_ENCHANTMENT_EFFECTS];//23-25 + uint32 ConditionID; // 14 + uint32 RequiredSkillID; // 15 + uint32 RequiredSkillRank; // 16 + uint32 MinLevel; // 17 + uint32 MaxLevel; // 18 + uint32 ItemLevel; // 19 + int32 ScalingClass; // 20 + int32 ScalingClassRestricted; // 21 + float EffectScalingPoints[MAX_ITEM_ENCHANTMENT_EFFECTS];//22-24 + //uint32 PlayerConditionID; // 25 + //uint32 TransmogCost; // 26 + //uint32 TextureFileDataID; // 27 }; struct StableSlotPricesEntry @@ -1423,20 +933,6 @@ struct WorldMapAreaEntry //uint32 LevelRangeMax; // 13 Maximum recommended level displayed on world map }; -struct WorldMapTransformsEntry -{ - //uint32 ID; // 0 - uint32 MapID; // 1 - DBCPosition3D RegionMin; // 2 - DBCPosition3D RegionMax; // 3 - uint32 NewMapID; // 4 - DBCPosition2D RegionOffset; // 5 - //uint32 NewDungeonMapID; // 6 - //uint32 Flags; // 7 - //uint32 NewAreaID; // 8 - float RegionScale; // 9 -}; - struct WorldSafeLocsEntry { uint32 ID; // 0 diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index 171eec94266..b85710acae6 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -22,64 +22,27 @@ // x - skip<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 AreaTablefmt[] = "niiiiixxxxxxisiiiiixxxxxxxxx"; char const AreaTriggerfmt[] = "nifffxxxfffffxxxx"; -char const ArmorLocationfmt[] = "nfffff"; -char const BankBagSlotPricesfmt[] = "ni"; char const BannedAddOnsfmt[] = "nxxxxxxxxxx"; char const BattlemasterListfmt[] = "niiiiiiiiiiiiiiiiixsiiiixxxxxxx"; char const CharSectionsfmt[] = "diiixxxiii"; char const CharTitlesfmt[] = "nxssix"; char const ChatChannelsfmt[] = "nixsx"; char const ChrClassesfmt[] = "nixsxxxixiiiiixxxxx"; -char const ChrRacesfmt[] = "niixiixxxxxxiisxxxxxxxxxxxxxxxxxxxxxxxxx"; -char const ChrSpecializationfmt[] = "nxiiiiiiiiixxxii"; -char const CreatureDisplayInfoExtrafmt[] = "dixxxxxxxxxxxxxxxxxxxx"; +char const ChrSpecializationfmt[] = "nxiiiiiiiixxxxx"; char const CreatureFamilyfmt[] = "nfifiiiiixsx"; -char const CreatureModelDatafmt[] = "niixxxxxxxxxxxxffxxxxxxxxxxxxxxxxx"; +char const CreatureModelDatafmt[] = "niixxxxxxxxxxxxxxffxxxxxxxxxxxxxxxxx"; char const DifficultyFmt[] = "niiiixiixxxxix"; char const DungeonEncounterfmt[] = "niiixsxxx"; -char const DurabilityCostsfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiiii"; char const Emotesfmt[] = "nxxiiixx"; char const EmotesTextfmt[] = "nxixxxxxxxxxxxxxxxx"; char const EmotesTextSoundEntryfmt[] = "niiii"; char const Factionfmt[] = "niiiiiiiiiiiiiiiiiiffixsxixx"; char const FactionTemplatefmt[] = "niiiiiiiiiiiii"; -char const GameObjectDisplayInfofmt[] = "nixxxxxxxxxxffffffxxx"; char const GemPropertiesfmt[] = "nixxii"; char const GlyphPropertiesfmt[] = "niiix"; -char const GtArmorMitigationByLvlfmt[] = "xf"; -char const GtBarberShopCostBasefmt[] = "xf"; -char const GtCombatRatingsfmt[] = "xf"; -char const GtOCTHpPerStaminafmt[] = "df"; -char const GtOCTLevelExperiencefmt[] = "xf"; -char const GtChanceToMeleeCritBasefmt[] = "xf"; -char const GtChanceToMeleeCritfmt[] = "xf"; -char const GtChanceToSpellCritBasefmt[] = "xf"; -char const GtChanceToSpellCritfmt[] = "xf"; -char const GtItemSocketCostPerLevelfmt[] = "xf"; -char const GtNPCManaCostScalerfmt[] = "xf"; -char const GtNpcTotalHpfmt[] = "xf"; -char const GtNpcTotalHpExp1fmt[] = "xf"; -char const GtNpcTotalHpExp2fmt[] = "xf"; -char const GtNpcTotalHpExp3fmt[] = "xf"; -char const GtNpcTotalHpExp4fmt[] = "xf"; -char const GtNpcTotalHpExp5fmt[] = "xf"; -char const GtRegenMPPerSptfmt[] = "xf"; -char const GtSpellScalingfmt[] = "df"; -char const GtOCTBaseHPByClassfmt[] = "df"; -char const GtOCTBaseMPByClassfmt[] = "df"; -char const GuildColorBackgroundfmt[] = "nXXX"; -char const GuildColorBorderfmt[] = "nXXX"; -char const GuildColorEmblemfmt[] = "nXXX"; -char const ItemBagFamilyfmt[] = "nx"; -char const ItemArmorQualityfmt[] = "nfffffffi"; -char const ItemArmorShieldfmt[] = "nifffffff"; -char const ItemArmorTotalfmt[] = "niffff"; -char const ItemDamagefmt[] = "nfffffffi"; char const ItemSetfmt[] = "nsiiiiiiiiiiiiiiiiiii"; -char const ItemSetSpellfmt[] = "niiii"; char const LFGDungeonfmt[] = "nsiiixxiiiixxixixxxxxxxxxxxxxx"; char const Lightfmt[] = "nifffxxxxxxxxxx"; char const LiquidTypefmt[] = "nxxixixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; @@ -87,42 +50,15 @@ char const Lockfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx"; char const Mapfmt[] = "nxiixxsixxixiffxiiiiix"; char const MapDifficultyfmt[] = "diisiiii"; char const MinorTalentfmt[] = "niii"; -char const Moviefmt[] = "nxxxx"; char const Phasefmt[] = "ni"; -char const QuestFactionRewardfmt[] = "niiiiiiiiii"; -char const PowerDisplayfmt[] = "nixXXX"; char const PvpDifficultyfmt[] = "diiii"; -char const RandPropPointsfmt[] = "niiiiiiiiiiiiiii"; -char const SkillLinefmt[] = "nisxixixx"; -char const SkillLineAbilityfmt[] = "niiiiiiiiiiii"; -char const SkillRaceClassInfofmt[] = "diiiiiii"; -char const SpellCategoriesfmt[] = "diiiiiiiii"; -char const SpellCategoryfmt[] = "nixxii"; -char const SpellEffectfmt[] = "niifiiiffiiiiiifiifiiiiifiiiiif"; -const std::string CustomSpellEffectfmt = "ppppppppppppppappppppppppp"; -const std::string CustomSpellEffectEntryIndex = "Id"; -char const Spellfmt[] = "nsxxxiiiiiiiiiiiiiiiiiii"; -const std::string CustomSpellfmt = "ppppppppppppppapaaaaaaaaapaaaaaapapppaapppaaapa"; -const std::string CustomSpellEntryIndex = "Id"; -char const SpellEffectScalingfmt[] = "nfffi"; -char const SpellFocusObjectfmt[] = "nx"; -char const SpellItemEnchantmentfmt[] = "niiiiiiiiiixiiiiiiiiiiifff"; -char const SpellScalingfmt[] = "niiiifiii"; -char const SpellTargetRestrictionsfmt[] = "niiffiiii"; -char const SpellInterruptsfmt[] = "diiiiiii"; -char const SpellEquippedItemsfmt[] = "diiiii"; -char const SpellAuraOptionsfmt[] = "niiiiiiii"; -char const SpellCooldownsfmt[] = "diiiii"; -char const SpellLevelsfmt[] = "diiiii"; -char const SpellShapeshiftfmt[] = "niiiix"; -char const SpellShapeshiftFormfmt[] = "nxxiixiiiiiiiiiiiiixx"; +char const SpellItemEnchantmentfmt[] = "niiiiiiiiiixiiiiiiiiiifffxxx"; char const SummonPropertiesfmt[] = "niiiii"; char const Talentfmt[] = "niiiiiiiiix"; char const Vehiclefmt[] = "niiffffiiiiiiiifffffffffffffffxxxxfifiiii"; char const VehicleSeatfmt[] = "niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiiffffffffffffiiiiiiiii"; char const WMOAreaTablefmt[] = "niiixxxxxiixxxx"; char const WorldMapAreafmt[] = "xinxffffixxxxx"; -char const WorldMapTransformsfmt[] = "diffffffiffxxxf"; char const WorldSafeLocsfmt[] = "niffffx"; #endif diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 42d7ff404db..9c524413aba 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -2052,8 +2052,8 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* uint32 modelId = m_goInfo->displayId; if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->destructibleBuilding.DestructibleModelRec)) - if (modelData->StateDamaged.DisplayID) - modelId = modelData->StateDamaged.DisplayID; + if (modelData->StateDamagedDisplayID) + modelId = modelData->StateDamagedDisplayID; SetDisplayId(modelId); if (setHealth) @@ -2080,8 +2080,8 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* uint32 modelId = m_goInfo->displayId; if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->destructibleBuilding.DestructibleModelRec)) - if (modelData->StateDestroyed.DisplayID) - modelId = modelData->StateDestroyed.DisplayID; + if (modelData->StateDestroyedDisplayID) + modelId = modelData->StateDestroyedDisplayID; SetDisplayId(modelId); if (setHealth) @@ -2099,8 +2099,8 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* uint32 modelId = m_goInfo->displayId; if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->destructibleBuilding.DestructibleModelRec)) - if (modelData->StateRebuilding.DisplayID) - modelId = modelData->StateRebuilding.DisplayID; + if (modelData->StateRebuildingDisplayID) + modelId = modelData->StateRebuildingDisplayID; SetDisplayId(modelId); // restores to full health diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 20f1772ef00..3eba4d58d80 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -78,28 +78,29 @@ void AddItemsSetItem(Player* player, Item* item) ++eff->EquippedItemCount; - ItemSetSpells& spells = sItemSetSpellsStore[setid]; - - for (ItemSetSpellEntry const* itemSetSpell : spells) + if (std::vector<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 +133,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 +376,21 @@ void Item::SaveToDB(SQLTransaction& trans) stmt->setUInt64(1, GetGUID().GetCounter()); trans->Append(stmt); } + if (!GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).empty()) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_GEMS); + stmt->setUInt64(0, GetGUID().GetCounter()); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_GEMS); + stmt->setUInt64(0, GetGUID().GetCounter()); + uint32 i = 0; + for (; i < MAX_GEM_SOCKETS && i < GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size(); ++i) + stmt->setUInt32(1 + i, GetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, i)); + for (; i < MAX_GEM_SOCKETS; ++i) + stmt->setUInt32(1 + i, 0); + trans->Append(stmt); + } break; } case ITEM_REMOVED: @@ -381,6 +399,10 @@ void Item::SaveToDB(SQLTransaction& trans) stmt->setUInt64(0, GetGUID().GetCounter()); trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_GEMS); + stmt->setUInt64(0, GetGUID().GetCounter()); + trans->Append(stmt); + if (HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GIFT); @@ -413,7 +435,9 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie // 0 1 2 3 4 5 6 7 8 9 10 11 12 //result = CharacterDatabase.PQuery("SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, // 13 14 15 16 17 18 19 20 - // transmogrification, upgradeId, enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, bonusListIDs FROM item_instance WHERE guid = '%u'", guid); + // transmogrification, upgradeId, enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, bonusListIDs, + // 21 22 23 + // gemItemId1, gemItemId2, gemItemId3 FROM item_instance WHERE guid = '%u'", guid); // create item before any checks for store correct guid // and allow use "FSetState(ITEM_REMOVED); SaveToDB();" for deleting item from DB @@ -493,6 +517,17 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie SetModifier(ITEM_MODIFIER_BATTLE_PET_LEVEL, fields[18].GetUInt16()); SetModifier(ITEM_MODIFIER_BATTLE_PET_DISPLAY_ID, fields[19].GetUInt32()); + uint32 gemItemIds[3] = { fields[21].GetUInt32(), fields[22].GetUInt32(), fields[23].GetUInt32() }; + if (gemItemIds[0] || gemItemIds[1] || gemItemIds[2]) + { + // gem slots must be preserved, hence funky logic + AddDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, gemItemIds[0]); + if (gemItemIds[1] || gemItemIds[2]) + AddDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, gemItemIds[1]); + if (gemItemIds[2]) + AddDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, gemItemIds[2]); + } + Tokenizer bonusListIDs(fields[20].GetString(), ' '); for (char const* token : bonusListIDs) { @@ -582,27 +617,25 @@ int32 Item::GenerateItemRandomPropertyId(uint32 item_id) if (itemProto->GetRandomProperty()) { uint32 randomPropId = GetItemEnchantMod(itemProto->GetRandomProperty()); - ItemRandomPropertiesEntry const* random_id = sItemRandomPropertiesStore.LookupEntry(randomPropId); - if (!random_id) + if (!sItemRandomPropertiesStore.LookupEntry(randomPropId)) { TC_LOG_ERROR("sql.sql", "Enchantment id #%u used but it doesn't have records in 'ItemRandomProperties.dbc'", randomPropId); return 0; } - return random_id->ID; + return randomPropId; } // RandomSuffix case else { uint32 randomPropId = GetItemEnchantMod(itemProto->GetRandomSuffix()); - ItemRandomSuffixEntry const* random_id = sItemRandomSuffixStore.LookupEntry(randomPropId); - if (!random_id) + if (!sItemRandomSuffixStore.LookupEntry(randomPropId)) { TC_LOG_ERROR("sql.sql", "Enchantment id #%u used but it doesn't have records in sItemRandomSuffixStore.", randomPropId); return 0; } - return -int32(random_id->ID); + return -int32(randomPropId); } } @@ -613,12 +646,12 @@ void Item::SetItemRandomProperties(int32 randomPropId) if (randomPropId > 0) { - ItemRandomPropertiesEntry const* item_rand = sItemRandomPropertiesStore.LookupEntry(randomPropId); - if (item_rand) + ItemRandomPropertiesEntry const* item_rand = sItemRandomPropertiesStore.LookupEntry(-randomPropId); + if (sItemRandomPropertiesStore.LookupEntry(randomPropId)) { - if (GetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID) != int32(item_rand->ID)) + if (GetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID) != randomPropId) { - SetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID, item_rand->ID); + SetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID, randomPropId); SetState(ITEM_CHANGED, GetOwner()); } for (uint32 i = PROP_ENCHANTMENT_SLOT_1; i < PROP_ENCHANTMENT_SLOT_1 + 3; ++i) @@ -630,10 +663,9 @@ void Item::SetItemRandomProperties(int32 randomPropId) ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(-randomPropId); if (item_rand) { - if (GetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID) != -int32(item_rand->ID) || - !GetItemSuffixFactor()) + if (GetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID) != randomPropId || !GetItemSuffixFactor()) { - SetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID, -int32(item_rand->ID)); + SetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID, randomPropId); UpdateItemSuffixFactor(); SetState(ITEM_CHANGED, GetOwner()); } @@ -924,36 +956,24 @@ void Item::ClearEnchantment(EnchantmentSlot slot) bool Item::GemsFitSockets() const { - for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+MAX_GEM_SOCKETS; ++enchant_slot) + uint32 gemSlot = 0; + for (uint32 gemItemId : GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS)) { - uint8 SocketColor = GetTemplate()->GetSocketColor(enchant_slot - SOCK_ENCHANTMENT_SLOT); - + uint8 SocketColor = GetTemplate()->GetSocketColor(gemSlot); if (!SocketColor) // no socket slot continue; - uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot)); - if (!enchant_id) // no gems on this socket - return false; - - SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id); - if (!enchantEntry) // invalid gem id on this socket - return false; - - uint8 GemColor = 0; + uint32 GemColor = 0; - uint32 gemid = enchantEntry->SRCItemID; - if (gemid) + ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemItemId); + if (gemProto) { - ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemid); - if (gemProto) - { - GemPropertiesEntry const* gemProperty = sGemPropertiesStore.LookupEntry(gemProto->GetGemProperties()); - if (gemProperty) - GemColor = gemProperty->Type; - } + GemPropertiesEntry const* gemProperty = sGemPropertiesStore.LookupEntry(gemProto->GetGemProperties()); + if (gemProperty) + GemColor = gemProperty->Type; } - if (!(GemColor & SocketColor)) // bad gem color on this socket + if (!(GemColor & SocketColorToGemTypeMask[SocketColor])) // bad gem color on this socket return false; } return true; @@ -961,44 +981,22 @@ bool Item::GemsFitSockets() const uint8 Item::GetGemCountWithID(uint32 GemID) const { - uint8 count = 0; - for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+MAX_GEM_SOCKETS; ++enchant_slot) + return std::count_if(GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).begin(), GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).end(), [GemID](uint32 gemItemId) { - uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot)); - if (!enchant_id) - continue; - - SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id); - if (!enchantEntry) - continue; - - if (GemID == enchantEntry->SRCItemID) - ++count; - } - return count; + return gemItemId == GemID; + }); } uint8 Item::GetGemCountWithLimitCategory(uint32 limitCategory) const { - uint8 count = 0; - for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+MAX_GEM_SOCKETS; ++enchant_slot) + return std::count_if(GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).begin(), GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).end(), [limitCategory](uint32 gemItemId) { - uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot)); - if (!enchant_id) - continue; - - SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id); - if (!enchantEntry) - continue; - - ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(enchantEntry->SRCItemID); + ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemItemId); if (!gemProto) - continue; + return false; - if (gemProto->GetItemLimitCategory() == limitCategory) - ++count; - } - return count; + return gemProto->GetItemLimitCategory() == limitCategory; + }); } bool Item::IsLimitedToAnotherMapOrZone(uint32 cur_mapId, uint32 cur_zoneId) const diff --git a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp index 7b30480df35..2f82071f66f 100644 --- a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp +++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp @@ -178,7 +178,7 @@ TC_GAME_API uint32 GetRandomPropertyPoints(uint32 itemLevel, uint32 quality, uin return 0; } - RandomPropertiesPointsEntry const* randPropPointsEntry = sRandomPropertiesPointsStore.LookupEntry(itemLevel); + RandPropPointsEntry const* randPropPointsEntry = sRandPropPointsStore.LookupEntry(itemLevel); if (!randPropPointsEntry) return 0; diff --git a/src/server/game/Entities/Item/ItemTemplate.cpp b/src/server/game/Entities/Item/ItemTemplate.cpp index ebed45eaaac..04873bdddcf 100644 --- a/src/server/game/Entities/Item/ItemTemplate.cpp +++ b/src/server/game/Entities/Item/ItemTemplate.cpp @@ -22,6 +22,29 @@ #include "ItemTemplate.h" #include "Player.h" +uint32 const SocketColorToGemTypeMask[19] = +{ + 0, + SOCKET_COLOR_META, + SOCKET_COLOR_RED, + SOCKET_COLOR_YELLOW, + SOCKET_COLOR_BLUE, + SOCKET_COLOR_HYDRAULIC, + SOCKET_COLOR_COGWHEEL, + SOCKET_COLOR_PRISMATIC, + SOCKET_COLOR_RELIC_IRON, + SOCKET_COLOR_RELIC_BLOOD, + SOCKET_COLOR_RELIC_SHADOW, + SOCKET_COLOR_RELIC_FEL, + SOCKET_COLOR_RELIC_ARCANE, + SOCKET_COLOR_RELIC_FROST, + SOCKET_COLOR_RELIC_FIRE, + SOCKET_COLOR_RELIC_WATER, + SOCKET_COLOR_RELIC_LIFE, + SOCKET_COLOR_RELIC_WIND, + SOCKET_COLOR_RELIC_HOLY +}; + char const* ItemTemplate::GetName(LocaleConstant locale) const { if (!strlen(ExtendedData->Name->Str[locale])) @@ -137,21 +160,21 @@ void ItemTemplate::GetDamage(uint32 itemLevel, float& minDamage, float& maxDamag if (GetClass() != ITEM_CLASS_WEAPON || quality > ITEM_QUALITY_ARTIFACT) return; - DBCStorage<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 +182,15 @@ void ItemTemplate::GetDamage(uint32 itemLevel, float& minDamage, float& maxDamag switch (GetSubClass()) { case ITEM_SUBCLASS_WEAPON_WAND: - store = &sItemDamageWandStore; - break; - case ITEM_SUBCLASS_WEAPON_THROWN: - store = &sItemDamageThrownStore; + dps = sItemDamageOneHandCasterStore.AssertEntry(itemLevel)->DPS[quality]; break; case ITEM_SUBCLASS_WEAPON_BOW: case ITEM_SUBCLASS_WEAPON_GUN: case ITEM_SUBCLASS_WEAPON_CROSSBOW: - store = &sItemDamageRangedStore; + if (GetFlags2() & ITEM_FLAG2_CASTER_WEAPON) + dps = sItemDamageTwoHandCasterStore.AssertEntry(itemLevel)->DPS[quality]; + else + dps = sItemDamageTwoHandStore.AssertEntry(itemLevel)->DPS[quality]; break; default: return; @@ -177,21 +200,14 @@ void ItemTemplate::GetDamage(uint32 itemLevel, float& minDamage, float& maxDamag case INVTYPE_WEAPONMAINHAND: case INVTYPE_WEAPONOFFHAND: if (GetFlags2() & ITEM_FLAG2_CASTER_WEAPON) - store = &sItemDamageOneHandCasterStore; + dps = sItemDamageOneHandCasterStore.AssertEntry(itemLevel)->DPS[quality]; else - store = &sItemDamageOneHandStore; + dps = sItemDamageOneHandStore.AssertEntry(itemLevel)->DPS[quality]; break; default: return; } - ASSERT(store); - - ItemDamageEntry const* damageInfo = store->LookupEntry(itemLevel); - if (!damageInfo) - return; - - float dps = damageInfo->DPS[quality]; float avgDamage = dps * GetDelay() * 0.001f; minDamage = (GetStatScalingFactor() * -0.5f + 1.0f) * avgDamage; maxDamage = floor(float(avgDamage * (GetStatScalingFactor() * 0.5f + 1.0f) + 0.5f)); diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index d69f1c88845..38265cc9fed 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -317,15 +317,29 @@ enum BAG_FAMILY_MASK enum SocketColor { - SOCKET_COLOR_META = 1, - SOCKET_COLOR_RED = 2, - SOCKET_COLOR_YELLOW = 4, - SOCKET_COLOR_BLUE = 8, - SOCKET_COLOR_HYDRAULIC = 16, // not used - SOCKET_COLOR_COGWHEEL = 32, -}; - -#define SOCKET_COLOR_ALL (SOCKET_COLOR_META | SOCKET_COLOR_RED | SOCKET_COLOR_YELLOW | SOCKET_COLOR_BLUE | SOCKET_COLOR_COGWHEEL) + SOCKET_COLOR_META = 0x00001, + SOCKET_COLOR_RED = 0x00002, + SOCKET_COLOR_YELLOW = 0x00004, + SOCKET_COLOR_BLUE = 0x00008, + SOCKET_COLOR_HYDRAULIC = 0x00010, // not used + SOCKET_COLOR_COGWHEEL = 0x00020, + SOCKET_COLOR_PRISMATIC = 0x0000E, + SOCKET_COLOR_RELIC_IRON = 0x00040, + SOCKET_COLOR_RELIC_BLOOD = 0x00080, + SOCKET_COLOR_RELIC_SHADOW = 0x00100, + SOCKET_COLOR_RELIC_FEL = 0x00200, + SOCKET_COLOR_RELIC_ARCANE = 0x00400, + SOCKET_COLOR_RELIC_FROST = 0x00800, + SOCKET_COLOR_RELIC_FIRE = 0x01000, + SOCKET_COLOR_RELIC_WATER = 0x02000, + SOCKET_COLOR_RELIC_LIFE = 0x04000, + SOCKET_COLOR_RELIC_WIND = 0x08000, + SOCKET_COLOR_RELIC_HOLY = 0x10000 +}; + +extern uint32 const SocketColorToGemTypeMask[19]; + +#define SOCKET_COLOR_STANDARD (SOCKET_COLOR_RED | SOCKET_COLOR_YELLOW | SOCKET_COLOR_BLUE) enum InventoryType { @@ -646,10 +660,11 @@ class Player; struct TC_GAME_API ItemTemplate { + uint32 Id; ItemEntry const* BasicData; ItemSparseEntry const* ExtendedData; - uint32 GetId() const { return BasicData->ID; } + uint32 GetId() const { return Id; } uint32 GetClass() const { return BasicData->Class; } uint32 GetSubClass() const { return BasicData->SubClass; } uint32 GetQuality() const { return ExtendedData->Quality; } @@ -658,7 +673,7 @@ struct TC_GAME_API ItemTemplate uint32 GetFlags3() const { return ExtendedData->Flags[2]; } float GetUnk1() const { return ExtendedData->Unk1; } float GetUnk2() const { return ExtendedData->Unk2; } - uint32 GetBuyCount() const { return std::max(ExtendedData->BuyCount, 1u); } + uint32 GetBuyCount() const { return std::max<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 f9fa1b3aeb6..67d8d89cdf6 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1341,6 +1341,13 @@ std::vector<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/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 90f1c829bb9..38a47d999a9 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -421,7 +421,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac return false; } - if (!ValidateAppearance(createInfo->Race, createInfo->Class, createInfo->Sex, createInfo->HairStyle, createInfo->HairColor, createInfo->Face, createInfo->FacialHairStyle, createInfo->Skin, true)) + if (!ValidateAppearance(createInfo->Race, createInfo->Class, createInfo->Sex, createInfo->HairStyle, createInfo->HairColor, createInfo->Face, createInfo->FacialHairStyle, createInfo->Skin, createInfo->CustomDisplay, true)) { TC_LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account %u tried creating a character named '%s' with invalid appearance attributes - refusing to do so", GetSession()->GetAccountId(), m_name.c_str()); @@ -1805,20 +1805,21 @@ void Player::RegenerateAll() // Runes act as cooldowns, and they don't need to send any data if (getClass() == CLASS_DEATH_KNIGHT) { - for (uint8 i = 0; i < MAX_RUNES; i += 2) + uint32 regeneratedRunes = 0; + uint32 regenIndex = 0; + while (regeneratedRunes < MAX_RECHARGING_RUNES && !m_runes->CooldownOrder.empty()) { - uint8 runeToRegen = i; - uint32 cd = GetRuneCooldown(i); - uint32 secondRuneCd = GetRuneCooldown(i + 1); - // Regenerate second rune of the same type only after first rune is off the cooldown - if (secondRuneCd && (cd > secondRuneCd || !cd)) + uint8 runeToRegen = m_runes->CooldownOrder[regenIndex++]; + uint32 runeCooldown = GetRuneCooldown(runeToRegen); + if (runeCooldown > m_regenTimer) { - runeToRegen = i + 1; - cd = secondRuneCd; + SetRuneCooldown(runeToRegen, runeCooldown - m_regenTimer); + ++regenIndex; } + else + SetRuneCooldown(runeCooldown, 0); - if (cd) - SetRuneCooldown(runeToRegen, (cd > m_regenTimer) ? cd - m_regenTimer : 0); + ++regeneratedRunes; } } @@ -2055,8 +2056,8 @@ void Player::ResetAllPowers() case POWER_RUNIC_POWER: SetPower(POWER_RUNIC_POWER, 0); break; - case POWER_ECLIPSE: - SetPower(POWER_ECLIPSE, 0); + case POWER_LUNAR_POWER: + SetPower(POWER_LUNAR_POWER, 0); break; default: break; @@ -3142,12 +3143,12 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent if (!pSkill) continue; - if (pSkill->ID == fromSkill) + if (_spell_idx->second->SkillLine == fromSkill) continue; // Runeforging special case - if ((_spell_idx->second->AquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(pSkill->ID)) || ((pSkill->ID == SKILL_RUNEFORGING_2) && _spell_idx->second->TrivialSkillLineRankHigh == 0)) - if (SkillRaceClassInfoEntry const* rcInfo = GetSkillRaceClassInfo(pSkill->ID, getRace(), getClass())) + if ((_spell_idx->second->AquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(_spell_idx->second->SkillLine)) || ((_spell_idx->second->SkillLine == SKILL_RUNEFORGING_2) && _spell_idx->second->TrivialSkillLineRankHigh == 0)) + if (SkillRaceClassInfoEntry const* rcInfo = sDB2Manager.GetSkillRaceClassInfo(_spell_idx->second->SkillLine, getRace(), getClass())) LearnDefaultSkill(rcInfo); } } @@ -3230,7 +3231,7 @@ bool Player::IsNeedCastPassiveSpellAtLearn(SpellInfo const* spellInfo) const bool Player::IsCurrentSpecMasterySpell(SpellInfo const* spellInfo) const { if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(GetSpecId(GetActiveTalentGroup()))) - return spellInfo->Id == chrSpec->MasterySpellID[0] || spellInfo->Id == chrSpec->MasterySpellID[1]; + return spellInfo->Id == chrSpec->MasterySpellID; return false; } @@ -3968,6 +3969,10 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_GEMS_BY_OWNER); + stmt->setUInt64(0, guid); + trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER); stmt->setUInt64(0, guid); trans->Append(stmt); @@ -4217,7 +4222,7 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness) SetPower(POWER_RAGE, 0); SetPower(POWER_ENERGY, uint32(GetMaxPower(POWER_ENERGY)*restore_percent)); SetPower(POWER_FOCUS, uint32(GetMaxPower(POWER_FOCUS)*restore_percent)); - SetPower(POWER_ECLIPSE, 0); + SetPower(POWER_LUNAR_POWER, 0); } // trigger update zone for alive state zone updates @@ -5326,7 +5331,7 @@ void Player::UpdateSkillsForLevel() continue; uint32 pskill = itr->first; - SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(pskill, getRace(), getClass()); + SkillRaceClassInfoEntry const* rcEntry = sDB2Manager.GetSkillRaceClassInfo(pskill, getRace(), getClass()); if (!rcEntry) continue; @@ -5363,7 +5368,7 @@ void Player::UpdateSkillsToMaxSkillsForLevel() continue; uint32 pskill = itr->first; - SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(pskill, getRace(), getClass()); + SkillRaceClassInfoEntry const* rcEntry = sDB2Manager.GetSkillRaceClassInfo(pskill, getRace(), getClass()); if (!rcEntry) continue; @@ -6129,7 +6134,7 @@ void Player::RewardReputation(Quest const* quest) else { uint32 row = ((quest->RewardFactionValue[i] < 0) ? 1 : 0) + 1; - if (QuestFactionRewEntry const* questFactionRewEntry = sQuestFactionRewardStore.LookupEntry(row)) + if (QuestFactionRewardEntry const* questFactionRewEntry = sQuestFactionRewardStore.LookupEntry(row)) { uint32 field = abs(quest->RewardFactionValue[i]); rep = questFactionRewEntry->QuestRewFactionValue[field]; @@ -9764,7 +9769,7 @@ bool Player::HasItemTotemCategory(uint32 TotemCategory) const for (uint8 i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i) { item = GetUseableItemByPos(INVENTORY_SLOT_BAG_0, i); - if (item && IsTotemCategoryCompatibleWith(item->GetTemplate()->GetTotemCategory(), TotemCategory)) + if (item && DB2Manager::IsTotemCategoryCompatibleWith(item->GetTemplate()->GetTotemCategory(), TotemCategory)) return true; } @@ -9777,7 +9782,7 @@ bool Player::HasItemTotemCategory(uint32 TotemCategory) const for (uint32 j = 0; j < bag->GetBagSize(); ++j) { item = GetUseableItemByPos(i, j); - if (item && IsTotemCategoryCompatibleWith(item->GetTemplate()->GetTotemCategory(), TotemCategory)) + if (item && DB2Manager::IsTotemCategoryCompatibleWith(item->GetTemplate()->GetTotemCategory(), TotemCategory)) return true; } } @@ -12763,20 +12768,23 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool if (pEnchant->RequiredSkillID > 0 && pEnchant->RequiredSkillRank > GetSkillValue(pEnchant->RequiredSkillID)) return; - // Cogwheel gems dont have requirement data set in SpellItemEnchantment.dbc, but they do have it in Item-sparse.db2 - if (ItemTemplate const* gem = sObjectMgr->GetItemTemplate(pEnchant->SRCItemID)) - if (gem->GetRequiredSkill() && GetSkillValue(gem->GetRequiredSkill()) < gem->GetRequiredSkillRank()) - return; // If we're dealing with a gem inside a prismatic socket we need to check the prismatic socket requirements // rather than the gem requirements itself. If the socket has no color it is a prismatic socket. - if ((slot == SOCK_ENCHANTMENT_SLOT || slot == SOCK_ENCHANTMENT_SLOT_2 || slot == SOCK_ENCHANTMENT_SLOT_3) - && !item->GetSocketColor(slot - SOCK_ENCHANTMENT_SLOT)) + if ((slot == SOCK_ENCHANTMENT_SLOT || slot == SOCK_ENCHANTMENT_SLOT_2 || slot == SOCK_ENCHANTMENT_SLOT_3)) { - // Check if the requirements for the prismatic socket are met before applying the gem stats - SpellItemEnchantmentEntry const* pPrismaticEnchant = sSpellItemEnchantmentStore.LookupEntry(item->GetEnchantmentId(PRISMATIC_ENCHANTMENT_SLOT)); - if (!pPrismaticEnchant || (pPrismaticEnchant->RequiredSkillID > 0 && pPrismaticEnchant->RequiredSkillRank > GetSkillValue(pPrismaticEnchant->RequiredSkillID))) - return; + if (!item->GetSocketColor(slot - SOCK_ENCHANTMENT_SLOT)) + { + // Check if the requirements for the prismatic socket are met before applying the gem stats + SpellItemEnchantmentEntry const* pPrismaticEnchant = sSpellItemEnchantmentStore.LookupEntry(item->GetEnchantmentId(PRISMATIC_ENCHANTMENT_SLOT)); + if (!pPrismaticEnchant || (pPrismaticEnchant->RequiredSkillID > 0 && pPrismaticEnchant->RequiredSkillRank > GetSkillValue(pPrismaticEnchant->RequiredSkillID))) + return; + } + + // Cogwheel gems dont have requirement data set in SpellItemEnchantment.dbc, but they do have it in Item-sparse.db2 + if (ItemTemplate const* gem = sObjectMgr->GetItemTemplate(item->GetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, uint32(slot - SOCK_ENCHANTMENT_SLOT)))) + if (gem->GetRequiredSkill() && GetSkillValue(gem->GetRequiredSkill()) < gem->GetRequiredSkillRank()) + return; } if (!item->IsBroken()) @@ -16357,7 +16365,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_COLOR_ID), GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_FACE_ID), GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_FACIAL_STYLE), - GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_SKIN_ID))) + GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_SKIN_ID), + std::array<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; @@ -16922,7 +16931,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) for (; loadedPowers < MAX_POWERS_PER_CLASS; ++loadedPowers) SetUInt32Value(UNIT_FIELD_POWER + loadedPowers, 0); - SetPower(POWER_ECLIPSE, 0); + SetPower(POWER_LUNAR_POWER, 0); TC_LOG_DEBUG("entities.player.loading", "Player::LoadFromDB: The value of player '%s' after load item and aura is: ", m_name.c_str()); outDebugValues(); @@ -17265,8 +17274,8 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // SELECT ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, ii.transmogrification, ii.upgradeId - // 15 16 17 18 19 20 21 22 - // ii.enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, ii.bonusListIDs, bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot + // 15 16 17 18 19 20 21 22 23 24 25 + // ii.enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, ii.bonusListIDs, ig.gemItemId1, ig.gemItemId2, ig.gemItemId3, bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot //NOTE: the "order by `bag`" is important because it makes sure //the bagMap is filled before items in the bags are loaded //NOTE2: the "order by `slot`" is needed because mainhand weapons are (wrongly?) @@ -17288,8 +17297,8 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) Field* fields = result->Fetch(); if (Item* item = _LoadItem(trans, zoneId, timeDiff, fields)) { - ObjectGuid bagGuid = fields[21].GetUInt64() ? ObjectGuid::Create<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); @@ -21560,23 +21569,11 @@ bool Player::EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot) if (i == slot) continue; Item* pItem2 = GetItemByPos(INVENTORY_SLOT_BAG_0, i); - if (pItem2 && !pItem2->IsBroken() && pItem2->GetTemplate()->GetSocketColor(0)) + if (pItem2 && !pItem2->IsBroken()) { - for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+3; ++enchant_slot) + for (uint32 gemItemId : pItem2->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS)) { - uint32 enchant_id = pItem2->GetEnchantmentId(EnchantmentSlot(enchant_slot)); - if (!enchant_id) - continue; - - SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id); - if (!enchantEntry) - continue; - - uint32 gemid = enchantEntry->SRCItemID; - if (!gemid) - continue; - - ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemid); + ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemItemId); if (!gemProto) continue; @@ -21584,13 +21581,11 @@ bool Player::EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot) if (!gemProperty) continue; - uint8 GemColor = gemProperty->Type; + uint32 GemColor = gemProperty->Type; for (uint8 b = 0, tmpcolormask = 1; b < 4; b++, tmpcolormask <<= 1) - { if (tmpcolormask & GemColor) ++curcount[b]; - } } } } @@ -23498,7 +23493,7 @@ void Player::ResurrectUsingRequestDataImpl() SetPower(POWER_RAGE, 0); SetPower(POWER_ENERGY, GetMaxPower(POWER_ENERGY)); SetPower(POWER_FOCUS, GetMaxPower(POWER_FOCUS)); - SetPower(POWER_ECLIPSE, 0); + SetPower(POWER_LUNAR_POWER, 0); if (uint32 aura = _resurrectionData->Aura) CastSpell(this, aura, true, nullptr, nullptr, _resurrectionData->GUID); @@ -24005,16 +24000,16 @@ uint32 Player::GetBarberShopCost(BarberShopStyleEntry const* newHairStyle, uint8 void Player::InitGlyphsForLevel() { - uint32 slotMask = 0; - uint8 slot = 0; - uint8 level = getLevel(); - for (GlyphSlotEntry const* gs : sDB2Manager.GetGlyphSlots()) - { - if (level >= ((gs->Tooltip + 1) * 25)) - slotMask |= 1 << slot; + //uint32 slotMask = 0; + //uint8 slot = 0; + //uint8 level = getLevel(); + //for (GlyphSlotEntry const* gs : sDB2Manager.GetGlyphSlots()) + //{ + // if (level >= ((gs->Tooltip + 1) * 25)) + // slotMask |= 1 << slot; - SetGlyphSlot(slot++, gs->ID); - } + // SetGlyphSlot(slot++, gs->ID); + //} } void Player::SetGlyph(uint8 slot, uint32 glyph) @@ -24095,7 +24090,7 @@ bool Player::isTotalImmunity() const return false; } -uint32 Player::GetRuneTypeBaseCooldown() const +uint32 Player::GetRuneBaseCooldown() const { float cooldown = RUNE_BASE_COOLDOWN; @@ -24133,72 +24128,33 @@ void Player::SetRuneCooldown(uint8 index, uint32 cooldown, bool casted /*= false SetRuneTimer(index, 0); } - m_runes->runes[index].Cooldown = cooldown; + m_runes->Cooldown[index] = cooldown; m_runes->SetRuneState(index, (cooldown == 0) ? true : false); } -void Player::SetRuneConvertAura(uint8 index, AuraEffect const* aura) -{ - m_runes->runes[index].ConvertAura = aura; -} - -void Player::AddRuneByAuraEffect(uint8 index, RuneType newType, AuraEffect const* aura) +void Runes::SetRuneState(uint8 index, bool set /*= true*/) { - SetRuneConvertAura(index, aura); ConvertRune(index, newType); -} - -void Player::RemoveRunesByAuraEffect(AuraEffect const* aura) -{ - for (uint8 i = 0; i < MAX_RUNES; ++i) + auto itr = std::find(CooldownOrder.begin(), CooldownOrder.end(), index); + if (set) { - if (m_runes->runes[i].ConvertAura == aura) - { - ConvertRune(i, GetBaseRune(i)); - SetRuneConvertAura(i, nullptr); - } + RuneState |= (1 << index); // usable + if (itr == CooldownOrder.end()) + CooldownOrder.push_back(index); } -} - -void Player::RestoreBaseRune(uint8 index) -{ - AuraEffect const* aura = m_runes->runes[index].ConvertAura; - // If rune was converted by a non-passive aura that still active we should keep it converted - if (aura && !(aura->GetSpellInfo()->Attributes & SPELL_ATTR0_PASSIVE)) - return; - ConvertRune(index, GetBaseRune(index)); - SetRuneConvertAura(index, nullptr); - // Don't drop passive talents providing rune convertion - if (!aura || aura->GetAuraType() != SPELL_AURA_CONVERT_RUNE) - return; - for (uint8 i = 0; i < MAX_RUNES; ++i) + else { - if (aura == m_runes->runes[i].ConvertAura) - return; + RuneState &= ~(1 << index); // on cooldown + if (itr != CooldownOrder.end()) + CooldownOrder.erase(itr); } - aura->GetBase()->Remove(); -} - -void Player::ConvertRune(uint8 index, RuneType newType) -{ - SetCurrentRune(index, newType); - - WorldPackets::Spells::ConvertRune data; - data.Index = index; - data.Rune = newType; - GetSession()->SendPacket(data.Write()); } -void Player::ResyncRunes(uint8 count) const +void Player::ResyncRunes() const { - WorldPackets::Spells::ResyncRunes data(count); + WorldPackets::Spells::ResyncRunes data(MAX_RUNES); + for (uint32 i = 0; i < MAX_RUNES; ++i) + data.Runes.push_back(uint8(255 - (GetRuneCooldown(i) * 51))); - for (uint32 i = 0; i < count; ++i) - { - WorldPackets::Spells::ResyncRunes::ResyncRune rune; - rune.RuneType = GetCurrentRune(i); // rune type - rune.Cooldown = uint8(255 - (GetRuneCooldown(i) * 51)); // passed cooldown time (0-255) - data.Runes.push_back(rune); - } GetSession()->SendPacket(data.Write()); } @@ -24209,16 +24165,6 @@ void Player::AddRunePower(uint8 index) const GetSession()->SendPacket(&data); } -static RuneType runeSlotTypes[MAX_RUNES] = -{ - /*0*/ RUNE_BLOOD, - /*1*/ RUNE_BLOOD, - /*2*/ RUNE_UNHOLY, - /*3*/ RUNE_UNHOLY, - /*4*/ RUNE_FROST, - /*5*/ RUNE_FROST -}; - void Player::InitRunes() { if (getClass() != CLASS_DEATH_KNIGHT) @@ -24228,20 +24174,14 @@ void Player::InitRunes() if (runeIndex == MAX_POWERS) return; - m_runes = new Runes; - - m_runes->runeState = 0; - m_runes->lastUsedRune = RUNE_BLOOD; + m_runes = new Runes(); + m_runes->RuneState = 0; for (uint8 i = 0; i < MAX_RUNES; ++i) { - SetBaseRune(i, runeSlotTypes[i]); // init base types - SetCurrentRune(i, runeSlotTypes[i]); // init current types SetRuneCooldown(i, 0); // reset cooldowns SetRuneTimer(i, 0xFFFFFFFF); // Reset rune flags SetLastRuneGraceTimer(i, 0); - SetRuneConvertAura(i, nullptr); - m_runes->SetRuneState(i); } // set a base regen timer equal to 10 sec @@ -24249,15 +24189,6 @@ void Player::InitRunes() SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER + runeIndex, 0.1f); } -bool Player::IsBaseRuneSlotsOnCooldown(RuneType runeType) const -{ - for (uint8 i = 0; i < MAX_RUNES; ++i) - if (GetBaseRune(i) == runeType && GetRuneCooldown(i) == 0) - return false; - - return true; -} - void Player::AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore const& store, bool broadcast) { Loot loot; @@ -24400,7 +24331,7 @@ void Player::_LoadSkills(PreparedQueryResult result) uint16 value = fields[1].GetUInt16(); uint16 max = fields[2].GetUInt16(); - SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(skill, getRace(), getClass()); + SkillRaceClassInfoEntry const* rcEntry = sDB2Manager.GetSkillRaceClassInfo(skill, getRace(), getClass()); if (!rcEntry) { TC_LOG_ERROR("entities.player", "Player::_LoadSkills: Player '%s' (%s, Race: %u, Class: %u) has forbidden skill %u for his race/class combination", @@ -24512,16 +24443,9 @@ InventoryResult Player::CanEquipUniqueItem(Item* pItem, uint8 eslot, uint32 limi return res; // check unique-equipped on gems - for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+3; ++enchant_slot) + for (uint32 gemItemId : pItem->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS)) { - uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot)); - if (!enchant_id) - continue; - SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id); - if (!enchantEntry) - continue; - - ItemTemplate const* pGem = sObjectMgr->GetItemTemplate(enchantEntry->SRCItemID); + ItemTemplate const* pGem = sObjectMgr->GetItemTemplate(gemItemId); if (!pGem) continue; @@ -24679,6 +24603,11 @@ void Player::CompletedAchievement(AchievementEntry const* entry) m_achievementMgr->CompletedAchievement(entry, this); } +bool Player::ModifierTreeSatisfied(uint32 modifierTreeId) const +{ + return m_achievementMgr->ModifierTreeSatisfied(modifierTreeId); +} + bool Player::LearnTalent(uint32 talentId) { TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId); @@ -25306,9 +25235,8 @@ void Player::ActivateTalentGroup(uint8 spec) if (CanUseMastery()) if (ChrSpecializationEntry const* specialization = sChrSpecializationStore.LookupEntry(GetSpecId(GetActiveTalentGroup()))) - for (uint32 i = 0; i < MAX_MASTERY_SPELLS; ++i) - if (uint32 mastery = specialization->MasterySpellID[i]) - LearnSpell(mastery, false); + if (uint32 mastery = specialization->MasterySpellID) + LearnSpell(mastery, false); // set glyphs for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot) @@ -26088,7 +26016,19 @@ void Player::SendSupercededSpell(uint32 oldSpell, uint32 newSpell) const uint32 Player::CalculateTalentsTiers() const { - uint32 const* rowLevels = (getClass() != CLASS_DEATH_KNIGHT) ? DefaultTalentRowLevels : DKTalentRowLevels; + uint32 const* rowLevels; + switch (getClass()) + { + case CLASS_DEATH_KNIGHT: + rowLevels = DKTalentRowLevels; + break; + case CLASS_DEMON_HUNTER: + rowLevels = DHTalentRowLevels; + default: + rowLevels = DefaultTalentRowLevels; + break; + } + for (uint32 i = MAX_TALENT_TIERS; i; --i) if (getLevel() >= rowLevels[i - 1]) return i; @@ -26219,9 +26159,8 @@ void Player::RemoveSpecializationSpells() } } - for (uint32 j = 0; j < MAX_MASTERY_SPELLS; ++j) - if (uint32 mastery = specialization->MasterySpellID[j]) - RemoveAurasDueToSpell(mastery); + if (uint32 mastery = specialization->MasterySpellID) + RemoveAurasDueToSpell(mastery); } } } @@ -26232,8 +26171,21 @@ void Player::RemoveSocial() m_social = nullptr; } -// TODO: check demon hunter custom display sections -bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 hairID, uint8 hairColor, uint8 faceID, uint8 facialHair, uint8 skinColor, bool create /*=false*/) +bool IsSectionFlagValid(CharSectionsEntry const* entry, uint8 class_, bool create) +{ + if (create && !(entry->Flags & SECTION_FLAG_PLAYER)) + return false; + + if (class_ != CLASS_DEATH_KNIGHT && (entry->Flags & SECTION_FLAG_DEATH_KNIGHT)) + return false; + + if (class_ != CLASS_DEMON_HUNTER && (entry->Flags & SECTION_FLAG_DEMON_HUNTER)) + return false; + + return true; +} + +bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 hairID, uint8 hairColor, uint8 faceID, uint8 facialHair, uint8 skinColor, std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> const& customDisplay, bool create /*= false*/) { // Check skin color // For Skin type is always 0 @@ -26241,10 +26193,9 @@ bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 ha { // Skin Color defined as Face color, too, we check skin & face in one pass if (CharSectionsEntry const* entry2 = GetCharSectionEntry(race, SECTION_TYPE_FACE, gender, faceID, skinColor)) { - // Check DeathKnight exclusive - if (((entry->Flags & SECTION_FLAG_DEATH_KNIGHT) || (entry2->Flags & SECTION_FLAG_DEATH_KNIGHT)) && class_ != CLASS_DEATH_KNIGHT) + if (!IsSectionFlagValid(entry, class_, create)) return false; - if (create && !((entry->Flags & SECTION_FLAG_PLAYER) && (entry2->Flags & SECTION_FLAG_PLAYER))) + if (!IsSectionFlagValid(entry2, class_, create)) return false; } else @@ -26259,18 +26210,14 @@ bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 ha // Check Hair if (CharSectionsEntry const* entry = GetCharSectionEntry(race, SECTION_TYPE_HAIR, gender, hairID, hairColor)) { - if ((entry->Flags & SECTION_FLAG_DEATH_KNIGHT) && class_ != CLASS_DEATH_KNIGHT) - return false; - if (create && !(entry->Flags & SECTION_FLAG_PLAYER)) + if (!IsSectionFlagValid(entry, class_, create)) return false; if (!excludeCheck) { if (CharSectionsEntry const* entry2 = GetCharSectionEntry(race, SECTION_TYPE_FACIAL_HAIR, gender, facialHair, hairColor)) { - if ((entry2->Flags & SECTION_FLAG_DEATH_KNIGHT) && class_ != CLASS_DEATH_KNIGHT) - return false; - if (create && !(entry2->Flags & SECTION_FLAG_PLAYER)) + if (!IsSectionFlagValid(entry2, class_, create)) return false; } else @@ -26285,6 +26232,11 @@ bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 ha else return false; + for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) + if (CharSectionsEntry const* entry = GetCharSectionEntry(race, CharSectionType(SECTION_TYPE_CUSTOM_DISPLAY_1 + i * 2), gender, customDisplay[i], 0)) + if (!IsSectionFlagValid(entry, class_, create)) + return false; + return true; } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index aa1f1d0697e..b538bbbe05c 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -447,7 +447,8 @@ struct Areas float y2; }; -#define MAX_RUNES 6 +#define MAX_RUNES 7 +#define MAX_RECHARGING_RUNES 3 enum RuneCooldowns { @@ -455,36 +456,13 @@ enum RuneCooldowns RUNE_MISS_COOLDOWN = 1500 // cooldown applied on runes when the spell misses }; -enum RuneType : uint8 -{ - RUNE_BLOOD = 0, - RUNE_UNHOLY = 1, - RUNE_FROST = 2, - RUNE_DEATH = 3, - NUM_RUNE_TYPES = 4 -}; - -struct RuneInfo -{ - RuneType BaseRune; - RuneType CurrentRune; - uint32 Cooldown; - AuraEffect const* ConvertAura; -}; - struct Runes { - RuneInfo runes[MAX_RUNES]; - uint8 runeState; // mask of available runes - RuneType lastUsedRune; + std::deque<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 @@ -1162,6 +1140,7 @@ struct ResurrectionData static uint32 const DefaultTalentRowLevels[MAX_TALENT_TIERS] = { 15, 30, 45, 60, 75, 90, 100 }; static uint32 const DKTalentRowLevels[MAX_TALENT_TIERS] = { 57, 58, 59, 60, 75, 90, 100 }; +static uint32 const DHTalentRowLevels[MAX_TALENT_TIERS] = { 99, 100, 102, 104, 106, 108, 110 }; struct TC_GAME_API PlayerTalentInfo { @@ -1652,7 +1631,7 @@ class TC_GAME_API Player : public Unit, public GridObject<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 ***/ @@ -2424,24 +2403,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(); } - uint32 GetRuneTypeBaseCooldown() const; - bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const; - RuneType GetLastUsedRune() const { return m_runes->lastUsedRune; } - void SetLastUsedRune(RuneType type) { m_runes->lastUsedRune = type; } - void SetBaseRune(uint8 index, RuneType baseRune) { m_runes->runes[index].BaseRune = baseRune; } - void SetCurrentRune(uint8 index, RuneType currentRune) { m_runes->runes[index].CurrentRune = currentRune; } + uint8 GetRunesState() const { return m_runes->RuneState; } + uint32 GetRuneCooldown(uint8 index) const { return m_runes->Cooldown[index]; } + uint32 GetRuneBaseCooldown() const; void SetRuneCooldown(uint8 index, uint32 cooldown, bool casted = false); - void SetRuneConvertAura(uint8 index, AuraEffect const* aura); - void AddRuneByAuraEffect(uint8 index, RuneType newType, AuraEffect const* aura); - void RemoveRunesByAuraEffect(AuraEffect const* aura); - void RestoreBaseRune(uint8 index); - void ConvertRune(uint8 index, RuneType newType); - void ResyncRunes(uint8 count) const; + void ResyncRunes() const; void AddRunePower(uint8 index) const; void InitRunes(); @@ -2454,6 +2420,7 @@ class TC_GAME_API Player : public Unit, public GridObject<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); } diff --git a/src/server/game/Entities/Taxi/TaxiPathGraph.cpp b/src/server/game/Entities/Taxi/TaxiPathGraph.cpp index 6617267be6a..22af722d592 100644 --- a/src/server/game/Entities/Taxi/TaxiPathGraph.cpp +++ b/src/server/game/Entities/Taxi/TaxiPathGraph.cpp @@ -108,8 +108,8 @@ void TaxiPathGraph::AddVerticeAndEdgeFromNodeInfo(TaxiNodesEntry const* from, Ta uint32 map1, map2; DBCPosition2D pos1, pos2; - DeterminaAlternateMapPosition(nodes[i - 1]->MapID, nodes[i - 1]->Loc.X, nodes[i - 1]->Loc.Y, nodes[i - 1]->Loc.Z, &map1, &pos1); - DeterminaAlternateMapPosition(nodes[i]->MapID, nodes[i]->Loc.X, nodes[i]->Loc.Y, nodes[i]->Loc.Z, &map2, &pos2); + DB2Manager::DeterminaAlternateMapPosition(nodes[i - 1]->MapID, nodes[i - 1]->Loc.X, nodes[i - 1]->Loc.Y, nodes[i - 1]->Loc.Z, &map1, &pos1); + DB2Manager::DeterminaAlternateMapPosition(nodes[i]->MapID, nodes[i]->Loc.X, nodes[i]->Loc.Y, nodes[i]->Loc.Z, &map2, &pos2); if (map1 != map2) continue; diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index deb163fde7e..f9ba83c19ca 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -539,24 +539,21 @@ void Player::UpdateMastery() if (!chrSpec) return; - for (uint32 i = 0; i < MAX_MASTERY_SPELLS; ++i) - { - if (!chrSpec->MasterySpellID[i]) - continue; + if (!chrSpec->MasterySpellID) + return; - if (Aura* aura = GetAura(chrSpec->MasterySpellID[i])) + if (Aura* aura = GetAura(chrSpec->MasterySpellID)) + { + for (SpellEffectInfo const* effect : aura->GetSpellEffectInfos()) { - for (SpellEffectInfo const* effect : aura->GetSpellEffectInfos()) - { - if (!effect) - continue; + if (!effect) + continue; - float mult = effect->BonusCoefficient; - if (G3D::fuzzyEq(mult, 0.0f)) - continue; + float mult = effect->BonusCoefficient; + if (G3D::fuzzyEq(mult, 0.0f)) + continue; - aura->GetEffect(effect->EffectIndex)->ChangeAmount(int32(value * effect->BonusCoefficient)); - } + aura->GetEffect(effect->EffectIndex)->ChangeAmount(int32(value * effect->BonusCoefficient)); } } } @@ -780,7 +777,7 @@ void Player::UpdateAllRunesRegen() if (runeIndex == MAX_POWERS) return; - uint32 cooldown = GetRuneTypeBaseCooldown(); + uint32 cooldown = GetRuneBaseCooldown(); SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER + runeIndex, float(1 * IN_MILLISECONDS) / float(cooldown)); SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER + runeIndex, float(1 * IN_MILLISECONDS) / float(cooldown)); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 271b84364de..2bf8d161798 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6056,78 +6056,6 @@ bool Unit::HandleAuraProc(Unit* /*victim*/, uint32 /*damage*/, Aura* triggeredBy } case SPELLFAMILY_DEATHKNIGHT: { - // Blood of the North - // Reaping - // Death Rune Mastery - /// @todo move those to spell scripts - if (dummySpell->SpellIconID == 3041 || (dummySpell->SpellIconID == 22 && dummySpell->Id != 62459) || dummySpell->SpellIconID == 2622) - { - *handled = true; - // Convert recently used Blood Rune to Death Rune - if (Player* player = ToPlayer()) - { - if (player->getClass() != CLASS_DEATH_KNIGHT) - return false; - - RuneType rune = ToPlayer()->GetLastUsedRune(); - // can't proc from death rune use - if (rune == RUNE_DEATH) - return false; - AuraEffect* aurEff = triggeredByAura->GetEffect(EFFECT_0); - if (!aurEff) - return false; - - // Reset amplitude - set death rune remove timer to 30s - aurEff->ResetPeriodic(true); - uint32 runesLeft; - - if (dummySpell->SpellIconID == 2622) - runesLeft = 2; - else - runesLeft = 1; - - for (uint8 i = 0; i < MAX_RUNES && runesLeft; ++i) - { - if (dummySpell->SpellIconID == 2622) - { - if (player->GetCurrentRune(i) == RUNE_DEATH || - player->GetBaseRune(i) == RUNE_BLOOD) - continue; - } - else - { - if (player->GetCurrentRune(i) == RUNE_DEATH || - player->GetBaseRune(i) != RUNE_BLOOD) - continue; - } - if (player->GetRuneCooldown(i) != (player->GetRuneBaseCooldown(i) - player->GetLastRuneGraceTimer(i))) - continue; - - --runesLeft; - // Mark aura as used - player->AddRuneByAuraEffect(i, RUNE_DEATH, aurEff); - } - return true; - } - return false; - } - - switch (dummySpell->Id) - { - // Bone Shield cooldown - case 49222: - { - *handled = true; - if (cooldown && GetTypeId() == TYPEID_PLAYER) - { - if (GetSpellHistory()->HasCooldown(100000)) - return false; - - GetSpellHistory()->AddCooldown(100000, 0, std::chrono::milliseconds(cooldown)); - } - return true; - } - } break; } case SPELLFAMILY_WARRIOR: @@ -11153,16 +11081,16 @@ int32 Unit::GetCreatePowers(Powers power) const case POWER_RUNIC_POWER: return 1000; case POWER_RUNES: - return 0; + return 6; case POWER_SOUL_SHARDS: return 400; - case POWER_ECLIPSE: + case POWER_LUNAR_POWER: return 100; case POWER_HOLY_POWER: return 3; case POWER_CHI: return 4; - case POWER_SHADOW_ORBS: + case POWER_INSANITY: return 3; case POWER_BURNING_EMBERS: return 40; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 415c46afa5d..5ba84c271be 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1446,7 +1446,7 @@ class TC_GAME_API Unit : public WorldObject Powers getPowerType() const { return Powers(GetUInt32Value(UNIT_FIELD_DISPLAY_POWER)); } void setPowerType(Powers power); int32 GetPower(Powers power) const; - int32 GetMinPower(Powers power) const { return power == POWER_ECLIPSE ? -100 : 0; } + int32 GetMinPower(Powers power) const { return power == POWER_LUNAR_POWER ? -100 : 0; } int32 GetMaxPower(Powers power) const; float GetPowerPct(Powers power) const { return GetMaxPower(power) ? 100.f * GetPower(power) / GetMaxPower(power) : 0.0f; } int32 CountPctFromMaxPower(Powers power, int32 pct) const { return CalculatePct(GetMaxPower(power), pct); } diff --git a/src/server/game/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp index 56cbb9ad58e..33bf14d4c15 100644 --- a/src/server/game/Garrison/Garrison.cpp +++ b/src/server/game/Garrison/Garrison.cpp @@ -23,7 +23,7 @@ #include "ObjectMgr.h" #include "VehicleDefines.h" -Garrison::Garrison(Player* owner) : _owner(owner), _siteLevel(nullptr), _followerActivationsRemainingToday(1) +Garrison::Garrison(Player* owner) : _owner(owner), _siteLevelId(0), _siteLevel(nullptr), _followerActivationsRemainingToday(1) { } @@ -34,7 +34,8 @@ bool Garrison::LoadFromDB(PreparedQueryResult garrison, PreparedQueryResult blue return false; Field* fields = garrison->Fetch(); - _siteLevel = sGarrSiteLevelStore.LookupEntry(fields[0].GetUInt32()); + _siteLevelId = fields[0].GetUInt32(); + _siteLevel = sGarrSiteLevelStore.LookupEntry(_siteLevelId); _followerActivationsRemainingToday = fields[1].GetUInt32(); if (!_siteLevel) return false; @@ -47,7 +48,7 @@ bool Garrison::LoadFromDB(PreparedQueryResult garrison, PreparedQueryResult blue { fields = blueprints->Fetch(); if (GarrBuildingEntry const* building = sGarrBuildingStore.LookupEntry(fields[0].GetUInt32())) - _knownBuildings.insert(building->ID); + _knownBuildings.insert(fields[0].GetUInt32()); } while (blueprints->NextRow()); } @@ -141,7 +142,7 @@ void Garrison::SaveToDB(SQLTransaction trans) PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_GARRISON); stmt->setUInt64(0, _owner->GetGUID().GetCounter()); - stmt->setUInt32(1, _siteLevel->ID); + stmt->setUInt32(1, _siteLevelId); stmt->setUInt32(2, _followerActivationsRemainingToday); trans->Append(stmt); @@ -219,14 +220,17 @@ void Garrison::DeleteFromDB(ObjectGuid::LowType ownerGuid, SQLTransaction trans) bool Garrison::Create(uint32 garrSiteId) { - _siteLevel = sGarrisonMgr.GetGarrSiteLevelEntry(garrSiteId, 1); - if (!_siteLevel) + DBStorageIterator<GarrSiteLevelEntry> siteLevelItr = sGarrisonMgr.GetGarrSiteLevelEntry(garrSiteId, 1); + if (siteLevelItr == sGarrSiteLevelStore.end()) return false; + _siteLevelId = siteLevelItr.Key(); + _siteLevel = siteLevelItr.Value(); + InitializePlots(); WorldPackets::Garrison::GarrisonCreateResult garrisonCreateResult; - garrisonCreateResult.GarrSiteLevelID = _siteLevel->ID; + garrisonCreateResult.GarrSiteLevelID = _siteLevelId; _owner->SendDirectMessage(garrisonCreateResult.Write()); _owner->SendUpdatePhasing(); SendRemoteInfo(); @@ -247,11 +251,11 @@ void Garrison::Delete() void Garrison::InitializePlots() { - if (std::vector<GarrSiteLevelPlotInstEntry const*> const* plots = sGarrisonMgr.GetGarrPlotInstForSiteLevel(_siteLevel->ID)) + if (std::vector<std::pair<uint32, GarrSiteLevelPlotInstEntry const*>> const* plots = sGarrisonMgr.GetGarrPlotInstForSiteLevel(_siteLevelId)) { for (std::size_t i = 0; i < plots->size(); ++i) { - uint32 garrPlotInstanceId = plots->at(i)->GarrPlotInstanceID; + uint32 garrPlotInstanceId = plots->at(i).second->GarrPlotInstanceID; GarrPlotInstanceEntry const* plotInstance = sGarrPlotInstanceStore.LookupEntry(garrPlotInstanceId); GameObjectsEntry const* gameObject = sGarrisonMgr.GetPlotGameObject(_siteLevel->MapID, garrPlotInstanceId); if (!plotInstance || !gameObject) @@ -266,7 +270,7 @@ void Garrison::InitializePlots() plotInfo.PacketInfo.PlotPos.Relocate(gameObject->Position.X, gameObject->Position.Y, gameObject->Position.Z, 2 * std::acos(gameObject->RotationW)); plotInfo.PacketInfo.PlotType = plot->PlotType; plotInfo.EmptyGameObjectId = gameObject->ID; - plotInfo.GarrSiteLevelPlotInstId = plots->at(i)->ID; + plotInfo.GarrSiteLevelPlotInstId = plots->at(i).first; } } } @@ -439,13 +443,13 @@ void Garrison::CancelBuildingConstruction(uint32 garrPlotInstanceId) if (constructing->Level > 1) { // Restore previous level building - GarrBuildingEntry const* restored = sGarrisonMgr.GetPreviousLevelBuilding(constructing->Type, constructing->Level); + uint32 restored = sGarrisonMgr.GetPreviousLevelBuildingId(constructing->Type, constructing->Level); ASSERT(restored); WorldPackets::Garrison::GarrisonPlaceBuildingResult placeBuildingResult; placeBuildingResult.Result = GARRISON_SUCCESS; placeBuildingResult.BuildingInfo.GarrPlotInstanceID = garrPlotInstanceId; - placeBuildingResult.BuildingInfo.GarrBuildingID = restored->ID; + placeBuildingResult.BuildingInfo.GarrBuildingID = restored; placeBuildingResult.BuildingInfo.TimeBuilt = time(nullptr); placeBuildingResult.BuildingInfo.Active = true; @@ -505,7 +509,7 @@ void Garrison::AddFollower(uint32 garrFollowerId) follower.PacketInfo.Xp = 0; follower.PacketInfo.CurrentBuildingID = 0; follower.PacketInfo.CurrentMissionID = 0; - follower.PacketInfo.AbilityID = sGarrisonMgr.RollFollowerAbilities(followerEntry, follower.PacketInfo.Quality, GetFaction(), true); + follower.PacketInfo.AbilityID = sGarrisonMgr.RollFollowerAbilities(garrFollowerId, followerEntry, follower.PacketInfo.Quality, GetFaction(), true); follower.PacketInfo.FollowerStatus = 0; addFollowerResult.Follower = follower.PacketInfo; @@ -527,7 +531,7 @@ void Garrison::SendInfo() { WorldPackets::Garrison::GetGarrisonInfoResult garrisonInfo; garrisonInfo.GarrSiteID = _siteLevel->SiteID; - garrisonInfo.GarrSiteLevelID = _siteLevel->ID; + garrisonInfo.GarrSiteLevelID = _siteLevelId; garrisonInfo.FactionIndex = GetFaction(); garrisonInfo.NumFollowerActivationsRemaining = _followerActivationsRemainingToday; for (auto& p : _plots) @@ -554,7 +558,7 @@ void Garrison::SendRemoteInfo() const remoteInfo.Sites.resize(1); WorldPackets::Garrison::GarrisonRemoteSiteInfo& remoteSiteInfo = remoteInfo.Sites[0]; - remoteSiteInfo.GarrSiteLevelID = _siteLevel->ID; + remoteSiteInfo.GarrSiteLevelID = _siteLevelId; for (auto const& p : _plots) if (p.second.BuildingInfo.PacketInfo) remoteSiteInfo.Buildings.emplace_back(p.first, p.second.BuildingInfo.PacketInfo->GarrBuildingID); diff --git a/src/server/game/Garrison/Garrison.h b/src/server/game/Garrison/Garrison.h index 2aa38ee6ad3..68ebbc4c0b9 100644 --- a/src/server/game/Garrison/Garrison.h +++ b/src/server/game/Garrison/Garrison.h @@ -157,6 +157,7 @@ private: GarrisonError CheckBuildingPlacement(uint32 garrPlotInstanceId, uint32 garrBuildingId) const; GarrisonError CheckBuildingRemoval(uint32 garrPlotInstanceId) const; Player* _owner; + uint32 _siteLevelId; GarrSiteLevelEntry const* _siteLevel; uint32 _followerActivationsRemainingToday; diff --git a/src/server/game/Garrison/GarrisonMgr.cpp b/src/server/game/Garrison/GarrisonMgr.cpp index 5c9bef62fc3..e2cba691910 100644 --- a/src/server/game/Garrison/GarrisonMgr.cpp +++ b/src/server/game/Garrison/GarrisonMgr.cpp @@ -32,8 +32,8 @@ GarrisonMgr& GarrisonMgr::Instance() void GarrisonMgr::Initialize() { - for (GarrSiteLevelPlotInstEntry const* plotInstance : sGarrSiteLevelPlotInstStore) - _garrisonPlotInstBySiteLevel[plotInstance->GarrSiteLevelID].push_back(plotInstance); + for (auto itr = sGarrSiteLevelPlotInstStore.begin(); itr != sGarrSiteLevelPlotInstStore.end(); ++itr) + _garrisonPlotInstBySiteLevel[itr->GarrSiteLevelID].push_back(std::make_pair(itr.Key(), itr.Value())); for (GameObjectsEntry const* gameObject : sGameObjectsStore) if (gameObject->Type == GAMEOBJECT_TYPE_GARRISON_PLOT) @@ -45,8 +45,8 @@ void GarrisonMgr::Initialize() for (GarrBuildingPlotInstEntry const* buildingPlotInst : sGarrBuildingPlotInstStore) _garrisonBuildingPlotInstances[MAKE_PAIR64(buildingPlotInst->GarrBuildingID, buildingPlotInst->GarrSiteLevelPlotInstID)] = buildingPlotInst->ID; - for (GarrBuildingEntry const* building : sGarrBuildingStore) - _garrisonBuildingsByType[building->Type].push_back(building); + for (auto itr = sGarrBuildingStore.begin(); itr != sGarrBuildingStore.end(); ++itr) + _garrisonBuildingsByType[itr->Type].push_back(itr.Key()); for (GarrFollowerXAbilityEntry const* followerAbility : sGarrFollowerXAbilityStore) { @@ -73,16 +73,16 @@ void GarrisonMgr::Initialize() LoadFollowerClassSpecAbilities(); } -GarrSiteLevelEntry const* GarrisonMgr::GetGarrSiteLevelEntry(uint32 garrSiteId, uint32 level) const +DBStorageIterator<GarrSiteLevelEntry> GarrisonMgr::GetGarrSiteLevelEntry(uint32 garrSiteId, uint32 level) const { - for (GarrSiteLevelEntry const* garrSiteLevel : sGarrSiteLevelStore) - if (garrSiteLevel->SiteID == garrSiteId && garrSiteLevel->Level == level) - return garrSiteLevel; + for (auto itr = sGarrSiteLevelStore.begin(); itr != sGarrSiteLevelStore.end(); ++itr) + if (itr->SiteID == garrSiteId && itr->Level == level) + return itr; - return nullptr; + return sGarrSiteLevelStore.end(); } -std::vector<GarrSiteLevelPlotInstEntry const*> const* GarrisonMgr::GetGarrPlotInstForSiteLevel(uint32 garrSiteLevelId) const +std::vector<std::pair<uint32, GarrSiteLevelPlotInstEntry const*>> const* GarrisonMgr::GetGarrPlotInstForSiteLevel(uint32 garrSiteLevelId) const { auto itr = _garrisonPlotInstBySiteLevel.find(garrSiteLevelId); if (itr != _garrisonPlotInstBySiteLevel.end()) @@ -122,15 +122,15 @@ uint32 GarrisonMgr::GetGarrBuildingPlotInst(uint32 garrBuildingId, uint32 garrSi return 0; } -GarrBuildingEntry const* GarrisonMgr::GetPreviousLevelBuilding(uint32 buildingType, uint32 currentLevel) const +uint32 GarrisonMgr::GetPreviousLevelBuildingId(uint32 buildingType, uint32 currentLevel) const { auto itr = _garrisonBuildingsByType.find(buildingType); if (itr != _garrisonBuildingsByType.end()) - for (GarrBuildingEntry const* building : itr->second) - if (building->Level == currentLevel - 1) - return building; + for (uint32 buildingId : itr->second) + if (sGarrBuildingStore.AssertEntry(buildingId)->Level == currentLevel - 1) + return buildingId; - return nullptr; + return 0; } FinalizeGarrisonPlotGOInfo const* GarrisonMgr::GetPlotFinalizeGOInfo(uint32 garrPlotInstanceID) const @@ -164,7 +164,7 @@ uint32 const AbilitiesForQuality[][2] = { 2, 3 } // Legendary }; -std::list<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..7a93941d59b 100644 --- a/src/server/game/Garrison/GarrisonMgr.h +++ b/src/server/game/Garrison/GarrisonMgr.h @@ -45,15 +45,15 @@ public: void Initialize(); - GarrSiteLevelEntry const* GetGarrSiteLevelEntry(uint32 garrSiteId, uint32 level) const; - std::vector<GarrSiteLevelPlotInstEntry const*> const* GetGarrPlotInstForSiteLevel(uint32 garrSiteLevelId) const; + DBStorageIterator<GarrSiteLevelEntry> GetGarrSiteLevelEntry(uint32 garrSiteId, uint32 level) const; + std::vector<std::pair<uint32, GarrSiteLevelPlotInstEntry const*>> const* GetGarrPlotInstForSiteLevel(uint32 garrSiteLevelId) const; GameObjectsEntry const* GetPlotGameObject(uint32 mapId, uint32 garrPlotInstanceId) const; bool IsPlotMatchingBuilding(uint32 garrPlotId, uint32 garrBuildingId) const; uint32 GetGarrBuildingPlotInst(uint32 garrBuildingId, uint32 garrSiteLevelPlotInstId) const; - GarrBuildingEntry const* GetPreviousLevelBuilding(uint32 buildingType, uint32 currentLevel) const; + uint32 GetPreviousLevelBuildingId(uint32 buildingType, uint32 currentLevel) const; FinalizeGarrisonPlotGOInfo const* GetPlotFinalizeGOInfo(uint32 garrPlotInstanceID) const; uint64 GenerateFollowerDbId(); - std::list<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: @@ -61,11 +61,11 @@ private: void LoadPlotFinalizeGOInfo(); void LoadFollowerClassSpecAbilities(); - std::unordered_map<uint32 /*garrSiteId*/, std::vector<GarrSiteLevelPlotInstEntry const*>> _garrisonPlotInstBySiteLevel; + std::unordered_map<uint32 /*garrSiteId*/, std::vector<std::pair<uint32, GarrSiteLevelPlotInstEntry const*>>> _garrisonPlotInstBySiteLevel; 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..c52622bd966 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2410,7 +2410,7 @@ void FillDisenchantFields(uint32* disenchantID, uint32* requiredDisenchantSkill, itemTemplate.GetMaxStackSize() > 1 || itemTemplate.GetQuality() < ITEM_QUALITY_UNCOMMON || itemTemplate.GetQuality() > ITEM_QUALITY_EPIC || !(itemTemplate.GetClass() == ITEM_CLASS_ARMOR || itemTemplate.GetClass() == ITEM_CLASS_WEAPON) || - !(Item::GetSpecialPrice(&itemTemplate) || sItemCurrencyCostStore.LookupEntry(itemTemplate.GetId()))) + !(Item::GetSpecialPrice(&itemTemplate) || sDB2Manager.HasItemCurrencyCost(itemTemplate.GetId()))) return; for (uint32 i = 0; i < sItemDisenchantLootStore.GetNumRows(); ++i) @@ -2424,18 +2424,18 @@ void FillDisenchantFields(uint32* disenchantID, uint32* requiredDisenchantSkill, disenchant->MinItemLevel <= itemTemplate.GetBaseItemLevel() && disenchant->MaxItemLevel >= itemTemplate.GetBaseItemLevel()) { - if (disenchant->ID == 60 || disenchant->ID == 61) // epic item disenchant ilvl range 66-99 (classic) + if (i == 60 || i == 61) // epic item disenchant ilvl range 66-99 (classic) { if (itemTemplate.GetBaseRequiredLevel() > 60 || itemTemplate.GetRequiredSkillRank() > 300) continue; // skip to epic item disenchant ilvl range 90-199 (TBC) } - else if (disenchant->ID == 66 || disenchant->ID == 67) // epic item disenchant ilvl range 90-199 (TBC) + else if (i == 66 || i == 67) // epic item disenchant ilvl range 90-199 (TBC) { if (itemTemplate.GetBaseRequiredLevel() <= 60 || (itemTemplate.GetRequiredSkill() && itemTemplate.GetRequiredSkillRank() <= 300)) continue; } - *disenchantID = disenchant->ID; + *disenchantID = i; *requiredDisenchantSkill = disenchant->RequiredDisenchantSkill; return; } @@ -2624,13 +2624,15 @@ void ObjectMgr::LoadItemTemplates() uint32 oldMSTime = getMSTime(); uint32 sparseCount = 0; - for (ItemSparseEntry const* sparse : sItemSparseStore) + for (auto itr = sItemSparseStore.begin(); itr != sItemSparseStore.end(); ++itr) { - ItemEntry const* db2Data = sItemStore.LookupEntry(sparse->ID); + ItemSparseEntry const* sparse = itr->second; + ItemEntry const* db2Data = sItemStore.LookupEntry(itr->first); if (!db2Data) continue; - ItemTemplate& itemTemplate = _itemTemplateStore[sparse->ID]; + ItemTemplate& itemTemplate = _itemTemplateStore[itr->first]; + itemTemplate.Id = itr->first; itemTemplate.BasicData = db2Data; itemTemplate.ExtendedData = sparse; @@ -2644,7 +2646,7 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.FlagsCu = 0; itemTemplate.SpellPPMRate = 0.0f; - if (std::vector<ItemSpecOverrideEntry const*> const* itemSpecOverrides = sDB2Manager.GetItemSpecOverrides(sparse->ID)) + if (std::vector<ItemSpecOverrideEntry const*> const* itemSpecOverrides = sDB2Manager.GetItemSpecOverrides(itemTemplate.Id)) { for (ItemSpecOverrideEntry const* itemSpecOverride : *itemSpecOverrides) itemTemplate.Specializations[0].insert(itemSpecOverride->SpecID); @@ -3448,6 +3450,12 @@ void ObjectMgr::LoadPlayerInfo() if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_CATACLYSM && (race == RACE_GOBLIN || race == RACE_WORGEN)) continue; + if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_MISTS_OF_PANDARIA && (race == RACE_PANDAREN_NEUTRAL || race == RACE_PANDAREN_HORDE || race == RACE_PANDAREN_ALLIANCE)) + continue; + + if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_LEGION && class_ == CLASS_DEMON_HUNTER) + continue; + // fatal error if no level 1 data if (!info->levelInfo || info->levelInfo[0].stats[0] == 0) { @@ -4388,7 +4396,7 @@ void ObjectMgr::LoadQuests() if (qinfo->SoundAccept) { - if (!sSoundEntriesStore.LookupEntry(qinfo->SoundAccept)) + if (!sSoundKitStore.LookupEntry(qinfo->SoundAccept)) { TC_LOG_ERROR("sql.sql", "Quest %u has `SoundAccept` = %u but sound %u does not exist, set to 0.", qinfo->GetQuestId(), qinfo->SoundAccept, qinfo->SoundAccept); @@ -4398,7 +4406,7 @@ void ObjectMgr::LoadQuests() if (qinfo->SoundTurnIn) { - if (!sSoundEntriesStore.LookupEntry(qinfo->SoundTurnIn)) + if (!sSoundKitStore.LookupEntry(qinfo->SoundTurnIn)) { TC_LOG_ERROR("sql.sql", "Quest %u has `SoundTurnIn` = %u but sound %u does not exist, set to 0.", qinfo->GetQuestId(), qinfo->SoundTurnIn, qinfo->SoundTurnIn); @@ -8703,25 +8711,12 @@ void ObjectMgr::LoadCreatureClassLevelStats() if (!Class || ((1 << (Class - 1)) & CLASSMASK_ALL_CREATURES) == 0) TC_LOG_ERROR("sql.sql", "Creature base stats for level %u has invalid class %u", Level, Class); - GtNpcTotalHpEntry const* HpExp0 = sGtNpcTotalHpStore.EvaluateTable(Level - 1, Class - 1); - GtNpcTotalHpExp1Entry const* HpExp1 = sGtNpcTotalHpExp1Store.EvaluateTable(Level - 1, Class - 1); - GtNpcTotalHpExp2Entry const* HpExp2 = sGtNpcTotalHpExp2Store.EvaluateTable(Level - 1, Class - 1); - GtNpcTotalHpExp3Entry const* HpExp3 = sGtNpcTotalHpExp3Store.EvaluateTable(Level - 1, Class - 1); - GtNpcTotalHpExp4Entry const* HpExp4 = sGtNpcTotalHpExp4Store.EvaluateTable(Level - 1, Class - 1); - GtNpcTotalHpExp5Entry const* HpExp5 = sGtNpcTotalHpExp5Store.EvaluateTable(Level - 1, Class - 1); - CreatureBaseStats stats; - stats.BaseHealth[0] = uint32(HpExp0->HP); - stats.BaseHealth[1] = uint32(HpExp1->HP); - stats.BaseHealth[2] = uint32(HpExp2->HP); - stats.BaseHealth[3] = uint32(HpExp3->HP); - stats.BaseHealth[4] = uint32(HpExp4->HP); - stats.BaseHealth[5] = uint32(HpExp5->HP); - for (uint8 i = 0; i < MAX_EXPANSIONS; ++i) { - stats.BaseDamage[i] = fields[6 + i].GetFloat(); + stats.BaseHealth[0] = sGtNpcTotalHpStore[i].EvaluateTable(Level - 1, Class - 1)->HP; + stats.BaseDamage[0] = sGtNpcDamageByClassStore[i].EvaluateTable(Level - 1, Class - 1)->Damage; if (stats.BaseDamage[i] < 0.0f) { TC_LOG_ERROR("sql.sql", "Creature base stats for class %u, level %u has invalid negative base damage[%u] - set to 0.0", Class, Level, i); diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 86a59f04f23..e0d15e8def0 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -368,7 +368,7 @@ void Guild::BankTab::LoadFromDB(Field* fields) bool Guild::BankTab::LoadItemFromDB(Field* fields) { - uint8 slotId = fields[23].GetUInt8(); + uint8 slotId = fields[26].GetUInt8(); ObjectGuid::LowType itemGuid = fields[0].GetUInt64(); uint32 itemEntry = fields[1].GetUInt32(); if (slotId >= GUILD_BANK_MAX_SLOTS) @@ -2395,7 +2395,7 @@ void Guild::LoadBankTabFromDB(Field* fields) bool Guild::LoadBankItemFromDB(Field* fields) { - uint8 tabId = fields[22].GetUInt8(); + uint8 tabId = fields[25].GetUInt8(); if (tabId >= _GetPurchasedTabsSize()) { TC_LOG_ERROR("guild", "Invalid tab for item (GUID: %u, id: #%u) in guild bank, skipped.", diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index 6af809dcedb..20cbf22d40e 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -403,8 +403,8 @@ void GuildMgr::LoadGuilds() // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, transmogrification, upgradeId, enchantIllusion, - // 17 18 19 20 21 22 23 - // battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid + // 17 18 19 20 21 22 23 24 25 26 + // battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, ig.gemItemId1, ig.gemItemId2, ig.gemItemId3, guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid PreparedQueryResult result = CharacterDatabase.Query(CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_BANK_ITEMS)); if (!result) @@ -417,7 +417,7 @@ void GuildMgr::LoadGuilds() do { Field* fields = result->Fetch(); - uint64 guildId = fields[21].GetUInt64(); + uint64 guildId = fields[24].GetUInt64(); if (Guild* guild = GetGuildById(guildId)) guild->LoadBankItemFromDB(fields); diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index 43a0baa75a7..1fa50f1493e 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -55,7 +55,7 @@ void WorldSession::SendAuctionHello(ObjectGuid guid, Creature* unit) return; } - AuctionHouseEntry const* ahEntry = AuctionHouseMgr::GetAuctionHouseEntry(unit->getFaction()); + AuctionHouseEntry const* ahEntry = AuctionHouseMgr::GetAuctionHouseEntry(unit->getFaction(), nullptr); if (!ahEntry) return; @@ -139,7 +139,8 @@ void WorldSession::HandleAuctionSellItem(WorldPackets::AuctionHouse::AuctionSell return; } - AuctionHouseEntry const* auctionHouseEntry = AuctionHouseMgr::GetAuctionHouseEntry(creature->getFaction()); + uint32 houseId = 0; + AuctionHouseEntry const* auctionHouseEntry = AuctionHouseMgr::GetAuctionHouseEntry(creature->getFaction(), &houseId); if (!auctionHouseEntry) { TC_LOG_DEBUG("network", "WORLD: HandleAuctionSellItem - Unit (%s) has wrong faction.", packet.Auctioneer.ToString().c_str()); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 07507392cef..95a99736563 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -280,7 +280,7 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result) TC_LOG_INFO("network", "Loading char guid %s from account %u.", charInfo.Guid.ToString().c_str(), GetAccountId()); - if (!Player::ValidateAppearance(charInfo.Race, charInfo.Class, charInfo.Sex, charInfo.HairStyle, charInfo.HairColor, charInfo.Face, charInfo.FacialHair, charInfo.Skin)) + if (!Player::ValidateAppearance(charInfo.Race, charInfo.Class, charInfo.Sex, charInfo.HairStyle, charInfo.HairColor, charInfo.Face, charInfo.FacialHair, charInfo.Skin, charInfo.CustomDisplay)) { TC_LOG_ERROR("entities.player.loading", "Player %s has wrong Appearance values (Hair/Skin/Color), forcing recustomize", charInfo.Guid.ToString().c_str()); @@ -1432,7 +1432,8 @@ void WorldSession::HandleAlterAppearance(WorldPackets::Character::AlterApperance packet.NewHairColor, bs_face ? bs_face->Data : _player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_FACE_ID), bs_facialHair->Data, - bs_skinColor ? bs_skinColor->Data : _player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_SKIN_ID))) + bs_skinColor ? bs_skinColor->Data : _player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_SKIN_ID), + std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE>{0, 0, 0})) return; GameObject* go = _player->FindNearestGameObjectOfType(GAMEOBJECT_TYPE_BARBER_CHAIR, 5.0f); @@ -1534,7 +1535,8 @@ void WorldSession::HandleCharCustomizeCallback(PreparedQueryResult result, World uint8 plrGender = fields[3].GetUInt8(); uint16 atLoginFlags = fields[4].GetUInt16(); - if (!Player::ValidateAppearance(plrRace, plrClass, plrGender, customizeInfo->HairStyleID, customizeInfo->HairColorID, customizeInfo->FaceID, customizeInfo->FacialHairStyleID, customizeInfo->SkinID, true)) + if (!Player::ValidateAppearance(plrRace, plrClass, plrGender, customizeInfo->HairStyleID, customizeInfo->HairColorID, customizeInfo->FaceID, + customizeInfo->FacialHairStyleID, customizeInfo->SkinID, customizeInfo->CustomDisplay, true)) { SendCharCustomize(CHAR_CREATE_ERROR, customizeInfo); return; diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 8c7f8190e09..80ee0918616 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -901,29 +901,21 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) return; } - // tried to put normal gem in meta socket - if (itemTarget->GetSocketColor(i) == SOCKET_COLOR_META && GemProps[i]->Type != SOCKET_COLOR_META) - return; - - // tried to put meta gem in normal socket - if (itemTarget->GetSocketColor(i) != SOCKET_COLOR_META && GemProps[i]->Type == SOCKET_COLOR_META) - return; - - // tried to put normal gem in cogwheel socket - if (itemTarget->GetSocketColor(i) == SOCKET_COLOR_COGWHEEL && GemProps[i]->Type != SOCKET_COLOR_COGWHEEL) - return; - - // tried to put cogwheel gem in normal socket - if (itemTarget->GetSocketColor(i) != SOCKET_COLOR_COGWHEEL && GemProps[i]->Type == SOCKET_COLOR_COGWHEEL) - return; + // Gem must match socket color + if (SocketColorToGemTypeMask[itemTarget->GetSocketColor(i)] != GemProps[i]->Type) + { + // unless its red, blue, yellow or prismatic + if (!(SocketColorToGemTypeMask[itemTarget->GetSocketColor(i)] & SOCKET_COLOR_PRISMATIC) || !(GemProps[i]->Type & SOCKET_COLOR_PRISMATIC)) + return; + } } uint32 GemEnchants[MAX_GEM_SOCKETS]; - uint32 OldEnchants[MAX_GEM_SOCKETS]; + uint32 oldGemItemIds[MAX_GEM_SOCKETS]; for (int i = 0; i < MAX_GEM_SOCKETS; ++i) //get new and old enchantments { GemEnchants[i] = (GemProps[i]) ? GemProps[i]->EnchantID : 0; - OldEnchants[i] = itemTarget->GetEnchantmentId(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT+i)); + oldGemItemIds[i] = itemTarget->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size() > i ? itemTarget->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS)[i] : 0; } // check unique-equipped conditions @@ -951,15 +943,12 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) return; } } - else if (OldEnchants[j]) + else if (oldGemItemIds[j]) { - if (SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(OldEnchants[j])) + if (iGemProto->GetId() == oldGemItemIds[j]) { - if (iGemProto->GetId() == enchantEntry->SRCItemID) - { - _player->SendEquipError(EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED, itemTarget, NULL); - return; - } + _player->SendEquipError(EQUIP_ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED, itemTarget, NULL); + return; } } } @@ -980,13 +969,12 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) if (iGemProto->GetItemLimitCategory() == Gems[j]->GetTemplate()->GetItemLimitCategory()) ++limit_newcount; } - else if (OldEnchants[j]) + else if (oldGemItemIds[j]) { // existing gem - if (SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(OldEnchants[j])) - if (ItemTemplate const* jProto = sObjectMgr->GetItemTemplate(enchantEntry->SRCItemID)) - if (iGemProto->GetItemLimitCategory() == jProto->GetItemLimitCategory()) - ++limit_newcount; + if (ItemTemplate const* jProto = sObjectMgr->GetItemTemplate(oldGemItemIds[j])) + if (iGemProto->GetItemLimitCategory() == jProto->GetItemLimitCategory()) + ++limit_newcount; } } @@ -1018,16 +1006,25 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + MAX_GEM_SOCKETS; ++enchant_slot) _player->ApplyEnchantment(itemTarget, EnchantmentSlot(enchant_slot), false); + uint32 reqGemSlots = 0; + for (uint32 i = 0; i < MAX_GEM_SOCKETS; ++i) + if (Gems[i]) + reqGemSlots = i + 1; + + while (itemTarget->GetDynamicValues(ITEM_DYNAMIC_FIELD_GEMS).size() < reqGemSlots) + itemTarget->AddDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, 0); + for (int i = 0; i < MAX_GEM_SOCKETS; ++i) { - if (GemEnchants[i]) + if (Item* guidItem = _player->GetItemByGuid(socketGems.GemItem[i])) { - itemTarget->SetEnchantment(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT+i), GemEnchants[i], 0, 0, _player->GetGUID()); - if (Item* guidItem = _player->GetItemByGuid(socketGems.GemItem[i])) - { - uint32 gemCount = 1; - _player->DestroyItemCount(guidItem, gemCount, true); - } + itemTarget->SetDynamicValue(ITEM_DYNAMIC_FIELD_GEMS, i, guidItem->GetEntry()); + + if (GemEnchants[i]) + itemTarget->SetEnchantment(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT+i), GemEnchants[i], 0, 0, _player->GetGUID()); + + uint32 gemCount = 1; + _player->DestroyItemCount(guidItem, gemCount, true); } } diff --git a/src/server/game/Handlers/SkillHandler.cpp b/src/server/game/Handlers/SkillHandler.cpp index 2060468a41a..d6e1b35de6e 100644 --- a/src/server/game/Handlers/SkillHandler.cpp +++ b/src/server/game/Handlers/SkillHandler.cpp @@ -71,7 +71,7 @@ void WorldSession::HandleConfirmRespecWipeOpcode(WorldPackets::Talent::ConfirmRe void WorldSession::HandleUnlearnSkillOpcode(WorldPackets::Spells::UnlearnSkill& packet) { - SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(packet.SkillLine, GetPlayer()->getRace(), GetPlayer()->getClass()); + SkillRaceClassInfoEntry const* rcEntry = sDB2Manager.GetSkillRaceClassInfo(packet.SkillLine, GetPlayer()->getRace(), GetPlayer()->getClass()); if (!rcEntry || !(rcEntry->Flags & SKILL_FLAG_UNLEARNABLE)) return; diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index a7e11e81970..be4f71e8b71 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -1557,7 +1557,7 @@ void LoadLootTemplates_Disenchant() if (!disenchant) continue; - uint32 lootid = disenchant->ID; + uint32 lootid = i; if (lootIdSet.find(lootid) == lootIdSet.end()) LootTemplates_Disenchant.ReportNonExistingId(lootid); else diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 63079904a67..1ef2e7b0ed9 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -82,10 +82,11 @@ enum Expansions EXPANSION_CATACLYSM = 3, EXPANSION_MISTS_OF_PANDARIA = 4, EXPANSION_WARLORDS_OF_DRAENOR = 5, - MAX_EXPANSIONS = 6 + EXPANSION_LEGION = 6, + MAX_EXPANSIONS }; -#define CURRENT_EXPANSION EXPANSION_WARLORDS_OF_DRAENOR +#define CURRENT_EXPANSION EXPANSION_LEGION enum Gender { @@ -174,11 +175,12 @@ enum Classes CLASS_MAGE = 8, CLASS_WARLOCK = 9, CLASS_MONK = 10, - CLASS_DRUID = 11 + CLASS_DRUID = 11, + CLASS_DEMON_HUNTER = 12 }; // max+1 for player class -#define MAX_CLASSES 12 +#define MAX_CLASSES 13 #define CLASSMASK_ALL_PLAYABLE \ ((1<<(CLASS_WARRIOR-1)) | \ @@ -191,7 +193,8 @@ enum Classes (1<<(CLASS_MAGE-1)) | \ (1<<(CLASS_WARLOCK-1)) | \ (1<<(CLASS_MONK-1)) | \ - (1<<(CLASS_DRUID-1))) + (1<<(CLASS_DRUID-1)) | \ + (1<<(CLASS_DEMON_HUNTER-1))) // valid classes for creature_template.unit_class enum UnitClass @@ -253,16 +256,18 @@ enum Powers // (6.0) POWER_RUNES = 5, POWER_RUNIC_POWER = 6, POWER_SOUL_SHARDS = 7, - POWER_ECLIPSE = 8, + POWER_LUNAR_POWER = 8, POWER_HOLY_POWER = 9, POWER_ALTERNATE_POWER = 10, // Used in some quests - POWER_DARK_FORCE = 11, + POWER_MAELSTROM = 11, POWER_CHI = 12, - POWER_SHADOW_ORBS = 13, + POWER_INSANITY = 13, POWER_BURNING_EMBERS = 14, POWER_DEMONIC_FURY = 15, POWER_ARCANE_CHARGES = 16, - MAX_POWERS = 17, + POWER_FURY = 17, + POWER_PAIN = 18, + MAX_POWERS = 19, POWER_ALL = 127, // default for class? POWER_HEALTH = 0xFFFFFFFE // (-2 as signed value) }; @@ -725,7 +730,7 @@ enum SpellAttr10 SPELL_ATTR10_UNK9 = 0x00000200, // 9 SPELL_ATTR10_UNK10 = 0x00000400, // 10 SPELL_ATTR10_HERB_GATHERING_MINING = 0x00000800, // 11 Only Herb Gathering and Mining - SPELL_ATTR10_UNK12 = 0x00001000, // 12 + SPELL_ATTR10_USE_SPELL_BASE_LEVEL_FOR_SCALING = 0x00001000, // 12 SPELL_ATTR10_UNK13 = 0x00002000, // 13 SPELL_ATTR10_UNK14 = 0x00004000, // 14 SPELL_ATTR10_UNK15 = 0x00008000, // 15 @@ -756,7 +761,7 @@ enum SpellAttr11 SPELL_ATTR11_UNK4 = 0x00000010, // 4 SPELL_ATTR11_UNK5 = 0x00000020, // 5 SPELL_ATTR11_UNK6 = 0x00000040, // 6 - SPELL_ATTR11_NO_RANK = 0x00000080, // 7 Spell_C_GetSpellRank returns 0 instead of 5 * std::min(SpellLevels->MaxLevel, caster->Level) + SPELL_ATTR11_RANK_IGNORES_CASTER_LEVEL = 0x00000080, // 7 Spell_C_GetSpellRank returns SpellLevels->MaxLevel * 5 instead of std::min(SpellLevels->MaxLevel, caster->Level) * 5 SPELL_ATTR11_UNK8 = 0x00000100, // 8 SPELL_ATTR11_UNK9 = 0x00000200, // 9 SPELL_ATTR11_UNK10 = 0x00000400, // 10 diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index aa78cae6deb..53800dbb726 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -780,22 +780,11 @@ void WorldPackets::Spells::SpellClick::Read() TryAutoDismount = _worldPacket.ReadBit(); } -WorldPacket const* WorldPackets::Spells::ConvertRune::Write() -{ - _worldPacket << uint8(Index); - _worldPacket << uint8(Rune); - - return &_worldPacket; -} - WorldPacket const* WorldPackets::Spells::ResyncRunes::Write() { _worldPacket << uint32(Runes.size()); - for (auto const& rune : Runes) - { - _worldPacket << uint8(rune.RuneType); - _worldPacket << uint8(rune.Cooldown); - } + if (!Runes.empty()) + _worldPacket.append(Runes.data(), Runes.size()); return &_worldPacket; } diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index b1cb39251de..0680405eeb2 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -799,31 +799,14 @@ namespace WorldPackets bool TryAutoDismount = false; }; - class ConvertRune final : public ServerPacket - { - public: - ConvertRune() : ServerPacket(SMSG_CONVERT_RUNE, 1 + 1) { } - - WorldPacket const* Write() override; - - uint8 Index = 0; - uint8 Rune = 0; - }; - class ResyncRunes final : public ServerPacket { public: - struct ResyncRune - { - uint8 RuneType = 0; - uint8 Cooldown = 0; - }; - ResyncRunes(size_t size) : ServerPacket(SMSG_RESYNC_RUNES, 4 + 2 * size) { } WorldPacket const* Write() override; - std::vector<ResyncRune> Runes; + std::vector<uint8> Runes; }; class MissileTrajectoryCollision final : public ClientPacket diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index b7159ea08ae..900092c126b 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1001,7 +1001,6 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONSOLE_WRITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTACT_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTROL_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONVERT_RUNE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COOLDOWN_CHEAT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COOLDOWN_EVENT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_LOCATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 8027f49db0d..715799294de 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -1668,7 +1668,6 @@ enum OpcodeServer : uint32 SMSG_BF_MGR_ENTRY_INVITE = 0xBADD, SMSG_BF_MGR_QUEUE_INVITE = 0xBADD, SMSG_BF_MGR_QUEUE_REQUEST_RESPONSE = 0xBADD, - SMSG_CONVERT_RUNE = 0xBADD, }; inline bool IsInstanceOnlyOpcode(uint32 opcode) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index c86e20a53ad..e529990cccd 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -308,7 +308,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNoImmediateEffect, //246 SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK implemented in Spell::EffectApplyAura &AuraEffect::HandleAuraCloneCaster, //247 SPELL_AURA_CLONE_CASTER &AuraEffect::HandleNoImmediateEffect, //248 SPELL_AURA_MOD_COMBAT_RESULT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst - &AuraEffect::HandleAuraConvertRune, //249 SPELL_AURA_CONVERT_RUNE + &AuraEffect::HandleNULL, //249 SPELL_AURA_CONVERT_RUNE deprecated &AuraEffect::HandleAuraModIncreaseHealth, //250 SPELL_AURA_MOD_INCREASE_HEALTH_2 &AuraEffect::HandleNoImmediateEffect, //251 SPELL_AURA_MOD_ENEMY_DODGE &AuraEffect::HandleModCombatSpeedPct, //252 SPELL_AURA_252 Is there any difference between this and SPELL_AURA_MELEE_SLOW ? maybe not stacking mod? @@ -5250,39 +5250,6 @@ void AuraEffect::HandleComprehendLanguage(AuraApplication const* aurApp, uint8 m } } -void AuraEffect::HandleAuraConvertRune(AuraApplication const* aurApp, uint8 mode, bool apply) const -{ - if (!(mode & AURA_EFFECT_HANDLE_REAL)) - return; - - Unit* target = aurApp->GetTarget(); - - Player* player = target->ToPlayer(); - if (!player) - return; - - if (player->getClass() != CLASS_DEATH_KNIGHT) - return; - - uint32 runes = m_amount; - // convert number of runes specified in aura amount of rune type in miscvalue to runetype in miscvalueb - if (apply) - { - for (uint32 i = 0; i < MAX_RUNES && runes; ++i) - { - if (GetMiscValue() != player->GetCurrentRune(i)) - continue; - if (!player->GetRuneCooldown(i)) - { - player->AddRuneByAuraEffect(i, RuneType(GetMiscValueB()), this); - --runes; - } - } - } - else - player->RemoveRunesByAuraEffect(this); -} - void AuraEffect::HandleAuraLinked(AuraApplication const* aurApp, uint8 mode, bool apply) const { Unit* target = aurApp->GetTarget(); @@ -5575,19 +5542,6 @@ void AuraEffect::HandlePeriodicDummyAuraTick(Unit* target, Unit* caster) const target->DealDamage(target, damage, NULL, NODAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); break; } - // Blood of the North - // Reaping - // Death Rune Mastery - if (GetSpellInfo()->SpellIconID == 3041 || GetSpellInfo()->SpellIconID == 22 || GetSpellInfo()->SpellIconID == 2622) - { - if (target->GetTypeId() != TYPEID_PLAYER) - return; - if (target->ToPlayer()->getClass() != CLASS_DEATH_KNIGHT) - return; - - // timer expired - remove death runes - target->ToPlayer()->RemoveRunesByAuraEffect(this); - } break; default: break; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index 0d907e4148c..46a0ccdabc6 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -294,7 +294,6 @@ class TC_GAME_API AuraEffect void HandleAuraEmpathy(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraModFaction(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleComprehendLanguage(AuraApplication const* aurApp, uint8 mode, bool apply) const; - void HandleAuraConvertRune(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraLinked(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraOpenStable(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraModFakeInebriation(AuraApplication const* aurApp, uint8 mode, bool apply) const; diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 521abd26e7b..af22d2fa496 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1517,21 +1517,6 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b target->RemoveAura(61988); break; case SPELLFAMILY_DEATHKNIGHT: - // Blood of the North - // Reaping - // Death Rune Mastery - if (GetSpellInfo()->SpellIconID == 3041 || GetSpellInfo()->SpellIconID == 22 || GetSpellInfo()->SpellIconID == 2622) - { - if (!GetEffect(0) || GetEffect(0)->GetAuraType() != SPELL_AURA_PERIODIC_DUMMY) - break; - if (target->GetTypeId() != TYPEID_PLAYER) - break; - if (target->ToPlayer()->getClass() != CLASS_DEATH_KNIGHT) - break; - - // aura removed - remove death runes - target->ToPlayer()->RemoveRunesByAuraEffect(GetEffect(0)); - } break; case SPELLFAMILY_HUNTER: // Glyph of Freezing Trap diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index dac9b82549c..cf35e643a02 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3340,7 +3340,7 @@ void Spell::cast(bool skipCheck) if (m_caster->ToPlayer()->GetCommandStatus(CHEAT_COOLDOWN)) { m_caster->GetSpellHistory()->ResetCooldown(m_spellInfo->Id, true); - m_caster->GetSpellHistory()->RestoreCharge(m_spellInfo->ChargeCategoryEntry); + m_caster->GetSpellHistory()->RestoreCharge(m_spellInfo->ChargeCategoryId); } } @@ -3892,8 +3892,7 @@ void Spell::SendSpellStart() && std::find_if(m_powerCost.begin(), m_powerCost.end(), [](SpellInfo::CostData const& cost) { return cost.Power != POWER_HEALTH; }) != m_powerCost.end()) castFlags |= CAST_FLAG_POWER_LEFT_SELF; - if (m_spellInfo->RuneCostID && - std::find_if(m_powerCost.begin(), m_powerCost.end(), [](SpellInfo::CostData const& cost) { return cost.Power == POWER_RUNES; }) != m_powerCost.end()) + if (std::find_if(m_powerCost.begin(), m_powerCost.end(), [](SpellInfo::CostData const& cost) { return cost.Power == POWER_RUNES; }) != m_powerCost.end()) castFlags |= CAST_FLAG_NO_GCD; // not needed, but Blizzard sends it WorldPackets::Spells::SpellStart packet; @@ -3938,7 +3937,7 @@ void Spell::SendSpellStart() for (uint8 i = 0; i < MAX_RUNES; ++i) { // float casts ensure the division is performed on floats as we need float result - float baseCd = float(player->GetRuneBaseCooldown(i)); + float baseCd = float(player->GetRuneBaseCooldown()); castData.RemainingRunes->Cooldowns.push_back((baseCd - float(player->GetRuneCooldown(i))) / baseCd * 255); // rune cooldown passed } } @@ -3995,7 +3994,6 @@ void Spell::SendSpellGo() if ((m_caster->GetTypeId() == TYPEID_PLAYER) && (m_caster->getClass() == CLASS_DEATH_KNIGHT) - && m_spellInfo->RuneCostID && std::find_if(m_powerCost.begin(), m_powerCost.end(), [](SpellInfo::CostData const& cost) { return cost.Power == POWER_RUNES; }) != m_powerCost.end() && !(_triggeredCastFlags & TRIGGERED_IGNORE_POWER_AND_REAGENT_COST)) { @@ -4056,7 +4054,7 @@ void Spell::SendSpellGo() for (uint8 i = 0; i < MAX_RUNES; ++i) { // float casts ensure the division is performed on floats as we need float result - float baseCd = float(player->GetRuneBaseCooldown(i)); + float baseCd = float(player->GetRuneBaseCooldown()); castData.RemainingRunes->Cooldowns.push_back((baseCd - float(player->GetRuneCooldown(i))) / baseCd * 255); // rune cooldown passed } } @@ -4544,9 +4542,10 @@ void Spell::TakePower() } } -SpellCastResult Spell::CheckRuneCost(uint32 runeCostID) +SpellCastResult Spell::CheckRuneCost() { - if (std::find_if(m_powerCost.begin(), m_powerCost.end(), [](SpellInfo::CostData const& cost) { return cost.Power == POWER_RUNES; }) == m_powerCost.end() || !runeCostID) + auto runeCost = std::find_if(m_powerCost.begin(), m_powerCost.end(), [](SpellInfo::CostData const& cost) { return cost.Power == POWER_RUNES; }); + if (runeCost == m_powerCost.end()) return SPELL_CAST_OK; Player* player = m_caster->ToPlayer(); @@ -4556,36 +4555,12 @@ SpellCastResult Spell::CheckRuneCost(uint32 runeCostID) if (player->getClass() != CLASS_DEATH_KNIGHT) return SPELL_CAST_OK; - SpellRuneCostEntry const* src = sSpellRuneCostStore.LookupEntry(runeCostID); - if (!src) - return SPELL_CAST_OK; - - if (src->NoRuneCost()) - return SPELL_CAST_OK; - - int32 runeCost[NUM_RUNE_TYPES]; // blood, frost, unholy, death - - for (uint32 i = 0; i < NUM_RUNE_TYPES; ++i) - { - runeCost[i] = src->RuneCost[i]; - if (Player* modOwner = m_caster->GetSpellModOwner()) - modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_COST, runeCost[i], this); - } - - runeCost[RUNE_DEATH] += MAX_RUNES; - - for (uint32 i = 0; i < MAX_RUNES; ++i) - { - RuneType rune = player->GetCurrentRune(i); - if ((player->GetRuneCooldown(i) == 0) && (runeCost[rune] > 0)) - runeCost[rune]--; - } - - for (uint32 i = 0; i < RUNE_DEATH; ++i) - if (runeCost[i] > 0) - runeCost[RUNE_DEATH] += runeCost[i]; + int32 readyRunes = 0; + for (uint32 i = 0; i < player->GetMaxPower(POWER_RUNES); ++i) + if (player->GetRuneCooldown(i) == 0) + ++readyRunes; - if (runeCost[RUNE_DEATH] > MAX_RUNES) + if (readyRunes < runeCost->Amount) return SPELL_FAILED_NO_POWER; // not sure if result code is correct return SPELL_CAST_OK; @@ -4596,95 +4571,24 @@ void Spell::TakeRunePower(bool didHit) if (m_caster->GetTypeId() != TYPEID_PLAYER || m_caster->getClass() != CLASS_DEATH_KNIGHT) return; - SpellRuneCostEntry const* runeCostData = sSpellRuneCostStore.LookupEntry(m_spellInfo->RuneCostID); - if (!runeCostData || (runeCostData->NoRuneCost() && runeCostData->NoRunicPowerGain())) - return; - Player* player = m_caster->ToPlayer(); m_runesState = player->GetRunesState(); // store previous state - int32 runeCost[NUM_RUNE_TYPES]; // blood, frost, unholy, death - - for (uint32 i = 0; i < NUM_RUNE_TYPES; ++i) + int32 runeCost = std::find_if(m_powerCost.begin(), m_powerCost.end(), [](SpellInfo::CostData const& cost) { - runeCost[i] = runeCostData->RuneCost[i]; - if (Player* modOwner = m_caster->GetSpellModOwner()) - modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_COST, runeCost[i], this); - } + return cost.Power == POWER_RUNES; + })->Amount; - bool convertUsedRunes = false; - for (AuraEffect const* convertConsumedRuneAuras : m_caster->GetAuraEffectsByType(SPELL_AURA_CONVERT_CONSUMED_RUNE)) - if (convertConsumedRuneAuras->IsAffectingSpell(m_spellInfo)) - convertUsedRunes = true; - - // Let's say we use a skill that requires a Frost rune. This is the order: - // - Frost rune - // - Death rune, originally a Frost rune - // - Death rune, any kind - for (uint32 i = 0; i < MAX_RUNES; ++i) + for (uint32 i = 0; i < player->GetMaxPower(POWER_RUNES); ++i) { - RuneType rune = player->GetCurrentRune(i); - if (!player->GetRuneCooldown(i) && runeCost[rune] > 0) + if (!player->GetRuneCooldown(i) && runeCost > 0) { - player->SetRuneCooldown(i, didHit ? player->GetRuneBaseCooldown(i) : uint32(RUNE_MISS_COOLDOWN), true); - player->SetLastUsedRune(rune); - runeCost[rune]--; + player->SetRuneCooldown(i, didHit ? player->GetRuneBaseCooldown() : uint32(RUNE_MISS_COOLDOWN), true); + --runeCost; if (convertUsedRunes) player->ConvertRune(i, RUNE_DEATH); } } - - // Find a Death rune where the base rune matches the one we need - runeCost[RUNE_DEATH] += runeCost[RUNE_BLOOD] + runeCost[RUNE_UNHOLY] + runeCost[RUNE_FROST]; - if (runeCost[RUNE_DEATH] > 0) - { - for (uint32 i = 0; i < MAX_RUNES; ++i) - { - RuneType rune = player->GetCurrentRune(i); - RuneType baseRune = player->GetBaseRune(i); - if (!player->GetRuneCooldown(i) && rune == RUNE_DEATH && runeCost[baseRune] > 0) - { - player->SetRuneCooldown(i, didHit ? player->GetRuneBaseCooldown(i) : uint32(RUNE_MISS_COOLDOWN), true); - player->SetLastUsedRune(rune); - runeCost[baseRune]--; - runeCost[rune]--; - - // keep Death Rune type if missed - if (didHit && !convertUsedRunes) - player->RestoreBaseRune(i); - - if (runeCost[RUNE_DEATH] == 0) - break; - } - } - } - - // Grab any Death rune - if (runeCost[RUNE_DEATH] > 0) - { - for (uint32 i = 0; i < MAX_RUNES; ++i) - { - RuneType rune = player->GetCurrentRune(i); - if (!player->GetRuneCooldown(i) && rune == RUNE_DEATH) - { - player->SetRuneCooldown(i, didHit ? player->GetRuneBaseCooldown(i) : uint32(RUNE_MISS_COOLDOWN), true); - player->SetLastUsedRune(rune); - runeCost[rune]--; - - // keep Death Rune type if missed - if (didHit && !convertUsedRunes) - player->RestoreBaseRune(i); - - if (runeCost[RUNE_DEATH] == 0) - break; - } - } - } - - // you can gain some runic power when use runes - if (didHit) - if (int32 rp = int32(runeCostData->RunicPower * sWorld->getRate(RATE_POWER_RUNICPOWER_INCOME))) - player->ModifyPower(POWER_RUNIC_POWER, int32(rp)); } void Spell::TakeReagents() @@ -5952,7 +5856,7 @@ SpellCastResult Spell::CheckRange(bool strict) { // check needed by 68766 51693 - both spells are cast on enemies and have 0 max range // these are triggered by other spells - possibly we should omit range check in that case? - if (m_spellInfo->RangeEntry->ID == 1) + if (m_spellInfo->RangeIndex == 1) return SPELL_CAST_OK; range_type = m_spellInfo->RangeEntry->Flags; @@ -6025,7 +5929,7 @@ SpellCastResult Spell::CheckPower() //check rune cost only if a spell has PowerType == POWER_RUNES if (cost.Power == POWER_RUNES) { - SpellCastResult failReason = CheckRuneCost(m_spellInfo->RuneCostID); + SpellCastResult failReason = CheckRuneCost(); if (failReason != SPELL_CAST_OK) return failReason; } diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 192ed942ce0..2be8c001ae7 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -501,7 +501,7 @@ class TC_GAME_API Spell SpellCastResult CheckItems(); SpellCastResult CheckRange(bool strict); SpellCastResult CheckPower(); - SpellCastResult CheckRuneCost(uint32 runeCostID); + SpellCastResult CheckRuneCost(); SpellCastResult CheckCasterAuras() const; SpellCastResult CheckArenaAndRatedBattlegroundCastRules(); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index d605e1d8679..b174454225d 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1618,7 +1618,7 @@ void Spell::EffectEnergize(SpellEffIndex /*effIndex*/) if (level_diff > 0) damage -= level_multiplier * level_diff; - if (damage < 0 && power != POWER_ECLIPSE) + if (damage < 0 && power != POWER_LUNAR_POWER) return; m_caster->EnergizeBySpell(unitTarget, m_spellInfo->Id, damage, power); @@ -2435,7 +2435,7 @@ void Spell::EffectLearnSkill(SpellEffIndex /*effIndex*/) return; uint32 skillid = effectInfo->MiscValue; - SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(skillid, unitTarget->getRace(), unitTarget->getClass()); + SkillRaceClassInfoEntry const* rcEntry = sDB2Manager.GetSkillRaceClassInfo(skillid, unitTarget->getRace(), unitTarget->getClass()); if (!rcEntry) return; @@ -5192,52 +5192,24 @@ void Spell::EffectActivateRune(SpellEffIndex effIndex) m_runesState = m_caster->ToPlayer()->GetRunesState(); uint32 count = damage; - if (count == 0) count = 1; - for (uint32 j = 0; j < MAX_RUNES && count > 0; ++j) + if (count == 0) + count = 1; + + // first restore fully depleted runes + for (uint32 j = 0; j < player->GetMaxPower(POWER_RUNES) && count > 0; ++j) { - if (player->GetRuneCooldown(j) && player->GetCurrentRune(j) == RuneType(effectInfo->MiscValue)) + if (player->GetRuneCooldown(j) == player->GetRuneBaseCooldown()) { - if (m_spellInfo->Id == 45529) - if (player->GetBaseRune(j) != RuneType(effectInfo->MiscValueB)) - continue; player->SetRuneCooldown(j, 0); --count; } } - // Blood Tap - if (m_spellInfo->Id == 45529 && count > 0) - { - for (uint32 l = 0; l + 1 < MAX_RUNES && count > 0; ++l) - { - // Check if both runes are on cd as that is the only time when this needs to come into effect - if ((player->GetRuneCooldown(l) && player->GetCurrentRune(l) == RuneType(effectInfo->MiscValueB)) && (player->GetRuneCooldown(l + 1) && player->GetCurrentRune(l + 1) == RuneType(effectInfo->MiscValueB))) - { - // Should always update the rune with the lowest cd - if (l + 1 < MAX_RUNES && player->GetRuneCooldown(l) >= player->GetRuneCooldown(l+1)) - l++; - player->SetRuneCooldown(l, 0); - --count; - // is needed to push through to the client that the rune is active - player->ResyncRunes(MAX_RUNES); - } - else - break; - } - } - - // Empower rune weapon - if (m_spellInfo->Id == 47568) + // then the rest if we still got something left + for (uint32 j = 0; j < player->GetMaxPower(POWER_RUNES) && count > 0; ++j) { - // Need to do this just once - if (effIndex != 0) - return; - - for (uint32 i = 0; i < MAX_RUNES; ++i) - { - if (player->GetRuneCooldown(i) && (player->GetCurrentRune(i) == RUNE_FROST || player->GetCurrentRune(i) == RUNE_DEATH)) - player->SetRuneCooldown(i, 0); - } + player->SetRuneCooldown(j, 0); + --count; } } @@ -5435,7 +5407,7 @@ void Spell::EffectPlayMusic(SpellEffIndex /*effIndex*/) uint32 soundid = effectInfo->MiscValue; - if (!sSoundEntriesStore.LookupEntry(soundid)) + if (!sSoundKitStore.LookupEntry(soundid)) { TC_LOG_ERROR("spells", "EffectPlayMusic: Sound (Id: %u) does not exist in spell %u.", soundid, m_spellInfo->Id); return; @@ -5489,7 +5461,7 @@ void Spell::EffectPlaySound(SpellEffIndex /*effIndex*/) uint32 soundId = effectInfo->MiscValue; - if (!sSoundEntriesStore.LookupEntry(soundId)) + if (!sSoundKitStore.LookupEntry(soundId)) { TC_LOG_ERROR("spells", "EffectPlaySound: Sound (Id: %u) does not exist in spell %u.", soundId, m_spellInfo->Id); return; diff --git a/src/server/game/Spells/SpellHistory.cpp b/src/server/game/Spells/SpellHistory.cpp index 7de2c2a9d46..bb991b66cf9 100644 --- a/src/server/game/Spells/SpellHistory.cpp +++ b/src/server/game/Spells/SpellHistory.cpp @@ -237,7 +237,7 @@ void SpellHistory::HandleCooldowns(SpellInfo const* spellInfo, Item const* item, void SpellHistory::HandleCooldowns(SpellInfo const* spellInfo, uint32 itemID, Spell* spell /*= nullptr*/) { - if (ConsumeCharge(spellInfo->ChargeCategoryEntry)) + if (ConsumeCharge(spellInfo->ChargeCategoryId)) return; if (Player* player = _owner->ToPlayer()) @@ -268,7 +268,7 @@ bool SpellHistory::IsReady(SpellInfo const* spellInfo, uint32 itemId /*= 0*/, bo if (HasCooldown(spellInfo->Id, itemId, ignoreCategoryCooldown)) return false; - if (!HasCharge(spellInfo->ChargeCategoryEntry)) + if (!HasCharge(spellInfo->ChargeCategoryId)) return false; return true; @@ -696,16 +696,16 @@ bool SpellHistory::IsSchoolLocked(SpellSchoolMask schoolMask) const return false; } -bool SpellHistory::ConsumeCharge(SpellCategoryEntry const* chargeCategoryEntry) +bool SpellHistory::ConsumeCharge(uint32 chargeCategoryId) { - if (!chargeCategoryEntry) + if (!sSpellCategoryStore.LookupEntry(chargeCategoryId)) return false; - int32 chargeRecovery = GetChargeRecoveryTime(chargeCategoryEntry); - if (chargeRecovery > 0 && GetMaxCharges(chargeCategoryEntry) > 0) + int32 chargeRecovery = GetChargeRecoveryTime(chargeCategoryId); + if (chargeRecovery > 0 && GetMaxCharges(chargeCategoryId) > 0) { Clock::time_point recoveryStart; - std::deque<ChargeEntry>& charges = _categoryCharges[chargeCategoryEntry->ID]; + std::deque<ChargeEntry>& charges = _categoryCharges[chargeCategoryId]; if (charges.empty()) recoveryStart = Clock::now(); else @@ -718,12 +718,9 @@ bool SpellHistory::ConsumeCharge(SpellCategoryEntry const* chargeCategoryEntry) return false; } -void SpellHistory::RestoreCharge(SpellCategoryEntry const* chargeCategoryEntry) +void SpellHistory::RestoreCharge(uint32 chargeCategoryId) { - if (!chargeCategoryEntry) - return; - - auto itr = _categoryCharges.find(chargeCategoryEntry->ID); + auto itr = _categoryCharges.find(chargeCategoryId); if (itr != _categoryCharges.end() && !itr->second.empty()) { itr->second.pop_back(); @@ -731,7 +728,7 @@ void SpellHistory::RestoreCharge(SpellCategoryEntry const* chargeCategoryEntry) if (Player* player = GetPlayerOwner()) { WorldPackets::Spells::SetSpellCharges setSpellCharges; - setSpellCharges.Category = chargeCategoryEntry->ID; + setSpellCharges.Category = chargeCategoryId; if (!itr->second.empty()) setSpellCharges.NextRecoveryTime = uint32(std::chrono::duration_cast<std::chrono::milliseconds>(itr->second.front().RechargeEnd - Clock::now()).count()); setSpellCharges.ConsumedCharges = itr->second.size(); @@ -742,12 +739,9 @@ void SpellHistory::RestoreCharge(SpellCategoryEntry const* chargeCategoryEntry) } } -void SpellHistory::ResetCharges(SpellCategoryEntry const* chargeCategoryEntry) +void SpellHistory::ResetCharges(uint32 chargeCategoryId) { - if (!chargeCategoryEntry) - return; - - auto itr = _categoryCharges.find(chargeCategoryEntry->ID); + auto itr = _categoryCharges.find(chargeCategoryId); if (itr != _categoryCharges.end()) { _categoryCharges.erase(itr); @@ -756,7 +750,7 @@ void SpellHistory::ResetCharges(SpellCategoryEntry const* chargeCategoryEntry) { WorldPackets::Spells::ClearSpellCharges clearSpellCharges; clearSpellCharges.IsPet = _owner != player; - clearSpellCharges.Category = chargeCategoryEntry->ID; + clearSpellCharges.Category = chargeCategoryId; player->SendDirectMessage(clearSpellCharges.Write()); } } @@ -774,40 +768,42 @@ void SpellHistory::ResetAllCharges() } } -bool SpellHistory::HasCharge(SpellCategoryEntry const* chargeCategoryEntry) const +bool SpellHistory::HasCharge(uint32 chargeCategoryId) const { - if (!chargeCategoryEntry) + if (!sSpellCategoryStore.LookupEntry(chargeCategoryId)) return true; // Check if the spell is currently using charges (untalented warlock Dark Soul) - int32 maxCharges = GetMaxCharges(chargeCategoryEntry); + int32 maxCharges = GetMaxCharges(chargeCategoryId); if (maxCharges <= 0) return true; - auto itr = _categoryCharges.find(chargeCategoryEntry->ID); + auto itr = _categoryCharges.find(chargeCategoryId); return itr == _categoryCharges.end() || int32(itr->second.size()) < maxCharges; } -int32 SpellHistory::GetMaxCharges(SpellCategoryEntry const* chargeCategoryEntry) const +int32 SpellHistory::GetMaxCharges(uint32 chargeCategoryId) const { + SpellCategoryEntry const* chargeCategoryEntry = sSpellCategoryStore.LookupEntry(chargeCategoryId); if (!chargeCategoryEntry) return 0; uint32 charges = chargeCategoryEntry->MaxCharges; - charges += _owner->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_MAX_CHARGES, chargeCategoryEntry->ID); + charges += _owner->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_MAX_CHARGES, chargeCategoryId); return charges; } -int32 SpellHistory::GetChargeRecoveryTime(SpellCategoryEntry const* chargeCategoryEntry) const +int32 SpellHistory::GetChargeRecoveryTime(uint32 chargeCategoryId) const { + SpellCategoryEntry const* chargeCategoryEntry = sSpellCategoryStore.LookupEntry(chargeCategoryId); if (!chargeCategoryEntry) return 0; int32 recoveryTime = chargeCategoryEntry->ChargeRecoveryTime; - recoveryTime += _owner->GetTotalAuraModifierByMiscValue(SPELL_AURA_CHARGE_RECOVERY_MOD, chargeCategoryEntry->ID); + recoveryTime += _owner->GetTotalAuraModifierByMiscValue(SPELL_AURA_CHARGE_RECOVERY_MOD, chargeCategoryId); float recoveryTimeF = recoveryTime; - recoveryTimeF *= _owner->GetTotalAuraMultiplierByMiscValue(SPELL_AURA_CHARGE_RECOVERY_MULTIPLIER, chargeCategoryEntry->ID); + recoveryTimeF *= _owner->GetTotalAuraMultiplierByMiscValue(SPELL_AURA_CHARGE_RECOVERY_MULTIPLIER, chargeCategoryId); if (_owner->HasAuraType(SPELL_AURA_CHARGE_RECOVERY_AFFECTED_BY_HASTE)) recoveryTimeF *= _owner->GetFloatValue(UNIT_MOD_CAST_HASTE); diff --git a/src/server/game/Spells/SpellHistory.h b/src/server/game/Spells/SpellHistory.h index f2a3d346fdf..51b22c7e38a 100644 --- a/src/server/game/Spells/SpellHistory.h +++ b/src/server/game/Spells/SpellHistory.h @@ -132,13 +132,13 @@ public: bool IsSchoolLocked(SpellSchoolMask schoolMask) const; // Charges - bool ConsumeCharge(SpellCategoryEntry const* chargeCategoryEntry); - void RestoreCharge(SpellCategoryEntry const* chargeCategoryEntry); - void ResetCharges(SpellCategoryEntry const* chargeCategoryEntry); + bool ConsumeCharge(uint32 chargeCategoryId); + void RestoreCharge(uint32 chargeCategoryId); + void ResetCharges(uint32 chargeCategoryId); void ResetAllCharges(); - bool HasCharge(SpellCategoryEntry const* chargeCategoryEntry) const; - int32 GetMaxCharges(SpellCategoryEntry const* chargeCategoryEntry) const; - int32 GetChargeRecoveryTime(SpellCategoryEntry const* chargeCategoryEntry) const; + bool HasCharge(uint32 chargeCategoryId) const; + int32 GetMaxCharges(uint32 chargeCategoryId) const; + int32 GetChargeRecoveryTime(uint32 chargeCategoryId) const; // Global cooldown bool HasGlobalCooldown(SpellInfo const* spellInfo) const; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 28ac49fde1f..5b820f02c02 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -360,7 +360,7 @@ SpellImplicitTargetInfo::StaticData SpellImplicitTargetInfo::_data[TOTAL_SPELL_ {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 147 }; -SpellEffectInfo::SpellEffectInfo(SpellEntry const* /*spellEntry*/, SpellInfo const* spellInfo, uint8 effIndex, SpellEffectEntry const* _effect) +SpellEffectInfo::SpellEffectInfo(SpellEffectScalingEntry const* spellEffectScaling, SpellInfo const* spellInfo, uint8 effIndex, SpellEffectEntry const* _effect) { _spellInfo = spellInfo; EffectIndex = _effect ? _effect->EffectIndex : effIndex; @@ -389,12 +389,9 @@ SpellEffectInfo::SpellEffectInfo(SpellEntry const* /*spellEntry*/, SpellInfo con BonusCoefficientFromAP = _effect ? _effect->BonusCoefficientFromAP : 0.0f; ImplicitTargetConditions = NULL; - uint32 _effectScalingId = _effect ? sSpellEffectScallingByEffectId.find(_effect->ID) != sSpellEffectScallingByEffectId.end() ? sSpellEffectScallingByEffectId[_effect->ID] : 0 : 0; - SpellEffectScalingEntry const* _effectScalingEntry = sSpellEffectScalingStore.LookupEntry(_effectScalingId); - - Scaling.Coefficient = _effectScalingEntry ? _effectScalingEntry->Coefficient : 0.0f; - Scaling.Variance = _effectScalingEntry ? _effectScalingEntry->Variance : 0.0f; - Scaling.ResourceCoefficient = _effectScalingEntry ? _effectScalingEntry->ResourceCoefficient : 0.0f; + Scaling.Coefficient = spellEffectScaling ? spellEffectScaling->Coefficient : 0.0f; + Scaling.Variance = spellEffectScaling ? spellEffectScaling->Variance : 0.0f; + Scaling.ResourceCoefficient = spellEffectScaling ? spellEffectScaling->ResourceCoefficient : 0.0f; } bool SpellEffectInfo::IsEffect() const @@ -468,7 +465,7 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster /*= nullptr*/, int32 const* else if (caster) level = caster->getLevel(); - if (!_spellInfo->HasAttribute(SPELL_ATTR11_SCALES_WITH_ITEM_LEVEL) && _spellInfo->HasAttribute(SPELL_ATTR10_UNK12)) + if (!_spellInfo->HasAttribute(SPELL_ATTR11_SCALES_WITH_ITEM_LEVEL) && _spellInfo->HasAttribute(SPELL_ATTR10_USE_SPELL_BASE_LEVEL_FOR_SCALING)) level = _spellInfo->BaseLevel; if (_spellInfo->Scaling.MaxScalingLevel && _spellInfo->Scaling.MaxScalingLevel < level) @@ -492,12 +489,6 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster /*= nullptr*/, int32 const* } else value = GetRandomPropertyPoints(_spellInfo->Scaling.ScalesFromItemLevel, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0); - - if (level < _spellInfo->Scaling.CastTimeMaxLevel && _spellInfo->Scaling.CastTimeMax) - value *= float(_spellInfo->Scaling.CastTimeMin + (level - 1) * (_spellInfo->Scaling.CastTimeMax - _spellInfo->Scaling.CastTimeMin) / (_spellInfo->Scaling.CastTimeMaxLevel - 1)) / float(_spellInfo->Scaling.CastTimeMax); - - if (level < _spellInfo->Scaling.NerfMaxLevel) - value *= ((((1.0f - _spellInfo->Scaling.NerfFactor) * (level - 1)) / (_spellInfo->Scaling.NerfMaxLevel - 1)) + _spellInfo->Scaling.NerfFactor); } value *= Scaling.Coefficient; @@ -976,10 +967,11 @@ SpellEffectInfo::StaticData SpellEffectInfo::_data[TOTAL_SPELL_EFFECTS] = {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 251 SPELL_EFFECT_SET_GARRISON_CACHE_SIZE }; -SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& effectsMap, SpellVisualMap&& visuals) +SpellInfo::SpellInfo(SpellInfoLoadHelper const& data, SpellEffectEntryMap const& effectsMap, SpellVisualMap&& visuals, + std::unordered_map<uint32, SpellEffectScalingEntry const*> const& effectScaling) : _hasPowerDifficultyData(false) { - Id = spellEntry->ID; + Id = data.Entry->ID; // SpellDifficultyEntry for (SpellEffectEntryMap::value_type const& itr : effectsMap) @@ -990,31 +982,17 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef for (size_t i = 0; i < effects.size(); ++i) { if (SpellEffectEntry const* effect = effects[i]) - _effects[itr.first][effect->EffectIndex] = new SpellEffectInfo(spellEntry, this, effect->EffectIndex, effect); + { + auto scalingItr = effectScaling.find(effect->ID); + _effects[itr.first][effect->EffectIndex] = new SpellEffectInfo(scalingItr != effectScaling.end() ? scalingItr->second : nullptr, this, effect->EffectIndex, effect); + } } } - SpellName = spellEntry->Name_lang; - RuneCostID = spellEntry->RuneCostID; - SpellDifficultyId = 0; - SpellScalingId = spellEntry->ScalingID; - SpellAuraOptionsId = spellEntry->AuraOptionsID; - SpellAuraRestrictionsId = spellEntry->AuraRestrictionsID; - SpellCastingRequirementsId = spellEntry->CastingRequirementsID; - SpellCategoriesId = spellEntry->CategoriesID; - SpellClassOptionsId = spellEntry->ClassOptionsID; - SpellCooldownsId = spellEntry->CooldownsID; - SpellEquippedItemsId = spellEntry->EquippedItemsID; - SpellInterruptsId = spellEntry->InterruptsID; - SpellLevelsId = spellEntry->LevelsID; - SpellReagentsId = spellEntry->ReagentsID; - SpellShapeshiftId = spellEntry->ShapeshiftID; - SpellTargetRestrictionsId = spellEntry->TargetRestrictionsID; - SpellTotemsId = spellEntry->TotemsID; - SpellMiscId = spellEntry->MiscID; + SpellName = data.Entry->Name; // SpellMiscEntry - SpellMiscEntry const* _misc = GetSpellMisc(); + SpellMiscEntry const* _misc = data.Misc; Attributes = _misc ? _misc->Attributes : 0; AttributesEx = _misc ? _misc->AttributesEx : 0; AttributesEx2 = _misc ? _misc->AttributesExB : 0; @@ -1031,6 +1009,7 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef AttributesEx13 = _misc ? _misc->AttributesExM : 0; CastTimeEntry = _misc ? (_misc->CastingTimeIndex ? sSpellCastTimesStore.LookupEntry(_misc->CastingTimeIndex) : NULL) : NULL; DurationEntry = _misc ? (_misc->DurationIndex ? sSpellDurationStore.LookupEntry(_misc->DurationIndex) : NULL) : NULL; + RangeIndex = _misc ? _misc->RangeIndex : 0; RangeEntry = _misc ? (_misc->RangeIndex ? sSpellRangeStore.LookupEntry(_misc->RangeIndex) : NULL) : NULL; Speed = _misc ? _misc->Speed : 0; SchoolMask = _misc ? _misc->SchoolMask : 0; @@ -1041,18 +1020,13 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef _visuals = std::move(visuals); // SpellScalingEntry - SpellScalingEntry const* _scaling = GetSpellScaling(); - Scaling.CastTimeMin = _scaling ? _scaling->CastTimeMin : 0; - Scaling.CastTimeMax = _scaling ?_scaling->CastTimeMax : 0; - Scaling.CastTimeMaxLevel = _scaling ? _scaling->CastTimeMaxLevel : 0; + SpellScalingEntry const* _scaling = data.Scaling; Scaling.Class = _scaling ? _scaling->ScalingClass : 0; - Scaling.NerfFactor = _scaling ? _scaling->NerfFactor : 0; - Scaling.NerfMaxLevel = _scaling ? _scaling->NerfMaxLevel : 0; Scaling.MaxScalingLevel = _scaling ? _scaling->MaxScalingLevel : 0; Scaling.ScalesFromItemLevel = _scaling ? _scaling->ScalesFromItemLevel : 0; // SpellAuraOptionsEntry - SpellAuraOptionsEntry const* _options = GetSpellAuraOptions(); + SpellAuraOptionsEntry const* _options = data.AuraOptions; SpellProcsPerMinuteEntry const* _ppm = _options ? sSpellProcsPerMinuteStore.LookupEntry(_options->SpellProcsPerMinuteID) : nullptr; ProcFlags = _options ? _options->ProcTypeMask : 0; ProcChance = _options ? _options->ProcChance : 0; @@ -1064,7 +1038,7 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef StackAmount = _options ? _options->CumulativeAura : 0; // SpellAuraRestrictionsEntry - SpellAuraRestrictionsEntry const* _aura = GetSpellAuraRestrictions(); + SpellAuraRestrictionsEntry const* _aura = data.AuraRestrictions; CasterAuraState = _aura ? _aura->CasterAuraState : 0; TargetAuraState = _aura ? _aura->TargetAuraState : 0; ExcludeCasterAuraState = _aura ? _aura->ExcludeCasterAuraState : 0; @@ -1075,47 +1049,47 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef ExcludeTargetAuraSpell = _aura ? _aura->ExcludeTargetAuraSpell : 0; // SpellCastingRequirementsEntry - SpellCastingRequirementsEntry const* _castreq = GetSpellCastingRequirements(); + SpellCastingRequirementsEntry const* _castreq = data.CastingRequirements; RequiresSpellFocus = _castreq ? _castreq->RequiresSpellFocus : 0; FacingCasterFlags = _castreq ? _castreq->FacingCasterFlags : 0; RequiredAreasID = _castreq ? _castreq->RequiredAreasID : -1; // SpellCategoriesEntry - SpellCategoriesEntry const* _categorie = GetSpellCategories(); - CategoryEntry = _categorie ? sSpellCategoryStore.LookupEntry(_categorie->Category) : NULL; + SpellCategoriesEntry const* _categorie = data.Categories; + CategoryId = _categorie ? _categorie->Category : 0; Dispel = _categorie ? _categorie->DispelType : 0; Mechanic = _categorie ? _categorie->Mechanic : 0; StartRecoveryCategory = _categorie ? _categorie->StartRecoveryCategory : 0; DmgClass = _categorie ? _categorie->DefenseType : 0; PreventionType = _categorie ? _categorie->PreventionType : 0; - ChargeCategoryEntry = _categorie ? sSpellCategoryStore.LookupEntry(_categorie->ChargeCategory) : 0; + ChargeCategoryId = _categorie ? _categorie->ChargeCategory : 0; // SpellClassOptionsEntry - SpellClassOptionsEntry const* _class = GetSpellClassOptions(); + SpellClassOptionsEntry const* _class = data.ClassOptions; SpellFamilyName = _class ? _class->SpellClassSet : 0; SpellFamilyFlags = _class ? _class->SpellClassMask : flag128(); // SpellCooldownsEntry - SpellCooldownsEntry const* _cooldowns = GetSpellCooldowns(); + SpellCooldownsEntry const* _cooldowns = data.Cooldowns; RecoveryTime = _cooldowns ? _cooldowns->RecoveryTime : 0; CategoryRecoveryTime = _cooldowns ? _cooldowns->CategoryRecoveryTime : 0; StartRecoveryTime = _cooldowns ? _cooldowns->StartRecoveryTime : 0; // SpellEquippedItemsEntry - SpellEquippedItemsEntry const* _equipped = GetSpellEquippedItems(); + SpellEquippedItemsEntry const* _equipped = data.EquippedItems; EquippedItemClass = _equipped ? _equipped->EquippedItemClass : -1; EquippedItemSubClassMask = _equipped ?_equipped->EquippedItemSubClassMask : -1; EquippedItemInventoryTypeMask = _equipped ? _equipped->EquippedItemInventoryTypeMask : -1; // SpellInterruptsEntry - SpellInterruptsEntry const* _interrupt = GetSpellInterrupts(); + SpellInterruptsEntry const* _interrupt = data.Interrupts; InterruptFlags = _interrupt ? _interrupt->InterruptFlags : 0; // TODO: 6.x these flags have 2 parts AuraInterruptFlags = _interrupt ? _interrupt->AuraInterruptFlags[0] : 0; ChannelInterruptFlags = _interrupt ? _interrupt->ChannelInterruptFlags[0] : 0; // SpellLevelsEntry - SpellLevelsEntry const* _levels = GetSpellLevels(); + SpellLevelsEntry const* _levels = data.Levels; MaxLevel = _levels ? _levels->MaxLevel : 0; BaseLevel = _levels ? _levels->BaseLevel : 0; SpellLevel = _levels ? _levels->SpellLevel : 0; @@ -1124,26 +1098,26 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef PowerCosts = sDB2Manager.GetSpellPowers(Id, DIFFICULTY_NONE, &_hasPowerDifficultyData); // SpellReagentsEntry - SpellReagentsEntry const* _reagents = GetSpellReagents(); + SpellReagentsEntry const* _reagents = data.Reagents; for (uint8 i = 0; i < MAX_SPELL_REAGENTS; ++i) Reagent[i] = _reagents ? _reagents->Reagent[i] : 0; for (uint8 i = 0; i < MAX_SPELL_REAGENTS; ++i) ReagentCount[i] = _reagents ? _reagents->ReagentCount[i] : 0; // SpellShapeshiftEntry - SpellShapeshiftEntry const* _shapeshift = GetSpellShapeshift(); + SpellShapeshiftEntry const* _shapeshift = data.Shapeshift; Stances = _shapeshift ? MAKE_PAIR64(_shapeshift->ShapeshiftMask[0], _shapeshift->ShapeshiftMask[1]) : 0; StancesNot = _shapeshift ? MAKE_PAIR64(_shapeshift->ShapeshiftExclude[0], _shapeshift->ShapeshiftExclude[1]) : 0; // SpellTargetRestrictionsEntry - SpellTargetRestrictionsEntry const* _target = GetSpellTargetRestrictions(); + SpellTargetRestrictionsEntry const* _target = data.TargetRestrictions; Targets = _target ? _target->Targets : 0; TargetCreatureType = _target ? _target->TargetCreatureType : 0; MaxAffectedTargets = _target ? _target->MaxAffectedTargets : 0; MaxTargetLevel = _target ? _target->MaxTargetLevel : 0; // SpellTotemsEntry - SpellTotemsEntry const* _totem = GetSpellTotems(); + SpellTotemsEntry const* _totem = data.Totems; for (uint8 i = 0; i < 2; ++i) TotemCategory[i] = _totem ? _totem->RequiredTotemCategoryID[i] : 0; for (uint8 i = 0; i < 2; ++i) @@ -1169,7 +1143,7 @@ void SpellInfo::_UnloadSpellEffects() uint32 SpellInfo::GetCategory() const { - return CategoryEntry ? CategoryEntry->ID : 0; + return CategoryId; } bool SpellInfo::HasEffect(uint32 difficulty, SpellEffectName effect) const @@ -1475,7 +1449,11 @@ bool SpellInfo::IsStackableOnOneSlotWithDifferentCasters() const bool SpellInfo::IsCooldownStartedOnEvent() const { - return Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE || (CategoryEntry && CategoryEntry->Flags & SPELL_CATEGORY_FLAG_COOLDOWN_STARTS_ON_EVENT); + if (Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE) + return true; + + SpellCategoryEntry const* category = sSpellCategoryStore.LookupEntry(CategoryId); + return category && category->Flags & SPELL_CATEGORY_FLAG_COOLDOWN_STARTS_ON_EVENT; } bool SpellInfo::IsDeathPersistent() const @@ -2505,33 +2483,43 @@ int32 SpellInfo::GetDuration() const { if (!DurationEntry) return 0; - return (DurationEntry->Duration[0] == -1) ? -1 : abs(DurationEntry->Duration[0]); + return (DurationEntry->Duration == -1) ? -1 : abs(DurationEntry->Duration); } int32 SpellInfo::GetMaxDuration() const { if (!DurationEntry) return 0; - return (DurationEntry->Duration[2] == -1) ? -1 : abs(DurationEntry->Duration[2]); + return (DurationEntry->MaxDuration == -1) ? -1 : abs(DurationEntry->MaxDuration); } uint32 SpellInfo::CalcCastTime(uint8 level, Spell* spell /*= NULL*/) const { int32 castTime = 0; - if (!level && spell) - level = spell->GetCaster()->getLevel(); - - // not all spells have cast time index and this is all is pasiive abilities - if (level && Scaling.CastTimeMax > 0) + if (CastTimeEntry) { - castTime = Scaling.CastTimeMax; - if (Scaling.CastTimeMaxLevel > level) - castTime = Scaling.CastTimeMin + int32(level - 1) * (Scaling.CastTimeMax - Scaling.CastTimeMin) / (Scaling.CastTimeMaxLevel - 1); + int32 calcLevel = spell ? spell->GetCaster()->getLevel() : 0; + if (MaxLevel && uint32(calcLevel) > MaxLevel) + calcLevel = MaxLevel; + + if (HasAttribute(SPELL_ATTR13_UNK17)) + calcLevel *= 5; + + if (MaxLevel && uint32(calcLevel) > MaxLevel) + calcLevel = MaxLevel; + + if (BaseLevel) + calcLevel -= BaseLevel; + + if (calcLevel < 0) + calcLevel = 0; + + castTime = CastTimeEntry->CastTime + CastTimeEntry->CastTimePerLevel * level; + if (castTime < CastTimeEntry->MinCastTime) + castTime = CastTimeEntry->MinCastTime; } - else if (CastTimeEntry) - castTime = CastTimeEntry->CastTime; - if (!castTime) + if (castTime <= 0) return 0; if (spell) @@ -3344,81 +3332,6 @@ bool SpellInfo::_IsPositiveTarget(uint32 targetA, uint32 targetB) return true; } -SpellTargetRestrictionsEntry const* SpellInfo::GetSpellTargetRestrictions() const -{ - return SpellTargetRestrictionsId ? sSpellTargetRestrictionsStore.LookupEntry(SpellTargetRestrictionsId) : NULL; -} - -SpellEquippedItemsEntry const* SpellInfo::GetSpellEquippedItems() const -{ - return SpellEquippedItemsId ? sSpellEquippedItemsStore.LookupEntry(SpellEquippedItemsId) : NULL; -} - -SpellInterruptsEntry const* SpellInfo::GetSpellInterrupts() const -{ - return SpellInterruptsId ? sSpellInterruptsStore.LookupEntry(SpellInterruptsId) : NULL; -} - -SpellLevelsEntry const* SpellInfo::GetSpellLevels() const -{ - return SpellLevelsId ? sSpellLevelsStore.LookupEntry(SpellLevelsId) : NULL; -} - -SpellReagentsEntry const* SpellInfo::GetSpellReagents() const -{ - return SpellReagentsId ? sSpellReagentsStore.LookupEntry(SpellReagentsId) : NULL; -} - -SpellScalingEntry const* SpellInfo::GetSpellScaling() const -{ - return SpellScalingId ? sSpellScalingStore.LookupEntry(SpellScalingId) : NULL; -} - -SpellShapeshiftEntry const* SpellInfo::GetSpellShapeshift() const -{ - return SpellShapeshiftId ? sSpellShapeshiftStore.LookupEntry(SpellShapeshiftId) : NULL; -} - -SpellTotemsEntry const* SpellInfo::GetSpellTotems() const -{ - return SpellTotemsId ? sSpellTotemsStore.LookupEntry(SpellTotemsId) : NULL; -} - -SpellMiscEntry const* SpellInfo::GetSpellMisc() const -{ - return SpellMiscId ? sSpellMiscStore.LookupEntry(SpellMiscId) : NULL; -} - -SpellAuraOptionsEntry const* SpellInfo::GetSpellAuraOptions() const -{ - return SpellAuraOptionsId ? sSpellAuraOptionsStore.LookupEntry(SpellAuraOptionsId) : NULL; -} - -SpellAuraRestrictionsEntry const* SpellInfo::GetSpellAuraRestrictions() const -{ - return SpellAuraRestrictionsId ? sSpellAuraRestrictionsStore.LookupEntry(SpellAuraRestrictionsId) : NULL; -} - -SpellCastingRequirementsEntry const* SpellInfo::GetSpellCastingRequirements() const -{ - return SpellCastingRequirementsId ? sSpellCastingRequirementsStore.LookupEntry(SpellCastingRequirementsId) : NULL; -} - -SpellCategoriesEntry const* SpellInfo::GetSpellCategories() const -{ - return SpellCategoriesId ? sSpellCategoriesStore.LookupEntry(SpellCategoriesId) : NULL; -} - -SpellClassOptionsEntry const* SpellInfo::GetSpellClassOptions() const -{ - return SpellClassOptionsId ? sSpellClassOptionsStore.LookupEntry(SpellClassOptionsId) : NULL; -} - -SpellCooldownsEntry const* SpellInfo::GetSpellCooldowns() const -{ - return SpellCooldownsId ? sSpellCooldownsStore.LookupEntry(SpellCooldownsId) : NULL; -} - void SpellInfo::_UnloadImplicitTargetConditionLists() { // find the same instances of ConditionList and delete them. diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index 4faf98a0791..764760ddffa 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -277,7 +277,7 @@ public: RealPointsPerLevel(0), BasePoints(0), PointsPerResource(0), Amplitude(0), ChainAmplitude(0), BonusCoefficient(0), MiscValue(0), MiscValueB(0), Mechanic(MECHANIC_NONE), PositionFacing(0), RadiusEntry(NULL), ChainTargets(0), ItemType(0), TriggerSpell(0), BonusCoefficientFromAP(0.0f), ImplicitTargetConditions(NULL) { } - SpellEffectInfo(SpellEntry const* spellEntry, SpellInfo const* spellInfo, uint8 effIndex, SpellEffectEntry const* effect); + SpellEffectInfo(SpellEffectScalingEntry const* spellEffectScaling, SpellInfo const* spellInfo, uint8 effIndex, SpellEffectEntry const* effect); bool IsEffect() const; bool IsEffect(SpellEffectName effectName) const; @@ -324,11 +324,13 @@ typedef std::unordered_map<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 +381,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 +395,7 @@ public: uint32 SpellVisual[2]; uint32 SpellIconID; uint32 ActiveIconID; - char* SpellName; + LocalizedString const* SpellName; uint32 MaxTargetLevel; uint32 MaxAffectedTargets; uint32 SpellFamilyName; @@ -402,32 +404,11 @@ public: uint32 PreventionType; int32 RequiredAreasID; uint32 SchoolMask; - SpellCategoryEntry const* ChargeCategoryEntry; - uint32 SpellDifficultyId; - uint32 SpellScalingId; - uint32 SpellAuraOptionsId; - uint32 SpellAuraRestrictionsId; - uint32 SpellCastingRequirementsId; - uint32 SpellCategoriesId; - uint32 SpellClassOptionsId; - uint32 SpellCooldownsId; - uint32 SpellEquippedItemsId; - uint32 SpellInterruptsId; - uint32 SpellLevelsId; - uint32 SpellReagentsId; - uint32 SpellShapeshiftId; - uint32 SpellTargetRestrictionsId; - uint32 SpellTotemsId; - uint32 SpellMiscId; + uint32 ChargeCategoryId; // SpellScalingEntry struct ScalingInfo { - int32 CastTimeMin; - int32 CastTimeMax; - uint32 CastTimeMaxLevel; int32 Class; - float NerfFactor; - uint32 NerfMaxLevel; uint32 MaxScalingLevel; uint32 ScalesFromItemLevel; } Scaling; @@ -435,24 +416,8 @@ public: uint32 ExplicitTargetMask; SpellChainNode const* ChainEntry; - // struct access functions - SpellTargetRestrictionsEntry const* GetSpellTargetRestrictions() const; - SpellAuraOptionsEntry const* GetSpellAuraOptions() const; - SpellAuraRestrictionsEntry const* GetSpellAuraRestrictions() const; - SpellCastingRequirementsEntry const* GetSpellCastingRequirements() const; - SpellCategoriesEntry const* GetSpellCategories() const; - SpellClassOptionsEntry const* GetSpellClassOptions() const; - SpellCooldownsEntry const* GetSpellCooldowns() const; - SpellEquippedItemsEntry const* GetSpellEquippedItems() const; - SpellInterruptsEntry const* GetSpellInterrupts() const; - SpellLevelsEntry const* GetSpellLevels() const; - SpellReagentsEntry const* GetSpellReagents() const; - SpellScalingEntry const* GetSpellScaling() const; - SpellShapeshiftEntry const* GetSpellShapeshift() const; - SpellTotemsEntry const* GetSpellTotems() const; - SpellMiscEntry const* GetSpellMisc() const; - - SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& effectsMap, SpellVisualMap&& visuals); + SpellInfo(SpellInfoLoadHelper const& data, SpellEffectEntryMap const& effectsMap, SpellVisualMap&& visuals, + std::unordered_map<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..d5f3c0c5d77 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2690,9 +2690,11 @@ void SpellMgr::LoadSpellInfoStore() UnloadSpellInfoStore(); mSpellInfoMap.resize(sSpellStore.GetNumRows(), NULL); + std::unordered_map<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) { @@ -2709,12 +2711,70 @@ void SpellMgr::LoadSpellInfoStore() effectsForDifficulty[effect->EffectIndex] = effect; } + for (SpellAuraOptionsEntry const* auraOptions : sSpellAuraOptionsStore) + if (!auraOptions->DifficultyID) // TODO: implement + loadData[auraOptions->SpellID].AuraOptions = auraOptions; + + for (SpellAuraRestrictionsEntry const* auraRestrictions : sSpellAuraRestrictionsStore) + if (!auraRestrictions->DifficultyID) // TODO: implement + loadData[auraRestrictions->SpellID].AuraRestrictions = auraRestrictions; + + for (SpellCastingRequirementsEntry const* castingRequirements : sSpellCastingRequirementsStore) + loadData[castingRequirements->SpellID].CastingRequirements = castingRequirements; + + for (SpellCategoriesEntry const* categories : sSpellCategoriesStore) + if (!categories->DifficultyID) // TODO: implement + loadData[categories->SpellID].Categories = categories; + + for (SpellClassOptionsEntry const* classOptions : sSpellClassOptionsStore) + loadData[classOptions->SpellID].ClassOptions = classOptions; + + for (SpellCooldownsEntry const* cooldowns : sSpellCooldownsStore) + if (!cooldowns->DifficultyID) // TODO: implement + loadData[cooldowns->SpellID].Cooldowns = cooldowns; + + for (SpellEffectScalingEntry const* spellEffectScaling : sSpellEffectScalingStore) + spellEffectScallingByEffectId[spellEffectScaling->SpellEffectID] = spellEffectScaling; + + for (SpellEquippedItemsEntry const* equippedItems : sSpellEquippedItemsStore) + loadData[equippedItems->SpellID].EquippedItems = equippedItems; + + for (SpellInterruptsEntry const* interrupts : sSpellInterruptsStore) + if (!interrupts->DifficultyID) // TODO: implement + loadData[interrupts->SpellID].Interrupts = interrupts; + + for (SpellLevelsEntry const* levels : sSpellLevelsStore) + if (!levels->DifficultyID) // TODO: implement + loadData[levels->SpellID].Levels = levels; + + for (SpellReagentsEntry const* reagents : sSpellReagentsStore) + loadData[reagents->SpellID].Reagents = reagents; + + for (SpellScalingEntry const* scaling : sSpellScalingStore) + loadData[scaling->SpellID].Scaling = scaling; + + for (SpellShapeshiftEntry const* shapeshift : sSpellShapeshiftStore) + loadData[shapeshift->SpellID].Shapeshift = shapeshift; + + for (SpellTargetRestrictionsEntry const* targetRestrictions : sSpellTargetRestrictionsStore) + if (!targetRestrictions->DifficultyID) // TODO: implement + loadData[targetRestrictions->SpellID].TargetRestrictions = targetRestrictions; + + for (SpellTotemsEntry const* totems : sSpellTotemsStore) + loadData[totems->SpellID].Totems = totems; + for (SpellXSpellVisualEntry const* visual : sSpellXSpellVisualStore) visualsBySpell[visual->SpellID][visual->DifficultyID].push_back(visual); for (uint32 i = 0; i < sSpellStore.GetNumRows(); ++i) + { if (SpellEntry const* spellEntry = sSpellStore.LookupEntry(i)) - mSpellInfoMap[i] = new SpellInfo(spellEntry, effectsBySpell[i], std::move(visualsBySpell[i])); + { + loadData[i].Entry = spellEntry; + loadData[i].Misc = sSpellMiscStore.LookupEntry(spellEntry->MiscID); + mSpellInfoMap[i] = new SpellInfo(loadData[i], effectsBySpell[i], std::move(visualsBySpell[i]), spellEffectScallingByEffectId); + } + } TC_LOG_INFO("server.loading", ">> Loaded SpellInfo store in %u ms", GetMSTimeDiffToNow(oldMSTime)); } @@ -3115,12 +3175,6 @@ void SpellMgr::LoadSpellInfoCorrections() case 6474: // Earthbind Totem (instant pulse) spellInfo->AttributesEx5 |= SPELL_ATTR5_START_PERIODIC_AT_APPLY; break; - case 5176: // Wrath - case 2912: // Starfire - //case 78674: // Starsurge 6.x effect 1 is no more - const_cast<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 +3521,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 +3536,8 @@ void SpellMgr::LoadPetFamilySpellsStore() if (!spellInfo) continue; - SpellLevelsEntry const* levels = sSpellLevelsStore.LookupEntry(spellInfo->LevelsID); - if (spellInfo->LevelsID && (!levels || levels->SpellLevel)) + auto levels = levelsBySpell.find(skillLine->SpellID); + if (levels != levelsBySpell.end() && levels->second->SpellLevel) continue; if (SpellMiscEntry const* spellMisc = sSpellMiscStore.LookupEntry(spellInfo->MiscID)) diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index 79721235c17..e9488d8ecbb 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -597,6 +597,27 @@ TC_GAME_API int32 GetDiminishingReturnsLimitDuration(SpellInfo const* spellproto TC_GAME_API extern PetFamilySpellsStore sPetFamilySpellsStore; +struct SpellInfoLoadHelper +{ + SpellEntry const* Entry = nullptr; + + SpellAuraOptionsEntry const* AuraOptions = nullptr; + SpellAuraRestrictionsEntry const* AuraRestrictions = nullptr; + SpellCastingRequirementsEntry const* CastingRequirements = nullptr; + SpellCategoriesEntry const* Categories = nullptr; + SpellClassOptionsEntry const* ClassOptions = nullptr; + SpellCooldownsEntry const* Cooldowns = nullptr; + SpellEquippedItemsEntry const* EquippedItems = nullptr; + SpellInterruptsEntry const* Interrupts = nullptr; + SpellLevelsEntry const* Levels = nullptr; + SpellMiscEntry const* Misc = nullptr; + SpellReagentsEntry const* Reagents = nullptr; + SpellScalingEntry const* Scaling = nullptr; + SpellShapeshiftEntry const* Shapeshift = nullptr; + SpellTargetRestrictionsEntry const* TargetRestrictions = nullptr; + SpellTotemsEntry const* Totems = nullptr; +}; + class TC_GAME_API SpellMgr { // Constructors diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index f4bc3f7fcba..8aa1c1a4dc8 100644 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -121,7 +121,7 @@ void CreatureTextMgr::LoadCreatureTexts() if (temp.sound) { - if (!sSoundEntriesStore.LookupEntry(temp.sound)) + if (!sSoundKitStore.LookupEntry(temp.sound)) { TC_LOG_ERROR("sql.sql", "CreatureTextMgr: Entry %u, Group %u in table `creature_text` has Sound %u but sound does not exist.", temp.entry, temp.group, temp.sound); temp.sound = 0; diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index b2094df08ef..59eb97d1476 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -171,7 +171,7 @@ public: uint32 soundId = atoi((char*)args); - if (!sSoundEntriesStore.LookupEntry(soundId)) + if (!sSoundKitStore.LookupEntry(soundId)) { handler->PSendSysMessage(LANG_SOUND_NOT_EXIST, soundId); handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp index 16e94242021..5f31d7f806f 100644 --- a/src/server/scripts/Commands/cs_learn.cpp +++ b/src/server/scripts/Commands/cs_learn.cpp @@ -325,7 +325,7 @@ public: if ((skillInfo->CategoryID == SKILL_CATEGORY_PROFESSION || skillInfo->CategoryID == SKILL_CATEGORY_SECONDARY) && skillInfo->CanLink) // only prof. with recipes have { - HandleLearnSkillRecipesHelper(target, skillInfo->ID); + HandleLearnSkillRecipesHelper(target, i); } } @@ -358,7 +358,7 @@ public: std::string name; - SkillLineEntry const* targetSkillInfo = NULL; + uint32 skillId = 0; for (uint32 i = 1; i < sSkillLineStore.GetNumRows(); ++i) { SkillLineEntry const* skillInfo = sSkillLineStore.LookupEntry(i); @@ -370,23 +370,42 @@ public: !skillInfo->CanLink) // only prof with recipes have set continue; - name = skillInfo->DisplayName_lang; + int locale = handler->GetSessionDbcLocale(); + name = skillInfo->DisplayName->Str[locale]; if (name.empty()) continue; if (!Utf8FitTo(name, namePart)) - continue; + { + locale = 0; + for (; locale < TOTAL_LOCALES; ++locale) + { + if (locale == handler->GetSessionDbcLocale()) + continue; - targetSkillInfo = skillInfo; + name = skillInfo->DisplayName->Str[locale]; + if (name.empty()) + continue; + + if (Utf8FitTo(name, namePart)) + break; + } + } + + if (locale < TOTAL_LOCALES) + { + skillId = i; + break; + } } - if (!targetSkillInfo) + if (!skillId) return false; - HandleLearnSkillRecipesHelper(target, targetSkillInfo->ID); + HandleLearnSkillRecipesHelper(target, skillId); - uint16 maxLevel = target->GetPureMaxSkillValue(targetSkillInfo->ID); - target->SetSkill(targetSkillInfo->ID, target->GetSkillStep(targetSkillInfo->ID), maxLevel, maxLevel); + uint16 maxLevel = target->GetPureMaxSkillValue(skillId); + target->SetSkill(skillId, target->GetSkillStep(skillId), maxLevel, maxLevel); handler->PSendSysMessage(LANG_COMMAND_LEARN_ALL_RECIPES, name.c_str()); return true; } diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp index 67c89a2f10c..b66fc95c407 100644 --- a/src/server/scripts/Commands/cs_list.cpp +++ b/src/server/scripts/Commands/cs_list.cpp @@ -436,7 +436,7 @@ public: AuraApplication const* aurApp = itr->second; Aura const* aura = aurApp->GetBase(); - char const* name = aura->GetSpellInfo()->SpellName; + char const* name = aura->GetSpellInfo()->SpellName->Str[handler->GetSessionDbcLocale()]; bool talent = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR0_CU_IS_TALENT); std::ostringstream ss_name; diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index 57bf557771b..b032aa8ef2e 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -688,41 +688,59 @@ public: SkillLineEntry const* skillInfo = sSkillLineStore.LookupEntry(id); if (skillInfo) { - std::string name = skillInfo->DisplayName_lang; + int locale = handler->GetSessionDbcLocale(); + std::string name = skillInfo->DisplayName->Str[locale]; if (name.empty()) continue; if (!Utf8FitTo(name, wNamePart)) - continue; - - if (maxResults && count++ == maxResults) { - handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); - return true; + locale = 0; + for (; locale < TOTAL_LOCALES; ++locale) + { + if (locale == handler->GetSessionDbcLocale()) + continue; + + name = skillInfo->DisplayName->Str[locale]; + if (name.empty()) + continue; + + if (Utf8FitTo(name, wNamePart)) + break; + } } - char valStr[50] = ""; - char const* knownStr = ""; - if (target && target->HasSkill(id)) + if (locale < TOTAL_LOCALES) { - knownStr = handler->GetTrinityString(LANG_KNOWN); - uint32 curValue = target->GetPureSkillValue(id); - uint32 maxValue = target->GetPureMaxSkillValue(id); - uint32 permValue = target->GetSkillPermBonusValue(id); - uint32 tempValue = target->GetSkillTempBonusValue(id); - - char const* valFormat = handler->GetTrinityString(LANG_SKILL_VALUES); - snprintf(valStr, 50, valFormat, curValue, maxValue, permValue, tempValue); - } + if (maxResults && count++ == maxResults) + { + handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); + return true; + } - // send skill in "id - [namedlink locale]" format - if (handler->GetSession()) - handler->PSendSysMessage(LANG_SKILL_LIST_CHAT, id, id, name.c_str(), "", knownStr, valStr); - else - handler->PSendSysMessage(LANG_SKILL_LIST_CONSOLE, id, name.c_str(), "", knownStr, valStr); + char valStr[50] = ""; + char const* knownStr = ""; + if (target && target->HasSkill(id)) + { + knownStr = handler->GetTrinityString(LANG_KNOWN); + uint32 curValue = target->GetPureSkillValue(id); + uint32 maxValue = target->GetPureMaxSkillValue(id); + uint32 permValue = target->GetSkillPermBonusValue(id); + uint32 tempValue = target->GetSkillTempBonusValue(id); + + char const* valFormat = handler->GetTrinityString(LANG_SKILL_VALUES); + snprintf(valStr, 50, valFormat, curValue, maxValue, permValue, tempValue); + } - if (!found) - found = true; + // send skill in "id - [namedlink locale]" format + if (handler->GetSession()) + handler->PSendSysMessage(LANG_SKILL_LIST_CHAT, id, id, name.c_str(), "", knownStr, valStr); + else + handler->PSendSysMessage(LANG_SKILL_LIST_CONSOLE, id, name.c_str(), "", knownStr, valStr); + + if (!found) + found = true; + } } } if (!found) @@ -758,63 +776,81 @@ public: SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(id); if (spellInfo) { - std::string name = spellInfo->SpellName; + int locale = handler->GetSessionDbcLocale(); + std::string name = spellInfo->SpellName->Str[locale]; if (name.empty()) continue; if (!Utf8FitTo(name, wNamePart)) - continue; - - if (maxResults && count++ == maxResults) { - handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); - return true; + locale = 0; + for (; locale < TOTAL_LOCALES; ++locale) + { + if (locale == handler->GetSessionDbcLocale()) + continue; + + name = spellInfo->SpellName->Str[locale]; + if (name.empty()) + continue; + + if (Utf8FitTo(name, wNamePart)) + break; + } } - bool known = target && target->HasSpell(id); + if (locale < TOTAL_LOCALES) + { + if (maxResults && count++ == maxResults) + { + handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults); + return true; + } - SpellEffectInfo const* effect = spellInfo->GetEffect(EFFECT_0); - bool learn = effect ? (effect->Effect == SPELL_EFFECT_LEARN_SPELL) : false; + bool known = target && target->HasSpell(id); - SpellInfo const* learnSpellInfo = effect ? sSpellMgr->GetSpellInfo(effect->TriggerSpell) : NULL; + SpellEffectInfo const* effect = spellInfo->GetEffect(EFFECT_0); + bool learn = effect ? (effect->Effect == SPELL_EFFECT_LEARN_SPELL) : false; - bool talent = spellInfo->HasAttribute(SPELL_ATTR0_CU_IS_TALENT); - bool passive = spellInfo->IsPassive(); - bool active = target && target->HasAura(id); + SpellInfo const* learnSpellInfo = effect ? sSpellMgr->GetSpellInfo(effect->TriggerSpell) : NULL; - // unit32 used to prevent interpreting uint8 as char at output - // find rank of learned spell for learning spell, or talent rank - uint32 rank = learn && learnSpellInfo ? learnSpellInfo->GetRank() : spellInfo->GetRank(); + bool talent = spellInfo->HasAttribute(SPELL_ATTR0_CU_IS_TALENT); + bool passive = spellInfo->IsPassive(); + bool active = target && target->HasAura(id); - // send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format - std::ostringstream ss; - if (handler->GetSession()) - ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name; - else - ss << id << " - " << name; + // unit32 used to prevent interpreting uint8 as char at output + // find rank of learned spell for learning spell, or talent rank + uint32 rank = learn && learnSpellInfo ? learnSpellInfo->GetRank() : spellInfo->GetRank(); - // include rank in link name - if (rank) - ss << handler->GetTrinityString(LANG_SPELL_RANK) << rank; + // send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format + std::ostringstream ss; + if (handler->GetSession()) + ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name; + else + ss << id << " - " << name; - if (handler->GetSession()) - ss << "]|h|r"; - - if (talent) - ss << handler->GetTrinityString(LANG_TALENT); - if (passive) - ss << handler->GetTrinityString(LANG_PASSIVE); - if (learn) - ss << handler->GetTrinityString(LANG_LEARN); - if (known) - ss << handler->GetTrinityString(LANG_KNOWN); - if (active) - ss << handler->GetTrinityString(LANG_ACTIVE); + // include rank in link name + if (rank) + ss << handler->GetTrinityString(LANG_SPELL_RANK) << rank; - handler->SendSysMessage(ss.str().c_str()); + if (handler->GetSession()) + ss << "]|h|r"; + + if (talent) + ss << handler->GetTrinityString(LANG_TALENT); + if (passive) + ss << handler->GetTrinityString(LANG_PASSIVE); + if (learn) + ss << handler->GetTrinityString(LANG_LEARN); + if (known) + ss << handler->GetTrinityString(LANG_KNOWN); + if (active) + ss << handler->GetTrinityString(LANG_ACTIVE); - if (!found) - found = true; + handler->SendSysMessage(ss.str().c_str()); + + if (!found) + found = true; + } } } if (!found) @@ -836,56 +872,56 @@ public: if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(id)) { int locale = handler->GetSessionDbcLocale(); - std::string name = spellInfo->SpellName; + std::string name = spellInfo->SpellName->Str[locale]; if (name.empty()) { handler->SendSysMessage(LANG_COMMAND_NOSPELLFOUND); return true; } - bool known = target && target->HasSpell(id); + bool known = target && target->HasSpell(id); - SpellEffectInfo const* effect = spellInfo->GetEffect(EFFECT_0); - bool learn = effect? (effect->Effect == SPELL_EFFECT_LEARN_SPELL) : false; + SpellEffectInfo const* effect = spellInfo->GetEffect(EFFECT_0); + bool learn = effect? (effect->Effect == SPELL_EFFECT_LEARN_SPELL) : false; - SpellInfo const* learnSpellInfo = effect ? sSpellMgr->GetSpellInfo(effect->TriggerSpell) : NULL; + SpellInfo const* learnSpellInfo = effect ? sSpellMgr->GetSpellInfo(effect->TriggerSpell) : NULL; - bool talent = spellInfo->HasAttribute(SPELL_ATTR0_CU_IS_TALENT); - bool passive = spellInfo->IsPassive(); - bool active = target && target->HasAura(id); + bool talent = spellInfo->HasAttribute(SPELL_ATTR0_CU_IS_TALENT); + bool passive = spellInfo->IsPassive(); + bool active = target && target->HasAura(id); - // unit32 used to prevent interpreting uint8 as char at output - // find rank of learned spell for learning spell, or talent rank - uint32 rank = learn && learnSpellInfo ? learnSpellInfo->GetRank() : spellInfo->GetRank(); + // unit32 used to prevent interpreting uint8 as char at output + // find rank of learned spell for learning spell, or talent rank + uint32 rank = learn && learnSpellInfo ? learnSpellInfo->GetRank() : spellInfo->GetRank(); - // send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format - std::ostringstream ss; - if (handler->GetSession()) - ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name; - else - ss << id << " - " << name; - - // include rank in link name - if (rank) - ss << handler->GetTrinityString(LANG_SPELL_RANK) << rank; + // send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format + std::ostringstream ss; + if (handler->GetSession()) + ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name; + else + ss << id << " - " << name; - if (handler->GetSession()) - ss << ' ' << localeNames[locale] << "]|h|r"; - else - ss << ' ' << localeNames[locale]; - - if (talent) - ss << handler->GetTrinityString(LANG_TALENT); - if (passive) - ss << handler->GetTrinityString(LANG_PASSIVE); - if (learn) - ss << handler->GetTrinityString(LANG_LEARN); - if (known) - ss << handler->GetTrinityString(LANG_KNOWN); - if (active) - ss << handler->GetTrinityString(LANG_ACTIVE); + // include rank in link name + if (rank) + ss << handler->GetTrinityString(LANG_SPELL_RANK) << rank; - handler->SendSysMessage(ss.str().c_str()); + if (handler->GetSession()) + ss << ' ' << localeNames[locale] << "]|h|r"; + else + ss << ' ' << localeNames[locale]; + + if (talent) + ss << handler->GetTrinityString(LANG_TALENT); + if (passive) + ss << handler->GetTrinityString(LANG_PASSIVE); + if (learn) + ss << handler->GetTrinityString(LANG_LEARN); + if (known) + ss << handler->GetTrinityString(LANG_KNOWN); + if (active) + ss << handler->GetTrinityString(LANG_ACTIVE); + + handler->SendSysMessage(ss.str().c_str()); } else handler->SendSysMessage(LANG_COMMAND_NOSPELLFOUND); diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 7ad80352995..e6fb42853e3 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -755,7 +755,7 @@ public: } target->GetSpellHistory()->ResetCooldown(spellIid, true); - target->GetSpellHistory()->ResetCharges(spellInfo->ChargeCategoryEntry); + target->GetSpellHistory()->ResetCharges(spellInfo->ChargeCategoryId); handler->PSendSysMessage(LANG_REMOVE_COOLDOWN, spellIid, target == handler->GetSession()->GetPlayer() ? handler->GetTrinityString(LANG_YOU) : nameLink.c_str()); } return true; @@ -1168,10 +1168,10 @@ public: if (itemNameStr && itemNameStr[0]) { std::string itemName = itemNameStr+1; - auto itr = std::find_if(sItemSparseStore.begin(), sItemSparseStore.end(), [&itemName](ItemSparseEntry const* itemSparse) + auto itr = std::find_if(sItemSparseStore.begin(), sItemSparseStore.end(), [&itemName](std::pair<uint32, ItemSparseEntry const*> kv) { for (uint32 i = 0; i < MAX_LOCALES; ++i) - if (itemName == itemSparse->Name->Str[i]) + if (itemName == kv.second->Name->Str[i]) return true; return false; }); @@ -1183,7 +1183,7 @@ public: return false; } - itemId = itr->ID; + itemId = itr->first; } else return false; @@ -1469,7 +1469,7 @@ public: // add the skill to the player's book with step 1 (which is the first rank, in most cases something // like 'Apprentice <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 +1573,7 @@ public: uint8 raceid, classid = 0; //RACE_NONE, CLASS_NONE std::string raceStr, classStr = handler->GetTrinityString(LANG_UNKNOWN); uint8 gender = 0; - int8 locale = handler->GetSessionDbcLocale(); + LocaleConstant locale = handler->GetSessionDbcLocale(); uint32 totalPlayerTime = 0; uint8 level = 0; std::string alive = handler->GetTrinityString(LANG_ERROR); @@ -1794,7 +1794,7 @@ public: handler->PSendSysMessage(LANG_PINFO_CHR_LEVEL_HIGH, level); // Output XI. LANG_PINFO_CHR_RACE - raceStr = GetRaceName(raceid, locale); + raceStr = DB2Manager::GetChrRaceName(raceid, locale); classStr = GetClassName(classid, locale); handler->PSendSysMessage(LANG_PINFO_CHR_RACE, (gender == 0 ? handler->GetTrinityString(LANG_CHARACTER_GENDER_MALE) : handler->GetTrinityString(LANG_CHARACTER_GENDER_FEMALE)), raceStr.c_str(), classStr.c_str()); @@ -2608,7 +2608,7 @@ public: uint32 soundId = atoi((char*)args); - if (!sSoundEntriesStore.LookupEntry(soundId)) + if (!sSoundKitStore.LookupEntry(soundId)) { handler->PSendSysMessage(LANG_SOUND_NOT_EXIST, soundId); handler->SetSentErrorMessage(true); @@ -2688,7 +2688,7 @@ public: { AuraApplication const* aurApp = itr->second; Aura const* aura = aurApp->GetBase(); - char const* name = aura->GetSpellInfo()->SpellName; + char const* name = aura->GetSpellInfo()->SpellName->Str[handler->GetSessionDbcLocale()]; bool self = target->GetGUID() == aura->GetCasterGUID(); if (self) diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 4488561589f..a4665973009 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -172,7 +172,7 @@ class spell_dru_eclipse_energize : public SpellScriptLoader int32 energizeAmount = -GetEffectValue(); // -13 // If we are set to fill the lunar side or we've just logged in with 0 power.. if ((!caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER)) - || caster->GetPower(POWER_ECLIPSE) == 0) + || caster->GetPower(POWER_LUNAR_POWER) == 0) { caster->CastCustomSpell(caster, SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE, &energizeAmount, 0, 0, true); // If the energize was due to 0 power, cast the eclipse marker aura @@ -180,7 +180,7 @@ class spell_dru_eclipse_energize : public SpellScriptLoader caster->CastSpell(caster, SPELL_DRUID_LUNAR_ECLIPSE_MARKER, true); } // The energizing effect brought us out of the solar eclipse, remove the aura - if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) + if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_LUNAR_POWER) <= 0) caster->RemoveAurasDueToSpell(SPELL_DRUID_SOLAR_ECLIPSE); break; } @@ -189,7 +189,7 @@ class spell_dru_eclipse_energize : public SpellScriptLoader int32 energizeAmount = GetEffectValue(); // 20 // If we are set to fill the solar side or we've just logged in with 0 power.. if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) - || caster->GetPower(POWER_ECLIPSE) == 0) + || caster->GetPower(POWER_LUNAR_POWER) == 0) { caster->CastCustomSpell(caster, SPELL_DRUID_ECLIPSE_GENERAL_ENERGIZE, &energizeAmount, 0, 0, true); // If the energize was due to 0 power, cast the eclipse marker aura @@ -197,7 +197,7 @@ class spell_dru_eclipse_energize : public SpellScriptLoader caster->CastSpell(caster, SPELL_DRUID_SOLAR_ECLIPSE_MARKER, true); } // The energizing effect brought us out of the lunar eclipse, remove the aura - if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) + if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_LUNAR_POWER) >= 0) caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); break; } @@ -205,7 +205,7 @@ class spell_dru_eclipse_energize : public SpellScriptLoader { // If we are set to fill the solar side or we've just logged in with 0 power (confirmed with sniffs) if ((!caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE_MARKER) && caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE_MARKER)) - || caster->GetPower(POWER_ECLIPSE) == 0) + || caster->GetPower(POWER_LUNAR_POWER) == 0) { int32 energizeAmount = GetEffectValue(); // 15 caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true); @@ -220,10 +220,10 @@ class spell_dru_eclipse_energize : public SpellScriptLoader caster->CastCustomSpell(caster, SPELL_DRUID_STARSURGE_ENERGIZE, &energizeAmount, 0, 0, true); } // The energizing effect brought us out of the lunar eclipse, remove the aura - if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) >= 0) + if (caster->HasAura(SPELL_DRUID_LUNAR_ECLIPSE) && caster->GetPower(POWER_LUNAR_POWER) >= 0) caster->RemoveAura(SPELL_DRUID_LUNAR_ECLIPSE); // The energizing effect brought us out of the solar eclipse, remove the aura - else if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_ECLIPSE) <= 0) + else if (caster->HasAura(SPELL_DRUID_SOLAR_ECLIPSE) && caster->GetPower(POWER_LUNAR_POWER) <= 0) caster->RemoveAura(SPELL_DRUID_SOLAR_ECLIPSE); break; } diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index b0853c71b2c..7dcd3a4fbb9 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -2706,7 +2706,7 @@ public: if (Player* target = GetHitUnit()->ToPlayer()) { target->HandleEmoteCommand(EMOTE_ONESHOT_TRAIN); - if (EmotesTextSoundEntry const* soundEntry = FindTextSoundEmoteFor(TEXT_EMOTE_TRAIN, target->getRace(), target->getGender())) + if (EmotesTextSoundEntry const* soundEntry = sDB2Manager.GetTextSoundEmoteFor(TEXT_EMOTE_TRAIN, target->getRace(), target->getGender(), target->getClass())) target->PlayDistanceSound(soundEntry->SoundId); } } diff --git a/src/server/shared/DataStores/DB2SparseStorageLoader.cpp b/src/server/shared/DataStores/DB2SparseStorageLoader.cpp new file mode 100644 index 00000000000..2e7e974cb5d --- /dev/null +++ b/src/server/shared/DataStores/DB2SparseStorageLoader.cpp @@ -0,0 +1,683 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <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 "Database/DatabaseEnv.h" +#include "Log.h" + +DB2SparseFileLoader::DB2SparseFileLoader() +{ + fileName = nullptr; + + recordCount = 0; + fieldCount = 0; + recordSize = 0; + offsetsPos = 0; + tableHash = 0; + build = 0; + unk1 = 0; + minIndex = 0; + maxIndex = 0; + localeMask = 0; + copyIdSize = 0; + + dataStart = 0; + data = nullptr; + offsets = nullptr; +} + +bool DB2SparseFileLoader::Load(const char *filename) +{ + if (data) + { + delete[] data; + data = nullptr; + } + + FILE* f = fopen(filename, "rb"); + if (!f) + return false; + + fileName = filename; + uint32 header; + if (fread(&header, 4, 1, f) != 1) // Signature + { + fclose(f); + return false; + } + + EndianConvert(header); + + if (header != 0x34424457) + { + fclose(f); + return false; //'WDB4' + } + + if (fread(&recordCount, 4, 1, f) != 1) // Number of records + { + fclose(f); + return false; + } + + EndianConvert(recordCount); + + if (fread(&fieldCount, 4, 1, f) != 1) // Number of fields + { + fclose(f); + return false; + } + + EndianConvert(fieldCount); + + if (fread(&recordSize, 4, 1, f) != 1) // Size of a record + { + fclose(f); + return false; + } + + EndianConvert(recordSize); + + if (fread(&offsetsPos, 4, 1, f) != 1) // String size + { + fclose(f); + return false; + } + + EndianConvert(offsetsPos); + + if (fread(&tableHash, 4, 1, f) != 1) // Table hash + { + fclose(f); + return false; + } + + EndianConvert(tableHash); + + if (fread(&build, 4, 1, f) != 1) // Build + { + fclose(f); + return false; + } + + EndianConvert(build); + + if (fread(&unk1, 4, 1, f) != 1) // Unknown WDB2 + { + fclose(f); + return false; + } + + EndianConvert(unk1); + + if (fread(&minIndex, 4, 1, f) != 1) // MinIndex WDB2 + { + fclose(f); + return false; + } + + EndianConvert(minIndex); + + if (fread(&maxIndex, 4, 1, f) != 1) // MaxIndex WDB2 + { + fclose(f); + return false; + } + + EndianConvert(maxIndex); + + if (fread(&localeMask, 4, 1, f) != 1) // Locales + { + fclose(f); + return false; + } + + EndianConvert(localeMask); + + if (fread(©IdSize, 4, 1, f) != 1) + { + fclose(f); + return false; + } + + EndianConvert(copyIdSize); + + if (fread(&metaFlags, 4, 1, f) != 1) + { + fclose(f); + return false; + } + + EndianConvert(metaFlags); + + dataStart = ftell(f); + + data = new unsigned char[offsetsPos - dataStart]; + + if (fread(data, offsetsPos - dataStart, 1, f) != 1) + { + fclose(f); + return false; + } + + offsets = new OffsetTableEntry[maxIndex - minIndex + 1]; + if (fread(offsets, (maxIndex - minIndex + 1) * 6, 1, f) != 1) + { + fclose(f); + return false; + } + + fclose(f); + return true; +} + +DB2SparseFileLoader::~DB2SparseFileLoader() +{ + delete[] data; + delete[] offsets; +} + +uint32 DB2SparseFileLoader::GetFormatRecordSize(const char * format) +{ + uint32 recordsize = 0; + for (uint32 x = 0; format[x]; ++x) + { + switch (format[x]) + { + case FT_FLOAT: + case FT_INT: + recordsize += 4; + break; + case FT_STRING: + case FT_STRING_NOT_LOCALIZED: + recordsize += sizeof(char*); + break; + case FT_BYTE: + recordsize += 1; + break; + case FT_LONG: + recordsize += 8; + break; + case FT_SHORT: + recordsize += 2; + break; + } + } + + return recordsize; +} + +uint32 DB2SparseFileLoader::GetFormatStringFieldCount(const char* format) +{ + uint32 stringfields = 0; + for (uint32 x = 0; format[x]; ++x) + if (format[x] == FT_STRING || format[x] == FT_STRING_NOT_LOCALIZED) + ++stringfields; + + return stringfields; +} + +uint32 DB2SparseFileLoader::GetFormatLocalizedStringFieldCount(char const* format) +{ + uint32 stringfields = 0; + for (uint32 x = 0; format[x]; ++x) + if (format[x] == FT_STRING) + ++stringfields; + + return stringfields; +} + +static char const* const nullStr = ""; + +char* DB2SparseFileLoader::AutoProduceData(const char* format, IndexTable const& indexTable, uint32 locale, std::vector<char*>& stringPool) +{ + typedef char* ptr; + if (strlen(format) != fieldCount) + return NULL; + + //get struct size and index pos + uint32 recordsize = GetFormatRecordSize(format); + + uint32 offsetCount = maxIndex - minIndex + 1; + uint32 records = 0; + uint32 expandedDataSize = 0; + for (uint32 i = 0; i < offsetCount; ++i) + { + if (offsets[i].FileOffset && offsets[i].RecordSize) + { + ++records; + expandedDataSize += offsets[i].RecordSize; + } + } + + char* dataTable = new char[records * recordsize]; + + // we store flat holders pool as single memory block + std::size_t stringFields = GetFormatStringFieldCount(format); + std::size_t localizedStringFields = GetFormatLocalizedStringFieldCount(format); + + // each string field at load have array of string for each locale + std::size_t stringHolderSize = sizeof(char*) * TOTAL_LOCALES; + std::size_t stringHoldersRecordPoolSize = localizedStringFields * stringHolderSize + (stringFields - localizedStringFields) * sizeof(char*); + std::size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * records; + + char* stringHoldersPool = new char[stringHoldersPoolSize]; + stringPool.push_back(stringHoldersPool); + + // DB2 strings expected to have at least empty string + for (std::size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i) + ((char const**)stringHoldersPool)[i] = nullStr; + + char* stringTable = new char[expandedDataSize - records * (recordsize - stringFields * sizeof(char*))]; + memset(stringTable, 0, expandedDataSize - records * (recordsize - stringFields * sizeof(char*))); + stringPool.push_back(stringTable); + char* stringPtr = stringTable; + + uint32 offset = 0; + uint32 recordNum = 0; + for (uint32 y = 0; y < offsetCount; ++y) + { + if (!offsets[y].FileOffset || !offsets[y].RecordSize) + continue; + + indexTable.Insert(y + minIndex, &dataTable[offset]); + uint32 fieldOffset = 0; + uint32 stringFieldOffset = 0; + for (uint32 x = 0; x < fieldCount; x++) + { + switch (format[x]) + { + case FT_FLOAT: + *((float*)(&dataTable[offset])) = *reinterpret_cast<float*>(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + offset += 4; + fieldOffset += 4; + break; + case FT_IND: + case FT_INT: + *((uint32*)(&dataTable[offset])) = *reinterpret_cast<uint32*>(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + offset += 4; + fieldOffset += 4; + break; + case FT_BYTE: + *((uint8*)(&dataTable[offset])) = *reinterpret_cast<uint8*>(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + offset += 1; + fieldOffset += 1; + break; + case FT_LONG: + *((uint64*)(&dataTable[offset])) = *reinterpret_cast<uint64*>(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + offset += 8; + fieldOffset += 8; + break; + case FT_SHORT: + *((uint16*)(&dataTable[offset])) = *reinterpret_cast<uint16*>(&data[offsets[y].FileOffset - dataStart + fieldOffset]); + offset += 2; + fieldOffset += 2; + break; + case FT_STRING: + { + LocalizedString** slot = (LocalizedString**)(&dataTable[offset]); + *slot = (LocalizedString*)(&stringHoldersPool[stringHoldersRecordPoolSize * recordNum + stringFieldOffset]); + (*slot)->Str[locale] = stringPtr; + strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); + fieldOffset += strlen(stringPtr) + 1; + stringPtr += strlen(stringPtr) + 1; + stringFieldOffset += stringHolderSize; + offset += sizeof(LocalizedString*); + break; + } + case FT_STRING_NOT_LOCALIZED: + { + char const*** slot = (char const***)(&dataTable[offset]); + *slot = (char const**)(&stringHoldersPool[stringHoldersRecordPoolSize * recordNum + stringFieldOffset]); + **slot = stringPtr; + strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); + fieldOffset += strlen(stringPtr) + 1; + stringPtr += strlen(stringPtr) + 1; + ++stringFieldOffset; + offset += sizeof(char*); + break; + } + } + } + + ++recordNum; + } + + return dataTable; +} + +char* DB2SparseFileLoader::AutoProduceStrings(const char* format, char* dataTable, uint32 locale) +{ + if (strlen(format) != fieldCount) + return nullptr; + + if (!(localeMask & (1 << locale))) + { + char const* sep = ""; + std::ostringstream str; + for (uint32 i = 0; i < TOTAL_LOCALES; ++i) + { + if (localeMask & (1 << i)) + { + str << sep << localeNames[i]; + sep = ", "; + } + } + + TC_LOG_ERROR("", "Attempted to load %s which has locales %s as %s. Check if you placed your localized db2 files in correct directory.", fileName, str.str().c_str(), localeNames[locale]); + return nullptr; + } + + uint32 offsetCount = maxIndex - minIndex + 1; + uint32 records = 0; + for (uint32 i = 0; i < offsetCount; ++i) + if (offsets[i].FileOffset && offsets[i].RecordSize) + ++records; + + uint32 recordsize = GetFormatRecordSize(format); + std::size_t stringFields = GetFormatStringFieldCount(format); + char* stringTable = new char[offsetsPos - dataStart - records * (recordsize - stringFields * sizeof(char*))]; + memset(stringTable, 0, offsetsPos - dataStart - records * (recordsize - stringFields * sizeof(char*))); + char* stringPtr = stringTable; + + uint32 offset = 0; + + for (uint32 y = 0; y < offsetCount; y++) + { + if (!offsets[y].FileOffset || !offsets[y].RecordSize) + continue; + + uint32 fieldOffset; + for (uint32 x = 0; x < fieldCount; x++) + { + switch (format[x]) + { + case FT_FLOAT: + case FT_IND: + case FT_INT: + offset += 4; + fieldOffset += 4; + break; + case FT_BYTE: + offset += 1; + fieldOffset += 1; + break; + case FT_LONG: + offset += 8; + fieldOffset += 8; + break; + case FT_SHORT: + offset += 2; + fieldOffset += 2; + break; + case FT_STRING: + { + // fill only not filled entries + LocalizedString* db2str = *(LocalizedString**)(&dataTable[offset]); + db2str->Str[locale] = stringPtr; + strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); + fieldOffset += strlen(stringPtr) + 1; + stringPtr += strlen(stringPtr) + 1; + offset += sizeof(char*); + break; + } + case FT_STRING_NOT_LOCALIZED: + { + char** db2str = (char**)(&dataTable[offset]); + *db2str = stringPtr; + strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); + fieldOffset += strlen(stringPtr) + 1; + stringPtr += strlen(stringPtr) + 1; + offset += sizeof(char*); + break; + } + } + } + } + + return stringTable; +} + +char* DB2SparseDatabaseLoader::Load(const char* format, HotfixDatabaseStatements preparedStatement, IndexTable const& indexTable, std::vector<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()) + return nullptr; + + // get struct size and index pos + uint32 recordSize = DB2SparseFileLoader::GetFormatRecordSize(format); + + // we store flat holders pool as single memory block + std::size_t stringFields = DB2SparseFileLoader::GetFormatStringFieldCount(format); + std::size_t localizedStringFields = DB2SparseFileLoader::GetFormatLocalizedStringFieldCount(format); + + // each string field at load have array of string for each locale + std::size_t stringHolderSize = sizeof(char*) * TOTAL_LOCALES; + std::size_t stringHoldersRecordPoolSize = localizedStringFields * stringHolderSize + (stringFields - localizedStringFields) * sizeof(char*); + + char* stringHolders = nullptr; + if (stringFields) + { + std::size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * result->GetRowCount(); + stringHolders = new char[stringHoldersPoolSize]; + stringPool.push_back(stringHolders); + + // DB2 strings expected to have at least empty string + for (std::size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i) + ((char const**)stringHolders)[i] = nullStr; + } + + char* tempDataTable = new char[result->GetRowCount() * recordSize]; + uint32* newIndexes = new uint32[result->GetRowCount()]; + uint32 rec = 0; + uint32 newRecords = 0; + + do + { + Field* fields = result->Fetch(); + uint32 offset = 0; + uint32 stringFieldOffset = 0; + + uint32 indexValue = fields[0].GetUInt32(); + + // Attempt to overwrite existing data + char* dataValue = indexTable.Get(indexValue); + if (!dataValue) + { + newIndexes[newRecords] = indexValue; + dataValue = &tempDataTable[newRecords++ * recordSize]; + } + + for (uint32 f = 0; f < fieldCount; f++) + { + switch (format[f]) + { + case FT_FLOAT: + *((float*)(&dataValue[offset])) = fields[f].GetFloat(); + offset += 4; + break; + case FT_IND: + case FT_INT: + *((int32*)(&dataValue[offset])) = fields[f].GetInt32(); + offset += 4; + break; + case FT_BYTE: + *((int8*)(&dataValue[offset])) = fields[f].GetInt8(); + offset += 1; + break; + case FT_LONG: + *((int64*)(&dataValue[offset])) = fields[f].GetInt64(); + offset += 8; + break; + case FT_SHORT: + *((int16*)(&dataValue[offset])) = fields[f].GetInt16(); + offset += 2; + break; + case FT_STRING: + { + LocalizedString** slot = (LocalizedString**)(&dataValue[offset]); + *slot = (LocalizedString*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringFieldOffset]); + ASSERT(*slot); + + // Value in database in main table field must be for enUS locale + if (char* str = AddString(&(*slot)->Str[LOCALE_enUS], fields[f].GetString())) + stringPool.push_back(str); + + stringFieldOffset += stringHolderSize; + offset += sizeof(char*); + break; + } + case FT_STRING_NOT_LOCALIZED: + { + char const** slot = (char const**)(&dataValue[offset]); + *slot = (char*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringFieldOffset]); + ASSERT(*slot); + + // Value in database in main table field must be for enUS locale + if (char* str = AddString(slot, fields[f].GetString())) + stringPool.push_back(str); + + ++stringFieldOffset; + offset += sizeof(char*); + break; + } + } + } + + ASSERT(offset == recordSize); + ++rec; + } while (result->NextRow()); + + if (!newRecords) + { + delete[] tempDataTable; + delete[] newIndexes; + return nullptr; + } + + // Compact new data table to only contain new records not previously loaded from file + char* dataTable = new char[newRecords * recordSize]; + memcpy(dataTable, tempDataTable, newRecords * recordSize); + + // insert new records to index table + for (uint32 i = 0; i < newRecords; ++i) + indexTable.Insert(newIndexes[i], &dataTable[i * recordSize]); + + delete[] tempDataTable; + delete[] newIndexes; + + return dataTable; +} + +void DB2SparseDatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, IndexTable const& indexTable, std::vector<char*>& stringPool) +{ + PreparedStatement* stmt = HotfixDatabase.GetPreparedStatement(preparedStatement); + stmt->setString(0, localeNames[locale]); + PreparedQueryResult result = HotfixDatabase.Query(stmt); + if (!result) + return; + + size_t stringFields = DB2SparseFileLoader::GetFormatLocalizedStringFieldCount(format); + if (result->GetFieldCount() != stringFields + 1 /*ID*/) + return; + + uint32 const fieldCount = strlen(format); + uint32 recordSize = DB2SparseFileLoader::GetFormatRecordSize(format); + ASSERT(0 >= 0, "DB2Storage must be indexed to load localized strings"); + + do + { + Field* fields = result->Fetch(); + uint32 offset = 0; + uint32 stringFieldNumInRecord = 0; + uint32 indexValue = fields[0].GetUInt32(); + + // Attempt to overwrite existing data + if (char* dataValue = indexTable.Get(indexValue)) + { + for (uint32 x = 0; x < fieldCount; x++) + { + switch (format[x]) + { + case FT_FLOAT: + case FT_IND: + case FT_INT: + offset += 4; + break; + case FT_BYTE: + offset += 1; + break; + case FT_LONG: + offset += 8; + break; + case FT_SHORT: + offset += 2; + break; + case FT_STRING: + { + // fill only not filled entries + LocalizedString* db2str = *(LocalizedString**)(&dataValue[offset]); + if (db2str->Str[locale] == nullStr) + if (char* str = AddString(&db2str->Str[locale], fields[1 + stringFieldNumInRecord].GetString())) + stringPool.push_back(str); + + ++stringFieldNumInRecord; + offset += sizeof(char*); + break; + } + } + } + + ASSERT(offset == recordSize); + } + else + TC_LOG_ERROR("sql.sql", "Hotfix locale table for storage %s references row that does not exist %u!", _storageName.c_str(), indexValue); + + } while (result->NextRow()); + + return; +} + +char* DB2SparseDatabaseLoader::AddString(char const** holder, std::string const& value) +{ + if (!value.empty()) + { + std::size_t existingLength = strlen(*holder); + if (existingLength >= value.length()) + { + // Reuse existing storage if there is enough space + char* str = const_cast<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..13f31e12d56 --- /dev/null +++ b/src/server/shared/DataStores/DB2SparseStorageLoader.h @@ -0,0 +1,117 @@ +/* + * 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 "Define.h" +#include "Utilities/ByteConverter.h" +#include "Implementation/HotfixDatabase.h" +#include <unordered_map> +#include <vector> + +class 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 DB2SparseFileLoader +{ + public: + DB2SparseFileLoader(); + ~DB2SparseFileLoader(); + + bool Load(const char *filename); + + uint32 GetNumRows() const { return recordCount; } + uint32 GetCols() const { return fieldCount; } + uint32 GetHash() const { return tableHash; } + bool IsLoaded() const { return (data != NULL); } + char* AutoProduceData(const char* fmt, IndexTable const& indexTable, uint32 locale, std::vector<char*>& stringPool); + char* AutoProduceStrings(const char* fmt, char* dataTable, uint32 locale); + static uint32 GetFormatRecordSize(const char * format); + static uint32 GetFormatStringFieldCount(const char * format); + static uint32 GetFormatLocalizedStringFieldCount(const char * format); +private: +#pragma pack(push, 1) + struct OffsetTableEntry + { + uint32 FileOffset; + uint16 RecordSize; + }; +#pragma pack(pop) + + char const* fileName; + + // WDB2 / WCH2 fields + uint32 recordSize; + uint32 recordCount; + uint32 fieldCount; + uint32 offsetsPos; + uint32 tableHash; + uint32 build; + uint32 unk1; + uint32 minIndex; + uint32 maxIndex; + uint32 localeMask; + uint32 copyIdSize; + uint32 metaFlags; + + uint32 dataStart; + unsigned char* data; + OffsetTableEntry* offsets; +}; + +class DB2SparseDatabaseLoader +{ +public: + explicit DB2SparseDatabaseLoader(std::string const& storageName) : _storageName(storageName) { } + + char* Load(const char* format, HotfixDatabaseStatements preparedStatement, IndexTable const& indexTable, std::vector<char*>& stringPool); + void LoadStrings(const char* format, 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; +}; + +#endif diff --git a/src/server/shared/DataStores/DB2StorageLoader.cpp b/src/server/shared/DataStores/DB2StorageLoader.cpp index d2be433806f..d101d12a52e 100644 --- a/src/server/shared/DataStores/DB2StorageLoader.cpp +++ b/src/server/shared/DataStores/DB2StorageLoader.cpp @@ -23,22 +23,25 @@ DB2FileLoader::DB2FileLoader() { fileName = nullptr; + recordSize = 0; recordCount = 0; fieldCount = 0; stringSize = 0; - fieldsOffset = nullptr; - data = nullptr; - stringTable = nullptr; - tableHash = 0; build = 0; - unk1 = 0; minIndex = 0; maxIndex = 0; localeMask = 0; - unk5 = 0; + copyIdSize = 0; + + fieldsOffset = nullptr; + data = nullptr; + stringTable = nullptr; + idTable = nullptr; + idTableSize = 0; + copyTable = nullptr; } bool DB2FileLoader::Load(const char *filename, const char *fmt) @@ -55,7 +58,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) fileName = filename; uint32 header; - if (fread(&header, 4, 1, f) != 1) // Signature + if (fread(&header, 4, 1, f) != 1) // Signature { fclose(f); return false; @@ -63,13 +66,13 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(header); - if (header != 0x32424457) + if (header != 0x34424457) { fclose(f); - return false; //'WDB2' + return false; //'WDB4' } - if (fread(&recordCount, 4, 1, f) != 1) // Number of records + if (fread(&recordCount, 4, 1, f) != 1) // Number of records { fclose(f); return false; @@ -77,7 +80,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(recordCount); - if (fread(&fieldCount, 4, 1, f) != 1) // Number of fields + if (fread(&fieldCount, 4, 1, f) != 1) // Number of fields { fclose(f); return false; @@ -85,7 +88,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(fieldCount); - if (fread(&recordSize, 4, 1, f) != 1) // Size of a record + if (fread(&recordSize, 4, 1, f) != 1) // Size of a record { fclose(f); return false; @@ -93,7 +96,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(recordSize); - if (fread(&stringSize, 4, 1, f) != 1) // String size + if (fread(&stringSize, 4, 1, f) != 1) // String size { fclose(f); return false; @@ -101,8 +104,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(stringSize); - /* NEW WDB2 FIELDS*/ - if (fread(&tableHash, 4, 1, f) != 1) // Table hash + if (fread(&tableHash, 4, 1, f) != 1) // Table hash { fclose(f); return false; @@ -110,7 +112,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(tableHash); - if (fread(&build, 4, 1, f) != 1) // Build + if (fread(&build, 4, 1, f) != 1) // Build { fclose(f); return false; @@ -118,7 +120,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(build); - if (fread(&unk1, 4, 1, f) != 1) // Unknown WDB2 + if (fread(&unk1, 4, 1, f) != 1) // Unknown WDB2 { fclose(f); return false; @@ -126,7 +128,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(unk1); - if (fread(&minIndex, 4, 1, f) != 1) // MinIndex WDB2 + if (fread(&minIndex, 4, 1, f) != 1) // MinIndex WDB2 { fclose(f); return false; @@ -134,7 +136,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(minIndex); - if (fread(&maxIndex, 4, 1, f) != 1) // MaxIndex WDB2 + if (fread(&maxIndex, 4, 1, f) != 1) // MaxIndex WDB2 { fclose(f); return false; @@ -142,7 +144,7 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(maxIndex); - if (fread(&localeMask, 4, 1, f) != 1) // Locales + if (fread(&localeMask, 4, 1, f) != 1) // Locales { fclose(f); return false; @@ -150,18 +152,26 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(localeMask); - if (fread(&unk5, 4, 1, f) != 1) // Unknown WDB2 + if (fread(©IdSize, 4, 1, f) != 1) { fclose(f); return false; } - EndianConvert(unk5); + EndianConvert(copyIdSize); - if (maxIndex != 0) + if (fread(&metaFlags, 4, 1, f) != 1) { - int32 diff = maxIndex - minIndex + 1; - fseek(f, diff * 4 + diff * 2, SEEK_CUR); // diff * 4: an index for rows, diff * 2: a memory allocation bank + fclose(f); + return false; + } + + EndianConvert(metaFlags); + + if (fmt[0] == FT_SORT) + { + idTableSize = recordCount * sizeof(uint32); + ++fmt; } fieldsOffset = new uint32[fieldCount]; @@ -173,6 +183,8 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) fieldsOffset[i] += 1; else if (fmt[i - 1] == FT_LONG) fieldsOffset[i] += 8; + else if (fmt[i - 1] == FT_SHORT) + fieldsOffset[i] += 2; else // 4 byte fields (int32/float/strings) fieldsOffset[i] += 4; } @@ -186,29 +198,49 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) return false; } + if (idTableSize) + { + idTable = new unsigned char[idTableSize]; + if (fread(idTable, idTableSize, 1, f) != 1) + { + fclose(f); + return false; + } + } + + if (copyIdSize) + { + copyTable = new unsigned char[copyIdSize]; + if (fread(copyTable, copyIdSize, 1, f) != 1) + { + fclose(f); + return false; + } + } + fclose(f); return true; } DB2FileLoader::~DB2FileLoader() { - if (data) - delete [] data; - if (fieldsOffset) - delete [] fieldsOffset; + delete[] data; + delete[] idTable; + delete[] copyTable; + delete[] fieldsOffset; } DB2FileLoader::Record DB2FileLoader::getRecord(size_t id) { assert(data); - return Record(*this, data + id*recordSize); + return Record(*this, data + id * recordSize); } uint32 DB2FileLoader::GetFormatRecordSize(const char * format, int32* index_pos) { uint32 recordsize = 0; int32 i = -1; - for (uint32 x=0; format[x]; ++x) + for (uint32 x = 0; format[x]; ++x) { switch (format[x]) { @@ -233,6 +265,9 @@ uint32 DB2FileLoader::GetFormatRecordSize(const char * format, int32* index_pos) case FT_LONG: recordsize += 8; break; + case FT_SHORT: + recordsize += 2; + break; } } @@ -264,8 +299,8 @@ uint32 DB2FileLoader::GetFormatLocalizedStringFieldCount(char const* format) char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char**& indexTable) { - typedef char * ptr; - if (strlen(format) != fieldCount) + typedef char* ptr; + if (strlen(format) != fieldCount + (format[0] == FT_SORT ? 1 : 0)) return NULL; //get struct size and index pos @@ -276,9 +311,28 @@ char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char** { uint32 maxi = 0; //find max index - for (uint32 y = 0; y < recordCount; y++) + if (!idTableSize) + { + for (uint32 y = 0; y < recordCount; ++y) + { + uint32 ind = getRecord(y).getUInt(indexField); + if (ind > maxi) + maxi = ind; + } + } + else { - uint32 ind = getRecord(y).getUInt(indexField); + ASSERT(indexField == 0); + for (uint32 y = 0; y < recordCount; ++y) + { + uint32 ind = ((uint32*)idTable)[y]; + if (ind > maxi) + maxi = ind; + } + } + for (uint32 y = 0; y < copyIdSize; y += 8) + { + uint32 ind = *((uint32*)(copyTable + y)); if (ind > maxi) maxi = ind; } @@ -290,18 +344,25 @@ char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char** } else { + ASSERT(!copyIdSize, "Storage %s uses id copy table - must be indexed!", fileName); records = recordCount; indexTable = new ptr[recordCount]; } - char* dataTable = new char[recordCount * recordsize]; + char* dataTable = new char[(recordCount + (copyIdSize / 8)) * recordsize]; uint32 offset = 0; + if (idTableSize) + { + ASSERT(format[0] == 'd'); + ++format; + } + for (uint32 y = 0; y < recordCount; y++) { if (indexField >= 0) - indexTable[getRecord(y).getUInt(indexField)] = &dataTable[offset]; + indexTable[!idTableSize ? getRecord(y).getUInt(indexField) : ((uint32*)idTable)[y]] = &dataTable[offset]; else indexTable[y] = &dataTable[offset]; @@ -326,6 +387,10 @@ char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char** *((uint64*)(&dataTable[offset])) = getRecord(y).getUInt64(x); offset += 8; break; + case FT_SHORT: + *((uint16*)(&dataTable[offset])) = getRecord(y).getUInt16(x); + offset += 2; + break; case FT_STRING: case FT_STRING_NOT_LOCALIZED: *((char**)(&dataTable[offset])) = nullptr; // will be replaces non-empty or "" strings in AutoProduceStrings @@ -335,6 +400,20 @@ char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char** } } + uint32* copyIds = (uint32*)copyTable; + for (uint32 c = 0; c < copyIdSize / 4; c += 2) + { + uint32 to = copyIds[c]; + uint32 from = copyIds[c + 1]; + + if (from && from < records && indexTable[from]) + { + indexTable[to] = &dataTable[offset]; + memcpy(indexTable[to], indexTable[from], recordsize); + offset += recordsize; + } + } + return dataTable; } @@ -342,7 +421,7 @@ static char const* const nullStr = ""; char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* dataTable) { - if (strlen(format) != fieldCount) + if (strlen(format) != fieldCount + (format[0] == FT_SORT ? 1 : 0)) return nullptr; // we store flat holders pool as single memory block @@ -365,6 +444,9 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da uint32 offset = 0; + if (idTableSize) + ++format; + // assign string holders to string field slots for (uint32 y = 0; y < recordCount; y++) { @@ -385,6 +467,9 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da case FT_LONG: offset += 8; break; + case FT_SHORT: + offset += 2; + break; case FT_STRING: case FT_STRING_NOT_LOCALIZED: { @@ -411,7 +496,7 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uint32 locale) { - if (strlen(format) != fieldCount) + if (strlen(format) != fieldCount + (format[0] == FT_SORT ? 1 : 0)) return nullptr; if (!(localeMask & (1 << locale))) @@ -436,6 +521,9 @@ char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uin uint32 offset = 0; + if (idTableSize) + ++format; + for (uint32 y = 0; y < recordCount; y++) { for (uint32 x = 0; x < fieldCount; x++) @@ -453,6 +541,9 @@ char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uin case FT_LONG: offset += 8; break; + case FT_SHORT: + offset += 2; + break; case FT_STRING: { // fill only not filled entries @@ -481,7 +572,7 @@ char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uin return stringPool; } -char* DB2DatabaseLoader::Load(const char* format, HotfixDatabaseStatements preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::list<char*>& stringPool) +char* DB2DatabaseLoader::Load(const char* format, 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)); @@ -582,6 +673,10 @@ char* DB2DatabaseLoader::Load(const char* format, HotfixDatabaseStatements prepa *((int64*)(&dataValue[offset])) = fields[f].GetInt64(); offset += 8; break; + case FT_SHORT: + *((int16*)(&dataValue[offset])) = fields[f].GetInt16(); + offset += 2; + break; case FT_STRING: { LocalizedString** slot = (LocalizedString**)(&dataValue[offset]); @@ -640,7 +735,7 @@ char* DB2DatabaseLoader::Load(const char* format, HotfixDatabaseStatements prepa return dataTable; } -void DB2DatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, char**& indexTable, std::list<char*>& stringPool) +void DB2DatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, char**& indexTable, std::vector<char*>& stringPool) { PreparedStatement* stmt = HotfixDatabase.GetPreparedStatement(preparedStatement); stmt->setString(0, localeNames[locale]); @@ -682,6 +777,9 @@ void DB2DatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStatements case FT_LONG: offset += 8; break; + case FT_SHORT: + offset += 2; + break; case FT_STRING: { // fill only not filled entries diff --git a/src/server/shared/DataStores/DB2StorageLoader.h b/src/server/shared/DataStores/DB2StorageLoader.h index 41705c67f19..67525779ef5 100644 --- a/src/server/shared/DataStores/DB2StorageLoader.h +++ b/src/server/shared/DataStores/DB2StorageLoader.h @@ -22,7 +22,7 @@ #include "Utilities/ByteConverter.h" #include "Implementation/HotfixDatabase.h" #include <cassert> -#include <list> +#include <vector> class TC_SHARED_API DB2FileLoader { @@ -61,6 +61,13 @@ class TC_SHARED_API DB2FileLoader EndianConvert(val); return val; } + uint16 getUInt16(size_t field) const + { + assert(field < file.fieldCount); + uint16 val = *reinterpret_cast<uint16*>(offset + file.GetOffset(field)); + EndianConvert(val); + return val; + } const char *getString(size_t field) const { assert(field < file.fieldCount); @@ -95,23 +102,26 @@ class TC_SHARED_API DB2FileLoader private: char const* fileName; + // WDB2 / WCH2 fields uint32 recordSize; uint32 recordCount; uint32 fieldCount; uint32 stringSize; - uint32 *fieldsOffset; - unsigned char *data; - unsigned char *stringTable; + uint32 tableHash; + uint32 build; + uint32 unk1; + uint32 minIndex; + uint32 maxIndex; + uint32 localeMask; + uint32 copyIdSize; + uint32 metaFlags; - // WDB2 / WCH2 fields - uint32 tableHash; // WDB2 - uint32 build; // WDB2 - - int unk1; // WDB2 (Unix time in WCH2) - int minIndex; // WDB2 - int maxIndex; // WDB2 (index table) - int localeMask; // WDB2 - int unk5; // WDB2 + uint32 *fieldsOffset; + unsigned char* data; + unsigned char* stringTable; + unsigned char* idTable; + uint32 idTableSize; + unsigned char* copyTable; }; class TC_SHARED_API DB2DatabaseLoader @@ -119,8 +129,8 @@ class TC_SHARED_API DB2DatabaseLoader public: explicit DB2DatabaseLoader(std::string const& storageName) : _storageName(storageName) { } - char* Load(const char* format, HotfixDatabaseStatements preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::list<char*>& stringPool); - void LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, char**& indexTable, std::list<char*>& stringPool); + char* Load(const char* format, HotfixDatabaseStatements preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::vector<char*>& stringPool); + void LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, char**& indexTable, std::vector<char*>& stringPool); static char* AddString(char const** holder, std::string const& value); private: diff --git a/src/server/shared/DataStores/DB2Store.h b/src/server/shared/DataStores/DB2Store.h index 72271ce507b..570e8174a39 100644 --- a/src/server/shared/DataStores/DB2Store.h +++ b/src/server/shared/DataStores/DB2Store.h @@ -20,6 +20,7 @@ #include "Common.h" #include "DB2StorageLoader.h" +#include "DB2SparseStorageLoader.h" #include "DBStorageIterator.h" #include "ByteBuffer.h" @@ -27,7 +28,16 @@ class DB2StorageBase { public: - virtual ~DB2StorageBase() { } + DB2StorageBase(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex) + : _tableHash(0), _fileName(fileName), _fieldCount(0), _format(format), _dataTable(nullptr), _dataTableEx(nullptr), _hotfixStatement(preparedStmtIndex) { } + + virtual ~DB2StorageBase() + { + delete[] reinterpret_cast<char*>(_dataTable); + delete[] reinterpret_cast<char*>(_dataTableEx); + for (char* strings : _stringPool) + delete[] strings; + } uint32 GetHash() const { return _tableHash; } @@ -37,39 +47,20 @@ public: virtual void EraseRecord(uint32 id) = 0; -protected: - uint32 _tableHash; -}; + std::string const& GetFileName() const { return _fileName; } -template<class T> -class DB2Storage : public DB2StorageBase -{ - typedef std::list<char*> StringPoolList; -public: - typedef DBStorageIterator<T> iterator; + uint32 GetFieldCount() const { return _fieldCount; } - DB2Storage(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex) - : _fileName(fileName), _indexTableSize(0), _fieldCount(0), _format(format), _dataTable(nullptr), _dataTableEx(nullptr), _hotfixStatement(preparedStmtIndex) - { - _indexTable.AsT = NULL; - } + char const* GetFormat() const { return _format; } - ~DB2Storage() - { - delete[] reinterpret_cast<char*>(_indexTable.AsT); - delete[] reinterpret_cast<char*>(_dataTable); - delete[] reinterpret_cast<char*>(_dataTableEx); - for (char* stringPool : _stringPoolList) - delete[] stringPool; - } + virtual bool Load(std::string const& path, uint32 locale) = 0; + virtual bool LoadStringsFrom(std::string const& path, uint32 locale) = 0; + virtual void LoadFromDB() = 0; + virtual void LoadStringsFromDB(uint32 locale) = 0; - bool HasRecord(uint32 id) const override { return id < _indexTableSize && _indexTable.AsT[id] != nullptr; } - void WriteRecord(uint32 id, uint32 locale, ByteBuffer& buffer) const override +protected: + void WriteRecordData(char const* entry, uint32 locale, ByteBuffer& buffer) const { - ASSERT(id < _indexTableSize); - char const* entry = _indexTable.AsChar[id]; - ASSERT(entry); - std::size_t fields = strlen(_format); for (uint32 i = 0; i < fields; ++i) { @@ -122,16 +113,48 @@ public: } } + uint32 _tableHash; + std::string _fileName; + uint32 _fieldCount; + char const* _format; + char* _dataTable; + char* _dataTableEx; + std::vector<char*> _stringPool; + HotfixDatabaseStatements _hotfixStatement; +}; + +template<class T> +class DB2Storage : public DB2StorageBase +{ + 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) : DB2StorageBase(fileName, format, preparedStmtIndex), + _indexTableSize(0) + { + _indexTable.AsT = NULL; + } + + ~DB2Storage() + { + delete[] reinterpret_cast<char*>(_indexTable.AsT); + } + + bool HasRecord(uint32 id) const override { return id < _indexTableSize && _indexTable.AsT[id] != nullptr; } + void WriteRecord(uint32 id, uint32 locale, ByteBuffer& buffer) const override + { + WriteRecordData(reinterpret_cast<char const*>(AssertEntry(id)), locale, buffer); + } + void EraseRecord(uint32 id) override { if (id < _indexTableSize) _indexTable.AsT[id] = nullptr; } T const* LookupEntry(uint32 id) const { return (id >= _indexTableSize) ? nullptr : _indexTable.AsT[id]; } T const* AssertEntry(uint32 id) const { return ASSERT_NOTNULL(LookupEntry(id)); } - std::string const& GetFileName() const { return _fileName; } uint32 GetNumRows() const { return _indexTableSize; } - char const* GetFormat() const { return _format; } - uint32 GetFieldCount() const { return _fieldCount; } - bool Load(std::string const& path, uint32 locale) + bool Load(std::string const& path, uint32 locale) override { DB2FileLoader db2; // Check if load was successful, only then continue @@ -142,23 +165,23 @@ public: _tableHash = db2.GetHash(); // load raw non-string data - _dataTable = reinterpret_cast<T*>(db2.AutoProduceData(_format, _indexTableSize, _indexTable.AsChar)); + _dataTable = db2.AutoProduceData(_format, _indexTableSize, _indexTable.AsChar); // create string holders for loaded string fields - if (char* stringHolders = db2.AutoProduceStringsArrayHolders(_format, (char*)_dataTable)) + if (char* stringHolders = db2.AutoProduceStringsArrayHolders(_format, _dataTable)) { - _stringPoolList.push_back(stringHolders); + _stringPool.push_back(stringHolders); // load strings from db2 data - if (char* stringBlock = db2.AutoProduceStrings(_format, (char*)_dataTable, locale)) - _stringPoolList.push_back(stringBlock); + if (char* stringBlock = db2.AutoProduceStrings(_format, _dataTable, locale)) + _stringPool.push_back(stringBlock); } // error in db2 file at loading if NULL return _indexTable.AsT != NULL; } - bool LoadStringsFrom(std::string const& path, uint32 locale) + bool LoadStringsFrom(std::string const& path, uint32 locale) override { // DB2 must be already loaded using Load if (!_indexTable.AsT) @@ -171,54 +194,129 @@ public: // load strings from another locale db2 data if (DB2FileLoader::GetFormatLocalizedStringFieldCount(_format)) - if (char* stringBlock = db2.AutoProduceStrings(_format, (char*)_dataTable, locale)) - _stringPoolList.push_back(stringBlock); + if (char* stringBlock = db2.AutoProduceStrings(_format, _dataTable, locale)) + _stringPool.push_back(stringBlock); return true; } - void LoadFromDB() + void LoadFromDB() override { char* extraStringHolders = nullptr; - if (char* dataTable = DB2DatabaseLoader(_fileName).Load(_format, _hotfixStatement, _indexTableSize, _indexTable.AsChar, extraStringHolders, _stringPoolList)) - _dataTableEx = reinterpret_cast<T*>(dataTable); - + _dataTableEx = DB2DatabaseLoader(_fileName).Load(_format, _hotfixStatement, _indexTableSize, _indexTable.AsChar, extraStringHolders, _stringPool); if (extraStringHolders) - _stringPoolList.push_back(extraStringHolders); + _stringPool.push_back(extraStringHolders); } - void LoadStringsFromDB(uint32 locale) + void LoadStringsFromDB(uint32 locale) override { if (!DB2FileLoader::GetFormatLocalizedStringFieldCount(_format)) return; - DB2DatabaseLoader(_fileName).LoadStrings(_format, HotfixDatabaseStatements(_hotfixStatement + 1), locale, _indexTable.AsChar, _stringPoolList); - } - - typedef bool(*SortFunc)(T const* left, T const* right); - - void Sort(SortFunc pred) - { - ASSERT(strpbrk(_format, "nd") == nullptr, "Only non-indexed storages can be sorted"); - std::sort(_indexTable.AsT, _indexTable.AsT + _indexTableSize, pred); + DB2DatabaseLoader(_fileName).LoadStrings(_format, HotfixDatabaseStatements(_hotfixStatement + 1), locale, _indexTable.AsChar, _stringPool); } iterator begin() { return iterator(_indexTable.AsT, _indexTableSize); } iterator end() { return iterator(_indexTable.AsT, _indexTableSize, _indexTableSize); } private: - std::string _fileName; - uint32 _indexTableSize; - uint32 _fieldCount; - char const* _format; union { T** AsT; char** AsChar; } _indexTable; - T* _dataTable; - T* _dataTableEx; - StringPoolList _stringPoolList; - HotfixDatabaseStatements _hotfixStatement; + uint32 _indexTableSize; +}; + +template<class T> +class DB2SparseStorage : public DB2StorageBase +{ + static_assert(std::is_pod<T>::value, "T in DB2SparseStorage must be POD-type."); + +public: + typedef typename std::unordered_map<uint32, T const*>::const_iterator iterator; + + DB2SparseStorage(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex) + : DB2StorageBase(fileName, format, preparedStmtIndex) + { + } + + ~DB2SparseStorage() + { + } + + bool HasRecord(uint32 id) const override { return _indexTable.count(id) > 0; } + void WriteRecord(uint32 id, uint32 locale, ByteBuffer& buffer) const override + { + WriteRecordData(reinterpret_cast<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())) + return false; + + _fieldCount = db2.GetCols(); + _tableHash = db2.GetHash(); + + // load raw non-string data + _dataTable = db2.AutoProduceData(_format, 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())) + return false; + + // load strings from another locale db2 data + if (DB2SparseFileLoader::GetFormatLocalizedStringFieldCount(_format)) + if (char* stringBlock = db2.AutoProduceStrings(_format, _dataTable, locale)) + _stringPool.push_back(stringBlock); + return true; + } + + void LoadFromDB() override + { + _dataTableEx = DB2SparseDatabaseLoader(_fileName).Load(_format, _hotfixStatement, IndexTableAdapter<T>(_indexTable), _stringPool); + } + + void LoadStringsFromDB(uint32 locale) override + { + if (!DB2SparseFileLoader::GetFormatLocalizedStringFieldCount(_format)) + return; + + DB2SparseDatabaseLoader(_fileName).LoadStrings(_format, HotfixDatabaseStatements(_hotfixStatement + 1), locale, IndexTableAdapter<T>(_indexTable), _stringPool); + } + + iterator begin() const { return _indexTable.begin(); } + iterator end() const { return _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 index 829c3708221..ec3a95f74b9 100644 --- a/src/server/shared/DataStores/DBCFileLoader.cpp +++ b/src/server/shared/DataStores/DBCFileLoader.cpp @@ -172,17 +172,6 @@ uint32 DBCFileLoader::GetFormatRecordSize(const char* format, int32* index_pos) char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char**& indexTable, uint32 sqlRecordCount, uint32 sqlHighestIndex, char*& sqlDataTable) { - /* - format STRING, NA, FLOAT, NA, INT <=> - struct{ - char* field0, - float field1, - int field2 - }entry; - - this func will generate entry[rows] data; - */ - typedef char* ptr; if (strlen(format) != fieldCount) return NULL; @@ -193,11 +182,11 @@ char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char** if (i >= 0) { - uint32 maxi = 0; + int32 maxi = 0; //find max index for (uint32 y = 0; y < recordCount; ++y) { - uint32 ind = getRecord(y).getUInt(i); + int32 ind = int32(getRecord(y).getUInt(i)); if (ind > maxi) maxi = ind; } @@ -224,7 +213,10 @@ char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char** for (uint32 y = 0; y < recordCount; ++y) { if (i >= 0) - indexTable[getRecord(y).getUInt(i)] = &dataTable[offset]; + { + if (int32(getRecord(y).getUInt(i)) >= 0) + indexTable[getRecord(y).getUInt(i)] = &dataTable[offset]; + } else indexTable[y] = &dataTable[offset]; diff --git a/src/server/shared/DataStores/DBStorageIterator.h b/src/server/shared/DataStores/DBStorageIterator.h index 8148a2a5300..8e7d03f2756 100644 --- a/src/server/shared/DataStores/DBStorageIterator.h +++ b/src/server/shared/DataStores/DBStorageIterator.h @@ -35,8 +35,11 @@ public: } } - T* operator->() { return _index[_pos]; } - T* operator*() { return _index[_pos]; } + uint32 Key() const { return _pos; } + T const* Value() const { return _index[_pos]; } + + T const* operator->() { return _index[_pos]; } + T const* operator*() { return _index[_pos]; } bool operator==(DBStorageIterator const& right) const { /*ASSERT(_index == right._index, "Iterator belongs to a different container")*/ return _pos == right._pos; } bool operator!=(DBStorageIterator const& right) const { return !(*this == right); } |