mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 13:37:05 +00:00
[7988] Merge branch '310' - Switch to support client version 3.1.3
Thanks to TOM_RUS for most work to make this switch possible ;)
This commit is contained in:
commit
f7fd6961c1
94 changed files with 2307 additions and 1190 deletions
|
|
@ -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';
|
||||
|
||||
--
|
||||
|
|
|
|||
198
sql/mangos.sql
198
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'),
|
||||
|
|
|
|||
|
|
@ -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`;
|
||||
|
||||
|
|
|
|||
|
|
@ -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`);
|
||||
ALTER TABLE `pool_creature`
|
||||
ADD INDEX `idx_guid`(`guid`);
|
||||
|
|
|
|||
|
|
@ -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`);
|
||||
ALTER TABLE `pool_gameobject`
|
||||
ADD INDEX `idx_guid`(`guid`);
|
||||
|
|
|
|||
12
sql/updates/7988_01_mangos_item_template.sql
Normal file
12
sql/updates/7988_01_mangos_item_template.sql
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
ALTER TABLE db_version CHANGE COLUMN required_7980_01_mangos_item_required_target required_7988_01_mangos_item_template bit;
|
||||
|
||||
alter table `item_template`
|
||||
drop column `dmg_type3`,
|
||||
drop column `dmg_max3`,
|
||||
drop column `dmg_min3`,
|
||||
drop column `dmg_type4`,
|
||||
drop column `dmg_max4`,
|
||||
drop column `dmg_min4`,
|
||||
drop column `dmg_type5`,
|
||||
drop column `dmg_max5`,
|
||||
drop column `dmg_min5`;
|
||||
30
sql/updates/7988_02_characters_character_equipmentsets.sql
Normal file
30
sql/updates/7988_02_characters_character_equipmentsets.sql
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
ALTER TABLE character_db_version CHANGE COLUMN required_7932_01_characters_character_pet required_7988_02_characters_character_equipmentsets bit;
|
||||
|
||||
CREATE TABLE `character_equipmentsets` (
|
||||
`guid` int(11) NOT NULL default '0',
|
||||
`setguid` bigint(20) NOT NULL auto_increment,
|
||||
`setindex` tinyint(4) NOT NULL default '0',
|
||||
`name` varchar(100) NOT NULL,
|
||||
`iconname` varchar(100) NOT NULL,
|
||||
`item0` int(11) NOT NULL default '0',
|
||||
`item1` int(11) NOT NULL default '0',
|
||||
`item2` int(11) NOT NULL default '0',
|
||||
`item3` int(11) NOT NULL default '0',
|
||||
`item4` int(11) NOT NULL default '0',
|
||||
`item5` int(11) NOT NULL default '0',
|
||||
`item6` int(11) NOT NULL default '0',
|
||||
`item7` int(11) NOT NULL default '0',
|
||||
`item8` int(11) NOT NULL default '0',
|
||||
`item9` int(11) NOT NULL default '0',
|
||||
`item10` int(11) NOT NULL default '0',
|
||||
`item11` int(11) NOT NULL default '0',
|
||||
`item12` int(11) NOT NULL default '0',
|
||||
`item13` int(11) NOT NULL default '0',
|
||||
`item14` int(11) NOT NULL default '0',
|
||||
`item15` int(11) NOT NULL default '0',
|
||||
`item16` int(11) NOT NULL default '0',
|
||||
`item17` int(11) NOT NULL default '0',
|
||||
`item18` int(11) NOT NULL default '0',
|
||||
PRIMARY KEY (`setguid`),
|
||||
UNIQUE KEY `idx_set` (`guid`,`setguid`,`setindex`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
140
sql/updates/7988_03_mangos_spell_chain.sql
Normal file
140
sql/updates/7988_03_mangos_spell_chain.sql
Normal file
|
|
@ -0,0 +1,140 @@
|
|||
ALTER TABLE db_version CHANGE COLUMN required_7988_01_mangos_item_template required_7988_03_mangos_spell_chain bit;
|
||||
|
||||
DELETE FROM spell_chain WHERE first_spell IN (
|
||||
704, /* Curse of Recklessness removed */
|
||||
770, /* Faerie Fire non ranked now */
|
||||
16857, /* Faerie Fire (Feral) non ranked now */
|
||||
17962, /* Conflagrate non ranked now */
|
||||
18265, /* Siphon Life removed (replaced by different talent */
|
||||
26090, /* Thunderstomp non ranked now (rank 6 only O.o) */
|
||||
49184, /* Howling Blast skip old rank 2 */
|
||||
49224 /* Magic Suppression lost 2 ranks */
|
||||
);
|
||||
|
||||
INSERT INTO spell_chain VALUES
|
||||
/*------------------
|
||||
--(8)Fire
|
||||
------------------*/
|
||||
/*Fiery Payback*/
|
||||
(64353,0,64353,1,0),
|
||||
(64357,64353,64353,2,0),
|
||||
/*------------------
|
||||
-- (56) Holy (Priest)
|
||||
------------------*/
|
||||
/*Body and Soul*/
|
||||
(64127,0,64127,1,0),
|
||||
(64129,64127,64127,2,0),
|
||||
/*Empowered Renew*/
|
||||
(63534,0,63534,1,0),
|
||||
(63542,63534,63534,2,0),
|
||||
(63543,63542,63534,3,0),
|
||||
/*Serendipity*/
|
||||
(63730,0,63730,1,0),
|
||||
(63733,63730,63730,2,0),
|
||||
(63737,63733,63730,3,0),
|
||||
/*------------------
|
||||
-- (78) Shadow Magic
|
||||
------------------*/
|
||||
/*Improved Devouring Plague*/
|
||||
(63625,0,63625,1,0),
|
||||
(63626,63625,63625,2,0),
|
||||
(63627,63626,63625,3,0),
|
||||
/*------------------
|
||||
-- (267) Protection (Paladin)
|
||||
------------------*/
|
||||
/*Divinity*/
|
||||
(63646,0,63646,1,0),
|
||||
(63647,63646,63646,2,0),
|
||||
(63648,63647,63646,3,0),
|
||||
(63649,63648,63646,4,0),
|
||||
(63650,63649,63646,5,0),
|
||||
/*------------------
|
||||
--(270)Pet-GenericHunter
|
||||
------------------*/
|
||||
/*Shark Attack*/
|
||||
(62759,0,62759,1,0),
|
||||
(62760,62759,62759,2,0),
|
||||
/*Silverback*/
|
||||
(62764,0,62764,1,0),
|
||||
(62765,62764,62764,2,0),
|
||||
/*Wild Hunt*/
|
||||
(62758,0,62758,1,0),
|
||||
(62762,62758,62758,2,0),
|
||||
/*------------------
|
||||
--(354)Demonology
|
||||
------------------*/
|
||||
/*Decimation*/
|
||||
(63156,0,63156,1,0),
|
||||
(63158,63156,63156,2,0),
|
||||
/*Nemesis*/
|
||||
(63117,0,63117,1,0),
|
||||
(63121,63117,63117,2,0),
|
||||
(63123,63121,63117,3,0),
|
||||
/*------------------
|
||||
--(373) Enhancement
|
||||
------------------*/
|
||||
/*Frozen Power*/
|
||||
(63373,0,63373,1,0),
|
||||
(63374,63373,63373,2,0),
|
||||
/*------------------
|
||||
-- (375) Elemental Combat
|
||||
------------------*/
|
||||
/*Booming Echoes*/
|
||||
(63370,0,63370,1,0),
|
||||
(63372,63370,63370,2,0),
|
||||
/*------------------
|
||||
--(573)Restoration
|
||||
------------------*/
|
||||
/*Improved Barkskin*/
|
||||
(63410,0,63410,1,0),
|
||||
(63411,63410,63410,2,0),
|
||||
/*------------------
|
||||
--(593)Destruction
|
||||
------------------*/
|
||||
/*Molten Skin*/
|
||||
(63349,0,63349,1,0),
|
||||
(63350,63349,63349,2,0),
|
||||
(63351,63350,63349,3,0),
|
||||
/*------------------
|
||||
--(613)Discipline
|
||||
------------------*/
|
||||
/*Improved Flash Heal*/
|
||||
(63504,0,63504,1,0),
|
||||
(63505,63504,63504,2,0),
|
||||
(63506,63505,63504,3,0),
|
||||
/*------------------
|
||||
--(770)Blood
|
||||
------------------*/
|
||||
/*Death Coil*/
|
||||
(62900,0,62900,1,0),
|
||||
(62901,62900,62900,2,0),
|
||||
(62902,62901,62900,3,0),
|
||||
(62903,62902,62900,4,0),
|
||||
(62904,62903,62900,5,0),
|
||||
/*Improved Blood Presence*/
|
||||
(50365,0,50365,1,0),
|
||||
(50371,50365,50365,2,0),
|
||||
/*Improved Death Strike*/
|
||||
(62905,0,62905,1,0),
|
||||
(62908,62905,62905,2,0),
|
||||
/*------------------
|
||||
--(771)Frost
|
||||
------------------*/
|
||||
/*Howling Blast*/
|
||||
(49184,0,49184,1,0),
|
||||
(51409,49184,49184,2,0),
|
||||
(51410,51409,49184,3,0),
|
||||
(51411,51410,49184,4,0),
|
||||
/*Improved Frost Presence*/
|
||||
(50384,0,50384,1,0),
|
||||
(50385,50384,50384,2,0),
|
||||
/*------------------
|
||||
--(772)Unholy
|
||||
------------------*/
|
||||
/*Improved Unholy Presence*/
|
||||
(50391,0,50391,1,0),
|
||||
(50392,50391,50391,2,0),
|
||||
/*Magic Suppression*/
|
||||
(49224,0,49224,1,0),
|
||||
(49610,49224,49224,2,0),
|
||||
(49611,49610,49224,3,0);
|
||||
10
sql/updates/7988_04_mangos_creature_template.sql
Normal file
10
sql/updates/7988_04_mangos_creature_template.sql
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
ALTER TABLE db_version CHANGE COLUMN required_7988_03_mangos_spell_chain required_7988_04_mangos_creature_template bit;
|
||||
|
||||
alter table `creature_template`
|
||||
add column `unk1` int(11) UNSIGNED DEFAULT '0' NOT NULL after `heroic_entry`,
|
||||
add column `unk2` int(11) UNSIGNED DEFAULT '0' NOT NULL after `unk1`,
|
||||
add column `questItem1` int(11) UNSIGNED DEFAULT '0' NOT NULL after `RacialLeader`,
|
||||
add column `questItem2` int(11) UNSIGNED DEFAULT '0' NOT NULL after `questItem1`,
|
||||
add column `questItem3` int(11) UNSIGNED DEFAULT '0' NOT NULL after `questItem2`,
|
||||
add column `questItem4` int(11) UNSIGNED DEFAULT '0' NOT NULL after `questItem3`,
|
||||
add column `movementId` int(11) UNSIGNED DEFAULT '0' NOT NULL after `questItem4`;
|
||||
4
sql/updates/7988_05_mangos_item_template.sql
Normal file
4
sql/updates/7988_05_mangos_item_template.sql
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
ALTER TABLE db_version CHANGE COLUMN required_7988_04_mangos_creature_template required_7988_05_mangos_item_template bit;
|
||||
|
||||
alter table `item_template`
|
||||
add column `HolidayId` int(11) UNSIGNED DEFAULT '0' NOT NULL after `ItemLimitCategory`;
|
||||
8
sql/updates/7988_06_mangos_gameobject_template.sql
Normal file
8
sql/updates/7988_06_mangos_gameobject_template.sql
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
ALTER TABLE db_version CHANGE COLUMN required_7988_05_mangos_item_template required_7988_06_mangos_gameobject_template bit;
|
||||
|
||||
alter table `gameobject_template`
|
||||
add column `unk1` varchar(100) NOT NULL default '' after `castBarCaption`,
|
||||
add column `questItem1` int(11) UNSIGNED DEFAULT '0' NOT NULL after `size`,
|
||||
add column `questItem2` int(11) UNSIGNED DEFAULT '0' NOT NULL after `questItem1`,
|
||||
add column `questItem3` int(11) UNSIGNED DEFAULT '0' NOT NULL after `questItem2`,
|
||||
add column `questItem4` int(11) UNSIGNED DEFAULT '0' NOT NULL after `questItem3`;
|
||||
38
sql/updates/7988_07_characters_characters.sql
Normal file
38
sql/updates/7988_07_characters_characters.sql
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
ALTER TABLE character_db_version CHANGE COLUMN required_7988_02_characters_character_equipmentsets required_7988_07_characters_characters bit;
|
||||
|
||||
UPDATE characters SET data = REPLACE(data,' ',' ');
|
||||
UPDATE characters SET data = CONCAT(TRIM(data),' ');
|
||||
|
||||
UPDATE `characters` SET `data` = CONCAT(
|
||||
SUBSTRING_INDEX(`data`, ' ', 257 + 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 1), ' ', -261 + 260 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18 + 1), ' ', -261 - 18 + 260 + 18 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*2 + 1), ' ', -261 - 18*2 + 260 + 18*2 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*3 + 1), ' ', -261 - 18*3 + 260 + 18*3 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*4 + 1), ' ', -261 - 18*4 + 260 + 18*4 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*5 + 1), ' ', -261 - 18*5 + 260 + 18*5 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*6 + 1), ' ', -261 - 18*6 + 260 + 18*6 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*7 + 1), ' ', -261 - 18*7 + 260 + 18*7 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*8 + 1), ' ', -261 - 18*8 + 260 + 18*8 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*9 + 1), ' ', -261 - 18*9 + 260 + 18*9 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*10 + 1), ' ', -261 - 18*10 + 260 + 18*10 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*11 + 1), ' ', -261 - 18*11 + 260 + 18*11 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*12 + 1), ' ', -261 - 18*12 + 260 + 18*12 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*13 + 1), ' ', -261 - 18*13 + 260 + 18*13 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*14 + 1), ' ', -261 - 18*14 + 260 + 18*14 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*15 + 1), ' ', -261 - 18*15 + 260 + 18*15 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*16 + 1), ' ', -261 - 18*16 + 260 + 18*16 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*17 + 1), ' ', -261 - 18*17 + 260 + 18*17 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 261 + 18*18 + 1), ' ', -261 - 18*18 + 260 + 18*18 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 837 + 1), ' ', -837 + 600 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 937 + 1), ' ', -937 + 874 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 1007 + 1), ' ', -1007 + 1002 - 1), ' ',
|
||||
'0 0 ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 1688 + 1), ' ', -1688 + 1008 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 1696 + 1), ' ', -1696 + 1691 - 1), ' ',
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 1700 + 1), ' ', -1700 + 1699 - 1), ' '
|
||||
)
|
||||
WHERE length(SUBSTRING_INDEX(data, ' ', 1700)) < length(data) and length(SUBSTRING_INDEX(data, ' ', 1701)) >= length(data);
|
||||
|
||||
UPDATE characters SET data = REPLACE(data,' ',' ');
|
||||
UPDATE characters SET data = CONCAT(TRIM(data),' ');
|
||||
4
sql/updates/7988_08_mangos_spell_bonus_data.sql
Normal file
4
sql/updates/7988_08_mangos_spell_bonus_data.sql
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
ALTER TABLE db_version CHANGE COLUMN required_7988_06_mangos_gameobject_template required_7988_08_mangos_spell_bonus_data bit;
|
||||
|
||||
DELETE FROM `spell_bonus_data` WHERE `entry` IN (18265);
|
||||
|
||||
36
sql/updates/7988_09_mangos_spell_proc_event.sql
Normal file
36
sql/updates/7988_09_mangos_spell_proc_event.sql
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
ALTER TABLE db_version CHANGE COLUMN required_7988_08_mangos_spell_bonus_data required_7988_09_mangos_spell_proc_event bit;
|
||||
|
||||
/* Blackout removed */
|
||||
DELETE FROM spell_proc_event WHERE entry IN (15268, 15269, 15323, 15324, 15325, 15326);
|
||||
/* Improved Wing Clip removed */
|
||||
DELETE FROM spell_proc_event WHERE entry IN (19228, 19232, 19233);
|
||||
/* Shadow Mastery, not have charges now */
|
||||
DELETE FROM spell_proc_event WHERE entry IN (17794,17797,17798,17799,17800);
|
||||
/* Lightning Overload have 3 ranks now, 2 dropped */
|
||||
DELETE FROM spell_proc_event WHERE entry IN (30680,30681);
|
||||
/* Unleashed Rage have 3 ranks now, 2 dropped */
|
||||
DELETE FROM spell_proc_event WHERE entry IN (30806,30807,30810,30811);
|
||||
/* Concussive Barrage have 2 ranks now, 1 dropped */
|
||||
DELETE FROM spell_proc_event WHERE entry IN (35103);
|
||||
/* Demonic Empathy, removed */
|
||||
DELETE FROM spell_proc_event WHERE entry IN (47232,47234,47235);
|
||||
/* Rapture have 3 ranks now, 2 dropped */
|
||||
DELETE FROM spell_proc_event WHERE entry IN (47538,47539);
|
||||
/* Psychic Horror have 1 rank now, 1 dropped */
|
||||
DELETE FROM spell_proc_event WHERE entry IN (47572);
|
||||
/* Sudden Doom have 3 ranks now, 2 dropped */
|
||||
DELETE FROM spell_proc_event WHERE entry IN (49531,49532);
|
||||
/* Hunting Party have 3 ranks now, 2 dropped */
|
||||
DELETE FROM spell_proc_event WHERE entry IN (53293,53294);
|
||||
/* Righteous Vengeance have 3 ranks now, 2 dropped */
|
||||
DELETE FROM spell_proc_event WHERE entry IN (53383,53384);
|
||||
/* Night of the Dead not have charges now */
|
||||
DELETE FROM spell_proc_event WHERE entry IN (55620,55623);
|
||||
/* Pandemic have 1 rank, 2 dropped */
|
||||
DELETE FROM spell_proc_event WHERE entry IN (58436,58437);
|
||||
/* Improved Holy Concentration, removed */
|
||||
DELETE FROM spell_proc_event WHERE entry IN (47549,47551,47552);
|
||||
/* Serendipity, replace by aanother spell ids */
|
||||
DELETE FROM spell_proc_event WHERE entry IN (47555,47556,47557);
|
||||
/* T.N.T. non triggring now */
|
||||
DELETE FROM spell_proc_event WHERE entry IN (56333,56336,56337);
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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<count;i++)
|
||||
// {
|
||||
// recv_data.readPackGUID(guid);
|
||||
// recv_data >> (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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ ConfusedMovementGenerator<T>::Initialize(T &unit)
|
|||
}
|
||||
|
||||
unit.StopMoving();
|
||||
unit.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
|
||||
unit.RemoveUnitMovementFlag(MONSTER_MOVE_WALK);
|
||||
unit.addUnitState(UNIT_STAT_CONFUSED);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -128,9 +128,6 @@ TalentSpellPosMap sTalentSpellPosMap;
|
|||
DBCStorage <TalentTabEntry> sTalentTabStore(TalentTabEntryfmt);
|
||||
|
||||
// store absolute bit position for first rank for talent inspect
|
||||
typedef std::map<uint32,uint32> TalentInspectMap;
|
||||
static TalentInspectMap sTalentPosInInspect;
|
||||
static TalentInspectMap sTalentTabSizeInInspect;
|
||||
static uint32 sTalentTabPages[12/*MAX_CLASSES*/][3];
|
||||
|
||||
DBCStorage <TaxiNodesEntry> sTaxiNodesStore(TaxiNodesEntryfmt);
|
||||
|
|
@ -365,34 +362,6 @@ void LoadDBCStores(const std::string& dataPath)
|
|||
|
||||
// prepare fast data access to bit pos of talent ranks for use at inspecting
|
||||
{
|
||||
// fill table by amount of talent ranks and fill sTalentTabBitSizeInInspect
|
||||
// store in with (row,col,talent)->size key for correct sorting by (row,col)
|
||||
typedef std::map<uint32,uint32> TalentBitSize;
|
||||
TalentBitSize sTalentBitSize;
|
||||
for(uint32 i = 1; i < sTalentStore.GetNumRows(); ++i)
|
||||
{
|
||||
TalentEntry const *talentInfo = sTalentStore.LookupEntry(i);
|
||||
if (!talentInfo) continue;
|
||||
|
||||
TalentTabEntry const *talentTabInfo = sTalentTabStore.LookupEntry( talentInfo->TalentTab );
|
||||
if(!talentTabInfo)
|
||||
continue;
|
||||
|
||||
// find talent rank
|
||||
uint32 curtalent_maxrank = 0;
|
||||
for(uint32 k = MAX_TALENT_RANK; k > 0; --k)
|
||||
{
|
||||
if(talentInfo->RankID[k-1])
|
||||
{
|
||||
curtalent_maxrank = k;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
sTalentBitSize[(talentInfo->Row<<24) + (talentInfo->Col<<16)+talentInfo->TalentID] = curtalent_maxrank;
|
||||
sTalentTabSizeInInspect[talentInfo->TalentTab] += curtalent_maxrank;
|
||||
}
|
||||
|
||||
// now have all max ranks (and then bit amount used for store talent ranks in inspect)
|
||||
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];
|
||||
|
|
|
|||
|
|
@ -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 <AchievementEntry> sAchievementStore;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -285,7 +285,7 @@ FleeingMovementGenerator<T>::Initialize(T &owner)
|
|||
return;
|
||||
|
||||
_Init(owner);
|
||||
owner.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
|
||||
owner.RemoveUnitMovementFlag(MONSTER_MOVE_WALK);
|
||||
|
||||
if(Unit * fright = ObjectAccessor::GetUnit(owner, i_frightGUID))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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<GameObject> &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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
void
|
||||
HomeMovementGenerator<Creature>::Initialize(Creature & owner)
|
||||
{
|
||||
owner.RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
|
||||
owner.RemoveUnitMovementFlag(MONSTER_MOVE_WALK);
|
||||
_setTargetLocation(owner);
|
||||
}
|
||||
|
||||
|
|
@ -63,7 +63,7 @@ HomeMovementGenerator<Creature>::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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<Player>::MapType const& players = ObjectAccessor::Instance().GetPlayers();
|
||||
|
|
@ -270,70 +309,127 @@ void WorldSession::SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type)
|
|||
if(!plr || plr->GetTeam() != _player->GetTeam())
|
||||
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
|
||||
|
||||
for(uint8 j = 0; j < MAX_LOOKING_FOR_GROUP_SLOT; ++j)
|
||||
uint32 flags = 0x1FF;
|
||||
data << uint32(flags); // flags
|
||||
|
||||
if(flags & 0x1)
|
||||
{
|
||||
data << uint32( plr->m_lookingForGroup.slots[j].entry | (plr->m_lookingForGroup.slots[j].type << 24) );
|
||||
data << uint8(plr->getLevel());
|
||||
data << uint8(plr->getClass());
|
||||
data << uint8(plr->getRace());
|
||||
|
||||
for(int i = 0; i < 3; ++i)
|
||||
data << uint8(0); // spent talents count in specific tab
|
||||
|
||||
data << uint32(0); // resistances1
|
||||
data << uint32(0); // spd/heal
|
||||
data << uint32(0); // spd/heal
|
||||
data << uint32(0); // combat_rating9
|
||||
data << uint32(0); // combat_rating10
|
||||
data << uint32(0); // combat_rating11
|
||||
data << float(0); // mp5
|
||||
data << float(0); // unk
|
||||
data << uint32(0); // attack power
|
||||
data << uint32(0); // stat1
|
||||
data << uint32(0); // maxhealth
|
||||
data << uint32(0); // maxpower1
|
||||
data << uint32(0); // unk
|
||||
data << float(0); // unk
|
||||
data << uint32(0); // unk
|
||||
data << uint32(0); // unk
|
||||
data << uint32(0); // unk
|
||||
data << uint32(0); // unk
|
||||
data << uint32(0); // combat_rating20
|
||||
data << uint32(0); // unk
|
||||
}
|
||||
data << plr->m_lookingForGroup.comment;
|
||||
|
||||
Group *group = plr->GetGroup();
|
||||
if(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<uint32>(4+4, number);
|
||||
data.put<uint32>(4+4+4,number);
|
||||
data.put<uint32>(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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<uint8>(guid_size + 4 + curtalent_rank_slot);
|
||||
val |= (1 << curtalent_rank_offset);
|
||||
data.put<uint8>(guid_size + 4 + curtalent_rank_slot, val & 0xFF);
|
||||
}
|
||||
|
||||
talentTabPos += GetTalentTabInspectBitSize(talentTabId);
|
||||
}
|
||||
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 */)
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(flags & UPDATEFLAG_POSITION)
|
||||
{
|
||||
*data << uint8(0); // unk PGUID!
|
||||
*data << ((WorldObject*)this)->GetPositionX();
|
||||
*data << ((WorldObject*)this)->GetPositionY();
|
||||
*data << ((WorldObject*)this)->GetPositionZ();
|
||||
*data << ((WorldObject*)this)->GetPositionX();
|
||||
*data << ((WorldObject*)this)->GetPositionY();
|
||||
*data << ((WorldObject*)this)->GetPositionZ();
|
||||
*data << ((WorldObject*)this)->GetOrientation();
|
||||
|
||||
// target position (path end)
|
||||
/**data << ((Unit*)this)->GetPositionX();
|
||||
*data << ((Unit*)this)->GetPositionY();
|
||||
*data << ((Unit*)this)->GetPositionZ();*/
|
||||
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));
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 },
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<uint8>(pos, talentIdCount); // put real count
|
||||
|
||||
*data << uint8(MAX_GLYPH_SLOT_INDEX); // glyphs count
|
||||
|
||||
for(uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
|
||||
*data << uint16(GetGlyph(i)); // GlyphProperties.dbc
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Player::BuildPetTalentsInfoData(WorldPacket *data)
|
||||
{
|
||||
uint32 unspentTalentPoints = 0;
|
||||
size_t pointsPos = data->wpos();
|
||||
*data << uint32(unspentTalentPoints); // [PH], unspentTalentPoints
|
||||
|
||||
uint8 talentIdCount = 0;
|
||||
size_t countPos = data->wpos();
|
||||
*data << uint8(talentIdCount); // [PH], talentIdCount
|
||||
|
||||
Pet *pet = GetPet();
|
||||
if(!pet)
|
||||
return;
|
||||
|
||||
unspentTalentPoints = pet->GetFreeTalentPoints();
|
||||
|
||||
data->put<uint32>(pointsPos, unspentTalentPoints); // put real points
|
||||
|
||||
CreatureInfo const *ci = pet->GetCreatureInfo();
|
||||
if(!ci)
|
||||
return;
|
||||
|
||||
CreatureFamilyEntry const *pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
|
||||
if(!pet_family || pet_family->petTalentType < 0)
|
||||
return;
|
||||
|
||||
for(uint32 talentTabId = 1; talentTabId < sTalentTabStore.GetNumRows(); ++talentTabId)
|
||||
{
|
||||
TalentTabEntry const *talentTabInfo = sTalentTabStore.LookupEntry( talentTabId );
|
||||
if(!talentTabInfo)
|
||||
continue;
|
||||
|
||||
if(!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
|
||||
continue;
|
||||
|
||||
for(uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
|
||||
{
|
||||
TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
|
||||
if(!talentInfo)
|
||||
continue;
|
||||
|
||||
// skip another tab talents
|
||||
if(talentInfo->TalentTab != talentTabId)
|
||||
continue;
|
||||
|
||||
// find max talent rank
|
||||
int32 curtalent_maxrank = -1;
|
||||
for(int32 k = 4; k > -1; --k)
|
||||
{
|
||||
if(talentInfo->RankID[k] && pet->HasSpell(talentInfo->RankID[k]))
|
||||
{
|
||||
curtalent_maxrank = k;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// not learned talent
|
||||
if(curtalent_maxrank < 0)
|
||||
continue;
|
||||
|
||||
*data << uint32(talentInfo->TalentID); // Talent.dbc
|
||||
*data << uint8(curtalent_maxrank); // talentMaxRank (0-4)
|
||||
|
||||
++talentIdCount;
|
||||
}
|
||||
|
||||
data->put<uint8>(countPos, talentIdCount); // put real count
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Player::SendTalentsInfoData(bool pet)
|
||||
{
|
||||
WorldPacket data(SMSG_TALENTS_INFO, 50);
|
||||
data << uint8(pet ? 1 : 0);
|
||||
if(pet)
|
||||
BuildPetTalentsInfoData(&data);
|
||||
else
|
||||
BuildPlayerTalentsInfoData(&data);
|
||||
GetSession()->SendPacket(&data);
|
||||
}
|
||||
|
||||
void Player::BuildEnchantmentsInfoData(WorldPacket *data)
|
||||
{
|
||||
uint32 slotUsedMask = 0;
|
||||
size_t slotUsedMaskPos = data->wpos();
|
||||
*data << uint32(slotUsedMask); // slotUsedMask < 0x80000
|
||||
|
||||
for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
|
||||
{
|
||||
Item *item = GetItemByPos(INVENTORY_SLOT_BAG_0, i);
|
||||
|
||||
if(!item)
|
||||
continue;
|
||||
|
||||
slotUsedMask |= (1 << i);
|
||||
|
||||
*data << uint32(item->GetEntry()); // item entry
|
||||
|
||||
uint16 enchantmentMask = 0;
|
||||
size_t enchantmentMaskPos = data->wpos();
|
||||
*data << uint16(enchantmentMask); // enchantmentMask < 0x1000
|
||||
|
||||
for(uint32 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j)
|
||||
{
|
||||
uint32 enchId = item->GetEnchantmentId(EnchantmentSlot(j));
|
||||
|
||||
if(!enchId)
|
||||
continue;
|
||||
|
||||
enchantmentMask |= (1 << j);
|
||||
|
||||
*data << uint16(enchId); // enchantmentId?
|
||||
}
|
||||
|
||||
data->put<uint16>(enchantmentMaskPos, enchantmentMask);
|
||||
|
||||
*data << uint16(0); // ?
|
||||
*data << uint8(0); // PGUID!
|
||||
*data << uint32(0); // seed?
|
||||
}
|
||||
|
||||
data->put<uint32>(slotUsedMaskPos, slotUsedMask);
|
||||
}
|
||||
|
||||
void Player::SendEquipmentSetList()
|
||||
{
|
||||
uint32 count = 0;
|
||||
WorldPacket data(SMSG_EQUIPMENT_SET_LIST, 4);
|
||||
size_t count_pos = data.wpos();
|
||||
data << uint32(count); // count placeholder
|
||||
for(EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
|
||||
{
|
||||
if(itr->second.state==EQUIPMENT_SET_DELETED)
|
||||
continue;
|
||||
data.appendPackGUID(itr->second.Guid);
|
||||
data << uint32(itr->first);
|
||||
data << itr->second.Name;
|
||||
data << itr->second.IconName;
|
||||
for(uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
|
||||
data.appendPackGUID(MAKE_NEW_GUID(itr->second.Items[i], 0, HIGHGUID_ITEM));
|
||||
|
||||
++count; // client have limit but it checked at loading and set
|
||||
}
|
||||
data.put<uint32>(count_pos, count);
|
||||
GetSession()->SendPacket(&data);
|
||||
}
|
||||
|
||||
void Player::SetEquipmentSet(uint32 index, EquipmentSet eqset)
|
||||
{
|
||||
if(eqset.Guid != 0)
|
||||
{
|
||||
bool found = false;
|
||||
|
||||
for(EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
|
||||
{
|
||||
if((itr->second.Guid == eqset.Guid) && (itr->first == index))
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(!found) // something wrong...
|
||||
{
|
||||
sLog.outError("Player %s tried to save equipment set "UI64FMTD" (index %u), but that equipment set not found!", GetName(), eqset.Guid, index);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
EquipmentSet& eqslot = m_EquipmentSets[index];
|
||||
|
||||
EquipmentSetUpdateState old_state = eqslot.state;
|
||||
|
||||
eqslot = eqset;
|
||||
|
||||
if(eqset.Guid == 0)
|
||||
{
|
||||
eqslot.Guid = objmgr.GenerateEquipmentSetGuid();
|
||||
|
||||
WorldPacket data(SMSG_EQUIPMENT_SET_SAVED, 4 + 1);
|
||||
data << uint32(index);
|
||||
data.appendPackGUID(eqslot.Guid);
|
||||
GetSession()->SendPacket(&data);
|
||||
}
|
||||
|
||||
eqslot.state = old_state == EQUIPMENT_SET_NEW ? EQUIPMENT_SET_NEW : EQUIPMENT_SET_CHANGED;
|
||||
}
|
||||
|
||||
void Player::_SaveEquipmentSets()
|
||||
{
|
||||
for(EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end();)
|
||||
{
|
||||
uint32 index = itr->first;
|
||||
EquipmentSet& eqset = itr->second;
|
||||
switch(eqset.state)
|
||||
{
|
||||
case EQUIPMENT_SET_UNCHANGED:
|
||||
++itr;
|
||||
break; // nothing do
|
||||
case EQUIPMENT_SET_CHANGED:
|
||||
CharacterDatabase.PExecute("UPDATE character_equipmentsets SET name='%s', iconname='%s', item0='%u', item1='%u', item2='%u', item3='%u', item4='%u', item5='%u', item6='%u', item7='%u', item8='%u', item9='%u', item10='%u', item11='%u', item12='%u', item13='%u', item14='%u', item15='%u', item16='%u', item17='%u', item18='%u' WHERE guid='%u' AND setguid='"UI64FMTD"' AND setindex='%u'",
|
||||
eqset.Name.c_str(), eqset.IconName.c_str(), eqset.Items[0], eqset.Items[1], eqset.Items[2], eqset.Items[3], eqset.Items[4], eqset.Items[5], eqset.Items[6], eqset.Items[7],
|
||||
eqset.Items[8], eqset.Items[9], eqset.Items[10], eqset.Items[11], eqset.Items[12], eqset.Items[13], eqset.Items[14], eqset.Items[15], eqset.Items[16], eqset.Items[17], eqset.Items[18], GetGUIDLow(), eqset.Guid, index);
|
||||
eqset.state = EQUIPMENT_SET_UNCHANGED;
|
||||
++itr;
|
||||
break;
|
||||
case EQUIPMENT_SET_NEW:
|
||||
CharacterDatabase.PExecute("INSERT INTO character_equipmentsets VALUES ('%u', '"UI64FMTD"', '%u', '%s', '%s', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u')",
|
||||
GetGUIDLow(), eqset.Guid, index, eqset.Name.c_str(), eqset.IconName.c_str(), eqset.Items[0], eqset.Items[1], eqset.Items[2], eqset.Items[3], eqset.Items[4], eqset.Items[5], eqset.Items[6], eqset.Items[7],
|
||||
eqset.Items[8], eqset.Items[9], eqset.Items[10], eqset.Items[11], eqset.Items[12], eqset.Items[13], eqset.Items[14], eqset.Items[15], eqset.Items[16], eqset.Items[17], eqset.Items[18]);
|
||||
eqset.state = EQUIPMENT_SET_UNCHANGED;
|
||||
++itr;
|
||||
break;
|
||||
case EQUIPMENT_SET_DELETED:
|
||||
CharacterDatabase.PExecute("DELETE FROM character_equipmentsets WHERE setguid="UI64FMTD, eqset.Guid);
|
||||
m_EquipmentSets.erase(itr++);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Player::DeleteEquipmentSet(uint64 setGuid)
|
||||
{
|
||||
for(EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
|
||||
{
|
||||
if(itr->second.Guid == setGuid)
|
||||
{
|
||||
if(itr->second.state == EQUIPMENT_SET_NEW)
|
||||
m_EquipmentSets.erase(itr);
|
||||
else
|
||||
itr->second.state = EQUIPMENT_SET_DELETED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Player::ActivateSpec(uint32 specNum)
|
||||
{
|
||||
if(GetActiveSpec() == specNum)
|
||||
return;
|
||||
|
||||
resetTalents(true);
|
||||
}
|
||||
|
|
@ -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
|
||||
{
|
||||
VANITYPET_SLOT_START = 118, // not use, vanity pets stored as spells
|
||||
VANITYPET_SLOT_END = 136 // not allowed any content in.
|
||||
};
|
||||
|
||||
enum CurrencyTokenSlots // 32 slots
|
||||
{
|
||||
CURRENCYTOKEN_SLOT_START = 136,
|
||||
CURRENCYTOKEN_SLOT_END = 168
|
||||
CURRENCYTOKEN_SLOT_START = 118,
|
||||
CURRENCYTOKEN_SLOT_END = 150
|
||||
};
|
||||
|
||||
enum QuestBagSlots // 32 slots
|
||||
enum EquipmentSetUpdateState
|
||||
{
|
||||
QUESTBAG_SLOT_START = 168, // not use
|
||||
QUESTBAG_SLOT_END = 200 // not allowed any content in.
|
||||
EQUIPMENT_SET_UNCHANGED = 0,
|
||||
EQUIPMENT_SET_CHANGED = 1,
|
||||
EQUIPMENT_SET_NEW = 2,
|
||||
EQUIPMENT_SET_DELETED = 3
|
||||
};
|
||||
|
||||
struct EquipmentSet
|
||||
{
|
||||
EquipmentSet() : Guid(0), state(EQUIPMENT_SET_NEW)
|
||||
{
|
||||
for(int i = 0; i < EQUIPMENT_SLOT_END; ++i)
|
||||
Items[i] = 0;
|
||||
}
|
||||
|
||||
uint64 Guid;
|
||||
std::string Name;
|
||||
std::string IconName;
|
||||
uint32 Items[EQUIPMENT_SLOT_END];
|
||||
EquipmentSetUpdateState state;
|
||||
};
|
||||
|
||||
#define MAX_EQUIPMENT_SET_INDEX 10 // client limit
|
||||
|
||||
typedef std::map<uint32, EquipmentSet> EquipmentSets;
|
||||
|
||||
struct ItemPosCount
|
||||
{
|
||||
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 <TBC,WotLK> expansion installed to access this area.
|
||||
TRANSFER_ABORT_DIFFICULTY = 0x07, // <Normal,Heroic,Epic> 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 <TBC,WotLK> expansion installed to access this area.
|
||||
TRANSFER_ABORT_DIFFICULTY = 0x08, // <Normal,Heroic,Epic> 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;
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ void PointMovementGenerator<T>::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<class T>
|
||||
|
|
|
|||
|
|
@ -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" );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -91,13 +91,13 @@ RandomMovementGenerator<Creature>::_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<Creature>::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<Creature>::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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ TargetedMovementGenerator<T>::_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<class T>
|
||||
|
|
@ -93,12 +93,12 @@ void
|
|||
TargetedMovementGenerator<T>::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<T>::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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -71,9 +71,9 @@ inline uint32 Traveller<T>::GetTotalTrevelTimeTo(float x, float y, float z)
|
|||
template<>
|
||||
inline float Traveller<Creature>::Speed()
|
||||
{
|
||||
if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_WALK_MODE))
|
||||
if(i_traveller.HasUnitMovementFlag(MONSTER_MOVE_WALK))
|
||||
return i_traveller.GetSpeed(MOVE_WALK);
|
||||
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<Player>::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<Player>::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<Creature> CreatureTraveller;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -109,7 +109,7 @@ bool WaypointMovementGenerator<Creature>::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<Creature>::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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -244,6 +244,8 @@ World::AddSession_ (WorldSession* s)
|
|||
s->SendPacket (&packet);
|
||||
|
||||
s->SendAddonsInfo();
|
||||
s->SendTutorialsData();
|
||||
|
||||
UpdateMaxSessionCounters ();
|
||||
|
||||
// Updates the population
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<WorldPacket*, ACE_Thread_Mutex> _recvQueue;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
||||
void AuthCrypt::Init(BigNumber *K)
|
||||
{
|
||||
uint8 ServerEncryptionKey[SEED_KEY_SIZE] = { 0x22, 0xBE, 0xE5, 0xCF, 0xBB, 0x07, 0x64, 0xD9, 0x00, 0x45, 0x1B, 0xD0, 0x24, 0xB8, 0xD5, 0x45 };
|
||||
HmacHash serverEncryptHmac(SEED_KEY_SIZE, (uint8*)ServerEncryptionKey);
|
||||
uint8 *encryptHash = serverEncryptHmac.ComputeHash(K);
|
||||
|
||||
uint8 ServerDecryptionKey[SEED_KEY_SIZE] = { 0xF4, 0x66, 0x31, 0x59, 0xFC, 0x83, 0x6E, 0x31, 0x31, 0x02, 0x51, 0xD5, 0x44, 0x31, 0x67, 0x98 };
|
||||
HmacHash clientDecryptHmac(SEED_KEY_SIZE, (uint8*)ServerDecryptionKey);
|
||||
uint8 *decryptHash = clientDecryptHmac.ComputeHash(K);
|
||||
|
||||
//SARC4 _serverDecrypt(encryptHash);
|
||||
_clientDecrypt.Init(decryptHash);
|
||||
_serverEncrypt.Init(encryptHash);
|
||||
//SARC4 _clientEncrypt(decryptHash);
|
||||
|
||||
uint8 syncBuf[1024];
|
||||
|
||||
memset(syncBuf, 0, 1024);
|
||||
|
||||
_serverEncrypt.UpdateData(1024, syncBuf);
|
||||
//_clientEncrypt.UpdateData(1024, syncBuf);
|
||||
|
||||
memset(syncBuf, 0, 1024);
|
||||
|
||||
//_serverDecrypt.UpdateData(1024, syncBuf);
|
||||
_clientDecrypt.UpdateData(1024, syncBuf);
|
||||
|
||||
_initialized = true;
|
||||
}
|
||||
|
||||
void AuthCrypt::DecryptRecv(uint8 *data, size_t len)
|
||||
{
|
||||
if (!_initialized) return;
|
||||
if (len < CRYPTED_RECV_LEN) return;
|
||||
if (!_initialized)
|
||||
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;
|
||||
}
|
||||
_clientDecrypt.UpdateData(len, data);
|
||||
}
|
||||
|
||||
void AuthCrypt::EncryptSend(uint8 *data, size_t len)
|
||||
{
|
||||
if (!_initialized) return;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
void AuthCrypt::SetKey(BigNumber *bn)
|
||||
{
|
||||
uint8 *key = new uint8[SHA_DIGEST_LENGTH];
|
||||
GenerateKey(key, bn);
|
||||
_key.resize(SHA_DIGEST_LENGTH);
|
||||
std::copy(key, key + SHA_DIGEST_LENGTH, _key.begin());
|
||||
delete[] key;
|
||||
}
|
||||
|
||||
AuthCrypt::~AuthCrypt()
|
||||
{
|
||||
}
|
||||
|
||||
void AuthCrypt::GenerateKey(uint8 *key, BigNumber *bn)
|
||||
{
|
||||
HmacHash hash;
|
||||
hash.UpdateBigNumber(bn);
|
||||
hash.Finalize();
|
||||
memcpy(key, hash.GetDigest(), SHA_DIGEST_LENGTH);
|
||||
_serverEncrypt.UpdateData(len, data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
#define _AUTHCRYPT_H
|
||||
|
||||
#include <Common.h>
|
||||
#include <vector>
|
||||
#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<uint8> _key;
|
||||
uint8 _send_i, _send_j, _recv_i, _recv_j;
|
||||
SARC4 _clientDecrypt;
|
||||
SARC4 _serverEncrypt;
|
||||
bool _initialized;
|
||||
};
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -33,6 +33,8 @@ libmangosauth_a_SOURCES = \
|
|||
BigNumber.h \
|
||||
Hmac.cpp \
|
||||
Hmac.h \
|
||||
SARC4.cpp \
|
||||
SARC4.h \
|
||||
Sha1.cpp \
|
||||
Sha1.h \
|
||||
md5.c \
|
||||
|
|
|
|||
52
src/shared/Auth/SARC4.cpp
Normal file
52
src/shared/Auth/SARC4.cpp
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "Auth/SARC4.h"
|
||||
#include <openssl/sha.h>
|
||||
|
||||
SARC4::SARC4()
|
||||
{
|
||||
EVP_CIPHER_CTX_init(&m_ctx);
|
||||
EVP_EncryptInit_ex(&m_ctx, EVP_rc4(), NULL, NULL, NULL);
|
||||
EVP_CIPHER_CTX_set_key_length(&m_ctx, SHA_DIGEST_LENGTH);
|
||||
}
|
||||
|
||||
SARC4::SARC4(uint8 *seed)
|
||||
{
|
||||
EVP_CIPHER_CTX_init(&m_ctx);
|
||||
EVP_EncryptInit_ex(&m_ctx, EVP_rc4(), NULL, NULL, NULL);
|
||||
EVP_CIPHER_CTX_set_key_length(&m_ctx, SHA_DIGEST_LENGTH);
|
||||
EVP_EncryptInit_ex(&m_ctx, NULL, NULL, seed, NULL);
|
||||
}
|
||||
|
||||
SARC4::~SARC4()
|
||||
{
|
||||
EVP_CIPHER_CTX_cleanup(&m_ctx);
|
||||
}
|
||||
|
||||
void SARC4::Init(uint8 *seed)
|
||||
{
|
||||
EVP_EncryptInit_ex(&m_ctx, NULL, NULL, seed, NULL);
|
||||
}
|
||||
|
||||
void SARC4::UpdateData(int len, uint8 *data)
|
||||
{
|
||||
int outlen = 0;
|
||||
EVP_EncryptUpdate(&m_ctx, data, &outlen, data, len);
|
||||
EVP_EncryptFinal_ex(&m_ctx, data, &outlen);
|
||||
}
|
||||
36
src/shared/Auth/SARC4.h
Normal file
36
src/shared/Auth/SARC4.h
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _AUTH_SARC4_H
|
||||
#define _AUTH_SARC4_H
|
||||
|
||||
#include "Common.h"
|
||||
#include <openssl/evp.h>
|
||||
|
||||
class SARC4
|
||||
{
|
||||
public:
|
||||
SARC4();
|
||||
SARC4(uint8 *seed);
|
||||
~SARC4();
|
||||
void Init(uint8 *seed);
|
||||
void UpdateData(int len, uint8 *data);
|
||||
private:
|
||||
EVP_CIPHER_CTX m_ctx;
|
||||
};
|
||||
#endif
|
||||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __REVISION_NR_H__
|
||||
#define __REVISION_NR_H__
|
||||
#define REVISION_NR "7987"
|
||||
#define REVISION_NR "7988"
|
||||
#endif // __REVISION_NR_H__
|
||||
|
|
|
|||
|
|
@ -433,6 +433,7 @@
|
|||
<ClCompile Include="..\..\src\shared\Auth\AuthCrypt.cpp" />
|
||||
<ClCompile Include="..\..\src\shared\Auth\BigNumber.cpp" />
|
||||
<ClCompile Include="..\..\src\shared\Auth\Hmac.cpp" />
|
||||
<ClCompile Include="..\..\src\shared\Auth\SARC4.cpp" />
|
||||
<ClCompile Include="..\..\src\shared\Auth\Sha1.cpp" />
|
||||
<ClCompile Include="..\..\src\shared\Base.cpp" />
|
||||
<ClCompile Include="..\..\src\shared\Common.cpp" />
|
||||
|
|
@ -469,6 +470,7 @@
|
|||
<ClInclude Include="..\..\src\shared\Auth\AuthCrypt.h" />
|
||||
<ClInclude Include="..\..\src\shared\Auth\BigNumber.h" />
|
||||
<ClInclude Include="..\..\src\shared\Auth\Hmac.h" />
|
||||
<ClInclude Include="..\..\src\shared\Auth\SARC4.h" />
|
||||
<ClInclude Include="..\..\src\shared\Auth\Sha1.h" />
|
||||
<ClInclude Include="..\..\src\shared\Base.h" />
|
||||
<ClInclude Include="..\..\src\shared\ByteBuffer.h" />
|
||||
|
|
|
|||
|
|
@ -728,6 +728,14 @@
|
|||
RelativePath="..\..\src\shared\Auth\Hmac.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\shared\Auth\SARC4.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\shared\Auth\SARC4.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\shared\Auth\Sha1.cpp"
|
||||
>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -733,6 +733,14 @@
|
|||
RelativePath="..\..\src\shared\Auth\Hmac.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\shared\Auth\SARC4.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\shared\Auth\SARC4.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\shared\Auth\Sha1.cpp"
|
||||
>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue