diff --git a/sql/characters.sql b/sql/characters.sql index 0be0021a59f..c528c35fe33 100644 --- a/sql/characters.sql +++ b/sql/characters.sql @@ -21,7 +21,7 @@ DROP TABLE IF EXISTS `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'; -- diff --git a/sql/mangos.sql b/sql/mangos.sql index ddf802af98d..223ac1f58b9 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -23,7 +23,7 @@ DROP TABLE IF EXISTS `db_version`; CREATE TABLE `db_version` ( `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'; -- @@ -13619,7 +13619,7 @@ INSERT INTO spell_chain VALUES (33043,33042,31661,4,0), (42949,33043,31661,5,0), (42950,42949,31661,6,0), -/*FireBlast*/ +/*Fire Blast*/ (2136,0,2136,1,0), (2137,2136,2136,2,0), (2138,2137,2136,3,0), @@ -13631,7 +13631,7 @@ INSERT INTO spell_chain VALUES (27079,27078,2136,9,0), (42872,27079,2136,10,0), (42873,42872,2136,11,0), -/*FireWard*/ +/*Fire Ward*/ (543,0,543,1,0), (8457,543,543,2,0), (8458,8457,543,3,0), @@ -13656,6 +13656,9 @@ INSERT INTO spell_chain VALUES (38692,27070,133,14,0), (42832,38692,133,15,0), (42833,42832,133,16,0), +/*Fiery Payback*/ +(64353,0,64353,1,0), +(64357,64353,64353,2,0), /*Flamestrike*/ (2120,0,2120,1,0), (2121,2120,2120,2,0), @@ -13921,6 +13924,9 @@ INSERT INTO spell_chain VALUES (32546,0,32546,1,0), (48119,32546,32546,2,0), (48120,48119,32546,3,0), +/*Body and Soul*/ +(64127,0,64127,1,0), +(64129,64127,64127,2,0), /*Circle of Healing*/ (34861,0,34861,1,0), (34863,34861,34861,2,0), @@ -13939,6 +13945,10 @@ INSERT INTO spell_chain VALUES (25437,19243,19236,7,0), (48172,25437,19236,8,0), (48173,48172,19236,9,0), +/*Empowered Renew*/ +(63534,0,63534,1,0), +(63542,63534,63534,2,0), +(63543,63542,63534,3,0), /*FlashHeal*/ (2061,0,2061,1,0), (9472,2061,2061,2,0), @@ -14034,6 +14044,10 @@ INSERT INTO spell_chain VALUES (20770,10881,2006,5,0), (25435,20770,2006,6,0), (48171,25435,2006,7,0), +/*Serendipity*/ +(63730,0,63730,1,0), +(63733,63730,63730,2,0), +(63737,63733,63730,3,0), /*Smite*/ (585,0,585,1,0), (591,585,585,2,0), @@ -14060,6 +14074,10 @@ INSERT INTO spell_chain VALUES (25467,19280,2944,7,0), (48299,25467,2944,8,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*/ (8092,0,8092,1,0), (8102,8092,8092,2,0), @@ -14178,13 +14196,6 @@ INSERT INTO spell_chain VALUES (26998,9898,99,6,0), (48559,26998,99,7,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*/ (22568,0,22568,1,0), (22827,22568,22568,2,0), @@ -14700,13 +14711,6 @@ INSERT INTO spell_chain VALUES (49974,49973,49966,9,0), (52475,49974,49966,10,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 ------------------*/ @@ -15051,6 +15055,12 @@ INSERT INTO spell_chain VALUES (27149,10293,465,8,0), (48941,27149,465,9,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*/ (19891,0,19891,1,0), (19899,19891,19891,2,0), @@ -15108,7 +15118,7 @@ INSERT INTO spell_chain VALUES (1756,1755,1742,5,0), (16697,1756,1742,6,0), (27048,16697,1742,7,0), -/*GreatResistance*/ +/*Great Resistance*/ (53427,0,53427,1,0), (53429,53427,53427,2,0), (53430,53429,53427,3,0), @@ -15122,6 +15132,15 @@ INSERT INTO spell_chain VALUES (14921,14920,2649,7,0), (27047,14921,2649,8,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 ------------------*/ @@ -15170,6 +15189,9 @@ INSERT INTO spell_chain VALUES (28172,17728,2362,4,0), (47886,28172,2362,5,0), (47888,47886,2362,6,0), +/*Decimation*/ +(63156,0,63156,1,0), +(63158,63156,63156,2,0), /*DemonArmor*/ (706,0,706,1,0), (1086,706,706,2,0), @@ -15202,6 +15224,10 @@ INSERT INTO spell_chain VALUES (11695,11694,755,7,0), (27259,11695,755,8,0), (47856,27259,755,9,0), +/*Nemesis*/ +(63117,0,63117,1,0), +(63121,63117,63117,2,0), +(63123,63121,63117,3,0), /*RitualofSouls*/ (29893,0,29893,1,0), (58887,29893,29893,2,0), @@ -15240,13 +15266,6 @@ INSERT INTO spell_chain VALUES (603,0,603,1,0), (30910,603,603,2,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*/ (1490,0,1490,1,0), (11721,1490,1490,2,0), @@ -15312,15 +15331,6 @@ INSERT INTO spell_chain VALUES (27243,0,27243,1,0), (47835,27243,27243,2,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*/ (30108,0,30108,1,0), (30404,30108,30108,2,0), @@ -15384,6 +15394,9 @@ INSERT INTO spell_chain VALUES (58794,25500,8033,7,0), (58795,58794,8033,8,0), (58796,58795,8033,9,0), +/*Frozen Power*/ +(63373,0,63373,1,0), +(63374,63373,63373,2,0), /*Life Tap*/ (1454,0,1454,1,0), (1455,1454,1454,2,0), @@ -15540,6 +15553,9 @@ INSERT INTO spell_chain VALUES /*------------------ -- (375) Elemental Combat ------------------*/ +/*Booming Echoes*/ +(63370,0,63370,1,0), +(63372,63370,63370,2,0), /*Chain Lightning*/ (421,0,421,1,0), (930,421,421,2,0), @@ -15690,6 +15706,9 @@ INSERT INTO spell_chain VALUES (26979,26978,5185,13,0), (48377,26979,5185,14,0), (48378,48377,5185,15,0), +/*Improved Barkskin*/ +(63410,0,63410,1,0), +(63411,63410,63410,2,0), /*Lifebloom*/ (33763,0,33763,1,0), (48450,33763,33763,2,0), @@ -15785,13 +15804,6 @@ INSERT INTO spell_chain VALUES (17329,16813,16689,6,9853), (27009,17329,16689,7,26989), (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*/ (2637,0,2637,1,0), (18657,2637,2637,2,0), @@ -15892,15 +15904,6 @@ INSERT INTO spell_chain VALUES (59170,50796,50796,2,0), (59171,59170,50796,3,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*/ (1949,0,1949,1,0), (11683,1949,1949,2,0), @@ -15924,6 +15927,10 @@ INSERT INTO spell_chain VALUES (32231,29722,29722,2,0), (47837,32231,29722,3,0), (47838,47837,29722,4,0), +/*Molten Skin*/ +(63349,0,63349,1,0), +(63350,63349,63349,2,0), +(63351,63350,63349,3,0), /*RainofFire*/ (5740,0,5740,1,0), (6219,5740,5740,2,0), @@ -16087,6 +16094,10 @@ INSERT INTO spell_chain VALUES (27841,14819,14752,4,0), (25312,27841,14752,5,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*/ (588,0,588,1,0), (7128,588,588,2,0), @@ -16239,7 +16250,7 @@ INSERT INTO spell_chain VALUES /*------------------ --(770)Blood ------------------*/ -/*BloodBoil*/ +/*Blood Boil*/ (48721,0,48721,1,0), (49939,48721,48721,2,0), (49940,49939,48721,3,0), @@ -16251,14 +16262,26 @@ INSERT INTO spell_chain VALUES (49928,49927,45902,4,0), (49929,49928,45902,5,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), (55258,55050,55050,2,0), (55259,55258,55050,3,0), (55260,55259,55050,4,0), (55261,55260,55050,5,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), (49488,48985,48985,2,0), (49489,49488,48985,3,0), @@ -16291,12 +16314,11 @@ INSERT INTO spell_chain VALUES /*HornofWinter*/ (57330,0,57330,1,0), (57623,57330,57330,2,0), -/*HowlingBlast*/ +/*Howling Blast*/ (49184,0,49184,1,0), -(51408,49184,49184,2,0), -(51409,51408,49184,3,0), -(51410,51409,49184,4,0), -(51411,51410,49184,5,0), +(51409,49184,49184,2,0), +(51410,51409,49184,3,0), +(51411,51410,49184,4,0), /*IcyTalons*/ (50880,0,50880,1,0), (50884,50880,50880,2,0), @@ -16309,7 +16331,10 @@ INSERT INTO spell_chain VALUES (49903,49896,45477,3,0), (49904,49903,45477,4,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), (50031,49175,49175,2,0), (51456,50031,49175,3,0), @@ -16332,7 +16357,7 @@ INSERT INTO spell_chain VALUES (49936,43265,43265,2,0), (49937,49936,43265,3,0), (49938,49937,43265,4,0), -/*DeathCoil*/ +/*Death Coil*/ (47541,0,47541,1,0), (49892,47541,47541,2,0), (49893,49892,47541,3,0), @@ -16344,12 +16369,13 @@ INSERT INTO spell_chain VALUES (45463,49999,49998,3,0), (49923,45463,49998,4,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), (49610,49224,49224,2,0), (49611,49610,49224,3,0), -(49612,49611,49224,4,0), -(49614,49612,49224,5,0), /*Outbreak*/ (49013,0,49013,1,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), (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), -(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), (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), (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), @@ -16907,12 +16928,7 @@ INSERT INTO `spell_proc_event` VALUES (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), (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), -(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), (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), @@ -16924,9 +16940,6 @@ INSERT INTO `spell_proc_event` VALUES (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), (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), (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), @@ -17059,20 +17072,14 @@ INSERT INTO `spell_proc_event` VALUES (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), (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), (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), (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), (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), (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), (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), @@ -17179,7 +17186,6 @@ INSERT INTO `spell_proc_event` VALUES (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), (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), (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), @@ -17324,9 +17330,6 @@ INSERT INTO `spell_proc_event` VALUES (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), (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), (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), @@ -17344,15 +17347,6 @@ INSERT INTO `spell_proc_event` VALUES (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), (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), (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), @@ -17393,8 +17387,6 @@ INSERT INTO `spell_proc_event` VALUES (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), (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), (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), @@ -17478,13 +17470,9 @@ INSERT INTO `spell_proc_event` VALUES (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), (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), (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), -(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), (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), @@ -17517,8 +17505,6 @@ INSERT INTO `spell_proc_event` VALUES (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), (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), (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), @@ -17531,9 +17517,6 @@ INSERT INTO `spell_proc_event` VALUES (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), (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), (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), @@ -17560,8 +17543,6 @@ INSERT INTO `spell_proc_event` VALUES (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), (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), (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), @@ -17820,7 +17801,6 @@ INSERT INTO `spell_bonus_data` VALUES ('172', '0', '0.3', '0', 'Warlock - Corruption'), ('348', '0.2', '0.2', '0', 'Warlock - Immolate'), ('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'), ('31117', '1.8', '0', '0', 'Warlock - Unstable Affliction Dispell'), ('17962', '0.4286', '0', '0', 'Warlock - Conflagrate'), diff --git a/sql/updates/7886_01_mangos_petcreateinfo_spell.sql b/sql/updates/7886_01_mangos_petcreateinfo_spell.sql index 673d1b317f9..7e48d476a4e 100644 --- a/sql/updates/7886_01_mangos_petcreateinfo_spell.sql +++ b/sql/updates/7886_01_mangos_petcreateinfo_spell.sql @@ -1,4 +1,3 @@ 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`; - diff --git a/sql/updates/7902_01_mangos_pool_creature.sql b/sql/updates/7902_01_mangos_pool_creature.sql index 309ca5e38fb..50d6f377225 100644 --- a/sql/updates/7902_01_mangos_pool_creature.sql +++ b/sql/updates/7902_01_mangos_pool_creature.sql @@ -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 `pool_creature` - ADD INDEX `idx_guid`(`guid`); \ No newline at end of file +ALTER TABLE `pool_creature` + ADD INDEX `idx_guid`(`guid`); diff --git a/sql/updates/7902_02_mangos_pool_gameobject.sql b/sql/updates/7902_02_mangos_pool_gameobject.sql index 46524337ab7..09758239a41 100644 --- a/sql/updates/7902_02_mangos_pool_gameobject.sql +++ b/sql/updates/7902_02_mangos_pool_gameobject.sql @@ -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 `pool_gameobject` - ADD INDEX `idx_guid`(`guid`); \ No newline at end of file +ALTER TABLE `pool_gameobject` + ADD INDEX `idx_guid`(`guid`); diff --git a/sql/updates/7988_01_mangos_item_template.sql b/sql/updates/7988_01_mangos_item_template.sql new file mode 100644 index 00000000000..c046bf163df --- /dev/null +++ b/sql/updates/7988_01_mangos_item_template.sql @@ -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`; diff --git a/sql/updates/7988_02_characters_character_equipmentsets.sql b/sql/updates/7988_02_characters_character_equipmentsets.sql new file mode 100644 index 00000000000..e458a1272ff --- /dev/null +++ b/sql/updates/7988_02_characters_character_equipmentsets.sql @@ -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; diff --git a/sql/updates/7988_03_mangos_spell_chain.sql b/sql/updates/7988_03_mangos_spell_chain.sql new file mode 100644 index 00000000000..52b8e5d5223 --- /dev/null +++ b/sql/updates/7988_03_mangos_spell_chain.sql @@ -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); diff --git a/sql/updates/7988_04_mangos_creature_template.sql b/sql/updates/7988_04_mangos_creature_template.sql new file mode 100644 index 00000000000..b1a79116df0 --- /dev/null +++ b/sql/updates/7988_04_mangos_creature_template.sql @@ -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`; diff --git a/sql/updates/7988_05_mangos_item_template.sql b/sql/updates/7988_05_mangos_item_template.sql new file mode 100644 index 00000000000..b6886d21cc5 --- /dev/null +++ b/sql/updates/7988_05_mangos_item_template.sql @@ -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`; diff --git a/sql/updates/7988_06_mangos_gameobject_template.sql b/sql/updates/7988_06_mangos_gameobject_template.sql new file mode 100644 index 00000000000..11c5edebc3c --- /dev/null +++ b/sql/updates/7988_06_mangos_gameobject_template.sql @@ -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`; diff --git a/sql/updates/7988_07_characters_characters.sql b/sql/updates/7988_07_characters_characters.sql new file mode 100644 index 00000000000..246a93a0eb5 --- /dev/null +++ b/sql/updates/7988_07_characters_characters.sql @@ -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),' '); diff --git a/sql/updates/7988_08_mangos_spell_bonus_data.sql b/sql/updates/7988_08_mangos_spell_bonus_data.sql new file mode 100644 index 00000000000..b99cc0931ee --- /dev/null +++ b/sql/updates/7988_08_mangos_spell_bonus_data.sql @@ -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); + diff --git a/sql/updates/7988_09_mangos_spell_proc_event.sql b/sql/updates/7988_09_mangos_spell_proc_event.sql new file mode 100644 index 00000000000..f03ec0bf5df --- /dev/null +++ b/sql/updates/7988_09_mangos_spell_proc_event.sql @@ -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); diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index 1aaea93664e..051c5a49f5d 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -212,6 +212,15 @@ pkgdata_DATA = \ 7938_01_realmd_account.sql \ 7945_01_mangos_quest_template.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 ## Additional files to include when running 'make dist' @@ -404,4 +413,13 @@ EXTRA_DIST = \ 7938_01_realmd_account.sql \ 7945_01_mangos_quest_template.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 diff --git a/src/game/BattleGroundHandler.cpp b/src/game/BattleGroundHandler.cpp index 680d630ad89..04965cdbb9c 100644 --- a/src/game/BattleGroundHandler.cpp +++ b/src/game/BattleGroundHandler.cpp @@ -65,7 +65,7 @@ void WorldSession::HandleBattlemasterHelloOpcode( WorldPacket & recv_data ) void WorldSession::SendBattlegGroundList( uint64 guid, BattleGroundTypeId bgTypeId ) { WorldPacket data; - sBattleGroundMgr.BuildBattleGroundListPacket(&data, guid, _player, bgTypeId); + sBattleGroundMgr.BuildBattleGroundListPacket(&data, guid, _player, bgTypeId, 0); SendPacket( &data ); } @@ -102,13 +102,6 @@ void WorldSession::HandleBattlemasterJoinOpcode( WorldPacket & recv_data ) if (_player->InBattleGround()) 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 BattleGround *bg = NULL; if (instanceId) @@ -287,13 +280,16 @@ void WorldSession::HandlePVPLogDataOpcode( 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"); uint32 bgTypeId; recv_data >> bgTypeId; // id from DBC + uint8 fromWhere; + recv_data >> fromWhere; // 0 - battlemaster, 1 - UI + BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId); if (!bl) { @@ -302,7 +298,7 @@ void WorldSession::HandleBattlefieldListOpcode( WorldPacket &recv_data ) } WorldPacket data; - sBattleGroundMgr.BuildBattleGroundListPacket(&data, _player->GetGUID(), _player, BattleGroundTypeId(bgTypeId)); + sBattleGroundMgr.BuildBattleGroundListPacket(&data, 0, _player, BattleGroundTypeId(bgTypeId), fromWhere); SendPacket( &data ); } diff --git a/src/game/BattleGroundMgr.cpp b/src/game/BattleGroundMgr.cpp index b31a0beb3c7..df9276fe45e 100644 --- a/src/game/BattleGroundMgr.cpp +++ b/src/game/BattleGroundMgr.cpp @@ -1304,7 +1304,8 @@ void BattleGroundMgr::BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg) for(int i = 1; i >= 0; --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]); } for(int i = 1; i >= 0; --i) @@ -1820,7 +1821,7 @@ void BattleGroundMgr::DistributeArenaPoints() 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) return; @@ -1830,15 +1831,16 @@ void BattleGroundMgr::BuildBattleGroundListPacket(WorldPacket *data, const uint6 data->Initialize(SMSG_BATTLEFIELD_LIST); *data << uint64(guid); // battlemaster guid + *data << uint8(fromWhere); // from where you joined *data << uint32(bgTypeId); // battleground id if(bgTypeId == BATTLEGROUND_AA) // arena { - *data << uint8(5); // unk - *data << uint32(0); // unk + *data << uint8(4); // unk + *data << uint32(0); // unk (count?) } else // battleground { - *data << uint8(0x00); // unk + *data << uint8(0x00); // unk, different for each bg type size_t count_pos = data->wpos(); uint32 count = 0; diff --git a/src/game/BattleGroundMgr.h b/src/game/BattleGroundMgr.h index c0dacd99313..329a3772e4e 100644 --- a/src/game/BattleGroundMgr.h +++ b/src/game/BattleGroundMgr.h @@ -185,7 +185,7 @@ class BattleGroundMgr /* Packet Building */ void BuildPlayerJoinedBattleGroundPacket(WorldPacket *data, Player *plr); 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 BuildUpdateWorldStatePacket(WorldPacket *data, uint32 field, uint32 value); void BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg); diff --git a/src/game/CalendarHandler.cpp b/src/game/CalendarHandler.cpp index f4acb2641ca..4d3f9f074b1 100644 --- a/src/game/CalendarHandler.cpp +++ b/src/game/CalendarHandler.cpp @@ -74,78 +74,171 @@ void WorldSession::HandleCalendarGetEvent(WorldPacket &recv_data) { sLog.outDebug("WORLD: CMSG_CALENDAR_GET_EVENT"); recv_data.hexlike(); + //uint64 unk1; + //recv_data >> (uint64)unk1; } void WorldSession::HandleCalendarGuildFilter(WorldPacket &recv_data) { sLog.outDebug("WORLD: CMSG_CALENDAR_GUILD_FILTER"); 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) { sLog.outDebug("WORLD: CMSG_CALENDAR_ARENA_TEAM"); recv_data.hexlike(); + //uint32 unk; + //recv_data >> (uint32)unk; + } void WorldSession::HandleCalendarAddEvent(WorldPacket &recv_data) { sLog.outDebug("WORLD: CMSG_CALENDAR_ADD_EVENT"); 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> (uint8)unk12; + // recv_data >> (uint8)unk13; + // } + // } + //} } void WorldSession::HandleCalendarUpdateEvent(WorldPacket &recv_data) { sLog.outDebug("WORLD: CMSG_CALENDAR_UPDATE_EVENT"); 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) { sLog.outDebug("WORLD: CMSG_CALENDAR_REMOVE_EVENT"); recv_data.hexlike(); + + //recv_data >> uint64 + //recv_data >> uint64 + //recv_data >> uint32 + } void WorldSession::HandleCalendarCopyEvent(WorldPacket &recv_data) { sLog.outDebug("WORLD: CMSG_CALENDAR_COPY_EVENT"); recv_data.hexlike(); + + //recv_data >> uint64 + //recv_data >> uint64 + //recv_data >> uint32 + } void WorldSession::HandleCalendarEventInvite(WorldPacket &recv_data) { sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_INVITE"); 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) { sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_RSVP"); recv_data.hexlike(); + + //recv_data >> uint64 + //recv_data >> uint64 + //recv_data >> uint32 + } void WorldSession::HandleCalendarEventRemoveInvite(WorldPacket &recv_data) { sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_REMOVE_INVITE"); recv_data.hexlike(); + + //recv_data.readPackGUID(guid) + //recv_data >> uint64 + //recv_data >> uint64 + //recv_data >> uint64 } void WorldSession::HandleCalendarEventStatus(WorldPacket &recv_data) { sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_STATUS"); 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) { sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_MODERATOR_STATUS"); 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) { sLog.outDebug("WORLD: CMSG_CALENDAR_COMPLAIN"); recv_data.hexlike(); + + //recv_data >> uint64 + //recv_data >> uint64 + //recv_data >> uint64 } void WorldSession::HandleCalendarGetNumPending(WorldPacket &recv_data) diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp index 1a0547c46b8..20cce455cbc 100644 --- a/src/game/CharacterHandler.cpp +++ b/src/game/CharacterHandler.cpp @@ -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_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_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_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)); @@ -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_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_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; } @@ -717,7 +717,6 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder) ObjectAccessor::Instance().AddObject(pCurrChar); //sLog.outDebug("Player %s added to Map.",pCurrChar->GetName()); - pCurrChar->GetSocial()->SendSocialList(); pCurrChar->SendInitialPacketsAfterAddToMap(); @@ -886,9 +885,7 @@ void WorldSession::HandleMeetingStoneInfo( WorldPacket & /*recv_data*/ ) { DEBUG_LOG( "WORLD: Received CMSG_MEETING_STONE_INFO" ); - WorldPacket data(SMSG_MEETINGSTONE_SETQUEUE, 5); - data << uint32(0) << uint8(6); - SendPacket(&data); + SendLfgUpdate(0, 0, 0); } void WorldSession::HandleTutorialFlag( WorldPacket & recv_data ) @@ -906,9 +903,9 @@ void WorldSession::HandleTutorialFlag( WorldPacket & recv_data ) } uint32 rInt = (iFlag % 32); - uint32 tutflag = GetPlayer()->GetTutorialInt( wInt ); + uint32 tutflag = GetTutorialInt( wInt ); tutflag |= (1 << rInt); - GetPlayer()->SetTutorialInt( wInt, tutflag ); + SetTutorialInt( wInt, tutflag ); //sLog.outDebug("Received Tutorial Flag Set {%u}.", iFlag); } @@ -916,13 +913,13 @@ void WorldSession::HandleTutorialFlag( WorldPacket & recv_data ) void WorldSession::HandleTutorialClear( WorldPacket & /*recv_data*/ ) { for (int i = 0; i < 8; ++i) - GetPlayer()->SetTutorialInt( i, 0xFFFFFFFF ); + SetTutorialInt( i, 0xFFFFFFFF ); } void WorldSession::HandleTutorialReset( WorldPacket & /*recv_data*/ ) { for (int i = 0; i < 8; ++i) - GetPlayer()->SetTutorialInt( i, 0x00000000 ); + SetTutorialInt( i, 0x00000000 ); } void WorldSession::HandleSetWatchedFactionOpcode(WorldPacket & recv_data) @@ -1201,6 +1198,7 @@ void WorldSession::HandleRemoveGlyph( WorldPacket & recv_data ) { _player->RemoveAurasDueToSpell(gp->SpellId); _player->SetGlyph(slot, 0); + _player->SendTalentsInfoData(false); } } } @@ -1299,3 +1297,116 @@ void WorldSession::HandleCharCustomize(WorldPacket& recv_data) data << uint8(facialHair); 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); +} diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index 0645b3a0ef4..34447760c8b 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -1106,6 +1106,7 @@ void ChatHandler::FillMessageData( WorldPacket *data, WorldSession* session, uin case CHAT_MSG_MONSTER_EMOTE: case CHAT_MSG_RAID_BOSS_WHISPER: case CHAT_MSG_RAID_BOSS_EMOTE: + case CHAT_MSG_BN: { *data << uint64(speaker->GetGUID()); *data << uint32(0); // 2.1.0 diff --git a/src/game/ConfusedMovementGenerator.cpp b/src/game/ConfusedMovementGenerator.cpp index d591d151f6e..5928a20d9f1 100644 --- a/src/game/ConfusedMovementGenerator.cpp +++ b/src/game/ConfusedMovementGenerator.cpp @@ -65,7 +65,7 @@ ConfusedMovementGenerator::Initialize(T &unit) } unit.StopMoving(); - unit.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); + unit.RemoveUnitMovementFlag(MONSTER_MOVE_WALK); unit.addUnitState(UNIT_STAT_CONFUSED); } diff --git a/src/game/Corpse.cpp b/src/game/Corpse.cpp index 0e5b28fe6fa..4964d2ef271 100644 --- a/src/game/Corpse.cpp +++ b/src/game/Corpse.cpp @@ -30,8 +30,8 @@ Corpse::Corpse(CorpseType type) : WorldObject() { m_objectType |= TYPEMASK_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; @@ -86,10 +86,6 @@ bool Corpse::Create( uint32 guidlow, Player *owner) } 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() ); m_grid = MaNGOS::ComputeGridPair(GetPositionX(), GetPositionY()); diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 1a9512487b6..b98f5e87590 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -122,7 +122,7 @@ m_creatureInfo(NULL), m_isActiveObject(false), m_AlreadySearchedAssistance(false m_CreatureSpellCooldowns.clear(); m_CreatureCategoryCooldowns.clear(); m_GlobalCooldown = 0; - m_unit_movement_flags = MOVEMENTFLAG_WALK_MODE; + m_unit_movement_flags = MONSTER_MOVE_WALK; } Creature::~Creature() @@ -1522,7 +1522,7 @@ void Creature::setDeathState(DeathState s) CreatureInfo const *cinfo = GetCreatureInfo(); SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0); RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); - AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); + AddUnitMovementFlag(MONSTER_MOVE_WALK); SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); clearUnitState(UNIT_STAT_ALL_STATE); i_motionMaster.Clear(); diff --git a/src/game/Creature.h b/src/game/Creature.h index e171e56f78d..f59dd6b6f67 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -157,6 +157,8 @@ struct CreatureInfo { uint32 Entry; uint32 HeroicEntry; + uint32 unk1; + uint32 unk2; uint32 DisplayID_A; uint32 DisplayID_A2; uint32 DisplayID_H; @@ -216,6 +218,8 @@ struct CreatureInfo float unk16; float unk17; bool RacialLeader; + uint32 questItems[4]; + uint32 movementId; bool RegenHealth; uint32 equipmentId; uint32 MechanicImmuneMask; diff --git a/src/game/DBCStores.cpp b/src/game/DBCStores.cpp index 339ae386a44..d60eccb89c1 100644 --- a/src/game/DBCStores.cpp +++ b/src/game/DBCStores.cpp @@ -128,9 +128,6 @@ TalentSpellPosMap sTalentSpellPosMap; DBCStorage sTalentTabStore(TalentTabEntryfmt); // store absolute bit position for first rank for talent inspect -typedef std::map TalentInspectMap; -static TalentInspectMap sTalentPosInInspect; -static TalentInspectMap sTalentTabSizeInInspect; static uint32 sTalentTabPages[12/*MAX_CLASSES*/][3]; DBCStorage 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 { - // 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 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) 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) {} 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 - if( !sSpellStore.LookupEntry(62735) || // last added spell in 3.0.9 - !sMapStore.LookupEntry(624) || // last map added in 3.0.8a/3.0.9 - !sGemPropertiesStore.LookupEntry(1557) || // last gem property added in 3.0.8a/3.0.9 - !sItemExtendedCostStore.LookupEntry(2589) || // last item extended cost added in 3.0.8a/3.0.9 - !sCharTitlesStore.LookupEntry(144) || // last char title added in 3.0.8a/3.0.9 - !sAreaStore.LookupEntry(2769) || // last area (areaflag) added in 3.0.8a/3.0.9 - !sItemStore.LookupEntry(45037) ) // last client known item added in 3.0.9 + if( !sSpellStore.LookupEntry(66530) || // last added spell in 3.1.3 + !sMapStore.LookupEntry(624) || // last map added in 3.1.3 + !sGemPropertiesStore.LookupEntry(1609) || // last gem property added in 3.1.3 + !sItemExtendedCostStore.LookupEntry(2671) || // last item extended cost added in 3.1.3 + !sCharTitlesStore.LookupEntry(166) || // last char title added in 3.1.3 + !sAreaStore.LookupEntry(2905) || // last area (areaflag) added in 3.1.3 + !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."); exit(1); @@ -704,24 +657,6 @@ void Map2ZoneCoordinates(float& x,float& y,uint32 zone) 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) { return sTalentTabPages[cls]; diff --git a/src/game/DBCStores.h b/src/game/DBCStores.h index 222227dcb31..6a334305f13 100644 --- a/src/game/DBCStores.h +++ b/src/game/DBCStores.h @@ -54,8 +54,6 @@ bool IsTotemCategoryCompatiableWith(uint32 itemTotemCategoryId, uint32 requiredT void Zone2MapCoordinates(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); extern DBCStorage sAchievementStore; diff --git a/src/game/DBCStructure.h b/src/game/DBCStructure.h index f3c3b07143a..a79373088d2 100644 --- a/src/game/DBCStructure.h +++ b/src/game/DBCStructure.h @@ -571,6 +571,7 @@ struct BattlemasterListEntry char* name[16]; // 16-31 // 32 string flag, unused // 33 unused + //uint32 unk; // 34 new 3.1 }; #define MAX_OUTFIT_ITEMS 24 @@ -940,6 +941,7 @@ struct HolidaysEntry //uint32 unk51; // 51 //uint32 unk52; // 52 //uint32 unk53; // 53 + //uint32 unk54; // 54 }; struct ItemEntry @@ -1271,6 +1273,7 @@ struct SoundEntriesEntry // 26 m_minDistance // 27 m_distanceCutoff // 28 m_EAXDef + // 29 new in 3.1 }; struct SpellEntry @@ -1382,6 +1385,7 @@ struct SpellEntry uint32 SchoolMask; // 228 m_schoolMask uint32 runeCostID; // 229 m_runeCostID //uint32 spellMissileID; // 230 m_spellMissileID not used + //uint32 PowerDisplayId; // 231 PowerDisplay.dbc, new in 3.1 // helpers int32 CalculateSimpleValue(uint8 eff) const { return EffectBasePoints[eff]+int32(EffectBaseDice[eff]); } @@ -1490,6 +1494,7 @@ struct SpellItemEnchantmentEntry uint32 EnchantmentCondition; // 34 m_condition_id //uint32 requiredSkill; // 35 m_requiredSkillID //uint32 requiredSkillValue; // 36 m_requiredSkillRank + // 37 new in 3.1 }; struct SpellItemEnchantmentConditionEntry @@ -1611,25 +1616,28 @@ struct VehicleEntry float m_cameraFadeDistScalarMin; // 15 float m_cameraFadeDistScalarMax; // 16 float m_cameraPitchOffset; // 17 - int m_powerType[3]; // 18-20 - int m_powerToken[3]; // 21-23 - float m_facingLimitRight; // 24 - float m_facingLimitLeft; // 25 - float m_msslTrgtTurnLingering; // 26 - float m_msslTrgtPitchLingering; // 27 - float m_msslTrgtMouseLingering; // 28 - float m_msslTrgtEndOpacity; // 29 - float m_msslTrgtArcSpeed; // 30 - float m_msslTrgtArcRepeat; // 31 - float m_msslTrgtArcWidth; // 32 - float m_msslTrgtImpactRadius[2]; // 33-34 - char* m_msslTrgtArcTexture; // 35 - char* m_msslTrgtImpactTexture; // 36 - char* m_msslTrgtImpactModel[2]; // 37-38 - float m_cameraYawOffset; // 39 - uint32 m_uiLocomotionType; // 40 - float m_msslTrgtImpactTexRadius; // 41 - uint32 m_uiSeatIndicatorType; // 42 + //int m_powerType[3]; // removed in 3.1 + //int m_powerToken[3]; // removed in 3.1 + float m_facingLimitRight; // 18 + float m_facingLimitLeft; // 19 + float m_msslTrgtTurnLingering; // 20 + float m_msslTrgtPitchLingering; // 21 + float m_msslTrgtMouseLingering; // 22 + float m_msslTrgtEndOpacity; // 23 + float m_msslTrgtArcSpeed; // 24 + float m_msslTrgtArcRepeat; // 25 + float m_msslTrgtArcWidth; // 26 + float m_msslTrgtImpactRadius[2]; // 27-28 + char* m_msslTrgtArcTexture; // 29 + char* m_msslTrgtImpactTexture; // 30 + char* m_msslTrgtImpactModel[2]; // 31-32 + float m_cameraYawOffset; // 33 + uint32 m_uiLocomotionType; // 34 + float m_msslTrgtImpactTexRadius; // 35 + uint32 m_uiSeatIndicatorType; // 36 + // 37, new in 3.1 + // 38, new in 3.1 + // 39, new in 3.1 }; struct VehicleSeatEntry @@ -1680,6 +1688,7 @@ struct VehicleSeatEntry uint32 m_exitUISoundID; // 43 int32 m_uiSkin; // 44 uint32 m_flagsB; // 45 + // 46-57 added in 3.1, floats mostly }; struct WorldMapAreaEntry diff --git a/src/game/DBCfmt.h b/src/game/DBCfmt.h index 148b90bec1d..b62ad73c2d3 100644 --- a/src/game/DBCfmt.h +++ b/src/game/DBCfmt.h @@ -27,7 +27,7 @@ const char AreaTriggerEntryfmt[]="niffffffff"; const char AuctionHouseEntryfmt[]="niiixxxxxxxxxxxxxxxxx"; const char BankBagSlotPricesEntryfmt[]="ni"; const char BarberShopStyleEntryfmt[]="nixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiii"; -const char BattlemasterListEntryfmt[]="niiiiiiiiiiiixxxssssssssssssssssxx"; +const char BattlemasterListEntryfmt[]="niiiiiiiiiiiixxxssssssssssssssssxxx"; const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char CharTitlesEntryfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi"; const char ChatChannelsEntryfmt[]="iixssssssssssssssssxxxxxxxxxxxxxxxxxx"; @@ -59,7 +59,7 @@ const char GtOCTRegenHPfmt[]="f"; //const char GtOCTRegenMPfmt[]="f"; const char GtRegenHPPerSptfmt[]="f"; const char GtRegenMPPerSptfmt[]="f"; -const char Holidaysfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; +const char Holidaysfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char Itemfmt[]="niiiiiii"; const char ItemBagFamilyfmt[]="nxxxxxxxxxxxxxxxxx"; //const char ItemDisplayTemplateEntryfmt[]="nxxxxxxxxxxixxxxxxxxxxx"; @@ -79,12 +79,12 @@ const char ScalingStatDistributionfmt[]="niiiiiiiiiiiiiiiiiiiii"; const char ScalingStatValuesfmt[]="iniiiiiiiiiiiiiiiii"; const char SkillLinefmt[]="nixssssssssssssssssxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxi"; const char SkillLineAbilityfmt[]="niiiixxiiiiixx"; -const char SoundEntriesfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; +const char SoundEntriesfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char SpellCastTimefmt[]="nixx"; const char SpellDurationfmt[]="niii"; -const char SpellEntryfmt[]="niiiiiiiiixiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffiiiiiiiiiiiiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiiixfffxxxiiiiix"; +const char SpellEntryfmt[]="niiiiiiiiixiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffiiiiiiiiiiiiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiiixfffxxxiiiiixx"; const char SpellFocusObjectfmt[]="nxxxxxxxxxxxxxxxxx"; -const char SpellItemEnchantmentfmt[]="nxiiiiiixxxiiissssssssssssssssxiiiixx"; +const char SpellItemEnchantmentfmt[]="nxiiiiiixxxiiissssssssssssssssxiiiixxx"; const char SpellItemEnchantmentConditionfmt[]="nbbbbbxxxxxbbbbbbbbbbiiiiiXXXXX"; const char SpellRadiusfmt[]="nfxf"; const char SpellRangefmt[]="nffffxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; @@ -98,8 +98,8 @@ const char TaxiNodesEntryfmt[]="nifffssssssssssssssssxii"; const char TaxiPathEntryfmt[]="niii"; const char TaxiPathNodeEntryfmt[]="diiifffiixx"; const char TotemCategoryEntryfmt[]="nxxxxxxxxxxxxxxxxxii"; -const char VehicleEntryfmt[]="niffffiiiiiiiiffffiiiiiifffffffffffssssfifi"; -const char VehicleSeatEntryfmt[]="niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiii"; +const char VehicleEntryfmt[]="niffffiiiiiiiifffffffffffffffssssfifixxx"; +const char VehicleSeatEntryfmt[]="niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiiixxxxxxxxxxxx"; const char WorldMapAreaEntryfmt[]="xinxffffix"; const char WorldMapOverlayEntryfmt[]="nxiiiixxxxxxxxxxx"; const char WorldSafeLocsEntryfmt[]="nifffxxxxxxxxxxxxxxxxx"; diff --git a/src/game/DynamicObject.cpp b/src/game/DynamicObject.cpp index acb1c70f865..89c6a7545ee 100644 --- a/src/game/DynamicObject.cpp +++ b/src/game/DynamicObject.cpp @@ -30,8 +30,8 @@ DynamicObject::DynamicObject() : WorldObject() { m_objectType |= TYPEMASK_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; } diff --git a/src/game/FleeingMovementGenerator.cpp b/src/game/FleeingMovementGenerator.cpp index 7f80e573830..373d856608c 100644 --- a/src/game/FleeingMovementGenerator.cpp +++ b/src/game/FleeingMovementGenerator.cpp @@ -285,7 +285,7 @@ FleeingMovementGenerator::Initialize(T &owner) return; _Init(owner); - owner.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); + owner.RemoveUnitMovementFlag(MONSTER_MOVE_WALK); if(Unit * fright = ObjectAccessor::GetUnit(owner, i_frightGUID)) { diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp index 98be0da03a1..951171ee56d 100644 --- a/src/game/GameObject.cpp +++ b/src/game/GameObject.cpp @@ -40,8 +40,8 @@ GameObject::GameObject() : WorldObject() { m_objectType |= TYPEMASK_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_respawnTime = 0; @@ -55,6 +55,7 @@ GameObject::GameObject() : WorldObject() m_goInfo = NULL; m_DBTableGuid = 0; + m_rotation = 0; } GameObject::~GameObject() @@ -118,10 +119,6 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMa 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+1, rotation1); @@ -515,10 +512,10 @@ void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask) data.id = GetEntry(); data.mapid = mapid; data.phaseMask = phaseMask; - data.posX = GetFloatValue(GAMEOBJECT_POS_X); - data.posY = GetFloatValue(GAMEOBJECT_POS_Y); - data.posZ = GetFloatValue(GAMEOBJECT_POS_Z); - data.orientation = GetFloatValue(GAMEOBJECT_FACING); + data.posX = GetPositionX(); + data.posY = GetPositionY(); + data.posZ = GetPositionZ(); + data.orientation = GetOrientation(); data.rotation0 = GetFloatValue(GAMEOBJECT_PARENTROTATION+0); data.rotation1 = GetFloatValue(GAMEOBJECT_PARENTROTATION+1); data.rotation2 = GetFloatValue(GAMEOBJECT_PARENTROTATION+2); @@ -536,10 +533,10 @@ void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask) << mapid << ", " << uint32(spawnMask) << "," // cast to prevent save as symbol << uint16(GetPhaseMask()) << "," // prevent out of range error - << GetFloatValue(GAMEOBJECT_POS_X) << ", " - << GetFloatValue(GAMEOBJECT_POS_Y) << ", " - << GetFloatValue(GAMEOBJECT_POS_Z) << ", " - << GetFloatValue(GAMEOBJECT_FACING) << ", " + << GetPositionX() << ", " + << GetPositionY() << ", " + << GetPositionZ() << ", " + << GetOrientation() << ", " << GetFloatValue(GAMEOBJECT_PARENTROTATION) << ", " << GetFloatValue(GAMEOBJECT_PARENTROTATION+1) << ", " << GetFloatValue(GAMEOBJECT_PARENTROTATION+2) << ", " @@ -643,8 +640,6 @@ uint32 GameObject::GetLootId(GameObjectInfo const* ginfo) return ginfo->chest.lootId; case GAMEOBJECT_TYPE_FISHINGHOLE: return ginfo->fishinghole.lootId; - case GAMEOBJECT_TYPE_FISHINGNODE: - return ginfo->fishnode.lootId; default: 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)); - SetFloatValue(GAMEOBJECT_FACING, GetOrientation()); - double f_rot1 = sin(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 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) { diff --git a/src/game/GameObject.h b/src/game/GameObject.h index 8cb599ec646..8f2e1908f04 100644 --- a/src/game/GameObject.h +++ b/src/game/GameObject.h @@ -41,9 +41,11 @@ struct GameObjectInfo char *name; char *IconName; char *castBarCaption; + char *unk1; uint32 faction; uint32 flags; float size; + uint32 questItems[4]; union // different GO types have different data field { //0 GAMEOBJECT_TYPE_DOOR @@ -55,6 +57,7 @@ struct GameObjectInfo uint32 noDamageImmune; //3 break opening whenever you recieve damage? uint32 openTextID; //4 can be used to replace castBarCaption? uint32 closeTextID; //5 + uint32 ignoredByPathing; //6 } door; //1 GAMEOBJECT_TYPE_BUTTON struct @@ -102,6 +105,7 @@ struct GameObjectInfo uint32 logLoot; //13 uint32 openTextID; //14 can be used to replace castBarCaption? uint32 groupLootRules; //15 + uint32 floatingTooltip; //16 } chest; //4 GAMEOBJECT_TYPE_BINDER - empty //5 GAMEOBJECT_TYPE_GENERIC @@ -131,6 +135,7 @@ struct GameObjectInfo uint32 stealthAffected; //11 uint32 openTextID; //12 can be used to replace castBarCaption? uint32 closeTextID; //13 + uint32 ignoreTotems; //14 } trap; //7 GAMEOBJECT_TYPE_CHAIR struct @@ -138,6 +143,7 @@ struct GameObjectInfo uint32 slots; //0 uint32 height; //1 uint32 onlyCreatorUse; //2 + uint32 triggeredEvent; //3 } chair; //8 GAMEOBJECT_TYPE_SPELL_FOCUS struct @@ -148,6 +154,7 @@ struct GameObjectInfo uint32 serverOnly; //3 uint32 questID; //4 uint32 large; //5 + uint32 floatingTooltip; //6 } spellFocus; //9 GAMEOBJECT_TYPE_TEXT struct @@ -178,6 +185,9 @@ struct GameObjectInfo uint32 closeTextID; //15 uint32 losOK; //16 isBattlegroundObject uint32 allowMounted; //17 + uint32 floatingTooltip; //18 + uint32 gossipID; //19 + uint32 WorldStateSetsState; //20 } goober; //11 GAMEOBJECT_TYPE_TRANSPORT struct @@ -185,6 +195,8 @@ struct GameObjectInfo uint32 pause; //0 uint32 startOpen; //1 uint32 autoCloseTime; //2 secs till autoclose = autoCloseTime / 0x10000 + uint32 pause1EventID; //3 + uint32 pause2EventID; //4 } transport; //12 GAMEOBJECT_TYPE_AREADAMAGE struct @@ -217,14 +229,10 @@ struct GameObjectInfo uint32 stopEventID; //4 uint32 transportPhysics; //5 uint32 mapID; //6 + uint32 worldState1; //7 } moTransport; //16 GAMEOBJECT_TYPE_DUELFLAG - empty - //17 GAMEOBJECT_TYPE_FISHINGNODE - struct - { - uint32 _data0; //0 - uint32 lootId; //1 - } fishnode; + //17 GAMEOBJECT_TYPE_FISHINGNODE - empty //18 GAMEOBJECT_TYPE_SUMMONING_RITUAL struct { @@ -238,11 +246,7 @@ struct GameObjectInfo uint32 ritualNoTargetCheck; //7 } summoningRitual; //19 GAMEOBJECT_TYPE_MAILBOX - empty - //20 GAMEOBJECT_TYPE_AUCTIONHOUSE - struct - { - uint32 actionHouseID; //0 - } auctionhouse; + //20 GAMEOBJECT_TYPE_DONOTUSE - empty //21 GAMEOBJECT_TYPE_GUARDPOST struct { @@ -255,6 +259,8 @@ struct GameObjectInfo uint32 spellId; //0 uint32 charges; //1 uint32 partyOnly; //2 + uint32 allowMounted; //3 + uint32 large; //4 } spellcaster; //23 GAMEOBJECT_TYPE_MEETINGSTONE struct @@ -321,6 +327,8 @@ struct GameObjectInfo uint32 maxTime; //17 uint32 large; //18 uint32 highlight; //19 + uint32 startingValue; //20 + uint32 unidirectional; //21 } capturePoint; //30 GAMEOBJECT_TYPE_AURA_GENERATOR struct @@ -348,10 +356,30 @@ struct GameObjectInfo //33 GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING struct { - uint32 dmgPctState1; //0 - uint32 dmgPctState2; //1 - uint32 state1Name; //2 - uint32 state2Name; //3 + uint32 intactNumHits; //0 + uint32 creditProxyCreature; //1 + uint32 empty1; //2 + 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; //34 GAMEOBJECT_TYPE_GUILDBANK - empty //35 GAMEOBJECT_TYPE_TRAPDOOR @@ -612,6 +640,7 @@ class MANGOS_DLL_SPEC GameObject : public WorldObject GridReference &GetGridRef() { return m_gridRef; } bool isActiveObject() const { return false; } + uint64 GetRotation() const { return m_rotation; } protected: uint32 m_charges; // Spell charges for GAMEOBJECT_TYPE_SPELLCASTER (22) 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 GameObjectInfo const* m_goInfo; + uint64 m_rotation; private: void SwitchDoorOrButton(bool activate, bool alternative = false); diff --git a/src/game/GossipDef.cpp b/src/game/GossipDef.cpp index 0576bad2b8f..ab229d9f17f 100644 --- a/src/game/GossipDef.cpp +++ b/src/game/GossipDef.cpp @@ -128,7 +128,7 @@ void PlayerMenu::SendGossipMenu( uint32 TitleTextId, uint64 npcGUID ) data << uint64(npcGUID); data << uint32(0); // new 2.4.0 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 ) { @@ -452,6 +452,7 @@ void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID data << uint32(ActivateAccept); data << uint32(pQuest->GetSuggestedPlayers()); data << uint8(0); // new wotlk + data << uint8(0); // new 3.1 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 (RequestItemsText.empty()) + if (!pQuest->GetReqItemsCount() && Completable) { SendQuestGiverOfferReward(pQuest, npcGUID, true); return; diff --git a/src/game/GridDefines.h b/src/game/GridDefines.h index e1fdbc6b16d..d5ddf3aaff4 100644 --- a/src/game/GridDefines.h +++ b/src/game/GridDefines.h @@ -41,10 +41,10 @@ class Player; #define MIN_GRID_DELAY (MINUTE*IN_MILISECONDS) #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 CENTER_GRID_CELL_ID 256 +#define CENTER_GRID_CELL_ID 128 #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) diff --git a/src/game/HomeMovementGenerator.cpp b/src/game/HomeMovementGenerator.cpp index a0c090989de..5dfbc834531 100644 --- a/src/game/HomeMovementGenerator.cpp +++ b/src/game/HomeMovementGenerator.cpp @@ -27,7 +27,7 @@ void HomeMovementGenerator::Initialize(Creature & owner) { - owner.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); + owner.RemoveUnitMovementFlag(MONSTER_MOVE_WALK); _setTargetLocation(owner); } @@ -63,7 +63,7 @@ HomeMovementGenerator::Update(Creature &owner, const uint32& time_diff 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 if(owner.GetDefaultMovementType()==IDLE_MOTION_TYPE) diff --git a/src/game/Item.cpp b/src/game/Item.cpp index 205a8d7c7a1..52ed24bdb4b 100644 --- a/src/game/Item.cpp +++ b/src/game/Item.cpp @@ -233,8 +233,8 @@ Item::Item( ) { m_objectType |= TYPEMASK_ITEM; m_objectTypeId = TYPEID_ITEM; - // 2.3.2 - 0x18 - m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID); + + m_updateFlag = UPDATEFLAG_HIGHGUID; m_valuesCount = ITEM_END; m_slot = 0; diff --git a/src/game/Item.h b/src/game/Item.h index 0ad45f3d0e7..5f92232bd18 100644 --- a/src/game/Item.h +++ b/src/game/Item.h @@ -167,7 +167,7 @@ enum EnchantmentSlot 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 diff --git a/src/game/ItemHandler.cpp b/src/game/ItemHandler.cpp index f84bba9b612..1956791045b 100644 --- a/src/game/ItemHandler.cpp +++ b/src/game/ItemHandler.cpp @@ -439,6 +439,7 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data ) data << pProto->ArmorDamageModifier; data << pProto->Duration; // added in 2.4.2.8209, duration (seconds) data << pProto->ItemLimitCategory; // WotLK, ItemLimitCategory + data << pProto->HolidayId; // Holiday.dbc? SendPacket( &data ); } else @@ -662,28 +663,28 @@ void WorldSession::HandleBuybackItem(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" ); uint64 vendorguid, bagguid; - uint32 item; - uint8 slot, count; + uint32 item, 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); } 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" ); uint64 vendorguid; - uint32 item; - uint8 count, unk1; + uint32 item, slot, count; + uint8 unk1; - recv_data >> vendorguid >> item >> count >> unk1; + recv_data >> vendorguid >> item >> slot >> count >> unk1; GetPlayer()->BuyItemFromVendor(vendorguid,item,count,NULL_BAG,NULL_SLOT); } diff --git a/src/game/ItemPrototype.h b/src/game/ItemPrototype.h index 20ec43fc0ba..9974030ac8b 100644 --- a/src/game/ItemPrototype.h +++ b/src/game/ItemPrototype.h @@ -493,7 +493,7 @@ struct _Socket 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_SPELLS 5 #define MAX_ITEM_PROTO_STATS 10 @@ -567,6 +567,7 @@ struct ItemPrototype float ArmorDamageModifier; int32 Duration; // negative = realtime, positive = ingame time uint32 ItemLimitCategory; // id from ItemLimitCategory.dbc + uint32 HolidayId; // id from Holidays.dbc uint32 ScriptId; uint32 DisenchantID; uint32 FoodType; diff --git a/src/game/LFGHandler.cpp b/src/game/LFGHandler.cpp index 7747e3ef3ad..17792dba53b 100644 --- a/src/game/LFGHandler.cpp +++ b/src/game/LFGHandler.cpp @@ -184,6 +184,8 @@ void WorldSession::HandleLfgClearOpcode( WorldPacket & /*recv_data */ ) if( sWorld.getConfig(CONFIG_RESTRICTED_LFG_CHANNEL) && _player->GetSession()->GetSecurity() == SEC_PLAYER ) _player->LeaveLFGChannel(); + + SendLfgUpdate(0, 0, 0); } void WorldSession::HandleLfmClearOpcode( WorldPacket & /*recv_data */) @@ -196,16 +198,18 @@ void WorldSession::HandleLfmClearOpcode( 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"); //recv_data.hexlike(); 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); - type = ( (temp >> 24) & 0xFFFF); + entry = ( temp & 0x00FFFFFF); + type = ( (temp >> 24) & 0x000000FF); _player->m_lookingForGroup.more.Set(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); SendLfgResult(type, entry, 0); + SendLfgUpdate(0, 1, 0); } void WorldSession::SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type) { uint32 number = 0; - // start prepare packet; WorldPacket data(MSG_LOOKING_FOR_GROUP); data << uint32(type); // type 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 HashMapHolder::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()) continue; - if(!plr->m_lookingForGroup.HaveInSlot(entry,type)) + if(!plr->m_lookingForGroup.HaveInSlot(entry, type)) continue; ++number; - data.append(plr->GetPackGUID()); // packed guid - data << plr->getLevel(); // level - data << plr->GetZoneId(); // current zone - data << lfg_type; // 0x00 - LFG, 0x01 - LFM + data << uint64(plr->GetGUID()); // guid + + uint32 flags = 0x1FF; + data << uint32(flags); // flags - for(uint8 j = 0; j < MAX_LOOKING_FOR_GROUP_SLOT; ++j) + 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(group) + if(flags & 0x2) + 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(GroupReference *itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) + for(uint8 j = 0; j < MAX_LOOKING_FOR_GROUP_SLOT; ++j) { - Player *member = itr->getSource(); - if(member && member->GetGUID() != plr->GetGUID()) - { - data.append(member->GetPackGUID()); // packed guid - data << member->getLevel(); // player level - } + data << uint32(plr->m_lookingForGroup.slots[j].entry | (plr->m_lookingForGroup.slots[j].type << 24)); } } - else - { - data << uint32(0x00); - } } - // fill count placeholders - data.put(4+4, number); - data.put(4+4+4,number); + data.put(count3_pos, number); // fill count placeholder SendPacket(&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"); - //recv_data.hexlike(); + recv_data.hexlike(); uint32 slot, temp, entry, type; + uint8 roles, unk1; - recv_data >> slot >> temp; + recv_data >> slot >> temp >> roles >> unk1; - entry = ( temp & 0xFFFF); - type = ( (temp >> 24) & 0xFFFF); + entry = ( temp & 0x00FFFFFF); + type = ( (temp >> 24) & 0x000000FF); if(slot >= MAX_LOOKING_FOR_GROUP_SLOT) 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); if(LookingForGroup_auto_join) 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); } diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index 27bbc8e59db..6a3b6fa860c 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -648,9 +648,6 @@ bool ChatHandler::HandleGameObjectMoveCommand(const char* args) map->Remove(obj,false); 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); } @@ -674,9 +671,6 @@ bool ChatHandler::HandleGameObjectMoveCommand(const char* args) map->Remove(obj,false); 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); } diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index 8816d25eeed..95730eb6a19 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -276,7 +276,7 @@ void WorldSession::HandleLogoutRequestOpcode( WorldPacket & /*recv_data*/ ) if( GetPlayer()->isInCombat() || //...is in combat GetPlayer()->duel || //...is in Duel //...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) ) ; data << (uint8)0xC; @@ -1001,6 +1001,11 @@ void WorldSession::HandleSetActionButtonOpcode(WorldPacket& recv_data) sLog.outDetail( "MISC: Added Macro %u into button %u", action, button ); 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) { 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 LevelPlayedTime = GetPlayer()->GetLevelPlayedTime(); - WorldPacket data(SMSG_PLAYED_TIME, 8); + WorldPacket data(SMSG_PLAYED_TIME, 9); data << TotalTimePlayed; data << LevelPlayedTime; + data << uint8(0); SendPacket(&data); } @@ -1174,76 +1180,20 @@ void WorldSession::HandleInspectOpcode(WorldPacket& recv_data) if(!plr) // wrong player return; - uint32 talent_points = 0x3D; - uint32 guid_size = plr->GetPackGUID().size(); - WorldPacket data(SMSG_INSPECT_TALENT, 4+talent_points); + WorldPacket data(SMSG_INSPECT_TALENT, 50); 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()) { - // find class talent tabs (all players have 3 talent tabs) - uint32 const* talentTabIds = GetTalentTabPages(plr->getClass()); - - uint32 talentTabPos = 0; // pos of first talent rank in tab including all prev tabs - for(uint32 i = 0; i < 3; ++i) - { - uint32 talentTabId = talentTabIds[i]; - - // fill by real data - 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(guid_size + 4 + curtalent_rank_slot); - val |= (1 << curtalent_rank_offset); - data.put(guid_size + 4 + curtalent_rank_slot, val & 0xFF); - } - - talentTabPos += GetTalentTabInspectBitSize(talentTabId); - } + plr->BuildPlayerTalentsInfoData(&data); + plr->BuildEnchantmentsInfoData(&data); + } + else + { + data << uint32(0); // unspentTalentPoints + data << uint8(0); // talentGroupCount + data << uint8(0); // talentGroupIndex + data << uint32(0); // slotUsedMask } SendPacket(&data); @@ -1471,7 +1421,7 @@ void WorldSession::HandleSetTitleOpcode( WorldPacket & recv_data ) recv_data >> title; // -1 at none - if(title > 0 && title < 128) + if(title > 0 && title < 192) { if(!GetPlayer()->HasTitle(title)) return; @@ -1592,7 +1542,7 @@ void WorldSession::HandleMoveSetCanFlyAckOpcode( WorldPacket & recv_data ) recv_data >> guid >> unk >> flags; - _player->SetUnitMovementFlags(flags); + _player->m_movementInfo.flags = flags; } void WorldSession::HandleRequestPetInfoOpcode( WorldPacket & /*recv_data */) diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index de51a14733f..a49f939d68c 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -296,7 +296,6 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) { plMover->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); plMover->m_movementInfo = movementInfo; - plMover->SetUnitMovementFlags(movementInfo.flags); plMover->UpdateFallInformationIfNeed(movementInfo,recv_data.GetOpcode()); if(plMover->isMovingOrTurning()) diff --git a/src/game/Object.cpp b/src/game/Object.cpp index dd8205db0b0..3200f688119 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -123,7 +123,7 @@ void Object::_Create( uint32 guidlow, uint32 entry, HighGuid guidhigh ) void Object::BuildMovementUpdateBlock(UpdateData * data, uint32 flags ) const { - ByteBuffer buf(50); + ByteBuffer buf(500); buf << uint8( UPDATETYPE_MOVEMENT ); buf.append(GetPackGUID()); @@ -139,7 +139,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) c return; uint8 updatetype = UPDATETYPE_CREATE_OBJECT; - uint8 flags = m_updateFlag; + uint16 flags = m_updateFlag; uint32 flags2 = 0; /** 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); - ByteBuffer buf(50); + ByteBuffer buf(500); buf << (uint8)updatetype; buf.append(GetPackGUID()); buf << (uint8)m_objectTypeId; @@ -221,7 +221,7 @@ void Object::SendUpdateToPlayer(Player* player) void Object::BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target) const { - ByteBuffer buf(50); + ByteBuffer buf(500); buf << (uint8) UPDATETYPE_VALUES; buf.append(GetPackGUID()); @@ -250,7 +250,7 @@ void Object::DestroyForPlayer(Player *target) const 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); @@ -258,7 +258,7 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2) if(((Creature*)this)->isVehicle()) unk_flags |= 0x20; // always allow pitch - *data << (uint8)flags; // update flags + *data << (uint16)flags; // update flags // 0x20 if (flags & UPDATEFLAG_LIVING) @@ -267,12 +267,12 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2) { case TYPEID_UNIT: { - flags2 = ((Unit*)this)->GetUnitMovementFlags(); + flags2 = ((Unit*)this)->isInFlight() ? (MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_LEVITATING) : MOVEMENTFLAG_NONE; } break; case TYPEID_PLAYER: { - flags2 = ((Player*)this)->GetUnitMovementFlags(); + flags2 = ((Player*)this)->m_movementInfo.GetMovementFlags(); if(((Player*)this)->GetTransport()) flags2 |= MOVEMENTFLAG_ONTRANSPORT; @@ -294,37 +294,19 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2) *data << uint32(flags2); // movement flags *data << uint16(unk_flags); // unknown 2.3.0 *data << uint32(getMSTime()); // time (in milliseconds) - } - // 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(); - } - } + // position + *data << ((WorldObject*)this)->GetPositionX(); + *data << ((WorldObject*)this)->GetPositionY(); + *data << ((WorldObject*)this)->GetPositionZ(); + *data << ((WorldObject*)this)->GetOrientation(); - // 0x20 - if(flags & UPDATEFLAG_LIVING) - { // 0x00000200 if(flags2 & MOVEMENTFLAG_ONTRANSPORT) { 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)->GetTransOffsetY(); *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()); - uint32 flags3 = 0x00000300; + uint32 flags3 = MONSTER_MOVE_SPLINE_FLY; *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; } - - if(flags3 & 0x20000) // probably guid there + else { - *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 - { - *data << (float)0; + if(flags3 & 0x10000) // probably guid there + { + *data << uint64(0); + } } 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(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 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 - /*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].y; *data << path.GetNodes()[poscount-1].z; - - // target position (path end) - /**data << ((Unit*)this)->GetPositionX(); - *data << ((Unit*)this)->GetPositionY(); - *data << ((Unit*)this)->GetPositionZ();*/ + } + } + 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(); + + if(GetTypeId() == TYPEID_CORPSE) + *data << float(((WorldObject*)this)->GetOrientation()); + else + *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 << 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 @@ -588,7 +611,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask // 2 specialized loops for speed optimization in non-unit 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 ) ) { @@ -639,7 +662,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask } 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 ) ) { @@ -671,7 +694,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask } 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 ) ) { @@ -684,7 +707,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask 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]) 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 { - for( uint16 index = 0; index < m_valuesCount; index ++ ) + for( uint16 index = 0; index < m_valuesCount; ++index ) { if(m_uint32Values_mirror[index]!= m_uint32Values[index]) updateMask->SetBit(index); @@ -741,7 +764,7 @@ void Object::_SetUpdateBits(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) updateMask->SetBit(index); @@ -860,7 +883,7 @@ void Object::SetUInt16Value( uint16 index, uint8 offset, uint16 value ) 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(value) << (offset * 16)); diff --git a/src/game/Object.h b/src/game/Object.h index 14b0eea7016..31b90f3520b 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -307,13 +307,13 @@ class MANGOS_DLL_SPEC Object virtual void _SetUpdateBits(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; uint16 m_objectType; uint8 m_objectTypeId; - uint8 m_updateFlag; + uint16 m_updateFlag; union { diff --git a/src/game/ObjectAccessor.cpp b/src/game/ObjectAccessor.cpp index b235e5a3c39..a03b6473f68 100644 --- a/src/game/ObjectAccessor.cpp +++ b/src/game/ObjectAccessor.cpp @@ -90,31 +90,36 @@ Object* ObjectAccessor::GetObjectByTypeMask(WorldObject const &p, uint64 guid, u if(typemask & TYPEMASK_PLAYER) { obj = FindPlayer(guid); - if(obj) return obj; + if(obj) + return obj; } if(typemask & TYPEMASK_UNIT) { obj = GetCreatureOrPetOrVehicle(p,guid); - if(obj) return obj; + if(obj) + return obj; } if(typemask & TYPEMASK_GAMEOBJECT) { obj = p.GetMap()->GetGameObject(guid); - if(obj) return obj; + if(obj) + return obj; } if(typemask & TYPEMASK_DYNAMICOBJECT) { obj = p.GetMap()->GetDynamicObject(guid); - if(obj) return obj; + if(obj) + return obj; } if(typemask & TYPEMASK_ITEM && p.GetTypeId() == TYPEID_PLAYER) { obj = ((Player const &)p).GetItemByGuid( guid ); - if(obj) return obj; + if(obj) + return obj; } return NULL; @@ -262,7 +267,7 @@ ObjectAccessor::RemoveCorpse(Corpse *corpse) 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; - objmgr.DeleteCorpseCellData(corpse->GetMapId(),cell_id,corpse->GetOwnerGUID()); + objmgr.DeleteCorpseCellData(corpse->GetMapId(), cell_id, corpse->GetOwnerGUID()); corpse->RemoveFromWorld(); i_player2corpse.erase(iter); @@ -281,7 +286,7 @@ ObjectAccessor::AddCorpse(Corpse *corpse) 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; - objmgr.AddCorpseCellData(corpse->GetMapId(),cell_id,corpse->GetOwnerGUID(),corpse->GetInstanceId()); + objmgr.AddCorpseCellData(corpse->GetMapId(), cell_id, corpse->GetOwnerGUID(), corpse->GetInstanceId()); } void @@ -289,19 +294,19 @@ ObjectAccessor::AddCorpsesToGrid(GridPair const& gridpair,GridType& grid,Map* ma { Guard guard(i_corpseGuard); 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) if (map->Instanceable()) { if (iter->second->GetInstanceId() == map->GetInstanceId()) { - grid.AddWorldObject(iter->second,iter->second->GetGUID()); + grid.AddWorldObject(iter->second, iter->second->GetGUID()); } } 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 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 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 corpse->DeleteFromDB(); @@ -342,7 +348,7 @@ ObjectAccessor::ConvertCorpseForPlayer(uint64 player_guid, bool insignia) bones = new Corpse; 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->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->SetMapId(corpse->GetMapId()); 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->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)) bones->SetUInt32Value(CORPSE_FIELD_ITEM + i, 0); @@ -422,7 +428,7 @@ ObjectAccessor::UpdateObjectVisibility(WorldObject *obj) CellPair p = MaNGOS::ComputeCellPair(obj->GetPositionX(), obj->GetPositionY()); Cell cell(p); - obj->GetMap()->UpdateObjectVisibility(obj,cell,p); + obj->GetMap()->UpdateObjectVisibility(obj, cell, p); } void ObjectAccessor::UpdateVisibilityForPlayer( Player* player ) @@ -431,8 +437,8 @@ void ObjectAccessor::UpdateVisibilityForPlayer( Player* player ) Cell cell(p); Map* m = player->GetMap(); - m->UpdatePlayerVisibility(player,cell,p); - m->UpdateObjectsVisibilityFor(player,cell,p); + m->UpdatePlayerVisibility(player, cell, p); + m->UpdateObjectsVisibilityFor(player, cell, p); } /// Define the static member of HashMapHolder diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index de564b6c977..fe8c8102ddb 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -119,6 +119,7 @@ ObjectMgr::ObjectMgr() m_hiPetNumber = 1; m_ItemTextId = 1; m_mailid = 1; + m_equipmentSetGuid = 1; m_guildId = 1; m_arenaTeamId = 1; m_auctionid = 1; @@ -5265,6 +5266,13 @@ void ObjectMgr::SetHighestGuids() 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" ); if (result) { @@ -5293,6 +5301,16 @@ uint32 ObjectMgr::GenerateAuctionID() 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() { if(m_guildId>=0xFFFFFFFE) diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h index 72465c48aa0..7aa3e303324 100644 --- a/src/game/ObjectMgr.h +++ b/src/game/ObjectMgr.h @@ -558,6 +558,7 @@ class ObjectMgr uint32 GenerateLowGuid(HighGuid guidhigh); uint32 GenerateArenaTeamId(); uint32 GenerateAuctionID(); + uint64 GenerateEquipmentSetGuid(); uint32 GenerateGuildId(); uint32 GenerateItemTextID(); uint32 GenerateMailID(); @@ -765,6 +766,7 @@ class ObjectMgr // first free id for selected id type uint32 m_arenaTeamId; uint32 m_auctionid; + uint64 m_equipmentSetGuid; uint32 m_guildId; uint32 m_ItemTextId; uint32 m_mailid; diff --git a/src/game/Opcodes.cpp b/src/game/Opcodes.cpp index 6e858b9d59a..51eb509d005 100644 --- a/src/game/Opcodes.cpp +++ b/src/game/Opcodes.cpp @@ -337,15 +337,15 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x134*/ { "SMSG_SPELL_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x135*/ { "SMSG_COOLDOWN_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*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 }, /*0x139*/ { "MSG_CHANNEL_START", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x13A*/ { "MSG_CHANNEL_UPDATE", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x13B*/ { "CMSG_CANCEL_CHANNELLING", STATUS_LOGGEDIN, &WorldSession::HandleCancelChanneling }, /*0x13C*/ { "SMSG_AI_REACTION", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x13D*/ { "CMSG_SET_SELECTION", STATUS_LOGGEDIN, &WorldSession::HandleSetSelectionOpcode }, - /*0x13E*/ { "CMSG_SET_TARGET_OBSOLETE", STATUS_LOGGEDIN, &WorldSession::HandleSetTargetOpcode }, - /*0x13F*/ { "CMSG_UNUSED", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x13E*/ { "CMSG_EQUIPMENT_SET_DELETE", STATUS_LOGGEDIN, &WorldSession::HandleEquipmentSetDelete }, + /*0x13F*/ { "CMSG_INSTANCE_LOCK_RESPONSE", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x140*/ { "CMSG_UNUSED2", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x141*/ { "CMSG_ATTACKSWING", STATUS_LOGGEDIN, &WorldSession::HandleAttackSwingOpcode }, /*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 }, /*0x149*/ { "SMSG_ATTACKSWING_CANT_ATTACK", 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 }, /*0x14D*/ { "SMSG_DAMAGE_TAKEN_OBSOLETE", 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 }, /*0x4A3*/ { "SMSG_SERVER_BUCK_DATA_START", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4A4*/ { "CMSG_QUERY_VEHICLE_STATUS", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4A5*/ { "SMSG_PET_GUIDS", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4A6*/ { "SMSG_CLIENTCACHE_VERSION", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4A7*/ { "UMSG_UNKNOWN_1191", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4A8*/ { "UMSG_UNKNOWN_1192", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4A9*/ { "UMSG_UNKNOWN_1193", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4AA*/ { "UMSG_UNKNOWN_1194", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4AB*/ { "UMSG_UNKNOWN_1195", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4A5*/ { "UMSG_UNKNOWN_1189", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4A6*/ { "SMSG_UNKNOWN_1190", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4A7*/ { "SMSG_UNKNOWN_1191", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4A8*/ { "CMSG_UNKNOWN_1192", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4A9*/ { "CMSG_EJECT_PASSENGER", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4AA*/ { "SMSG_PET_GUIDS", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4AB*/ { "SMSG_CLIENTCACHE_VERSION", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*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 }, }; diff --git a/src/game/Opcodes.h b/src/game/Opcodes.h index 52d111a0597..879a14719aa 100644 --- a/src/game/Opcodes.h +++ b/src/game/Opcodes.h @@ -345,15 +345,15 @@ enum Opcodes SMSG_SPELL_COOLDOWN = 0x134, SMSG_COOLDOWN_EVENT = 0x135, CMSG_CANCEL_AURA = 0x136, - SMSG_UPDATE_AURA_DURATION_OBSOLETE = 0x137, + SMSG_EQUIPMENT_SET_SAVED = 0x137, SMSG_PET_CAST_FAILED = 0x138, MSG_CHANNEL_START = 0x139, MSG_CHANNEL_UPDATE = 0x13A, CMSG_CANCEL_CHANNELLING = 0x13B, SMSG_AI_REACTION = 0x13C, CMSG_SET_SELECTION = 0x13D, - CMSG_SET_TARGET_OBSOLETE = 0x13E, - CMSG_UNUSED = 0x13F, + CMSG_EQUIPMENT_SET_DELETE = 0x13E, + CMSG_INSTANCE_LOCK_RESPONSE = 0x13F, CMSG_UNUSED2 = 0x140, CMSG_ATTACKSWING = 0x141, CMSG_ATTACKSTOP = 0x142, @@ -365,7 +365,7 @@ enum Opcodes SMSG_ATTACKSWING_DEADTARGET = 0x148, SMSG_ATTACKSWING_CANT_ATTACK = 0x149, SMSG_ATTACKERSTATEUPDATE = 0x14A, - SMSG_VICTIMSTATEUPDATE_OBSOLETE = 0x14B, + SMSG_BATTLEFIELD_PORT_DENIED = 0x14B, SMSG_DAMAGE_DONE_OBSOLETE = 0x14C, SMSG_DAMAGE_TAKEN_OBSOLETE = 0x14D, SMSG_CANCEL_COMBAT = 0x14E, @@ -693,7 +693,7 @@ enum Opcodes CMSG_BUYBACK_ITEM = 0x290, SMSG_SERVER_MESSAGE = 0x291, CMSG_MEETINGSTONE_JOIN = 0x292, - CMSG_MEETINGSTONE_LEAVE = 0x293, + CMSG_MEETINGSTONE_LEAVE = 0x293, // SMSG? CMSG_MEETINGSTONE_CHEAT = 0x294, SMSG_MEETINGSTONE_SETQUEUE = 0x295, CMSG_MEETINGSTONE_INFO = 0x296, @@ -1214,24 +1214,56 @@ enum Opcodes SMSG_PET_LEARNED_SPELL = 0x499, SMSG_PET_REMOVED_SPELL = 0x49A, CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE = 0x49B, - CMSG_HEARTH_AND_RESURRECT = 0x49C, - SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x49D, - SMSG_CRITERIA_DELETED = 0x49E, - SMSG_ACHIEVEMENT_DELETED = 0x49F, - CMSG_SERVER_INFO_QUERY = 0x4A0, - SMSG_SERVER_INFO_RESPONSE = 0x4A1, - CMSG_CHECK_LOGIN_CRITERIA = 0x4A2, - SMSG_SERVER_BUCK_DATA_START = 0x4A3, - CMSG_QUERY_VEHICLE_STATUS = 0x4A4, - SMSG_PET_GUIDS = 0x4A5, - SMSG_CLIENTCACHE_VERSION = 0x4A6, - UMSG_UNKNOWN_1191 = 0x4A7, - UMSG_UNKNOWN_1192 = 0x4A8, - UMSG_UNKNOWN_1193 = 0x4A9, - UMSG_UNKNOWN_1194 = 0x4AA, - UMSG_UNKNOWN_1195 = 0x4AB, - UMSG_UNKNOWN_1196 = 0x4AC, - NUM_MSG_TYPES = 0x4AD + CMSG_HEARTH_AND_RESURRECT = 0x49C, // not changed in 3.1 + SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x49D, // not changed 9626 + SMSG_CRITERIA_DELETED = 0x49E, // not changed 9626 + SMSG_ACHIEVEMENT_DELETED = 0x49F, // not changed 9626 + CMSG_SERVER_INFO_QUERY = 0x4A0, // not found + SMSG_SERVER_INFO_RESPONSE = 0x4A1, // not found + CMSG_CHECK_LOGIN_CRITERIA = 0x4A2, // not found + SMSG_SERVER_BUCK_DATA_START = 0x4A3, // not found + CMSG_QUERY_VEHICLE_STATUS = 0x4A4, // not found + UMSG_UNKNOWN_1189 = 0x4A5, // not found, old SMSG_PET_GUIDS + SMSG_UNKNOWN_1190 = 0x4A6, // smsg unk, old SMSG_CLIENTCACHE_VERSION + SMSG_UNKNOWN_1191 = 0x4A7, // smsg guid+uint32 (vehicle) + CMSG_UNKNOWN_1192 = 0x4A8, // cmsg uint64 + CMSG_EJECT_PASSENGER = 0x4A9, // cmsg uint64 + SMSG_PET_GUIDS = 0x4AA, // shifted+5 + SMSG_CLIENTCACHE_VERSION = 0x4AB, // shifted+5 + UMSG_UNKNOWN_1196 = 0x4AC, // not found + 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 diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp index 283ee468c24..012b1a7d855 100644 --- a/src/game/Pet.cpp +++ b/src/game/Pet.cpp @@ -308,6 +308,8 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool ((Player*)owner)->PetSpellInitialize(); if(((Player*)owner)->GetGroup()) ((Player*)owner)->SetGroupUpdateFlag(GROUP_UPDATE_PET); + + ((Player*)owner)->SendTalentsInfoData(true); } if (owner->GetTypeId() == TYPEID_PLAYER && getPetType() == HUNTER_PET) @@ -1641,6 +1643,13 @@ void Pet::InitTalentForLevel() resetTalents(true); } 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 diff --git a/src/game/PetHandler.cpp b/src/game/PetHandler.cpp index 4125b64a939..16313bd4e51 100644 --- a/src/game/PetHandler.cpp +++ b/src/game/PetHandler.cpp @@ -507,6 +507,7 @@ void WorldSession::HandlePetUnlearnOpcode(WorldPacket& recvPacket) return; } pet->resetTalents(); + _player->SendTalentsInfoData(true); } void WorldSession::HandlePetSpellAutocastOpcode( WorldPacket& recvPacket ) @@ -660,4 +661,31 @@ void WorldSession::HandlePetLearnTalent( WorldPacket & recv_data ) recv_data >> 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); } diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 61830d18e68..90f5de665d6 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -346,10 +346,6 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this), m_reputa PlayerTalkClass = new PlayerMenu( GetSession() ); m_currentBuybackSlot = BUYBACK_SLOT_START; - for ( int aX = 0 ; aX < 8 ; aX++ ) - m_Tutorials[ aX ] = 0x00; - m_TutorialsChanged = false; - m_DailyQuestChanged = false; m_lastDailyQuestTime = 0; @@ -426,6 +422,9 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this), m_reputa m_lastPotionId = 0; + m_activeSpec = 0; + m_specsCount = 0; + for (int i = 0; i < BASEMOD_END; ++i) { 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_TITLES1, 0 ); // 0=disabled + SetUInt64Value( PLAYER__FIELD_KNOWN_TITLES2, 0 ); // 0=disabled SetUInt32Value( PLAYER_CHOSEN_TITLE, 0 ); SetUInt32Value( PLAYER_FIELD_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++) { - 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); const ItemPrototype * proto = objmgr.GetItemPrototype(item_id); SpellItemEnchantmentEntry const *enchant = NULL; 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)) 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 - SetUnitMovementFlags(0); + m_movementInfo.flags = 0; if ((GetMapId() == mapid) && (!m_transport)) { @@ -2360,6 +2360,8 @@ void Player::InitTalentForLevel() else SetFreeTalentPoints(talentPointsForLevel-m_usedTalentCount); } + + SendTalentsInfoData(false); // update at client } void Player::InitStatsForLevel(bool reapplyMods) @@ -2540,7 +2542,7 @@ void Player::SendInitialSpells() if(!itr->second->active || itr->second->disabled) continue; - data << uint16(itr->first); + data << uint32(itr->first); data << uint16(0); // it's not slot id spellCount +=1; @@ -2560,7 +2562,7 @@ void Player::SendInitialSpells() if(itr->second.end > infTime) continue; - data << uint16(itr->first); + data << uint32(itr->first); time_t cooldown = 0; 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) { // update spell ranks in spellbook and action bar - WorldPacket data(SMSG_SUPERCEDED_SPELL, (4)); - data << uint16(spell_id); - data << uint16(next_active_spell_id); + WorldPacket data(SMSG_SUPERCEDED_SPELL, 4 + 4); + data << uint32(spell_id); + data << uint32(next_active_spell_id); GetSession()->SendPacket( &data ); } else { WorldPacket data(SMSG_REMOVED_SPELL, 4); - data << uint16(spell_id); + data << uint32(spell_id); 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 { - WorldPacket data(SMSG_SUPERCEDED_SPELL, (4)); - data << uint16(itr2->first); - data << uint16(spell_id); + WorldPacket data(SMSG_SUPERCEDED_SPELL, 4 + 4); + data << uint32(itr2->first); + data << uint32(spell_id); 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 { - WorldPacket data(SMSG_SUPERCEDED_SPELL, (4)); - data << uint16(spell_id); - data << uint16(itr2->first); + WorldPacket data(SMSG_SUPERCEDED_SPELL, 4 + 4); + data << uint32(spell_id); + data << uint32(itr2->first); 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) { // downgrade spell ranks in spellbook and action bar - WorldPacket data(SMSG_SUPERCEDED_SPELL, (4)); - data << uint16(spell_id); - data << uint16(prev_id); + WorldPacket data(SMSG_SUPERCEDED_SPELL, 4 + 4); + data << uint32(spell_id); + data << uint32(prev_id); GetSession()->SendPacket( &data ); prev_activate = true; } @@ -3240,7 +3242,7 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool update_action_bar_ if(!prev_activate) { WorldPacket data(SMSG_REMOVED_SPELL, 4); - data << uint16(spell_id); + data << uint32(spell_id); GetSession()->SendPacket(&data); } } @@ -3618,23 +3620,12 @@ void Player::InitVisibleBits() // Players visible items are not inventory stuff for(uint16 i = 0; i < EQUIPMENT_SLOT_END; ++i) { - uint32 offset = i * MAX_VISIBLE_ITEM_OFFSET; - - // item creator - updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_CREATOR + 0 + offset); - updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_CREATOR + 1 + offset); + uint32 offset = i * 2; // item entry - updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_0 + 0 + offset); - - // item enchantments - 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_VISIBLE_ITEM_1_ENTRYID + offset); + // enchant + updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + offset); } updateVisualBits.SetBit(PLAYER_CHOSEN_TITLE); @@ -3659,7 +3650,7 @@ void Player::BuildCreateUpdateBlockForPlayer( UpdateData *data, Player *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) continue; @@ -3692,7 +3683,7 @@ void Player::DestroyForPlayer( Player *target ) const 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) 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_achievement 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(); //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() ); - 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) { ActionButtonList::const_iterator itr = m_actionButtons.find(button); @@ -8150,7 +8143,7 @@ uint8 Player::CanUnequipItems( uint32 item, uint32 count ) const 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 ); 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 ) 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 ); if( pItem && pItem != skipItem && pItem->GetEntry() == item ) @@ -8252,7 +8245,7 @@ Item* Player::GetItemByGuid( uint64 guid ) const if( pItem && pItem->GetGUID() == guid ) 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 ); if( pItem && pItem->GetGUID() == guid ) @@ -8298,7 +8291,7 @@ Item* Player::GetItemByPos( uint16 pos ) const Item* Player::GetItemByPos( uint8 bag, uint8 slot ) const { - if( bag == INVENTORY_SLOT_BAG_0 && ( slot < BANK_SLOT_BAG_END || 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]; else if(bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_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; if( bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END ) 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 false; } @@ -8489,7 +8482,7 @@ bool Player::HasItemCount( uint32 item, uint32 count, bool inBankAlso ) const 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 ); if( pItem && pItem->GetEntry() == item ) @@ -8656,7 +8649,7 @@ bool Player::HasItemTotemCategory( uint32 TotemCategory ) const if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory )) 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 ); 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)) 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 if(slot >= CURRENCYTOKEN_SLOT_START && slot < CURRENCYTOKEN_SLOT_END && !(pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS)) 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 if(slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END || slot >= PLAYER_SLOT_END) 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 { - 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(no_space_count) @@ -9127,7 +9112,7 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3 // search stack for merge to 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(no_space_count) @@ -10348,30 +10333,14 @@ void Player::SetVisibleItemSlot(uint8 slot, Item *pItem) { if(pItem) { - SetUInt64Value(PLAYER_VISIBLE_ITEM_1_CREATOR + (slot * MAX_VISIBLE_ITEM_OFFSET), pItem->GetUInt64Value(ITEM_FIELD_CREATOR)); - - int VisibleBase = PLAYER_VISIBLE_ITEM_1_0 + (slot * MAX_VISIBLE_ITEM_OFFSET); - 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()); + SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENTRYID + (slot * 2), pItem->GetEntry()); + SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (slot * 2), 0, pItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT)); + SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (slot * 2), 1, pItem->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT)); } else { - SetUInt64Value(PLAYER_VISIBLE_ITEM_1_CREATOR + (slot * MAX_VISIBLE_ITEM_OFFSET), 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); + SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENTRYID + (slot * 2), 0); + SetUInt32Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (slot * 2), 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 )) { @@ -10726,7 +10695,7 @@ void Player::DestroyZoneLimitedItem( bool update, uint32 new_zone ) if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone)) 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 (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone)) 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 - if(slot < MAX_INSPECTED_ENCHANTMENT_SLOT) - { - int VisibleBase = PLAYER_VISIBLE_ITEM_1_0 + (item->GetSlot() * MAX_VISIBLE_ITEM_OFFSET); - SetUInt32Value(VisibleBase + 1 + slot, apply? item->GetEnchantmentId(slot) : 0); - } + if(slot == PERM_ENCHANTMENT_SLOT) + SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), 0, 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) { @@ -11957,9 +11927,9 @@ void Player::PrepareQuestMenu( uint64 guid ) uint32 quest_id = i->second; QuestStatus status = GetQuestStatus( 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 ) - qm.AddMenuItem(quest_id, DIALOG_STATUS_INCOMPLETE); + qm.AddMenuItem(quest_id, DIALOG_STATUS_UNK2); else if (status == QUEST_STATUS_AVAILABLE ) qm.AddMenuItem(quest_id, DIALOG_STATUS_CHAT); } @@ -11973,9 +11943,9 @@ void Player::PrepareQuestMenu( uint64 guid ) QuestStatus status = GetQuestStatus( quest_id ); 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 ) ) - 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( 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 ); - else if( status == DIALOG_STATUS_INCOMPLETE ) - PlayerTalkClass->SendQuestGiverRequestItems( pQuest, guid, false, true ); // Send completable on repeatable quest if player don't have quest else if( pQuest->IsRepeatable() && !pQuest->IsDaily() ) PlayerTalkClass->SendQuestGiverRequestItems( pQuest, guid, CanCompleteRepeatableQuest(pQuest), true ); @@ -13799,6 +13769,38 @@ void Player::_LoadArenaTeamInfo(QueryResult *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) { 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(); learnDefaultSpells(); - _LoadTutorials(holder->GetResult(PLAYER_LOGIN_QUERY_LOADTUTORIALS)); - // must be before inventory (some items required reputation check) 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.CheckAllAchievementCriteria(); + + _LoadEquipmentSets(holder->GetResult(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS)); + 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) { //QueryResult *result = CharacterDatabase.PQuery("SELECT leaderGuid FROM group_member WHERE memberGuid='%u'", GetGUIDLow()); @@ -15502,13 +15484,14 @@ void Player::SaveToDB() _SaveInventory(); _SaveQuestStatus(); _SaveDailyQuestStatus(); - _SaveTutorials(); _SaveSpells(); _SaveSpellCooldowns(); _SaveActions(); _SaveAuras(); m_achievementMgr.SaveToDB(); m_reputationMgr.SaveToDB(); + _SaveEquipmentSets(); + GetSession()->SaveTutorialsData(); // changed only while character in game 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 { if(!sLog.IsOutDebug()) // optimize disabled debug output @@ -16260,9 +16216,8 @@ void Player::RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent) if(pet->isControlled()) { - WorldPacket data(SMSG_PET_SPELLS, 8+4); + WorldPacket data(SMSG_PET_SPELLS, 8); data << uint64(0); - data << uint32(0); GetSession()->SendPacket(&data); if(GetGroup()) @@ -16405,9 +16360,9 @@ void Player::PetSpellInitialize() 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 << 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 << 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; - data << uint16(itr->first); // spellid + data << uint32(itr->first); // spellid data << uint16(0); // spell category? data << uint32(cooldown); // 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; - data << uint16(itr->first); // spellid + data << uint32(itr->first); // spellid data << uint16(0); // spell category? data << uint32(0); // cooldown data << uint32(cooldown); // category cooldown @@ -16479,9 +16434,9 @@ void Player::PossessSpellInitialize() 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 << uint32(0); + data << uint16(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 << uint32(0); + data << uint16(0); data << uint32(0); if(charm->GetTypeId() != TYPEID_PLAYER) @@ -17338,8 +17293,8 @@ void Player::UpdateHomebindTime(uint32 time) { if (time >= m_HomebindTimer) { - // teleport to homebind location - TeleportTo(m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, GetOrientation()); + // teleport to nearest graveyard + RepopAtGraveyard(); } else m_HomebindTimer -= time; @@ -17966,6 +17921,8 @@ void Player::SendInitialPacketsBeforeAddToMap() data << uint32(0); // unknown, may be rest state time or experience GetSession()->SendPacket(&data); + GetSocial()->SendSocialList(); + // Homebind data.Initialize(SMSG_BINDPOINTUPDATE, 5*4); data << m_homebindX << m_homebindY << m_homebindZ; @@ -17976,12 +17933,7 @@ void Player::SendInitialPacketsBeforeAddToMap() // SMSG_SET_PROFICIENCY // SMSG_UPDATE_AURA_DURATION - // tutorial stuff - data.Initialize(SMSG_TUTORIAL_FLAGS, 8*4); - for (int i = 0; i < 8; ++i) - data << uint32( GetTutorialInt(i) ); - GetSession()->SendPacket(&data); - + SendTalentsInfoData(false); SendInitialSpells(); data.Initialize(SMSG_SEND_UNLEARN_SPELLS, 4); @@ -17997,16 +17949,17 @@ void Player::SendInitialPacketsBeforeAddToMap() GetZoneAndAreaId(newzone,newarea); 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 << (float)0.01666667f; // game speed + data << uint32(0); // added in 3.1.2 GetSession()->SendPacket( &data ); // 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()) - AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); + m_movementInfo.flags |= MOVEMENTFLAG_FLYING2; m_mover = this; } @@ -19324,9 +19277,9 @@ void Player::EnterVehicle(Vehicle *vehicle) data << uint32(0); // fall time 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 << uint32(0); + data << uint16(0); data << uint32(0); data << uint32(0x00000101); @@ -19363,9 +19316,8 @@ void Player::ExitVehicle(Vehicle *vehicle) data << uint32(0); // fall time GetSession()->SendPacket(&data); - data.Initialize(SMSG_PET_SPELLS, 8+4); + data.Initialize(SMSG_PET_SPELLS, 8); data << uint64(0); - data << uint32(0); GetSession()->SendPacket(&data); // maybe called at dummy aura remove? @@ -19388,7 +19340,7 @@ bool Player::isTotalImmune() bool Player::HasTitle(uint32 bitIndex) { - if (bitIndex > 128) + if (bitIndex > 192) return false; uint32 fieldIndexOffset = bitIndex / 32; @@ -20024,3 +19976,314 @@ bool Player::canSeeSpellClickOn(Creature const *c) const } 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(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(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(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(enchantmentMaskPos, enchantmentMask); + + *data << uint16(0); // ? + *data << uint8(0); // PGUID! + *data << uint32(0); // seed? + } + + data->put(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(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); +} \ No newline at end of file diff --git a/src/game/Player.h b/src/game/Player.h index a22e7f8aa0e..da67355f05b 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -352,6 +352,7 @@ struct LookingForGroup LookingForGroupSlot slots[MAX_LOOKING_FOR_GROUP_SLOT]; LookingForGroupSlot more; std::string comment; + uint8 roles; }; enum PlayerMovementType @@ -542,7 +543,7 @@ enum PlayerSlots // first slot for item stored (in any way in player m_items data) PLAYER_SLOT_START = 0, // last+1 slot for item stored (in any way in player m_items data) - PLAYER_SLOT_END = 200, + PLAYER_SLOT_END = 150, PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START) }; @@ -610,24 +611,39 @@ enum KeyRingSlots // 32 slots KEYRING_SLOT_END = 118 }; -enum VanityPetSlots // 18 slots +enum CurrencyTokenSlots // 32 slots { - VANITYPET_SLOT_START = 118, // not use, vanity pets stored as spells - VANITYPET_SLOT_END = 136 // not allowed any content in. + CURRENCYTOKEN_SLOT_START = 118, + CURRENCYTOKEN_SLOT_END = 150 }; -enum CurrencyTokenSlots // 32 slots +enum EquipmentSetUpdateState { - CURRENCYTOKEN_SLOT_START = 136, - CURRENCYTOKEN_SLOT_END = 168 + EQUIPMENT_SET_UNCHANGED = 0, + EQUIPMENT_SET_CHANGED = 1, + EQUIPMENT_SET_NEW = 2, + EQUIPMENT_SET_DELETED = 3 }; -enum QuestBagSlots // 32 slots +struct EquipmentSet { - QUESTBAG_SLOT_START = 168, // not use - QUESTBAG_SLOT_END = 200 // not allowed any content in. + 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 EquipmentSets; + struct ItemPosCount { ItemPosCount(uint16 _pos, uint32 _count) : pos(_pos), count(_count) {} @@ -646,15 +662,19 @@ enum TradeSlots enum TransferAbortReason { - TRANSFER_ABORT_ERROR = 0x00, - TRANSFER_ABORT_MAX_PLAYERS = 0x01, // Transfer Aborted: instance is full - TRANSFER_ABORT_NOT_FOUND = 0x02, // Transfer Aborted: instance not found - TRANSFER_ABORT_TOO_MANY_INSTANCES = 0x03, // You have entered too many instances recently. - TRANSFER_ABORT_ZONE_IN_COMBAT = 0x05, // Unable to zone in while an encounter is in progress. - TRANSFER_ABORT_INSUF_EXPAN_LVL = 0x06, // You must have expansion installed to access this area. - TRANSFER_ABORT_DIFFICULTY = 0x07, // difficulty mode is not available for %s. - TRANSFER_ABORT_UNIQUE_MESSAGE = 0x08, // Until you've escaped TLK's grasp, you cannot leave this place! - TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES = 0x09 // Additional instances cannot be launched, please try again later. + TRANSFER_ABORT_NONE = 0x00, + TRANSFER_ABORT_ERROR = 0x01, + TRANSFER_ABORT_MAX_PLAYERS = 0x02, // Transfer Aborted: instance is full + TRANSFER_ABORT_NOT_FOUND = 0x03, // Transfer Aborted: instance not found + TRANSFER_ABORT_TOO_MANY_INSTANCES = 0x04, // You have entered too many instances recently. + TRANSFER_ABORT_ZONE_IN_COMBAT = 0x06, // Unable to zone in while an encounter is in progress. + TRANSFER_ABORT_INSUF_EXPAN_LVL = 0x07, // You must have expansion installed to access this area. + TRANSFER_ABORT_DIFFICULTY = 0x08, // difficulty mode is not available for %s. + 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 @@ -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; 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 @@ -754,20 +778,20 @@ enum PlayerLoginQueryIndex PLAYER_LOGIN_QUERY_LOADSPELLS = 4, PLAYER_LOGIN_QUERY_LOADQUESTSTATUS = 5, PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS = 6, - PLAYER_LOGIN_QUERY_LOADTUTORIALS = 7, // common for all characters for some account at specific realm - PLAYER_LOGIN_QUERY_LOADREPUTATION = 8, - PLAYER_LOGIN_QUERY_LOADINVENTORY = 9, - PLAYER_LOGIN_QUERY_LOADACTIONS = 10, - PLAYER_LOGIN_QUERY_LOADMAILCOUNT = 11, - PLAYER_LOGIN_QUERY_LOADMAILDATE = 12, - PLAYER_LOGIN_QUERY_LOADSOCIALLIST = 13, - PLAYER_LOGIN_QUERY_LOADHOMEBIND = 14, - PLAYER_LOGIN_QUERY_LOADSPELLCOOLDOWNS = 15, - PLAYER_LOGIN_QUERY_LOADDECLINEDNAMES = 16, - PLAYER_LOGIN_QUERY_LOADGUILD = 17, - PLAYER_LOGIN_QUERY_LOADARENAINFO = 18, - PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS = 19, - PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS = 20, + PLAYER_LOGIN_QUERY_LOADREPUTATION = 7, + PLAYER_LOGIN_QUERY_LOADINVENTORY = 8, + PLAYER_LOGIN_QUERY_LOADACTIONS = 9, + PLAYER_LOGIN_QUERY_LOADMAILCOUNT = 10, + PLAYER_LOGIN_QUERY_LOADMAILDATE = 11, + PLAYER_LOGIN_QUERY_LOADSOCIALLIST = 12, + PLAYER_LOGIN_QUERY_LOADHOMEBIND = 13, + PLAYER_LOGIN_QUERY_LOADSPELLCOOLDOWNS = 14, + PLAYER_LOGIN_QUERY_LOADDECLINEDNAMES = 15, + PLAYER_LOGIN_QUERY_LOADGUILD = 16, + PLAYER_LOGIN_QUERY_LOADARENAINFO = 17, + PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS = 18, + PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS = 19, + PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS = 20, 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,bool apply); void SendEnchantmentDurations(); + void BuildEnchantmentsInfoData(WorldPacket *data); void AddItemDurations(Item *item); void RemoveItemDurations(Item *item); void SendItemDurations(); @@ -1288,22 +1313,6 @@ class MANGOS_DLL_SPEC Player : public Unit 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; }; const uint64& GetSelection( ) const { return m_curSelection; } @@ -1386,12 +1395,21 @@ class MANGOS_DLL_SPEC Player : public Unit bool resetTalents(bool no_cost = false); uint32 resetTalentsCost() const; void InitTalentForLevel(); - + void BuildPlayerTalentsInfoData(WorldPacket *data); + void BuildPetTalentsInfoData(WorldPacket *data); + void SendTalentsInfoData(bool pet); void LearnTalent(uint32 talentId, uint32 talentRank); void LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank); 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 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); } @@ -1760,6 +1778,10 @@ class MANGOS_DLL_SPEC Player : public Unit void CastItemCombatSpell(Item *item,Unit* Target, WeaponAttackType attType); 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 SendUpdateWorldState(uint32 Field, uint32 Value); void SendDirectMessage(WorldPacket *data); @@ -1921,11 +1943,11 @@ class MANGOS_DLL_SPEC Player : public Unit } void HandleFall(MovementInfo const& movementInfo); - bool isMoving() const { return HasUnitMovementFlag(movementFlagsMask); } - bool isMovingOrTurning() const { return HasUnitMovementFlag(movementOrTurningFlagsMask); } + bool isMoving() const { return m_movementInfo.HasMovementFlag(movementFlagsMask); } + bool isMovingOrTurning() const { return m_movementInfo.HasMovementFlag(movementOrTurningFlagsMask); } - bool CanFly() const { return HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); } - bool IsFlying() const { return HasUnitMovementFlag(MOVEMENTFLAG_FLYING); } + bool CanFly() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); } + bool IsFlying() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FLYING); } bool IsAllowUseFlyMountsHere() const; void SetClientControl(Unit* target, uint8 allowMove); @@ -2125,11 +2147,11 @@ class MANGOS_DLL_SPEC Player : public Unit void _LoadGroup(QueryResult *result); void _LoadSkills(); void _LoadSpells(QueryResult *result); - void _LoadTutorials(QueryResult *result); void _LoadFriendList(QueryResult *result); bool _LoadHomeBind(QueryResult *result); void _LoadDeclinedNames(QueryResult *result); void _LoadArenaTeamInfo(QueryResult *result); + void _LoadEquipmentSets(QueryResult *result); /*********************************************************/ /*** SAVE SYSTEM ***/ @@ -2142,7 +2164,7 @@ class MANGOS_DLL_SPEC Player : public Unit void _SaveQuestStatus(); void _SaveDailyQuestStatus(); void _SaveSpells(); - void _SaveTutorials(); + void _SaveEquipmentSets(); void _SetCreateBits(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; uint32 m_lastPotionId; // last used health/mana potion in combat, that block next potion use + uint32 m_activeSpec; + uint32 m_specsCount; + ActionButtonList m_actionButtons; float m_auraBaseMod[BASEMOD_END][MOD_END]; @@ -2229,9 +2254,6 @@ class MANGOS_DLL_SPEC Player : public Unit time_t m_nextThinkTime; - uint32 m_Tutorials[8]; - bool m_TutorialsChanged; - bool m_DailyQuestChanged; time_t m_lastDailyQuestTime; @@ -2297,6 +2319,7 @@ class MANGOS_DLL_SPEC Player : public Unit DeclinedName *m_declinedname; Runes *m_runes; + EquipmentSets m_EquipmentSets; private: // 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; diff --git a/src/game/PointMovementGenerator.cpp b/src/game/PointMovementGenerator.cpp index 54ee6ede740..57d6f058bd5 100644 --- a/src/game/PointMovementGenerator.cpp +++ b/src/game/PointMovementGenerator.cpp @@ -33,7 +33,7 @@ void PointMovementGenerator::Initialize(T &unit) i_destinationHolder.SetDestination(traveller,i_x,i_y,i_z); if (unit.GetTypeId() == TYPEID_UNIT && ((Creature*)&unit)->canFly()) - unit.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); + unit.AddUnitMovementFlag(MONSTER_MOVE_FLY); } template diff --git a/src/game/QueryHandler.cpp b/src/game/QueryHandler.cpp index 4422d6a047a..0b12493da56 100644 --- a/src/game/QueryHandler.cpp +++ b/src/game/QueryHandler.cpp @@ -38,13 +38,14 @@ void WorldSession::SendNameQueryOpcode(Player *p) return; // guess size - WorldPacket data( SMSG_NAME_QUERY_RESPONSE, (8+1+4+4+4+10) ); - data << p->GetGUID(); - data << p->GetName(); + WorldPacket data( SMSG_NAME_QUERY_RESPONSE, (8+1+1+1+1+1+10) ); + data.append(p->GetPackGUID()); // player guid + data << uint8(0); // added in 3.1 + data << p->GetName(); // played name data << uint8(0); // realm name for cross realm BG usage - data << uint32(p->getRace()); - data << uint32(p->getGender()); - data << uint32(p->getClass()); + data << uint8(p->getRace()); + data << uint8(p->getGender()); + data << uint8(p->getClass()); if(DeclinedName const* names = p->GetDeclinedNames()) { data << uint8(1); // is declined @@ -97,13 +98,14 @@ void WorldSession::SendNameQueryOpcodeFromDBCallBack(QueryResult *result, uint32 field = fields[2].GetUInt32(); // guess size - WorldPacket data( SMSG_NAME_QUERY_RESPONSE, (8+1+4+4+4+10) ); - data << MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER); + WorldPacket data( SMSG_NAME_QUERY_RESPONSE, (8+1+1+1+1+1+1+10) ); + data.appendPackGUID(MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER)); + data << uint8(0); // added in 3.1 data << name; data << uint8(0); - data << uint32(field & 0xFF); - data << uint32((field >> 16) & 0xFF); - data << uint32((field >> 8) & 0xFF); + data << uint8(field & 0xFF); + data << uint8((field >> 16) & 0xFF); + data << uint8((field >> 8) & 0xFF); // if the first declined name field (3) is empty, the rest must be too 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->family); // CreatureFamily.dbc 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_H); // modelid_female1 ? 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->unk17); // unk 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 ); 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 << 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 << uint8(0); // 2.0.3, string + data << info->unk1; // 2.0.3, string data.append(info->raw.data, 24); data << float(info->size); // go size + for(uint32 i = 0; i < 4; ++i) + data << uint32(info->questItems[i]); // itemId[4], quest drop SendPacket( &data ); sLog.outDebug( "WORLD: Sent SMSG_GAMEOBJECT_QUERY_RESPONSE" ); } diff --git a/src/game/QuestDef.h b/src/game/QuestDef.h index a22c535b9fc..6a751c8bc9e 100644 --- a/src/game/QuestDef.h +++ b/src/game/QuestDef.h @@ -104,13 +104,15 @@ enum __QuestGiverStatus { DIALOG_STATUS_NONE = 0, DIALOG_STATUS_UNAVAILABLE = 1, - DIALOG_STATUS_CHAT = 2, - DIALOG_STATUS_INCOMPLETE = 3, - DIALOG_STATUS_REWARD_REP = 4, - DIALOG_STATUS_AVAILABLE_REP = 5, - DIALOG_STATUS_AVAILABLE = 6, - DIALOG_STATUS_REWARD2 = 7, // not yellow dot on minimap - DIALOG_STATUS_REWARD = 8 // yellow dot on minimap + DIALOG_STATUS_CHAT = 2, // 3.1 - may be changed + DIALOG_STATUS_UNK1 = 3, // 3.1 + DIALOG_STATUS_UNK2 = 4, // 3.1 + DIALOG_STATUS_INCOMPLETE = 5, + DIALOG_STATUS_REWARD_REP = 6, + DIALOG_STATUS_AVAILABLE_REP = 7, + DIALOG_STATUS_AVAILABLE = 8, + DIALOG_STATUS_REWARD2 = 9, // no yellow dot on minimap + DIALOG_STATUS_REWARD = 10 // yellow dot on minimap }; enum __QuestFlags diff --git a/src/game/QuestHandler.cpp b/src/game/QuestHandler.cpp index 317326c8968..b9baa025a94 100644 --- a/src/game/QuestHandler.cpp +++ b/src/game/QuestHandler.cpp @@ -110,16 +110,17 @@ void WorldSession::HandleQuestgiverHelloOpcode( 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; uint32 quest; - recv_data >> guid >> quest; + uint32 unk1; + recv_data >> guid >> quest >> unk1; if(!GetPlayer()->isAlive()) 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); @@ -206,12 +207,13 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode( 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; uint32 quest; - recv_data >> guid >> quest; - sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_QUERY_QUEST npc = %u, quest = %u", uint32(GUID_LOPART(guid)), quest ); + uint8 unk1; + 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 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 ) { - CHECK_PACKET_SIZE(recv_data,4); + CHECK_PACKET_SIZE(recv_data, 4); uint32 quest; recv_data >> quest; @@ -409,7 +411,12 @@ void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recv_data) _player->PlayerTalkClass->SendQuestGiverRequestItems(pQuest, guid, _player->CanRewardQuest(pQuest,false), false); } 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); + } } } diff --git a/src/game/RandomMovementGenerator.cpp b/src/game/RandomMovementGenerator.cpp index de9d76fe860..c2ff8e85ddc 100644 --- a/src/game/RandomMovementGenerator.cpp +++ b/src/game/RandomMovementGenerator.cpp @@ -91,13 +91,13 @@ RandomMovementGenerator::_setRandomLocation(Creature &creature) if (is_air_ok) { 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 { 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::Initialize(Creature &creature) return; if (creature.canFly()) - creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); + creature.AddUnitMovementFlag(MONSTER_MOVE_FLY); 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); } @@ -148,14 +148,14 @@ RandomMovementGenerator::Update(Creature &creature, const uint32 &diff if(i_nextMoveTime.Passed()) { if (creature.canFly()) - creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); + creature.AddUnitMovementFlag(MONSTER_MOVE_FLY); 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); } 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); } } diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index e304f2c7c02..124f970f40c 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -680,7 +680,10 @@ enum SpellEffects SPELL_EFFECT_CREATE_ITEM_2 = 157, SPELL_EFFECT_MILLING = 158, 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 @@ -1100,7 +1103,7 @@ enum GameobjectTypes GAMEOBJECT_TYPE_FISHINGNODE = 17, GAMEOBJECT_TYPE_SUMMONING_RITUAL = 18, GAMEOBJECT_TYPE_MAILBOX = 19, - GAMEOBJECT_TYPE_AUCTIONHOUSE = 20, + GAMEOBJECT_TYPE_DO_NOT_USE = 20, GAMEOBJECT_TYPE_GUARDPOST = 21, GAMEOBJECT_TYPE_SPELLCASTER = 22, GAMEOBJECT_TYPE_MEETINGSTONE = 23, @@ -1108,7 +1111,7 @@ enum GameobjectTypes GAMEOBJECT_TYPE_FISHINGHOLE = 25, GAMEOBJECT_TYPE_FLAGDROP = 26, GAMEOBJECT_TYPE_MINI_GAME = 27, - GAMEOBJECT_TYPE_LOTTERY_KIOSK = 28, + GAMEOBJECT_TYPE_DO_NOT_USE_2 = 28, GAMEOBJECT_TYPE_CAPTURE_POINT = 29, GAMEOBJECT_TYPE_AURA_GENERATOR = 30, GAMEOBJECT_TYPE_DUNGEON_DIFFICULTY = 31, diff --git a/src/game/SkillHandler.cpp b/src/game/SkillHandler.cpp index 734bf36e65b..81c0a12178a 100644 --- a/src/game/SkillHandler.cpp +++ b/src/game/SkillHandler.cpp @@ -34,6 +34,30 @@ void WorldSession::HandleLearnTalentOpcode( WorldPacket & recv_data ) recv_data >> 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 ) @@ -64,6 +88,7 @@ void WorldSession::HandleTalentWipeConfirmOpcode( WorldPacket & recv_data ) return; } + _player->SendTalentsInfoData(false); unit->CastSpell(_player, 14867, true); //spell: "Untalent Visual Effect" } diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index cfdb2978be1..338c00eaa0c 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -3227,7 +3227,6 @@ void Spell::SendLogExecute() data << uint32(0); break; case SPELL_EFFECT_OPEN_LOCK: - case SPELL_EFFECT_OPEN_LOCK_ITEM: if(Item *item = m_targets.getItemTarget()) data.append(item->GetPackGUID()); else @@ -3753,7 +3752,7 @@ SpellCastResult Spell::CheckCast(bool strict) 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 - 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) ) return SPELL_FAILED_MOVING; } diff --git a/src/game/SpellAuraDefines.h b/src/game/SpellAuraDefines.h index fb1156747fe..bd191386775 100644 --- a/src/game/SpellAuraDefines.h +++ b/src/game/SpellAuraDefines.h @@ -331,7 +331,13 @@ enum AuraType SPELL_AURA_286, SPELL_AURA_DEFLECT_SPELLS, 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 diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 1c3cf833204..321c18dbfe1 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -339,6 +339,12 @@ pAuraHandler AuraHandler[TOTAL_AURAS]= &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::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 }; @@ -3120,9 +3126,8 @@ void Aura::HandleModPossess(bool apply, bool Real) ((Player*)caster)->SetFarSightGUID(0); ((Player*)caster)->SetClientControl(m_target, 0); - WorldPacket data(SMSG_PET_SPELLS, 8+4); + WorldPacket data(SMSG_PET_SPELLS, 8); data << uint64(0); - data << uint32(0); ((Player*)caster)->GetSession()->SendPacket(&data); } @@ -3168,7 +3173,7 @@ void Aura::HandleModPossessPet(bool apply, bool Real) { pet->AttackStop(); 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) { - WorldPacket data(SMSG_PET_SPELLS, 8+4); + WorldPacket data(SMSG_PET_SPELLS, 8); data << uint64(0); - data << uint32(0); ((Player*)caster)->GetSession()->SendPacket(&data); } if(m_target->GetTypeId() == TYPEID_UNIT) @@ -3413,7 +3417,7 @@ void Aura::HandleAuraModStun(bool apply, bool Real) ((Creature*)m_target)->StopMoving(); 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 } @@ -3697,7 +3701,7 @@ void Aura::HandleAuraModRoot(bool apply, bool Real) m_target->SendMessageToSet(&data, true); //Clear unit movement flags - m_target->SetUnitMovementFlags(0); + ((Player*)m_target)->m_movementInfo.flags = 0; } else ((Creature *)m_target)->StopMoving(); diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index dd501c0cd54..8ecbd2145eb 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -216,7 +216,10 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectEnchantItemPrismatic, //156 SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC &Spell::EffectCreateItem2, //157 SPELL_EFFECT_CREATE_ITEM_2 create/learn item/spell for profession &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*/) @@ -5440,6 +5443,7 @@ void Spell::EffectApplyGlyph(uint32 i) player->CastSpell(m_caster, gp->SpellId, true); player->SetGlyph(m_glyphIndex, glyph); + player->SendTalentsInfoData(false); } } } @@ -5910,7 +5914,7 @@ void Spell::EffectCharge(uint32 /*i*/) ((Creature *)unitTarget)->StopMoving(); // 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) m_caster->GetMap()->CreatureRelocation((Creature*)m_caster,x,y,z,m_caster->GetOrientation()); diff --git a/src/game/TargetedMovementGenerator.cpp b/src/game/TargetedMovementGenerator.cpp index 45d72e5a904..6643f2a2641 100644 --- a/src/game/TargetedMovementGenerator.cpp +++ b/src/game/TargetedMovementGenerator.cpp @@ -85,7 +85,7 @@ TargetedMovementGenerator::_setTargetLocation(T &owner) i_destinationHolder.SetDestination(traveller, x, y, z); owner.addUnitState(UNIT_STAT_CHASE); if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly()) - owner.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); + owner.AddUnitMovementFlag(MONSTER_MOVE_FLY); } template @@ -93,12 +93,12 @@ void TargetedMovementGenerator::Initialize(T &owner) { if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->HasSearchedAssistance()) - owner.AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); + owner.AddUnitMovementFlag(MONSTER_MOVE_WALK); else - owner.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); + owner.RemoveUnitMovementFlag(MONSTER_MOVE_WALK); if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly()) - owner.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); + owner.AddUnitMovementFlag(MONSTER_MOVE_FLY); _setTargetLocation(owner); } @@ -150,7 +150,7 @@ TargetedMovementGenerator::Update(T &owner, const uint32 & time_diff) { owner.addUnitState(UNIT_STAT_CHASE); if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly()) - owner.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); + owner.AddUnitMovementFlag(MONSTER_MOVE_FLY); i_destinationHolder.StartTravel(traveller); return true; diff --git a/src/game/Transports.cpp b/src/game/Transports.cpp index 32bdf56acec..8ea355b8d86 100644 --- a/src/game/Transports.cpp +++ b/src/game/Transports.cpp @@ -132,8 +132,7 @@ void MapManager::LoadTransports() Transport::Transport() : GameObject() { - // 2.3.2 - 0x5A - m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION); + m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_ROTATION); } bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress, uint32 dynflags) diff --git a/src/game/Traveller.h b/src/game/Traveller.h index c0531631c21..0e98d8c0df4 100644 --- a/src/game/Traveller.h +++ b/src/game/Traveller.h @@ -71,9 +71,9 @@ inline uint32 Traveller::GetTotalTrevelTimeTo(float x, float y, float z) template<> inline float Traveller::Speed() { - if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_WALK_MODE)) + if(i_traveller.HasUnitMovementFlag(MONSTER_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); else return i_traveller.GetSpeed(MOVE_RUN); @@ -112,7 +112,7 @@ inline float Traveller::Speed() if (i_traveller.isInFlight()) return PLAYER_FLIGHT_SPEED; 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<> @@ -138,7 +138,7 @@ template<> inline void Traveller::MoveTo(float x, float y, float z, uint32 t) { //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 CreatureTraveller; diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index e9962cf43ec..552df688f1f 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -74,8 +74,8 @@ Unit::Unit() { m_objectType |= TYPEMASK_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[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) { + float moveTime = Time; + WorldPacket data( SMSG_MONSTER_MOVE, (41 + GetPackGUID().size()) ); data.append(GetPackGUID()); - + data << uint8(0); // new in 3.1 data << GetPositionX() << GetPositionY() << GetPositionZ(); data << uint32(getMSTime()); @@ -286,7 +288,10 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 ty 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 << 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; - 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 << uint8(0); data << GetPositionX(); data << GetPositionY(); data << GetPositionZ(); diff --git a/src/game/UpdateData.cpp b/src/game/UpdateData.cpp index a01d82181cc..c7b7e78fa4c 100644 --- a/src/game/UpdateData.cpp +++ b/src/game/UpdateData.cpp @@ -103,7 +103,9 @@ void UpdateData::Compress(void* dst, uint32 *dst_size, void* src, int src_size) 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); @@ -120,8 +122,6 @@ bool UpdateData::BuildPacket(WorldPacket *packet) buf.append(m_data); - packet->clear(); - size_t pSize = buf.wpos(); // use real used data size if (pSize > 100 ) // compress large packets diff --git a/src/game/UpdateFields.h b/src/game/UpdateFields.h index 031d70187dd..0ae175ae9f7 100644 --- a/src/game/UpdateFields.h +++ b/src/game/UpdateFields.h @@ -19,7 +19,7 @@ #ifndef _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 { @@ -37,9 +37,9 @@ enum EItemFields 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_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_DURATION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2 - ITEM_FIELD_SPELL_CHARGES = OBJECT_END + 0x000A, // Size: 5, 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, ITEM_OWNER + 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_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 @@ -67,9 +67,9 @@ enum EItemFields 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_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_DURABILITY = OBJECT_END + 0x0037, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2 - ITEM_FIELD_MAXDURABILITY = OBJECT_END + 0x0038, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2 + 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, ITEM_OWNER + 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_END = OBJECT_END + 0x003A, }; @@ -109,8 +109,8 @@ enum EUnitFields 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_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_INTERRUPTED_FLAT_MODIFIER = OBJECT_END + 0x0028, // 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 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_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_NATIVEDISPLAYID = OBJECT_END + 0x003D, // 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_MAXDAMAGE = OBJECT_END + 0x0040, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3 - UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x0041, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3 - UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x0042, // 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, PARTY_LEADER + 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, PARTY_LEADER 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_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_PETNEXTLEVELEXP = OBJECT_END + 0x0047, // 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 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_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_NPC_FLAGS = OBJECT_END + 0x004C, // Size: 1, Type: INT, Flags: DYNAMIC 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_STAT1 = OBJECT_END + 0x004F, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_STAT2 = OBJECT_END + 0x0050, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_STAT3 = OBJECT_END + 0x0051, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_STAT4 = OBJECT_END + 0x0052, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_POSSTAT0 = OBJECT_END + 0x0053, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_POSSTAT1 = OBJECT_END + 0x0054, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_POSSTAT2 = OBJECT_END + 0x0055, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_POSSTAT3 = OBJECT_END + 0x0056, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_POSSTAT4 = OBJECT_END + 0x0057, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_NEGSTAT0 = OBJECT_END + 0x0058, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_NEGSTAT1 = OBJECT_END + 0x0059, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_NEGSTAT2 = OBJECT_END + 0x005A, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_NEGSTAT3 = OBJECT_END + 0x005B, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_NEGSTAT4 = OBJECT_END + 0x005C, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_RESISTANCES = OBJECT_END + 0x005D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY, UNK3 - UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x0064, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x006B, // Size: 7, 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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, PARTY_LEADER + 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 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_ATTACK_POWER = OBJECT_END + 0x0075, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_ATTACK_POWER_MODS = OBJECT_END + 0x0076, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x0077, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x0078, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_RANGED_ATTACK_POWER_MODS = OBJECT_END + 0x0079, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x007A, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x007B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x007C, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x007D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x0084, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY - UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x008B, // Size: 1, Type: FLOAT, 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 + 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 + 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 + 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 + 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 + 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_PADDING = OBJECT_END + 0x008D, // Size: 1, Type: INT, Flags: NONE UNIT_END = OBJECT_END + 0x008E, @@ -184,285 +184,222 @@ enum EUnitFields 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_VISIBLE_ITEM_1_CREATOR = UNIT_END + 0x006E, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_1_0 = UNIT_END + 0x0070, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_1_PROPERTIES = UNIT_END + 0x007D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_1_SEED = UNIT_END + 0x007E, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_1_PAD = UNIT_END + 0x007F, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_2_CREATOR = UNIT_END + 0x0080, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_2_0 = UNIT_END + 0x0082, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_2_PROPERTIES = UNIT_END + 0x008F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_2_SEED = UNIT_END + 0x0090, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_2_PAD = UNIT_END + 0x0091, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_3_CREATOR = UNIT_END + 0x0092, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_3_0 = UNIT_END + 0x0094, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_3_PROPERTIES = UNIT_END + 0x00A1, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_3_SEED = UNIT_END + 0x00A2, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_3_PAD = UNIT_END + 0x00A3, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_4_CREATOR = UNIT_END + 0x00A4, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_4_0 = UNIT_END + 0x00A6, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_4_PROPERTIES = UNIT_END + 0x00B3, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_4_SEED = UNIT_END + 0x00B4, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_4_PAD = UNIT_END + 0x00B5, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_5_CREATOR = UNIT_END + 0x00B6, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_5_0 = UNIT_END + 0x00B8, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_5_PROPERTIES = UNIT_END + 0x00C5, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_5_SEED = UNIT_END + 0x00C6, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_5_PAD = UNIT_END + 0x00C7, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_6_CREATOR = UNIT_END + 0x00C8, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_6_0 = UNIT_END + 0x00CA, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_6_PROPERTIES = UNIT_END + 0x00D7, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_6_SEED = UNIT_END + 0x00D8, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_6_PAD = UNIT_END + 0x00D9, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_7_CREATOR = UNIT_END + 0x00DA, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_7_0 = UNIT_END + 0x00DC, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_7_PROPERTIES = UNIT_END + 0x00E9, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_7_SEED = UNIT_END + 0x00EA, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_7_PAD = UNIT_END + 0x00EB, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_8_CREATOR = UNIT_END + 0x00EC, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_8_0 = UNIT_END + 0x00EE, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_8_PROPERTIES = UNIT_END + 0x00FB, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_8_SEED = UNIT_END + 0x00FC, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_8_PAD = UNIT_END + 0x00FD, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_9_CREATOR = UNIT_END + 0x00FE, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_9_0 = UNIT_END + 0x0100, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_9_PROPERTIES = UNIT_END + 0x010D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_9_SEED = UNIT_END + 0x010E, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_9_PAD = UNIT_END + 0x010F, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_10_CREATOR = UNIT_END + 0x0110, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_10_0 = UNIT_END + 0x0112, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_10_PROPERTIES = UNIT_END + 0x011F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_10_SEED = UNIT_END + 0x0120, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_10_PAD = UNIT_END + 0x0121, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_11_CREATOR = UNIT_END + 0x0122, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_11_0 = UNIT_END + 0x0124, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_11_PROPERTIES = UNIT_END + 0x0131, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_11_SEED = UNIT_END + 0x0132, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_11_PAD = UNIT_END + 0x0133, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_12_CREATOR = UNIT_END + 0x0134, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_12_0 = UNIT_END + 0x0136, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_12_PROPERTIES = UNIT_END + 0x0143, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_12_SEED = UNIT_END + 0x0144, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_12_PAD = UNIT_END + 0x0145, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_13_CREATOR = UNIT_END + 0x0146, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_13_0 = UNIT_END + 0x0148, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_13_PROPERTIES = UNIT_END + 0x0155, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_13_SEED = UNIT_END + 0x0156, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_13_PAD = UNIT_END + 0x0157, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_14_CREATOR = UNIT_END + 0x0158, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_14_0 = UNIT_END + 0x015A, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_14_PROPERTIES = UNIT_END + 0x0167, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_14_SEED = UNIT_END + 0x0168, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_14_PAD = UNIT_END + 0x0169, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_15_CREATOR = UNIT_END + 0x016A, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_15_0 = UNIT_END + 0x016C, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_15_PROPERTIES = UNIT_END + 0x0179, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_15_SEED = UNIT_END + 0x017A, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_15_PAD = UNIT_END + 0x017B, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_16_CREATOR = UNIT_END + 0x017C, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_16_0 = UNIT_END + 0x017E, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_16_PROPERTIES = UNIT_END + 0x018B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_16_SEED = UNIT_END + 0x018C, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_16_PAD = UNIT_END + 0x018D, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_17_CREATOR = UNIT_END + 0x018E, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_17_0 = UNIT_END + 0x0190, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_17_PROPERTIES = UNIT_END + 0x019D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_17_SEED = UNIT_END + 0x019E, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_17_PAD = UNIT_END + 0x019F, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_18_CREATOR = UNIT_END + 0x01A0, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_18_0 = UNIT_END + 0x01A2, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_18_PROPERTIES = UNIT_END + 0x01AF, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_18_SEED = UNIT_END + 0x01B0, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_18_PAD = UNIT_END + 0x01B1, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_19_CREATOR = UNIT_END + 0x01B2, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_19_0 = UNIT_END + 0x01B4, // Size: 13, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_19_PROPERTIES = UNIT_END + 0x01C1, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_19_SEED = UNIT_END + 0x01C2, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_19_PAD = UNIT_END + 0x01C3, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_CHOSEN_TITLE = UNIT_END + 0x01C4, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_FIELD_PAD_0 = UNIT_END + 0x01C5, // Size: 1, Type: INT, Flags: NONE - PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x01C6, // Size: 46, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_PACK_SLOT_1 = UNIT_END + 0x01F4, // Size: 32, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_BANK_SLOT_1 = UNIT_END + 0x0214, // Size: 56, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_BANKBAG_SLOT_1 = UNIT_END + 0x024C, // Size: 14, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = UNIT_END + 0x025A, // Size: 24, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_KEYRING_SLOT_1 = UNIT_END + 0x0272, // Size: 64, Type: LONG, Flags: PRIVATE - 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, + PLAYER_VISIBLE_ITEM_1_ENTRYID = UNIT_END + 0x006E, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_1_ENCHANTMENT = UNIT_END + 0x006F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_2_ENTRYID = UNIT_END + 0x0070, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_2_ENCHANTMENT = UNIT_END + 0x0071, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_3_ENTRYID = UNIT_END + 0x0072, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_3_ENCHANTMENT = UNIT_END + 0x0073, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_4_ENTRYID = UNIT_END + 0x0074, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_4_ENCHANTMENT = UNIT_END + 0x0075, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_5_ENTRYID = UNIT_END + 0x0076, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_5_ENCHANTMENT = UNIT_END + 0x0077, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_6_ENTRYID = UNIT_END + 0x0078, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_6_ENCHANTMENT = UNIT_END + 0x0079, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_7_ENTRYID = UNIT_END + 0x007A, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_7_ENCHANTMENT = UNIT_END + 0x007B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_8_ENTRYID = UNIT_END + 0x007C, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_8_ENCHANTMENT = UNIT_END + 0x007D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_9_ENTRYID = UNIT_END + 0x007E, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_9_ENCHANTMENT = UNIT_END + 0x007F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_10_ENTRYID = UNIT_END + 0x0080, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_10_ENCHANTMENT = UNIT_END + 0x0081, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_11_ENTRYID = UNIT_END + 0x0082, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_11_ENCHANTMENT = UNIT_END + 0x0083, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_12_ENTRYID = UNIT_END + 0x0084, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_12_ENCHANTMENT = UNIT_END + 0x0085, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_13_ENTRYID = UNIT_END + 0x0086, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_13_ENCHANTMENT = UNIT_END + 0x0087, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_14_ENTRYID = UNIT_END + 0x0088, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_14_ENCHANTMENT = UNIT_END + 0x0089, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_15_ENTRYID = UNIT_END + 0x008A, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_15_ENCHANTMENT = UNIT_END + 0x008B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_16_ENTRYID = UNIT_END + 0x008C, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_16_ENCHANTMENT = UNIT_END + 0x008D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_17_ENTRYID = UNIT_END + 0x008E, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_17_ENCHANTMENT = UNIT_END + 0x008F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_18_ENTRYID = UNIT_END + 0x0090, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_18_ENCHANTMENT = UNIT_END + 0x0091, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_19_ENTRYID = UNIT_END + 0x0092, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_19_ENCHANTMENT = UNIT_END + 0x0093, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_CHOSEN_TITLE = UNIT_END + 0x0094, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_FIELD_PAD_0 = UNIT_END + 0x0095, // Size: 1, Type: INT, Flags: NONE + PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x0096, // Size: 46, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_PACK_SLOT_1 = UNIT_END + 0x00C4, // Size: 32, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_BANK_SLOT_1 = UNIT_END + 0x00E4, // Size: 56, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_BANKBAG_SLOT_1 = UNIT_END + 0x011C, // Size: 14, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = UNIT_END + 0x012A, // Size: 24, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_KEYRING_SLOT_1 = UNIT_END + 0x0142, // Size: 64, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_CURRENCYTOKEN_SLOT_1 = UNIT_END + 0x0182, // Size: 64, Type: LONG, Flags: PRIVATE + PLAYER_FARSIGHT = UNIT_END + 0x01C2, // Size: 2, Type: LONG, Flags: PRIVATE + PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x01C4, // Size: 2, Type: LONG, Flags: PRIVATE + PLAYER__FIELD_KNOWN_TITLES1 = UNIT_END + 0x01C6, // Size: 2, Type: LONG, Flags: PRIVATE + PLAYER__FIELD_KNOWN_TITLES2 = UNIT_END + 0x01C8, // Size: 2, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_KNOWN_CURRENCIES = UNIT_END + 0x01CA, // Size: 2, Type: LONG, Flags: PRIVATE + PLAYER_XP = UNIT_END + 0x01CC, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x01CD, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_SKILL_INFO_1_1 = UNIT_END + 0x01CE, // Size: 384, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_CHARACTER_POINTS1 = UNIT_END + 0x034E, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_CHARACTER_POINTS2 = UNIT_END + 0x034F, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_TRACK_CREATURES = UNIT_END + 0x0350, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_TRACK_RESOURCES = UNIT_END + 0x0351, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x0352, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x0353, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x0354, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_EXPERTISE = UNIT_END + 0x0355, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x0356, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x0357, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x0358, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x0359, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x035A, // Size: 7, Type: FLOAT, Flags: PRIVATE + PLAYER_SHIELD_BLOCK = UNIT_END + 0x0361, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x0362, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x0363, // Size: 128, Type: BYTES, Flags: PRIVATE + PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x03E3, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_COINAGE = UNIT_END + 0x03E4, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x03E5, // Size: 7, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x03EC, // Size: 7, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x03F3, // Size: 7, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x03FA, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x03FB, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x03FC, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_BYTES = UNIT_END + 0x03FD, // Size: 1, Type: BYTES, Flags: PRIVATE + PLAYER_AMMO_ID = UNIT_END + 0x03FE, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_SELF_RES_SPELL = UNIT_END + 0x03FF, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x0400, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x0401, // Size: 12, Type: INT, Flags: PRIVATE + PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x040D, // Size: 12, Type: INT, Flags: PRIVATE + PLAYER_FIELD_KILLS = UNIT_END + 0x0419, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_FIELD_TODAY_CONTRIBUTION = UNIT_END + 0x041A, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_YESTERDAY_CONTRIBUTION = UNIT_END + 0x041B, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_LIFETIME_HONORBALE_KILLS = UNIT_END + 0x041C, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_BYTES2 = UNIT_END + 0x041D, // Size: 1, Type: BYTES, Flags: PRIVATE + PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x041E, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x041F, // Size: 25, Type: INT, Flags: PRIVATE + PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x0438, // Size: 18, Type: INT, Flags: PRIVATE + PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x044A, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x044B, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x044C, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x044D, // Size: 25, Type: INT, Flags: PRIVATE + PLAYER_RUNE_REGEN_1 = UNIT_END + 0x0466, // Size: 4, Type: FLOAT, Flags: PRIVATE + PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x046A, // Size: 3, Type: INT, Flags: PRIVATE + PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x046D, // Size: 6, Type: INT, Flags: PRIVATE + PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x0473, // Size: 6, Type: INT, Flags: PRIVATE + PLAYER_GLYPHS_ENABLED = UNIT_END + 0x0479, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_END = UNIT_END + 0x047A, }; enum EGameObjectFields { 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_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - GAMEOBJECT_ROTATION = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PUBLIC - GAMEOBJECT_PARENTROTATION = OBJECT_END + 0x0006, // Size: 4, Type: FLOAT, Flags: PUBLIC - GAMEOBJECT_POS_X = OBJECT_END + 0x000A, // Size: 1, Type: FLOAT, Flags: PUBLIC - GAMEOBJECT_POS_Y = OBJECT_END + 0x000B, // Size: 1, Type: FLOAT, Flags: PUBLIC - GAMEOBJECT_POS_Z = OBJECT_END + 0x000C, // Size: 1, Type: FLOAT, Flags: PUBLIC - GAMEOBJECT_FACING = OBJECT_END + 0x000D, // Size: 1, Type: FLOAT, Flags: PUBLIC - 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, + GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: INT, Flags: PUBLIC + GAMEOBJECT_PARENTROTATION = OBJECT_END + 0x0004, // Size: 4, Type: FLOAT, Flags: PUBLIC + GAMEOBJECT_DYNAMIC = OBJECT_END + 0x0008, // Size: 1, Type: TWO_SHORT, Flags: DYNAMIC + GAMEOBJECT_FACTION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: PUBLIC + GAMEOBJECT_LEVEL = OBJECT_END + 0x000A, // Size: 1, Type: INT, Flags: PUBLIC + GAMEOBJECT_BYTES_1 = OBJECT_END + 0x000B, // Size: 1, Type: BYTES, Flags: PUBLIC + GAMEOBJECT_END = OBJECT_END + 0x000C, }; enum EDynamicObjectFields @@ -483,18 +420,14 @@ enum ECorpseFields { 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_FACING = OBJECT_END + 0x0004, // Size: 1, Type: FLOAT, Flags: PUBLIC - CORPSE_FIELD_POS_X = OBJECT_END + 0x0005, // Size: 1, Type: FLOAT, Flags: PUBLIC - CORPSE_FIELD_POS_Y = OBJECT_END + 0x0006, // Size: 1, Type: FLOAT, Flags: PUBLIC - CORPSE_FIELD_POS_Z = OBJECT_END + 0x0007, // Size: 1, Type: FLOAT, Flags: PUBLIC - CORPSE_FIELD_DISPLAY_ID = OBJECT_END + 0x0008, // Size: 1, Type: INT, Flags: PUBLIC - CORPSE_FIELD_ITEM = OBJECT_END + 0x0009, // Size: 19, Type: INT, Flags: PUBLIC - CORPSE_FIELD_BYTES_1 = OBJECT_END + 0x001C, // Size: 1, Type: BYTES, Flags: PUBLIC - CORPSE_FIELD_BYTES_2 = OBJECT_END + 0x001D, // Size: 1, Type: BYTES, Flags: PUBLIC - CORPSE_FIELD_GUILD = OBJECT_END + 0x001E, // Size: 1, Type: INT, Flags: PUBLIC - 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, + CORPSE_FIELD_DISPLAY_ID = OBJECT_END + 0x0004, // Size: 1, Type: INT, Flags: PUBLIC + CORPSE_FIELD_ITEM = OBJECT_END + 0x0005, // Size: 19, Type: INT, Flags: PUBLIC + CORPSE_FIELD_BYTES_1 = OBJECT_END + 0x0018, // Size: 1, Type: BYTES, Flags: PUBLIC + CORPSE_FIELD_BYTES_2 = OBJECT_END + 0x0019, // Size: 1, Type: BYTES, Flags: PUBLIC + CORPSE_FIELD_GUILD = OBJECT_END + 0x001A, // Size: 1, Type: INT, Flags: PUBLIC + CORPSE_FIELD_FLAGS = OBJECT_END + 0x001B, // Size: 1, Type: INT, Flags: PUBLIC + CORPSE_FIELD_DYNAMIC_FLAGS = OBJECT_END + 0x001C, // Size: 1, Type: INT, Flags: DYNAMIC + CORPSE_FIELD_PAD = OBJECT_END + 0x001D, // Size: 1, Type: INT, Flags: NONE + CORPSE_END = OBJECT_END + 0x001E, }; #endif diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp index cd24472d70e..de587fcbeea 100644 --- a/src/game/Vehicle.cpp +++ b/src/game/Vehicle.cpp @@ -26,7 +26,7 @@ Vehicle::Vehicle() : Creature(), m_vehicleId(0) { 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() diff --git a/src/game/WaypointMovementGenerator.cpp b/src/game/WaypointMovementGenerator.cpp index 38cf80dde66..0aad5e4fbb1 100644 --- a/src/game/WaypointMovementGenerator.cpp +++ b/src/game/WaypointMovementGenerator.cpp @@ -109,7 +109,7 @@ bool WaypointMovementGenerator::Update(Creature &creature, const uint3 // Now we re-set destination to same node and start travel creature.addUnitState(UNIT_STAT_ROAMING); if (creature.canFly()) - creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); + creature.AddUnitMovementFlag(MONSTER_MOVE_FLY); const WaypointNode &node = i_path->at(i_currentNode); i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z); i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime()); @@ -172,7 +172,7 @@ bool WaypointMovementGenerator::Update(Creature &creature, const uint3 { creature.addUnitState(UNIT_STAT_ROAMING); if (creature.canFly()) - creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); + creature.AddUnitMovementFlag(MONSTER_MOVE_FLY); const WaypointNode &node = i_path->at(i_currentNode); i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z); i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime()); @@ -240,7 +240,7 @@ void FlightPathMovementGenerator::Initialize(Player &player) // 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); - player.SendMonsterMoveByPath(GetPath(),GetCurrentNode(),GetPathAtMapEnd(),MOVEMENTFLAG_WALK_MODE|MOVEMENTFLAG_ONTRANSPORT); + player.SendMonsterMoveByPath(GetPath(),GetCurrentNode(),GetPathAtMapEnd(),MONSTER_MOVE_SPLINE_FLY); } void FlightPathMovementGenerator::Finalize(Player & player) @@ -261,7 +261,7 @@ void FlightPathMovementGenerator::Finalize(Player & player) if(player.pvpInfo.inHostileArea) player.CastSpell(&player, 2479, true); - player.SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE); + player.SetUnitMovementFlags(MONSTER_MOVE_WALK); player.StopMoving(); } } diff --git a/src/game/World.cpp b/src/game/World.cpp index ca617075add..1bfe54577be 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -244,6 +244,8 @@ World::AddSession_ (WorldSession* s) s->SendPacket (&packet); s->SendAddonsInfo(); + s->SendTutorialsData(); + UpdateMaxSessionCounters (); // Updates the population diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index 8e320bc777b..4f8340ad38f 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -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), _player(NULL), m_Socket(sock),_security(sec), _accountId(id), m_expansion(expansion), 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) { @@ -563,6 +564,65 @@ void WorldSession::SetAccountData(uint32 type, time_t time_, std::string data) 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) { 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) { - CHECK_PACKET_SIZE(data, data.rpos()+8+4+4+4+4+4+1); - data >> mi->t_guid; + if(!data.readPackGUID(mi->t_guid)) + return; + + CHECK_PACKET_SIZE(data, data.rpos()+4+4+4+4+4+1); data >> mi->t_x; data >> mi->t_y; data >> mi->t_z; diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index cffe5872e98..7f78c489794 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -116,6 +116,7 @@ class MANGOS_DLL_SPEC WorldSession void SendNotification(int32 string_id,...); void SendPetNameInvalid(uint32 error, const std::string& name, DeclinedName *declinedName); 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 SendAreaTriggerMessage(const char* Text, ...) ATTR_PRINTF(2,3); void SendSetPhaseShift(uint32 phaseShift); @@ -188,6 +189,22 @@ class MANGOS_DLL_SPEC WorldSession AccountData *GetAccountData(uint32 type) { return &m_accountData[type]; } void SetAccountData(uint32 type, time_t time_, std::string data); 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 //used with item_page table @@ -511,6 +528,7 @@ class MANGOS_DLL_SPEC WorldSession void HandleCancelAutoRepeatSpellOpcode(WorldPacket& recvPacket); void HandleLearnTalentOpcode(WorldPacket& recvPacket); + void HandleLearnPreviewTalents(WorldPacket& recvPacket); void HandleTalentWipeConfirmOpcode(WorldPacket& recvPacket); void HandleUnlearnSkillOpcode(WorldPacket& recvPacket); @@ -581,6 +599,7 @@ class MANGOS_DLL_SPEC WorldSession void HandlePetSpellAutocastOpcode( WorldPacket& recvPacket ); void HandlePetCastSpellOpcode( WorldPacket& recvPacket ); void HandlePetLearnTalent( WorldPacket& recvPacket ); + void HandleLearnPreviewTalentsPet( WorldPacket& recvPacket ); void HandleSetActionBarToggles(WorldPacket& recv_data); @@ -617,6 +636,7 @@ class MANGOS_DLL_SPEC WorldSession void HandleLfmClearOpcode(WorldPacket& recv_data); void HandleSetLfmOpcode(WorldPacket& recv_data); void HandleSetLfgCommentOpcode(WorldPacket& recv_data); + void HandleLfgSetRoles(WorldPacket& recv_data); void HandleSetTitleOpcode(WorldPacket& recv_data); void HandleRealmSplitOpcode(WorldPacket& recv_data); void HandleTimeSyncResp(WorldPacket& recv_data); @@ -688,6 +708,9 @@ class MANGOS_DLL_SPEC WorldSession void HandleRemoveGlyph(WorldPacket& recv_data); void HandleCharCustomize(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 trade methods void moveItems(Item* myItems[], Item* hisItems[]); @@ -712,6 +735,8 @@ class MANGOS_DLL_SPEC WorldSession int m_sessionDbLocaleIndex; uint32 m_latency; AccountData m_accountData[NUM_ACCOUNT_DATA_TYPES]; + uint32 m_Tutorials[8]; + bool m_TutorialsChanged; AddonsList m_addonsList; ACE_Based::LockedQueue _recvQueue; }; diff --git a/src/game/WorldSocket.cpp b/src/game/WorldSocket.cpp index 95a3c12da66..2281761e080 100644 --- a/src/game/WorldSocket.cpp +++ b/src/game/WorldSocket.cpp @@ -981,10 +981,10 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) // 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); - m_Crypt.SetKey (&K); - m_Crypt.Init (); + m_Crypt.Init(&K); m_Session->LoadAccountData(); + m_Session->LoadTutorialsData(); m_Session->ReadAddonsInfo(recvPacket); // In case needed sometime the second arg is in microseconds 1 000 000 = 1 sec diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in index be1c1e1f53b..69643c7cfa6 100644 --- a/src/mangosd/mangosd.conf.dist.in +++ b/src/mangosd/mangosd.conf.dist.in @@ -912,9 +912,9 @@ GM.AllowAchievementGain = 1 # Visibility.Distance.Creature # Visibility.Distance.Player # 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 -# Default: 66 (cell size) +# Default: 132 (cell size) # Min limit is max aggro radius (45) * Rate.Creature.Aggro # # Visibility.Distance.Object @@ -940,10 +940,10 @@ GM.AllowAchievementGain = 1 ################################################################################################################### Visibility.GroupMode = 0 -Visibility.Distance.Creature = 66 -Visibility.Distance.Player = 66 -Visibility.Distance.Object = 66 -Visibility.Distance.InFlight = 66 +Visibility.Distance.Creature = 100 +Visibility.Distance.Player = 100 +Visibility.Distance.Object = 100 +Visibility.Distance.InFlight = 100 Visibility.Distance.Grey.Unit = 1 Visibility.Distance.Grey.Object = 10 diff --git a/src/realmd/AuthCodes.h b/src/realmd/AuthCodes.h index 09194011a68..1940ecd9343 100644 --- a/src/realmd/AuthCodes.h +++ b/src/realmd/AuthCodes.h @@ -66,8 +66,8 @@ enum LoginResult // we need to stick to 1 version or half of the stuff will work for someone // 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 diff --git a/src/shared/Auth/AuthCrypt.cpp b/src/shared/Auth/AuthCrypt.cpp index 5c91a22bc9b..beec71763b3 100644 --- a/src/shared/Auth/AuthCrypt.cpp +++ b/src/shared/Auth/AuthCrypt.cpp @@ -18,63 +18,61 @@ #include "AuthCrypt.h" #include "Hmac.h" +#include "Log.h" +#include "BigNumber.h" AuthCrypt::AuthCrypt() { _initialized = false; } -void AuthCrypt::Init() +AuthCrypt::~AuthCrypt() { - _send_i = _send_j = _recv_i = _recv_j = 0; - _initialized = true; -} -void AuthCrypt::DecryptRecv(uint8 *data, size_t len) -{ - if (!_initialized) return; - if (len < CRYPTED_RECV_LEN) return; - - for (size_t t = 0; t < CRYPTED_RECV_LEN; t++) - { - _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::Init(BigNumber *K) { - if (!_initialized) return; - - for (size_t t = 0; t < len; t++) - { - _send_i %= _key.size(); - uint8 x = (data[t] ^ _key[_send_i]) + _send_j; - ++_send_i; - data[t] = _send_j = x; - } -} + 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); -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; + 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; } -AuthCrypt::~AuthCrypt() +void AuthCrypt::DecryptRecv(uint8 *data, size_t len) { + if (!_initialized) + return; + + _clientDecrypt.UpdateData(len, data); } -void AuthCrypt::GenerateKey(uint8 *key, BigNumber *bn) +void AuthCrypt::EncryptSend(uint8 *data, size_t len) { - HmacHash hash; - hash.UpdateBigNumber(bn); - hash.Finalize(); - memcpy(key, hash.GetDigest(), SHA_DIGEST_LENGTH); + if (!_initialized) + return; + + _serverEncrypt.UpdateData(len, data); } diff --git a/src/shared/Auth/AuthCrypt.h b/src/shared/Auth/AuthCrypt.h index 5717f72ec9f..de09584dd7a 100644 --- a/src/shared/Auth/AuthCrypt.h +++ b/src/shared/Auth/AuthCrypt.h @@ -20,7 +20,7 @@ #define _AUTHCRYPT_H #include -#include +#include "SARC4.h" class BigNumber; @@ -30,22 +30,15 @@ class AuthCrypt AuthCrypt(); ~AuthCrypt(); - const static size_t CRYPTED_RECV_LEN = 6; - - void Init(); - - void SetKey(BigNumber *); - + void Init(BigNumber *K); void DecryptRecv(uint8 *, size_t); void EncryptSend(uint8 *, size_t); bool IsInitialized() { return _initialized; } - static void GenerateKey(uint8 *, BigNumber *); - private: - std::vector _key; - uint8 _send_i, _send_j, _recv_i, _recv_j; + SARC4 _clientDecrypt; + SARC4 _serverEncrypt; bool _initialized; }; #endif diff --git a/src/shared/Auth/Hmac.cpp b/src/shared/Auth/Hmac.cpp index d0517aad7f8..ba8b54c44ba 100644 --- a/src/shared/Auth/Hmac.cpp +++ b/src/shared/Auth/Hmac.cpp @@ -19,17 +19,16 @@ #include "Auth/Hmac.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 }; - memcpy(&m_key, &temp, SEED_KEY_SIZE); + ASSERT(len == SEED_KEY_SIZE); + 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() { - memset(&m_key, 0x00, SEED_KEY_SIZE); HMAC_CTX_cleanup(&m_ctx); } @@ -43,14 +42,16 @@ void HmacHash::UpdateData(const uint8 *data, int 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() { uint32 length = 0; - HMAC_Final(&m_ctx, m_digest, &length); + HMAC_Final(&m_ctx, (uint8*)m_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; +} diff --git a/src/shared/Auth/Hmac.h b/src/shared/Auth/Hmac.h index 3e0dacc3b2e..c8e4e9a961a 100644 --- a/src/shared/Auth/Hmac.h +++ b/src/shared/Auth/Hmac.h @@ -30,17 +30,16 @@ class BigNumber; class HmacHash { public: - HmacHash(); + HmacHash(uint32 len, uint8 *seed); ~HmacHash(); void UpdateBigNumber(BigNumber *bn); void UpdateData(const uint8 *data, int length); - void Initialize(); void Finalize(); - uint8 *GetDigest() { return m_digest; }; - int GetLength() { return SHA_DIGEST_LENGTH; }; + uint8 *ComputeHash(BigNumber *bn); + uint8 *GetDigest() { return (uint8*)m_digest; } + int GetLength() { return SHA_DIGEST_LENGTH; } private: HMAC_CTX m_ctx; - uint8 m_key[SEED_KEY_SIZE]; uint8 m_digest[SHA_DIGEST_LENGTH]; }; #endif diff --git a/src/shared/Auth/Makefile.am b/src/shared/Auth/Makefile.am index 9e4956711be..34e56ad0a96 100644 --- a/src/shared/Auth/Makefile.am +++ b/src/shared/Auth/Makefile.am @@ -33,6 +33,8 @@ libmangosauth_a_SOURCES = \ BigNumber.h \ Hmac.cpp \ Hmac.h \ + SARC4.cpp \ + SARC4.h \ Sha1.cpp \ Sha1.h \ md5.c \ diff --git a/src/shared/Auth/SARC4.cpp b/src/shared/Auth/SARC4.cpp new file mode 100644 index 00000000000..f59bb7f0c53 --- /dev/null +++ b/src/shared/Auth/SARC4.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2009 MaNGOS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "Auth/SARC4.h" +#include + +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); +} diff --git a/src/shared/Auth/SARC4.h b/src/shared/Auth/SARC4.h new file mode 100644 index 00000000000..3f15328d6cb --- /dev/null +++ b/src/shared/Auth/SARC4.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2005-2009 MaNGOS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, 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 + +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 diff --git a/src/shared/Database/SQLStorage.cpp b/src/shared/Database/SQLStorage.cpp index 61b7a5a370e..288b66539b5 100644 --- a/src/shared/Database/SQLStorage.cpp +++ b/src/shared/Database/SQLStorage.cpp @@ -25,16 +25,16 @@ extern DatabasePostgre WorldDatabase; extern DatabaseMysql WorldDatabase; #endif -const char CreatureInfosrcfmt[]="iiiiiisssiiiiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiifflliiis"; -const char CreatureInfodstfmt[]="iiiiiisssiiiiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiifflliiii"; +const char CreatureInfosrcfmt[]="iiiiiiiisssiiiiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiiffliiiiiliiis"; +const char CreatureInfodstfmt[]="iiiiiiiisssiiiiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiiffliiiiiliiii"; const char CreatureDataAddonInfofmt[]="iiiiiis"; const char CreatureModelfmt[]="iffbi"; const char CreatureInfoAddonInfofmt[]="iiiiiis"; const char EquipmentInfofmt[]="iiii"; -const char GameObjectInfosrcfmt[]="iiisssiifiiiiiiiiiiiiiiiiiiiiiiiis"; -const char GameObjectInfodstfmt[]="iiisssiifiiiiiiiiiiiiiiiiiiiiiiiii"; -const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiisiiii"; -const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiii"; +const char GameObjectInfosrcfmt[]="iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiis"; +const char GameObjectInfodstfmt[]="iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiii"; +const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiisiiii"; +const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiiii"; const char PageTextfmt[]="isi"; const char SpellThreatfmt[]="ii"; const char InstanceTemplatesrcfmt[]="iiiiiiiffffs"; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 004e690b96b..5974058cd47 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7987" + #define REVISION_NR "7988" #endif // __REVISION_NR_H__ diff --git a/win/VC100/shared.vcxproj b/win/VC100/shared.vcxproj index 9597588ad15..27e231e6adb 100644 --- a/win/VC100/shared.vcxproj +++ b/win/VC100/shared.vcxproj @@ -433,6 +433,7 @@ + @@ -469,6 +470,7 @@ + diff --git a/win/VC80/shared.vcproj b/win/VC80/shared.vcproj index 1755f21d925..6b4bc4e07a6 100644 --- a/win/VC80/shared.vcproj +++ b/win/VC80/shared.vcproj @@ -728,6 +728,14 @@ RelativePath="..\..\src\shared\Auth\Hmac.h" > + + + + diff --git a/win/VC90/mangosd.vcproj b/win/VC90/mangosd.vcproj index 212eafc055b..1f787d19a0c 100644 --- a/win/VC90/mangosd.vcproj +++ b/win/VC90/mangosd.vcproj @@ -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" OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\mangosd.exe" Version="" - LinkIncremental="1" + LinkIncremental="2" SuppressStartupBanner="true" AdditionalLibraryDirectories="..\..\dep\lib\$(PlatformName)_$(ConfigurationName)" GenerateDebugInformation="true" diff --git a/win/VC90/script.vcproj b/win/VC90/script.vcproj index 8593d93e835..a476aa9fb03 100644 --- a/win/VC90/script.vcproj +++ b/win/VC90/script.vcproj @@ -69,7 +69,7 @@ Name="VCLinkerTool" 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" - LinkIncremental="1" + LinkIncremental="2" AdditionalLibraryDirectories=";.\mangosd__$(PlatformName)_$(ConfigurationName);.\zlib__$(PlatformName)_$(ConfigurationName);..\..\dep\lib\$(PlatformName)_$(ConfigurationName)" GenerateDebugInformation="true" ProgramDatabaseFile="$(OutDir)\MaNGOSScript.pdb" diff --git a/win/VC90/shared.vcproj b/win/VC90/shared.vcproj index b8229e45dfa..d38398a95bf 100644 --- a/win/VC90/shared.vcproj +++ b/win/VC90/shared.vcproj @@ -733,6 +733,14 @@ RelativePath="..\..\src\shared\Auth\Hmac.h" > + + + +