[7988] Merge branch '310' - Switch to support client version 3.1.3

Thanks to TOM_RUS for most work to make this switch possible ;)
This commit is contained in:
VladimirMangos 2009-06-10 21:13:43 +04:00
commit f7fd6961c1
94 changed files with 2307 additions and 1190 deletions

View file

@ -21,7 +21,7 @@
DROP TABLE IF EXISTS `character_db_version`; DROP TABLE IF EXISTS `character_db_version`;
CREATE TABLE `character_db_version` ( CREATE TABLE `character_db_version` (
`required_7932_01_characters_character_pet` bit(1) default NULL `required_7988_07_characters_characters` bit(1) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB'; ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB';
-- --

View file

@ -23,7 +23,7 @@ DROP TABLE IF EXISTS `db_version`;
CREATE TABLE `db_version` ( CREATE TABLE `db_version` (
`version` varchar(120) default NULL, `version` varchar(120) default NULL,
`creature_ai_version` varchar(120) default NULL, `creature_ai_version` varchar(120) default NULL,
`required_7980_01_mangos_item_required_target` bit(1) default NULL `required_7988_09_mangos_spell_proc_event` bit(1) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';
-- --
@ -13619,7 +13619,7 @@ INSERT INTO spell_chain VALUES
(33043,33042,31661,4,0), (33043,33042,31661,4,0),
(42949,33043,31661,5,0), (42949,33043,31661,5,0),
(42950,42949,31661,6,0), (42950,42949,31661,6,0),
/*FireBlast*/ /*Fire Blast*/
(2136,0,2136,1,0), (2136,0,2136,1,0),
(2137,2136,2136,2,0), (2137,2136,2136,2,0),
(2138,2137,2136,3,0), (2138,2137,2136,3,0),
@ -13631,7 +13631,7 @@ INSERT INTO spell_chain VALUES
(27079,27078,2136,9,0), (27079,27078,2136,9,0),
(42872,27079,2136,10,0), (42872,27079,2136,10,0),
(42873,42872,2136,11,0), (42873,42872,2136,11,0),
/*FireWard*/ /*Fire Ward*/
(543,0,543,1,0), (543,0,543,1,0),
(8457,543,543,2,0), (8457,543,543,2,0),
(8458,8457,543,3,0), (8458,8457,543,3,0),
@ -13656,6 +13656,9 @@ INSERT INTO spell_chain VALUES
(38692,27070,133,14,0), (38692,27070,133,14,0),
(42832,38692,133,15,0), (42832,38692,133,15,0),
(42833,42832,133,16,0), (42833,42832,133,16,0),
/*Fiery Payback*/
(64353,0,64353,1,0),
(64357,64353,64353,2,0),
/*Flamestrike*/ /*Flamestrike*/
(2120,0,2120,1,0), (2120,0,2120,1,0),
(2121,2120,2120,2,0), (2121,2120,2120,2,0),
@ -13921,6 +13924,9 @@ INSERT INTO spell_chain VALUES
(32546,0,32546,1,0), (32546,0,32546,1,0),
(48119,32546,32546,2,0), (48119,32546,32546,2,0),
(48120,48119,32546,3,0), (48120,48119,32546,3,0),
/*Body and Soul*/
(64127,0,64127,1,0),
(64129,64127,64127,2,0),
/*Circle of Healing*/ /*Circle of Healing*/
(34861,0,34861,1,0), (34861,0,34861,1,0),
(34863,34861,34861,2,0), (34863,34861,34861,2,0),
@ -13939,6 +13945,10 @@ INSERT INTO spell_chain VALUES
(25437,19243,19236,7,0), (25437,19243,19236,7,0),
(48172,25437,19236,8,0), (48172,25437,19236,8,0),
(48173,48172,19236,9,0), (48173,48172,19236,9,0),
/*Empowered Renew*/
(63534,0,63534,1,0),
(63542,63534,63534,2,0),
(63543,63542,63534,3,0),
/*FlashHeal*/ /*FlashHeal*/
(2061,0,2061,1,0), (2061,0,2061,1,0),
(9472,2061,2061,2,0), (9472,2061,2061,2,0),
@ -14034,6 +14044,10 @@ INSERT INTO spell_chain VALUES
(20770,10881,2006,5,0), (20770,10881,2006,5,0),
(25435,20770,2006,6,0), (25435,20770,2006,6,0),
(48171,25435,2006,7,0), (48171,25435,2006,7,0),
/*Serendipity*/
(63730,0,63730,1,0),
(63733,63730,63730,2,0),
(63737,63733,63730,3,0),
/*Smite*/ /*Smite*/
(585,0,585,1,0), (585,0,585,1,0),
(591,585,585,2,0), (591,585,585,2,0),
@ -14060,6 +14074,10 @@ INSERT INTO spell_chain VALUES
(25467,19280,2944,7,0), (25467,19280,2944,7,0),
(48299,25467,2944,8,0), (48299,25467,2944,8,0),
(48300,48299,2944,9,0), (48300,48299,2944,9,0),
/*Improved Devouring Plague*/
(63625,0,63625,1,0),
(63626,63625,63625,2,0),
(63627,63626,63625,3,0),
/*Mind Blast*/ /*Mind Blast*/
(8092,0,8092,1,0), (8092,0,8092,1,0),
(8102,8092,8092,2,0), (8102,8092,8092,2,0),
@ -14178,13 +14196,6 @@ INSERT INTO spell_chain VALUES
(26998,9898,99,6,0), (26998,9898,99,6,0),
(48559,26998,99,7,0), (48559,26998,99,7,0),
(48560,48559,99,8,0), (48560,48559,99,8,0),
/*Faerie Fire (Feral)*/
(16857,0,16857,1,0),
(17390,16857,16857,2,0),
(17391,17390,16857,3,0),
(17392,17391,16857,4,0),
(27011,17392,16857,5,0),
(48475,27011,16857,6,0),
/*Ferocious Bite*/ /*Ferocious Bite*/
(22568,0,22568,1,0), (22568,0,22568,1,0),
(22827,22568,22568,2,0), (22827,22568,22568,2,0),
@ -14700,13 +14711,6 @@ INSERT INTO spell_chain VALUES
(49974,49973,49966,9,0), (49974,49973,49966,9,0),
(52475,49974,49966,10,0), (52475,49974,49966,10,0),
(52476,52475,49966,11,0), (52476,52475,49966,11,0),
/*Thunderstomp*/
(26090,0,26090,1,0),
(26187,26090,26090,2,0),
(26188,26187,26090,3,0),
(27063,26188,26090,4,0),
(55572,27063,26090,5,0),
(55573,55572,26090,6,0),
/*------------------ /*------------------
--(217)Pet-Raptor --(217)Pet-Raptor
------------------*/ ------------------*/
@ -15051,6 +15055,12 @@ INSERT INTO spell_chain VALUES
(27149,10293,465,8,0), (27149,10293,465,8,0),
(48941,27149,465,9,0), (48941,27149,465,9,0),
(48942,48941,465,10,0), (48942,48941,465,10,0),
/*Divinity*/
(63646,0,63646,1,0),
(63647,63646,63646,2,0),
(63648,63647,63646,3,0),
(63649,63648,63646,4,0),
(63650,63649,63646,5,0),
/*Fire Resistance Aura*/ /*Fire Resistance Aura*/
(19891,0,19891,1,0), (19891,0,19891,1,0),
(19899,19891,19891,2,0), (19899,19891,19891,2,0),
@ -15108,7 +15118,7 @@ INSERT INTO spell_chain VALUES
(1756,1755,1742,5,0), (1756,1755,1742,5,0),
(16697,1756,1742,6,0), (16697,1756,1742,6,0),
(27048,16697,1742,7,0), (27048,16697,1742,7,0),
/*GreatResistance*/ /*Great Resistance*/
(53427,0,53427,1,0), (53427,0,53427,1,0),
(53429,53427,53427,2,0), (53429,53427,53427,2,0),
(53430,53429,53427,3,0), (53430,53429,53427,3,0),
@ -15122,6 +15132,15 @@ INSERT INTO spell_chain VALUES
(14921,14920,2649,7,0), (14921,14920,2649,7,0),
(27047,14921,2649,8,0), (27047,14921,2649,8,0),
(61676,27047,2649,9,0), (61676,27047,2649,9,0),
/*Shark Attack*/
(62759,0,62759,1,0),
(62760,62759,62759,2,0),
/*Silverback*/
(62764,0,62764,1,0),
(62765,62764,62764,2,0),
/*Wild Hunt*/
(62758,0,62758,1,0),
(62762,62758,62758,2,0),
/*------------------ /*------------------
-- (333) Enchanting -- (333) Enchanting
------------------*/ ------------------*/
@ -15170,6 +15189,9 @@ INSERT INTO spell_chain VALUES
(28172,17728,2362,4,0), (28172,17728,2362,4,0),
(47886,28172,2362,5,0), (47886,28172,2362,5,0),
(47888,47886,2362,6,0), (47888,47886,2362,6,0),
/*Decimation*/
(63156,0,63156,1,0),
(63158,63156,63156,2,0),
/*DemonArmor*/ /*DemonArmor*/
(706,0,706,1,0), (706,0,706,1,0),
(1086,706,706,2,0), (1086,706,706,2,0),
@ -15202,6 +15224,10 @@ INSERT INTO spell_chain VALUES
(11695,11694,755,7,0), (11695,11694,755,7,0),
(27259,11695,755,8,0), (27259,11695,755,8,0),
(47856,27259,755,9,0), (47856,27259,755,9,0),
/*Nemesis*/
(63117,0,63117,1,0),
(63121,63117,63117,2,0),
(63123,63121,63117,3,0),
/*RitualofSouls*/ /*RitualofSouls*/
(29893,0,29893,1,0), (29893,0,29893,1,0),
(58887,29893,29893,2,0), (58887,29893,29893,2,0),
@ -15240,13 +15266,6 @@ INSERT INTO spell_chain VALUES
(603,0,603,1,0), (603,0,603,1,0),
(30910,603,603,2,0), (30910,603,603,2,0),
(47867,30910,603,3,0), (47867,30910,603,3,0),
/*Curse of Recklessness*/
(704,0,704,1,0),
(7658,704,704,2,0),
(7659,7658,704,3,0),
(11717,7659,704,4,0),
(27226,11717,704,5,0),
(57595,27226,704,6,0),
/*Curse of the Elements*/ /*Curse of the Elements*/
(1490,0,1490,1,0), (1490,0,1490,1,0),
(11721,1490,1490,2,0), (11721,1490,1490,2,0),
@ -15312,15 +15331,6 @@ INSERT INTO spell_chain VALUES
(27243,0,27243,1,0), (27243,0,27243,1,0),
(47835,27243,27243,2,0), (47835,27243,27243,2,0),
(47836,47835,27243,3,0), (47836,47835,27243,3,0),
/*SiphonLife*/
(18265,0,18265,1,0),
(18879,18265,18265,2,0),
(18880,18879,18265,3,0),
(18881,18880,18265,4,0),
(27264,18881,18265,5,0),
(30911,27264,18265,6,0),
(47861,30911,18265,7,0),
(47862,47861,18265,8,0),
/*UnstableAffliction*/ /*UnstableAffliction*/
(30108,0,30108,1,0), (30108,0,30108,1,0),
(30404,30108,30108,2,0), (30404,30108,30108,2,0),
@ -15384,6 +15394,9 @@ INSERT INTO spell_chain VALUES
(58794,25500,8033,7,0), (58794,25500,8033,7,0),
(58795,58794,8033,8,0), (58795,58794,8033,8,0),
(58796,58795,8033,9,0), (58796,58795,8033,9,0),
/*Frozen Power*/
(63373,0,63373,1,0),
(63374,63373,63373,2,0),
/*Life Tap*/ /*Life Tap*/
(1454,0,1454,1,0), (1454,0,1454,1,0),
(1455,1454,1454,2,0), (1455,1454,1454,2,0),
@ -15540,6 +15553,9 @@ INSERT INTO spell_chain VALUES
/*------------------ /*------------------
-- (375) Elemental Combat -- (375) Elemental Combat
------------------*/ ------------------*/
/*Booming Echoes*/
(63370,0,63370,1,0),
(63372,63370,63370,2,0),
/*Chain Lightning*/ /*Chain Lightning*/
(421,0,421,1,0), (421,0,421,1,0),
(930,421,421,2,0), (930,421,421,2,0),
@ -15690,6 +15706,9 @@ INSERT INTO spell_chain VALUES
(26979,26978,5185,13,0), (26979,26978,5185,13,0),
(48377,26979,5185,14,0), (48377,26979,5185,14,0),
(48378,48377,5185,15,0), (48378,48377,5185,15,0),
/*Improved Barkskin*/
(63410,0,63410,1,0),
(63411,63410,63410,2,0),
/*Lifebloom*/ /*Lifebloom*/
(33763,0,33763,1,0), (33763,0,33763,1,0),
(48450,33763,33763,2,0), (48450,33763,33763,2,0),
@ -15785,13 +15804,6 @@ INSERT INTO spell_chain VALUES
(17329,16813,16689,6,9853), (17329,16813,16689,6,9853),
(27009,17329,16689,7,26989), (27009,17329,16689,7,26989),
(53312,27009,16689,8,53308), (53312,27009,16689,8,53308),
/*FaerieFire*/
(770,0,770,1,0),
(778,770,770,2,0),
(9749,778,770,3,0),
(9907,9749,770,4,0),
(26993,9907,770,5,0),
(48476,26993,770,6,0),
/*Hibernate*/ /*Hibernate*/
(2637,0,2637,1,0), (2637,0,2637,1,0),
(18657,2637,2637,2,0), (18657,2637,2637,2,0),
@ -15892,15 +15904,6 @@ INSERT INTO spell_chain VALUES
(59170,50796,50796,2,0), (59170,50796,50796,2,0),
(59171,59170,50796,3,0), (59171,59170,50796,3,0),
(59172,59171,50796,4,0), (59172,59171,50796,4,0),
/*Conflagrate*/
(17962,0,17962,1,0),
(18930,17962,17962,2,0),
(18931,18930,17962,3,0),
(18932,18931,17962,4,0),
(27266,18932,17962,5,0),
(30912,27266,17962,6,0),
(47828,30912,17962,7,0),
(47829,47828,17962,8,0),
/*Hellfire*/ /*Hellfire*/
(1949,0,1949,1,0), (1949,0,1949,1,0),
(11683,1949,1949,2,0), (11683,1949,1949,2,0),
@ -15924,6 +15927,10 @@ INSERT INTO spell_chain VALUES
(32231,29722,29722,2,0), (32231,29722,29722,2,0),
(47837,32231,29722,3,0), (47837,32231,29722,3,0),
(47838,47837,29722,4,0), (47838,47837,29722,4,0),
/*Molten Skin*/
(63349,0,63349,1,0),
(63350,63349,63349,2,0),
(63351,63350,63349,3,0),
/*RainofFire*/ /*RainofFire*/
(5740,0,5740,1,0), (5740,0,5740,1,0),
(6219,5740,5740,2,0), (6219,5740,5740,2,0),
@ -16087,6 +16094,10 @@ INSERT INTO spell_chain VALUES
(27841,14819,14752,4,0), (27841,14819,14752,4,0),
(25312,27841,14752,5,0), (25312,27841,14752,5,0),
(48073,25312,14752,6,0), (48073,25312,14752,6,0),
/*Improved Flash Heal*/
(63504,0,63504,1,0),
(63505,63504,63504,2,0),
(63506,63505,63504,3,0),
/*InnerFire*/ /*InnerFire*/
(588,0,588,1,0), (588,0,588,1,0),
(7128,588,588,2,0), (7128,588,588,2,0),
@ -16239,7 +16250,7 @@ INSERT INTO spell_chain VALUES
/*------------------ /*------------------
--(770)Blood --(770)Blood
------------------*/ ------------------*/
/*BloodBoil*/ /*Blood Boil*/
(48721,0,48721,1,0), (48721,0,48721,1,0),
(49939,48721,48721,2,0), (49939,48721,48721,2,0),
(49940,49939,48721,3,0), (49940,49939,48721,3,0),
@ -16251,14 +16262,26 @@ INSERT INTO spell_chain VALUES
(49928,49927,45902,4,0), (49928,49927,45902,4,0),
(49929,49928,45902,5,0), (49929,49928,45902,5,0),
(49930,49929,45902,6,0), (49930,49929,45902,6,0),
/*HeartStrike*/ /*Death Coil*/
(62900,0,62900,1,0),
(62901,62900,62900,2,0),
(62902,62901,62900,3,0),
(62903,62902,62900,4,0),
(62904,62903,62900,5,0),
/*Heart Strike*/
(55050,0,55050,1,0), (55050,0,55050,1,0),
(55258,55050,55050,2,0), (55258,55050,55050,2,0),
(55259,55258,55050,3,0), (55259,55258,55050,3,0),
(55260,55259,55050,4,0), (55260,55259,55050,4,0),
(55261,55260,55050,5,0), (55261,55260,55050,5,0),
(55262,55261,55050,6,0), (55262,55261,55050,6,0),
/*ImprovedRuneTap*/ /*Improved Blood Presence*/
(50365,0,50365,1,0),
(50371,50365,50365,2,0),
/*Improved Death Strike*/
(62905,0,62905,1,0),
(62908,62905,62905,2,0),
/*Improved Rune Tap*/
(48985,0,48985,1,0), (48985,0,48985,1,0),
(49488,48985,48985,2,0), (49488,48985,48985,2,0),
(49489,49488,48985,3,0), (49489,49488,48985,3,0),
@ -16291,12 +16314,11 @@ INSERT INTO spell_chain VALUES
/*HornofWinter*/ /*HornofWinter*/
(57330,0,57330,1,0), (57330,0,57330,1,0),
(57623,57330,57330,2,0), (57623,57330,57330,2,0),
/*HowlingBlast*/ /*Howling Blast*/
(49184,0,49184,1,0), (49184,0,49184,1,0),
(51408,49184,49184,2,0), (51409,49184,49184,2,0),
(51409,51408,49184,3,0), (51410,51409,49184,3,0),
(51410,51409,49184,4,0), (51411,51410,49184,4,0),
(51411,51410,49184,5,0),
/*IcyTalons*/ /*IcyTalons*/
(50880,0,50880,1,0), (50880,0,50880,1,0),
(50884,50880,50880,2,0), (50884,50880,50880,2,0),
@ -16309,7 +16331,10 @@ INSERT INTO spell_chain VALUES
(49903,49896,45477,3,0), (49903,49896,45477,3,0),
(49904,49903,45477,4,0), (49904,49903,45477,4,0),
(49909,49904,45477,5,0), (49909,49904,45477,5,0),
/*ImprovedIcyTouch*/ /*Improved Frost Presence*/
(50384,0,50384,1,0),
(50385,50384,50384,2,0),
/*Improved Icy Touch*/
(49175,0,49175,1,0), (49175,0,49175,1,0),
(50031,49175,49175,2,0), (50031,49175,49175,2,0),
(51456,50031,49175,3,0), (51456,50031,49175,3,0),
@ -16332,7 +16357,7 @@ INSERT INTO spell_chain VALUES
(49936,43265,43265,2,0), (49936,43265,43265,2,0),
(49937,49936,43265,3,0), (49937,49936,43265,3,0),
(49938,49937,43265,4,0), (49938,49937,43265,4,0),
/*DeathCoil*/ /*Death Coil*/
(47541,0,47541,1,0), (47541,0,47541,1,0),
(49892,47541,47541,2,0), (49892,47541,47541,2,0),
(49893,49892,47541,3,0), (49893,49892,47541,3,0),
@ -16344,12 +16369,13 @@ INSERT INTO spell_chain VALUES
(45463,49999,49998,3,0), (45463,49999,49998,3,0),
(49923,45463,49998,4,0), (49923,45463,49998,4,0),
(49924,49923,49998,5,0), (49924,49923,49998,5,0),
/*MagicSuppression*/ /*Improved Unholy Presence*/
(50391,0,50391,1,0),
(50392,50391,50391,2,0),
/*Magic Suppression*/
(49224,0,49224,1,0), (49224,0,49224,1,0),
(49610,49224,49224,2,0), (49610,49224,49224,2,0),
(49611,49610,49224,3,0), (49611,49610,49224,3,0),
(49612,49611,49224,4,0),
(49614,49612,49224,5,0),
/*Outbreak*/ /*Outbreak*/
(49013,0,49013,1,0), (49013,0,49013,1,0),
(55236,49013,49013,2,0), (55236,49013,49013,2,0),
@ -16856,13 +16882,8 @@ INSERT INTO `spell_proc_event` VALUES
(14892, 0x00000000, 6, 0x10001E00, 0x00010004, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (14892, 0x00000000, 6, 0x10001E00, 0x00010004, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(15088, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (15088, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(15128, 0x00000004, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (15128, 0x00000004, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(15268, 0x00000020, 6, 0x06080000, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(15277, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 6.000000, 0.000000, 0), (15277, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 6.000000, 0.000000, 0),
(15286, 0x00000020, 6, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (15286, 0x00000020, 6, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(15323, 0x00000020, 6, 0x06080000, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(15324, 0x00000020, 6, 0x06080000, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(15325, 0x00000020, 6, 0x06080000, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(15326, 0x00000020, 6, 0x06080000, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(15337, 0x00000000, 6, 0x00002000, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (15337, 0x00000000, 6, 0x00002000, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(15338, 0x00000000, 6, 0x00002000, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (15338, 0x00000000, 6, 0x00002000, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(15346, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 6.000000, 0.000000, 0), (15346, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 6.000000, 0.000000, 0),
@ -16907,12 +16928,7 @@ INSERT INTO `spell_proc_event` VALUES
(17364, 0x00000008, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (17364, 0x00000008, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(17495, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0), (17495, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
(17793, 0x00000000, 5, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (17793, 0x00000000, 5, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(17794, 0x00000020, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0.000000, 0.000000, 0),
(17796, 0x00000000, 5, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (17796, 0x00000000, 5, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(17797, 0x00000020, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(17798, 0x00000020, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(17799, 0x00000020, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(17800, 0x00000020, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(17801, 0x00000000, 5, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (17801, 0x00000000, 5, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(17802, 0x00000000, 5, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (17802, 0x00000000, 5, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(17803, 0x00000000, 5, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (17803, 0x00000000, 5, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
@ -16924,9 +16940,6 @@ INSERT INTO `spell_proc_event` VALUES
(18120, 0x00000000, 5, 0x000003E5, 0x000010C0, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (18120, 0x00000000, 5, 0x000003E5, 0x000010C0, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(18820, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0), (18820, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
(19184, 0x00000000, 9, 0x00000014, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (19184, 0x00000000, 9, 0x00000014, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(19228, 0x00000000, 0, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(19232, 0x00000000, 9, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(19233, 0x00000000, 9, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(19387, 0x00000000, 9, 0x00000014, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (19387, 0x00000000, 9, 0x00000014, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(19388, 0x00000000, 9, 0x00000014, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (19388, 0x00000000, 9, 0x00000014, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(19572, 0x00000000, 9, 0x00800000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0), (19572, 0x00000000, 9, 0x00800000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0),
@ -17059,20 +17072,14 @@ INSERT INTO `spell_proc_event` VALUES
(30675, 0x00000000, 11, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (30675, 0x00000000, 11, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(30678, 0x00000000, 11, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (30678, 0x00000000, 11, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(30679, 0x00000000, 11, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (30679, 0x00000000, 11, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(30680, 0x00000000, 11, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(30681, 0x00000000, 11, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(30701, 0x0000001C, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (30701, 0x0000001C, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(30705, 0x0000001C, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (30705, 0x0000001C, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(30802, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (30802, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(30803, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (30803, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(30804, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (30804, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(30805, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (30805, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(30806, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(30807, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(30808, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (30808, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(30809, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (30809, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(30810, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(30811, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(30823, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 10.500000, 0.000000, 0), (30823, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 10.500000, 0.000000, 0),
(30881, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 5), (30881, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 5),
(30883, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 5), (30883, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 5),
@ -17179,7 +17186,6 @@ INSERT INTO `spell_proc_event` VALUES
(35086, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60), (35086, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60),
(35100, 0x00000000, 9, 0x00003001, 0x00000000, 0x00000000, 0x00010140, 0x00000000, 0.000000, 0.000000, 0), (35100, 0x00000000, 9, 0x00003001, 0x00000000, 0x00000000, 0x00010140, 0x00000000, 0.000000, 0.000000, 0),
(35102, 0x00000000, 9, 0x00003001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (35102, 0x00000000, 9, 0x00003001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(35103, 0x00000000, 9, 0x00003001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(35121, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (35121, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(36096, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800, 0.000000, 0.000000, 0), (36096, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800, 0.000000, 0.000000, 0),
(36111, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (36111, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
@ -17324,9 +17330,6 @@ INSERT INTO `spell_proc_event` VALUES
(47203, 0x00000000, 5, 0x00000008, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (47203, 0x00000000, 5, 0x00000008, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(47204, 0x00000000, 5, 0x00000008, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (47204, 0x00000000, 5, 0x00000008, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(47205, 0x00000000, 5, 0x00000008, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (47205, 0x00000000, 5, 0x00000008, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(47232, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(47234, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(47235, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(47245, 0x00000020, 5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (47245, 0x00000020, 5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(47246, 0x00000020, 5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (47246, 0x00000020, 5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(47247, 0x00000020, 5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (47247, 0x00000020, 5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
@ -17344,15 +17347,6 @@ INSERT INTO `spell_proc_event` VALUES
(47535, 0x00000000, 6, 0x00001800, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (47535, 0x00000000, 6, 0x00001800, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(47536, 0x00000000, 6, 0x00001800, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (47536, 0x00000000, 6, 0x00001800, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(47537, 0x00000000, 6, 0x00001800, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (47537, 0x00000000, 6, 0x00001800, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(47538, 0x00000000, 6, 0x00001800, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(47539, 0x00000000, 6, 0x00001800, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(47549, 0x00000000, 6, 0x00000000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(47551, 0x00000000, 6, 0x00000000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(47552, 0x00000000, 6, 0x00000000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(47555, 0x00000000, 6, 0x00001800, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(47556, 0x00000000, 6, 0x00001800, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(47557, 0x00000000, 6, 0x00001800, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(47572, 0x00000000, 6, 0x00010000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(47580, 0x00000000, 6, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0x00010000, 0.000000, 0.000000, 0), (47580, 0x00000000, 6, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
(47581, 0x00000000, 6, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0x00010000, 0.000000, 0.000000, 0), (47581, 0x00000000, 6, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
(47582, 0x00000000, 6, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0x00010000, 0.000000, 0.000000, 0), (47582, 0x00000000, 6, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
@ -17393,8 +17387,6 @@ INSERT INTO `spell_proc_event` VALUES
(49504, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (49504, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(49529, 0x00000000, 15, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (49529, 0x00000000, 15, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(49530, 0x00000000, 15, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (49530, 0x00000000, 15, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(49531, 0x00000000, 15, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(49532, 0x00000000, 15, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(49622, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60), (49622, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60),
(49657, 0x00000000, 15, 0x00000000, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (49657, 0x00000000, 15, 0x00000000, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(50781, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (50781, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
@ -17478,13 +17470,9 @@ INSERT INTO `spell_proc_event` VALUES
(53290, 0x00000000, 9, 0x00000800, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53290, 0x00000000, 9, 0x00000800, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53291, 0x00000000, 9, 0x00000800, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53291, 0x00000000, 9, 0x00000800, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53292, 0x00000000, 9, 0x00000800, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53292, 0x00000000, 9, 0x00000800, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53293, 0x00000000, 9, 0x00000800, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53294, 0x00000000, 9, 0x00000800, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53380, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53380, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53381, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53381, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53382, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53382, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53383, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53384, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53486, 0x00000000, 10, 0x00800000, 0x00028000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53486, 0x00000000, 10, 0x00800000, 0x00028000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53488, 0x00000000, 10, 0x00800000, 0x00028000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53488, 0x00000000, 10, 0x00800000, 0x00028000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53501, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53501, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
@ -17517,8 +17505,6 @@ INSERT INTO `spell_proc_event` VALUES
(54939, 0x00000000, 10, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (54939, 0x00000000, 10, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(55380, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), (55380, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45),
(55440, 0x00000000, 11, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (55440, 0x00000000, 11, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(55620, 0x00000000, 15, 0x00000001, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(55623, 0x00000000, 15, 0x00000001, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(55640, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), (55640, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45),
(55666, 0x00000000, 15, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (55666, 0x00000000, 15, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(55667, 0x00000000, 15, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (55667, 0x00000000, 15, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
@ -17531,9 +17517,6 @@ INSERT INTO `spell_proc_event` VALUES
(55768, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), (55768, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45),
(55776, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), (55776, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45),
(56218, 0x00000000, 5, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (56218, 0x00000000, 5, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(56333, 0x00000000, 9, 0x00000004, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(56336, 0x00000000, 9, 0x00000004, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(56337, 0x00000000, 9, 0x00000004, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(56342, 0x00000000, 9, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (56342, 0x00000000, 9, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(56343, 0x00000000, 9, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (56343, 0x00000000, 9, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(56344, 0x00000000, 9, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (56344, 0x00000000, 9, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
@ -17560,8 +17543,6 @@ INSERT INTO `spell_proc_event` VALUES
(58372, 0x00000000, 4, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (58372, 0x00000000, 4, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(58386, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0.000000, 0.000000, 0), (58386, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0.000000, 0.000000, 0),
(58435, 0x00000000, 5, 0x00000002, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (58435, 0x00000000, 5, 0x00000002, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(58436, 0x00000000, 5, 0x00000002, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(58437, 0x00000000, 5, 0x00000002, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(58616, 0x00000000, 15, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (58616, 0x00000000, 15, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(58620, 0x00000000, 15, 0x00000000, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (58620, 0x00000000, 15, 0x00000000, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(58626, 0x00000000, 15, 0x02000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (58626, 0x00000000, 15, 0x02000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
@ -17820,7 +17801,6 @@ INSERT INTO `spell_bonus_data` VALUES
('172', '0', '0.3', '0', 'Warlock - Corruption'), ('172', '0', '0.3', '0', 'Warlock - Corruption'),
('348', '0.2', '0.2', '0', 'Warlock - Immolate'), ('348', '0.2', '0.2', '0', 'Warlock - Immolate'),
('27243', '0.22', '0.25', '0', 'Warlock - Seed of Corruption'), ('27243', '0.22', '0.25', '0', 'Warlock - Seed of Corruption'),
('18265', '0', '0.1', '0', 'Warlock - Siphon Life'),
('30108', '0', '0.24', '0', 'Warlock - Unstable Affliction'), ('30108', '0', '0.24', '0', 'Warlock - Unstable Affliction'),
('31117', '1.8', '0', '0', 'Warlock - Unstable Affliction Dispell'), ('31117', '1.8', '0', '0', 'Warlock - Unstable Affliction Dispell'),
('17962', '0.4286', '0', '0', 'Warlock - Conflagrate'), ('17962', '0.4286', '0', '0', 'Warlock - Conflagrate'),

View file

@ -1,4 +1,3 @@
ALTER TABLE db_version CHANGE COLUMN required_7884_02_mangos_playercreateinfo_action required_7886_01_mangos_petcreateinfo_spell bit; ALTER TABLE db_version CHANGE COLUMN required_7884_02_mangos_playercreateinfo_action required_7886_01_mangos_petcreateinfo_spell bit;
DROP TABLE IF EXISTS `petcreateinfo_spell`; DROP TABLE IF EXISTS `petcreateinfo_spell`;

View file

@ -1,4 +1,4 @@
ALTER TABLE db_version CHANGE COLUMN required_7896_01_mangos_creature_template required_7902_01_mangos_pool_creature bit; ALTER TABLE db_version CHANGE COLUMN required_7896_01_mangos_creature_template required_7902_01_mangos_pool_creature bit;
ALTER TABLE `pool_creature` ALTER TABLE `pool_creature`
ADD INDEX `idx_guid`(`guid`); ADD INDEX `idx_guid`(`guid`);

View file

@ -1,4 +1,4 @@
ALTER TABLE db_version CHANGE COLUMN required_7902_01_mangos_pool_creature required_7902_02_mangos_pool_gameobject bit; ALTER TABLE db_version CHANGE COLUMN required_7902_01_mangos_pool_creature required_7902_02_mangos_pool_gameobject bit;
ALTER TABLE `pool_gameobject` ALTER TABLE `pool_gameobject`
ADD INDEX `idx_guid`(`guid`); ADD INDEX `idx_guid`(`guid`);

View file

@ -0,0 +1,12 @@
ALTER TABLE db_version CHANGE COLUMN required_7980_01_mangos_item_required_target required_7988_01_mangos_item_template bit;
alter table `item_template`
drop column `dmg_type3`,
drop column `dmg_max3`,
drop column `dmg_min3`,
drop column `dmg_type4`,
drop column `dmg_max4`,
drop column `dmg_min4`,
drop column `dmg_type5`,
drop column `dmg_max5`,
drop column `dmg_min5`;

View file

@ -0,0 +1,30 @@
ALTER TABLE character_db_version CHANGE COLUMN required_7932_01_characters_character_pet required_7988_02_characters_character_equipmentsets bit;
CREATE TABLE `character_equipmentsets` (
`guid` int(11) NOT NULL default '0',
`setguid` bigint(20) NOT NULL auto_increment,
`setindex` tinyint(4) NOT NULL default '0',
`name` varchar(100) NOT NULL,
`iconname` varchar(100) NOT NULL,
`item0` int(11) NOT NULL default '0',
`item1` int(11) NOT NULL default '0',
`item2` int(11) NOT NULL default '0',
`item3` int(11) NOT NULL default '0',
`item4` int(11) NOT NULL default '0',
`item5` int(11) NOT NULL default '0',
`item6` int(11) NOT NULL default '0',
`item7` int(11) NOT NULL default '0',
`item8` int(11) NOT NULL default '0',
`item9` int(11) NOT NULL default '0',
`item10` int(11) NOT NULL default '0',
`item11` int(11) NOT NULL default '0',
`item12` int(11) NOT NULL default '0',
`item13` int(11) NOT NULL default '0',
`item14` int(11) NOT NULL default '0',
`item15` int(11) NOT NULL default '0',
`item16` int(11) NOT NULL default '0',
`item17` int(11) NOT NULL default '0',
`item18` int(11) NOT NULL default '0',
PRIMARY KEY (`setguid`),
UNIQUE KEY `idx_set` (`guid`,`setguid`,`setindex`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

View file

@ -0,0 +1,140 @@
ALTER TABLE db_version CHANGE COLUMN required_7988_01_mangos_item_template required_7988_03_mangos_spell_chain bit;
DELETE FROM spell_chain WHERE first_spell IN (
704, /* Curse of Recklessness removed */
770, /* Faerie Fire non ranked now */
16857, /* Faerie Fire (Feral) non ranked now */
17962, /* Conflagrate non ranked now */
18265, /* Siphon Life removed (replaced by different talent */
26090, /* Thunderstomp non ranked now (rank 6 only O.o) */
49184, /* Howling Blast skip old rank 2 */
49224 /* Magic Suppression lost 2 ranks */
);
INSERT INTO spell_chain VALUES
/*------------------
--(8)Fire
------------------*/
/*Fiery Payback*/
(64353,0,64353,1,0),
(64357,64353,64353,2,0),
/*------------------
-- (56) Holy (Priest)
------------------*/
/*Body and Soul*/
(64127,0,64127,1,0),
(64129,64127,64127,2,0),
/*Empowered Renew*/
(63534,0,63534,1,0),
(63542,63534,63534,2,0),
(63543,63542,63534,3,0),
/*Serendipity*/
(63730,0,63730,1,0),
(63733,63730,63730,2,0),
(63737,63733,63730,3,0),
/*------------------
-- (78) Shadow Magic
------------------*/
/*Improved Devouring Plague*/
(63625,0,63625,1,0),
(63626,63625,63625,2,0),
(63627,63626,63625,3,0),
/*------------------
-- (267) Protection (Paladin)
------------------*/
/*Divinity*/
(63646,0,63646,1,0),
(63647,63646,63646,2,0),
(63648,63647,63646,3,0),
(63649,63648,63646,4,0),
(63650,63649,63646,5,0),
/*------------------
--(270)Pet-GenericHunter
------------------*/
/*Shark Attack*/
(62759,0,62759,1,0),
(62760,62759,62759,2,0),
/*Silverback*/
(62764,0,62764,1,0),
(62765,62764,62764,2,0),
/*Wild Hunt*/
(62758,0,62758,1,0),
(62762,62758,62758,2,0),
/*------------------
--(354)Demonology
------------------*/
/*Decimation*/
(63156,0,63156,1,0),
(63158,63156,63156,2,0),
/*Nemesis*/
(63117,0,63117,1,0),
(63121,63117,63117,2,0),
(63123,63121,63117,3,0),
/*------------------
--(373) Enhancement
------------------*/
/*Frozen Power*/
(63373,0,63373,1,0),
(63374,63373,63373,2,0),
/*------------------
-- (375) Elemental Combat
------------------*/
/*Booming Echoes*/
(63370,0,63370,1,0),
(63372,63370,63370,2,0),
/*------------------
--(573)Restoration
------------------*/
/*Improved Barkskin*/
(63410,0,63410,1,0),
(63411,63410,63410,2,0),
/*------------------
--(593)Destruction
------------------*/
/*Molten Skin*/
(63349,0,63349,1,0),
(63350,63349,63349,2,0),
(63351,63350,63349,3,0),
/*------------------
--(613)Discipline
------------------*/
/*Improved Flash Heal*/
(63504,0,63504,1,0),
(63505,63504,63504,2,0),
(63506,63505,63504,3,0),
/*------------------
--(770)Blood
------------------*/
/*Death Coil*/
(62900,0,62900,1,0),
(62901,62900,62900,2,0),
(62902,62901,62900,3,0),
(62903,62902,62900,4,0),
(62904,62903,62900,5,0),
/*Improved Blood Presence*/
(50365,0,50365,1,0),
(50371,50365,50365,2,0),
/*Improved Death Strike*/
(62905,0,62905,1,0),
(62908,62905,62905,2,0),
/*------------------
--(771)Frost
------------------*/
/*Howling Blast*/
(49184,0,49184,1,0),
(51409,49184,49184,2,0),
(51410,51409,49184,3,0),
(51411,51410,49184,4,0),
/*Improved Frost Presence*/
(50384,0,50384,1,0),
(50385,50384,50384,2,0),
/*------------------
--(772)Unholy
------------------*/
/*Improved Unholy Presence*/
(50391,0,50391,1,0),
(50392,50391,50391,2,0),
/*Magic Suppression*/
(49224,0,49224,1,0),
(49610,49224,49224,2,0),
(49611,49610,49224,3,0);

View file

@ -0,0 +1,10 @@
ALTER TABLE db_version CHANGE COLUMN required_7988_03_mangos_spell_chain required_7988_04_mangos_creature_template bit;
alter table `creature_template`
add column `unk1` int(11) UNSIGNED DEFAULT '0' NOT NULL after `heroic_entry`,
add column `unk2` int(11) UNSIGNED DEFAULT '0' NOT NULL after `unk1`,
add column `questItem1` int(11) UNSIGNED DEFAULT '0' NOT NULL after `RacialLeader`,
add column `questItem2` int(11) UNSIGNED DEFAULT '0' NOT NULL after `questItem1`,
add column `questItem3` int(11) UNSIGNED DEFAULT '0' NOT NULL after `questItem2`,
add column `questItem4` int(11) UNSIGNED DEFAULT '0' NOT NULL after `questItem3`,
add column `movementId` int(11) UNSIGNED DEFAULT '0' NOT NULL after `questItem4`;

View file

@ -0,0 +1,4 @@
ALTER TABLE db_version CHANGE COLUMN required_7988_04_mangos_creature_template required_7988_05_mangos_item_template bit;
alter table `item_template`
add column `HolidayId` int(11) UNSIGNED DEFAULT '0' NOT NULL after `ItemLimitCategory`;

View file

@ -0,0 +1,8 @@
ALTER TABLE db_version CHANGE COLUMN required_7988_05_mangos_item_template required_7988_06_mangos_gameobject_template bit;
alter table `gameobject_template`
add column `unk1` varchar(100) NOT NULL default '' after `castBarCaption`,
add column `questItem1` int(11) UNSIGNED DEFAULT '0' NOT NULL after `size`,
add column `questItem2` int(11) UNSIGNED DEFAULT '0' NOT NULL after `questItem1`,
add column `questItem3` int(11) UNSIGNED DEFAULT '0' NOT NULL after `questItem2`,
add column `questItem4` int(11) UNSIGNED DEFAULT '0' NOT NULL after `questItem3`;

View file

@ -0,0 +1,38 @@
ALTER TABLE character_db_version CHANGE COLUMN required_7988_02_characters_character_equipmentsets required_7988_07_characters_characters bit;
UPDATE characters SET data = REPLACE(data,' ',' ');
UPDATE characters SET data = CONCAT(TRIM(data),' ');
UPDATE `characters` SET `data` = CONCAT(
SUBSTRING_INDEX(`data`, ' ', 257 + 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 1), ' ', -261 + 260 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18 + 1), ' ', -261 - 18 + 260 + 18 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*2 + 1), ' ', -261 - 18*2 + 260 + 18*2 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*3 + 1), ' ', -261 - 18*3 + 260 + 18*3 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*4 + 1), ' ', -261 - 18*4 + 260 + 18*4 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*5 + 1), ' ', -261 - 18*5 + 260 + 18*5 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*6 + 1), ' ', -261 - 18*6 + 260 + 18*6 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*7 + 1), ' ', -261 - 18*7 + 260 + 18*7 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*8 + 1), ' ', -261 - 18*8 + 260 + 18*8 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*9 + 1), ' ', -261 - 18*9 + 260 + 18*9 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*10 + 1), ' ', -261 - 18*10 + 260 + 18*10 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*11 + 1), ' ', -261 - 18*11 + 260 + 18*11 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*12 + 1), ' ', -261 - 18*12 + 260 + 18*12 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*13 + 1), ' ', -261 - 18*13 + 260 + 18*13 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*14 + 1), ' ', -261 - 18*14 + 260 + 18*14 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*15 + 1), ' ', -261 - 18*15 + 260 + 18*15 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*16 + 1), ' ', -261 - 18*16 + 260 + 18*16 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*17 + 1), ' ', -261 - 18*17 + 260 + 18*17 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*18 + 1), ' ', -261 - 18*18 + 260 + 18*18 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 837 + 1), ' ', -837 + 600 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 937 + 1), ' ', -937 + 874 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 1007 + 1), ' ', -1007 + 1002 - 1), ' ',
'0 0 ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 1688 + 1), ' ', -1688 + 1008 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 1696 + 1), ' ', -1696 + 1691 - 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 1700 + 1), ' ', -1700 + 1699 - 1), ' '
)
WHERE length(SUBSTRING_INDEX(data, ' ', 1700)) < length(data) and length(SUBSTRING_INDEX(data, ' ', 1701)) >= length(data);
UPDATE characters SET data = REPLACE(data,' ',' ');
UPDATE characters SET data = CONCAT(TRIM(data),' ');

View file

@ -0,0 +1,4 @@
ALTER TABLE db_version CHANGE COLUMN required_7988_06_mangos_gameobject_template required_7988_08_mangos_spell_bonus_data bit;
DELETE FROM `spell_bonus_data` WHERE `entry` IN (18265);

View file

@ -0,0 +1,36 @@
ALTER TABLE db_version CHANGE COLUMN required_7988_08_mangos_spell_bonus_data required_7988_09_mangos_spell_proc_event bit;
/* Blackout removed */
DELETE FROM spell_proc_event WHERE entry IN (15268, 15269, 15323, 15324, 15325, 15326);
/* Improved Wing Clip removed */
DELETE FROM spell_proc_event WHERE entry IN (19228, 19232, 19233);
/* Shadow Mastery, not have charges now */
DELETE FROM spell_proc_event WHERE entry IN (17794,17797,17798,17799,17800);
/* Lightning Overload have 3 ranks now, 2 dropped */
DELETE FROM spell_proc_event WHERE entry IN (30680,30681);
/* Unleashed Rage have 3 ranks now, 2 dropped */
DELETE FROM spell_proc_event WHERE entry IN (30806,30807,30810,30811);
/* Concussive Barrage have 2 ranks now, 1 dropped */
DELETE FROM spell_proc_event WHERE entry IN (35103);
/* Demonic Empathy, removed */
DELETE FROM spell_proc_event WHERE entry IN (47232,47234,47235);
/* Rapture have 3 ranks now, 2 dropped */
DELETE FROM spell_proc_event WHERE entry IN (47538,47539);
/* Psychic Horror have 1 rank now, 1 dropped */
DELETE FROM spell_proc_event WHERE entry IN (47572);
/* Sudden Doom have 3 ranks now, 2 dropped */
DELETE FROM spell_proc_event WHERE entry IN (49531,49532);
/* Hunting Party have 3 ranks now, 2 dropped */
DELETE FROM spell_proc_event WHERE entry IN (53293,53294);
/* Righteous Vengeance have 3 ranks now, 2 dropped */
DELETE FROM spell_proc_event WHERE entry IN (53383,53384);
/* Night of the Dead not have charges now */
DELETE FROM spell_proc_event WHERE entry IN (55620,55623);
/* Pandemic have 1 rank, 2 dropped */
DELETE FROM spell_proc_event WHERE entry IN (58436,58437);
/* Improved Holy Concentration, removed */
DELETE FROM spell_proc_event WHERE entry IN (47549,47551,47552);
/* Serendipity, replace by aanother spell ids */
DELETE FROM spell_proc_event WHERE entry IN (47555,47556,47557);
/* T.N.T. non triggring now */
DELETE FROM spell_proc_event WHERE entry IN (56333,56336,56337);

View file

@ -212,6 +212,15 @@ pkgdata_DATA = \
7938_01_realmd_account.sql \ 7938_01_realmd_account.sql \
7945_01_mangos_quest_template.sql \ 7945_01_mangos_quest_template.sql \
7980_01_mangos_item_required_target.sql \ 7980_01_mangos_item_required_target.sql \
7988_01_mangos_item_template.sql \
7988_02_characters_character_equipmentsets.sql \
7988_03_mangos_spell_chain.sql \
7988_04_mangos_creature_template.sql \
7988_05_mangos_item_template.sql \
7988_06_mangos_gameobject_template.sql \
7988_07_characters_characters.sql \
7988_08_mangos_spell_bonus_data.sql \
7988_09_mangos_spell_proc_event.sql \
README README
## Additional files to include when running 'make dist' ## Additional files to include when running 'make dist'
@ -404,4 +413,13 @@ EXTRA_DIST = \
7938_01_realmd_account.sql \ 7938_01_realmd_account.sql \
7945_01_mangos_quest_template.sql \ 7945_01_mangos_quest_template.sql \
7980_01_mangos_item_required_target.sql \ 7980_01_mangos_item_required_target.sql \
7988_01_mangos_item_template.sql \
7988_02_characters_character_equipmentsets.sql \
7988_03_mangos_spell_chain.sql \
7988_04_mangos_creature_template.sql \
7988_05_mangos_item_template.sql \
7988_06_mangos_gameobject_template.sql \
7988_07_characters_characters.sql \
7988_08_mangos_spell_bonus_data.sql \
7988_09_mangos_spell_proc_event.sql \
README README

View file

@ -65,7 +65,7 @@ void WorldSession::HandleBattlemasterHelloOpcode( WorldPacket & recv_data )
void WorldSession::SendBattlegGroundList( uint64 guid, BattleGroundTypeId bgTypeId ) void WorldSession::SendBattlegGroundList( uint64 guid, BattleGroundTypeId bgTypeId )
{ {
WorldPacket data; WorldPacket data;
sBattleGroundMgr.BuildBattleGroundListPacket(&data, guid, _player, bgTypeId); sBattleGroundMgr.BuildBattleGroundListPacket(&data, guid, _player, bgTypeId, 0);
SendPacket( &data ); SendPacket( &data );
} }
@ -102,13 +102,6 @@ void WorldSession::HandleBattlemasterJoinOpcode( WorldPacket & recv_data )
if (_player->InBattleGround()) if (_player->InBattleGround())
return; return;
Creature *unit = GetPlayer()->GetMap()->GetCreature(guid);
if (!unit)
return;
if(!unit->isBattleMaster()) // it's not battlemaster
return;
// get bg instance or bg template if instance not found // get bg instance or bg template if instance not found
BattleGround *bg = NULL; BattleGround *bg = NULL;
if (instanceId) if (instanceId)
@ -287,13 +280,16 @@ void WorldSession::HandlePVPLogDataOpcode( WorldPacket & /*recv_data*/ )
void WorldSession::HandleBattlefieldListOpcode( WorldPacket &recv_data ) void WorldSession::HandleBattlefieldListOpcode( WorldPacket &recv_data )
{ {
CHECK_PACKET_SIZE(recv_data, 4); CHECK_PACKET_SIZE(recv_data, 4 + 1);
sLog.outDebug( "WORLD: Recvd CMSG_BATTLEFIELD_LIST Message"); sLog.outDebug( "WORLD: Recvd CMSG_BATTLEFIELD_LIST Message");
uint32 bgTypeId; uint32 bgTypeId;
recv_data >> bgTypeId; // id from DBC recv_data >> bgTypeId; // id from DBC
uint8 fromWhere;
recv_data >> fromWhere; // 0 - battlemaster, 1 - UI
BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId); BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId);
if (!bl) if (!bl)
{ {
@ -302,7 +298,7 @@ void WorldSession::HandleBattlefieldListOpcode( WorldPacket &recv_data )
} }
WorldPacket data; WorldPacket data;
sBattleGroundMgr.BuildBattleGroundListPacket(&data, _player->GetGUID(), _player, BattleGroundTypeId(bgTypeId)); sBattleGroundMgr.BuildBattleGroundListPacket(&data, 0, _player, BattleGroundTypeId(bgTypeId), fromWhere);
SendPacket( &data ); SendPacket( &data );
} }

View file

@ -1304,7 +1304,8 @@ void BattleGroundMgr::BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg)
for(int i = 1; i >= 0; --i) for(int i = 1; i >= 0; --i)
{ {
*data << uint32(bg->m_ArenaTeamRatingChanges[i]); *data << uint32(bg->m_ArenaTeamRatingChanges[i]);
*data << uint32(3999); // huge thanks for TOM_RUS for this! *data << uint32(3999); // huge thanks for TOM_RUS for this!
*data << uint32(0); // added again in 3.1
sLog.outDebug("rating change: %d", bg->m_ArenaTeamRatingChanges[i]); sLog.outDebug("rating change: %d", bg->m_ArenaTeamRatingChanges[i]);
} }
for(int i = 1; i >= 0; --i) for(int i = 1; i >= 0; --i)
@ -1820,7 +1821,7 @@ void BattleGroundMgr::DistributeArenaPoints()
sWorld.SendWorldText(LANG_DIST_ARENA_POINTS_END); sWorld.SendWorldText(LANG_DIST_ARENA_POINTS_END);
} }
void BattleGroundMgr::BuildBattleGroundListPacket(WorldPacket *data, const uint64& guid, Player* plr, BattleGroundTypeId bgTypeId) void BattleGroundMgr::BuildBattleGroundListPacket(WorldPacket *data, const uint64& guid, Player* plr, BattleGroundTypeId bgTypeId, uint8 fromWhere)
{ {
if (!plr) if (!plr)
return; return;
@ -1830,15 +1831,16 @@ void BattleGroundMgr::BuildBattleGroundListPacket(WorldPacket *data, const uint6
data->Initialize(SMSG_BATTLEFIELD_LIST); data->Initialize(SMSG_BATTLEFIELD_LIST);
*data << uint64(guid); // battlemaster guid *data << uint64(guid); // battlemaster guid
*data << uint8(fromWhere); // from where you joined
*data << uint32(bgTypeId); // battleground id *data << uint32(bgTypeId); // battleground id
if(bgTypeId == BATTLEGROUND_AA) // arena if(bgTypeId == BATTLEGROUND_AA) // arena
{ {
*data << uint8(5); // unk *data << uint8(4); // unk
*data << uint32(0); // unk *data << uint32(0); // unk (count?)
} }
else // battleground else // battleground
{ {
*data << uint8(0x00); // unk *data << uint8(0x00); // unk, different for each bg type
size_t count_pos = data->wpos(); size_t count_pos = data->wpos();
uint32 count = 0; uint32 count = 0;

View file

@ -185,7 +185,7 @@ class BattleGroundMgr
/* Packet Building */ /* Packet Building */
void BuildPlayerJoinedBattleGroundPacket(WorldPacket *data, Player *plr); void BuildPlayerJoinedBattleGroundPacket(WorldPacket *data, Player *plr);
void BuildPlayerLeftBattleGroundPacket(WorldPacket *data, const uint64& guid); void BuildPlayerLeftBattleGroundPacket(WorldPacket *data, const uint64& guid);
void BuildBattleGroundListPacket(WorldPacket *data, const uint64& guid, Player *plr, BattleGroundTypeId bgTypeId); void BuildBattleGroundListPacket(WorldPacket *data, const uint64& guid, Player *plr, BattleGroundTypeId bgTypeId, uint8 fromWhere);
void BuildGroupJoinedBattlegroundPacket(WorldPacket *data, BattleGroundTypeId bgTypeId); void BuildGroupJoinedBattlegroundPacket(WorldPacket *data, BattleGroundTypeId bgTypeId);
void BuildUpdateWorldStatePacket(WorldPacket *data, uint32 field, uint32 value); void BuildUpdateWorldStatePacket(WorldPacket *data, uint32 field, uint32 value);
void BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg); void BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg);

View file

@ -74,78 +74,171 @@ void WorldSession::HandleCalendarGetEvent(WorldPacket &recv_data)
{ {
sLog.outDebug("WORLD: CMSG_CALENDAR_GET_EVENT"); sLog.outDebug("WORLD: CMSG_CALENDAR_GET_EVENT");
recv_data.hexlike(); recv_data.hexlike();
//uint64 unk1;
//recv_data >> (uint64)unk1;
} }
void WorldSession::HandleCalendarGuildFilter(WorldPacket &recv_data) void WorldSession::HandleCalendarGuildFilter(WorldPacket &recv_data)
{ {
sLog.outDebug("WORLD: CMSG_CALENDAR_GUILD_FILTER"); sLog.outDebug("WORLD: CMSG_CALENDAR_GUILD_FILTER");
recv_data.hexlike(); recv_data.hexlike();
//uint32 unk1, unk2, unk3;
//recv_data >> (uint32)unk1;
//recv_data >> (uint32)unk2;
//recv_data >> (uint32)unk3;
} }
void WorldSession::HandleCalendarArenaTeam(WorldPacket &recv_data) void WorldSession::HandleCalendarArenaTeam(WorldPacket &recv_data)
{ {
sLog.outDebug("WORLD: CMSG_CALENDAR_ARENA_TEAM"); sLog.outDebug("WORLD: CMSG_CALENDAR_ARENA_TEAM");
recv_data.hexlike(); recv_data.hexlike();
//uint32 unk;
//recv_data >> (uint32)unk;
} }
void WorldSession::HandleCalendarAddEvent(WorldPacket &recv_data) void WorldSession::HandleCalendarAddEvent(WorldPacket &recv_data)
{ {
sLog.outDebug("WORLD: CMSG_CALENDAR_ADD_EVENT"); sLog.outDebug("WORLD: CMSG_CALENDAR_ADD_EVENT");
recv_data.hexlike(); recv_data.hexlike();
//std::string unk1, unk2;
//recv_data >> (std::string)unk1;
//recv_data >> (std::string)unk2;
//uint8 unk3, unk4;
//uint32 unk5, unk6, unk7, unk8, unk9, count = 0;
//recv_data >> (uint8)unk3;
//recv_data >> (uint8)unk4;
//recv_data >> (uint32)unk5;
//recv_data >> (uint32)unk6;
//recv_data >> (uint32)unk7;
//recv_data >> (uint32)unk8;
//recv_data >> (uint32)unk9;
//if (!((unk9 >> 6) & 1))
//{
// recv_data >> (uint32)count;
// if (count)
// {
// uint8 unk12,unk13;
// uint64 guid;
// for (int i=0;i<count;i++)
// {
// recv_data.readPackGUID(guid);
// recv_data >> (uint8)unk12;
// recv_data >> (uint8)unk13;
// }
// }
//}
} }
void WorldSession::HandleCalendarUpdateEvent(WorldPacket &recv_data) void WorldSession::HandleCalendarUpdateEvent(WorldPacket &recv_data)
{ {
sLog.outDebug("WORLD: CMSG_CALENDAR_UPDATE_EVENT"); sLog.outDebug("WORLD: CMSG_CALENDAR_UPDATE_EVENT");
recv_data.hexlike(); recv_data.hexlike();
//recv_data >> uint64
//recv_data >> uint64
//recv_data >> std::string
//recv_data >> std::string
//recv_data >> uint8
//recv_data >> uint8
//recv_data >> uint32
//recv_data >> uint32
//recv_data >> uint32
//recv_data >> uint32
//recv_data >> uint32
} }
void WorldSession::HandleCalendarRemoveEvent(WorldPacket &recv_data) void WorldSession::HandleCalendarRemoveEvent(WorldPacket &recv_data)
{ {
sLog.outDebug("WORLD: CMSG_CALENDAR_REMOVE_EVENT"); sLog.outDebug("WORLD: CMSG_CALENDAR_REMOVE_EVENT");
recv_data.hexlike(); recv_data.hexlike();
//recv_data >> uint64
//recv_data >> uint64
//recv_data >> uint32
} }
void WorldSession::HandleCalendarCopyEvent(WorldPacket &recv_data) void WorldSession::HandleCalendarCopyEvent(WorldPacket &recv_data)
{ {
sLog.outDebug("WORLD: CMSG_CALENDAR_COPY_EVENT"); sLog.outDebug("WORLD: CMSG_CALENDAR_COPY_EVENT");
recv_data.hexlike(); recv_data.hexlike();
//recv_data >> uint64
//recv_data >> uint64
//recv_data >> uint32
} }
void WorldSession::HandleCalendarEventInvite(WorldPacket &recv_data) void WorldSession::HandleCalendarEventInvite(WorldPacket &recv_data)
{ {
sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_INVITE"); sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_INVITE");
recv_data.hexlike(); recv_data.hexlike();
//recv_data >> uint64
//recv_data >> uint64
//recv_data >> std::string
//recv_data >> uint8
//recv_data >> uint8
} }
void WorldSession::HandleCalendarEventRsvp(WorldPacket &recv_data) void WorldSession::HandleCalendarEventRsvp(WorldPacket &recv_data)
{ {
sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_RSVP"); sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_RSVP");
recv_data.hexlike(); recv_data.hexlike();
//recv_data >> uint64
//recv_data >> uint64
//recv_data >> uint32
} }
void WorldSession::HandleCalendarEventRemoveInvite(WorldPacket &recv_data) void WorldSession::HandleCalendarEventRemoveInvite(WorldPacket &recv_data)
{ {
sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_REMOVE_INVITE"); sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_REMOVE_INVITE");
recv_data.hexlike(); recv_data.hexlike();
//recv_data.readPackGUID(guid)
//recv_data >> uint64
//recv_data >> uint64
//recv_data >> uint64
} }
void WorldSession::HandleCalendarEventStatus(WorldPacket &recv_data) void WorldSession::HandleCalendarEventStatus(WorldPacket &recv_data)
{ {
sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_STATUS"); sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_STATUS");
recv_data.hexlike(); recv_data.hexlike();
//recv_data.readPackGUID(guid)
//recv_data >> uint64
//recv_data >> uint64
//recv_data >> uint64
//recv_data >> uint32
} }
void WorldSession::HandleCalendarEventModeratorStatus(WorldPacket &recv_data) void WorldSession::HandleCalendarEventModeratorStatus(WorldPacket &recv_data)
{ {
sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_MODERATOR_STATUS"); sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_MODERATOR_STATUS");
recv_data.hexlike(); recv_data.hexlike();
//recv_data.readPackGUID(guid)
//recv_data >> uint64
//recv_data >> uint64
//recv_data >> uint64
//recv_data >> uint32
} }
void WorldSession::HandleCalendarComplain(WorldPacket &recv_data) void WorldSession::HandleCalendarComplain(WorldPacket &recv_data)
{ {
sLog.outDebug("WORLD: CMSG_CALENDAR_COMPLAIN"); sLog.outDebug("WORLD: CMSG_CALENDAR_COMPLAIN");
recv_data.hexlike(); recv_data.hexlike();
//recv_data >> uint64
//recv_data >> uint64
//recv_data >> uint64
} }
void WorldSession::HandleCalendarGetNumPending(WorldPacket &recv_data) void WorldSession::HandleCalendarGetNumPending(WorldPacket &recv_data)

View file

@ -66,7 +66,6 @@ bool LoginQueryHolder::Initialize()
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADSPELLS, "SELECT spell,active,disabled FROM character_spell WHERE guid = '%u'", GUID_LOPART(m_guid)); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADSPELLS, "SELECT spell,active,disabled FROM character_spell WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADQUESTSTATUS, "SELECT quest,status,rewarded,explored,timer,mobcount1,mobcount2,mobcount3,mobcount4,itemcount1,itemcount2,itemcount3,itemcount4 FROM character_queststatus WHERE guid = '%u'", GUID_LOPART(m_guid)); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADQUESTSTATUS, "SELECT quest,status,rewarded,explored,timer,mobcount1,mobcount2,mobcount3,mobcount4,itemcount1,itemcount2,itemcount3,itemcount4 FROM character_queststatus WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS,"SELECT quest,time FROM character_queststatus_daily WHERE guid = '%u'", GUID_LOPART(m_guid)); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS,"SELECT quest,time FROM character_queststatus_daily WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADTUTORIALS, "SELECT tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7 FROM character_tutorial WHERE account = '%u' AND realmid = '%u'", GetAccountId(), realmID);
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADREPUTATION, "SELECT faction,standing,flags FROM character_reputation WHERE guid = '%u'", GUID_LOPART(m_guid)); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADREPUTATION, "SELECT faction,standing,flags FROM character_reputation WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADINVENTORY, "SELECT data,bag,slot,item,item_template FROM character_inventory JOIN item_instance ON character_inventory.item = item_instance.guid WHERE character_inventory.guid = '%u' ORDER BY bag,slot", GUID_LOPART(m_guid)); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADINVENTORY, "SELECT data,bag,slot,item,item_template FROM character_inventory JOIN item_instance ON character_inventory.item = item_instance.guid WHERE character_inventory.guid = '%u' ORDER BY bag,slot", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADACTIONS, "SELECT button,action,type,misc FROM character_action WHERE guid = '%u' ORDER BY button", GUID_LOPART(m_guid)); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADACTIONS, "SELECT button,action,type,misc FROM character_action WHERE guid = '%u' ORDER BY button", GUID_LOPART(m_guid));
@ -82,6 +81,7 @@ bool LoginQueryHolder::Initialize()
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADARENAINFO, "SELECT arenateamid, played_week, played_season, personal_rating FROM arena_team_member WHERE guid='%u'", GUID_LOPART(m_guid)); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADARENAINFO, "SELECT arenateamid, played_week, played_season, personal_rating FROM arena_team_member WHERE guid='%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS, "SELECT achievement, date FROM character_achievement WHERE guid = '%u'", GUID_LOPART(m_guid)); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS, "SELECT achievement, date FROM character_achievement WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS,"SELECT criteria, counter, date FROM character_achievement_progress WHERE guid = '%u'", GUID_LOPART(m_guid)); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS,"SELECT criteria, counter, date FROM character_achievement_progress WHERE guid = '%u'", GUID_LOPART(m_guid));
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = '%u' ORDER BY setindex", GUID_LOPART(m_guid));
return res; return res;
} }
@ -717,7 +717,6 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
ObjectAccessor::Instance().AddObject(pCurrChar); ObjectAccessor::Instance().AddObject(pCurrChar);
//sLog.outDebug("Player %s added to Map.",pCurrChar->GetName()); //sLog.outDebug("Player %s added to Map.",pCurrChar->GetName());
pCurrChar->GetSocial()->SendSocialList();
pCurrChar->SendInitialPacketsAfterAddToMap(); pCurrChar->SendInitialPacketsAfterAddToMap();
@ -886,9 +885,7 @@ void WorldSession::HandleMeetingStoneInfo( WorldPacket & /*recv_data*/ )
{ {
DEBUG_LOG( "WORLD: Received CMSG_MEETING_STONE_INFO" ); DEBUG_LOG( "WORLD: Received CMSG_MEETING_STONE_INFO" );
WorldPacket data(SMSG_MEETINGSTONE_SETQUEUE, 5); SendLfgUpdate(0, 0, 0);
data << uint32(0) << uint8(6);
SendPacket(&data);
} }
void WorldSession::HandleTutorialFlag( WorldPacket & recv_data ) void WorldSession::HandleTutorialFlag( WorldPacket & recv_data )
@ -906,9 +903,9 @@ void WorldSession::HandleTutorialFlag( WorldPacket & recv_data )
} }
uint32 rInt = (iFlag % 32); uint32 rInt = (iFlag % 32);
uint32 tutflag = GetPlayer()->GetTutorialInt( wInt ); uint32 tutflag = GetTutorialInt( wInt );
tutflag |= (1 << rInt); tutflag |= (1 << rInt);
GetPlayer()->SetTutorialInt( wInt, tutflag ); SetTutorialInt( wInt, tutflag );
//sLog.outDebug("Received Tutorial Flag Set {%u}.", iFlag); //sLog.outDebug("Received Tutorial Flag Set {%u}.", iFlag);
} }
@ -916,13 +913,13 @@ void WorldSession::HandleTutorialFlag( WorldPacket & recv_data )
void WorldSession::HandleTutorialClear( WorldPacket & /*recv_data*/ ) void WorldSession::HandleTutorialClear( WorldPacket & /*recv_data*/ )
{ {
for (int i = 0; i < 8; ++i) for (int i = 0; i < 8; ++i)
GetPlayer()->SetTutorialInt( i, 0xFFFFFFFF ); SetTutorialInt( i, 0xFFFFFFFF );
} }
void WorldSession::HandleTutorialReset( WorldPacket & /*recv_data*/ ) void WorldSession::HandleTutorialReset( WorldPacket & /*recv_data*/ )
{ {
for (int i = 0; i < 8; ++i) for (int i = 0; i < 8; ++i)
GetPlayer()->SetTutorialInt( i, 0x00000000 ); SetTutorialInt( i, 0x00000000 );
} }
void WorldSession::HandleSetWatchedFactionOpcode(WorldPacket & recv_data) void WorldSession::HandleSetWatchedFactionOpcode(WorldPacket & recv_data)
@ -1201,6 +1198,7 @@ void WorldSession::HandleRemoveGlyph( WorldPacket & recv_data )
{ {
_player->RemoveAurasDueToSpell(gp->SpellId); _player->RemoveAurasDueToSpell(gp->SpellId);
_player->SetGlyph(slot, 0); _player->SetGlyph(slot, 0);
_player->SendTalentsInfoData(false);
} }
} }
} }
@ -1299,3 +1297,116 @@ void WorldSession::HandleCharCustomize(WorldPacket& recv_data)
data << uint8(facialHair); data << uint8(facialHair);
SendPacket(&data); SendPacket(&data);
} }
void WorldSession::HandleEquipmentSetSave(WorldPacket &recv_data)
{
sLog.outDebug("CMSG_EQUIPMENT_SET_SAVE");
uint64 setGuid;
if(!recv_data.readPackGUID(setGuid))
return;
CHECK_PACKET_SIZE(recv_data, recv_data.rpos() + 4);
uint32 index;
recv_data >> index;
if(index >= MAX_EQUIPMENT_SET_INDEX) // client set slots amount
return;
CHECK_PACKET_SIZE(recv_data, recv_data.rpos() + 1);
std::string name;
recv_data >> name;
CHECK_PACKET_SIZE(recv_data, recv_data.rpos() + 1);
std::string iconName;
recv_data >> iconName;
EquipmentSet eqSet;
eqSet.Guid = setGuid;
eqSet.Name = name;
eqSet.IconName = iconName;
eqSet.state = EQUIPMENT_SET_NEW;
for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
{
uint64 itemGuid;
if(!recv_data.readPackGUID(itemGuid))
return;
Item *item = _player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);
if(!item && itemGuid) // cheating check 1
return;
if(item && item->GetGUID() != itemGuid) // cheating check 2
return;
eqSet.Items[i] = GUID_LOPART(itemGuid);
}
_player->SetEquipmentSet(index, eqSet);
}
void WorldSession::HandleEquipmentSetDelete(WorldPacket &recv_data)
{
sLog.outDebug("CMSG_EQUIPMENT_SET_DELETE");
uint64 setGuid;
if(!recv_data.readPackGUID(setGuid))
return;
_player->DeleteEquipmentSet(setGuid);
}
void WorldSession::HandleEquipmentSetUse(WorldPacket &recv_data)
{
sLog.outDebug("CMSG_EQUIPMENT_SET_USE");
recv_data.hexlike();
for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
{
uint64 itemGuid;
if(!recv_data.readPackGUID(itemGuid))
return;
CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+1+1);
uint8 srcbag, srcslot;
recv_data >> srcbag >> srcslot;
sLog.outDebug("Item " I64FMT ": srcbag %u, srcslot %u", itemGuid, srcbag, srcslot);
Item *item = _player->GetItemByGuid(itemGuid);
uint16 dstpos = i | (INVENTORY_SLOT_BAG_0 << 8);
if(!item)
{
Item *uItem = _player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);
if(!uItem)
continue;
ItemPosCountVec sDest;
uint8 msg = _player->CanStoreItem( NULL_BAG, NULL_SLOT, sDest, uItem, false );
if(msg == EQUIP_ERR_OK)
{
_player->RemoveItem(INVENTORY_SLOT_BAG_0, i, true);
_player->StoreItem( sDest, uItem, true );
}
else
_player->SendEquipError(msg, uItem, NULL);
continue;
}
if(item->GetPos() == dstpos)
continue;
_player->SwapItem(item->GetPos(), dstpos);
}
WorldPacket data(SMSG_EQUIPMENT_SET_USE_RESULT, 1);
data << uint8(0); // 4 - equipment swap failed - inventory is full
SendPacket(&data);
}

View file

@ -1106,6 +1106,7 @@ void ChatHandler::FillMessageData( WorldPacket *data, WorldSession* session, uin
case CHAT_MSG_MONSTER_EMOTE: case CHAT_MSG_MONSTER_EMOTE:
case CHAT_MSG_RAID_BOSS_WHISPER: case CHAT_MSG_RAID_BOSS_WHISPER:
case CHAT_MSG_RAID_BOSS_EMOTE: case CHAT_MSG_RAID_BOSS_EMOTE:
case CHAT_MSG_BN:
{ {
*data << uint64(speaker->GetGUID()); *data << uint64(speaker->GetGUID());
*data << uint32(0); // 2.1.0 *data << uint32(0); // 2.1.0

View file

@ -65,7 +65,7 @@ ConfusedMovementGenerator<T>::Initialize(T &unit)
} }
unit.StopMoving(); unit.StopMoving();
unit.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); unit.RemoveUnitMovementFlag(MONSTER_MOVE_WALK);
unit.addUnitState(UNIT_STAT_CONFUSED); unit.addUnitState(UNIT_STAT_CONFUSED);
} }

View file

@ -30,8 +30,8 @@ Corpse::Corpse(CorpseType type) : WorldObject()
{ {
m_objectType |= TYPEMASK_CORPSE; m_objectType |= TYPEMASK_CORPSE;
m_objectTypeId = TYPEID_CORPSE; m_objectTypeId = TYPEID_CORPSE;
// 2.3.2 - 0x58
m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION); m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_POSITION);
m_valuesCount = CORPSE_END; m_valuesCount = CORPSE_END;
@ -86,10 +86,6 @@ bool Corpse::Create( uint32 guidlow, Player *owner)
} }
SetFloatValue( OBJECT_FIELD_SCALE_X, 1 ); SetFloatValue( OBJECT_FIELD_SCALE_X, 1 );
SetFloatValue( CORPSE_FIELD_POS_X, GetPositionX() );
SetFloatValue( CORPSE_FIELD_POS_Y, GetPositionY() );
SetFloatValue( CORPSE_FIELD_POS_Z, GetPositionZ() );
SetFloatValue( CORPSE_FIELD_FACING, GetOrientation() );
SetUInt64Value( CORPSE_FIELD_OWNER, owner->GetGUID() ); SetUInt64Value( CORPSE_FIELD_OWNER, owner->GetGUID() );
m_grid = MaNGOS::ComputeGridPair(GetPositionX(), GetPositionY()); m_grid = MaNGOS::ComputeGridPair(GetPositionX(), GetPositionY());

View file

@ -122,7 +122,7 @@ m_creatureInfo(NULL), m_isActiveObject(false), m_AlreadySearchedAssistance(false
m_CreatureSpellCooldowns.clear(); m_CreatureSpellCooldowns.clear();
m_CreatureCategoryCooldowns.clear(); m_CreatureCategoryCooldowns.clear();
m_GlobalCooldown = 0; m_GlobalCooldown = 0;
m_unit_movement_flags = MOVEMENTFLAG_WALK_MODE; m_unit_movement_flags = MONSTER_MOVE_WALK;
} }
Creature::~Creature() Creature::~Creature()
@ -1522,7 +1522,7 @@ void Creature::setDeathState(DeathState s)
CreatureInfo const *cinfo = GetCreatureInfo(); CreatureInfo const *cinfo = GetCreatureInfo();
SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0); SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0);
RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE);
AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); AddUnitMovementFlag(MONSTER_MOVE_WALK);
SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag);
clearUnitState(UNIT_STAT_ALL_STATE); clearUnitState(UNIT_STAT_ALL_STATE);
i_motionMaster.Clear(); i_motionMaster.Clear();

View file

@ -157,6 +157,8 @@ struct CreatureInfo
{ {
uint32 Entry; uint32 Entry;
uint32 HeroicEntry; uint32 HeroicEntry;
uint32 unk1;
uint32 unk2;
uint32 DisplayID_A; uint32 DisplayID_A;
uint32 DisplayID_A2; uint32 DisplayID_A2;
uint32 DisplayID_H; uint32 DisplayID_H;
@ -216,6 +218,8 @@ struct CreatureInfo
float unk16; float unk16;
float unk17; float unk17;
bool RacialLeader; bool RacialLeader;
uint32 questItems[4];
uint32 movementId;
bool RegenHealth; bool RegenHealth;
uint32 equipmentId; uint32 equipmentId;
uint32 MechanicImmuneMask; uint32 MechanicImmuneMask;

View file

@ -128,9 +128,6 @@ TalentSpellPosMap sTalentSpellPosMap;
DBCStorage <TalentTabEntry> sTalentTabStore(TalentTabEntryfmt); DBCStorage <TalentTabEntry> sTalentTabStore(TalentTabEntryfmt);
// store absolute bit position for first rank for talent inspect // store absolute bit position for first rank for talent inspect
typedef std::map<uint32,uint32> TalentInspectMap;
static TalentInspectMap sTalentPosInInspect;
static TalentInspectMap sTalentTabSizeInInspect;
static uint32 sTalentTabPages[12/*MAX_CLASSES*/][3]; static uint32 sTalentTabPages[12/*MAX_CLASSES*/][3];
DBCStorage <TaxiNodesEntry> sTaxiNodesStore(TaxiNodesEntryfmt); DBCStorage <TaxiNodesEntry> sTaxiNodesStore(TaxiNodesEntryfmt);
@ -365,34 +362,6 @@ void LoadDBCStores(const std::string& dataPath)
// prepare fast data access to bit pos of talent ranks for use at inspecting // prepare fast data access to bit pos of talent ranks for use at inspecting
{ {
// fill table by amount of talent ranks and fill sTalentTabBitSizeInInspect
// store in with (row,col,talent)->size key for correct sorting by (row,col)
typedef std::map<uint32,uint32> TalentBitSize;
TalentBitSize sTalentBitSize;
for(uint32 i = 1; i < sTalentStore.GetNumRows(); ++i)
{
TalentEntry const *talentInfo = sTalentStore.LookupEntry(i);
if (!talentInfo) continue;
TalentTabEntry const *talentTabInfo = sTalentTabStore.LookupEntry( talentInfo->TalentTab );
if(!talentTabInfo)
continue;
// find talent rank
uint32 curtalent_maxrank = 0;
for(uint32 k = MAX_TALENT_RANK; k > 0; --k)
{
if(talentInfo->RankID[k-1])
{
curtalent_maxrank = k;
break;
}
}
sTalentBitSize[(talentInfo->Row<<24) + (talentInfo->Col<<16)+talentInfo->TalentID] = curtalent_maxrank;
sTalentTabSizeInInspect[talentInfo->TalentTab] += curtalent_maxrank;
}
// now have all max ranks (and then bit amount used for store talent ranks in inspect) // now have all max ranks (and then bit amount used for store talent ranks in inspect)
for(uint32 talentTabId = 1; talentTabId < sTalentTabStore.GetNumRows(); ++talentTabId) for(uint32 talentTabId = 1; talentTabId < sTalentTabStore.GetNumRows(); ++talentTabId)
{ {
@ -409,22 +378,6 @@ void LoadDBCStores(const std::string& dataPath)
for(uint32 m=1;!(m & talentTabInfo->ClassMask) && cls < MAX_CLASSES;m <<=1, ++cls) {} for(uint32 m=1;!(m & talentTabInfo->ClassMask) && cls < MAX_CLASSES;m <<=1, ++cls) {}
sTalentTabPages[cls][talentTabInfo->tabpage]=talentTabId; sTalentTabPages[cls][talentTabInfo->tabpage]=talentTabId;
// add total amount bits for first rank starting from talent tab first talent rank pos.
uint32 pos = 0;
for(TalentBitSize::iterator itr = sTalentBitSize.begin(); itr != sTalentBitSize.end(); ++itr)
{
uint32 talentId = itr->first & 0xFFFF;
TalentEntry const *talentInfo = sTalentStore.LookupEntry( talentId );
if(!talentInfo)
continue;
if(talentInfo->TalentTab != talentTabId)
continue;
sTalentPosInInspect[talentId] = pos;
pos+= itr->second;
}
} }
} }
@ -528,13 +481,13 @@ void LoadDBCStores(const std::string& dataPath)
} }
// Check loaded DBC files proper version // Check loaded DBC files proper version
if( !sSpellStore.LookupEntry(62735) || // last added spell in 3.0.9 if( !sSpellStore.LookupEntry(66530) || // last added spell in 3.1.3
!sMapStore.LookupEntry(624) || // last map added in 3.0.8a/3.0.9 !sMapStore.LookupEntry(624) || // last map added in 3.1.3
!sGemPropertiesStore.LookupEntry(1557) || // last gem property added in 3.0.8a/3.0.9 !sGemPropertiesStore.LookupEntry(1609) || // last gem property added in 3.1.3
!sItemExtendedCostStore.LookupEntry(2589) || // last item extended cost added in 3.0.8a/3.0.9 !sItemExtendedCostStore.LookupEntry(2671) || // last item extended cost added in 3.1.3
!sCharTitlesStore.LookupEntry(144) || // last char title added in 3.0.8a/3.0.9 !sCharTitlesStore.LookupEntry(166) || // last char title added in 3.1.3
!sAreaStore.LookupEntry(2769) || // last area (areaflag) added in 3.0.8a/3.0.9 !sAreaStore.LookupEntry(2905) || // last area (areaflag) added in 3.1.3
!sItemStore.LookupEntry(45037) ) // last client known item added in 3.0.9 !sItemStore.LookupEntry(46894) ) // last client known item added in 3.1.3
{ {
sLog.outError("\nYou have _outdated_ DBC files. Please extract correct versions from current using client."); sLog.outError("\nYou have _outdated_ DBC files. Please extract correct versions from current using client.");
exit(1); exit(1);
@ -704,24 +657,6 @@ void Map2ZoneCoordinates(float& x,float& y,uint32 zone)
std::swap(x,y); // client have map coords swapped std::swap(x,y); // client have map coords swapped
} }
uint32 GetTalentInspectBitPosInTab(uint32 talentId)
{
TalentInspectMap::const_iterator itr = sTalentPosInInspect.find(talentId);
if(itr == sTalentPosInInspect.end())
return 0;
return itr->second;
}
uint32 GetTalentTabInspectBitSize(uint32 talentTabId)
{
TalentInspectMap::const_iterator itr = sTalentTabSizeInInspect.find(talentTabId);
if(itr == sTalentTabSizeInInspect.end())
return 0;
return itr->second;
}
uint32 const* GetTalentTabPages(uint32 cls) uint32 const* GetTalentTabPages(uint32 cls)
{ {
return sTalentTabPages[cls]; return sTalentTabPages[cls];

View file

@ -54,8 +54,6 @@ bool IsTotemCategoryCompatiableWith(uint32 itemTotemCategoryId, uint32 requiredT
void Zone2MapCoordinates(float& x,float& y,uint32 zone); void Zone2MapCoordinates(float& x,float& y,uint32 zone);
void Map2ZoneCoordinates(float& x,float& y,uint32 zone); void Map2ZoneCoordinates(float& x,float& y,uint32 zone);
uint32 GetTalentInspectBitPosInTab(uint32 talentId);
uint32 GetTalentTabInspectBitSize(uint32 talentTabId);
uint32 const* /*[3]*/ GetTalentTabPages(uint32 cls); uint32 const* /*[3]*/ GetTalentTabPages(uint32 cls);
extern DBCStorage <AchievementEntry> sAchievementStore; extern DBCStorage <AchievementEntry> sAchievementStore;

View file

@ -571,6 +571,7 @@ struct BattlemasterListEntry
char* name[16]; // 16-31 char* name[16]; // 16-31
// 32 string flag, unused // 32 string flag, unused
// 33 unused // 33 unused
//uint32 unk; // 34 new 3.1
}; };
#define MAX_OUTFIT_ITEMS 24 #define MAX_OUTFIT_ITEMS 24
@ -940,6 +941,7 @@ struct HolidaysEntry
//uint32 unk51; // 51 //uint32 unk51; // 51
//uint32 unk52; // 52 //uint32 unk52; // 52
//uint32 unk53; // 53 //uint32 unk53; // 53
//uint32 unk54; // 54
}; };
struct ItemEntry struct ItemEntry
@ -1271,6 +1273,7 @@ struct SoundEntriesEntry
// 26 m_minDistance // 26 m_minDistance
// 27 m_distanceCutoff // 27 m_distanceCutoff
// 28 m_EAXDef // 28 m_EAXDef
// 29 new in 3.1
}; };
struct SpellEntry struct SpellEntry
@ -1382,6 +1385,7 @@ struct SpellEntry
uint32 SchoolMask; // 228 m_schoolMask uint32 SchoolMask; // 228 m_schoolMask
uint32 runeCostID; // 229 m_runeCostID uint32 runeCostID; // 229 m_runeCostID
//uint32 spellMissileID; // 230 m_spellMissileID not used //uint32 spellMissileID; // 230 m_spellMissileID not used
//uint32 PowerDisplayId; // 231 PowerDisplay.dbc, new in 3.1
// helpers // helpers
int32 CalculateSimpleValue(uint8 eff) const { return EffectBasePoints[eff]+int32(EffectBaseDice[eff]); } int32 CalculateSimpleValue(uint8 eff) const { return EffectBasePoints[eff]+int32(EffectBaseDice[eff]); }
@ -1490,6 +1494,7 @@ struct SpellItemEnchantmentEntry
uint32 EnchantmentCondition; // 34 m_condition_id uint32 EnchantmentCondition; // 34 m_condition_id
//uint32 requiredSkill; // 35 m_requiredSkillID //uint32 requiredSkill; // 35 m_requiredSkillID
//uint32 requiredSkillValue; // 36 m_requiredSkillRank //uint32 requiredSkillValue; // 36 m_requiredSkillRank
// 37 new in 3.1
}; };
struct SpellItemEnchantmentConditionEntry struct SpellItemEnchantmentConditionEntry
@ -1611,25 +1616,28 @@ struct VehicleEntry
float m_cameraFadeDistScalarMin; // 15 float m_cameraFadeDistScalarMin; // 15
float m_cameraFadeDistScalarMax; // 16 float m_cameraFadeDistScalarMax; // 16
float m_cameraPitchOffset; // 17 float m_cameraPitchOffset; // 17
int m_powerType[3]; // 18-20 //int m_powerType[3]; // removed in 3.1
int m_powerToken[3]; // 21-23 //int m_powerToken[3]; // removed in 3.1
float m_facingLimitRight; // 24 float m_facingLimitRight; // 18
float m_facingLimitLeft; // 25 float m_facingLimitLeft; // 19
float m_msslTrgtTurnLingering; // 26 float m_msslTrgtTurnLingering; // 20
float m_msslTrgtPitchLingering; // 27 float m_msslTrgtPitchLingering; // 21
float m_msslTrgtMouseLingering; // 28 float m_msslTrgtMouseLingering; // 22
float m_msslTrgtEndOpacity; // 29 float m_msslTrgtEndOpacity; // 23
float m_msslTrgtArcSpeed; // 30 float m_msslTrgtArcSpeed; // 24
float m_msslTrgtArcRepeat; // 31 float m_msslTrgtArcRepeat; // 25
float m_msslTrgtArcWidth; // 32 float m_msslTrgtArcWidth; // 26
float m_msslTrgtImpactRadius[2]; // 33-34 float m_msslTrgtImpactRadius[2]; // 27-28
char* m_msslTrgtArcTexture; // 35 char* m_msslTrgtArcTexture; // 29
char* m_msslTrgtImpactTexture; // 36 char* m_msslTrgtImpactTexture; // 30
char* m_msslTrgtImpactModel[2]; // 37-38 char* m_msslTrgtImpactModel[2]; // 31-32
float m_cameraYawOffset; // 39 float m_cameraYawOffset; // 33
uint32 m_uiLocomotionType; // 40 uint32 m_uiLocomotionType; // 34
float m_msslTrgtImpactTexRadius; // 41 float m_msslTrgtImpactTexRadius; // 35
uint32 m_uiSeatIndicatorType; // 42 uint32 m_uiSeatIndicatorType; // 36
// 37, new in 3.1
// 38, new in 3.1
// 39, new in 3.1
}; };
struct VehicleSeatEntry struct VehicleSeatEntry
@ -1680,6 +1688,7 @@ struct VehicleSeatEntry
uint32 m_exitUISoundID; // 43 uint32 m_exitUISoundID; // 43
int32 m_uiSkin; // 44 int32 m_uiSkin; // 44
uint32 m_flagsB; // 45 uint32 m_flagsB; // 45
// 46-57 added in 3.1, floats mostly
}; };
struct WorldMapAreaEntry struct WorldMapAreaEntry

View file

@ -27,7 +27,7 @@ const char AreaTriggerEntryfmt[]="niffffffff";
const char AuctionHouseEntryfmt[]="niiixxxxxxxxxxxxxxxxx"; const char AuctionHouseEntryfmt[]="niiixxxxxxxxxxxxxxxxx";
const char BankBagSlotPricesEntryfmt[]="ni"; const char BankBagSlotPricesEntryfmt[]="ni";
const char BarberShopStyleEntryfmt[]="nixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiii"; const char BarberShopStyleEntryfmt[]="nixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiii";
const char BattlemasterListEntryfmt[]="niiiiiiiiiiiixxxssssssssssssssssxx"; const char BattlemasterListEntryfmt[]="niiiiiiiiiiiixxxssssssssssssssssxxx";
const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const char CharTitlesEntryfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi"; const char CharTitlesEntryfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi";
const char ChatChannelsEntryfmt[]="iixssssssssssssssssxxxxxxxxxxxxxxxxxx"; const char ChatChannelsEntryfmt[]="iixssssssssssssssssxxxxxxxxxxxxxxxxxx";
@ -59,7 +59,7 @@ const char GtOCTRegenHPfmt[]="f";
//const char GtOCTRegenMPfmt[]="f"; //const char GtOCTRegenMPfmt[]="f";
const char GtRegenHPPerSptfmt[]="f"; const char GtRegenHPPerSptfmt[]="f";
const char GtRegenMPPerSptfmt[]="f"; const char GtRegenMPPerSptfmt[]="f";
const char Holidaysfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char Holidaysfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const char Itemfmt[]="niiiiiii"; const char Itemfmt[]="niiiiiii";
const char ItemBagFamilyfmt[]="nxxxxxxxxxxxxxxxxx"; const char ItemBagFamilyfmt[]="nxxxxxxxxxxxxxxxxx";
//const char ItemDisplayTemplateEntryfmt[]="nxxxxxxxxxxixxxxxxxxxxx"; //const char ItemDisplayTemplateEntryfmt[]="nxxxxxxxxxxixxxxxxxxxxx";
@ -79,12 +79,12 @@ const char ScalingStatDistributionfmt[]="niiiiiiiiiiiiiiiiiiiii";
const char ScalingStatValuesfmt[]="iniiiiiiiiiiiiiiiii"; const char ScalingStatValuesfmt[]="iniiiiiiiiiiiiiiiii";
const char SkillLinefmt[]="nixssssssssssssssssxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxi"; const char SkillLinefmt[]="nixssssssssssssssssxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxi";
const char SkillLineAbilityfmt[]="niiiixxiiiiixx"; const char SkillLineAbilityfmt[]="niiiixxiiiiixx";
const char SoundEntriesfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char SoundEntriesfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const char SpellCastTimefmt[]="nixx"; const char SpellCastTimefmt[]="nixx";
const char SpellDurationfmt[]="niii"; const char SpellDurationfmt[]="niii";
const char SpellEntryfmt[]="niiiiiiiiixiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffiiiiiiiiiiiiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiiixfffxxxiiiiix"; const char SpellEntryfmt[]="niiiiiiiiixiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffiiiiiiiiiiiiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiiixfffxxxiiiiixx";
const char SpellFocusObjectfmt[]="nxxxxxxxxxxxxxxxxx"; const char SpellFocusObjectfmt[]="nxxxxxxxxxxxxxxxxx";
const char SpellItemEnchantmentfmt[]="nxiiiiiixxxiiissssssssssssssssxiiiixx"; const char SpellItemEnchantmentfmt[]="nxiiiiiixxxiiissssssssssssssssxiiiixxx";
const char SpellItemEnchantmentConditionfmt[]="nbbbbbxxxxxbbbbbbbbbbiiiiiXXXXX"; const char SpellItemEnchantmentConditionfmt[]="nbbbbbxxxxxbbbbbbbbbbiiiiiXXXXX";
const char SpellRadiusfmt[]="nfxf"; const char SpellRadiusfmt[]="nfxf";
const char SpellRangefmt[]="nffffxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char SpellRangefmt[]="nffffxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
@ -98,8 +98,8 @@ const char TaxiNodesEntryfmt[]="nifffssssssssssssssssxii";
const char TaxiPathEntryfmt[]="niii"; const char TaxiPathEntryfmt[]="niii";
const char TaxiPathNodeEntryfmt[]="diiifffiixx"; const char TaxiPathNodeEntryfmt[]="diiifffiixx";
const char TotemCategoryEntryfmt[]="nxxxxxxxxxxxxxxxxxii"; const char TotemCategoryEntryfmt[]="nxxxxxxxxxxxxxxxxxii";
const char VehicleEntryfmt[]="niffffiiiiiiiiffffiiiiiifffffffffffssssfifi"; const char VehicleEntryfmt[]="niffffiiiiiiiifffffffffffffffssssfifixxx";
const char VehicleSeatEntryfmt[]="niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiii"; const char VehicleSeatEntryfmt[]="niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiiixxxxxxxxxxxx";
const char WorldMapAreaEntryfmt[]="xinxffffix"; const char WorldMapAreaEntryfmt[]="xinxffffix";
const char WorldMapOverlayEntryfmt[]="nxiiiixxxxxxxxxxx"; const char WorldMapOverlayEntryfmt[]="nxiiiixxxxxxxxxxx";
const char WorldSafeLocsEntryfmt[]="nifffxxxxxxxxxxxxxxxxx"; const char WorldSafeLocsEntryfmt[]="nifffxxxxxxxxxxxxxxxxx";

View file

@ -30,8 +30,8 @@ DynamicObject::DynamicObject() : WorldObject()
{ {
m_objectType |= TYPEMASK_DYNAMICOBJECT; m_objectType |= TYPEMASK_DYNAMICOBJECT;
m_objectTypeId = TYPEID_DYNAMICOBJECT; m_objectTypeId = TYPEID_DYNAMICOBJECT;
// 2.3.2 - 0x58
m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION); m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
m_valuesCount = DYNAMICOBJECT_END; m_valuesCount = DYNAMICOBJECT_END;
} }

View file

@ -285,7 +285,7 @@ FleeingMovementGenerator<T>::Initialize(T &owner)
return; return;
_Init(owner); _Init(owner);
owner.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); owner.RemoveUnitMovementFlag(MONSTER_MOVE_WALK);
if(Unit * fright = ObjectAccessor::GetUnit(owner, i_frightGUID)) if(Unit * fright = ObjectAccessor::GetUnit(owner, i_frightGUID))
{ {

View file

@ -40,8 +40,8 @@ GameObject::GameObject() : WorldObject()
{ {
m_objectType |= TYPEMASK_GAMEOBJECT; m_objectType |= TYPEMASK_GAMEOBJECT;
m_objectTypeId = TYPEID_GAMEOBJECT; m_objectTypeId = TYPEID_GAMEOBJECT;
// 2.3.2 - 0x58
m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION); m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_POSITION | UPDATEFLAG_ROTATION);
m_valuesCount = GAMEOBJECT_END; m_valuesCount = GAMEOBJECT_END;
m_respawnTime = 0; m_respawnTime = 0;
@ -55,6 +55,7 @@ GameObject::GameObject() : WorldObject()
m_goInfo = NULL; m_goInfo = NULL;
m_DBTableGuid = 0; m_DBTableGuid = 0;
m_rotation = 0;
} }
GameObject::~GameObject() GameObject::~GameObject()
@ -118,10 +119,6 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMa
return false; return false;
} }
SetFloatValue(GAMEOBJECT_POS_X, x);
SetFloatValue(GAMEOBJECT_POS_Y, y);
SetFloatValue(GAMEOBJECT_POS_Z, z);
SetFloatValue(GAMEOBJECT_PARENTROTATION+0, rotation0); SetFloatValue(GAMEOBJECT_PARENTROTATION+0, rotation0);
SetFloatValue(GAMEOBJECT_PARENTROTATION+1, rotation1); SetFloatValue(GAMEOBJECT_PARENTROTATION+1, rotation1);
@ -515,10 +512,10 @@ void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask)
data.id = GetEntry(); data.id = GetEntry();
data.mapid = mapid; data.mapid = mapid;
data.phaseMask = phaseMask; data.phaseMask = phaseMask;
data.posX = GetFloatValue(GAMEOBJECT_POS_X); data.posX = GetPositionX();
data.posY = GetFloatValue(GAMEOBJECT_POS_Y); data.posY = GetPositionY();
data.posZ = GetFloatValue(GAMEOBJECT_POS_Z); data.posZ = GetPositionZ();
data.orientation = GetFloatValue(GAMEOBJECT_FACING); data.orientation = GetOrientation();
data.rotation0 = GetFloatValue(GAMEOBJECT_PARENTROTATION+0); data.rotation0 = GetFloatValue(GAMEOBJECT_PARENTROTATION+0);
data.rotation1 = GetFloatValue(GAMEOBJECT_PARENTROTATION+1); data.rotation1 = GetFloatValue(GAMEOBJECT_PARENTROTATION+1);
data.rotation2 = GetFloatValue(GAMEOBJECT_PARENTROTATION+2); data.rotation2 = GetFloatValue(GAMEOBJECT_PARENTROTATION+2);
@ -536,10 +533,10 @@ void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask)
<< mapid << ", " << mapid << ", "
<< uint32(spawnMask) << "," // cast to prevent save as symbol << uint32(spawnMask) << "," // cast to prevent save as symbol
<< uint16(GetPhaseMask()) << "," // prevent out of range error << uint16(GetPhaseMask()) << "," // prevent out of range error
<< GetFloatValue(GAMEOBJECT_POS_X) << ", " << GetPositionX() << ", "
<< GetFloatValue(GAMEOBJECT_POS_Y) << ", " << GetPositionY() << ", "
<< GetFloatValue(GAMEOBJECT_POS_Z) << ", " << GetPositionZ() << ", "
<< GetFloatValue(GAMEOBJECT_FACING) << ", " << GetOrientation() << ", "
<< GetFloatValue(GAMEOBJECT_PARENTROTATION) << ", " << GetFloatValue(GAMEOBJECT_PARENTROTATION) << ", "
<< GetFloatValue(GAMEOBJECT_PARENTROTATION+1) << ", " << GetFloatValue(GAMEOBJECT_PARENTROTATION+1) << ", "
<< GetFloatValue(GAMEOBJECT_PARENTROTATION+2) << ", " << GetFloatValue(GAMEOBJECT_PARENTROTATION+2) << ", "
@ -643,8 +640,6 @@ uint32 GameObject::GetLootId(GameObjectInfo const* ginfo)
return ginfo->chest.lootId; return ginfo->chest.lootId;
case GAMEOBJECT_TYPE_FISHINGHOLE: case GAMEOBJECT_TYPE_FISHINGHOLE:
return ginfo->fishinghole.lootId; return ginfo->fishinghole.lootId;
case GAMEOBJECT_TYPE_FISHINGNODE:
return ginfo->fishnode.lootId;
default: default:
return 0; return 0;
} }
@ -1310,14 +1305,21 @@ void GameObject::UpdateRotationFields(float rotation2 /*=0.0f*/, float rotation3
{ {
static double const atan_pow = atan(pow(2.0f, -20.0f)); static double const atan_pow = atan(pow(2.0f, -20.0f));
SetFloatValue(GAMEOBJECT_FACING, GetOrientation());
double f_rot1 = sin(GetOrientation() / 2.0f); double f_rot1 = sin(GetOrientation() / 2.0f);
double f_rot2 = cos(GetOrientation() / 2.0f); double f_rot2 = cos(GetOrientation() / 2.0f);
int64 i_rot1 = int64(f_rot1 / atan_pow *(f_rot2 >= 0 ? 1.0f : -1.0f)); int64 i_rot1 = int64(f_rot1 / atan_pow *(f_rot2 >= 0 ? 1.0f : -1.0f));
int64 rotation = (i_rot1 << 43 >> 43) & 0x00000000001FFFFF; int64 rotation = (i_rot1 << 43 >> 43) & 0x00000000001FFFFF;
SetUInt64Value(GAMEOBJECT_ROTATION, rotation);
//float f_rot2 = sin(0.0f / 2.0f);
//int64 i_rot2 = f_rot2 / atan(pow(2.0f, -20.0f));
//rotation |= (((i_rot2 << 22) >> 32) >> 11) & 0x000003FFFFE00000;
//float f_rot3 = sin(0.0f / 2.0f);
//int64 i_rot3 = f_rot3 / atan(pow(2.0f, -21.0f));
//rotation |= (i_rot3 >> 42) & 0x7FFFFC0000000000;
m_rotation = rotation;
if(rotation2==0.0f && rotation3==0.0f) if(rotation2==0.0f && rotation3==0.0f)
{ {

View file

@ -41,9 +41,11 @@ struct GameObjectInfo
char *name; char *name;
char *IconName; char *IconName;
char *castBarCaption; char *castBarCaption;
char *unk1;
uint32 faction; uint32 faction;
uint32 flags; uint32 flags;
float size; float size;
uint32 questItems[4];
union // different GO types have different data field union // different GO types have different data field
{ {
//0 GAMEOBJECT_TYPE_DOOR //0 GAMEOBJECT_TYPE_DOOR
@ -55,6 +57,7 @@ struct GameObjectInfo
uint32 noDamageImmune; //3 break opening whenever you recieve damage? uint32 noDamageImmune; //3 break opening whenever you recieve damage?
uint32 openTextID; //4 can be used to replace castBarCaption? uint32 openTextID; //4 can be used to replace castBarCaption?
uint32 closeTextID; //5 uint32 closeTextID; //5
uint32 ignoredByPathing; //6
} door; } door;
//1 GAMEOBJECT_TYPE_BUTTON //1 GAMEOBJECT_TYPE_BUTTON
struct struct
@ -102,6 +105,7 @@ struct GameObjectInfo
uint32 logLoot; //13 uint32 logLoot; //13
uint32 openTextID; //14 can be used to replace castBarCaption? uint32 openTextID; //14 can be used to replace castBarCaption?
uint32 groupLootRules; //15 uint32 groupLootRules; //15
uint32 floatingTooltip; //16
} chest; } chest;
//4 GAMEOBJECT_TYPE_BINDER - empty //4 GAMEOBJECT_TYPE_BINDER - empty
//5 GAMEOBJECT_TYPE_GENERIC //5 GAMEOBJECT_TYPE_GENERIC
@ -131,6 +135,7 @@ struct GameObjectInfo
uint32 stealthAffected; //11 uint32 stealthAffected; //11
uint32 openTextID; //12 can be used to replace castBarCaption? uint32 openTextID; //12 can be used to replace castBarCaption?
uint32 closeTextID; //13 uint32 closeTextID; //13
uint32 ignoreTotems; //14
} trap; } trap;
//7 GAMEOBJECT_TYPE_CHAIR //7 GAMEOBJECT_TYPE_CHAIR
struct struct
@ -138,6 +143,7 @@ struct GameObjectInfo
uint32 slots; //0 uint32 slots; //0
uint32 height; //1 uint32 height; //1
uint32 onlyCreatorUse; //2 uint32 onlyCreatorUse; //2
uint32 triggeredEvent; //3
} chair; } chair;
//8 GAMEOBJECT_TYPE_SPELL_FOCUS //8 GAMEOBJECT_TYPE_SPELL_FOCUS
struct struct
@ -148,6 +154,7 @@ struct GameObjectInfo
uint32 serverOnly; //3 uint32 serverOnly; //3
uint32 questID; //4 uint32 questID; //4
uint32 large; //5 uint32 large; //5
uint32 floatingTooltip; //6
} spellFocus; } spellFocus;
//9 GAMEOBJECT_TYPE_TEXT //9 GAMEOBJECT_TYPE_TEXT
struct struct
@ -178,6 +185,9 @@ struct GameObjectInfo
uint32 closeTextID; //15 uint32 closeTextID; //15
uint32 losOK; //16 isBattlegroundObject uint32 losOK; //16 isBattlegroundObject
uint32 allowMounted; //17 uint32 allowMounted; //17
uint32 floatingTooltip; //18
uint32 gossipID; //19
uint32 WorldStateSetsState; //20
} goober; } goober;
//11 GAMEOBJECT_TYPE_TRANSPORT //11 GAMEOBJECT_TYPE_TRANSPORT
struct struct
@ -185,6 +195,8 @@ struct GameObjectInfo
uint32 pause; //0 uint32 pause; //0
uint32 startOpen; //1 uint32 startOpen; //1
uint32 autoCloseTime; //2 secs till autoclose = autoCloseTime / 0x10000 uint32 autoCloseTime; //2 secs till autoclose = autoCloseTime / 0x10000
uint32 pause1EventID; //3
uint32 pause2EventID; //4
} transport; } transport;
//12 GAMEOBJECT_TYPE_AREADAMAGE //12 GAMEOBJECT_TYPE_AREADAMAGE
struct struct
@ -217,14 +229,10 @@ struct GameObjectInfo
uint32 stopEventID; //4 uint32 stopEventID; //4
uint32 transportPhysics; //5 uint32 transportPhysics; //5
uint32 mapID; //6 uint32 mapID; //6
uint32 worldState1; //7
} moTransport; } moTransport;
//16 GAMEOBJECT_TYPE_DUELFLAG - empty //16 GAMEOBJECT_TYPE_DUELFLAG - empty
//17 GAMEOBJECT_TYPE_FISHINGNODE //17 GAMEOBJECT_TYPE_FISHINGNODE - empty
struct
{
uint32 _data0; //0
uint32 lootId; //1
} fishnode;
//18 GAMEOBJECT_TYPE_SUMMONING_RITUAL //18 GAMEOBJECT_TYPE_SUMMONING_RITUAL
struct struct
{ {
@ -238,11 +246,7 @@ struct GameObjectInfo
uint32 ritualNoTargetCheck; //7 uint32 ritualNoTargetCheck; //7
} summoningRitual; } summoningRitual;
//19 GAMEOBJECT_TYPE_MAILBOX - empty //19 GAMEOBJECT_TYPE_MAILBOX - empty
//20 GAMEOBJECT_TYPE_AUCTIONHOUSE //20 GAMEOBJECT_TYPE_DONOTUSE - empty
struct
{
uint32 actionHouseID; //0
} auctionhouse;
//21 GAMEOBJECT_TYPE_GUARDPOST //21 GAMEOBJECT_TYPE_GUARDPOST
struct struct
{ {
@ -255,6 +259,8 @@ struct GameObjectInfo
uint32 spellId; //0 uint32 spellId; //0
uint32 charges; //1 uint32 charges; //1
uint32 partyOnly; //2 uint32 partyOnly; //2
uint32 allowMounted; //3
uint32 large; //4
} spellcaster; } spellcaster;
//23 GAMEOBJECT_TYPE_MEETINGSTONE //23 GAMEOBJECT_TYPE_MEETINGSTONE
struct struct
@ -321,6 +327,8 @@ struct GameObjectInfo
uint32 maxTime; //17 uint32 maxTime; //17
uint32 large; //18 uint32 large; //18
uint32 highlight; //19 uint32 highlight; //19
uint32 startingValue; //20
uint32 unidirectional; //21
} capturePoint; } capturePoint;
//30 GAMEOBJECT_TYPE_AURA_GENERATOR //30 GAMEOBJECT_TYPE_AURA_GENERATOR
struct struct
@ -348,10 +356,30 @@ struct GameObjectInfo
//33 GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING //33 GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING
struct struct
{ {
uint32 dmgPctState1; //0 uint32 intactNumHits; //0
uint32 dmgPctState2; //1 uint32 creditProxyCreature; //1
uint32 state1Name; //2 uint32 empty1; //2
uint32 state2Name; //3 uint32 intactEvent; //3
uint32 empty2; //4
uint32 damagedNumHits; //5
uint32 empty3; //6
uint32 empty4; //7
uint32 empty5; //8
uint32 damagedEvent; //9
uint32 empty6; //10
uint32 empty7; //11
uint32 empty8; //12
uint32 empty9; //13
uint32 destroyedEvent; //14
uint32 empty10; //15
uint32 debuildingTimeSecs; //16
uint32 empty11; //17
uint32 destructibleData; //18
uint32 rebuildingEvent; //19
uint32 empty12; //20
uint32 empty13; //21
uint32 damageEvent; //22
uint32 empty14; //23
} destructibleBuilding; } destructibleBuilding;
//34 GAMEOBJECT_TYPE_GUILDBANK - empty //34 GAMEOBJECT_TYPE_GUILDBANK - empty
//35 GAMEOBJECT_TYPE_TRAPDOOR //35 GAMEOBJECT_TYPE_TRAPDOOR
@ -612,6 +640,7 @@ class MANGOS_DLL_SPEC GameObject : public WorldObject
GridReference<GameObject> &GetGridRef() { return m_gridRef; } GridReference<GameObject> &GetGridRef() { return m_gridRef; }
bool isActiveObject() const { return false; } bool isActiveObject() const { return false; }
uint64 GetRotation() const { return m_rotation; }
protected: protected:
uint32 m_charges; // Spell charges for GAMEOBJECT_TYPE_SPELLCASTER (22) uint32 m_charges; // Spell charges for GAMEOBJECT_TYPE_SPELLCASTER (22)
uint32 m_spellId; uint32 m_spellId;
@ -628,6 +657,7 @@ class MANGOS_DLL_SPEC GameObject : public WorldObject
uint32 m_DBTableGuid; ///< For new or temporary gameobjects is 0 for saved it is lowguid uint32 m_DBTableGuid; ///< For new or temporary gameobjects is 0 for saved it is lowguid
GameObjectInfo const* m_goInfo; GameObjectInfo const* m_goInfo;
uint64 m_rotation;
private: private:
void SwitchDoorOrButton(bool activate, bool alternative = false); void SwitchDoorOrButton(bool activate, bool alternative = false);

View file

@ -128,7 +128,7 @@ void PlayerMenu::SendGossipMenu( uint32 TitleTextId, uint64 npcGUID )
data << uint64(npcGUID); data << uint64(npcGUID);
data << uint32(0); // new 2.4.0 data << uint32(0); // new 2.4.0
data << uint32( TitleTextId ); data << uint32( TitleTextId );
data << uint32( mGossipMenu.MenuItemCount() ); // max count 0x0F data << uint32( mGossipMenu.MenuItemCount() ); // max count 0x10
for (uint32 iI = 0; iI < mGossipMenu.MenuItemCount(); ++iI ) for (uint32 iI = 0; iI < mGossipMenu.MenuItemCount(); ++iI )
{ {
@ -452,6 +452,7 @@ void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID
data << uint32(ActivateAccept); data << uint32(ActivateAccept);
data << uint32(pQuest->GetSuggestedPlayers()); data << uint32(pQuest->GetSuggestedPlayers());
data << uint8(0); // new wotlk data << uint8(0); // new wotlk
data << uint8(0); // new 3.1
if (pQuest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS)) if (pQuest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS))
{ {
@ -747,8 +748,7 @@ void PlayerMenu::SendQuestGiverRequestItems( Quest const *pQuest, uint64 npcGUID
} }
} }
// We may wish a better check, perhaps checking the real quest requirements if (!pQuest->GetReqItemsCount() && Completable)
if (RequestItemsText.empty())
{ {
SendQuestGiverOfferReward(pQuest, npcGUID, true); SendQuestGiverOfferReward(pQuest, npcGUID, true);
return; return;

View file

@ -41,10 +41,10 @@ class Player;
#define MIN_GRID_DELAY (MINUTE*IN_MILISECONDS) #define MIN_GRID_DELAY (MINUTE*IN_MILISECONDS)
#define MIN_MAP_UPDATE_DELAY 50 #define MIN_MAP_UPDATE_DELAY 50
#define MAX_NUMBER_OF_CELLS 8 #define MAX_NUMBER_OF_CELLS 4
#define SIZE_OF_GRID_CELL (SIZE_OF_GRIDS/MAX_NUMBER_OF_CELLS) #define SIZE_OF_GRID_CELL (SIZE_OF_GRIDS/MAX_NUMBER_OF_CELLS)
#define CENTER_GRID_CELL_ID 256 #define CENTER_GRID_CELL_ID 128
#define CENTER_GRID_CELL_OFFSET (SIZE_OF_GRID_CELL/2) #define CENTER_GRID_CELL_OFFSET (SIZE_OF_GRID_CELL/2)
#define TOTAL_NUMBER_OF_CELLS_PER_MAP (MAX_NUMBER_OF_GRIDS*MAX_NUMBER_OF_CELLS) #define TOTAL_NUMBER_OF_CELLS_PER_MAP (MAX_NUMBER_OF_GRIDS*MAX_NUMBER_OF_CELLS)

View file

@ -27,7 +27,7 @@
void void
HomeMovementGenerator<Creature>::Initialize(Creature & owner) HomeMovementGenerator<Creature>::Initialize(Creature & owner)
{ {
owner.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); owner.RemoveUnitMovementFlag(MONSTER_MOVE_WALK);
_setTargetLocation(owner); _setTargetLocation(owner);
} }
@ -63,7 +63,7 @@ HomeMovementGenerator<Creature>::Update(Creature &owner, const uint32& time_diff
if (time_diff > i_travel_timer) if (time_diff > i_travel_timer)
{ {
owner.AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); owner.AddUnitMovementFlag(MONSTER_MOVE_WALK);
// restore orientation of not moving creature at returning to home // restore orientation of not moving creature at returning to home
if(owner.GetDefaultMovementType()==IDLE_MOTION_TYPE) if(owner.GetDefaultMovementType()==IDLE_MOTION_TYPE)

View file

@ -233,8 +233,8 @@ Item::Item( )
{ {
m_objectType |= TYPEMASK_ITEM; m_objectType |= TYPEMASK_ITEM;
m_objectTypeId = TYPEID_ITEM; m_objectTypeId = TYPEID_ITEM;
// 2.3.2 - 0x18
m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID); m_updateFlag = UPDATEFLAG_HIGHGUID;
m_valuesCount = ITEM_END; m_valuesCount = ITEM_END;
m_slot = 0; m_slot = 0;

View file

@ -167,7 +167,7 @@ enum EnchantmentSlot
MAX_ENCHANTMENT_SLOT = 12 MAX_ENCHANTMENT_SLOT = 12
}; };
#define MAX_VISIBLE_ITEM_OFFSET 18 // 18 fields per visible item (creator(2) + enchantments(13) + properties(1) + seed(1) + pad(1)) #define MAX_VISIBLE_ITEM_OFFSET 2 // 2 fields per visible item (entry+enchantment)
#define MAX_GEM_SOCKETS MAX_ITEM_PROTO_SOCKETS// (BONUS_ENCHANTMENT_SLOT-SOCK_ENCHANTMENT_SLOT) and item proto size, equal value expected #define MAX_GEM_SOCKETS MAX_ITEM_PROTO_SOCKETS// (BONUS_ENCHANTMENT_SLOT-SOCK_ENCHANTMENT_SLOT) and item proto size, equal value expected

View file

@ -439,6 +439,7 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data )
data << pProto->ArmorDamageModifier; data << pProto->ArmorDamageModifier;
data << pProto->Duration; // added in 2.4.2.8209, duration (seconds) data << pProto->Duration; // added in 2.4.2.8209, duration (seconds)
data << pProto->ItemLimitCategory; // WotLK, ItemLimitCategory data << pProto->ItemLimitCategory; // WotLK, ItemLimitCategory
data << pProto->HolidayId; // Holiday.dbc?
SendPacket( &data ); SendPacket( &data );
} }
else else
@ -662,28 +663,28 @@ void WorldSession::HandleBuybackItem(WorldPacket & recv_data)
void WorldSession::HandleBuyItemInSlotOpcode( WorldPacket & recv_data ) void WorldSession::HandleBuyItemInSlotOpcode( WorldPacket & recv_data )
{ {
CHECK_PACKET_SIZE(recv_data,8+4+8+1+1); CHECK_PACKET_SIZE(recv_data,8+4+4+8+1+4);
sLog.outDebug( "WORLD: Received CMSG_BUY_ITEM_IN_SLOT" ); sLog.outDebug( "WORLD: Received CMSG_BUY_ITEM_IN_SLOT" );
uint64 vendorguid, bagguid; uint64 vendorguid, bagguid;
uint32 item; uint32 item, slot, count;
uint8 slot, count; uint8 bagslot;
recv_data >> vendorguid >> item >> bagguid >> slot >> count; recv_data >> vendorguid >> item >> slot >> bagguid >> bagslot >> count;
GetPlayer()->BuyItemFromVendor(vendorguid,item,count,bagguid,slot); GetPlayer()->BuyItemFromVendor(vendorguid,item,count,bagguid,slot);
} }
void WorldSession::HandleBuyItemOpcode( WorldPacket & recv_data ) void WorldSession::HandleBuyItemOpcode( WorldPacket & recv_data )
{ {
CHECK_PACKET_SIZE(recv_data,8+4+1+1); CHECK_PACKET_SIZE(recv_data,8+4+4+4+1);
sLog.outDebug( "WORLD: Received CMSG_BUY_ITEM" ); sLog.outDebug( "WORLD: Received CMSG_BUY_ITEM" );
uint64 vendorguid; uint64 vendorguid;
uint32 item; uint32 item, slot, count;
uint8 count, unk1; uint8 unk1;
recv_data >> vendorguid >> item >> count >> unk1; recv_data >> vendorguid >> item >> slot >> count >> unk1;
GetPlayer()->BuyItemFromVendor(vendorguid,item,count,NULL_BAG,NULL_SLOT); GetPlayer()->BuyItemFromVendor(vendorguid,item,count,NULL_BAG,NULL_SLOT);
} }

View file

@ -493,7 +493,7 @@ struct _Socket
uint32 Content; uint32 Content;
}; };
#define MAX_ITEM_PROTO_DAMAGES 5 #define MAX_ITEM_PROTO_DAMAGES 2 // changed in 3.1.0
#define MAX_ITEM_PROTO_SOCKETS 3 #define MAX_ITEM_PROTO_SOCKETS 3
#define MAX_ITEM_PROTO_SPELLS 5 #define MAX_ITEM_PROTO_SPELLS 5
#define MAX_ITEM_PROTO_STATS 10 #define MAX_ITEM_PROTO_STATS 10
@ -567,6 +567,7 @@ struct ItemPrototype
float ArmorDamageModifier; float ArmorDamageModifier;
int32 Duration; // negative = realtime, positive = ingame time int32 Duration; // negative = realtime, positive = ingame time
uint32 ItemLimitCategory; // id from ItemLimitCategory.dbc uint32 ItemLimitCategory; // id from ItemLimitCategory.dbc
uint32 HolidayId; // id from Holidays.dbc
uint32 ScriptId; uint32 ScriptId;
uint32 DisenchantID; uint32 DisenchantID;
uint32 FoodType; uint32 FoodType;

View file

@ -184,6 +184,8 @@ void WorldSession::HandleLfgClearOpcode( WorldPacket & /*recv_data */ )
if( sWorld.getConfig(CONFIG_RESTRICTED_LFG_CHANNEL) && _player->GetSession()->GetSecurity() == SEC_PLAYER ) if( sWorld.getConfig(CONFIG_RESTRICTED_LFG_CHANNEL) && _player->GetSession()->GetSecurity() == SEC_PLAYER )
_player->LeaveLFGChannel(); _player->LeaveLFGChannel();
SendLfgUpdate(0, 0, 0);
} }
void WorldSession::HandleLfmClearOpcode( WorldPacket & /*recv_data */) void WorldSession::HandleLfmClearOpcode( WorldPacket & /*recv_data */)
@ -196,16 +198,18 @@ void WorldSession::HandleLfmClearOpcode( WorldPacket & /*recv_data */)
void WorldSession::HandleSetLfmOpcode( WorldPacket & recv_data ) void WorldSession::HandleSetLfmOpcode( WorldPacket & recv_data )
{ {
CHECK_PACKET_SIZE(recv_data,4); CHECK_PACKET_SIZE(recv_data, 4+1+1+1+1);
sLog.outDebug("CMSG_SET_LOOKING_FOR_MORE"); sLog.outDebug("CMSG_SET_LOOKING_FOR_MORE");
//recv_data.hexlike(); //recv_data.hexlike();
uint32 temp, entry, type; uint32 temp, entry, type;
uint8 unk1;
uint8 unk2[3];
recv_data >> temp; recv_data >> temp >> unk1 >> unk2[0] >> unk2[1] >> unk2[2];
entry = ( temp & 0xFFFF); entry = ( temp & 0x00FFFFFF);
type = ( (temp >> 24) & 0xFFFF); type = ( (temp >> 24) & 0x000000FF);
_player->m_lookingForGroup.more.Set(entry,type); _player->m_lookingForGroup.more.Set(entry,type);
sLog.outDebug("LFM set: temp %u, zone %u, type %u", temp, entry, type); sLog.outDebug("LFM set: temp %u, zone %u, type %u", temp, entry, type);
@ -248,18 +252,53 @@ void WorldSession::HandleLookingForGroup(WorldPacket& recv_data)
AttemptJoin(_player); AttemptJoin(_player);
SendLfgResult(type, entry, 0); SendLfgResult(type, entry, 0);
SendLfgUpdate(0, 1, 0);
} }
void WorldSession::SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type) void WorldSession::SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type)
{ {
uint32 number = 0; uint32 number = 0;
// start prepare packet;
WorldPacket data(MSG_LOOKING_FOR_GROUP); WorldPacket data(MSG_LOOKING_FOR_GROUP);
data << uint32(type); // type data << uint32(type); // type
data << uint32(entry); // entry from LFGDungeons.dbc data << uint32(entry); // entry from LFGDungeons.dbc
data << uint32(0); // count, placeholder
data << uint32(0); // count again, strange, placeholder data << uint8(0);
/*if(uint8)
{
uint32 count1;
for(count1)
{
uint64; // player guid
}
}*/
data << uint32(0); // count2
data << uint32(0);
/*for(count2)
{
uint64 // not player guid
uint32 flags;
if(flags & 0x2)
{
string
}
if(flags & 0x10)
{
uint8
}
if(flags & 0x20)
{
for(3)
{
uint8
}
}
}*/
size_t count3_pos = data.wpos();
data << uint32(0); // count3
data << uint32(0); // unk
//TODO: Guard Player map //TODO: Guard Player map
HashMapHolder<Player>::MapType const& players = ObjectAccessor::Instance().GetPlayers(); HashMapHolder<Player>::MapType const& players = ObjectAccessor::Instance().GetPlayers();
@ -270,70 +309,127 @@ void WorldSession::SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type)
if(!plr || plr->GetTeam() != _player->GetTeam()) if(!plr || plr->GetTeam() != _player->GetTeam())
continue; continue;
if(!plr->m_lookingForGroup.HaveInSlot(entry,type)) if(!plr->m_lookingForGroup.HaveInSlot(entry, type))
continue; continue;
++number; ++number;
data.append(plr->GetPackGUID()); // packed guid data << uint64(plr->GetGUID()); // guid
data << plr->getLevel(); // level
data << plr->GetZoneId(); // current zone
data << lfg_type; // 0x00 - LFG, 0x01 - LFM
for(uint8 j = 0; j < MAX_LOOKING_FOR_GROUP_SLOT; ++j) uint32 flags = 0x1FF;
data << uint32(flags); // flags
if(flags & 0x1)
{ {
data << uint32( plr->m_lookingForGroup.slots[j].entry | (plr->m_lookingForGroup.slots[j].type << 24) ); data << uint8(plr->getLevel());
data << uint8(plr->getClass());
data << uint8(plr->getRace());
for(int i = 0; i < 3; ++i)
data << uint8(0); // spent talents count in specific tab
data << uint32(0); // resistances1
data << uint32(0); // spd/heal
data << uint32(0); // spd/heal
data << uint32(0); // combat_rating9
data << uint32(0); // combat_rating10
data << uint32(0); // combat_rating11
data << float(0); // mp5
data << float(0); // unk
data << uint32(0); // attack power
data << uint32(0); // stat1
data << uint32(0); // maxhealth
data << uint32(0); // maxpower1
data << uint32(0); // unk
data << float(0); // unk
data << uint32(0); // unk
data << uint32(0); // unk
data << uint32(0); // unk
data << uint32(0); // unk
data << uint32(0); // combat_rating20
data << uint32(0); // unk
} }
data << plr->m_lookingForGroup.comment;
Group *group = plr->GetGroup(); if(flags & 0x2)
if(group) data << plr->m_lookingForGroup.comment; // comment
if(flags & 0x4)
data << uint8(0); // unk
if(flags & 0x8)
data << uint64(0); // guid from count2 block, not player guid
if(flags & 0x10)
data << uint8(0); // unk
if(flags & 0x20)
data << uint8(plr->m_lookingForGroup.roles); // roles
if(flags & 0x40)
data << uint32(plr->GetZoneId()); // areaid
if(flags & 0x100)
data << uint8(0); // LFG/LFM flag?
if(flags & 0x80)
{ {
data << group->GetMembersCount()-1; // count of group members without group leader for(uint8 j = 0; j < MAX_LOOKING_FOR_GROUP_SLOT; ++j)
for(GroupReference *itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
{ {
Player *member = itr->getSource(); data << uint32(plr->m_lookingForGroup.slots[j].entry | (plr->m_lookingForGroup.slots[j].type << 24));
if(member && member->GetGUID() != plr->GetGUID())
{
data.append(member->GetPackGUID()); // packed guid
data << member->getLevel(); // player level
}
} }
} }
else
{
data << uint32(0x00);
}
} }
// fill count placeholders data.put<uint32>(count3_pos, number); // fill count placeholder
data.put<uint32>(4+4, number);
data.put<uint32>(4+4+4,number);
SendPacket(&data); SendPacket(&data);
} }
void WorldSession::HandleSetLfgOpcode( WorldPacket & recv_data ) void WorldSession::HandleSetLfgOpcode( WorldPacket & recv_data )
{ {
CHECK_PACKET_SIZE(recv_data,4+4); CHECK_PACKET_SIZE(recv_data, 4+4+1+1);
sLog.outDebug("CMSG_SET_LOOKING_FOR_GROUP"); sLog.outDebug("CMSG_SET_LOOKING_FOR_GROUP");
//recv_data.hexlike(); recv_data.hexlike();
uint32 slot, temp, entry, type; uint32 slot, temp, entry, type;
uint8 roles, unk1;
recv_data >> slot >> temp; recv_data >> slot >> temp >> roles >> unk1;
entry = ( temp & 0xFFFF); entry = ( temp & 0x00FFFFFF);
type = ( (temp >> 24) & 0xFFFF); type = ( (temp >> 24) & 0x000000FF);
if(slot >= MAX_LOOKING_FOR_GROUP_SLOT) if(slot >= MAX_LOOKING_FOR_GROUP_SLOT)
return; return;
_player->m_lookingForGroup.slots[slot].Set(entry,type); _player->m_lookingForGroup.slots[slot].Set(entry, type);
_player->m_lookingForGroup.roles = roles;
sLog.outDebug("LFG set: looknumber %u, temp %X, type %u, entry %u", slot, temp, type, entry); sLog.outDebug("LFG set: looknumber %u, temp %X, type %u, entry %u", slot, temp, type, entry);
if(LookingForGroup_auto_join) if(LookingForGroup_auto_join)
AttemptJoin(_player); AttemptJoin(_player);
SendLfgResult(type, entry, 0); //SendLfgResult(type, entry, 0);
SendLfgUpdate(0, 1, 0);
}
void WorldSession::HandleLfgSetRoles(WorldPacket &recv_data)
{
CHECK_PACKET_SIZE(recv_data, 1);
sLog.outDebug("CMSG_LFG_SET_ROLES");
uint8 roles;
recv_data >> roles;
_player->m_lookingForGroup.roles = roles;
}
void WorldSession::SendLfgUpdate(uint8 unk1, uint8 unk2, uint8 unk3)
{
WorldPacket data(SMSG_LFG_UPDATE, 3);
data << uint8(unk1);
data << uint8(unk2);
data << uint8(unk3);
SendPacket(&data);
} }

View file

@ -648,9 +648,6 @@ bool ChatHandler::HandleGameObjectMoveCommand(const char* args)
map->Remove(obj,false); map->Remove(obj,false);
obj->Relocate(chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), obj->GetOrientation()); obj->Relocate(chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), obj->GetOrientation());
obj->SetFloatValue(GAMEOBJECT_POS_X, chr->GetPositionX());
obj->SetFloatValue(GAMEOBJECT_POS_Y, chr->GetPositionY());
obj->SetFloatValue(GAMEOBJECT_POS_Z, chr->GetPositionZ());
map->Add(obj); map->Add(obj);
} }
@ -674,9 +671,6 @@ bool ChatHandler::HandleGameObjectMoveCommand(const char* args)
map->Remove(obj,false); map->Remove(obj,false);
obj->Relocate(x, y, z, obj->GetOrientation()); obj->Relocate(x, y, z, obj->GetOrientation());
obj->SetFloatValue(GAMEOBJECT_POS_X, x);
obj->SetFloatValue(GAMEOBJECT_POS_Y, y);
obj->SetFloatValue(GAMEOBJECT_POS_Z, z);
map->Add(obj); map->Add(obj);
} }

View file

@ -276,7 +276,7 @@ void WorldSession::HandleLogoutRequestOpcode( WorldPacket & /*recv_data*/ )
if( GetPlayer()->isInCombat() || //...is in combat if( GetPlayer()->isInCombat() || //...is in combat
GetPlayer()->duel || //...is in Duel GetPlayer()->duel || //...is in Duel
//...is jumping ...is falling //...is jumping ...is falling
GetPlayer()->HasUnitMovementFlag(MOVEMENTFLAG_JUMPING | MOVEMENTFLAG_FALLING)) GetPlayer()->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_JUMPING | MOVEMENTFLAG_FALLING))
{ {
WorldPacket data( SMSG_LOGOUT_RESPONSE, (2+4) ) ; WorldPacket data( SMSG_LOGOUT_RESPONSE, (2+4) ) ;
data << (uint8)0xC; data << (uint8)0xC;
@ -1001,6 +1001,11 @@ void WorldSession::HandleSetActionButtonOpcode(WorldPacket& recv_data)
sLog.outDetail( "MISC: Added Macro %u into button %u", action, button ); sLog.outDetail( "MISC: Added Macro %u into button %u", action, button );
GetPlayer()->addActionButton(button,action,type,misc); GetPlayer()->addActionButton(button,action,type,misc);
} }
else if(type==ACTION_BUTTON_EQSET)
{
sLog.outDetail( "MISC: Added EquipmentSet %u into button %u", action, button );
GetPlayer()->addActionButton(button,action,type,misc);
}
else if(type==ACTION_BUTTON_SPELL) else if(type==ACTION_BUTTON_SPELL)
{ {
sLog.outDetail( "MISC: Added Spell %u into button %u", action, button ); sLog.outDetail( "MISC: Added Spell %u into button %u", action, button );
@ -1154,9 +1159,10 @@ void WorldSession::HandlePlayedTime(WorldPacket& /*recv_data*/)
uint32 TotalTimePlayed = GetPlayer()->GetTotalPlayedTime(); uint32 TotalTimePlayed = GetPlayer()->GetTotalPlayedTime();
uint32 LevelPlayedTime = GetPlayer()->GetLevelPlayedTime(); uint32 LevelPlayedTime = GetPlayer()->GetLevelPlayedTime();
WorldPacket data(SMSG_PLAYED_TIME, 8); WorldPacket data(SMSG_PLAYED_TIME, 9);
data << TotalTimePlayed; data << TotalTimePlayed;
data << LevelPlayedTime; data << LevelPlayedTime;
data << uint8(0);
SendPacket(&data); SendPacket(&data);
} }
@ -1174,76 +1180,20 @@ void WorldSession::HandleInspectOpcode(WorldPacket& recv_data)
if(!plr) // wrong player if(!plr) // wrong player
return; return;
uint32 talent_points = 0x3D; WorldPacket data(SMSG_INSPECT_TALENT, 50);
uint32 guid_size = plr->GetPackGUID().size();
WorldPacket data(SMSG_INSPECT_TALENT, 4+talent_points);
data.append(plr->GetPackGUID()); data.append(plr->GetPackGUID());
data << uint32(talent_points);
// fill by 0 talents array
for(uint32 i = 0; i < talent_points; ++i)
data << uint8(0);
if(sWorld.getConfig(CONFIG_TALENTS_INSPECTING) || _player->isGameMaster()) if(sWorld.getConfig(CONFIG_TALENTS_INSPECTING) || _player->isGameMaster())
{ {
// find class talent tabs (all players have 3 talent tabs) plr->BuildPlayerTalentsInfoData(&data);
uint32 const* talentTabIds = GetTalentTabPages(plr->getClass()); plr->BuildEnchantmentsInfoData(&data);
}
uint32 talentTabPos = 0; // pos of first talent rank in tab including all prev tabs else
for(uint32 i = 0; i < 3; ++i) {
{ data << uint32(0); // unspentTalentPoints
uint32 talentTabId = talentTabIds[i]; data << uint8(0); // talentGroupCount
data << uint8(0); // talentGroupIndex
// fill by real data data << uint32(0); // slotUsedMask
for(uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
{
TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
if(!talentInfo)
continue;
// skip another tab talents
if(talentInfo->TalentTab != talentTabId)
continue;
// find talent rank
uint32 curtalent_maxrank = 0;
for(uint32 k = MAX_TALENT_RANK; k > 0; --k)
{
if(talentInfo->RankID[k-1] && plr->HasSpell(talentInfo->RankID[k-1]))
{
curtalent_maxrank = k;
break;
}
}
// not learned talent
if(!curtalent_maxrank)
continue;
// 1 rank talent bit index
uint32 curtalent_index = talentTabPos + GetTalentInspectBitPosInTab(talentId);
uint32 curtalent_rank_index = curtalent_index+curtalent_maxrank-1;
// slot/offset in 7-bit bytes
uint32 curtalent_rank_slot7 = curtalent_rank_index / 7;
uint32 curtalent_rank_offset7 = curtalent_rank_index % 7;
// rank pos with skipped 8 bit
uint32 curtalent_rank_index2 = curtalent_rank_slot7 * 8 + curtalent_rank_offset7;
// slot/offset in 8-bit bytes with skipped high bit
uint32 curtalent_rank_slot = curtalent_rank_index2 / 8;
uint32 curtalent_rank_offset = curtalent_rank_index2 % 8;
// apply mask
uint32 val = data.read<uint8>(guid_size + 4 + curtalent_rank_slot);
val |= (1 << curtalent_rank_offset);
data.put<uint8>(guid_size + 4 + curtalent_rank_slot, val & 0xFF);
}
talentTabPos += GetTalentTabInspectBitSize(talentTabId);
}
} }
SendPacket(&data); SendPacket(&data);
@ -1471,7 +1421,7 @@ void WorldSession::HandleSetTitleOpcode( WorldPacket & recv_data )
recv_data >> title; recv_data >> title;
// -1 at none // -1 at none
if(title > 0 && title < 128) if(title > 0 && title < 192)
{ {
if(!GetPlayer()->HasTitle(title)) if(!GetPlayer()->HasTitle(title))
return; return;
@ -1592,7 +1542,7 @@ void WorldSession::HandleMoveSetCanFlyAckOpcode( WorldPacket & recv_data )
recv_data >> guid >> unk >> flags; recv_data >> guid >> unk >> flags;
_player->SetUnitMovementFlags(flags); _player->m_movementInfo.flags = flags;
} }
void WorldSession::HandleRequestPetInfoOpcode( WorldPacket & /*recv_data */) void WorldSession::HandleRequestPetInfoOpcode( WorldPacket & /*recv_data */)

View file

@ -296,7 +296,6 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
{ {
plMover->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); plMover->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
plMover->m_movementInfo = movementInfo; plMover->m_movementInfo = movementInfo;
plMover->SetUnitMovementFlags(movementInfo.flags);
plMover->UpdateFallInformationIfNeed(movementInfo,recv_data.GetOpcode()); plMover->UpdateFallInformationIfNeed(movementInfo,recv_data.GetOpcode());
if(plMover->isMovingOrTurning()) if(plMover->isMovingOrTurning())

View file

@ -123,7 +123,7 @@ void Object::_Create( uint32 guidlow, uint32 entry, HighGuid guidhigh )
void Object::BuildMovementUpdateBlock(UpdateData * data, uint32 flags ) const void Object::BuildMovementUpdateBlock(UpdateData * data, uint32 flags ) const
{ {
ByteBuffer buf(50); ByteBuffer buf(500);
buf << uint8( UPDATETYPE_MOVEMENT ); buf << uint8( UPDATETYPE_MOVEMENT );
buf.append(GetPackGUID()); buf.append(GetPackGUID());
@ -139,7 +139,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) c
return; return;
uint8 updatetype = UPDATETYPE_CREATE_OBJECT; uint8 updatetype = UPDATETYPE_CREATE_OBJECT;
uint8 flags = m_updateFlag; uint16 flags = m_updateFlag;
uint32 flags2 = 0; uint32 flags2 = 0;
/** lower flag1 **/ /** lower flag1 **/
@ -184,7 +184,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) c
//sLog.outDebug("BuildCreateUpdate: update-type: %u, object-type: %u got flags: %X, flags2: %X", updatetype, m_objectTypeId, flags, flags2); //sLog.outDebug("BuildCreateUpdate: update-type: %u, object-type: %u got flags: %X, flags2: %X", updatetype, m_objectTypeId, flags, flags2);
ByteBuffer buf(50); ByteBuffer buf(500);
buf << (uint8)updatetype; buf << (uint8)updatetype;
buf.append(GetPackGUID()); buf.append(GetPackGUID());
buf << (uint8)m_objectTypeId; buf << (uint8)m_objectTypeId;
@ -221,7 +221,7 @@ void Object::SendUpdateToPlayer(Player* player)
void Object::BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target) const void Object::BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target) const
{ {
ByteBuffer buf(50); ByteBuffer buf(500);
buf << (uint8) UPDATETYPE_VALUES; buf << (uint8) UPDATETYPE_VALUES;
buf.append(GetPackGUID()); buf.append(GetPackGUID());
@ -250,7 +250,7 @@ void Object::DestroyForPlayer(Player *target) const
target->GetSession()->SendPacket( &data ); target->GetSession()->SendPacket( &data );
} }
void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2) const void Object::_BuildMovementUpdate(ByteBuffer * data, uint16 flags, uint32 flags2) const
{ {
uint16 unk_flags = ((GetTypeId() == TYPEID_PLAYER) ? ((Player*)this)->m_movementInfo.unk1 : 0); uint16 unk_flags = ((GetTypeId() == TYPEID_PLAYER) ? ((Player*)this)->m_movementInfo.unk1 : 0);
@ -258,7 +258,7 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
if(((Creature*)this)->isVehicle()) if(((Creature*)this)->isVehicle())
unk_flags |= 0x20; // always allow pitch unk_flags |= 0x20; // always allow pitch
*data << (uint8)flags; // update flags *data << (uint16)flags; // update flags
// 0x20 // 0x20
if (flags & UPDATEFLAG_LIVING) if (flags & UPDATEFLAG_LIVING)
@ -267,12 +267,12 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
{ {
case TYPEID_UNIT: case TYPEID_UNIT:
{ {
flags2 = ((Unit*)this)->GetUnitMovementFlags(); flags2 = ((Unit*)this)->isInFlight() ? (MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_LEVITATING) : MOVEMENTFLAG_NONE;
} }
break; break;
case TYPEID_PLAYER: case TYPEID_PLAYER:
{ {
flags2 = ((Player*)this)->GetUnitMovementFlags(); flags2 = ((Player*)this)->m_movementInfo.GetMovementFlags();
if(((Player*)this)->GetTransport()) if(((Player*)this)->GetTransport())
flags2 |= MOVEMENTFLAG_ONTRANSPORT; flags2 |= MOVEMENTFLAG_ONTRANSPORT;
@ -294,37 +294,19 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
*data << uint32(flags2); // movement flags *data << uint32(flags2); // movement flags
*data << uint16(unk_flags); // unknown 2.3.0 *data << uint16(unk_flags); // unknown 2.3.0
*data << uint32(getMSTime()); // time (in milliseconds) *data << uint32(getMSTime()); // time (in milliseconds)
}
// 0x40 // position
if (flags & UPDATEFLAG_HAS_POSITION) *data << ((WorldObject*)this)->GetPositionX();
{ *data << ((WorldObject*)this)->GetPositionY();
// 0x02 *data << ((WorldObject*)this)->GetPositionZ();
if(flags & UPDATEFLAG_TRANSPORT && ((GameObject*)this)->GetGoType() == GAMEOBJECT_TYPE_MO_TRANSPORT) *data << ((WorldObject*)this)->GetOrientation();
{
*data << (float)0;
*data << (float)0;
*data << (float)0;
*data << ((WorldObject *)this)->GetOrientation();
}
else
{
*data << ((WorldObject *)this)->GetPositionX();
*data << ((WorldObject *)this)->GetPositionY();
*data << ((WorldObject *)this)->GetPositionZ();
*data << ((WorldObject *)this)->GetOrientation();
}
}
// 0x20
if(flags & UPDATEFLAG_LIVING)
{
// 0x00000200 // 0x00000200
if(flags2 & MOVEMENTFLAG_ONTRANSPORT) if(flags2 & MOVEMENTFLAG_ONTRANSPORT)
{ {
if(GetTypeId() == TYPEID_PLAYER) if(GetTypeId() == TYPEID_PLAYER)
{ {
*data << (uint64)((Player*)this)->GetTransport()->GetGUID(); data->append(((Player*)this)->GetTransport()->GetPackGUID());
*data << (float)((Player*)this)->GetTransOffsetX(); *data << (float)((Player*)this)->GetTransOffsetX();
*data << (float)((Player*)this)->GetTransOffsetY(); *data << (float)((Player*)this)->GetTransOffsetY();
*data << (float)((Player*)this)->GetTransOffsetZ(); *data << (float)((Player*)this)->GetTransOffsetZ();
@ -406,25 +388,27 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
FlightPathMovementGenerator *fmg = (FlightPathMovementGenerator*)(((Player*)this)->GetMotionMaster()->top()); FlightPathMovementGenerator *fmg = (FlightPathMovementGenerator*)(((Player*)this)->GetMotionMaster()->top());
uint32 flags3 = 0x00000300; uint32 flags3 = MONSTER_MOVE_SPLINE_FLY;
*data << uint32(flags3); // splines flag? *data << uint32(flags3); // splines flag?
if(flags3 & 0x10000) // probably x,y,z coords there if(flags3 & 0x20000) // may be orientation
{ {
*data << (float)0; *data << (float)0;
*data << (float)0;
*data << (float)0;
} }
else
if(flags3 & 0x20000) // probably guid there
{ {
*data << uint64(0); if(flags3 & 0x8000) // probably x,y,z coords there
} {
*data << (float)0;
*data << (float)0;
*data << (float)0;
}
if(flags3 & 0x40000) // may be orientation if(flags3 & 0x10000) // probably guid there
{ {
*data << (float)0; *data << uint64(0);
}
} }
Path &path = fmg->GetPath(); Path &path = fmg->GetPath();
@ -439,8 +423,13 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
*data << uint32(traveltime); // full move time? *data << uint32(traveltime); // full move time?
*data << uint32(0); // ticks count? *data << uint32(0); // ticks count?
uint32 poscount = uint32(path.Size()); *data << float(0); // added in 3.1
*data << float(0); // added in 3.1
*data << float(0); // added in 3.1
*data << uint32(0); // added in 3.1
uint32 poscount = uint32(path.Size());
*data << uint32(poscount); // points count *data << uint32(poscount); // points count
for(uint32 i = 0; i < poscount; ++i) for(uint32 i = 0; i < poscount; ++i)
@ -452,22 +441,50 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
*data << uint8(0); // added in 3.0.8 *data << uint8(0); // added in 3.0.8
/*for(uint32 i = 0; i < poscount; i++)
{
// path points
*data << (float)0;
*data << (float)0;
*data << (float)0;
}*/
*data << path.GetNodes()[poscount-1].x; *data << path.GetNodes()[poscount-1].x;
*data << path.GetNodes()[poscount-1].y; *data << path.GetNodes()[poscount-1].y;
*data << path.GetNodes()[poscount-1].z; *data << path.GetNodes()[poscount-1].z;
}
}
else
{
if(flags & UPDATEFLAG_POSITION)
{
*data << uint8(0); // unk PGUID!
*data << ((WorldObject*)this)->GetPositionX();
*data << ((WorldObject*)this)->GetPositionY();
*data << ((WorldObject*)this)->GetPositionZ();
*data << ((WorldObject*)this)->GetPositionX();
*data << ((WorldObject*)this)->GetPositionY();
*data << ((WorldObject*)this)->GetPositionZ();
*data << ((WorldObject*)this)->GetOrientation();
// target position (path end) if(GetTypeId() == TYPEID_CORPSE)
/**data << ((Unit*)this)->GetPositionX(); *data << float(((WorldObject*)this)->GetOrientation());
*data << ((Unit*)this)->GetPositionY(); else
*data << ((Unit*)this)->GetPositionZ();*/ *data << float(0);
}
else
{
// 0x40
if (flags & UPDATEFLAG_HAS_POSITION)
{
// 0x02
if(flags & UPDATEFLAG_TRANSPORT && ((GameObject*)this)->GetGoType() == GAMEOBJECT_TYPE_MO_TRANSPORT)
{
*data << (float)0;
*data << (float)0;
*data << (float)0;
*data << ((WorldObject *)this)->GetOrientation();
}
else
{
*data << ((WorldObject *)this)->GetPositionX();
*data << ((WorldObject *)this)->GetPositionY();
*data << ((WorldObject *)this)->GetPositionZ();
*data << ((WorldObject *)this)->GetOrientation();
}
}
} }
} }
@ -548,6 +565,12 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
*data << uint32(((Vehicle*)this)->GetVehicleId()); // vehicle id *data << uint32(((Vehicle*)this)->GetVehicleId()); // vehicle id
*data << float(0); // facing adjustment *data << float(0); // facing adjustment
} }
// 0x200
if(flags & UPDATEFLAG_ROTATION)
{
*data << uint64(((GameObject*)this)->GetRotation());
}
} }
void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask *updateMask, Player *target) const void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask *updateMask, Player *target) const
@ -588,7 +611,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
// 2 specialized loops for speed optimization in non-unit case // 2 specialized loops for speed optimization in non-unit case
if(isType(TYPEMASK_UNIT)) // unit (creature/player) case if(isType(TYPEMASK_UNIT)) // unit (creature/player) case
{ {
for( uint16 index = 0; index < m_valuesCount; index ++ ) for( uint16 index = 0; index < m_valuesCount; ++index )
{ {
if( updateMask->GetBit( index ) ) if( updateMask->GetBit( index ) )
{ {
@ -639,7 +662,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
} }
else if(isType(TYPEMASK_GAMEOBJECT)) // gameobject case else if(isType(TYPEMASK_GAMEOBJECT)) // gameobject case
{ {
for( uint16 index = 0; index < m_valuesCount; index ++ ) for( uint16 index = 0; index < m_valuesCount; ++index )
{ {
if( updateMask->GetBit( index ) ) if( updateMask->GetBit( index ) )
{ {
@ -671,7 +694,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
} }
else // other objects case (no special index checks) else // other objects case (no special index checks)
{ {
for( uint16 index = 0; index < m_valuesCount; index ++ ) for( uint16 index = 0; index < m_valuesCount; ++index )
{ {
if( updateMask->GetBit( index ) ) if( updateMask->GetBit( index ) )
{ {
@ -684,7 +707,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
void Object::ClearUpdateMask(bool remove) void Object::ClearUpdateMask(bool remove)
{ {
for( uint16 index = 0; index < m_valuesCount; index ++ ) for( uint16 index = 0; index < m_valuesCount; ++index )
{ {
if(m_uint32Values_mirror[index]!= m_uint32Values[index]) if(m_uint32Values_mirror[index]!= m_uint32Values[index])
m_uint32Values_mirror[index] = m_uint32Values[index]; m_uint32Values_mirror[index] = m_uint32Values[index];
@ -732,7 +755,7 @@ bool Object::LoadValues(const char* data)
void Object::_SetUpdateBits(UpdateMask *updateMask, Player* /*target*/) const void Object::_SetUpdateBits(UpdateMask *updateMask, Player* /*target*/) const
{ {
for( uint16 index = 0; index < m_valuesCount; index ++ ) for( uint16 index = 0; index < m_valuesCount; ++index )
{ {
if(m_uint32Values_mirror[index]!= m_uint32Values[index]) if(m_uint32Values_mirror[index]!= m_uint32Values[index])
updateMask->SetBit(index); updateMask->SetBit(index);
@ -741,7 +764,7 @@ void Object::_SetUpdateBits(UpdateMask *updateMask, Player* /*target*/) const
void Object::_SetCreateBits(UpdateMask *updateMask, Player* /*target*/) const void Object::_SetCreateBits(UpdateMask *updateMask, Player* /*target*/) const
{ {
for( uint16 index = 0; index < m_valuesCount; index++ ) for( uint16 index = 0; index < m_valuesCount; ++index )
{ {
if(GetUInt32Value(index) != 0) if(GetUInt32Value(index) != 0)
updateMask->SetBit(index); updateMask->SetBit(index);
@ -860,7 +883,7 @@ void Object::SetUInt16Value( uint16 index, uint8 offset, uint16 value )
return; return;
} }
if(uint8(m_uint32Values[ index ] >> (offset * 16)) != value) if(uint16(m_uint32Values[ index ] >> (offset * 16)) != value)
{ {
m_uint32Values[ index ] &= ~uint32(uint32(0xFFFF) << (offset * 16)); m_uint32Values[ index ] &= ~uint32(uint32(0xFFFF) << (offset * 16));
m_uint32Values[ index ] |= uint32(uint32(value) << (offset * 16)); m_uint32Values[ index ] |= uint32(uint32(value) << (offset * 16));

View file

@ -307,13 +307,13 @@ class MANGOS_DLL_SPEC Object
virtual void _SetUpdateBits(UpdateMask *updateMask, Player *target) const; virtual void _SetUpdateBits(UpdateMask *updateMask, Player *target) const;
virtual void _SetCreateBits(UpdateMask *updateMask, Player *target) const; virtual void _SetCreateBits(UpdateMask *updateMask, Player *target) const;
void _BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2 ) const; void _BuildMovementUpdate(ByteBuffer * data, uint16 flags, uint32 flags2 ) const;
void _BuildValuesUpdate(uint8 updatetype, ByteBuffer *data, UpdateMask *updateMask, Player *target ) const; void _BuildValuesUpdate(uint8 updatetype, ByteBuffer *data, UpdateMask *updateMask, Player *target ) const;
uint16 m_objectType; uint16 m_objectType;
uint8 m_objectTypeId; uint8 m_objectTypeId;
uint8 m_updateFlag; uint16 m_updateFlag;
union union
{ {

View file

@ -90,31 +90,36 @@ Object* ObjectAccessor::GetObjectByTypeMask(WorldObject const &p, uint64 guid, u
if(typemask & TYPEMASK_PLAYER) if(typemask & TYPEMASK_PLAYER)
{ {
obj = FindPlayer(guid); obj = FindPlayer(guid);
if(obj) return obj; if(obj)
return obj;
} }
if(typemask & TYPEMASK_UNIT) if(typemask & TYPEMASK_UNIT)
{ {
obj = GetCreatureOrPetOrVehicle(p,guid); obj = GetCreatureOrPetOrVehicle(p,guid);
if(obj) return obj; if(obj)
return obj;
} }
if(typemask & TYPEMASK_GAMEOBJECT) if(typemask & TYPEMASK_GAMEOBJECT)
{ {
obj = p.GetMap()->GetGameObject(guid); obj = p.GetMap()->GetGameObject(guid);
if(obj) return obj; if(obj)
return obj;
} }
if(typemask & TYPEMASK_DYNAMICOBJECT) if(typemask & TYPEMASK_DYNAMICOBJECT)
{ {
obj = p.GetMap()->GetDynamicObject(guid); obj = p.GetMap()->GetDynamicObject(guid);
if(obj) return obj; if(obj)
return obj;
} }
if(typemask & TYPEMASK_ITEM && p.GetTypeId() == TYPEID_PLAYER) if(typemask & TYPEMASK_ITEM && p.GetTypeId() == TYPEID_PLAYER)
{ {
obj = ((Player const &)p).GetItemByGuid( guid ); obj = ((Player const &)p).GetItemByGuid( guid );
if(obj) return obj; if(obj)
return obj;
} }
return NULL; return NULL;
@ -262,7 +267,7 @@ ObjectAccessor::RemoveCorpse(Corpse *corpse)
CellPair cell_pair = MaNGOS::ComputeCellPair(corpse->GetPositionX(), corpse->GetPositionY()); CellPair cell_pair = MaNGOS::ComputeCellPair(corpse->GetPositionX(), corpse->GetPositionY());
uint32 cell_id = (cell_pair.y_coord*TOTAL_NUMBER_OF_CELLS_PER_MAP) + cell_pair.x_coord; uint32 cell_id = (cell_pair.y_coord*TOTAL_NUMBER_OF_CELLS_PER_MAP) + cell_pair.x_coord;
objmgr.DeleteCorpseCellData(corpse->GetMapId(),cell_id,corpse->GetOwnerGUID()); objmgr.DeleteCorpseCellData(corpse->GetMapId(), cell_id, corpse->GetOwnerGUID());
corpse->RemoveFromWorld(); corpse->RemoveFromWorld();
i_player2corpse.erase(iter); i_player2corpse.erase(iter);
@ -281,7 +286,7 @@ ObjectAccessor::AddCorpse(Corpse *corpse)
CellPair cell_pair = MaNGOS::ComputeCellPair(corpse->GetPositionX(), corpse->GetPositionY()); CellPair cell_pair = MaNGOS::ComputeCellPair(corpse->GetPositionX(), corpse->GetPositionY());
uint32 cell_id = (cell_pair.y_coord*TOTAL_NUMBER_OF_CELLS_PER_MAP) + cell_pair.x_coord; uint32 cell_id = (cell_pair.y_coord*TOTAL_NUMBER_OF_CELLS_PER_MAP) + cell_pair.x_coord;
objmgr.AddCorpseCellData(corpse->GetMapId(),cell_id,corpse->GetOwnerGUID(),corpse->GetInstanceId()); objmgr.AddCorpseCellData(corpse->GetMapId(), cell_id, corpse->GetOwnerGUID(), corpse->GetInstanceId());
} }
void void
@ -289,19 +294,19 @@ ObjectAccessor::AddCorpsesToGrid(GridPair const& gridpair,GridType& grid,Map* ma
{ {
Guard guard(i_corpseGuard); Guard guard(i_corpseGuard);
for(Player2CorpsesMapType::iterator iter = i_player2corpse.begin(); iter != i_player2corpse.end(); ++iter) for(Player2CorpsesMapType::iterator iter = i_player2corpse.begin(); iter != i_player2corpse.end(); ++iter)
if(iter->second->GetGrid()==gridpair) if(iter->second->GetGrid() == gridpair)
{ {
// verify, if the corpse in our instance (add only corpses which are) // verify, if the corpse in our instance (add only corpses which are)
if (map->Instanceable()) if (map->Instanceable())
{ {
if (iter->second->GetInstanceId() == map->GetInstanceId()) if (iter->second->GetInstanceId() == map->GetInstanceId())
{ {
grid.AddWorldObject(iter->second,iter->second->GetGUID()); grid.AddWorldObject(iter->second, iter->second->GetGUID());
} }
} }
else else
{ {
grid.AddWorldObject(iter->second,iter->second->GetGUID()); grid.AddWorldObject(iter->second, iter->second->GetGUID());
} }
} }
} }
@ -323,10 +328,11 @@ ObjectAccessor::ConvertCorpseForPlayer(uint64 player_guid, bool insignia)
// remove corpse from player_guid -> corpse map // remove corpse from player_guid -> corpse map
RemoveCorpse(corpse); RemoveCorpse(corpse);
// remove resurrectble corpse from grid object registry (loaded state checked into call) // remove resurrectable corpse from grid object registry (loaded state checked into call)
// do not load the map if it's not loaded // do not load the map if it's not loaded
Map *map = MapManager::Instance().FindMap(corpse->GetMapId(), corpse->GetInstanceId()); Map *map = MapManager::Instance().FindMap(corpse->GetMapId(), corpse->GetInstanceId());
if(map) map->Remove(corpse,false); if(map)
map->Remove(corpse, false);
// remove corpse from DB // remove corpse from DB
corpse->DeleteFromDB(); corpse->DeleteFromDB();
@ -342,7 +348,7 @@ ObjectAccessor::ConvertCorpseForPlayer(uint64 player_guid, bool insignia)
bones = new Corpse; bones = new Corpse;
bones->Create(corpse->GetGUIDLow()); bones->Create(corpse->GetGUIDLow());
for (int i = 3; i < CORPSE_END; i++) // don't overwrite guid and object type for (int i = 3; i < CORPSE_END; ++i) // don't overwrite guid and object type
bones->SetUInt32Value(i, corpse->GetUInt32Value(i)); bones->SetUInt32Value(i, corpse->GetUInt32Value(i));
bones->SetGrid(corpse->GetGrid()); bones->SetGrid(corpse->GetGrid());
@ -352,12 +358,12 @@ ObjectAccessor::ConvertCorpseForPlayer(uint64 player_guid, bool insignia)
bones->Relocate(corpse->GetPositionX(), corpse->GetPositionY(), corpse->GetPositionZ(), corpse->GetOrientation()); bones->Relocate(corpse->GetPositionX(), corpse->GetPositionY(), corpse->GetPositionZ(), corpse->GetOrientation());
bones->SetMapId(corpse->GetMapId()); bones->SetMapId(corpse->GetMapId());
bones->SetInstanceId(corpse->GetInstanceId()); bones->SetInstanceId(corpse->GetInstanceId());
bones->SetPhaseMask(corpse->GetPhaseMask(),false); bones->SetPhaseMask(corpse->GetPhaseMask(), false);
bones->SetUInt32Value(CORPSE_FIELD_FLAGS, CORPSE_FLAG_UNK2 | CORPSE_FLAG_BONES); bones->SetUInt32Value(CORPSE_FIELD_FLAGS, CORPSE_FLAG_UNK2 | CORPSE_FLAG_BONES);
bones->SetUInt64Value(CORPSE_FIELD_OWNER, 0); bones->SetUInt64Value(CORPSE_FIELD_OWNER, 0);
for (int i = 0; i < EQUIPMENT_SLOT_END; i++) for (int i = 0; i < EQUIPMENT_SLOT_END; ++i)
{ {
if(corpse->GetUInt32Value(CORPSE_FIELD_ITEM + i)) if(corpse->GetUInt32Value(CORPSE_FIELD_ITEM + i))
bones->SetUInt32Value(CORPSE_FIELD_ITEM + i, 0); bones->SetUInt32Value(CORPSE_FIELD_ITEM + i, 0);
@ -422,7 +428,7 @@ ObjectAccessor::UpdateObjectVisibility(WorldObject *obj)
CellPair p = MaNGOS::ComputeCellPair(obj->GetPositionX(), obj->GetPositionY()); CellPair p = MaNGOS::ComputeCellPair(obj->GetPositionX(), obj->GetPositionY());
Cell cell(p); Cell cell(p);
obj->GetMap()->UpdateObjectVisibility(obj,cell,p); obj->GetMap()->UpdateObjectVisibility(obj, cell, p);
} }
void ObjectAccessor::UpdateVisibilityForPlayer( Player* player ) void ObjectAccessor::UpdateVisibilityForPlayer( Player* player )
@ -431,8 +437,8 @@ void ObjectAccessor::UpdateVisibilityForPlayer( Player* player )
Cell cell(p); Cell cell(p);
Map* m = player->GetMap(); Map* m = player->GetMap();
m->UpdatePlayerVisibility(player,cell,p); m->UpdatePlayerVisibility(player, cell, p);
m->UpdateObjectsVisibilityFor(player,cell,p); m->UpdateObjectsVisibilityFor(player, cell, p);
} }
/// Define the static member of HashMapHolder /// Define the static member of HashMapHolder

View file

@ -119,6 +119,7 @@ ObjectMgr::ObjectMgr()
m_hiPetNumber = 1; m_hiPetNumber = 1;
m_ItemTextId = 1; m_ItemTextId = 1;
m_mailid = 1; m_mailid = 1;
m_equipmentSetGuid = 1;
m_guildId = 1; m_guildId = 1;
m_arenaTeamId = 1; m_arenaTeamId = 1;
m_auctionid = 1; m_auctionid = 1;
@ -5265,6 +5266,13 @@ void ObjectMgr::SetHighestGuids()
delete result; delete result;
} }
result = CharacterDatabase.Query("SELECT MAX(setguid) FROM character_equipmentsets");
if (result)
{
m_equipmentSetGuid = (*result)[0].GetUInt64()+1;
delete result;
}
result = CharacterDatabase.Query( "SELECT MAX(guildid) FROM guild" ); result = CharacterDatabase.Query( "SELECT MAX(guildid) FROM guild" );
if (result) if (result)
{ {
@ -5293,6 +5301,16 @@ uint32 ObjectMgr::GenerateAuctionID()
return m_auctionid++; return m_auctionid++;
} }
uint64 ObjectMgr::GenerateEquipmentSetGuid()
{
if(m_equipmentSetGuid>=0xFFFFFFFFFFFFFFFEll)
{
sLog.outError("EquipmentSet guid overflow!! Can't continue, shutting down server. ");
World::StopNow(ERROR_EXIT_CODE);
}
return m_equipmentSetGuid++;
}
uint32 ObjectMgr::GenerateGuildId() uint32 ObjectMgr::GenerateGuildId()
{ {
if(m_guildId>=0xFFFFFFFE) if(m_guildId>=0xFFFFFFFE)

View file

@ -558,6 +558,7 @@ class ObjectMgr
uint32 GenerateLowGuid(HighGuid guidhigh); uint32 GenerateLowGuid(HighGuid guidhigh);
uint32 GenerateArenaTeamId(); uint32 GenerateArenaTeamId();
uint32 GenerateAuctionID(); uint32 GenerateAuctionID();
uint64 GenerateEquipmentSetGuid();
uint32 GenerateGuildId(); uint32 GenerateGuildId();
uint32 GenerateItemTextID(); uint32 GenerateItemTextID();
uint32 GenerateMailID(); uint32 GenerateMailID();
@ -765,6 +766,7 @@ class ObjectMgr
// first free id for selected id type // first free id for selected id type
uint32 m_arenaTeamId; uint32 m_arenaTeamId;
uint32 m_auctionid; uint32 m_auctionid;
uint64 m_equipmentSetGuid;
uint32 m_guildId; uint32 m_guildId;
uint32 m_ItemTextId; uint32 m_ItemTextId;
uint32 m_mailid; uint32 m_mailid;

View file

@ -337,15 +337,15 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
/*0x134*/ { "SMSG_SPELL_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x134*/ { "SMSG_SPELL_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x135*/ { "SMSG_COOLDOWN_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x135*/ { "SMSG_COOLDOWN_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x136*/ { "CMSG_CANCEL_AURA", STATUS_LOGGEDIN, &WorldSession::HandleCancelAuraOpcode }, /*0x136*/ { "CMSG_CANCEL_AURA", STATUS_LOGGEDIN, &WorldSession::HandleCancelAuraOpcode },
/*0x137*/ { "SMSG_UPDATE_AURA_DURATION_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x137*/ { "SMSG_EQUIPMENT_SET_SAVED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x138*/ { "SMSG_PET_CAST_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x138*/ { "SMSG_PET_CAST_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x139*/ { "MSG_CHANNEL_START", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x139*/ { "MSG_CHANNEL_START", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x13A*/ { "MSG_CHANNEL_UPDATE", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x13A*/ { "MSG_CHANNEL_UPDATE", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x13B*/ { "CMSG_CANCEL_CHANNELLING", STATUS_LOGGEDIN, &WorldSession::HandleCancelChanneling }, /*0x13B*/ { "CMSG_CANCEL_CHANNELLING", STATUS_LOGGEDIN, &WorldSession::HandleCancelChanneling },
/*0x13C*/ { "SMSG_AI_REACTION", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x13C*/ { "SMSG_AI_REACTION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x13D*/ { "CMSG_SET_SELECTION", STATUS_LOGGEDIN, &WorldSession::HandleSetSelectionOpcode }, /*0x13D*/ { "CMSG_SET_SELECTION", STATUS_LOGGEDIN, &WorldSession::HandleSetSelectionOpcode },
/*0x13E*/ { "CMSG_SET_TARGET_OBSOLETE", STATUS_LOGGEDIN, &WorldSession::HandleSetTargetOpcode }, /*0x13E*/ { "CMSG_EQUIPMENT_SET_DELETE", STATUS_LOGGEDIN, &WorldSession::HandleEquipmentSetDelete },
/*0x13F*/ { "CMSG_UNUSED", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x13F*/ { "CMSG_INSTANCE_LOCK_RESPONSE", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x140*/ { "CMSG_UNUSED2", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x140*/ { "CMSG_UNUSED2", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x141*/ { "CMSG_ATTACKSWING", STATUS_LOGGEDIN, &WorldSession::HandleAttackSwingOpcode }, /*0x141*/ { "CMSG_ATTACKSWING", STATUS_LOGGEDIN, &WorldSession::HandleAttackSwingOpcode },
/*0x142*/ { "CMSG_ATTACKSTOP", STATUS_LOGGEDIN, &WorldSession::HandleAttackStopOpcode }, /*0x142*/ { "CMSG_ATTACKSTOP", STATUS_LOGGEDIN, &WorldSession::HandleAttackStopOpcode },
@ -357,7 +357,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
/*0x148*/ { "SMSG_ATTACKSWING_DEADTARGET", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x148*/ { "SMSG_ATTACKSWING_DEADTARGET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x149*/ { "SMSG_ATTACKSWING_CANT_ATTACK", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x149*/ { "SMSG_ATTACKSWING_CANT_ATTACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x14A*/ { "SMSG_ATTACKERSTATEUPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x14A*/ { "SMSG_ATTACKERSTATEUPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x14B*/ { "SMSG_VICTIMSTATEUPDATE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x14B*/ { "SMSG_BATTLEFIELD_PORT_DENIED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x14C*/ { "SMSG_DAMAGE_DONE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x14C*/ { "SMSG_DAMAGE_DONE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x14D*/ { "SMSG_DAMAGE_TAKEN_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x14D*/ { "SMSG_DAMAGE_TAKEN_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x14E*/ { "SMSG_CANCEL_COMBAT", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x14E*/ { "SMSG_CANCEL_COMBAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
@ -1215,12 +1215,44 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
/*0x4A2*/ { "CMSG_CHECK_LOGIN_CRITERIA", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4A2*/ { "CMSG_CHECK_LOGIN_CRITERIA", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4A3*/ { "SMSG_SERVER_BUCK_DATA_START", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4A3*/ { "SMSG_SERVER_BUCK_DATA_START", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4A4*/ { "CMSG_QUERY_VEHICLE_STATUS", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4A4*/ { "CMSG_QUERY_VEHICLE_STATUS", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4A5*/ { "SMSG_PET_GUIDS", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4A5*/ { "UMSG_UNKNOWN_1189", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4A6*/ { "SMSG_CLIENTCACHE_VERSION", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4A6*/ { "SMSG_UNKNOWN_1190", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4A7*/ { "UMSG_UNKNOWN_1191", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4A7*/ { "SMSG_UNKNOWN_1191", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4A8*/ { "UMSG_UNKNOWN_1192", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4A8*/ { "CMSG_UNKNOWN_1192", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4A9*/ { "UMSG_UNKNOWN_1193", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4A9*/ { "CMSG_EJECT_PASSENGER", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4AA*/ { "UMSG_UNKNOWN_1194", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4AA*/ { "SMSG_PET_GUIDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4AB*/ { "UMSG_UNKNOWN_1195", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4AB*/ { "SMSG_CLIENTCACHE_VERSION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4AC*/ { "UMSG_UNKNOWN_1196", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4AC*/ { "UMSG_UNKNOWN_1196", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4AD*/ { "UMSG_UNKNOWN_1197", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4AE*/ { "UMSG_UNKNOWN_1198", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4AF*/ { "UMSG_UNKNOWN_1199", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4B0*/ { "UMSG_UNKNOWN_1200", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4B1*/ { "UMSG_UNKNOWN_1201", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4B2*/ { "SMSG_UNKNOWN_1202", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4B3*/ { "UMSG_UNKNOWN_1203", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4B4*/ { "UMSG_UNKNOWN_1204", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4B5*/ { "SMSG_UNKNOWN_1205", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4B6*/ { "CMSG_UNKNOWN_1206", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4B7*/ { "SMSG_UNKNOWN_1207", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4B8*/ { "CMSG_LFG_SET_ROLES", STATUS_LOGGEDIN, &WorldSession::HandleLfgSetRoles },
/*0x4B9*/ { "UMSG_UNKNOWN_1209", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4BA*/ { "CMSG_UNKNOWN_1210", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4BB*/ { "SMSG_UNKNOWN_1211", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4BC*/ { "SMSG_EQUIPMENT_SET_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4BD*/ { "CMSG_EQUIPMENT_SET_SAVE", STATUS_LOGGEDIN, &WorldSession::HandleEquipmentSetSave },
/*0x4BE*/ { "CMSG_UNKNOWN_1214", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4BF*/ { "SMSG_UNKNOWN_1215", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4C0*/ { "SMSG_TALENTS_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4C1*/ { "CMSG_LEARN_PREVIEW_TALENTS", STATUS_LOGGEDIN, &WorldSession::HandleLearnPreviewTalents },
/*0x4C2*/ { "CMSG_LEARN_PREVIEW_TALENTS_PET", STATUS_LOGGEDIN, &WorldSession::HandleLearnPreviewTalentsPet },
/*0x4C3*/ { "UMSG_UNKNOWN_1219", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4C4*/ { "UMSG_UNKNOWN_1220", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4C5*/ { "UMSG_UNKNOWN_1221", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4C6*/ { "UMSG_UNKNOWN_1222", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4C7*/ { "SMSG_UNKNOWN_1223", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4C8*/ { "SMSG_UNKNOWN_1224", STATUS_NEVER, &WorldSession::Handle_ServerSide },
/*0x4C9*/ { "UMSG_UNKNOWN_1225", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4CA*/ { "UMSG_UNKNOWN_1226", STATUS_NEVER, &WorldSession::Handle_NULL },
/*0x4CB*/ { "CMSG_EQUIPMENT_SET_USE", STATUS_LOGGEDIN, &WorldSession::HandleEquipmentSetUse },
/*0x4CC*/ { "SMSG_EQUIPMENT_SET_USE_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
}; };

View file

@ -345,15 +345,15 @@ enum Opcodes
SMSG_SPELL_COOLDOWN = 0x134, SMSG_SPELL_COOLDOWN = 0x134,
SMSG_COOLDOWN_EVENT = 0x135, SMSG_COOLDOWN_EVENT = 0x135,
CMSG_CANCEL_AURA = 0x136, CMSG_CANCEL_AURA = 0x136,
SMSG_UPDATE_AURA_DURATION_OBSOLETE = 0x137, SMSG_EQUIPMENT_SET_SAVED = 0x137,
SMSG_PET_CAST_FAILED = 0x138, SMSG_PET_CAST_FAILED = 0x138,
MSG_CHANNEL_START = 0x139, MSG_CHANNEL_START = 0x139,
MSG_CHANNEL_UPDATE = 0x13A, MSG_CHANNEL_UPDATE = 0x13A,
CMSG_CANCEL_CHANNELLING = 0x13B, CMSG_CANCEL_CHANNELLING = 0x13B,
SMSG_AI_REACTION = 0x13C, SMSG_AI_REACTION = 0x13C,
CMSG_SET_SELECTION = 0x13D, CMSG_SET_SELECTION = 0x13D,
CMSG_SET_TARGET_OBSOLETE = 0x13E, CMSG_EQUIPMENT_SET_DELETE = 0x13E,
CMSG_UNUSED = 0x13F, CMSG_INSTANCE_LOCK_RESPONSE = 0x13F,
CMSG_UNUSED2 = 0x140, CMSG_UNUSED2 = 0x140,
CMSG_ATTACKSWING = 0x141, CMSG_ATTACKSWING = 0x141,
CMSG_ATTACKSTOP = 0x142, CMSG_ATTACKSTOP = 0x142,
@ -365,7 +365,7 @@ enum Opcodes
SMSG_ATTACKSWING_DEADTARGET = 0x148, SMSG_ATTACKSWING_DEADTARGET = 0x148,
SMSG_ATTACKSWING_CANT_ATTACK = 0x149, SMSG_ATTACKSWING_CANT_ATTACK = 0x149,
SMSG_ATTACKERSTATEUPDATE = 0x14A, SMSG_ATTACKERSTATEUPDATE = 0x14A,
SMSG_VICTIMSTATEUPDATE_OBSOLETE = 0x14B, SMSG_BATTLEFIELD_PORT_DENIED = 0x14B,
SMSG_DAMAGE_DONE_OBSOLETE = 0x14C, SMSG_DAMAGE_DONE_OBSOLETE = 0x14C,
SMSG_DAMAGE_TAKEN_OBSOLETE = 0x14D, SMSG_DAMAGE_TAKEN_OBSOLETE = 0x14D,
SMSG_CANCEL_COMBAT = 0x14E, SMSG_CANCEL_COMBAT = 0x14E,
@ -693,7 +693,7 @@ enum Opcodes
CMSG_BUYBACK_ITEM = 0x290, CMSG_BUYBACK_ITEM = 0x290,
SMSG_SERVER_MESSAGE = 0x291, SMSG_SERVER_MESSAGE = 0x291,
CMSG_MEETINGSTONE_JOIN = 0x292, CMSG_MEETINGSTONE_JOIN = 0x292,
CMSG_MEETINGSTONE_LEAVE = 0x293, CMSG_MEETINGSTONE_LEAVE = 0x293, // SMSG?
CMSG_MEETINGSTONE_CHEAT = 0x294, CMSG_MEETINGSTONE_CHEAT = 0x294,
SMSG_MEETINGSTONE_SETQUEUE = 0x295, SMSG_MEETINGSTONE_SETQUEUE = 0x295,
CMSG_MEETINGSTONE_INFO = 0x296, CMSG_MEETINGSTONE_INFO = 0x296,
@ -1214,24 +1214,56 @@ enum Opcodes
SMSG_PET_LEARNED_SPELL = 0x499, SMSG_PET_LEARNED_SPELL = 0x499,
SMSG_PET_REMOVED_SPELL = 0x49A, SMSG_PET_REMOVED_SPELL = 0x49A,
CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE = 0x49B, CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE = 0x49B,
CMSG_HEARTH_AND_RESURRECT = 0x49C, CMSG_HEARTH_AND_RESURRECT = 0x49C, // not changed in 3.1
SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x49D, SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x49D, // not changed 9626
SMSG_CRITERIA_DELETED = 0x49E, SMSG_CRITERIA_DELETED = 0x49E, // not changed 9626
SMSG_ACHIEVEMENT_DELETED = 0x49F, SMSG_ACHIEVEMENT_DELETED = 0x49F, // not changed 9626
CMSG_SERVER_INFO_QUERY = 0x4A0, CMSG_SERVER_INFO_QUERY = 0x4A0, // not found
SMSG_SERVER_INFO_RESPONSE = 0x4A1, SMSG_SERVER_INFO_RESPONSE = 0x4A1, // not found
CMSG_CHECK_LOGIN_CRITERIA = 0x4A2, CMSG_CHECK_LOGIN_CRITERIA = 0x4A2, // not found
SMSG_SERVER_BUCK_DATA_START = 0x4A3, SMSG_SERVER_BUCK_DATA_START = 0x4A3, // not found
CMSG_QUERY_VEHICLE_STATUS = 0x4A4, CMSG_QUERY_VEHICLE_STATUS = 0x4A4, // not found
SMSG_PET_GUIDS = 0x4A5, UMSG_UNKNOWN_1189 = 0x4A5, // not found, old SMSG_PET_GUIDS
SMSG_CLIENTCACHE_VERSION = 0x4A6, SMSG_UNKNOWN_1190 = 0x4A6, // smsg unk, old SMSG_CLIENTCACHE_VERSION
UMSG_UNKNOWN_1191 = 0x4A7, SMSG_UNKNOWN_1191 = 0x4A7, // smsg guid+uint32 (vehicle)
UMSG_UNKNOWN_1192 = 0x4A8, CMSG_UNKNOWN_1192 = 0x4A8, // cmsg uint64
UMSG_UNKNOWN_1193 = 0x4A9, CMSG_EJECT_PASSENGER = 0x4A9, // cmsg uint64
UMSG_UNKNOWN_1194 = 0x4AA, SMSG_PET_GUIDS = 0x4AA, // shifted+5
UMSG_UNKNOWN_1195 = 0x4AB, SMSG_CLIENTCACHE_VERSION = 0x4AB, // shifted+5
UMSG_UNKNOWN_1196 = 0x4AC, UMSG_UNKNOWN_1196 = 0x4AC, // not found
NUM_MSG_TYPES = 0x4AD UMSG_UNKNOWN_1197 = 0x4AD, // not found
UMSG_UNKNOWN_1198 = 0x4AE, // not found
UMSG_UNKNOWN_1199 = 0x4AF, // not found
UMSG_UNKNOWN_1200 = 0x4B0, // not found
UMSG_UNKNOWN_1201 = 0x4B1, // not found
SMSG_UNKNOWN_1202 = 0x4B2, // refund something
CMSG_UNKNOWN_1203 = 0x4B3, // refund request?
CMSG_UNKNOWN_1204 = 0x4B4, // lua: ContainerRefundItemPurchase
SMSG_UNKNOWN_1205 = 0x4B5, // refund something
CMSG_UNKNOWN_1206 = 0x4B6, // CMSG, uint32
SMSG_UNKNOWN_1207 = 0x4B7, // SMSG, string+float
CMSG_LFG_SET_ROLES = 0x4B8, // CMSG, empty, lua: SetLFGRoles
UMSG_UNKNOWN_1209 = 0x4B9, // not found
CMSG_UNKNOWN_1210 = 0x4BA, // CMSG, uint64, lua: CalendarContextEventSignUp
SMSG_UNKNOWN_1211 = 0x4BB, // SMSG, calendar related
SMSG_EQUIPMENT_SET_LIST = 0x4BC, // SMSG, equipment manager list?
CMSG_EQUIPMENT_SET_SAVE = 0x4BD, // CMSG, lua: SaveEquipmentSet
CMSG_UNKNOWN_1214 = 0x4BE, // CMSG, missle?
SMSG_UNKNOWN_1215 = 0x4BF, // SMSG, uint64, uint8, 3 x float
SMSG_TALENTS_INFO = 0x4C0, // SMSG, talents related
CMSG_LEARN_PREVIEW_TALENTS = 0x4C1, // CMSG, lua: LearnPreviewTalents (for player?)
CMSG_LEARN_PREVIEW_TALENTS_PET = 0x4C2, // CMSG, lua: LearnPreviewTalents (for pet?)
UMSG_UNKNOWN_1219 = 0x4C3, // not found
UMSG_UNKNOWN_1220 = 0x4C4, // not found
UMSG_UNKNOWN_1221 = 0x4C5, // not found
UMSG_UNKNOWN_1222 = 0x4C6, // not found
SMSG_UNKNOWN_1223 = 0x4C7, // uint64, arena pet?
SMSG_UNKNOWN_1224 = 0x4C8, // uint32 "Can't change arena team..."
UMSG_UNKNOWN_1225 = 0x4C9, // not found
UMSG_UNKNOWN_1226 = 0x4CA, // not found
CMSG_EQUIPMENT_SET_USE = 0x4CB, // CMSG, lua: UseEquipmentSet
SMSG_EQUIPMENT_SET_USE_RESULT = 0x4CC, // SMSG, UseEquipmentSetResult?
NUM_MSG_TYPES = 0x4CD
}; };
/// Player state /// Player state

View file

@ -308,6 +308,8 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
((Player*)owner)->PetSpellInitialize(); ((Player*)owner)->PetSpellInitialize();
if(((Player*)owner)->GetGroup()) if(((Player*)owner)->GetGroup())
((Player*)owner)->SetGroupUpdateFlag(GROUP_UPDATE_PET); ((Player*)owner)->SetGroupUpdateFlag(GROUP_UPDATE_PET);
((Player*)owner)->SendTalentsInfoData(true);
} }
if (owner->GetTypeId() == TYPEID_PLAYER && getPetType() == HUNTER_PET) if (owner->GetTypeId() == TYPEID_PLAYER && getPetType() == HUNTER_PET)
@ -1641,6 +1643,13 @@ void Pet::InitTalentForLevel()
resetTalents(true); resetTalents(true);
} }
SetFreeTalentPoints(talentPointsForLevel - m_usedTalentCount); SetFreeTalentPoints(talentPointsForLevel - m_usedTalentCount);
Unit *owner = GetOwner();
if (!owner || owner->GetTypeId() != TYPEID_PLAYER)
return;
if(!m_loading)
((Player*)owner)->SendTalentsInfoData(true);
} }
uint32 Pet::resetTalentsCost() const uint32 Pet::resetTalentsCost() const

View file

@ -507,6 +507,7 @@ void WorldSession::HandlePetUnlearnOpcode(WorldPacket& recvPacket)
return; return;
} }
pet->resetTalents(); pet->resetTalents();
_player->SendTalentsInfoData(true);
} }
void WorldSession::HandlePetSpellAutocastOpcode( WorldPacket& recvPacket ) void WorldSession::HandlePetSpellAutocastOpcode( WorldPacket& recvPacket )
@ -660,4 +661,31 @@ void WorldSession::HandlePetLearnTalent( WorldPacket & recv_data )
recv_data >> guid >> talent_id >> requested_rank; recv_data >> guid >> talent_id >> requested_rank;
_player->LearnPetTalent(guid, talent_id, requested_rank); _player->LearnPetTalent(guid, talent_id, requested_rank);
_player->SendTalentsInfoData(true);
}
void WorldSession::HandleLearnPreviewTalentsPet( WorldPacket & recv_data )
{
sLog.outDebug("CMSG_LEARN_PREVIEW_TALENTS_PET");
CHECK_PACKET_SIZE(recv_data, 8+4);
uint64 guid;
recv_data >> guid;
uint32 talentsCount;
recv_data >> talentsCount;
uint32 talentId, talentRank;
for(uint32 i = 0; i < talentsCount; ++i)
{
CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4+4);
recv_data >> talentId >> talentRank;
_player->LearnPetTalent(guid, talentId, talentRank);
}
_player->SendTalentsInfoData(true);
} }

View file

@ -346,10 +346,6 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this), m_reputa
PlayerTalkClass = new PlayerMenu( GetSession() ); PlayerTalkClass = new PlayerMenu( GetSession() );
m_currentBuybackSlot = BUYBACK_SLOT_START; m_currentBuybackSlot = BUYBACK_SLOT_START;
for ( int aX = 0 ; aX < 8 ; aX++ )
m_Tutorials[ aX ] = 0x00;
m_TutorialsChanged = false;
m_DailyQuestChanged = false; m_DailyQuestChanged = false;
m_lastDailyQuestTime = 0; m_lastDailyQuestTime = 0;
@ -426,6 +422,9 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this), m_reputa
m_lastPotionId = 0; m_lastPotionId = 0;
m_activeSpec = 0;
m_specsCount = 0;
for (int i = 0; i < BASEMOD_END; ++i) for (int i = 0; i < BASEMOD_END; ++i)
{ {
m_auraBaseMod[i][FLAT_MOD] = 0.0f; m_auraBaseMod[i][FLAT_MOD] = 0.0f;
@ -597,6 +596,7 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
SetUInt64Value( PLAYER__FIELD_KNOWN_TITLES, 0 ); // 0=disabled SetUInt64Value( PLAYER__FIELD_KNOWN_TITLES, 0 ); // 0=disabled
SetUInt64Value( PLAYER__FIELD_KNOWN_TITLES1, 0 ); // 0=disabled SetUInt64Value( PLAYER__FIELD_KNOWN_TITLES1, 0 ); // 0=disabled
SetUInt64Value( PLAYER__FIELD_KNOWN_TITLES2, 0 ); // 0=disabled
SetUInt32Value( PLAYER_CHOSEN_TITLE, 0 ); SetUInt32Value( PLAYER_CHOSEN_TITLE, 0 );
SetUInt32Value( PLAYER_FIELD_KILLS, 0 ); SetUInt32Value( PLAYER_FIELD_KILLS, 0 );
SetUInt32Value( PLAYER_FIELD_LIFETIME_HONORBALE_KILLS, 0 ); SetUInt32Value( PLAYER_FIELD_LIFETIME_HONORBALE_KILLS, 0 );
@ -1484,14 +1484,14 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
for (uint8 slot = 0; slot < EQUIPMENT_SLOT_END; slot++) for (uint8 slot = 0; slot < EQUIPMENT_SLOT_END; slot++)
{ {
uint32 visualbase = PLAYER_VISIBLE_ITEM_1_0 + (slot * MAX_VISIBLE_ITEM_OFFSET); uint32 visualbase = PLAYER_VISIBLE_ITEM_1_ENTRYID + (slot * 2);
uint32 item_id = GetUInt32Value(visualbase); uint32 item_id = GetUInt32Value(visualbase);
const ItemPrototype * proto = objmgr.GetItemPrototype(item_id); const ItemPrototype * proto = objmgr.GetItemPrototype(item_id);
SpellItemEnchantmentEntry const *enchant = NULL; SpellItemEnchantmentEntry const *enchant = NULL;
for(uint8 enchantSlot = PERM_ENCHANTMENT_SLOT; enchantSlot <= TEMP_ENCHANTMENT_SLOT; ++enchantSlot) for(uint8 enchantSlot = PERM_ENCHANTMENT_SLOT; enchantSlot <= TEMP_ENCHANTMENT_SLOT; ++enchantSlot)
{ {
uint32 enchantId = GetUInt32Value(visualbase+1+enchantSlot); uint32 enchantId = GetUInt16Value(visualbase + 1, enchantSlot);
if(enchant = sSpellItemEnchantmentStore.LookupEntry(enchantId)) if(enchant = sSpellItemEnchantmentStore.LookupEntry(enchantId))
break; break;
} }
@ -1609,7 +1609,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
} }
// reset movement flags at teleport, because player will continue move with these flags after teleport // reset movement flags at teleport, because player will continue move with these flags after teleport
SetUnitMovementFlags(0); m_movementInfo.flags = 0;
if ((GetMapId() == mapid) && (!m_transport)) if ((GetMapId() == mapid) && (!m_transport))
{ {
@ -2360,6 +2360,8 @@ void Player::InitTalentForLevel()
else else
SetFreeTalentPoints(talentPointsForLevel-m_usedTalentCount); SetFreeTalentPoints(talentPointsForLevel-m_usedTalentCount);
} }
SendTalentsInfoData(false); // update at client
} }
void Player::InitStatsForLevel(bool reapplyMods) void Player::InitStatsForLevel(bool reapplyMods)
@ -2540,7 +2542,7 @@ void Player::SendInitialSpells()
if(!itr->second->active || itr->second->disabled) if(!itr->second->active || itr->second->disabled)
continue; continue;
data << uint16(itr->first); data << uint32(itr->first);
data << uint16(0); // it's not slot id data << uint16(0); // it's not slot id
spellCount +=1; spellCount +=1;
@ -2560,7 +2562,7 @@ void Player::SendInitialSpells()
if(itr->second.end > infTime) if(itr->second.end > infTime)
continue; continue;
data << uint16(itr->first); data << uint32(itr->first);
time_t cooldown = 0; time_t cooldown = 0;
if(itr->second.end > curTime) if(itr->second.end > curTime)
@ -2751,15 +2753,15 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
if(next_active_spell_id) if(next_active_spell_id)
{ {
// update spell ranks in spellbook and action bar // update spell ranks in spellbook and action bar
WorldPacket data(SMSG_SUPERCEDED_SPELL, (4)); WorldPacket data(SMSG_SUPERCEDED_SPELL, 4 + 4);
data << uint16(spell_id); data << uint32(spell_id);
data << uint16(next_active_spell_id); data << uint32(next_active_spell_id);
GetSession()->SendPacket( &data ); GetSession()->SendPacket( &data );
} }
else else
{ {
WorldPacket data(SMSG_REMOVED_SPELL, 4); WorldPacket data(SMSG_REMOVED_SPELL, 4);
data << uint16(spell_id); data << uint32(spell_id);
GetSession()->SendPacket(&data); GetSession()->SendPacket(&data);
} }
} }
@ -2850,9 +2852,9 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
{ {
if(IsInWorld()) // not send spell (re-/over-)learn packets at loading if(IsInWorld()) // not send spell (re-/over-)learn packets at loading
{ {
WorldPacket data(SMSG_SUPERCEDED_SPELL, (4)); WorldPacket data(SMSG_SUPERCEDED_SPELL, 4 + 4);
data << uint16(itr2->first); data << uint32(itr2->first);
data << uint16(spell_id); data << uint32(spell_id);
GetSession()->SendPacket( &data ); GetSession()->SendPacket( &data );
} }
@ -2866,9 +2868,9 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
{ {
if(IsInWorld()) // not send spell (re-/over-)learn packets at loading if(IsInWorld()) // not send spell (re-/over-)learn packets at loading
{ {
WorldPacket data(SMSG_SUPERCEDED_SPELL, (4)); WorldPacket data(SMSG_SUPERCEDED_SPELL, 4 + 4);
data << uint16(spell_id); data << uint32(spell_id);
data << uint16(itr2->first); data << uint32(itr2->first);
GetSession()->SendPacket( &data ); GetSession()->SendPacket( &data );
} }
@ -3224,9 +3226,9 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool update_action_bar_
if(update_action_bar_for_low_rank) if(update_action_bar_for_low_rank)
{ {
// downgrade spell ranks in spellbook and action bar // downgrade spell ranks in spellbook and action bar
WorldPacket data(SMSG_SUPERCEDED_SPELL, (4)); WorldPacket data(SMSG_SUPERCEDED_SPELL, 4 + 4);
data << uint16(spell_id); data << uint32(spell_id);
data << uint16(prev_id); data << uint32(prev_id);
GetSession()->SendPacket( &data ); GetSession()->SendPacket( &data );
prev_activate = true; prev_activate = true;
} }
@ -3240,7 +3242,7 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool update_action_bar_
if(!prev_activate) if(!prev_activate)
{ {
WorldPacket data(SMSG_REMOVED_SPELL, 4); WorldPacket data(SMSG_REMOVED_SPELL, 4);
data << uint16(spell_id); data << uint32(spell_id);
GetSession()->SendPacket(&data); GetSession()->SendPacket(&data);
} }
} }
@ -3618,23 +3620,12 @@ void Player::InitVisibleBits()
// Players visible items are not inventory stuff // Players visible items are not inventory stuff
for(uint16 i = 0; i < EQUIPMENT_SLOT_END; ++i) for(uint16 i = 0; i < EQUIPMENT_SLOT_END; ++i)
{ {
uint32 offset = i * MAX_VISIBLE_ITEM_OFFSET; uint32 offset = i * 2;
// item creator
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_CREATOR + 0 + offset);
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_CREATOR + 1 + offset);
// item entry // item entry
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_0 + 0 + offset); updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_ENTRYID + offset);
// enchant
// item enchantments updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + offset);
for(uint8 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j)
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_0 + 1 + j + offset);
// random properties
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_PROPERTIES + offset);
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_SEED + offset);
updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_PAD + offset);
} }
updateVisualBits.SetBit(PLAYER_CHOSEN_TITLE); updateVisualBits.SetBit(PLAYER_CHOSEN_TITLE);
@ -3659,7 +3650,7 @@ void Player::BuildCreateUpdateBlockForPlayer( UpdateData *data, Player *target )
m_items[i]->BuildCreateUpdateBlockForPlayer( data, target ); m_items[i]->BuildCreateUpdateBlockForPlayer( data, target );
} }
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; ++i) for(int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; ++i)
{ {
if(m_items[i] == NULL) if(m_items[i] == NULL)
continue; continue;
@ -3692,7 +3683,7 @@ void Player::DestroyForPlayer( Player *target ) const
m_items[i]->DestroyForPlayer( target ); m_items[i]->DestroyForPlayer( target );
} }
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; ++i) for(int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; ++i)
{ {
if(m_items[i] == NULL) if(m_items[i] == NULL)
continue; continue;
@ -3910,6 +3901,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
CharacterDatabase.PExecute("DELETE FROM character_pet_declinedname WHERE owner = '%u'",guid); CharacterDatabase.PExecute("DELETE FROM character_pet_declinedname WHERE owner = '%u'",guid);
CharacterDatabase.PExecute("DELETE FROM character_achievement WHERE guid = '%u'",guid); CharacterDatabase.PExecute("DELETE FROM character_achievement WHERE guid = '%u'",guid);
CharacterDatabase.PExecute("DELETE FROM character_achievement_progress WHERE guid = '%u'",guid); CharacterDatabase.PExecute("DELETE FROM character_achievement_progress WHERE guid = '%u'",guid);
CharacterDatabase.PExecute("DELETE FROM character_equipmentsets WHERE guid = '%u'",guid);
CharacterDatabase.CommitTransaction(); CharacterDatabase.CommitTransaction();
//loginDatabase.PExecute("UPDATE realmcharacters SET numchars = numchars - 1 WHERE acctid = %d AND realmid = %d", accountId, realmID); //loginDatabase.PExecute("UPDATE realmcharacters SET numchars = numchars - 1 WHERE acctid = %d AND realmid = %d", accountId, realmID);
@ -5430,7 +5422,8 @@ void Player::SendInitialActionButtons() const
{ {
sLog.outDetail( "Initializing Action Buttons for '%u'", GetGUIDLow() ); sLog.outDetail( "Initializing Action Buttons for '%u'", GetGUIDLow() );
WorldPacket data(SMSG_ACTION_BUTTONS, (MAX_ACTION_BUTTONS*4)); WorldPacket data(SMSG_ACTION_BUTTONS, 1+(MAX_ACTION_BUTTONS*4));
data << uint8(0); // can be 0, 1, 2
for(int button = 0; button < MAX_ACTION_BUTTONS; ++button) for(int button = 0; button < MAX_ACTION_BUTTONS; ++button)
{ {
ActionButtonList::const_iterator itr = m_actionButtons.find(button); ActionButtonList::const_iterator itr = m_actionButtons.find(button);
@ -8150,7 +8143,7 @@ uint8 Player::CanUnequipItems( uint32 item, uint32 count ) const
return EQUIP_ERR_OK; return EQUIP_ERR_OK;
} }
} }
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; ++i) for(int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; ++i)
{ {
pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ); pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetEntry() == item ) if( pItem && pItem->GetEntry() == item )
@ -8192,7 +8185,7 @@ uint32 Player::GetItemCount( uint32 item, bool inBankAlso, Item* skipItem ) cons
if( pItem && pItem != skipItem && pItem->GetEntry() == item ) if( pItem && pItem != skipItem && pItem->GetEntry() == item )
count += pItem->GetCount(); count += pItem->GetCount();
} }
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; ++i) for(int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; ++i)
{ {
Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ); Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem != skipItem && pItem->GetEntry() == item ) if( pItem && pItem != skipItem && pItem->GetEntry() == item )
@ -8252,7 +8245,7 @@ Item* Player::GetItemByGuid( uint64 guid ) const
if( pItem && pItem->GetGUID() == guid ) if( pItem && pItem->GetGUID() == guid )
return pItem; return pItem;
} }
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; ++i) for(int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; ++i)
{ {
Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ); Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetGUID() == guid ) if( pItem && pItem->GetGUID() == guid )
@ -8298,7 +8291,7 @@ Item* Player::GetItemByPos( uint16 pos ) const
Item* Player::GetItemByPos( uint8 bag, uint8 slot ) const Item* Player::GetItemByPos( uint8 bag, uint8 slot ) const
{ {
if( bag == INVENTORY_SLOT_BAG_0 && ( slot < BANK_SLOT_BAG_END || slot >= KEYRING_SLOT_START && slot < QUESTBAG_SLOT_END ) ) if( bag == INVENTORY_SLOT_BAG_0 && ( slot < BANK_SLOT_BAG_END || slot >= KEYRING_SLOT_START && slot < CURRENCYTOKEN_SLOT_END ) )
return m_items[slot]; return m_items[slot];
else if(bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END else if(bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END
|| bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END ) || bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END )
@ -8368,7 +8361,7 @@ bool Player::IsInventoryPos( uint8 bag, uint8 slot )
return true; return true;
if( bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END ) if( bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END )
return true; return true;
if( bag == INVENTORY_SLOT_BAG_0 && ( slot >= KEYRING_SLOT_START && slot < QUESTBAG_SLOT_END ) ) if( bag == INVENTORY_SLOT_BAG_0 && ( slot >= KEYRING_SLOT_START && slot < CURRENCYTOKEN_SLOT_END ) )
return true; return true;
return false; return false;
} }
@ -8489,7 +8482,7 @@ bool Player::HasItemCount( uint32 item, uint32 count, bool inBankAlso ) const
return true; return true;
} }
} }
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; ++i) for(int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; ++i)
{ {
Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ); Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetEntry() == item ) if( pItem && pItem->GetEntry() == item )
@ -8656,7 +8649,7 @@ bool Player::HasItemTotemCategory( uint32 TotemCategory ) const
if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory )) if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory ))
return true; return true;
} }
for(uint8 i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; ++i) for(uint8 i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; ++i)
{ {
pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ); pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory )) if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory ))
@ -8696,18 +8689,10 @@ uint8 Player::_CanStoreItem_InSpecificSlot( uint8 bag, uint8 slot, ItemPosCountV
if(slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_START+GetMaxKeyringSize() && !(pProto->BagFamily & BAG_FAMILY_MASK_KEYS)) if(slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_START+GetMaxKeyringSize() && !(pProto->BagFamily & BAG_FAMILY_MASK_KEYS))
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
// vanitypet case (not use, vanity pets stored as spells)
if(slot >= VANITYPET_SLOT_START && slot < VANITYPET_SLOT_END)
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
// currencytoken case // currencytoken case
if(slot >= CURRENCYTOKEN_SLOT_START && slot < CURRENCYTOKEN_SLOT_END && !(pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS)) if(slot >= CURRENCYTOKEN_SLOT_START && slot < CURRENCYTOKEN_SLOT_END && !(pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS))
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
// guestbag case (not use)
if(slot >= QUESTBAG_SLOT_START && slot < QUESTBAG_SLOT_END)
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
// prevent cheating // prevent cheating
if(slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END || slot >= PLAYER_SLOT_END) if(slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END || slot >= PLAYER_SLOT_END)
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
@ -8953,7 +8938,7 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
{ {
if( bag == INVENTORY_SLOT_BAG_0 ) // inventory if( bag == INVENTORY_SLOT_BAG_0 ) // inventory
{ {
res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,QUESTBAG_SLOT_END,dest,pProto,count,true,pItem,bag,slot); res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,CURRENCYTOKEN_SLOT_END,dest,pProto,count,true,pItem,bag,slot);
if(res!=EQUIP_ERR_OK) if(res!=EQUIP_ERR_OK)
{ {
if(no_space_count) if(no_space_count)
@ -9127,7 +9112,7 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
// search stack for merge to // search stack for merge to
if( pProto->Stackable != 1 ) if( pProto->Stackable != 1 )
{ {
res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,QUESTBAG_SLOT_END,dest,pProto,count,true,pItem,bag,slot); res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,CURRENCYTOKEN_SLOT_END,dest,pProto,count,true,pItem,bag,slot);
if(res!=EQUIP_ERR_OK) if(res!=EQUIP_ERR_OK)
{ {
if(no_space_count) if(no_space_count)
@ -10348,30 +10333,14 @@ void Player::SetVisibleItemSlot(uint8 slot, Item *pItem)
{ {
if(pItem) if(pItem)
{ {
SetUInt64Value(PLAYER_VISIBLE_ITEM_1_CREATOR + (slot * MAX_VISIBLE_ITEM_OFFSET), pItem->GetUInt64Value(ITEM_FIELD_CREATOR)); SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENTRYID + (slot * 2), pItem->GetEntry());
SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (slot * 2), 0, pItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT));
int VisibleBase = PLAYER_VISIBLE_ITEM_1_0 + (slot * MAX_VISIBLE_ITEM_OFFSET); SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (slot * 2), 1, pItem->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT));
SetUInt32Value(VisibleBase + 0, pItem->GetEntry());
for(int i = 0; i < MAX_INSPECTED_ENCHANTMENT_SLOT; ++i)
SetUInt32Value(VisibleBase + 1 + i, pItem->GetEnchantmentId(EnchantmentSlot(i)));
// Use SetInt16Value to prevent set high part to FFFF for negative value
SetInt16Value( PLAYER_VISIBLE_ITEM_1_PROPERTIES + (slot * MAX_VISIBLE_ITEM_OFFSET), 0, pItem->GetItemRandomPropertyId());
SetUInt32Value(PLAYER_VISIBLE_ITEM_1_PROPERTIES + 1 + (slot * MAX_VISIBLE_ITEM_OFFSET), pItem->GetItemSuffixFactor());
} }
else else
{ {
SetUInt64Value(PLAYER_VISIBLE_ITEM_1_CREATOR + (slot * MAX_VISIBLE_ITEM_OFFSET), 0); SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENTRYID + (slot * 2), 0);
SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (slot * 2), 0);
int VisibleBase = PLAYER_VISIBLE_ITEM_1_0 + (slot * MAX_VISIBLE_ITEM_OFFSET);
SetUInt32Value(VisibleBase + 0, 0);
for(int i = 0; i < MAX_INSPECTED_ENCHANTMENT_SLOT; ++i)
SetUInt32Value(VisibleBase + 1 + i, 0);
SetUInt32Value(PLAYER_VISIBLE_ITEM_1_PROPERTIES + 0 + (slot * MAX_VISIBLE_ITEM_OFFSET), 0);
SetUInt32Value(PLAYER_VISIBLE_ITEM_1_PROPERTIES + 1 + (slot * MAX_VISIBLE_ITEM_OFFSET), 0);
} }
} }
@ -10621,7 +10590,7 @@ void Player::DestroyItemCount( uint32 item, uint32 count, bool update, bool uneq
} }
} }
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; ++i) for(int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; ++i)
{ {
if (Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i )) if (Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
{ {
@ -10726,7 +10695,7 @@ void Player::DestroyZoneLimitedItem( bool update, uint32 new_zone )
if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone)) if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
DestroyItem( INVENTORY_SLOT_BAG_0, i, update); DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; ++i) for(int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; ++i)
if (Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i )) if (Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone)) if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
DestroyItem( INVENTORY_SLOT_BAG_0, i, update); DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
@ -11853,11 +11822,12 @@ void Player::ApplyEnchantment(Item *item, EnchantmentSlot slot, bool apply, bool
} }
// visualize enchantment at player and equipped items // visualize enchantment at player and equipped items
if(slot < MAX_INSPECTED_ENCHANTMENT_SLOT) if(slot == PERM_ENCHANTMENT_SLOT)
{ SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), 0, apply ? item->GetEnchantmentId(slot) : 0);
int VisibleBase = PLAYER_VISIBLE_ITEM_1_0 + (item->GetSlot() * MAX_VISIBLE_ITEM_OFFSET);
SetUInt32Value(VisibleBase + 1 + slot, apply? item->GetEnchantmentId(slot) : 0); if(slot == TEMP_ENCHANTMENT_SLOT)
} SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), 1, apply ? item->GetEnchantmentId(slot) : 0);
if(apply_dur) if(apply_dur)
{ {
@ -11957,9 +11927,9 @@ void Player::PrepareQuestMenu( uint64 guid )
uint32 quest_id = i->second; uint32 quest_id = i->second;
QuestStatus status = GetQuestStatus( quest_id ); QuestStatus status = GetQuestStatus( quest_id );
if ( status == QUEST_STATUS_COMPLETE && !GetQuestRewardStatus( quest_id ) ) if ( status == QUEST_STATUS_COMPLETE && !GetQuestRewardStatus( quest_id ) )
qm.AddMenuItem(quest_id, DIALOG_STATUS_REWARD_REP); qm.AddMenuItem(quest_id, DIALOG_STATUS_UNK2);
else if ( status == QUEST_STATUS_INCOMPLETE ) else if ( status == QUEST_STATUS_INCOMPLETE )
qm.AddMenuItem(quest_id, DIALOG_STATUS_INCOMPLETE); qm.AddMenuItem(quest_id, DIALOG_STATUS_UNK2);
else if (status == QUEST_STATUS_AVAILABLE ) else if (status == QUEST_STATUS_AVAILABLE )
qm.AddMenuItem(quest_id, DIALOG_STATUS_CHAT); qm.AddMenuItem(quest_id, DIALOG_STATUS_CHAT);
} }
@ -11973,9 +11943,9 @@ void Player::PrepareQuestMenu( uint64 guid )
QuestStatus status = GetQuestStatus( quest_id ); QuestStatus status = GetQuestStatus( quest_id );
if (pQuest->IsAutoComplete() && CanTakeQuest(pQuest, false)) if (pQuest->IsAutoComplete() && CanTakeQuest(pQuest, false))
qm.AddMenuItem(quest_id, DIALOG_STATUS_REWARD_REP); qm.AddMenuItem(quest_id, DIALOG_STATUS_UNK2);
else if ( status == QUEST_STATUS_NONE && CanTakeQuest( pQuest, false ) ) else if ( status == QUEST_STATUS_NONE && CanTakeQuest( pQuest, false ) )
qm.AddMenuItem(quest_id, DIALOG_STATUS_AVAILABLE); qm.AddMenuItem(quest_id, DIALOG_STATUS_CHAT);
} }
} }
@ -11998,10 +11968,10 @@ void Player::SendPreparedQuest( uint64 guid )
if ( pQuest ) if ( pQuest )
{ {
if( status == DIALOG_STATUS_REWARD_REP && !GetQuestRewardStatus( quest_id ) ) if( status == DIALOG_STATUS_UNK2 && !GetQuestRewardStatus( quest_id ) )
PlayerTalkClass->SendQuestGiverRequestItems( pQuest, guid, CanRewardQuest(pQuest, false), true );
else if( status == DIALOG_STATUS_UNK2 )
PlayerTalkClass->SendQuestGiverRequestItems( pQuest, guid, CanRewardQuest(pQuest, false), true ); PlayerTalkClass->SendQuestGiverRequestItems( pQuest, guid, CanRewardQuest(pQuest, false), true );
else if( status == DIALOG_STATUS_INCOMPLETE )
PlayerTalkClass->SendQuestGiverRequestItems( pQuest, guid, false, true );
// Send completable on repeatable quest if player don't have quest // Send completable on repeatable quest if player don't have quest
else if( pQuest->IsRepeatable() && !pQuest->IsDaily() ) else if( pQuest->IsRepeatable() && !pQuest->IsDaily() )
PlayerTalkClass->SendQuestGiverRequestItems( pQuest, guid, CanCompleteRepeatableQuest(pQuest), true ); PlayerTalkClass->SendQuestGiverRequestItems( pQuest, guid, CanCompleteRepeatableQuest(pQuest), true );
@ -13799,6 +13769,38 @@ void Player::_LoadArenaTeamInfo(QueryResult *result)
delete result; delete result;
} }
void Player::_LoadEquipmentSets(QueryResult *result)
{
// SetPQuery(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = '%u' ORDER BY setindex", GUID_LOPART(m_guid));
if (!result)
return;
uint32 count = 0;
do
{
Field *fields = result->Fetch();
EquipmentSet eqSet;
eqSet.Guid = fields[0].GetUInt64();
uint32 index = fields[1].GetUInt32();
eqSet.Name = fields[2].GetCppString();
eqSet.IconName = fields[3].GetCppString();
eqSet.state = EQUIPMENT_SET_UNCHANGED;
for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
eqSet.Items[i] = fields[4+i].GetUInt32();
m_EquipmentSets[index] = eqSet;
++count;
if(count >= MAX_EQUIPMENT_SET_INDEX) // client limit
break;
} while (result->NextRow());
delete result;
}
bool Player::LoadPositionFromDB(uint32& mapid, float& x,float& y,float& z,float& o, bool& in_flight, uint64 guid) bool Player::LoadPositionFromDB(uint32& mapid, float& x,float& y,float& z,float& o, bool& in_flight, uint64 guid)
{ {
QueryResult *result = CharacterDatabase.PQuery("SELECT position_x,position_y,position_z,orientation,map,taxi_path FROM characters WHERE guid = '%u'",GUID_LOPART(guid)); QueryResult *result = CharacterDatabase.PQuery("SELECT position_x,position_y,position_z,orientation,map,taxi_path FROM characters WHERE guid = '%u'",GUID_LOPART(guid));
@ -14275,8 +14277,6 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
InitTalentForLevel(); InitTalentForLevel();
learnDefaultSpells(); learnDefaultSpells();
_LoadTutorials(holder->GetResult(PLAYER_LOGIN_QUERY_LOADTUTORIALS));
// must be before inventory (some items required reputation check) // must be before inventory (some items required reputation check)
m_reputationMgr.LoadFromDB(holder->GetResult(PLAYER_LOGIN_QUERY_LOADREPUTATION)); m_reputationMgr.LoadFromDB(holder->GetResult(PLAYER_LOGIN_QUERY_LOADREPUTATION));
@ -14421,6 +14421,9 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
m_achievementMgr.LoadFromDB(holder->GetResult(PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS), holder->GetResult(PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS)); m_achievementMgr.LoadFromDB(holder->GetResult(PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS), holder->GetResult(PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS));
m_achievementMgr.CheckAllAchievementCriteria(); m_achievementMgr.CheckAllAchievementCriteria();
_LoadEquipmentSets(holder->GetResult(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS));
return true; return true;
} }
@ -15042,27 +15045,6 @@ void Player::_LoadSpells(QueryResult *result)
} }
} }
void Player::_LoadTutorials(QueryResult *result)
{
//QueryResult *result = CharacterDatabase.PQuery("SELECT tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7 FROM character_tutorial WHERE account = '%u' AND realmid = '%u'", GetAccountId(), realmid);
if(result)
{
do
{
Field *fields = result->Fetch();
for (int iI=0; iI<8; ++iI)
m_Tutorials[iI] = fields[iI].GetUInt32();
}
while( result->NextRow() );
delete result;
}
m_TutorialsChanged = false;
}
void Player::_LoadGroup(QueryResult *result) void Player::_LoadGroup(QueryResult *result)
{ {
//QueryResult *result = CharacterDatabase.PQuery("SELECT leaderGuid FROM group_member WHERE memberGuid='%u'", GetGUIDLow()); //QueryResult *result = CharacterDatabase.PQuery("SELECT leaderGuid FROM group_member WHERE memberGuid='%u'", GetGUIDLow());
@ -15502,13 +15484,14 @@ void Player::SaveToDB()
_SaveInventory(); _SaveInventory();
_SaveQuestStatus(); _SaveQuestStatus();
_SaveDailyQuestStatus(); _SaveDailyQuestStatus();
_SaveTutorials();
_SaveSpells(); _SaveSpells();
_SaveSpellCooldowns(); _SaveSpellCooldowns();
_SaveActions(); _SaveActions();
_SaveAuras(); _SaveAuras();
m_achievementMgr.SaveToDB(); m_achievementMgr.SaveToDB();
m_reputationMgr.SaveToDB(); m_reputationMgr.SaveToDB();
_SaveEquipmentSets();
GetSession()->SaveTutorialsData(); // changed only while character in game
CharacterDatabase.CommitTransaction(); CharacterDatabase.CommitTransaction();
@ -15810,33 +15793,6 @@ void Player::_SaveSpells()
} }
} }
void Player::_SaveTutorials()
{
if(!m_TutorialsChanged)
return;
uint32 Rows=0;
// it's better than rebuilding indexes multiple times
QueryResult *result = CharacterDatabase.PQuery("SELECT count(*) AS r FROM character_tutorial WHERE account = '%u' AND realmid = '%u'", GetSession()->GetAccountId(), realmID );
if(result)
{
Rows = result->Fetch()[0].GetUInt32();
delete result;
}
if (Rows)
{
CharacterDatabase.PExecute("UPDATE character_tutorial SET tut0='%u', tut1='%u', tut2='%u', tut3='%u', tut4='%u', tut5='%u', tut6='%u', tut7='%u' WHERE account = '%u' AND realmid = '%u'",
m_Tutorials[0], m_Tutorials[1], m_Tutorials[2], m_Tutorials[3], m_Tutorials[4], m_Tutorials[5], m_Tutorials[6], m_Tutorials[7], GetSession()->GetAccountId(), realmID );
}
else
{
CharacterDatabase.PExecute("INSERT INTO character_tutorial (account,realmid,tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7) VALUES ('%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u')", GetSession()->GetAccountId(), realmID, m_Tutorials[0], m_Tutorials[1], m_Tutorials[2], m_Tutorials[3], m_Tutorials[4], m_Tutorials[5], m_Tutorials[6], m_Tutorials[7]);
};
m_TutorialsChanged = false;
}
void Player::outDebugValues() const void Player::outDebugValues() const
{ {
if(!sLog.IsOutDebug()) // optimize disabled debug output if(!sLog.IsOutDebug()) // optimize disabled debug output
@ -16260,9 +16216,8 @@ void Player::RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent)
if(pet->isControlled()) if(pet->isControlled())
{ {
WorldPacket data(SMSG_PET_SPELLS, 8+4); WorldPacket data(SMSG_PET_SPELLS, 8);
data << uint64(0); data << uint64(0);
data << uint32(0);
GetSession()->SendPacket(&data); GetSession()->SendPacket(&data);
if(GetGroup()) if(GetGroup())
@ -16405,9 +16360,9 @@ void Player::PetSpellInitialize()
CharmInfo *charmInfo = pet->GetCharmInfo(); CharmInfo *charmInfo = pet->GetCharmInfo();
WorldPacket data(SMSG_PET_SPELLS, 8+4+4+4+4*MAX_UNIT_ACTION_BAR_INDEX+1+1); WorldPacket data(SMSG_PET_SPELLS, 8+2+4+4+4*MAX_UNIT_ACTION_BAR_INDEX+1+1);
data << uint64(pet->GetGUID()); data << uint64(pet->GetGUID());
data << uint32(pet->GetCreatureInfo()->family); // creature family (required for pet talents) data << uint16(pet->GetCreatureInfo()->family); // creature family (required for pet talents)
data << uint32(0); data << uint32(0);
data << uint8(charmInfo->GetReactState()) << uint8(charmInfo->GetCommandState()) << uint16(0); data << uint8(charmInfo->GetReactState()) << uint8(charmInfo->GetCommandState()) << uint16(0);
@ -16445,7 +16400,7 @@ void Player::PetSpellInitialize()
{ {
time_t cooldown = (itr->second > curTime) ? (itr->second - curTime) * IN_MILISECONDS : 0; time_t cooldown = (itr->second > curTime) ? (itr->second - curTime) * IN_MILISECONDS : 0;
data << uint16(itr->first); // spellid data << uint32(itr->first); // spellid
data << uint16(0); // spell category? data << uint16(0); // spell category?
data << uint32(cooldown); // cooldown data << uint32(cooldown); // cooldown
data << uint32(0); // category cooldown data << uint32(0); // category cooldown
@ -16455,7 +16410,7 @@ void Player::PetSpellInitialize()
{ {
time_t cooldown = (itr->second > curTime) ? (itr->second - curTime) * IN_MILISECONDS : 0; time_t cooldown = (itr->second > curTime) ? (itr->second - curTime) * IN_MILISECONDS : 0;
data << uint16(itr->first); // spellid data << uint32(itr->first); // spellid
data << uint16(0); // spell category? data << uint16(0); // spell category?
data << uint32(0); // cooldown data << uint32(0); // cooldown
data << uint32(cooldown); // category cooldown data << uint32(cooldown); // category cooldown
@ -16479,9 +16434,9 @@ void Player::PossessSpellInitialize()
return; return;
} }
WorldPacket data(SMSG_PET_SPELLS, 8+4+4+4+4*MAX_UNIT_ACTION_BAR_INDEX+1+1); WorldPacket data(SMSG_PET_SPELLS, 8+2+4+4+4*MAX_UNIT_ACTION_BAR_INDEX+1+1);
data << uint64(charm->GetGUID()); data << uint64(charm->GetGUID());
data << uint32(0); data << uint16(0);
data << uint32(0); data << uint32(0);
data << uint32(0); data << uint32(0);
@ -16523,9 +16478,9 @@ void Player::CharmSpellInitialize()
} }
} }
WorldPacket data(SMSG_PET_SPELLS, 8+4+4+4+4*MAX_UNIT_ACTION_BAR_INDEX+1+4*addlist+1); WorldPacket data(SMSG_PET_SPELLS, 8+2+4+4+4*MAX_UNIT_ACTION_BAR_INDEX+1+4*addlist+1);
data << uint64(charm->GetGUID()); data << uint64(charm->GetGUID());
data << uint32(0); data << uint16(0);
data << uint32(0); data << uint32(0);
if(charm->GetTypeId() != TYPEID_PLAYER) if(charm->GetTypeId() != TYPEID_PLAYER)
@ -17338,8 +17293,8 @@ void Player::UpdateHomebindTime(uint32 time)
{ {
if (time >= m_HomebindTimer) if (time >= m_HomebindTimer)
{ {
// teleport to homebind location // teleport to nearest graveyard
TeleportTo(m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, GetOrientation()); RepopAtGraveyard();
} }
else else
m_HomebindTimer -= time; m_HomebindTimer -= time;
@ -17966,6 +17921,8 @@ void Player::SendInitialPacketsBeforeAddToMap()
data << uint32(0); // unknown, may be rest state time or experience data << uint32(0); // unknown, may be rest state time or experience
GetSession()->SendPacket(&data); GetSession()->SendPacket(&data);
GetSocial()->SendSocialList();
// Homebind // Homebind
data.Initialize(SMSG_BINDPOINTUPDATE, 5*4); data.Initialize(SMSG_BINDPOINTUPDATE, 5*4);
data << m_homebindX << m_homebindY << m_homebindZ; data << m_homebindX << m_homebindY << m_homebindZ;
@ -17976,12 +17933,7 @@ void Player::SendInitialPacketsBeforeAddToMap()
// SMSG_SET_PROFICIENCY // SMSG_SET_PROFICIENCY
// SMSG_UPDATE_AURA_DURATION // SMSG_UPDATE_AURA_DURATION
// tutorial stuff SendTalentsInfoData(false);
data.Initialize(SMSG_TUTORIAL_FLAGS, 8*4);
for (int i = 0; i < 8; ++i)
data << uint32( GetTutorialInt(i) );
GetSession()->SendPacket(&data);
SendInitialSpells(); SendInitialSpells();
data.Initialize(SMSG_SEND_UNLEARN_SPELLS, 4); data.Initialize(SMSG_SEND_UNLEARN_SPELLS, 4);
@ -17997,16 +17949,17 @@ void Player::SendInitialPacketsBeforeAddToMap()
GetZoneAndAreaId(newzone,newarea); GetZoneAndAreaId(newzone,newarea);
UpdateZone(newzone,newarea); // also call SendInitWorldStates(); UpdateZone(newzone,newarea); // also call SendInitWorldStates();
// SMSG_SET_AURA_SINGLE SendEquipmentSetList();
data.Initialize(SMSG_LOGIN_SETTIMESPEED, 8); data.Initialize(SMSG_LOGIN_SETTIMESPEED, 4 + 4 + 4);
data << uint32(secsToTimeBitFields(sWorld.GetGameTime())); data << uint32(secsToTimeBitFields(sWorld.GetGameTime()));
data << (float)0.01666667f; // game speed data << (float)0.01666667f; // game speed
data << uint32(0); // added in 3.1.2
GetSession()->SendPacket( &data ); GetSession()->SendPacket( &data );
// set fly flag if in fly form or taxi flight to prevent visually drop at ground in showup moment // set fly flag if in fly form or taxi flight to prevent visually drop at ground in showup moment
if(HasAuraType(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED) || isInFlight()) if(HasAuraType(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED) || isInFlight())
AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); m_movementInfo.flags |= MOVEMENTFLAG_FLYING2;
m_mover = this; m_mover = this;
} }
@ -19324,9 +19277,9 @@ void Player::EnterVehicle(Vehicle *vehicle)
data << uint32(0); // fall time data << uint32(0); // fall time
GetSession()->SendPacket(&data); GetSession()->SendPacket(&data);
data.Initialize(SMSG_PET_SPELLS, 8+4+4+4+4*MAX_UNIT_ACTION_BAR_INDEX+1+1); data.Initialize(SMSG_PET_SPELLS, 8+2+4+4+4*MAX_UNIT_ACTION_BAR_INDEX+1+1);
data << uint64(vehicle->GetGUID()); data << uint64(vehicle->GetGUID());
data << uint32(0); data << uint16(0);
data << uint32(0); data << uint32(0);
data << uint32(0x00000101); data << uint32(0x00000101);
@ -19363,9 +19316,8 @@ void Player::ExitVehicle(Vehicle *vehicle)
data << uint32(0); // fall time data << uint32(0); // fall time
GetSession()->SendPacket(&data); GetSession()->SendPacket(&data);
data.Initialize(SMSG_PET_SPELLS, 8+4); data.Initialize(SMSG_PET_SPELLS, 8);
data << uint64(0); data << uint64(0);
data << uint32(0);
GetSession()->SendPacket(&data); GetSession()->SendPacket(&data);
// maybe called at dummy aura remove? // maybe called at dummy aura remove?
@ -19388,7 +19340,7 @@ bool Player::isTotalImmune()
bool Player::HasTitle(uint32 bitIndex) bool Player::HasTitle(uint32 bitIndex)
{ {
if (bitIndex > 128) if (bitIndex > 192)
return false; return false;
uint32 fieldIndexOffset = bitIndex / 32; uint32 fieldIndexOffset = bitIndex / 32;
@ -20024,3 +19976,314 @@ bool Player::canSeeSpellClickOn(Creature const *c) const
} }
return false; return false;
} }
void Player::BuildPlayerTalentsInfoData(WorldPacket *data)
{
*data << uint32(GetFreeTalentPoints()); // unspentTalentPoints
uint8 talentGroupCount = 1;
*data << uint8(talentGroupCount); // talent group count (0, 1 or 2)
*data << uint8(0); // talent group index (0 or 1)
if(talentGroupCount)
{
// loop through all specs (only 1 for now)
for(uint32 groups = 0; groups < talentGroupCount; ++groups)
{
uint8 talentIdCount = 0;
size_t pos = data->wpos();
*data << uint8(talentIdCount); // [PH], talentIdCount
// find class talent tabs (all players have 3 talent tabs)
uint32 const* talentTabIds = GetTalentTabPages(getClass());
for(uint32 i = 0; i < 3; ++i)
{
uint32 talentTabId = talentTabIds[i];
for(uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
{
TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
if(!talentInfo)
continue;
// skip another tab talents
if(talentInfo->TalentTab != talentTabId)
continue;
// find max talent rank
int32 curtalent_maxrank = -1;
for(int32 k = 4; k > -1; --k)
{
if(talentInfo->RankID[k] && HasSpell(talentInfo->RankID[k]))
{
curtalent_maxrank = k;
break;
}
}
// not learned talent
if(curtalent_maxrank < 0)
continue;
*data << uint32(talentInfo->TalentID); // Talent.dbc
*data << uint8(curtalent_maxrank); // talentMaxRank (0-4)
++talentIdCount;
}
}
data->put<uint8>(pos, talentIdCount); // put real count
*data << uint8(MAX_GLYPH_SLOT_INDEX); // glyphs count
for(uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
*data << uint16(GetGlyph(i)); // GlyphProperties.dbc
}
}
}
void Player::BuildPetTalentsInfoData(WorldPacket *data)
{
uint32 unspentTalentPoints = 0;
size_t pointsPos = data->wpos();
*data << uint32(unspentTalentPoints); // [PH], unspentTalentPoints
uint8 talentIdCount = 0;
size_t countPos = data->wpos();
*data << uint8(talentIdCount); // [PH], talentIdCount
Pet *pet = GetPet();
if(!pet)
return;
unspentTalentPoints = pet->GetFreeTalentPoints();
data->put<uint32>(pointsPos, unspentTalentPoints); // put real points
CreatureInfo const *ci = pet->GetCreatureInfo();
if(!ci)
return;
CreatureFamilyEntry const *pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
if(!pet_family || pet_family->petTalentType < 0)
return;
for(uint32 talentTabId = 1; talentTabId < sTalentTabStore.GetNumRows(); ++talentTabId)
{
TalentTabEntry const *talentTabInfo = sTalentTabStore.LookupEntry( talentTabId );
if(!talentTabInfo)
continue;
if(!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
continue;
for(uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
{
TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
if(!talentInfo)
continue;
// skip another tab talents
if(talentInfo->TalentTab != talentTabId)
continue;
// find max talent rank
int32 curtalent_maxrank = -1;
for(int32 k = 4; k > -1; --k)
{
if(talentInfo->RankID[k] && pet->HasSpell(talentInfo->RankID[k]))
{
curtalent_maxrank = k;
break;
}
}
// not learned talent
if(curtalent_maxrank < 0)
continue;
*data << uint32(talentInfo->TalentID); // Talent.dbc
*data << uint8(curtalent_maxrank); // talentMaxRank (0-4)
++talentIdCount;
}
data->put<uint8>(countPos, talentIdCount); // put real count
break;
}
}
void Player::SendTalentsInfoData(bool pet)
{
WorldPacket data(SMSG_TALENTS_INFO, 50);
data << uint8(pet ? 1 : 0);
if(pet)
BuildPetTalentsInfoData(&data);
else
BuildPlayerTalentsInfoData(&data);
GetSession()->SendPacket(&data);
}
void Player::BuildEnchantmentsInfoData(WorldPacket *data)
{
uint32 slotUsedMask = 0;
size_t slotUsedMaskPos = data->wpos();
*data << uint32(slotUsedMask); // slotUsedMask < 0x80000
for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
{
Item *item = GetItemByPos(INVENTORY_SLOT_BAG_0, i);
if(!item)
continue;
slotUsedMask |= (1 << i);
*data << uint32(item->GetEntry()); // item entry
uint16 enchantmentMask = 0;
size_t enchantmentMaskPos = data->wpos();
*data << uint16(enchantmentMask); // enchantmentMask < 0x1000
for(uint32 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j)
{
uint32 enchId = item->GetEnchantmentId(EnchantmentSlot(j));
if(!enchId)
continue;
enchantmentMask |= (1 << j);
*data << uint16(enchId); // enchantmentId?
}
data->put<uint16>(enchantmentMaskPos, enchantmentMask);
*data << uint16(0); // ?
*data << uint8(0); // PGUID!
*data << uint32(0); // seed?
}
data->put<uint32>(slotUsedMaskPos, slotUsedMask);
}
void Player::SendEquipmentSetList()
{
uint32 count = 0;
WorldPacket data(SMSG_EQUIPMENT_SET_LIST, 4);
size_t count_pos = data.wpos();
data << uint32(count); // count placeholder
for(EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
{
if(itr->second.state==EQUIPMENT_SET_DELETED)
continue;
data.appendPackGUID(itr->second.Guid);
data << uint32(itr->first);
data << itr->second.Name;
data << itr->second.IconName;
for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
data.appendPackGUID(MAKE_NEW_GUID(itr->second.Items[i], 0, HIGHGUID_ITEM));
++count; // client have limit but it checked at loading and set
}
data.put<uint32>(count_pos, count);
GetSession()->SendPacket(&data);
}
void Player::SetEquipmentSet(uint32 index, EquipmentSet eqset)
{
if(eqset.Guid != 0)
{
bool found = false;
for(EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
{
if((itr->second.Guid == eqset.Guid) && (itr->first == index))
{
found = true;
break;
}
}
if(!found) // something wrong...
{
sLog.outError("Player %s tried to save equipment set "UI64FMTD" (index %u), but that equipment set not found!", GetName(), eqset.Guid, index);
return;
}
}
EquipmentSet& eqslot = m_EquipmentSets[index];
EquipmentSetUpdateState old_state = eqslot.state;
eqslot = eqset;
if(eqset.Guid == 0)
{
eqslot.Guid = objmgr.GenerateEquipmentSetGuid();
WorldPacket data(SMSG_EQUIPMENT_SET_SAVED, 4 + 1);
data << uint32(index);
data.appendPackGUID(eqslot.Guid);
GetSession()->SendPacket(&data);
}
eqslot.state = old_state == EQUIPMENT_SET_NEW ? EQUIPMENT_SET_NEW : EQUIPMENT_SET_CHANGED;
}
void Player::_SaveEquipmentSets()
{
for(EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end();)
{
uint32 index = itr->first;
EquipmentSet& eqset = itr->second;
switch(eqset.state)
{
case EQUIPMENT_SET_UNCHANGED:
++itr;
break; // nothing do
case EQUIPMENT_SET_CHANGED:
CharacterDatabase.PExecute("UPDATE character_equipmentsets SET name='%s', iconname='%s', item0='%u', item1='%u', item2='%u', item3='%u', item4='%u', item5='%u', item6='%u', item7='%u', item8='%u', item9='%u', item10='%u', item11='%u', item12='%u', item13='%u', item14='%u', item15='%u', item16='%u', item17='%u', item18='%u' WHERE guid='%u' AND setguid='"UI64FMTD"' AND setindex='%u'",
eqset.Name.c_str(), eqset.IconName.c_str(), eqset.Items[0], eqset.Items[1], eqset.Items[2], eqset.Items[3], eqset.Items[4], eqset.Items[5], eqset.Items[6], eqset.Items[7],
eqset.Items[8], eqset.Items[9], eqset.Items[10], eqset.Items[11], eqset.Items[12], eqset.Items[13], eqset.Items[14], eqset.Items[15], eqset.Items[16], eqset.Items[17], eqset.Items[18], GetGUIDLow(), eqset.Guid, index);
eqset.state = EQUIPMENT_SET_UNCHANGED;
++itr;
break;
case EQUIPMENT_SET_NEW:
CharacterDatabase.PExecute("INSERT INTO character_equipmentsets VALUES ('%u', '"UI64FMTD"', '%u', '%s', '%s', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u')",
GetGUIDLow(), eqset.Guid, index, eqset.Name.c_str(), eqset.IconName.c_str(), eqset.Items[0], eqset.Items[1], eqset.Items[2], eqset.Items[3], eqset.Items[4], eqset.Items[5], eqset.Items[6], eqset.Items[7],
eqset.Items[8], eqset.Items[9], eqset.Items[10], eqset.Items[11], eqset.Items[12], eqset.Items[13], eqset.Items[14], eqset.Items[15], eqset.Items[16], eqset.Items[17], eqset.Items[18]);
eqset.state = EQUIPMENT_SET_UNCHANGED;
++itr;
break;
case EQUIPMENT_SET_DELETED:
CharacterDatabase.PExecute("DELETE FROM character_equipmentsets WHERE setguid="UI64FMTD, eqset.Guid);
m_EquipmentSets.erase(itr++);
break;
}
}
}
void Player::DeleteEquipmentSet(uint64 setGuid)
{
for(EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
{
if(itr->second.Guid == setGuid)
{
if(itr->second.state == EQUIPMENT_SET_NEW)
m_EquipmentSets.erase(itr);
else
itr->second.state = EQUIPMENT_SET_DELETED;
break;
}
}
}
void Player::ActivateSpec(uint32 specNum)
{
if(GetActiveSpec() == specNum)
return;
resetTalents(true);
}

View file

@ -352,6 +352,7 @@ struct LookingForGroup
LookingForGroupSlot slots[MAX_LOOKING_FOR_GROUP_SLOT]; LookingForGroupSlot slots[MAX_LOOKING_FOR_GROUP_SLOT];
LookingForGroupSlot more; LookingForGroupSlot more;
std::string comment; std::string comment;
uint8 roles;
}; };
enum PlayerMovementType enum PlayerMovementType
@ -542,7 +543,7 @@ enum PlayerSlots
// first slot for item stored (in any way in player m_items data) // first slot for item stored (in any way in player m_items data)
PLAYER_SLOT_START = 0, PLAYER_SLOT_START = 0,
// last+1 slot for item stored (in any way in player m_items data) // last+1 slot for item stored (in any way in player m_items data)
PLAYER_SLOT_END = 200, PLAYER_SLOT_END = 150,
PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START) PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START)
}; };
@ -610,24 +611,39 @@ enum KeyRingSlots // 32 slots
KEYRING_SLOT_END = 118 KEYRING_SLOT_END = 118
}; };
enum VanityPetSlots // 18 slots
{
VANITYPET_SLOT_START = 118, // not use, vanity pets stored as spells
VANITYPET_SLOT_END = 136 // not allowed any content in.
};
enum CurrencyTokenSlots // 32 slots enum CurrencyTokenSlots // 32 slots
{ {
CURRENCYTOKEN_SLOT_START = 136, CURRENCYTOKEN_SLOT_START = 118,
CURRENCYTOKEN_SLOT_END = 168 CURRENCYTOKEN_SLOT_END = 150
}; };
enum QuestBagSlots // 32 slots enum EquipmentSetUpdateState
{ {
QUESTBAG_SLOT_START = 168, // not use EQUIPMENT_SET_UNCHANGED = 0,
QUESTBAG_SLOT_END = 200 // not allowed any content in. EQUIPMENT_SET_CHANGED = 1,
EQUIPMENT_SET_NEW = 2,
EQUIPMENT_SET_DELETED = 3
}; };
struct EquipmentSet
{
EquipmentSet() : Guid(0), state(EQUIPMENT_SET_NEW)
{
for(int i = 0; i < EQUIPMENT_SLOT_END; ++i)
Items[i] = 0;
}
uint64 Guid;
std::string Name;
std::string IconName;
uint32 Items[EQUIPMENT_SLOT_END];
EquipmentSetUpdateState state;
};
#define MAX_EQUIPMENT_SET_INDEX 10 // client limit
typedef std::map<uint32, EquipmentSet> EquipmentSets;
struct ItemPosCount struct ItemPosCount
{ {
ItemPosCount(uint16 _pos, uint32 _count) : pos(_pos), count(_count) {} ItemPosCount(uint16 _pos, uint32 _count) : pos(_pos), count(_count) {}
@ -646,15 +662,19 @@ enum TradeSlots
enum TransferAbortReason enum TransferAbortReason
{ {
TRANSFER_ABORT_ERROR = 0x00, TRANSFER_ABORT_NONE = 0x00,
TRANSFER_ABORT_MAX_PLAYERS = 0x01, // Transfer Aborted: instance is full TRANSFER_ABORT_ERROR = 0x01,
TRANSFER_ABORT_NOT_FOUND = 0x02, // Transfer Aborted: instance not found TRANSFER_ABORT_MAX_PLAYERS = 0x02, // Transfer Aborted: instance is full
TRANSFER_ABORT_TOO_MANY_INSTANCES = 0x03, // You have entered too many instances recently. TRANSFER_ABORT_NOT_FOUND = 0x03, // Transfer Aborted: instance not found
TRANSFER_ABORT_ZONE_IN_COMBAT = 0x05, // Unable to zone in while an encounter is in progress. TRANSFER_ABORT_TOO_MANY_INSTANCES = 0x04, // You have entered too many instances recently.
TRANSFER_ABORT_INSUF_EXPAN_LVL = 0x06, // You must have <TBC,WotLK> expansion installed to access this area. TRANSFER_ABORT_ZONE_IN_COMBAT = 0x06, // Unable to zone in while an encounter is in progress.
TRANSFER_ABORT_DIFFICULTY = 0x07, // <Normal,Heroic,Epic> difficulty mode is not available for %s. TRANSFER_ABORT_INSUF_EXPAN_LVL = 0x07, // You must have <TBC,WotLK> expansion installed to access this area.
TRANSFER_ABORT_UNIQUE_MESSAGE = 0x08, // Until you've escaped TLK's grasp, you cannot leave this place! TRANSFER_ABORT_DIFFICULTY = 0x08, // <Normal,Heroic,Epic> difficulty mode is not available for %s.
TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES = 0x09 // Additional instances cannot be launched, please try again later. TRANSFER_ABORT_UNIQUE_MESSAGE = 0x09, // Until you've escaped TLK's grasp, you cannot leave this place!
TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES = 0x0A, // Additional instances cannot be launched, please try again later.
TRANSFER_ABORT_NEED_GROUP = 0x0B, // 3.1
TRANSFER_ABORT_NOT_FOUND2 = 0x0C, // 3.1
TRANSFER_ABORT_NOT_FOUND3 = 0x0D, // 3.1
}; };
enum InstanceResetWarningType enum InstanceResetWarningType
@ -694,6 +714,10 @@ struct MovementInfo
x = y = z = o = t_x = t_y = t_z = t_o = s_pitch = j_unk = j_sinAngle = j_cosAngle = j_xyspeed = u_unk1 = 0.0f; x = y = z = o = t_x = t_y = t_z = t_o = s_pitch = j_unk = j_sinAngle = j_cosAngle = j_xyspeed = u_unk1 = 0.0f;
t_guid = 0; t_guid = 0;
} }
uint32 GetMovementFlags() { return flags; }
void AddMovementFlag(uint32 flag) { flags |= flag; }
bool HasMovementFlag(uint32 flag) const { return flags & flag; }
}; };
// flags that use in movement check for example at spell casting // flags that use in movement check for example at spell casting
@ -754,20 +778,20 @@ enum PlayerLoginQueryIndex
PLAYER_LOGIN_QUERY_LOADSPELLS = 4, PLAYER_LOGIN_QUERY_LOADSPELLS = 4,
PLAYER_LOGIN_QUERY_LOADQUESTSTATUS = 5, PLAYER_LOGIN_QUERY_LOADQUESTSTATUS = 5,
PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS = 6, PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS = 6,
PLAYER_LOGIN_QUERY_LOADTUTORIALS = 7, // common for all characters for some account at specific realm PLAYER_LOGIN_QUERY_LOADREPUTATION = 7,
PLAYER_LOGIN_QUERY_LOADREPUTATION = 8, PLAYER_LOGIN_QUERY_LOADINVENTORY = 8,
PLAYER_LOGIN_QUERY_LOADINVENTORY = 9, PLAYER_LOGIN_QUERY_LOADACTIONS = 9,
PLAYER_LOGIN_QUERY_LOADACTIONS = 10, PLAYER_LOGIN_QUERY_LOADMAILCOUNT = 10,
PLAYER_LOGIN_QUERY_LOADMAILCOUNT = 11, PLAYER_LOGIN_QUERY_LOADMAILDATE = 11,
PLAYER_LOGIN_QUERY_LOADMAILDATE = 12, PLAYER_LOGIN_QUERY_LOADSOCIALLIST = 12,
PLAYER_LOGIN_QUERY_LOADSOCIALLIST = 13, PLAYER_LOGIN_QUERY_LOADHOMEBIND = 13,
PLAYER_LOGIN_QUERY_LOADHOMEBIND = 14, PLAYER_LOGIN_QUERY_LOADSPELLCOOLDOWNS = 14,
PLAYER_LOGIN_QUERY_LOADSPELLCOOLDOWNS = 15, PLAYER_LOGIN_QUERY_LOADDECLINEDNAMES = 15,
PLAYER_LOGIN_QUERY_LOADDECLINEDNAMES = 16, PLAYER_LOGIN_QUERY_LOADGUILD = 16,
PLAYER_LOGIN_QUERY_LOADGUILD = 17, PLAYER_LOGIN_QUERY_LOADARENAINFO = 17,
PLAYER_LOGIN_QUERY_LOADARENAINFO = 18, PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS = 18,
PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS = 19, PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS = 19,
PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS = 20, PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS = 20,
MAX_PLAYER_LOGIN_QUERY = 21 MAX_PLAYER_LOGIN_QUERY = 21
}; };
@ -1112,6 +1136,7 @@ class MANGOS_DLL_SPEC Player : public Unit
void ApplyEnchantment(Item *item,EnchantmentSlot slot,bool apply, bool apply_dur = true, bool ignore_condition = false); void ApplyEnchantment(Item *item,EnchantmentSlot slot,bool apply, bool apply_dur = true, bool ignore_condition = false);
void ApplyEnchantment(Item *item,bool apply); void ApplyEnchantment(Item *item,bool apply);
void SendEnchantmentDurations(); void SendEnchantmentDurations();
void BuildEnchantmentsInfoData(WorldPacket *data);
void AddItemDurations(Item *item); void AddItemDurations(Item *item);
void RemoveItemDurations(Item *item); void RemoveItemDurations(Item *item);
void SendItemDurations(); void SendItemDurations();
@ -1288,22 +1313,6 @@ class MANGOS_DLL_SPEC Player : public Unit
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED);
} }
uint32 GetTutorialInt(uint32 intId )
{
ASSERT( (intId < 8) );
return m_Tutorials[intId];
}
void SetTutorialInt(uint32 intId, uint32 value)
{
ASSERT( (intId < 8) );
if(m_Tutorials[intId]!=value)
{
m_Tutorials[intId] = value;
m_TutorialsChanged = true;
}
}
QuestStatusMap& getQuestStatusMap() { return mQuestStatus; }; QuestStatusMap& getQuestStatusMap() { return mQuestStatus; };
const uint64& GetSelection( ) const { return m_curSelection; } const uint64& GetSelection( ) const { return m_curSelection; }
@ -1386,12 +1395,21 @@ class MANGOS_DLL_SPEC Player : public Unit
bool resetTalents(bool no_cost = false); bool resetTalents(bool no_cost = false);
uint32 resetTalentsCost() const; uint32 resetTalentsCost() const;
void InitTalentForLevel(); void InitTalentForLevel();
void BuildPlayerTalentsInfoData(WorldPacket *data);
void BuildPetTalentsInfoData(WorldPacket *data);
void SendTalentsInfoData(bool pet);
void LearnTalent(uint32 talentId, uint32 talentRank); void LearnTalent(uint32 talentId, uint32 talentRank);
void LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank); void LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank);
uint32 CalculateTalentsPoints() const; uint32 CalculateTalentsPoints() const;
// Dual Spec
uint32 GetActiveSpec() { return m_activeSpec; }
void SetActiveSpec(uint32 spec) { m_activeSpec = spec; }
uint32 GetSpecsCount() { return m_specsCount; }
void SetSpecsCount(uint32 count) { m_specsCount = count; }
void ActivateSpec(uint32 specNum);
void InitGlyphsForLevel(); void InitGlyphsForLevel();
void SetGlyphSlot(uint8 slot, uint32 slottype) { SetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot, slottype); } void SetGlyphSlot(uint8 slot, uint32 slottype) { SetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot, slottype); }
uint32 GetGlyphSlot(uint8 slot) { return GetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot); } uint32 GetGlyphSlot(uint8 slot) { return GetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot); }
@ -1760,6 +1778,10 @@ class MANGOS_DLL_SPEC Player : public Unit
void CastItemCombatSpell(Item *item,Unit* Target, WeaponAttackType attType); void CastItemCombatSpell(Item *item,Unit* Target, WeaponAttackType attType);
void CastItemUseSpell(Item *item,SpellCastTargets const& targets,uint8 cast_count, uint32 glyphIndex); void CastItemUseSpell(Item *item,SpellCastTargets const& targets,uint8 cast_count, uint32 glyphIndex);
void SendEquipmentSetList();
void SetEquipmentSet(uint32 index, EquipmentSet eqset);
void DeleteEquipmentSet(uint64 setGuid);
void SendInitWorldStates(uint32 zone, uint32 area); void SendInitWorldStates(uint32 zone, uint32 area);
void SendUpdateWorldState(uint32 Field, uint32 Value); void SendUpdateWorldState(uint32 Field, uint32 Value);
void SendDirectMessage(WorldPacket *data); void SendDirectMessage(WorldPacket *data);
@ -1921,11 +1943,11 @@ class MANGOS_DLL_SPEC Player : public Unit
} }
void HandleFall(MovementInfo const& movementInfo); void HandleFall(MovementInfo const& movementInfo);
bool isMoving() const { return HasUnitMovementFlag(movementFlagsMask); } bool isMoving() const { return m_movementInfo.HasMovementFlag(movementFlagsMask); }
bool isMovingOrTurning() const { return HasUnitMovementFlag(movementOrTurningFlagsMask); } bool isMovingOrTurning() const { return m_movementInfo.HasMovementFlag(movementOrTurningFlagsMask); }
bool CanFly() const { return HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); } bool CanFly() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); }
bool IsFlying() const { return HasUnitMovementFlag(MOVEMENTFLAG_FLYING); } bool IsFlying() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FLYING); }
bool IsAllowUseFlyMountsHere() const; bool IsAllowUseFlyMountsHere() const;
void SetClientControl(Unit* target, uint8 allowMove); void SetClientControl(Unit* target, uint8 allowMove);
@ -2125,11 +2147,11 @@ class MANGOS_DLL_SPEC Player : public Unit
void _LoadGroup(QueryResult *result); void _LoadGroup(QueryResult *result);
void _LoadSkills(); void _LoadSkills();
void _LoadSpells(QueryResult *result); void _LoadSpells(QueryResult *result);
void _LoadTutorials(QueryResult *result);
void _LoadFriendList(QueryResult *result); void _LoadFriendList(QueryResult *result);
bool _LoadHomeBind(QueryResult *result); bool _LoadHomeBind(QueryResult *result);
void _LoadDeclinedNames(QueryResult *result); void _LoadDeclinedNames(QueryResult *result);
void _LoadArenaTeamInfo(QueryResult *result); void _LoadArenaTeamInfo(QueryResult *result);
void _LoadEquipmentSets(QueryResult *result);
/*********************************************************/ /*********************************************************/
/*** SAVE SYSTEM ***/ /*** SAVE SYSTEM ***/
@ -2142,7 +2164,7 @@ class MANGOS_DLL_SPEC Player : public Unit
void _SaveQuestStatus(); void _SaveQuestStatus();
void _SaveDailyQuestStatus(); void _SaveDailyQuestStatus();
void _SaveSpells(); void _SaveSpells();
void _SaveTutorials(); void _SaveEquipmentSets();
void _SetCreateBits(UpdateMask *updateMask, Player *target) const; void _SetCreateBits(UpdateMask *updateMask, Player *target) const;
void _SetUpdateBits(UpdateMask *updateMask, Player *target) const; void _SetUpdateBits(UpdateMask *updateMask, Player *target) const;
@ -2196,6 +2218,9 @@ class MANGOS_DLL_SPEC Player : public Unit
SpellCooldowns m_spellCooldowns; SpellCooldowns m_spellCooldowns;
uint32 m_lastPotionId; // last used health/mana potion in combat, that block next potion use uint32 m_lastPotionId; // last used health/mana potion in combat, that block next potion use
uint32 m_activeSpec;
uint32 m_specsCount;
ActionButtonList m_actionButtons; ActionButtonList m_actionButtons;
float m_auraBaseMod[BASEMOD_END][MOD_END]; float m_auraBaseMod[BASEMOD_END][MOD_END];
@ -2229,9 +2254,6 @@ class MANGOS_DLL_SPEC Player : public Unit
time_t m_nextThinkTime; time_t m_nextThinkTime;
uint32 m_Tutorials[8];
bool m_TutorialsChanged;
bool m_DailyQuestChanged; bool m_DailyQuestChanged;
time_t m_lastDailyQuestTime; time_t m_lastDailyQuestTime;
@ -2297,6 +2319,7 @@ class MANGOS_DLL_SPEC Player : public Unit
DeclinedName *m_declinedname; DeclinedName *m_declinedname;
Runes *m_runes; Runes *m_runes;
EquipmentSets m_EquipmentSets;
private: private:
// internal common parts for CanStore/StoreItem functions // internal common parts for CanStore/StoreItem functions
uint8 _CanStoreItem_InSpecificSlot( uint8 bag, uint8 slot, ItemPosCountVec& dest, ItemPrototype const *pProto, uint32& count, bool swap, Item *pSrcItem ) const; uint8 _CanStoreItem_InSpecificSlot( uint8 bag, uint8 slot, ItemPosCountVec& dest, ItemPrototype const *pProto, uint32& count, bool swap, Item *pSrcItem ) const;

View file

@ -33,7 +33,7 @@ void PointMovementGenerator<T>::Initialize(T &unit)
i_destinationHolder.SetDestination(traveller,i_x,i_y,i_z); i_destinationHolder.SetDestination(traveller,i_x,i_y,i_z);
if (unit.GetTypeId() == TYPEID_UNIT && ((Creature*)&unit)->canFly()) if (unit.GetTypeId() == TYPEID_UNIT && ((Creature*)&unit)->canFly())
unit.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); unit.AddUnitMovementFlag(MONSTER_MOVE_FLY);
} }
template<class T> template<class T>

View file

@ -38,13 +38,14 @@ void WorldSession::SendNameQueryOpcode(Player *p)
return; return;
// guess size // guess size
WorldPacket data( SMSG_NAME_QUERY_RESPONSE, (8+1+4+4+4+10) ); WorldPacket data( SMSG_NAME_QUERY_RESPONSE, (8+1+1+1+1+1+10) );
data << p->GetGUID(); data.append(p->GetPackGUID()); // player guid
data << p->GetName(); data << uint8(0); // added in 3.1
data << p->GetName(); // played name
data << uint8(0); // realm name for cross realm BG usage data << uint8(0); // realm name for cross realm BG usage
data << uint32(p->getRace()); data << uint8(p->getRace());
data << uint32(p->getGender()); data << uint8(p->getGender());
data << uint32(p->getClass()); data << uint8(p->getClass());
if(DeclinedName const* names = p->GetDeclinedNames()) if(DeclinedName const* names = p->GetDeclinedNames())
{ {
data << uint8(1); // is declined data << uint8(1); // is declined
@ -97,13 +98,14 @@ void WorldSession::SendNameQueryOpcodeFromDBCallBack(QueryResult *result, uint32
field = fields[2].GetUInt32(); field = fields[2].GetUInt32();
// guess size // guess size
WorldPacket data( SMSG_NAME_QUERY_RESPONSE, (8+1+4+4+4+10) ); WorldPacket data( SMSG_NAME_QUERY_RESPONSE, (8+1+1+1+1+1+1+10) );
data << MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER); data.appendPackGUID(MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER));
data << uint8(0); // added in 3.1
data << name; data << name;
data << uint8(0); data << uint8(0);
data << uint32(field & 0xFF); data << uint8(field & 0xFF);
data << uint32((field >> 16) & 0xFF); data << uint8((field >> 16) & 0xFF);
data << uint32((field >> 8) & 0xFF); data << uint8((field >> 8) & 0xFF);
// if the first declined name field (3) is empty, the rest must be too // if the first declined name field (3) is empty, the rest must be too
if(sWorld.getConfig(CONFIG_DECLINED_NAMES_USED) && fields[3].GetCppString() != "") if(sWorld.getConfig(CONFIG_DECLINED_NAMES_USED) && fields[3].GetCppString() != "")
@ -183,7 +185,8 @@ void WorldSession::HandleCreatureQueryOpcode( WorldPacket & recv_data )
data << uint32(ci->type); // CreatureType.dbc data << uint32(ci->type); // CreatureType.dbc
data << uint32(ci->family); // CreatureFamily.dbc data << uint32(ci->family); // CreatureFamily.dbc
data << uint32(ci->rank); // Creature Rank (elite, boss, etc) data << uint32(ci->rank); // Creature Rank (elite, boss, etc)
data << uint32(ci->PetSpellDataId); // Id from CreatureSpellData.dbc wdbField12 data << uint32(ci->unk1); // new in 3.1, creature entry?
data << uint32(ci->unk2); // new in 3.1, creature entry?
data << uint32(ci->DisplayID_A); // modelid_male1 data << uint32(ci->DisplayID_A); // modelid_male1
data << uint32(ci->DisplayID_H); // modelid_female1 ? data << uint32(ci->DisplayID_H); // modelid_female1 ?
data << uint32(ci->DisplayID_A2); // modelid_male2 ? data << uint32(ci->DisplayID_A2); // modelid_male2 ?
@ -191,6 +194,9 @@ void WorldSession::HandleCreatureQueryOpcode( WorldPacket & recv_data )
data << float(ci->unk16); // unk data << float(ci->unk16); // unk
data << float(ci->unk17); // unk data << float(ci->unk17); // unk
data << uint8(ci->RacialLeader); data << uint8(ci->RacialLeader);
for(uint32 i = 0; i < 4; ++i)
data << uint32(ci->questItems[i]); // itemId[4], quest drop
data << uint32(ci->movementId); // CreatureMovementInfo.dbc
SendPacket( &data ); SendPacket( &data );
sLog.outDebug( "WORLD: Sent SMSG_CREATURE_QUERY_RESPONSE" ); sLog.outDebug( "WORLD: Sent SMSG_CREATURE_QUERY_RESPONSE" );
} }
@ -248,9 +254,11 @@ void WorldSession::HandleGameObjectQueryOpcode( WorldPacket & recv_data )
data << uint8(0) << uint8(0) << uint8(0); // name2, name3, name4 data << uint8(0) << uint8(0) << uint8(0); // name2, name3, name4
data << IconName; // 2.0.3, string. Icon name to use instead of default icon for go's (ex: "Attack" makes sword) data << IconName; // 2.0.3, string. Icon name to use instead of default icon for go's (ex: "Attack" makes sword)
data << CastBarCaption; // 2.0.3, string. Text will appear in Cast Bar when using GO (ex: "Collecting") data << CastBarCaption; // 2.0.3, string. Text will appear in Cast Bar when using GO (ex: "Collecting")
data << uint8(0); // 2.0.3, string data << info->unk1; // 2.0.3, string
data.append(info->raw.data, 24); data.append(info->raw.data, 24);
data << float(info->size); // go size data << float(info->size); // go size
for(uint32 i = 0; i < 4; ++i)
data << uint32(info->questItems[i]); // itemId[4], quest drop
SendPacket( &data ); SendPacket( &data );
sLog.outDebug( "WORLD: Sent SMSG_GAMEOBJECT_QUERY_RESPONSE" ); sLog.outDebug( "WORLD: Sent SMSG_GAMEOBJECT_QUERY_RESPONSE" );
} }

View file

@ -104,13 +104,15 @@ enum __QuestGiverStatus
{ {
DIALOG_STATUS_NONE = 0, DIALOG_STATUS_NONE = 0,
DIALOG_STATUS_UNAVAILABLE = 1, DIALOG_STATUS_UNAVAILABLE = 1,
DIALOG_STATUS_CHAT = 2, DIALOG_STATUS_CHAT = 2, // 3.1 - may be changed
DIALOG_STATUS_INCOMPLETE = 3, DIALOG_STATUS_UNK1 = 3, // 3.1
DIALOG_STATUS_REWARD_REP = 4, DIALOG_STATUS_UNK2 = 4, // 3.1
DIALOG_STATUS_AVAILABLE_REP = 5, DIALOG_STATUS_INCOMPLETE = 5,
DIALOG_STATUS_AVAILABLE = 6, DIALOG_STATUS_REWARD_REP = 6,
DIALOG_STATUS_REWARD2 = 7, // not yellow dot on minimap DIALOG_STATUS_AVAILABLE_REP = 7,
DIALOG_STATUS_REWARD = 8 // yellow dot on minimap DIALOG_STATUS_AVAILABLE = 8,
DIALOG_STATUS_REWARD2 = 9, // no yellow dot on minimap
DIALOG_STATUS_REWARD = 10 // yellow dot on minimap
}; };
enum __QuestFlags enum __QuestFlags

View file

@ -110,16 +110,17 @@ void WorldSession::HandleQuestgiverHelloOpcode( WorldPacket & recv_data )
void WorldSession::HandleQuestgiverAcceptQuestOpcode( WorldPacket & recv_data ) void WorldSession::HandleQuestgiverAcceptQuestOpcode( WorldPacket & recv_data )
{ {
CHECK_PACKET_SIZE(recv_data, 8+4); CHECK_PACKET_SIZE(recv_data, 8+4+4);
uint64 guid; uint64 guid;
uint32 quest; uint32 quest;
recv_data >> guid >> quest; uint32 unk1;
recv_data >> guid >> quest >> unk1;
if(!GetPlayer()->isAlive()) if(!GetPlayer()->isAlive())
return; return;
sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_ACCEPT_QUEST npc = %u, quest = %u", uint32(GUID_LOPART(guid)), quest ); sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_ACCEPT_QUEST npc = %u, quest = %u, unk1 = %u", uint32(GUID_LOPART(guid)), quest, unk1 );
Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT|TYPEMASK_ITEM|TYPEMASK_PLAYER); Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT|TYPEMASK_ITEM|TYPEMASK_PLAYER);
@ -206,12 +207,13 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode( WorldPacket & recv_data )
void WorldSession::HandleQuestgiverQueryQuestOpcode( WorldPacket & recv_data ) void WorldSession::HandleQuestgiverQueryQuestOpcode( WorldPacket & recv_data )
{ {
CHECK_PACKET_SIZE(recv_data, 8+4); CHECK_PACKET_SIZE(recv_data, 8+4+1);
uint64 guid; uint64 guid;
uint32 quest; uint32 quest;
recv_data >> guid >> quest; uint8 unk1;
sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_QUERY_QUEST npc = %u, quest = %u", uint32(GUID_LOPART(guid)), quest ); recv_data >> guid >> quest >> unk1;
sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_QUERY_QUEST npc = %u, quest = %u, unk1 = %u", uint32(GUID_LOPART(guid)), quest, unk1 );
// Verify that the guid is valid and is a questgiver or involved in the requested quest // Verify that the guid is valid and is a questgiver or involved in the requested quest
Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT|TYPEMASK_ITEM); Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT|TYPEMASK_ITEM);
@ -230,7 +232,7 @@ void WorldSession::HandleQuestgiverQueryQuestOpcode( WorldPacket & recv_data )
void WorldSession::HandleQuestQueryOpcode( WorldPacket & recv_data ) void WorldSession::HandleQuestQueryOpcode( WorldPacket & recv_data )
{ {
CHECK_PACKET_SIZE(recv_data,4); CHECK_PACKET_SIZE(recv_data, 4);
uint32 quest; uint32 quest;
recv_data >> quest; recv_data >> quest;
@ -409,7 +411,12 @@ void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recv_data)
_player->PlayerTalkClass->SendQuestGiverRequestItems(pQuest, guid, _player->CanRewardQuest(pQuest,false), false); _player->PlayerTalkClass->SendQuestGiverRequestItems(pQuest, guid, _player->CanRewardQuest(pQuest,false), false);
} }
else else
_player->PlayerTalkClass->SendQuestGiverRequestItems(pQuest, guid, _player->CanRewardQuest(pQuest,false), false); {
if(pQuest->GetReqItemsCount()) // some items required
_player->PlayerTalkClass->SendQuestGiverRequestItems(pQuest, guid, _player->CanRewardQuest(pQuest,false), false);
else // no items required
_player->PlayerTalkClass->SendQuestGiverOfferReward(pQuest, guid, true);
}
} }
} }

View file

@ -91,13 +91,13 @@ RandomMovementGenerator<Creature>::_setRandomLocation(Creature &creature)
if (is_air_ok) if (is_air_ok)
{ {
i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime()); i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime());
creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); creature.AddUnitMovementFlag(MONSTER_MOVE_FLY);
} }
//else if (is_water_ok) // Swimming mode to be done with more than this check //else if (is_water_ok) // Swimming mode to be done with more than this check
else else
{ {
i_nextMoveTime.Reset(urand(500+i_destinationHolder.GetTotalTravelTime(),5000+i_destinationHolder.GetTotalTravelTime())); i_nextMoveTime.Reset(urand(500+i_destinationHolder.GetTotalTravelTime(),5000+i_destinationHolder.GetTotalTravelTime()));
creature.SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE); creature.SetUnitMovementFlags(MONSTER_MOVE_WALK);
} }
} }
@ -109,9 +109,9 @@ RandomMovementGenerator<Creature>::Initialize(Creature &creature)
return; return;
if (creature.canFly()) if (creature.canFly())
creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); creature.AddUnitMovementFlag(MONSTER_MOVE_FLY);
else else
creature.SetUnitMovementFlags(irand(0,RUNNING_CHANCE_RANDOMMV) > 0 ? MOVEMENTFLAG_WALK_MODE : MOVEMENTFLAG_NONE ); creature.SetUnitMovementFlags(irand(0,RUNNING_CHANCE_RANDOMMV) > 0 ? MONSTER_MOVE_WALK : MONSTER_MOVE_NONE);
_setRandomLocation(creature); _setRandomLocation(creature);
} }
@ -148,14 +148,14 @@ RandomMovementGenerator<Creature>::Update(Creature &creature, const uint32 &diff
if(i_nextMoveTime.Passed()) if(i_nextMoveTime.Passed())
{ {
if (creature.canFly()) if (creature.canFly())
creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); creature.AddUnitMovementFlag(MONSTER_MOVE_FLY);
else else
creature.SetUnitMovementFlags(irand(0,RUNNING_CHANCE_RANDOMMV) > 0 ? MOVEMENTFLAG_WALK_MODE : MOVEMENTFLAG_NONE); creature.SetUnitMovementFlags(irand(0,RUNNING_CHANCE_RANDOMMV) > 0 ? MONSTER_MOVE_WALK : MONSTER_MOVE_NONE);
_setRandomLocation(creature); _setRandomLocation(creature);
} }
else if(creature.isPet() && creature.GetOwner() && !creature.IsWithinDist(creature.GetOwner(),PET_FOLLOW_DIST+2.5f)) else if(creature.isPet() && creature.GetOwner() && !creature.IsWithinDist(creature.GetOwner(),PET_FOLLOW_DIST+2.5f))
{ {
creature.SetUnitMovementFlags(MOVEMENTFLAG_NONE); creature.SetUnitMovementFlags(MONSTER_MOVE_WALK);
_setRandomLocation(creature); _setRandomLocation(creature);
} }
} }

View file

@ -680,7 +680,10 @@ enum SpellEffects
SPELL_EFFECT_CREATE_ITEM_2 = 157, SPELL_EFFECT_CREATE_ITEM_2 = 157,
SPELL_EFFECT_MILLING = 158, SPELL_EFFECT_MILLING = 158,
SPELL_EFFECT_ALLOW_RENAME_PET = 159, SPELL_EFFECT_ALLOW_RENAME_PET = 159,
TOTAL_SPELL_EFFECTS = 160 SPELL_EFFECT_160 = 160,
SPELL_EFFECT_161 = 161,
SPELL_EFFECT_162 = 162,
TOTAL_SPELL_EFFECTS = 163
}; };
enum SpellCastResult enum SpellCastResult
@ -1100,7 +1103,7 @@ enum GameobjectTypes
GAMEOBJECT_TYPE_FISHINGNODE = 17, GAMEOBJECT_TYPE_FISHINGNODE = 17,
GAMEOBJECT_TYPE_SUMMONING_RITUAL = 18, GAMEOBJECT_TYPE_SUMMONING_RITUAL = 18,
GAMEOBJECT_TYPE_MAILBOX = 19, GAMEOBJECT_TYPE_MAILBOX = 19,
GAMEOBJECT_TYPE_AUCTIONHOUSE = 20, GAMEOBJECT_TYPE_DO_NOT_USE = 20,
GAMEOBJECT_TYPE_GUARDPOST = 21, GAMEOBJECT_TYPE_GUARDPOST = 21,
GAMEOBJECT_TYPE_SPELLCASTER = 22, GAMEOBJECT_TYPE_SPELLCASTER = 22,
GAMEOBJECT_TYPE_MEETINGSTONE = 23, GAMEOBJECT_TYPE_MEETINGSTONE = 23,
@ -1108,7 +1111,7 @@ enum GameobjectTypes
GAMEOBJECT_TYPE_FISHINGHOLE = 25, GAMEOBJECT_TYPE_FISHINGHOLE = 25,
GAMEOBJECT_TYPE_FLAGDROP = 26, GAMEOBJECT_TYPE_FLAGDROP = 26,
GAMEOBJECT_TYPE_MINI_GAME = 27, GAMEOBJECT_TYPE_MINI_GAME = 27,
GAMEOBJECT_TYPE_LOTTERY_KIOSK = 28, GAMEOBJECT_TYPE_DO_NOT_USE_2 = 28,
GAMEOBJECT_TYPE_CAPTURE_POINT = 29, GAMEOBJECT_TYPE_CAPTURE_POINT = 29,
GAMEOBJECT_TYPE_AURA_GENERATOR = 30, GAMEOBJECT_TYPE_AURA_GENERATOR = 30,
GAMEOBJECT_TYPE_DUNGEON_DIFFICULTY = 31, GAMEOBJECT_TYPE_DUNGEON_DIFFICULTY = 31,

View file

@ -34,6 +34,30 @@ void WorldSession::HandleLearnTalentOpcode( WorldPacket & recv_data )
recv_data >> talent_id >> requested_rank; recv_data >> talent_id >> requested_rank;
_player->LearnTalent(talent_id, requested_rank); _player->LearnTalent(talent_id, requested_rank);
_player->SendTalentsInfoData(false);
}
void WorldSession::HandleLearnPreviewTalents(WorldPacket& recvPacket)
{
sLog.outDebug("CMSG_LEARN_PREVIEW_TALENTS");
CHECK_PACKET_SIZE(recvPacket, 4);
uint32 talentsCount;
recvPacket >> talentsCount;
uint32 talentId, talentRank;
for(uint32 i = 0; i < talentsCount; ++i)
{
CHECK_PACKET_SIZE(recvPacket, recvPacket.rpos()+4+4);
recvPacket >> talentId >> talentRank;
_player->LearnTalent(talentId, talentRank);
}
_player->SendTalentsInfoData(false);
} }
void WorldSession::HandleTalentWipeConfirmOpcode( WorldPacket & recv_data ) void WorldSession::HandleTalentWipeConfirmOpcode( WorldPacket & recv_data )
@ -64,6 +88,7 @@ void WorldSession::HandleTalentWipeConfirmOpcode( WorldPacket & recv_data )
return; return;
} }
_player->SendTalentsInfoData(false);
unit->CastSpell(_player, 14867, true); //spell: "Untalent Visual Effect" unit->CastSpell(_player, 14867, true); //spell: "Untalent Visual Effect"
} }

View file

@ -3227,7 +3227,6 @@ void Spell::SendLogExecute()
data << uint32(0); data << uint32(0);
break; break;
case SPELL_EFFECT_OPEN_LOCK: case SPELL_EFFECT_OPEN_LOCK:
case SPELL_EFFECT_OPEN_LOCK_ITEM:
if(Item *item = m_targets.getItemTarget()) if(Item *item = m_targets.getItemTarget())
data.append(item->GetPackGUID()); data.append(item->GetPackGUID());
else else
@ -3753,7 +3752,7 @@ SpellCastResult Spell::CheckCast(bool strict)
if( m_caster->GetTypeId()==TYPEID_PLAYER && ((Player*)m_caster)->isMoving() ) if( m_caster->GetTypeId()==TYPEID_PLAYER && ((Player*)m_caster)->isMoving() )
{ {
// skip stuck spell to allow use it in falling case and apply spell limitations at movement // skip stuck spell to allow use it in falling case and apply spell limitations at movement
if( (!m_caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING) || m_spellInfo->Effect[0] != SPELL_EFFECT_STUCK) && if( (!((Player*)m_caster)->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING) || m_spellInfo->Effect[0] != SPELL_EFFECT_STUCK) &&
(IsAutoRepeat() || (m_spellInfo->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) != 0) ) (IsAutoRepeat() || (m_spellInfo->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) != 0) )
return SPELL_FAILED_MOVING; return SPELL_FAILED_MOVING;
} }

View file

@ -331,7 +331,13 @@ enum AuraType
SPELL_AURA_286, SPELL_AURA_286,
SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_DEFLECT_SPELLS,
SPELL_AURA_288, SPELL_AURA_288,
TOTAL_AURAS = 289 SPELL_AURA_289,
SPELL_AURA_290,
SPELL_AURA_291,
SPELL_AURA_292,
SPELL_AURA_293,
SPELL_AURA_294,
TOTAL_AURAS = 295
}; };
enum AreaAuraType enum AreaAuraType

View file

@ -339,6 +339,12 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleUnused, //286 not used by any spells (3.08a) &Aura::HandleUnused, //286 not used by any spells (3.08a)
&Aura::HandleNoImmediateEffect, //287 SPELL_AURA_DEFLECT_SPELLS implemented in Unit::MagicSpellHitResult and Unit::MeleeSpellHitResult &Aura::HandleNoImmediateEffect, //287 SPELL_AURA_DEFLECT_SPELLS implemented in Unit::MagicSpellHitResult and Unit::MeleeSpellHitResult
&Aura::HandleUnused, //288 not used by any spells (3.09) except 1 test spell. &Aura::HandleUnused, //288 not used by any spells (3.09) except 1 test spell.
&Aura::HandleUnused, //289 unused
&Aura::HandleUnused, //290 unused
&Aura::HandleUnused, //291 unused
&Aura::HandleNULL, //292 call stabled pet
&Aura::HandleNULL, //293 2 test spells
&Aura::HandleNULL //294 2 spells, possible prevent mana regen
}; };
static AuraType const frozenAuraTypes[] = { SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, SPELL_AURA_NONE }; static AuraType const frozenAuraTypes[] = { SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, SPELL_AURA_NONE };
@ -3120,9 +3126,8 @@ void Aura::HandleModPossess(bool apply, bool Real)
((Player*)caster)->SetFarSightGUID(0); ((Player*)caster)->SetFarSightGUID(0);
((Player*)caster)->SetClientControl(m_target, 0); ((Player*)caster)->SetClientControl(m_target, 0);
WorldPacket data(SMSG_PET_SPELLS, 8+4); WorldPacket data(SMSG_PET_SPELLS, 8);
data << uint64(0); data << uint64(0);
data << uint32(0);
((Player*)caster)->GetSession()->SendPacket(&data); ((Player*)caster)->GetSession()->SendPacket(&data);
} }
@ -3168,7 +3173,7 @@ void Aura::HandleModPossessPet(bool apply, bool Real)
{ {
pet->AttackStop(); pet->AttackStop();
pet->GetMotionMaster()->MoveFollow(caster, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); pet->GetMotionMaster()->MoveFollow(caster, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
pet->SetUnitMovementFlags(MOVEMENTFLAG_NONE); pet->SetUnitMovementFlags(MONSTER_MOVE_WALK);
} }
} }
@ -3278,9 +3283,8 @@ void Aura::HandleModCharm(bool apply, bool Real)
if(caster->GetTypeId() == TYPEID_PLAYER) if(caster->GetTypeId() == TYPEID_PLAYER)
{ {
WorldPacket data(SMSG_PET_SPELLS, 8+4); WorldPacket data(SMSG_PET_SPELLS, 8);
data << uint64(0); data << uint64(0);
data << uint32(0);
((Player*)caster)->GetSession()->SendPacket(&data); ((Player*)caster)->GetSession()->SendPacket(&data);
} }
if(m_target->GetTypeId() == TYPEID_UNIT) if(m_target->GetTypeId() == TYPEID_UNIT)
@ -3413,7 +3417,7 @@ void Aura::HandleAuraModStun(bool apply, bool Real)
((Creature*)m_target)->StopMoving(); ((Creature*)m_target)->StopMoving();
else else
{ {
m_target->SetUnitMovementFlags(0); // Clear movement flags ((Player*)m_target)->m_movementInfo.flags = 0; // Clear movement flags
m_target->SetStandState(UNIT_STAND_STATE_STAND);// in 1.5 client m_target->SetStandState(UNIT_STAND_STATE_STAND);// in 1.5 client
} }
@ -3697,7 +3701,7 @@ void Aura::HandleAuraModRoot(bool apply, bool Real)
m_target->SendMessageToSet(&data, true); m_target->SendMessageToSet(&data, true);
//Clear unit movement flags //Clear unit movement flags
m_target->SetUnitMovementFlags(0); ((Player*)m_target)->m_movementInfo.flags = 0;
} }
else else
((Creature *)m_target)->StopMoving(); ((Creature *)m_target)->StopMoving();

View file

@ -216,7 +216,10 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
&Spell::EffectEnchantItemPrismatic, //156 SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC &Spell::EffectEnchantItemPrismatic, //156 SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC
&Spell::EffectCreateItem2, //157 SPELL_EFFECT_CREATE_ITEM_2 create/learn item/spell for profession &Spell::EffectCreateItem2, //157 SPELL_EFFECT_CREATE_ITEM_2 create/learn item/spell for profession
&Spell::EffectMilling, //158 SPELL_EFFECT_MILLING milling &Spell::EffectMilling, //158 SPELL_EFFECT_MILLING milling
&Spell::EffectRenamePet //159 SPELL_EFFECT_ALLOW_RENAME_PET allow rename pet once again &Spell::EffectRenamePet, //159 SPELL_EFFECT_ALLOW_RENAME_PET allow rename pet once again
&Spell::EffectNULL, //160 SPELL_EFFECT_160 unused
&Spell::EffectNULL, //161 SPELL_EFFECT_161 second talent spec (learn/revert)
&Spell::EffectNULL //162 SPELL_EFFECT_162 activate primary/secondary spec
}; };
void Spell::EffectNULL(uint32 /*i*/) void Spell::EffectNULL(uint32 /*i*/)
@ -5440,6 +5443,7 @@ void Spell::EffectApplyGlyph(uint32 i)
player->CastSpell(m_caster, gp->SpellId, true); player->CastSpell(m_caster, gp->SpellId, true);
player->SetGlyph(m_glyphIndex, glyph); player->SetGlyph(m_glyphIndex, glyph);
player->SendTalentsInfoData(false);
} }
} }
} }
@ -5910,7 +5914,7 @@ void Spell::EffectCharge(uint32 /*i*/)
((Creature *)unitTarget)->StopMoving(); ((Creature *)unitTarget)->StopMoving();
// Only send MOVEMENTFLAG_WALK_MODE, client has strange issues with other move flags // Only send MOVEMENTFLAG_WALK_MODE, client has strange issues with other move flags
m_caster->SendMonsterMove(x, y, z, 0, MOVEMENTFLAG_WALK_MODE, 1); m_caster->SendMonsterMove(x, y, z, 0, MONSTER_MOVE_WALK, 1);
if(m_caster->GetTypeId() != TYPEID_PLAYER) if(m_caster->GetTypeId() != TYPEID_PLAYER)
m_caster->GetMap()->CreatureRelocation((Creature*)m_caster,x,y,z,m_caster->GetOrientation()); m_caster->GetMap()->CreatureRelocation((Creature*)m_caster,x,y,z,m_caster->GetOrientation());

View file

@ -85,7 +85,7 @@ TargetedMovementGenerator<T>::_setTargetLocation(T &owner)
i_destinationHolder.SetDestination(traveller, x, y, z); i_destinationHolder.SetDestination(traveller, x, y, z);
owner.addUnitState(UNIT_STAT_CHASE); owner.addUnitState(UNIT_STAT_CHASE);
if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly()) if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly())
owner.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); owner.AddUnitMovementFlag(MONSTER_MOVE_FLY);
} }
template<class T> template<class T>
@ -93,12 +93,12 @@ void
TargetedMovementGenerator<T>::Initialize(T &owner) TargetedMovementGenerator<T>::Initialize(T &owner)
{ {
if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->HasSearchedAssistance()) if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->HasSearchedAssistance())
owner.AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); owner.AddUnitMovementFlag(MONSTER_MOVE_WALK);
else else
owner.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); owner.RemoveUnitMovementFlag(MONSTER_MOVE_WALK);
if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly()) if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly())
owner.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); owner.AddUnitMovementFlag(MONSTER_MOVE_FLY);
_setTargetLocation(owner); _setTargetLocation(owner);
} }
@ -150,7 +150,7 @@ TargetedMovementGenerator<T>::Update(T &owner, const uint32 & time_diff)
{ {
owner.addUnitState(UNIT_STAT_CHASE); owner.addUnitState(UNIT_STAT_CHASE);
if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly()) if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly())
owner.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); owner.AddUnitMovementFlag(MONSTER_MOVE_FLY);
i_destinationHolder.StartTravel(traveller); i_destinationHolder.StartTravel(traveller);
return true; return true;

View file

@ -132,8 +132,7 @@ void MapManager::LoadTransports()
Transport::Transport() : GameObject() Transport::Transport() : GameObject()
{ {
// 2.3.2 - 0x5A m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_ROTATION);
m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
} }
bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress, uint32 dynflags) bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress, uint32 dynflags)

View file

@ -71,9 +71,9 @@ inline uint32 Traveller<T>::GetTotalTrevelTimeTo(float x, float y, float z)
template<> template<>
inline float Traveller<Creature>::Speed() inline float Traveller<Creature>::Speed()
{ {
if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_WALK_MODE)) if(i_traveller.HasUnitMovementFlag(MONSTER_MOVE_WALK))
return i_traveller.GetSpeed(MOVE_WALK); return i_traveller.GetSpeed(MOVE_WALK);
else if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_FLYING2)) else if(i_traveller.HasUnitMovementFlag(MONSTER_MOVE_FLY))
return i_traveller.GetSpeed(MOVE_FLIGHT); return i_traveller.GetSpeed(MOVE_FLIGHT);
else else
return i_traveller.GetSpeed(MOVE_RUN); return i_traveller.GetSpeed(MOVE_RUN);
@ -112,7 +112,7 @@ inline float Traveller<Player>::Speed()
if (i_traveller.isInFlight()) if (i_traveller.isInFlight())
return PLAYER_FLIGHT_SPEED; return PLAYER_FLIGHT_SPEED;
else else
return i_traveller.GetSpeed(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_WALK_MODE) ? MOVE_WALK : MOVE_RUN); return i_traveller.GetSpeed(i_traveller.m_movementInfo.HasMovementFlag(MOVEMENTFLAG_WALK_MODE) ? MOVE_WALK : MOVE_RUN);
} }
template<> template<>
@ -138,7 +138,7 @@ template<>
inline void Traveller<Player>::MoveTo(float x, float y, float z, uint32 t) inline void Traveller<Player>::MoveTo(float x, float y, float z, uint32 t)
{ {
//Only send MOVEMENTFLAG_WALK_MODE, client has strange issues with other move flags //Only send MOVEMENTFLAG_WALK_MODE, client has strange issues with other move flags
i_traveller.SendMonsterMove(x, y, z, 0, MOVEMENTFLAG_WALK_MODE, t); i_traveller.SendMonsterMove(x, y, z, 0, MONSTER_MOVE_WALK, t);
} }
typedef Traveller<Creature> CreatureTraveller; typedef Traveller<Creature> CreatureTraveller;

View file

@ -74,8 +74,8 @@ Unit::Unit()
{ {
m_objectType |= TYPEMASK_UNIT; m_objectType |= TYPEMASK_UNIT;
m_objectTypeId = TYPEID_UNIT; m_objectTypeId = TYPEID_UNIT;
// 2.3.2 - 0x70
m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION); m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION);
m_attackTimer[BASE_ATTACK] = 0; m_attackTimer[BASE_ATTACK] = 0;
m_attackTimer[OFF_ATTACK] = 0; m_attackTimer[OFF_ATTACK] = 0;
@ -257,9 +257,11 @@ void Unit::SendMonsterMoveWithSpeed(float x, float y, float z, uint32 transitTim
void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player) void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player)
{ {
float moveTime = Time;
WorldPacket data( SMSG_MONSTER_MOVE, (41 + GetPackGUID().size()) ); WorldPacket data( SMSG_MONSTER_MOVE, (41 + GetPackGUID().size()) );
data.append(GetPackGUID()); data.append(GetPackGUID());
data << uint8(0); // new in 3.1
data << GetPositionX() << GetPositionY() << GetPositionZ(); data << GetPositionX() << GetPositionY() << GetPositionZ();
data << uint32(getMSTime()); data << uint32(getMSTime());
@ -286,7 +288,10 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 ty
data << uint32(MovementFlags); data << uint32(MovementFlags);
data << uint32(Time); // Time in between points if(MovementFlags & MONSTER_MOVE_WALK)
moveTime *= 1.05f;
data << uint32(moveTime); // Time in between points
data << uint32(1); // 1 single waypoint data << uint32(1); // 1 single waypoint
data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
@ -302,8 +307,9 @@ void Unit::SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, uin
uint32 pathSize = end - start; uint32 pathSize = end - start;
WorldPacket data( SMSG_MONSTER_MOVE, (GetPackGUID().size()+4+4+4+4+1+4+4+4+pathSize*4*3) ); WorldPacket data( SMSG_MONSTER_MOVE, (GetPackGUID().size()+1+4+4+4+4+1+4+4+4+pathSize*4*3) );
data.append(GetPackGUID()); data.append(GetPackGUID());
data << uint8(0);
data << GetPositionX(); data << GetPositionX();
data << GetPositionY(); data << GetPositionY();
data << GetPositionZ(); data << GetPositionZ();

View file

@ -103,7 +103,9 @@ void UpdateData::Compress(void* dst, uint32 *dst_size, void* src, int src_size)
bool UpdateData::BuildPacket(WorldPacket *packet) bool UpdateData::BuildPacket(WorldPacket *packet)
{ {
ByteBuffer buf(4+(m_outOfRangeGUIDs.empty() ? 0 : 1+4+9*m_outOfRangeGUIDs.size())+m_data.wpos()); ASSERT(packet->empty()); // shouldn't happen
ByteBuffer buf(4 + (m_outOfRangeGUIDs.empty() ? 0 : 1 + 4 + 9 * m_outOfRangeGUIDs.size()) + m_data.wpos());
buf << (uint32) (!m_outOfRangeGUIDs.empty() ? m_blockCount + 1 : m_blockCount); buf << (uint32) (!m_outOfRangeGUIDs.empty() ? m_blockCount + 1 : m_blockCount);
@ -120,8 +122,6 @@ bool UpdateData::BuildPacket(WorldPacket *packet)
buf.append(m_data); buf.append(m_data);
packet->clear();
size_t pSize = buf.wpos(); // use real used data size size_t pSize = buf.wpos(); // use real used data size
if (pSize > 100 ) // compress large packets if (pSize > 100 ) // compress large packets

View file

@ -19,7 +19,7 @@
#ifndef _UPDATEFIELDS_AUTO_H #ifndef _UPDATEFIELDS_AUTO_H
#define _UPDATEFIELDS_AUTO_H #define _UPDATEFIELDS_AUTO_H
// Auto generated for version 3, 0, 3, 9183 // Auto generated for version 3, 1, 3, 9947
enum EObjectFields enum EObjectFields
{ {
@ -37,9 +37,9 @@ enum EItemFields
ITEM_FIELD_CONTAINED = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC ITEM_FIELD_CONTAINED = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC
ITEM_FIELD_CREATOR = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PUBLIC ITEM_FIELD_CREATOR = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PUBLIC
ITEM_FIELD_GIFTCREATOR = OBJECT_END + 0x0006, // Size: 2, Type: LONG, Flags: PUBLIC ITEM_FIELD_GIFTCREATOR = OBJECT_END + 0x0006, // Size: 2, Type: LONG, Flags: PUBLIC
ITEM_FIELD_STACK_COUNT = OBJECT_END + 0x0008, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2 ITEM_FIELD_STACK_COUNT = OBJECT_END + 0x0008, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER
ITEM_FIELD_DURATION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2 ITEM_FIELD_DURATION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER
ITEM_FIELD_SPELL_CHARGES = OBJECT_END + 0x000A, // Size: 5, Type: INT, Flags: OWNER_ONLY, UNK2 ITEM_FIELD_SPELL_CHARGES = OBJECT_END + 0x000A, // Size: 5, Type: INT, Flags: OWNER, ITEM_OWNER
ITEM_FIELD_FLAGS = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC ITEM_FIELD_FLAGS = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_1_1 = OBJECT_END + 0x0010, // Size: 2, Type: INT, Flags: PUBLIC ITEM_FIELD_ENCHANTMENT_1_1 = OBJECT_END + 0x0010, // Size: 2, Type: INT, Flags: PUBLIC
ITEM_FIELD_ENCHANTMENT_1_3 = OBJECT_END + 0x0012, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC ITEM_FIELD_ENCHANTMENT_1_3 = OBJECT_END + 0x0012, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
@ -67,9 +67,9 @@ enum EItemFields
ITEM_FIELD_ENCHANTMENT_12_3 = OBJECT_END + 0x0033, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC ITEM_FIELD_ENCHANTMENT_12_3 = OBJECT_END + 0x0033, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
ITEM_FIELD_PROPERTY_SEED = OBJECT_END + 0x0034, // Size: 1, Type: INT, Flags: PUBLIC ITEM_FIELD_PROPERTY_SEED = OBJECT_END + 0x0034, // Size: 1, Type: INT, Flags: PUBLIC
ITEM_FIELD_RANDOM_PROPERTIES_ID = OBJECT_END + 0x0035, // Size: 1, Type: INT, Flags: PUBLIC ITEM_FIELD_RANDOM_PROPERTIES_ID = OBJECT_END + 0x0035, // Size: 1, Type: INT, Flags: PUBLIC
ITEM_FIELD_ITEM_TEXT_ID = OBJECT_END + 0x0036, // Size: 1, Type: INT, Flags: OWNER_ONLY ITEM_FIELD_ITEM_TEXT_ID = OBJECT_END + 0x0036, // Size: 1, Type: INT, Flags: OWNER
ITEM_FIELD_DURABILITY = OBJECT_END + 0x0037, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2 ITEM_FIELD_DURABILITY = OBJECT_END + 0x0037, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER
ITEM_FIELD_MAXDURABILITY = OBJECT_END + 0x0038, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2 ITEM_FIELD_MAXDURABILITY = OBJECT_END + 0x0038, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER
ITEM_FIELD_PAD = OBJECT_END + 0x0039, // Size: 1, Type: INT, Flags: NONE ITEM_FIELD_PAD = OBJECT_END + 0x0039, // Size: 1, Type: INT, Flags: NONE
ITEM_END = OBJECT_END + 0x003A, ITEM_END = OBJECT_END + 0x003A,
}; };
@ -109,8 +109,8 @@ enum EUnitFields
UNIT_FIELD_MAXPOWER5 = OBJECT_END + 0x001E, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MAXPOWER5 = OBJECT_END + 0x001E, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_MAXPOWER6 = OBJECT_END + 0x001F, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MAXPOWER6 = OBJECT_END + 0x001F, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_MAXPOWER7 = OBJECT_END + 0x0020, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MAXPOWER7 = OBJECT_END + 0x0020, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER = OBJECT_END + 0x0021, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER = OBJECT_END + 0x0021, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER
UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER = OBJECT_END + 0x0028, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER = OBJECT_END + 0x0028, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER
UNIT_FIELD_LEVEL = OBJECT_END + 0x002F, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_LEVEL = OBJECT_END + 0x002F, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_FACTIONTEMPLATE = OBJECT_END + 0x0030, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_FACTIONTEMPLATE = OBJECT_END + 0x0030, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_VIRTUAL_ITEM_SLOT_ID = OBJECT_END + 0x0031, // Size: 3, Type: INT, Flags: PUBLIC UNIT_VIRTUAL_ITEM_SLOT_ID = OBJECT_END + 0x0031, // Size: 3, Type: INT, Flags: PUBLIC
@ -124,53 +124,53 @@ enum EUnitFields
UNIT_FIELD_DISPLAYID = OBJECT_END + 0x003C, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_DISPLAYID = OBJECT_END + 0x003C, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_NATIVEDISPLAYID = OBJECT_END + 0x003D, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_NATIVEDISPLAYID = OBJECT_END + 0x003D, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_MOUNTDISPLAYID = OBJECT_END + 0x003E, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_MOUNTDISPLAYID = OBJECT_END + 0x003E, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x003F, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3 UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x003F, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER
UNIT_FIELD_MAXDAMAGE = OBJECT_END + 0x0040, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3 UNIT_FIELD_MAXDAMAGE = OBJECT_END + 0x0040, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER
UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x0041, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3 UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x0041, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER
UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x0042, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3 UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x0042, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER
UNIT_FIELD_BYTES_1 = OBJECT_END + 0x0043, // Size: 1, Type: BYTES, Flags: PUBLIC UNIT_FIELD_BYTES_1 = OBJECT_END + 0x0043, // Size: 1, Type: BYTES, Flags: PUBLIC
UNIT_FIELD_PETNUMBER = OBJECT_END + 0x0044, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_PETNUMBER = OBJECT_END + 0x0044, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_PET_NAME_TIMESTAMP = OBJECT_END + 0x0045, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_PET_NAME_TIMESTAMP = OBJECT_END + 0x0045, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x0046, // Size: 1, Type: INT, Flags: OWNER_ONLY UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x0046, // Size: 1, Type: INT, Flags: OWNER
UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x0047, // Size: 1, Type: INT, Flags: OWNER_ONLY UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x0047, // Size: 1, Type: INT, Flags: OWNER
UNIT_DYNAMIC_FLAGS = OBJECT_END + 0x0048, // Size: 1, Type: INT, Flags: DYNAMIC UNIT_DYNAMIC_FLAGS = OBJECT_END + 0x0048, // Size: 1, Type: INT, Flags: DYNAMIC
UNIT_CHANNEL_SPELL = OBJECT_END + 0x0049, // Size: 1, Type: INT, Flags: PUBLIC UNIT_CHANNEL_SPELL = OBJECT_END + 0x0049, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_MOD_CAST_SPEED = OBJECT_END + 0x004A, // Size: 1, Type: FLOAT, Flags: PUBLIC UNIT_MOD_CAST_SPEED = OBJECT_END + 0x004A, // Size: 1, Type: FLOAT, Flags: PUBLIC
UNIT_CREATED_BY_SPELL = OBJECT_END + 0x004B, // Size: 1, Type: INT, Flags: PUBLIC UNIT_CREATED_BY_SPELL = OBJECT_END + 0x004B, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_NPC_FLAGS = OBJECT_END + 0x004C, // Size: 1, Type: INT, Flags: DYNAMIC UNIT_NPC_FLAGS = OBJECT_END + 0x004C, // Size: 1, Type: INT, Flags: DYNAMIC
UNIT_NPC_EMOTESTATE = OBJECT_END + 0x004D, // Size: 1, Type: INT, Flags: PUBLIC UNIT_NPC_EMOTESTATE = OBJECT_END + 0x004D, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_STAT0 = OBJECT_END + 0x004E, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_STAT0 = OBJECT_END + 0x004E, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_STAT1 = OBJECT_END + 0x004F, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_STAT1 = OBJECT_END + 0x004F, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_STAT2 = OBJECT_END + 0x0050, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_STAT2 = OBJECT_END + 0x0050, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_STAT3 = OBJECT_END + 0x0051, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_STAT3 = OBJECT_END + 0x0051, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_STAT4 = OBJECT_END + 0x0052, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_STAT4 = OBJECT_END + 0x0052, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_POSSTAT0 = OBJECT_END + 0x0053, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_POSSTAT0 = OBJECT_END + 0x0053, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_POSSTAT1 = OBJECT_END + 0x0054, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_POSSTAT1 = OBJECT_END + 0x0054, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_POSSTAT2 = OBJECT_END + 0x0055, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_POSSTAT2 = OBJECT_END + 0x0055, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_POSSTAT3 = OBJECT_END + 0x0056, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_POSSTAT3 = OBJECT_END + 0x0056, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_POSSTAT4 = OBJECT_END + 0x0057, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_POSSTAT4 = OBJECT_END + 0x0057, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_NEGSTAT0 = OBJECT_END + 0x0058, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_NEGSTAT0 = OBJECT_END + 0x0058, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_NEGSTAT1 = OBJECT_END + 0x0059, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_NEGSTAT1 = OBJECT_END + 0x0059, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_NEGSTAT2 = OBJECT_END + 0x005A, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_NEGSTAT2 = OBJECT_END + 0x005A, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_NEGSTAT3 = OBJECT_END + 0x005B, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_NEGSTAT3 = OBJECT_END + 0x005B, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_NEGSTAT4 = OBJECT_END + 0x005C, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_NEGSTAT4 = OBJECT_END + 0x005C, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_RESISTANCES = OBJECT_END + 0x005D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY, UNK3 UNIT_FIELD_RESISTANCES = OBJECT_END + 0x005D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER, PARTY_LEADER
UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x0064, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x0064, // Size: 7, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x006B, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x006B, // Size: 7, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_BASE_MANA = OBJECT_END + 0x0072, // Size: 1, Type: INT, Flags: PUBLIC UNIT_FIELD_BASE_MANA = OBJECT_END + 0x0072, // Size: 1, Type: INT, Flags: PUBLIC
UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x0073, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x0073, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_BYTES_2 = OBJECT_END + 0x0074, // Size: 1, Type: BYTES, Flags: PUBLIC UNIT_FIELD_BYTES_2 = OBJECT_END + 0x0074, // Size: 1, Type: BYTES, Flags: PUBLIC
UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x0075, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x0075, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_ATTACK_POWER_MODS = OBJECT_END + 0x0076, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_ATTACK_POWER_MODS = OBJECT_END + 0x0076, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER
UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x0077, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x0077, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER
UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x0078, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x0078, // Size: 1, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_RANGED_ATTACK_POWER_MODS = OBJECT_END + 0x0079, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_RANGED_ATTACK_POWER_MODS = OBJECT_END + 0x0079, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER
UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x007A, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x007A, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER
UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x007B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x007B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER
UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x007C, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x007C, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER
UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x007D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x007D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER
UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x0084, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x0084, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER
UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x008B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x008B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER
UNIT_FIELD_HOVERHEIGHT = OBJECT_END + 0x008C, // Size: 1, Type: FLOAT, Flags: PUBLIC UNIT_FIELD_HOVERHEIGHT = OBJECT_END + 0x008C, // Size: 1, Type: FLOAT, Flags: PUBLIC
UNIT_FIELD_PADDING = OBJECT_END + 0x008D, // Size: 1, Type: INT, Flags: NONE UNIT_FIELD_PADDING = OBJECT_END + 0x008D, // Size: 1, Type: INT, Flags: NONE
UNIT_END = OBJECT_END + 0x008E, UNIT_END = OBJECT_END + 0x008E,
@ -184,285 +184,222 @@ enum EUnitFields
PLAYER_BYTES_3 = UNIT_END + 0x0007, // Size: 1, Type: BYTES, Flags: PUBLIC PLAYER_BYTES_3 = UNIT_END + 0x0007, // Size: 1, Type: BYTES, Flags: PUBLIC
PLAYER_DUEL_TEAM = UNIT_END + 0x0008, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_DUEL_TEAM = UNIT_END + 0x0008, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_GUILD_TIMESTAMP = UNIT_END + 0x0009, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_GUILD_TIMESTAMP = UNIT_END + 0x0009, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_QUEST_LOG_1_1 = UNIT_END + 0x000A, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_1_1 = UNIT_END + 0x000A, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_1_2 = UNIT_END + 0x000B, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_1_2 = UNIT_END + 0x000B, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_1_3 = UNIT_END + 0x000C, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_1_3 = UNIT_END + 0x000C, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_1_4 = UNIT_END + 0x000D, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_1_4 = UNIT_END + 0x000D, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_2_1 = UNIT_END + 0x000E, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_2_1 = UNIT_END + 0x000E, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_2_2 = UNIT_END + 0x000F, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_2_2 = UNIT_END + 0x000F, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_2_3 = UNIT_END + 0x0010, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_2_3 = UNIT_END + 0x0010, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_2_4 = UNIT_END + 0x0011, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_2_4 = UNIT_END + 0x0011, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_3_1 = UNIT_END + 0x0012, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_3_1 = UNIT_END + 0x0012, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_3_2 = UNIT_END + 0x0013, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_3_2 = UNIT_END + 0x0013, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_3_3 = UNIT_END + 0x0014, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_3_3 = UNIT_END + 0x0014, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_3_4 = UNIT_END + 0x0015, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_3_4 = UNIT_END + 0x0015, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_4_1 = UNIT_END + 0x0016, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_4_1 = UNIT_END + 0x0016, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_4_2 = UNIT_END + 0x0017, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_4_2 = UNIT_END + 0x0017, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_4_3 = UNIT_END + 0x0018, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_4_3 = UNIT_END + 0x0018, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_4_4 = UNIT_END + 0x0019, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_4_4 = UNIT_END + 0x0019, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_5_1 = UNIT_END + 0x001A, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_5_1 = UNIT_END + 0x001A, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_5_2 = UNIT_END + 0x001B, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_5_2 = UNIT_END + 0x001B, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_5_3 = UNIT_END + 0x001C, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_5_3 = UNIT_END + 0x001C, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_5_4 = UNIT_END + 0x001D, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_5_4 = UNIT_END + 0x001D, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_6_1 = UNIT_END + 0x001E, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_6_1 = UNIT_END + 0x001E, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_6_2 = UNIT_END + 0x001F, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_6_2 = UNIT_END + 0x001F, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_6_3 = UNIT_END + 0x0020, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_6_3 = UNIT_END + 0x0020, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_6_4 = UNIT_END + 0x0021, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_6_4 = UNIT_END + 0x0021, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_7_1 = UNIT_END + 0x0022, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_7_1 = UNIT_END + 0x0022, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_7_2 = UNIT_END + 0x0023, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_7_2 = UNIT_END + 0x0023, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_7_3 = UNIT_END + 0x0024, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_7_3 = UNIT_END + 0x0024, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_7_4 = UNIT_END + 0x0025, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_7_4 = UNIT_END + 0x0025, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_8_1 = UNIT_END + 0x0026, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_8_1 = UNIT_END + 0x0026, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_8_2 = UNIT_END + 0x0027, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_8_2 = UNIT_END + 0x0027, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_8_3 = UNIT_END + 0x0028, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_8_3 = UNIT_END + 0x0028, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_8_4 = UNIT_END + 0x0029, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_8_4 = UNIT_END + 0x0029, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_9_1 = UNIT_END + 0x002A, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_9_1 = UNIT_END + 0x002A, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_9_2 = UNIT_END + 0x002B, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_9_2 = UNIT_END + 0x002B, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_9_3 = UNIT_END + 0x002C, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_9_3 = UNIT_END + 0x002C, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_9_4 = UNIT_END + 0x002D, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_9_4 = UNIT_END + 0x002D, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_10_1 = UNIT_END + 0x002E, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_10_1 = UNIT_END + 0x002E, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_10_2 = UNIT_END + 0x002F, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_10_2 = UNIT_END + 0x002F, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_10_3 = UNIT_END + 0x0030, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_10_3 = UNIT_END + 0x0030, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_10_4 = UNIT_END + 0x0031, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_10_4 = UNIT_END + 0x0031, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_11_1 = UNIT_END + 0x0032, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_11_1 = UNIT_END + 0x0032, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_11_2 = UNIT_END + 0x0033, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_11_2 = UNIT_END + 0x0033, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_11_3 = UNIT_END + 0x0034, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_11_3 = UNIT_END + 0x0034, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_11_4 = UNIT_END + 0x0035, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_11_4 = UNIT_END + 0x0035, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_12_1 = UNIT_END + 0x0036, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_12_1 = UNIT_END + 0x0036, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_12_2 = UNIT_END + 0x0037, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_12_2 = UNIT_END + 0x0037, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_12_3 = UNIT_END + 0x0038, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_12_3 = UNIT_END + 0x0038, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_12_4 = UNIT_END + 0x0039, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_12_4 = UNIT_END + 0x0039, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_13_1 = UNIT_END + 0x003A, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_13_1 = UNIT_END + 0x003A, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_13_2 = UNIT_END + 0x003B, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_13_2 = UNIT_END + 0x003B, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_13_3 = UNIT_END + 0x003C, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_13_3 = UNIT_END + 0x003C, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_13_4 = UNIT_END + 0x003D, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_13_4 = UNIT_END + 0x003D, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_14_1 = UNIT_END + 0x003E, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_14_1 = UNIT_END + 0x003E, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_14_2 = UNIT_END + 0x003F, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_14_2 = UNIT_END + 0x003F, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_14_3 = UNIT_END + 0x0040, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_14_3 = UNIT_END + 0x0040, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_14_4 = UNIT_END + 0x0041, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_14_4 = UNIT_END + 0x0041, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_15_1 = UNIT_END + 0x0042, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_15_1 = UNIT_END + 0x0042, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_15_2 = UNIT_END + 0x0043, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_15_2 = UNIT_END + 0x0043, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_15_3 = UNIT_END + 0x0044, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_15_3 = UNIT_END + 0x0044, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_15_4 = UNIT_END + 0x0045, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_15_4 = UNIT_END + 0x0045, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_16_1 = UNIT_END + 0x0046, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_16_1 = UNIT_END + 0x0046, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_16_2 = UNIT_END + 0x0047, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_16_2 = UNIT_END + 0x0047, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_16_3 = UNIT_END + 0x0048, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_16_3 = UNIT_END + 0x0048, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_16_4 = UNIT_END + 0x0049, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_16_4 = UNIT_END + 0x0049, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_17_1 = UNIT_END + 0x004A, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_17_1 = UNIT_END + 0x004A, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_17_2 = UNIT_END + 0x004B, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_17_2 = UNIT_END + 0x004B, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_17_3 = UNIT_END + 0x004C, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_17_3 = UNIT_END + 0x004C, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_17_4 = UNIT_END + 0x004D, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_17_4 = UNIT_END + 0x004D, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_18_1 = UNIT_END + 0x004E, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_18_1 = UNIT_END + 0x004E, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_18_2 = UNIT_END + 0x004F, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_18_2 = UNIT_END + 0x004F, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_18_3 = UNIT_END + 0x0050, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_18_3 = UNIT_END + 0x0050, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_18_4 = UNIT_END + 0x0051, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_18_4 = UNIT_END + 0x0051, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_19_1 = UNIT_END + 0x0052, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_19_1 = UNIT_END + 0x0052, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_19_2 = UNIT_END + 0x0053, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_19_2 = UNIT_END + 0x0053, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_19_3 = UNIT_END + 0x0054, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_19_3 = UNIT_END + 0x0054, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_19_4 = UNIT_END + 0x0055, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_19_4 = UNIT_END + 0x0055, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_20_1 = UNIT_END + 0x0056, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_20_1 = UNIT_END + 0x0056, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_20_2 = UNIT_END + 0x0057, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_20_2 = UNIT_END + 0x0057, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_20_3 = UNIT_END + 0x0058, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_20_3 = UNIT_END + 0x0058, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_20_4 = UNIT_END + 0x0059, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_20_4 = UNIT_END + 0x0059, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_21_1 = UNIT_END + 0x005A, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_21_1 = UNIT_END + 0x005A, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_21_2 = UNIT_END + 0x005B, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_21_2 = UNIT_END + 0x005B, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_21_3 = UNIT_END + 0x005C, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_21_3 = UNIT_END + 0x005C, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_21_4 = UNIT_END + 0x005D, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_21_4 = UNIT_END + 0x005D, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_22_1 = UNIT_END + 0x005E, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_22_1 = UNIT_END + 0x005E, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_22_2 = UNIT_END + 0x005F, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_22_2 = UNIT_END + 0x005F, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_22_3 = UNIT_END + 0x0060, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_22_3 = UNIT_END + 0x0060, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_22_4 = UNIT_END + 0x0061, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_22_4 = UNIT_END + 0x0061, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_23_1 = UNIT_END + 0x0062, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_23_1 = UNIT_END + 0x0062, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_23_2 = UNIT_END + 0x0063, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_23_2 = UNIT_END + 0x0063, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_23_3 = UNIT_END + 0x0064, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_23_3 = UNIT_END + 0x0064, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_23_4 = UNIT_END + 0x0065, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_23_4 = UNIT_END + 0x0065, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_24_1 = UNIT_END + 0x0066, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_24_1 = UNIT_END + 0x0066, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_24_2 = UNIT_END + 0x0067, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_24_2 = UNIT_END + 0x0067, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_24_3 = UNIT_END + 0x0068, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_24_3 = UNIT_END + 0x0068, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_24_4 = UNIT_END + 0x0069, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_24_4 = UNIT_END + 0x0069, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_25_1 = UNIT_END + 0x006A, // Size: 1, Type: INT, Flags: GROUP_ONLY PLAYER_QUEST_LOG_25_1 = UNIT_END + 0x006A, // Size: 1, Type: INT, Flags: PARTY_MEMBER
PLAYER_QUEST_LOG_25_2 = UNIT_END + 0x006B, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_25_2 = UNIT_END + 0x006B, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_QUEST_LOG_25_3 = UNIT_END + 0x006C, // Size: 1, Type: BYTES, Flags: PRIVATE PLAYER_QUEST_LOG_25_3 = UNIT_END + 0x006C, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_25_4 = UNIT_END + 0x006D, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_QUEST_LOG_25_4 = UNIT_END + 0x006D, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_1_CREATOR = UNIT_END + 0x006E, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_1_ENTRYID = UNIT_END + 0x006E, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_1_0 = UNIT_END + 0x0070, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_1_ENCHANTMENT = UNIT_END + 0x006F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_1_PROPERTIES = UNIT_END + 0x007D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_2_ENTRYID = UNIT_END + 0x0070, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_1_SEED = UNIT_END + 0x007E, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_2_ENCHANTMENT = UNIT_END + 0x0071, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_1_PAD = UNIT_END + 0x007F, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_3_ENTRYID = UNIT_END + 0x0072, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_2_CREATOR = UNIT_END + 0x0080, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_3_ENCHANTMENT = UNIT_END + 0x0073, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_2_0 = UNIT_END + 0x0082, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_4_ENTRYID = UNIT_END + 0x0074, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_2_PROPERTIES = UNIT_END + 0x008F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_4_ENCHANTMENT = UNIT_END + 0x0075, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_2_SEED = UNIT_END + 0x0090, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_5_ENTRYID = UNIT_END + 0x0076, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_2_PAD = UNIT_END + 0x0091, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_5_ENCHANTMENT = UNIT_END + 0x0077, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_3_CREATOR = UNIT_END + 0x0092, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_6_ENTRYID = UNIT_END + 0x0078, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_3_0 = UNIT_END + 0x0094, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_6_ENCHANTMENT = UNIT_END + 0x0079, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_3_PROPERTIES = UNIT_END + 0x00A1, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_7_ENTRYID = UNIT_END + 0x007A, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_3_SEED = UNIT_END + 0x00A2, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_7_ENCHANTMENT = UNIT_END + 0x007B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_3_PAD = UNIT_END + 0x00A3, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_8_ENTRYID = UNIT_END + 0x007C, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_4_CREATOR = UNIT_END + 0x00A4, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_8_ENCHANTMENT = UNIT_END + 0x007D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_4_0 = UNIT_END + 0x00A6, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_9_ENTRYID = UNIT_END + 0x007E, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_4_PROPERTIES = UNIT_END + 0x00B3, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_9_ENCHANTMENT = UNIT_END + 0x007F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_4_SEED = UNIT_END + 0x00B4, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_10_ENTRYID = UNIT_END + 0x0080, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_4_PAD = UNIT_END + 0x00B5, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_10_ENCHANTMENT = UNIT_END + 0x0081, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_5_CREATOR = UNIT_END + 0x00B6, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_11_ENTRYID = UNIT_END + 0x0082, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_5_0 = UNIT_END + 0x00B8, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_11_ENCHANTMENT = UNIT_END + 0x0083, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_5_PROPERTIES = UNIT_END + 0x00C5, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_12_ENTRYID = UNIT_END + 0x0084, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_5_SEED = UNIT_END + 0x00C6, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_12_ENCHANTMENT = UNIT_END + 0x0085, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_5_PAD = UNIT_END + 0x00C7, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_13_ENTRYID = UNIT_END + 0x0086, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_6_CREATOR = UNIT_END + 0x00C8, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_13_ENCHANTMENT = UNIT_END + 0x0087, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_6_0 = UNIT_END + 0x00CA, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_14_ENTRYID = UNIT_END + 0x0088, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_6_PROPERTIES = UNIT_END + 0x00D7, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_14_ENCHANTMENT = UNIT_END + 0x0089, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_6_SEED = UNIT_END + 0x00D8, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_15_ENTRYID = UNIT_END + 0x008A, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_6_PAD = UNIT_END + 0x00D9, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_15_ENCHANTMENT = UNIT_END + 0x008B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_7_CREATOR = UNIT_END + 0x00DA, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_16_ENTRYID = UNIT_END + 0x008C, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_7_0 = UNIT_END + 0x00DC, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_16_ENCHANTMENT = UNIT_END + 0x008D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_7_PROPERTIES = UNIT_END + 0x00E9, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_17_ENTRYID = UNIT_END + 0x008E, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_7_SEED = UNIT_END + 0x00EA, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_17_ENCHANTMENT = UNIT_END + 0x008F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_7_PAD = UNIT_END + 0x00EB, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_18_ENTRYID = UNIT_END + 0x0090, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_8_CREATOR = UNIT_END + 0x00EC, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_VISIBLE_ITEM_18_ENCHANTMENT = UNIT_END + 0x0091, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_8_0 = UNIT_END + 0x00EE, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_19_ENTRYID = UNIT_END + 0x0092, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_8_PROPERTIES = UNIT_END + 0x00FB, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_VISIBLE_ITEM_19_ENCHANTMENT = UNIT_END + 0x0093, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_8_SEED = UNIT_END + 0x00FC, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_CHOSEN_TITLE = UNIT_END + 0x0094, // Size: 1, Type: INT, Flags: PUBLIC
PLAYER_VISIBLE_ITEM_8_PAD = UNIT_END + 0x00FD, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_FIELD_PAD_0 = UNIT_END + 0x0095, // Size: 1, Type: INT, Flags: NONE
PLAYER_VISIBLE_ITEM_9_CREATOR = UNIT_END + 0x00FE, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x0096, // Size: 46, Type: LONG, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_9_0 = UNIT_END + 0x0100, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_FIELD_PACK_SLOT_1 = UNIT_END + 0x00C4, // Size: 32, Type: LONG, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_9_PROPERTIES = UNIT_END + 0x010D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_FIELD_BANK_SLOT_1 = UNIT_END + 0x00E4, // Size: 56, Type: LONG, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_9_SEED = UNIT_END + 0x010E, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_FIELD_BANKBAG_SLOT_1 = UNIT_END + 0x011C, // Size: 14, Type: LONG, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_9_PAD = UNIT_END + 0x010F, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = UNIT_END + 0x012A, // Size: 24, Type: LONG, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_10_CREATOR = UNIT_END + 0x0110, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_FIELD_KEYRING_SLOT_1 = UNIT_END + 0x0142, // Size: 64, Type: LONG, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_10_0 = UNIT_END + 0x0112, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_FIELD_CURRENCYTOKEN_SLOT_1 = UNIT_END + 0x0182, // Size: 64, Type: LONG, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_10_PROPERTIES = UNIT_END + 0x011F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_FARSIGHT = UNIT_END + 0x01C2, // Size: 2, Type: LONG, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_10_SEED = UNIT_END + 0x0120, // Size: 1, Type: INT, Flags: PUBLIC PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x01C4, // Size: 2, Type: LONG, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_10_PAD = UNIT_END + 0x0121, // Size: 1, Type: INT, Flags: PUBLIC PLAYER__FIELD_KNOWN_TITLES1 = UNIT_END + 0x01C6, // Size: 2, Type: LONG, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_11_CREATOR = UNIT_END + 0x0122, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER__FIELD_KNOWN_TITLES2 = UNIT_END + 0x01C8, // Size: 2, Type: LONG, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_11_0 = UNIT_END + 0x0124, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_FIELD_KNOWN_CURRENCIES = UNIT_END + 0x01CA, // Size: 2, Type: LONG, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_11_PROPERTIES = UNIT_END + 0x0131, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_XP = UNIT_END + 0x01CC, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_11_SEED = UNIT_END + 0x0132, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x01CD, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_11_PAD = UNIT_END + 0x0133, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_SKILL_INFO_1_1 = UNIT_END + 0x01CE, // Size: 384, Type: TWO_SHORT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_12_CREATOR = UNIT_END + 0x0134, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_CHARACTER_POINTS1 = UNIT_END + 0x034E, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_12_0 = UNIT_END + 0x0136, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_CHARACTER_POINTS2 = UNIT_END + 0x034F, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_12_PROPERTIES = UNIT_END + 0x0143, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_TRACK_CREATURES = UNIT_END + 0x0350, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_12_SEED = UNIT_END + 0x0144, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_TRACK_RESOURCES = UNIT_END + 0x0351, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_12_PAD = UNIT_END + 0x0145, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x0352, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_13_CREATOR = UNIT_END + 0x0146, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x0353, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_13_0 = UNIT_END + 0x0148, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x0354, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_13_PROPERTIES = UNIT_END + 0x0155, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_EXPERTISE = UNIT_END + 0x0355, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_13_SEED = UNIT_END + 0x0156, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x0356, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_13_PAD = UNIT_END + 0x0157, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x0357, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_14_CREATOR = UNIT_END + 0x0158, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x0358, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_14_0 = UNIT_END + 0x015A, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x0359, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_14_PROPERTIES = UNIT_END + 0x0167, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x035A, // Size: 7, Type: FLOAT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_14_SEED = UNIT_END + 0x0168, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_SHIELD_BLOCK = UNIT_END + 0x0361, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_14_PAD = UNIT_END + 0x0169, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x0362, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_15_CREATOR = UNIT_END + 0x016A, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x0363, // Size: 128, Type: BYTES, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_15_0 = UNIT_END + 0x016C, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x03E3, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_15_PROPERTIES = UNIT_END + 0x0179, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_FIELD_COINAGE = UNIT_END + 0x03E4, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_15_SEED = UNIT_END + 0x017A, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x03E5, // Size: 7, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_15_PAD = UNIT_END + 0x017B, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x03EC, // Size: 7, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_16_CREATOR = UNIT_END + 0x017C, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x03F3, // Size: 7, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_16_0 = UNIT_END + 0x017E, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x03FA, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_16_PROPERTIES = UNIT_END + 0x018B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x03FB, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_16_SEED = UNIT_END + 0x018C, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x03FC, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_16_PAD = UNIT_END + 0x018D, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_FIELD_BYTES = UNIT_END + 0x03FD, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_17_CREATOR = UNIT_END + 0x018E, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_AMMO_ID = UNIT_END + 0x03FE, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_17_0 = UNIT_END + 0x0190, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_SELF_RES_SPELL = UNIT_END + 0x03FF, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_17_PROPERTIES = UNIT_END + 0x019D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x0400, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_17_SEED = UNIT_END + 0x019E, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x0401, // Size: 12, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_17_PAD = UNIT_END + 0x019F, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x040D, // Size: 12, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_18_CREATOR = UNIT_END + 0x01A0, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_FIELD_KILLS = UNIT_END + 0x0419, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_18_0 = UNIT_END + 0x01A2, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_FIELD_TODAY_CONTRIBUTION = UNIT_END + 0x041A, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_18_PROPERTIES = UNIT_END + 0x01AF, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_FIELD_YESTERDAY_CONTRIBUTION = UNIT_END + 0x041B, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_18_SEED = UNIT_END + 0x01B0, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_FIELD_LIFETIME_HONORBALE_KILLS = UNIT_END + 0x041C, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_18_PAD = UNIT_END + 0x01B1, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_FIELD_BYTES2 = UNIT_END + 0x041D, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_19_CREATOR = UNIT_END + 0x01B2, // Size: 2, Type: LONG, Flags: PUBLIC PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x041E, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_19_0 = UNIT_END + 0x01B4, // Size: 13, Type: INT, Flags: PUBLIC PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x041F, // Size: 25, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_19_PROPERTIES = UNIT_END + 0x01C1, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x0438, // Size: 18, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_19_SEED = UNIT_END + 0x01C2, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x044A, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_19_PAD = UNIT_END + 0x01C3, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x044B, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_CHOSEN_TITLE = UNIT_END + 0x01C4, // Size: 1, Type: INT, Flags: PUBLIC PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x044C, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_PAD_0 = UNIT_END + 0x01C5, // Size: 1, Type: INT, Flags: NONE PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x044D, // Size: 25, Type: INT, Flags: PRIVATE
PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x01C6, // Size: 46, Type: LONG, Flags: PRIVATE PLAYER_RUNE_REGEN_1 = UNIT_END + 0x0466, // Size: 4, Type: FLOAT, Flags: PRIVATE
PLAYER_FIELD_PACK_SLOT_1 = UNIT_END + 0x01F4, // Size: 32, Type: LONG, Flags: PRIVATE PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x046A, // Size: 3, Type: INT, Flags: PRIVATE
PLAYER_FIELD_BANK_SLOT_1 = UNIT_END + 0x0214, // Size: 56, Type: LONG, Flags: PRIVATE PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x046D, // Size: 6, Type: INT, Flags: PRIVATE
PLAYER_FIELD_BANKBAG_SLOT_1 = UNIT_END + 0x024C, // Size: 14, Type: LONG, Flags: PRIVATE PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x0473, // Size: 6, Type: INT, Flags: PRIVATE
PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = UNIT_END + 0x025A, // Size: 24, Type: LONG, Flags: PRIVATE PLAYER_GLYPHS_ENABLED = UNIT_END + 0x0479, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_KEYRING_SLOT_1 = UNIT_END + 0x0272, // Size: 64, Type: LONG, Flags: PRIVATE PLAYER_END = UNIT_END + 0x047A,
PLAYER_FIELD_VANITYPET_SLOT_1 = UNIT_END + 0x02B2, // Size: 36, Type: LONG, Flags: PRIVATE
PLAYER_FIELD_CURRENCYTOKEN_SLOT_1 = UNIT_END + 0x02D6, // Size: 64, Type: LONG, Flags: PRIVATE
PLAYER_FIELD_QUESTBAG_SLOT_1 = UNIT_END + 0x0316, // Size: 64, Type: LONG, Flags: PRIVATE
PLAYER_FARSIGHT = UNIT_END + 0x0356, // Size: 2, Type: LONG, Flags: PRIVATE
PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x0358, // Size: 2, Type: LONG, Flags: PRIVATE
PLAYER__FIELD_KNOWN_TITLES1 = UNIT_END + 0x035A, // Size: 2, Type: LONG, Flags: PRIVATE
PLAYER_FIELD_KNOWN_CURRENCIES = UNIT_END + 0x035C, // Size: 2, Type: LONG, Flags: PRIVATE
PLAYER_XP = UNIT_END + 0x035E, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x035F, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_SKILL_INFO_1_1 = UNIT_END + 0x0360, // Size: 384, Type: TWO_SHORT, Flags: PRIVATE
PLAYER_CHARACTER_POINTS1 = UNIT_END + 0x04E0, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_CHARACTER_POINTS2 = UNIT_END + 0x04E1, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_TRACK_CREATURES = UNIT_END + 0x04E2, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_TRACK_RESOURCES = UNIT_END + 0x04E3, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x04E4, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x04E5, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x04E6, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_EXPERTISE = UNIT_END + 0x04E7, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x04E8, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x04E9, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x04EA, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x04EB, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x04EC, // Size: 7, Type: FLOAT, Flags: PRIVATE
PLAYER_SHIELD_BLOCK = UNIT_END + 0x04F3, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x04F4, // Size: 1, Type: FLOAT, Flags: PRIVATE
PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x04F5, // Size: 128, Type: BYTES, Flags: PRIVATE
PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x0575, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_COINAGE = UNIT_END + 0x0576, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x0577, // Size: 7, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x057E, // Size: 7, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x0585, // Size: 7, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x058C, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x058D, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x058E, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_BYTES = UNIT_END + 0x058F, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_AMMO_ID = UNIT_END + 0x0590, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_SELF_RES_SPELL = UNIT_END + 0x0591, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x0592, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x0593, // Size: 12, Type: INT, Flags: PRIVATE
PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x059F, // Size: 12, Type: INT, Flags: PRIVATE
PLAYER_FIELD_KILLS = UNIT_END + 0x05AB, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE
PLAYER_FIELD_TODAY_CONTRIBUTION = UNIT_END + 0x05AC, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_YESTERDAY_CONTRIBUTION = UNIT_END + 0x05AD, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_LIFETIME_HONORBALE_KILLS = UNIT_END + 0x05AE, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_BYTES2 = UNIT_END + 0x05AF, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x05B0, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x05B1, // Size: 25, Type: INT, Flags: PRIVATE
PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x05CA, // Size: 18, Type: INT, Flags: PRIVATE
PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x05DC, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x05DD, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x05DE, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x05DF, // Size: 25, Type: INT, Flags: PRIVATE
PLAYER_RUNE_REGEN_1 = UNIT_END + 0x05F8, // Size: 4, Type: FLOAT, Flags: PRIVATE
PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x05FC, // Size: 3, Type: INT, Flags: PRIVATE
PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x05FF, // Size: 8, Type: INT, Flags: PRIVATE
PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x0607, // Size: 8, Type: INT, Flags: PRIVATE
PLAYER_GLYPHS_ENABLED = UNIT_END + 0x060F, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_END = UNIT_END + 0x0610,
}; };
enum EGameObjectFields enum EGameObjectFields
{ {
OBJECT_FIELD_CREATED_BY = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC OBJECT_FIELD_CREATED_BY = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC
GAMEOBJECT_DISPLAYID = OBJECT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC GAMEOBJECT_DISPLAYID = OBJECT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC
GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: INT, Flags: PUBLIC
GAMEOBJECT_ROTATION = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PUBLIC GAMEOBJECT_PARENTROTATION = OBJECT_END + 0x0004, // Size: 4, Type: FLOAT, Flags: PUBLIC
GAMEOBJECT_PARENTROTATION = OBJECT_END + 0x0006, // Size: 4, Type: FLOAT, Flags: PUBLIC GAMEOBJECT_DYNAMIC = OBJECT_END + 0x0008, // Size: 1, Type: TWO_SHORT, Flags: DYNAMIC
GAMEOBJECT_POS_X = OBJECT_END + 0x000A, // Size: 1, Type: FLOAT, Flags: PUBLIC GAMEOBJECT_FACTION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: PUBLIC
GAMEOBJECT_POS_Y = OBJECT_END + 0x000B, // Size: 1, Type: FLOAT, Flags: PUBLIC GAMEOBJECT_LEVEL = OBJECT_END + 0x000A, // Size: 1, Type: INT, Flags: PUBLIC
GAMEOBJECT_POS_Z = OBJECT_END + 0x000C, // Size: 1, Type: FLOAT, Flags: PUBLIC GAMEOBJECT_BYTES_1 = OBJECT_END + 0x000B, // Size: 1, Type: BYTES, Flags: PUBLIC
GAMEOBJECT_FACING = OBJECT_END + 0x000D, // Size: 1, Type: FLOAT, Flags: PUBLIC GAMEOBJECT_END = OBJECT_END + 0x000C,
GAMEOBJECT_DYNAMIC = OBJECT_END + 0x000E, // Size: 1, Type: TWO_SHORT, Flags: DYNAMIC
GAMEOBJECT_FACTION = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC
GAMEOBJECT_LEVEL = OBJECT_END + 0x0010, // Size: 1, Type: INT, Flags: PUBLIC
GAMEOBJECT_BYTES_1 = OBJECT_END + 0x0011, // Size: 1, Type: BYTES, Flags: PUBLIC
GAMEOBJECT_END = OBJECT_END + 0x0012,
}; };
enum EDynamicObjectFields enum EDynamicObjectFields
@ -483,18 +420,14 @@ enum ECorpseFields
{ {
CORPSE_FIELD_OWNER = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC CORPSE_FIELD_OWNER = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC
CORPSE_FIELD_PARTY = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC CORPSE_FIELD_PARTY = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC
CORPSE_FIELD_FACING = OBJECT_END + 0x0004, // Size: 1, Type: FLOAT, Flags: PUBLIC CORPSE_FIELD_DISPLAY_ID = OBJECT_END + 0x0004, // Size: 1, Type: INT, Flags: PUBLIC
CORPSE_FIELD_POS_X = OBJECT_END + 0x0005, // Size: 1, Type: FLOAT, Flags: PUBLIC CORPSE_FIELD_ITEM = OBJECT_END + 0x0005, // Size: 19, Type: INT, Flags: PUBLIC
CORPSE_FIELD_POS_Y = OBJECT_END + 0x0006, // Size: 1, Type: FLOAT, Flags: PUBLIC CORPSE_FIELD_BYTES_1 = OBJECT_END + 0x0018, // Size: 1, Type: BYTES, Flags: PUBLIC
CORPSE_FIELD_POS_Z = OBJECT_END + 0x0007, // Size: 1, Type: FLOAT, Flags: PUBLIC CORPSE_FIELD_BYTES_2 = OBJECT_END + 0x0019, // Size: 1, Type: BYTES, Flags: PUBLIC
CORPSE_FIELD_DISPLAY_ID = OBJECT_END + 0x0008, // Size: 1, Type: INT, Flags: PUBLIC CORPSE_FIELD_GUILD = OBJECT_END + 0x001A, // Size: 1, Type: INT, Flags: PUBLIC
CORPSE_FIELD_ITEM = OBJECT_END + 0x0009, // Size: 19, Type: INT, Flags: PUBLIC CORPSE_FIELD_FLAGS = OBJECT_END + 0x001B, // Size: 1, Type: INT, Flags: PUBLIC
CORPSE_FIELD_BYTES_1 = OBJECT_END + 0x001C, // Size: 1, Type: BYTES, Flags: PUBLIC CORPSE_FIELD_DYNAMIC_FLAGS = OBJECT_END + 0x001C, // Size: 1, Type: INT, Flags: DYNAMIC
CORPSE_FIELD_BYTES_2 = OBJECT_END + 0x001D, // Size: 1, Type: BYTES, Flags: PUBLIC CORPSE_FIELD_PAD = OBJECT_END + 0x001D, // Size: 1, Type: INT, Flags: NONE
CORPSE_FIELD_GUILD = OBJECT_END + 0x001E, // Size: 1, Type: INT, Flags: PUBLIC CORPSE_END = OBJECT_END + 0x001E,
CORPSE_FIELD_FLAGS = OBJECT_END + 0x001F, // Size: 1, Type: INT, Flags: PUBLIC
CORPSE_FIELD_DYNAMIC_FLAGS = OBJECT_END + 0x0020, // Size: 1, Type: INT, Flags: DYNAMIC
CORPSE_FIELD_PAD = OBJECT_END + 0x0021, // Size: 1, Type: INT, Flags: NONE
CORPSE_END = OBJECT_END + 0x0022,
}; };
#endif #endif

View file

@ -26,7 +26,7 @@
Vehicle::Vehicle() : Creature(), m_vehicleId(0) Vehicle::Vehicle() : Creature(), m_vehicleId(0)
{ {
m_isVehicle = true; m_isVehicle = true;
m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_VEHICLE); m_updateFlag = (UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_VEHICLE);
} }
Vehicle::~Vehicle() Vehicle::~Vehicle()

View file

@ -109,7 +109,7 @@ bool WaypointMovementGenerator<Creature>::Update(Creature &creature, const uint3
// Now we re-set destination to same node and start travel // Now we re-set destination to same node and start travel
creature.addUnitState(UNIT_STAT_ROAMING); creature.addUnitState(UNIT_STAT_ROAMING);
if (creature.canFly()) if (creature.canFly())
creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); creature.AddUnitMovementFlag(MONSTER_MOVE_FLY);
const WaypointNode &node = i_path->at(i_currentNode); const WaypointNode &node = i_path->at(i_currentNode);
i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z); i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z);
i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime()); i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime());
@ -172,7 +172,7 @@ bool WaypointMovementGenerator<Creature>::Update(Creature &creature, const uint3
{ {
creature.addUnitState(UNIT_STAT_ROAMING); creature.addUnitState(UNIT_STAT_ROAMING);
if (creature.canFly()) if (creature.canFly())
creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); creature.AddUnitMovementFlag(MONSTER_MOVE_FLY);
const WaypointNode &node = i_path->at(i_currentNode); const WaypointNode &node = i_path->at(i_currentNode);
i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z); i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z);
i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime()); i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime());
@ -240,7 +240,7 @@ void FlightPathMovementGenerator::Initialize(Player &player)
// do not send movement, it was sent already // do not send movement, it was sent already
i_destinationHolder.SetDestination(traveller, i_path[i_currentNode].x, i_path[i_currentNode].y, i_path[i_currentNode].z, false); i_destinationHolder.SetDestination(traveller, i_path[i_currentNode].x, i_path[i_currentNode].y, i_path[i_currentNode].z, false);
player.SendMonsterMoveByPath(GetPath(),GetCurrentNode(),GetPathAtMapEnd(),MOVEMENTFLAG_WALK_MODE|MOVEMENTFLAG_ONTRANSPORT); player.SendMonsterMoveByPath(GetPath(),GetCurrentNode(),GetPathAtMapEnd(),MONSTER_MOVE_SPLINE_FLY);
} }
void FlightPathMovementGenerator::Finalize(Player & player) void FlightPathMovementGenerator::Finalize(Player & player)
@ -261,7 +261,7 @@ void FlightPathMovementGenerator::Finalize(Player & player)
if(player.pvpInfo.inHostileArea) if(player.pvpInfo.inHostileArea)
player.CastSpell(&player, 2479, true); player.CastSpell(&player, 2479, true);
player.SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE); player.SetUnitMovementFlags(MONSTER_MOVE_WALK);
player.StopMoving(); player.StopMoving();
} }
} }

View file

@ -244,6 +244,8 @@ World::AddSession_ (WorldSession* s)
s->SendPacket (&packet); s->SendPacket (&packet);
s->SendAddonsInfo(); s->SendAddonsInfo();
s->SendTutorialsData();
UpdateMaxSessionCounters (); UpdateMaxSessionCounters ();
// Updates the population // Updates the population

View file

@ -42,7 +42,8 @@ WorldSession::WorldSession(uint32 id, WorldSocket *sock, AccountTypes sec, uint8
LookingForGroup_auto_join(false), LookingForGroup_auto_add(false), m_muteTime(mute_time), LookingForGroup_auto_join(false), LookingForGroup_auto_add(false), m_muteTime(mute_time),
_player(NULL), m_Socket(sock),_security(sec), _accountId(id), m_expansion(expansion), _player(NULL), m_Socket(sock),_security(sec), _accountId(id), m_expansion(expansion),
m_sessionDbcLocale(sWorld.GetAvailableDbcLocale(locale)), m_sessionDbLocaleIndex(objmgr.GetIndexForLocale(locale)), m_sessionDbcLocale(sWorld.GetAvailableDbcLocale(locale)), m_sessionDbLocaleIndex(objmgr.GetIndexForLocale(locale)),
_logoutTime(0), m_inQueue(false), m_playerLoading(false), m_playerLogout(false), m_playerRecentlyLogout(false), m_latency(0) _logoutTime(0), m_inQueue(false), m_playerLoading(false), m_playerLogout(false), m_playerRecentlyLogout(false),
m_latency(0), m_TutorialsChanged(false)
{ {
if (sock) if (sock)
{ {
@ -563,6 +564,65 @@ void WorldSession::SetAccountData(uint32 type, time_t time_, std::string data)
CharacterDatabase.CommitTransaction (); CharacterDatabase.CommitTransaction ();
} }
void WorldSession::LoadTutorialsData()
{
for ( int aX = 0 ; aX < 8 ; ++aX )
m_Tutorials[ aX ] = 0;
QueryResult *result = CharacterDatabase.PQuery("SELECT tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7 FROM character_tutorial WHERE account = '%u'", GetAccountId());
if(result)
{
do
{
Field *fields = result->Fetch();
for (int iI = 0; iI < 8; ++iI)
m_Tutorials[iI] = fields[iI].GetUInt32();
}
while( result->NextRow() );
delete result;
}
m_TutorialsChanged = false;
}
void WorldSession::SendTutorialsData()
{
WorldPacket data(SMSG_TUTORIAL_FLAGS, 4*8);
for(uint32 i = 0; i < 8; ++i)
data << m_Tutorials[i];
SendPacket(&data);
}
void WorldSession::SaveTutorialsData()
{
if(!m_TutorialsChanged)
return;
uint32 Rows=0;
// it's better than rebuilding indexes multiple times
QueryResult *result = CharacterDatabase.PQuery("SELECT count(*) AS r FROM character_tutorial WHERE account = '%u'", GetAccountId());
if(result)
{
Rows = result->Fetch()[0].GetUInt32();
delete result;
}
if (Rows)
{
CharacterDatabase.PExecute("UPDATE character_tutorial SET tut0='%u', tut1='%u', tut2='%u', tut3='%u', tut4='%u', tut5='%u', tut6='%u', tut7='%u' WHERE account = '%u'",
m_Tutorials[0], m_Tutorials[1], m_Tutorials[2], m_Tutorials[3], m_Tutorials[4], m_Tutorials[5], m_Tutorials[6], m_Tutorials[7], GetAccountId());
}
else
{
CharacterDatabase.PExecute("INSERT INTO character_tutorial (account,tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7) VALUES ('%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u')", GetAccountId(), m_Tutorials[0], m_Tutorials[1], m_Tutorials[2], m_Tutorials[3], m_Tutorials[4], m_Tutorials[5], m_Tutorials[6], m_Tutorials[7]);
}
m_TutorialsChanged = false;
}
void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi) void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi)
{ {
CHECK_PACKET_SIZE(data, data.rpos()+4+2+4+4+4+4+4); CHECK_PACKET_SIZE(data, data.rpos()+4+2+4+4+4+4+4);
@ -576,8 +636,10 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi)
if(mi->flags & MOVEMENTFLAG_ONTRANSPORT) if(mi->flags & MOVEMENTFLAG_ONTRANSPORT)
{ {
CHECK_PACKET_SIZE(data, data.rpos()+8+4+4+4+4+4+1); if(!data.readPackGUID(mi->t_guid))
data >> mi->t_guid; return;
CHECK_PACKET_SIZE(data, data.rpos()+4+4+4+4+4+1);
data >> mi->t_x; data >> mi->t_x;
data >> mi->t_y; data >> mi->t_y;
data >> mi->t_z; data >> mi->t_z;

View file

@ -116,6 +116,7 @@ class MANGOS_DLL_SPEC WorldSession
void SendNotification(int32 string_id,...); void SendNotification(int32 string_id,...);
void SendPetNameInvalid(uint32 error, const std::string& name, DeclinedName *declinedName); void SendPetNameInvalid(uint32 error, const std::string& name, DeclinedName *declinedName);
void SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type); void SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type);
void SendLfgUpdate(uint8 unk1, uint8 unk2, uint8 unk3);
void SendPartyResult(PartyOperation operation, const std::string& member, PartyResult res); void SendPartyResult(PartyOperation operation, const std::string& member, PartyResult res);
void SendAreaTriggerMessage(const char* Text, ...) ATTR_PRINTF(2,3); void SendAreaTriggerMessage(const char* Text, ...) ATTR_PRINTF(2,3);
void SendSetPhaseShift(uint32 phaseShift); void SendSetPhaseShift(uint32 phaseShift);
@ -188,6 +189,22 @@ class MANGOS_DLL_SPEC WorldSession
AccountData *GetAccountData(uint32 type) { return &m_accountData[type]; } AccountData *GetAccountData(uint32 type) { return &m_accountData[type]; }
void SetAccountData(uint32 type, time_t time_, std::string data); void SetAccountData(uint32 type, time_t time_, std::string data);
void LoadAccountData(); void LoadAccountData();
void LoadTutorialsData();
void SendTutorialsData();
void SaveTutorialsData();
uint32 GetTutorialInt(uint32 intId )
{
return m_Tutorials[intId];
}
void SetTutorialInt(uint32 intId, uint32 value)
{
if(m_Tutorials[intId] != value)
{
m_Tutorials[intId] = value;
m_TutorialsChanged = true;
}
}
//mail //mail
//used with item_page table //used with item_page table
@ -511,6 +528,7 @@ class MANGOS_DLL_SPEC WorldSession
void HandleCancelAutoRepeatSpellOpcode(WorldPacket& recvPacket); void HandleCancelAutoRepeatSpellOpcode(WorldPacket& recvPacket);
void HandleLearnTalentOpcode(WorldPacket& recvPacket); void HandleLearnTalentOpcode(WorldPacket& recvPacket);
void HandleLearnPreviewTalents(WorldPacket& recvPacket);
void HandleTalentWipeConfirmOpcode(WorldPacket& recvPacket); void HandleTalentWipeConfirmOpcode(WorldPacket& recvPacket);
void HandleUnlearnSkillOpcode(WorldPacket& recvPacket); void HandleUnlearnSkillOpcode(WorldPacket& recvPacket);
@ -581,6 +599,7 @@ class MANGOS_DLL_SPEC WorldSession
void HandlePetSpellAutocastOpcode( WorldPacket& recvPacket ); void HandlePetSpellAutocastOpcode( WorldPacket& recvPacket );
void HandlePetCastSpellOpcode( WorldPacket& recvPacket ); void HandlePetCastSpellOpcode( WorldPacket& recvPacket );
void HandlePetLearnTalent( WorldPacket& recvPacket ); void HandlePetLearnTalent( WorldPacket& recvPacket );
void HandleLearnPreviewTalentsPet( WorldPacket& recvPacket );
void HandleSetActionBarToggles(WorldPacket& recv_data); void HandleSetActionBarToggles(WorldPacket& recv_data);
@ -617,6 +636,7 @@ class MANGOS_DLL_SPEC WorldSession
void HandleLfmClearOpcode(WorldPacket& recv_data); void HandleLfmClearOpcode(WorldPacket& recv_data);
void HandleSetLfmOpcode(WorldPacket& recv_data); void HandleSetLfmOpcode(WorldPacket& recv_data);
void HandleSetLfgCommentOpcode(WorldPacket& recv_data); void HandleSetLfgCommentOpcode(WorldPacket& recv_data);
void HandleLfgSetRoles(WorldPacket& recv_data);
void HandleSetTitleOpcode(WorldPacket& recv_data); void HandleSetTitleOpcode(WorldPacket& recv_data);
void HandleRealmSplitOpcode(WorldPacket& recv_data); void HandleRealmSplitOpcode(WorldPacket& recv_data);
void HandleTimeSyncResp(WorldPacket& recv_data); void HandleTimeSyncResp(WorldPacket& recv_data);
@ -688,6 +708,9 @@ class MANGOS_DLL_SPEC WorldSession
void HandleRemoveGlyph(WorldPacket& recv_data); void HandleRemoveGlyph(WorldPacket& recv_data);
void HandleCharCustomize(WorldPacket& recv_data); void HandleCharCustomize(WorldPacket& recv_data);
void HandleQueryInspectAchievements(WorldPacket& recv_data); void HandleQueryInspectAchievements(WorldPacket& recv_data);
void HandleEquipmentSetSave(WorldPacket& recv_data);
void HandleEquipmentSetDelete(WorldPacket& recv_data);
void HandleEquipmentSetUse(WorldPacket& recv_data);
private: private:
// private trade methods // private trade methods
void moveItems(Item* myItems[], Item* hisItems[]); void moveItems(Item* myItems[], Item* hisItems[]);
@ -712,6 +735,8 @@ class MANGOS_DLL_SPEC WorldSession
int m_sessionDbLocaleIndex; int m_sessionDbLocaleIndex;
uint32 m_latency; uint32 m_latency;
AccountData m_accountData[NUM_ACCOUNT_DATA_TYPES]; AccountData m_accountData[NUM_ACCOUNT_DATA_TYPES];
uint32 m_Tutorials[8];
bool m_TutorialsChanged;
AddonsList m_addonsList; AddonsList m_addonsList;
ACE_Based::LockedQueue<WorldPacket*, ACE_Thread_Mutex> _recvQueue; ACE_Based::LockedQueue<WorldPacket*, ACE_Thread_Mutex> _recvQueue;
}; };

View file

@ -981,10 +981,10 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
// NOTE ATM the socket is single-threaded, have this in mind ... // NOTE ATM the socket is single-threaded, have this in mind ...
ACE_NEW_RETURN (m_Session, WorldSession (id, this, AccountTypes(security), expansion, mutetime, locale), -1); ACE_NEW_RETURN (m_Session, WorldSession (id, this, AccountTypes(security), expansion, mutetime, locale), -1);
m_Crypt.SetKey (&K); m_Crypt.Init(&K);
m_Crypt.Init ();
m_Session->LoadAccountData(); m_Session->LoadAccountData();
m_Session->LoadTutorialsData();
m_Session->ReadAddonsInfo(recvPacket); m_Session->ReadAddonsInfo(recvPacket);
// In case needed sometime the second arg is in microseconds 1 000 000 = 1 sec // In case needed sometime the second arg is in microseconds 1 000 000 = 1 sec

View file

@ -912,9 +912,9 @@ GM.AllowAchievementGain = 1
# Visibility.Distance.Creature # Visibility.Distance.Creature
# Visibility.Distance.Player # Visibility.Distance.Player
# Visibility distance for different in game object # Visibility distance for different in game object
# Max limited by active player zone: ~ 166 # Max limited by active player zone: ~ 333
# Min limit dependent from objects # Min limit dependent from objects
# Default: 66 (cell size) # Default: 132 (cell size)
# Min limit is max aggro radius (45) * Rate.Creature.Aggro # Min limit is max aggro radius (45) * Rate.Creature.Aggro
# #
# Visibility.Distance.Object # Visibility.Distance.Object
@ -940,10 +940,10 @@ GM.AllowAchievementGain = 1
################################################################################################################### ###################################################################################################################
Visibility.GroupMode = 0 Visibility.GroupMode = 0
Visibility.Distance.Creature = 66 Visibility.Distance.Creature = 100
Visibility.Distance.Player = 66 Visibility.Distance.Player = 100
Visibility.Distance.Object = 66 Visibility.Distance.Object = 100
Visibility.Distance.InFlight = 66 Visibility.Distance.InFlight = 100
Visibility.Distance.Grey.Unit = 1 Visibility.Distance.Grey.Unit = 1
Visibility.Distance.Grey.Object = 10 Visibility.Distance.Grey.Object = 10

View file

@ -66,8 +66,8 @@ enum LoginResult
// we need to stick to 1 version or half of the stuff will work for someone // we need to stick to 1 version or half of the stuff will work for someone
// others will not and opposite // others will not and opposite
// will only support WoW, WoW:TBC and WoW:WotLK 3.0.9 client build 9551... // will only support WoW, WoW:TBC and WoW:WotLK 3.1.3 client build 9947...
#define EXPECTED_MANGOS_CLIENT_BUILD {9551, 0} #define EXPECTED_MANGOS_CLIENT_BUILD {9947, 0}
#endif #endif

View file

@ -18,63 +18,61 @@
#include "AuthCrypt.h" #include "AuthCrypt.h"
#include "Hmac.h" #include "Hmac.h"
#include "Log.h"
#include "BigNumber.h"
AuthCrypt::AuthCrypt() AuthCrypt::AuthCrypt()
{ {
_initialized = false; _initialized = false;
} }
void AuthCrypt::Init() AuthCrypt::~AuthCrypt()
{ {
_send_i = _send_j = _recv_i = _recv_j = 0;
}
void AuthCrypt::Init(BigNumber *K)
{
uint8 ServerEncryptionKey[SEED_KEY_SIZE] = { 0x22, 0xBE, 0xE5, 0xCF, 0xBB, 0x07, 0x64, 0xD9, 0x00, 0x45, 0x1B, 0xD0, 0x24, 0xB8, 0xD5, 0x45 };
HmacHash serverEncryptHmac(SEED_KEY_SIZE, (uint8*)ServerEncryptionKey);
uint8 *encryptHash = serverEncryptHmac.ComputeHash(K);
uint8 ServerDecryptionKey[SEED_KEY_SIZE] = { 0xF4, 0x66, 0x31, 0x59, 0xFC, 0x83, 0x6E, 0x31, 0x31, 0x02, 0x51, 0xD5, 0x44, 0x31, 0x67, 0x98 };
HmacHash clientDecryptHmac(SEED_KEY_SIZE, (uint8*)ServerDecryptionKey);
uint8 *decryptHash = clientDecryptHmac.ComputeHash(K);
//SARC4 _serverDecrypt(encryptHash);
_clientDecrypt.Init(decryptHash);
_serverEncrypt.Init(encryptHash);
//SARC4 _clientEncrypt(decryptHash);
uint8 syncBuf[1024];
memset(syncBuf, 0, 1024);
_serverEncrypt.UpdateData(1024, syncBuf);
//_clientEncrypt.UpdateData(1024, syncBuf);
memset(syncBuf, 0, 1024);
//_serverDecrypt.UpdateData(1024, syncBuf);
_clientDecrypt.UpdateData(1024, syncBuf);
_initialized = true; _initialized = true;
} }
void AuthCrypt::DecryptRecv(uint8 *data, size_t len) void AuthCrypt::DecryptRecv(uint8 *data, size_t len)
{ {
if (!_initialized) return; if (!_initialized)
if (len < CRYPTED_RECV_LEN) return; return;
for (size_t t = 0; t < CRYPTED_RECV_LEN; t++) _clientDecrypt.UpdateData(len, data);
{
_recv_i %= _key.size();
uint8 x = (data[t] - _recv_j) ^ _key[_recv_i];
++_recv_i;
_recv_j = data[t];
data[t] = x;
}
} }
void AuthCrypt::EncryptSend(uint8 *data, size_t len) void AuthCrypt::EncryptSend(uint8 *data, size_t len)
{ {
if (!_initialized) return; if (!_initialized)
return;
for (size_t t = 0; t < len; t++) _serverEncrypt.UpdateData(len, data);
{
_send_i %= _key.size();
uint8 x = (data[t] ^ _key[_send_i]) + _send_j;
++_send_i;
data[t] = _send_j = x;
}
}
void AuthCrypt::SetKey(BigNumber *bn)
{
uint8 *key = new uint8[SHA_DIGEST_LENGTH];
GenerateKey(key, bn);
_key.resize(SHA_DIGEST_LENGTH);
std::copy(key, key + SHA_DIGEST_LENGTH, _key.begin());
delete[] key;
}
AuthCrypt::~AuthCrypt()
{
}
void AuthCrypt::GenerateKey(uint8 *key, BigNumber *bn)
{
HmacHash hash;
hash.UpdateBigNumber(bn);
hash.Finalize();
memcpy(key, hash.GetDigest(), SHA_DIGEST_LENGTH);
} }

View file

@ -20,7 +20,7 @@
#define _AUTHCRYPT_H #define _AUTHCRYPT_H
#include <Common.h> #include <Common.h>
#include <vector> #include "SARC4.h"
class BigNumber; class BigNumber;
@ -30,22 +30,15 @@ class AuthCrypt
AuthCrypt(); AuthCrypt();
~AuthCrypt(); ~AuthCrypt();
const static size_t CRYPTED_RECV_LEN = 6; void Init(BigNumber *K);
void Init();
void SetKey(BigNumber *);
void DecryptRecv(uint8 *, size_t); void DecryptRecv(uint8 *, size_t);
void EncryptSend(uint8 *, size_t); void EncryptSend(uint8 *, size_t);
bool IsInitialized() { return _initialized; } bool IsInitialized() { return _initialized; }
static void GenerateKey(uint8 *, BigNumber *);
private: private:
std::vector<uint8> _key; SARC4 _clientDecrypt;
uint8 _send_i, _send_j, _recv_i, _recv_j; SARC4 _serverEncrypt;
bool _initialized; bool _initialized;
}; };
#endif #endif

View file

@ -19,17 +19,16 @@
#include "Auth/Hmac.h" #include "Auth/Hmac.h"
#include "BigNumber.h" #include "BigNumber.h"
HmacHash::HmacHash() HmacHash::HmacHash(uint32 len, uint8 *seed)
{ {
uint8 temp[SEED_KEY_SIZE] = { 0x38, 0xA7, 0x83, 0x15, 0xF8, 0x92, 0x25, 0x30, 0x71, 0x98, 0x67, 0xB1, 0x8C, 0x4, 0xE2, 0xAA }; ASSERT(len == SEED_KEY_SIZE);
memcpy(&m_key, &temp, SEED_KEY_SIZE);
HMAC_CTX_init(&m_ctx); HMAC_CTX_init(&m_ctx);
HMAC_Init_ex(&m_ctx, &m_key, SEED_KEY_SIZE, EVP_sha1(), NULL); HMAC_Init_ex(&m_ctx, seed, SEED_KEY_SIZE, EVP_sha1(), NULL);
} }
HmacHash::~HmacHash() HmacHash::~HmacHash()
{ {
memset(&m_key, 0x00, SEED_KEY_SIZE);
HMAC_CTX_cleanup(&m_ctx); HMAC_CTX_cleanup(&m_ctx);
} }
@ -43,14 +42,16 @@ void HmacHash::UpdateData(const uint8 *data, int length)
HMAC_Update(&m_ctx, data, length); HMAC_Update(&m_ctx, data, length);
} }
void HmacHash::Initialize()
{
HMAC_Init_ex(&m_ctx, &m_key, SEED_KEY_SIZE, EVP_sha1(), NULL);
}
void HmacHash::Finalize() void HmacHash::Finalize()
{ {
uint32 length = 0; uint32 length = 0;
HMAC_Final(&m_ctx, m_digest, &length); HMAC_Final(&m_ctx, (uint8*)m_digest, &length);
ASSERT(length == SHA_DIGEST_LENGTH) ASSERT(length == SHA_DIGEST_LENGTH)
} }
uint8 *HmacHash::ComputeHash(BigNumber *bn)
{
HMAC_Update(&m_ctx, bn->AsByteArray(), bn->GetNumBytes());
Finalize();
return (uint8*)m_digest;
}

View file

@ -30,17 +30,16 @@ class BigNumber;
class HmacHash class HmacHash
{ {
public: public:
HmacHash(); HmacHash(uint32 len, uint8 *seed);
~HmacHash(); ~HmacHash();
void UpdateBigNumber(BigNumber *bn); void UpdateBigNumber(BigNumber *bn);
void UpdateData(const uint8 *data, int length); void UpdateData(const uint8 *data, int length);
void Initialize();
void Finalize(); void Finalize();
uint8 *GetDigest() { return m_digest; }; uint8 *ComputeHash(BigNumber *bn);
int GetLength() { return SHA_DIGEST_LENGTH; }; uint8 *GetDigest() { return (uint8*)m_digest; }
int GetLength() { return SHA_DIGEST_LENGTH; }
private: private:
HMAC_CTX m_ctx; HMAC_CTX m_ctx;
uint8 m_key[SEED_KEY_SIZE];
uint8 m_digest[SHA_DIGEST_LENGTH]; uint8 m_digest[SHA_DIGEST_LENGTH];
}; };
#endif #endif

View file

@ -33,6 +33,8 @@ libmangosauth_a_SOURCES = \
BigNumber.h \ BigNumber.h \
Hmac.cpp \ Hmac.cpp \
Hmac.h \ Hmac.h \
SARC4.cpp \
SARC4.h \
Sha1.cpp \ Sha1.cpp \
Sha1.h \ Sha1.h \
md5.c \ md5.c \

52
src/shared/Auth/SARC4.cpp Normal file
View file

@ -0,0 +1,52 @@
/*
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "Auth/SARC4.h"
#include <openssl/sha.h>
SARC4::SARC4()
{
EVP_CIPHER_CTX_init(&m_ctx);
EVP_EncryptInit_ex(&m_ctx, EVP_rc4(), NULL, NULL, NULL);
EVP_CIPHER_CTX_set_key_length(&m_ctx, SHA_DIGEST_LENGTH);
}
SARC4::SARC4(uint8 *seed)
{
EVP_CIPHER_CTX_init(&m_ctx);
EVP_EncryptInit_ex(&m_ctx, EVP_rc4(), NULL, NULL, NULL);
EVP_CIPHER_CTX_set_key_length(&m_ctx, SHA_DIGEST_LENGTH);
EVP_EncryptInit_ex(&m_ctx, NULL, NULL, seed, NULL);
}
SARC4::~SARC4()
{
EVP_CIPHER_CTX_cleanup(&m_ctx);
}
void SARC4::Init(uint8 *seed)
{
EVP_EncryptInit_ex(&m_ctx, NULL, NULL, seed, NULL);
}
void SARC4::UpdateData(int len, uint8 *data)
{
int outlen = 0;
EVP_EncryptUpdate(&m_ctx, data, &outlen, data, len);
EVP_EncryptFinal_ex(&m_ctx, data, &outlen);
}

36
src/shared/Auth/SARC4.h Normal file
View file

@ -0,0 +1,36 @@
/*
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _AUTH_SARC4_H
#define _AUTH_SARC4_H
#include "Common.h"
#include <openssl/evp.h>
class SARC4
{
public:
SARC4();
SARC4(uint8 *seed);
~SARC4();
void Init(uint8 *seed);
void UpdateData(int len, uint8 *data);
private:
EVP_CIPHER_CTX m_ctx;
};
#endif

View file

@ -25,16 +25,16 @@ extern DatabasePostgre WorldDatabase;
extern DatabaseMysql WorldDatabase; extern DatabaseMysql WorldDatabase;
#endif #endif
const char CreatureInfosrcfmt[]="iiiiiisssiiiiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiifflliiis"; const char CreatureInfosrcfmt[]="iiiiiiiisssiiiiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiiffliiiiiliiis";
const char CreatureInfodstfmt[]="iiiiiisssiiiiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiifflliiii"; const char CreatureInfodstfmt[]="iiiiiiiisssiiiiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiiffliiiiiliiii";
const char CreatureDataAddonInfofmt[]="iiiiiis"; const char CreatureDataAddonInfofmt[]="iiiiiis";
const char CreatureModelfmt[]="iffbi"; const char CreatureModelfmt[]="iffbi";
const char CreatureInfoAddonInfofmt[]="iiiiiis"; const char CreatureInfoAddonInfofmt[]="iiiiiis";
const char EquipmentInfofmt[]="iiii"; const char EquipmentInfofmt[]="iiii";
const char GameObjectInfosrcfmt[]="iiisssiifiiiiiiiiiiiiiiiiiiiiiiiis"; const char GameObjectInfosrcfmt[]="iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiis";
const char GameObjectInfodstfmt[]="iiisssiifiiiiiiiiiiiiiiiiiiiiiiiii"; const char GameObjectInfodstfmt[]="iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiii";
const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiisiiii"; const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiisiiii";
const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiii"; const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiiii";
const char PageTextfmt[]="isi"; const char PageTextfmt[]="isi";
const char SpellThreatfmt[]="ii"; const char SpellThreatfmt[]="ii";
const char InstanceTemplatesrcfmt[]="iiiiiiiffffs"; const char InstanceTemplatesrcfmt[]="iiiiiiiffffs";

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "7987" #define REVISION_NR "7988"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__

View file

@ -433,6 +433,7 @@
<ClCompile Include="..\..\src\shared\Auth\AuthCrypt.cpp" /> <ClCompile Include="..\..\src\shared\Auth\AuthCrypt.cpp" />
<ClCompile Include="..\..\src\shared\Auth\BigNumber.cpp" /> <ClCompile Include="..\..\src\shared\Auth\BigNumber.cpp" />
<ClCompile Include="..\..\src\shared\Auth\Hmac.cpp" /> <ClCompile Include="..\..\src\shared\Auth\Hmac.cpp" />
<ClCompile Include="..\..\src\shared\Auth\SARC4.cpp" />
<ClCompile Include="..\..\src\shared\Auth\Sha1.cpp" /> <ClCompile Include="..\..\src\shared\Auth\Sha1.cpp" />
<ClCompile Include="..\..\src\shared\Base.cpp" /> <ClCompile Include="..\..\src\shared\Base.cpp" />
<ClCompile Include="..\..\src\shared\Common.cpp" /> <ClCompile Include="..\..\src\shared\Common.cpp" />
@ -469,6 +470,7 @@
<ClInclude Include="..\..\src\shared\Auth\AuthCrypt.h" /> <ClInclude Include="..\..\src\shared\Auth\AuthCrypt.h" />
<ClInclude Include="..\..\src\shared\Auth\BigNumber.h" /> <ClInclude Include="..\..\src\shared\Auth\BigNumber.h" />
<ClInclude Include="..\..\src\shared\Auth\Hmac.h" /> <ClInclude Include="..\..\src\shared\Auth\Hmac.h" />
<ClInclude Include="..\..\src\shared\Auth\SARC4.h" />
<ClInclude Include="..\..\src\shared\Auth\Sha1.h" /> <ClInclude Include="..\..\src\shared\Auth\Sha1.h" />
<ClInclude Include="..\..\src\shared\Base.h" /> <ClInclude Include="..\..\src\shared\Base.h" />
<ClInclude Include="..\..\src\shared\ByteBuffer.h" /> <ClInclude Include="..\..\src\shared\ByteBuffer.h" />

View file

@ -728,6 +728,14 @@
RelativePath="..\..\src\shared\Auth\Hmac.h" RelativePath="..\..\src\shared\Auth\Hmac.h"
> >
</File> </File>
<File
RelativePath="..\..\src\shared\Auth\SARC4.cpp"
>
</File>
<File
RelativePath="..\..\src\shared\Auth\SARC4.h"
>
</File>
<File <File
RelativePath="..\..\src\shared\Auth\Sha1.cpp" RelativePath="..\..\src\shared\Auth\Sha1.cpp"
> >

View file

@ -283,7 +283,7 @@
AdditionalDependencies="libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRTD.LIB msvcrtd.lib" AdditionalDependencies="libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRTD.LIB msvcrtd.lib"
OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\mangosd.exe" OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\mangosd.exe"
Version="" Version=""
LinkIncremental="1" LinkIncremental="2"
SuppressStartupBanner="true" SuppressStartupBanner="true"
AdditionalLibraryDirectories="..\..\dep\lib\$(PlatformName)_$(ConfigurationName)" AdditionalLibraryDirectories="..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
GenerateDebugInformation="true" GenerateDebugInformation="true"

View file

@ -69,7 +69,7 @@
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="mangosd.lib zlib.lib libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib aced.lib" AdditionalDependencies="mangosd.lib zlib.lib libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib aced.lib"
OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\MaNGOSScript.dll" OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\MaNGOSScript.dll"
LinkIncremental="1" LinkIncremental="2"
AdditionalLibraryDirectories=";.\mangosd__$(PlatformName)_$(ConfigurationName);.\zlib__$(PlatformName)_$(ConfigurationName);..\..\dep\lib\$(PlatformName)_$(ConfigurationName)" AdditionalLibraryDirectories=";.\mangosd__$(PlatformName)_$(ConfigurationName);.\zlib__$(PlatformName)_$(ConfigurationName);..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
GenerateDebugInformation="true" GenerateDebugInformation="true"
ProgramDatabaseFile="$(OutDir)\MaNGOSScript.pdb" ProgramDatabaseFile="$(OutDir)\MaNGOSScript.pdb"

View file

@ -733,6 +733,14 @@
RelativePath="..\..\src\shared\Auth\Hmac.h" RelativePath="..\..\src\shared\Auth\Hmac.h"
> >
</File> </File>
<File
RelativePath="..\..\src\shared\Auth\SARC4.cpp"
>
</File>
<File
RelativePath="..\..\src\shared\Auth\SARC4.h"
>
</File>
<File <File
RelativePath="..\..\src\shared\Auth\Sha1.cpp" RelativePath="..\..\src\shared\Auth\Sha1.cpp"
> >