diff --git a/sql/mangos.sql b/sql/mangos.sql index 9468feb9d..8d37c3efe 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -24,7 +24,7 @@ CREATE TABLE `db_version` ( `version` varchar(120) default NULL, `creature_ai_version` varchar(120) default NULL, `cache_id` int(10) default '0', - `required_8996_01_mangos_spell_proc_event` bit(1) default NULL + `required_9007_01_mangos_spell_proc_event` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; -- @@ -14085,7 +14085,7 @@ INSERT INTO `spell_bonus_data` VALUES (31803, 0, 0.0156, 0.03, 'Paladin - Holy Vengeance'), (2812, 0.07, 0, 0.07, 'Paladin - Holy Wrath'), (54158, 0.25, 0, 0, 'Paladin - Judgement'), -(31898, 0.18, 0, 0.11, 'Paladin - Judgement of Blood Enemy'), +(31898, 0.18, 0, 0.11, 'Paladin - Judgement of Blood Enemy'), (32220, 0.0594, 0, 0.0363,'Paladin - Judgement of Blood Self'), (20467, 0.25, 0, 0.16, 'Paladin - Judgement of Command'), (53733, 0, 0, 0, 'Paladin - Judgement of Corruption'), @@ -17882,7 +17882,7 @@ INSERT INTO `spell_proc_event` VALUES (20234, 0x00000000, 10, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (20235, 0x00000000, 10, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (20335, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000008, 0x00000100, 0x00000000, 0.000000, 100.000000,0), -(20375, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 7.000000, 0.000000, 0), +(20375, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 7.000000, 0.000000, 1), (20500, 0x00000000, 4, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (20501, 0x00000000, 4, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (20705, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), @@ -18040,6 +18040,7 @@ INSERT INTO `spell_proc_event` VALUES (33191, 0x00000000, 6, 0x00808000, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (33192, 0x00000000, 6, 0x00808000, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (33193, 0x00000000, 6, 0x00808000, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), +(33297, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), (33299, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0), (33510, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 5.000000, 0.000000, 0), (33648, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), @@ -18057,7 +18058,7 @@ INSERT INTO `spell_proc_event` VALUES (34139, 0x00000000, 10, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (34258, 0x00000000, 10, 0x00000400, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (34262, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0), -(34320, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), +(34320, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 45), (34355, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3), (34457, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (34497, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), @@ -18125,10 +18126,11 @@ INSERT INTO `spell_proc_event` VALUES (38026, 0x00000001, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0.000000, 0.000000, 0), (38031, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0), (38290, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 1.600000, 0.000000, 0), +(38299, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 12), (38326, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (38327, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (38334, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60), -(38347, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), +(38347, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 45), (38350, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (38394, 0x00000000, 5, 0x00000006, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (38857, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0), @@ -18274,7 +18276,7 @@ INSERT INTO `spell_proc_event` VALUES (49530, 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), +(50781, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 6), (50880, 0x00000010, 15, 0x00000000, 0x00000800, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (51123, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (51127, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), @@ -18285,6 +18287,7 @@ INSERT INTO `spell_proc_event` VALUES (51349, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 10), (51352, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 10), (51359, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 10), +(51414, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), (51466, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (51470, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (51474, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0), @@ -18386,11 +18389,15 @@ INSERT INTO `spell_proc_event` VALUES (54489, 0x00000000, 0, 0x20000021, 0x00009000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (54490, 0x00000000, 0, 0x20000021, 0x00009000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (54646, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00015400, 0x00000002, 0.000000, 0.000000, 0), -(54738, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), +(54695, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), +(54707, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60), +(54738, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 45), (54747, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0), (54749, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0), (54754, 0x00000000, 7, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), -(54841, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), +(54808, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60), +(54838, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), +(54841, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 3), (54936, 0x00000000, 10, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (54937, 0x00000000, 10, 0x80000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (54939, 0x00000000, 10, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), @@ -18428,6 +18435,7 @@ INSERT INTO `spell_proc_event` VALUES (56822, 0x00000000, 15, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (56834, 0x00000000, 15, 0x00440000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (56835, 0x00000000, 15, 0x00440000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), +(57345, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), (57352, 0x00000000, 0, 0x00000001, 0x00000040, 0x00000000, 0x00010154, 0x00000003, 0.000000, 0.000000, 45), (57470, 0x00000000, 6, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (57472, 0x00000000, 6, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), @@ -18440,6 +18448,8 @@ INSERT INTO `spell_proc_event` VALUES (58364, 0x00000000, 4, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (58372, 0x00000000, 4, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (58386, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0.000000, 0.000000, 0), +(58442, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 15), +(58444, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 5), (58597, 0x00000000, 10, 0x40000000, 0x00000000, 0x00000000, 0x00008000, 0x00000000, 0.000000, 100.000000,0), (58616, 0x00000000, 15, 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (58620, 0x00000000, 15, 0x00000000, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), @@ -18450,19 +18460,34 @@ INSERT INTO `spell_proc_event` VALUES (58677, 0x00000000, 15, 0x00002000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0), (58872, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0), (58874, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0), -(58901, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), +(58901, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 45), (59057, 0x00000000, 15, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (59176, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (59327, 0x00000000, 15, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), +(59345, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), +(59630, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), (59725, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800, 0.000000, 0.000000, 0), +(60061, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), +(60063, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), +(60066, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), (60132, 0x00000000, 15, 0x00000000, 0x08020000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (60170, 0x00000000, 5, 0x00000006, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (60172, 0x00000000, 5, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0), +(60221, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), +(60301, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), +(60306, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), +(60317, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), (60436, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), (60442, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), +(60473, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), +(60482, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), +(60487, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 15), +(60490, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), (60493, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), (60503, 0x00000000, 4, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), -(60537, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), +(60519, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), +(60529, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), +(60537, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 45), (60564, 0x00000000, 11, 0x90100000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (60571, 0x00000000, 11, 0x90100000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (60572, 0x00000000, 11, 0x90100000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), @@ -18485,7 +18510,8 @@ INSERT INTO `spell_proc_event` VALUES (61324, 0x00000000, 10, 0x00000000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (61345, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (61346, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), -(61356, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), +(61356, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x000002A8, 0x00000002, 0.000000, 0.000000, 45), +(61618, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), (61846, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0.000000, 0.000000, 0), (61847, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0.000000, 0.000000, 0), (62600, 0x00000000, 7, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), diff --git a/sql/realmd.sql b/sql/realmd.sql index 2b8bc64a3..03f604064 100644 --- a/sql/realmd.sql +++ b/sql/realmd.sql @@ -21,7 +21,7 @@ DROP TABLE IF EXISTS `realmd_db_version`; CREATE TABLE `realmd_db_version` ( - `required_8728_01_realmd_account` bit(1) default NULL + `required_9010_01_realmd_realmlist` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB'; -- @@ -161,6 +161,7 @@ CREATE TABLE `realmlist` ( `timezone` tinyint(3) unsigned NOT NULL default '0', `allowedSecurityLevel` tinyint(3) unsigned NOT NULL default '0', `population` float unsigned NOT NULL default '0', + `realmbuilds` varchar(64) NOT NULL default '', PRIMARY KEY (`id`), UNIQUE KEY `idx_name` (`name`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Realm System'; diff --git a/sql/updates/8253_01_mangos_spell_chain.sql b/sql/updates/8253_01_mangos_spell_chain.sql index 207a22381..54bfea2c5 100644 --- a/sql/updates/8253_01_mangos_spell_chain.sql +++ b/sql/updates/8253_01_mangos_spell_chain.sql @@ -1,6 +1,6 @@ ALTER TABLE db_version CHANGE COLUMN required_8251_03_mangos_spell_proc_event required_8253_01_mangos_spell_chain bit; -DELETE FROM `spell_chain` WHERE `spell_id` IN (32385,32387,32392,32393,32394,51528,51529,51530,51531,51532); +DELETE FROM `spell_chain` WHERE `spell_id` IN (32385,32387,32392,32393,32394,51528,51529,51530,51531,51532); INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES /*Shadow embrace*/ (32385,0,32385,1,0), diff --git a/sql/updates/8253_02_mangos_spell_proc_event.sql b/sql/updates/8253_02_mangos_spell_proc_event.sql index 8e3472cbc..6d490be0b 100644 --- a/sql/updates/8253_02_mangos_spell_proc_event.sql +++ b/sql/updates/8253_02_mangos_spell_proc_event.sql @@ -6,16 +6,16 @@ INSERT INTO spell_proc_event VALUES (60442, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45); /*Seal of wisdom*/ -DELETE FROM `spell_proc_event` WHERE `entry` IN (20166); +DELETE FROM `spell_proc_event` WHERE `entry` IN (20166); INSERT INTO `spell_proc_event` VALUES -(20166, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,15.000000, 0.000000, 0); +(20166, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,15.000000, 0.000000, 0); /*Shadow embrace*/ -DELETE FROM `spell_proc_event` WHERE `entry` IN (32385); +DELETE FROM `spell_proc_event` WHERE `entry` IN (32385); INSERT INTO `spell_proc_event` VALUES -(32385, 0x00000000, 5, 0x00000001, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0); +(32385, 0x00000000, 5, 0x00000001, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0); /*Maelstrom Weapon*/ -DELETE FROM `spell_proc_event` WHERE `entry` IN (51528); +DELETE FROM `spell_proc_event` WHERE `entry` IN (51528); INSERT INTO `spell_proc_event` VALUES -(51528, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,12.500000, 0.000000, 0); +(51528, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,12.500000, 0.000000, 0); diff --git a/sql/updates/8254_01_mangos_spell_proc_event.sql b/sql/updates/8254_01_mangos_spell_proc_event.sql index 9be248781..66d33f707 100644 --- a/sql/updates/8254_01_mangos_spell_proc_event.sql +++ b/sql/updates/8254_01_mangos_spell_proc_event.sql @@ -1,6 +1,6 @@ ALTER TABLE db_version CHANGE COLUMN required_8253_02_mangos_spell_proc_event required_8254_01_mangos_spell_proc_event bit; -DELETE FROM `spell_proc_event` WHERE `entry` IN (55747,60436); +DELETE FROM `spell_proc_event` WHERE `entry` IN (55747,60436); INSERT INTO `spell_proc_event` VALUES (55747, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), (60436, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45); diff --git a/sql/updates/8294_01_mangos_playercreateinfo_action.sql b/sql/updates/8294_01_mangos_playercreateinfo_action.sql index 802f3ab4f..ed58c65e7 100644 --- a/sql/updates/8294_01_mangos_playercreateinfo_action.sql +++ b/sql/updates/8294_01_mangos_playercreateinfo_action.sql @@ -41,7 +41,7 @@ INSERT INTO playercreateinfo_action VALUES DELETE FROM playercreateinfo_action WHERE race=2 AND class=3 AND button IN (4,9); INSERT INTO playercreateinfo_action VALUES (2,3,9,20572,0); --- Moved Berserking to correct action bar location for Non-Heroic Troll classes +-- Moved Berserking to correct action bar location for Non-Heroic Troll classes DELETE FROM playercreateinfo_action WHERE race=8 AND class IN (3,5,7,8) AND button IN (3,76); INSERT INTO playercreateinfo_action VALUES (8,3,3,20554,0), diff --git a/sql/updates/8392_01_mangos_spell_proc_event.sql b/sql/updates/8392_01_mangos_spell_proc_event.sql index 39a7cc17b..01e3e2633 100644 --- a/sql/updates/8392_01_mangos_spell_proc_event.sql +++ b/sql/updates/8392_01_mangos_spell_proc_event.sql @@ -1,5 +1,5 @@ ALTER TABLE db_version CHANGE COLUMN required_8377_01_mangos_spell_area required_8392_01_mangos_spell_proc_event bit; -DELETE FROM `spell_proc_event` WHERE `entry` IN (47569); -INSERT INTO `spell_proc_event` VALUES -(47569, 0x00000000, 6, 0x00004000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0); +DELETE FROM `spell_proc_event` WHERE `entry` IN (47569); +INSERT INTO `spell_proc_event` VALUES +(47569, 0x00000000, 6, 0x00004000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0); diff --git a/sql/updates/8392_02_mangos_spell_chain.sql b/sql/updates/8392_02_mangos_spell_chain.sql index efab4d1ea..b42519c95 100644 --- a/sql/updates/8392_02_mangos_spell_chain.sql +++ b/sql/updates/8392_02_mangos_spell_chain.sql @@ -1,6 +1,6 @@ ALTER TABLE db_version CHANGE COLUMN required_8392_01_mangos_spell_proc_event required_8392_02_mangos_spell_chain bit; -DELETE FROM `spell_chain` WHERE `spell_id` IN (47569,47570); +DELETE FROM `spell_chain` WHERE `spell_id` IN (47569,47570); INSERT INTO `spell_chain` (`spell_id`, `prev_spell`, `first_spell`, `rank`, `req_spell`) VALUES /*Improved Shadowform*/ (47569,0,47569,1,0), diff --git a/sql/updates/8394_01_mangos_spell_proc_event.sql b/sql/updates/8394_01_mangos_spell_proc_event.sql index 73afa3da5..41fbcd0f2 100644 --- a/sql/updates/8394_01_mangos_spell_proc_event.sql +++ b/sql/updates/8394_01_mangos_spell_proc_event.sql @@ -1,5 +1,5 @@ ALTER TABLE db_version CHANGE COLUMN required_8392_02_mangos_spell_chain required_8394_01_mangos_spell_proc_event bit; -DELETE FROM `spell_proc_event` WHERE `entry` IN (54646); -INSERT INTO `spell_proc_event` VALUES -(54646, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00015400, 0x00000002, 0.000000, 0.000000, 0); +DELETE FROM `spell_proc_event` WHERE `entry` IN (54646); +INSERT INTO `spell_proc_event` VALUES +(54646, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00015400, 0x00000002, 0.000000, 0.000000, 0); diff --git a/sql/updates/8402_01_characters_guild_eventlog.sql b/sql/updates/8402_01_characters_guild_eventlog.sql index 107639d39..10ee6c9f4 100644 --- a/sql/updates/8402_01_characters_guild_eventlog.sql +++ b/sql/updates/8402_01_characters_guild_eventlog.sql @@ -15,6 +15,6 @@ CREATE TABLE `guild_eventlog` ( PRIMARY KEY (`guildid`, `LogGuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'Guild Eventlog'; --- The reason i decided for such dramatic change is that old guild_eventlog table didn't have Primary key and +-- The reason i decided for such dramatic change is that old guild_eventlog table didn't have Primary key and -- used LogGuids from 0 to infinity -- New system uses LogGuids from 0 to number defined in config. diff --git a/sql/updates/8402_02_characters_guild_bank_eventlog.sql b/sql/updates/8402_02_characters_guild_bank_eventlog.sql index 0cee36c4c..4782111a2 100644 --- a/sql/updates/8402_02_characters_guild_bank_eventlog.sql +++ b/sql/updates/8402_02_characters_guild_bank_eventlog.sql @@ -18,6 +18,6 @@ CREATE TABLE `guild_bank_eventlog` ( KEY `guildid_key` (`guildid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; --- The reason i decided for such dramatic change is that old guild_bank_eventlog table used `TabId` = 0 for Money events and +-- The reason i decided for such dramatic change is that old guild_bank_eventlog table used `TabId` = 0 for Money events and -- used `LogGuid` from 0 to infinity -- New system uses `LogGuid` from 0 to number defined in config. diff --git a/sql/updates/8487_01_mangos_spell_bonus_data.sql b/sql/updates/8487_01_mangos_spell_bonus_data.sql index 880f4773b..ecd2e7fac 100644 --- a/sql/updates/8487_01_mangos_spell_bonus_data.sql +++ b/sql/updates/8487_01_mangos_spell_bonus_data.sql @@ -12,7 +12,7 @@ INSERT INTO `spell_bonus_data` VALUES (53733, 0, 0, 0, "Paladin - Judgement of Corruption"), (31893, 0, 0, 0, "Paladin - Seal of Blood Proc Enemy"), (32221, 0, 0, 0, "Paladin - Seal of Blood Proc Self"), -(31898, 0.18, 0, 0.11, "Paladin - Judgement of Blood Enemy"), +(31898, 0.18, 0, 0.11, "Paladin - Judgement of Blood Enemy"), (32220, 0.0594, 0, 0.0363, "Paladin - Judgement of Blood Self"), (53719, 0, 0, 0, "Paladin - Seal of the Martyr Proc Enemy"), (53718, 0, 0, 0, "Paladin - Seal of the Martyr Proc Self"), diff --git a/sql/updates/8803_02_mangos_playercreateinfo_action.sql b/sql/updates/8803_02_mangos_playercreateinfo_action.sql index 077d4d29d..de2ce0d01 100644 --- a/sql/updates/8803_02_mangos_playercreateinfo_action.sql +++ b/sql/updates/8803_02_mangos_playercreateinfo_action.sql @@ -1,5 +1,5 @@ ALTER TABLE db_version CHANGE COLUMN required_8803_01_mangos_playercreateinfo_spell required_8803_02_mangos_playercreateinfo_action bit; -UPDATE `playercreateinfo_action` +UPDATE `playercreateinfo_action` SET `action` = 26297 WHERE `action` IN (20554,26296,50621) AND `type` = 0; diff --git a/sql/updates/8923_01_mangos_gossip.sql b/sql/updates/8923_01_mangos_gossip.sql index 896c66def..b49541912 100644 --- a/sql/updates/8923_01_mangos_gossip.sql +++ b/sql/updates/8923_01_mangos_gossip.sql @@ -66,6 +66,7 @@ ALTER TABLE locales_npc_option ADD menu_id smallint(6) unsigned NOT NULL default ALTER TABLE locales_npc_option DROP PRIMARY KEY; ALTER TABLE locales_npc_option ADD PRIMARY KEY (menu_id, id); +DROP TABLE IF EXISTS locales_gossip_menu_option; RENAME TABLE locales_npc_option TO locales_gossip_menu_option; DROP TABLE IF EXISTS npc_option; diff --git a/sql/updates/8992_01_mangos_spell_proc_event.sql b/sql/updates/8992_01_mangos_spell_proc_event.sql index 0a1c795b2..a049ac01b 100644 --- a/sql/updates/8992_01_mangos_spell_proc_event.sql +++ b/sql/updates/8992_01_mangos_spell_proc_event.sql @@ -7,7 +7,7 @@ INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `Spell /*Frenzy*/ DELETE FROM `spell_proc_event` WHERE `entry` IN (20784); -INSERT INTO `spell_proc_event` (`entry` ,`SchoolMask` ,`SpellFamilyName` ,`SpellFamilyMask0` ,`SpellFamilyMask1` ,`SpellFamilyMask2` ,`procFlags` ,`procEx` ,`ppmRate` ,`CustomChance` ,`Cooldown`)VALUES +INSERT INTO `spell_proc_event` (`entry` ,`SchoolMask` ,`SpellFamilyName` ,`SpellFamilyMask0` ,`SpellFamilyMask1` ,`SpellFamilyMask2` ,`procFlags` ,`procEx` ,`ppmRate` ,`CustomChance` ,`Cooldown`)VALUES (20784, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0); /*Master Tactician*/ diff --git a/sql/updates/9001_01_mangos_spell_proc_event.sql b/sql/updates/9001_01_mangos_spell_proc_event.sql new file mode 100644 index 000000000..14099fe51 --- /dev/null +++ b/sql/updates/9001_01_mangos_spell_proc_event.sql @@ -0,0 +1,5 @@ +ALTER TABLE db_version CHANGE COLUMN required_8996_01_mangos_spell_proc_event required_9001_01_mangos_spell_proc_event bit; + +DELETE FROM spell_proc_event WHERE entry=57345; +INSERT INTO spell_proc_event VALUES +(57345, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45); diff --git a/sql/updates/9005_01_mangos_spell_proc_event.sql b/sql/updates/9005_01_mangos_spell_proc_event.sql new file mode 100644 index 000000000..fb32bc61b --- /dev/null +++ b/sql/updates/9005_01_mangos_spell_proc_event.sql @@ -0,0 +1,5 @@ +ALTER TABLE db_version CHANGE COLUMN required_9001_01_mangos_spell_proc_event required_9005_01_mangos_spell_proc_event bit; + +DELETE FROM spell_proc_event WHERE entry = '60487'; +INSERT INTO spell_proc_event VALUES +(60487, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 15); diff --git a/sql/updates/9007_01_mangos_spell_proc_event.sql b/sql/updates/9007_01_mangos_spell_proc_event.sql new file mode 100644 index 000000000..6d6423568 --- /dev/null +++ b/sql/updates/9007_01_mangos_spell_proc_event.sql @@ -0,0 +1,41 @@ +ALTER TABLE db_version CHANGE COLUMN required_9005_01_mangos_spell_proc_event required_9007_01_mangos_spell_proc_event bit; + +DELETE FROM spell_proc_event WHERE entry IN ( +20375, 33297, 34320, 38299, 38347, 50781, 51414, 54695, 54707, 54738, 54808, +54838, 54841, 58442, 58444, 58901, 59345, 59630, 60061, 60063, 60066, 60221, +60301, 60306, 60317, 60473, 60482, 60490, 60519, 60529, 60537, 61356, 61618); + +INSERT INTO spell_proc_event(entry, SchoolMask, SpellFamilyName, SpellFamilyMask0, SpellFamilyMask1, SpellFamilyMask2, procFlags, procEx, ppmRate, CustomChance, Cooldown) VALUES +(20375, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 7.000000, 0.000000, 1), -- Seal of Command +(33297, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Quagmirran's Eye +(34320, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 45), -- Shiffar's Nexus-Horn +(38299, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 12), -- Fel Reaver's Piston +(38347, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 45), -- Sextant of Unstable Currents +(50781, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 6), -- Fate Rune of Primal Energy +(51414, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Venomous Tome +(54695, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Death Knight's Anguish +(54707, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60), -- Sonic Booster +(54738, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 45), -- Serrah's Star +(54808, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60), -- Noise Machine +(54838, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Valonforth's Remembrance +(54841, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 3), -- Thunder Capacitor +(58442, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 15), -- Airy Pale Ale +(58444, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 5), -- Worg Tooth Oatmeal Stout +(58901, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 45), -- Tears of Bitter Anguish +(59345, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Crusader's Locket +(59630, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Black Magic +(60061, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Scarab of the Infinite Cycle +(60063, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Sundial of the Exiled +(60066, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Hourglass of the Unraveller +(60221, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Essence of Gossamer +(60301, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Meteorite Whetstone +(60306, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Vestige of Haldor +(60317, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Signet of Edward the Odd +(60473, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Forge Ember +(60482, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Pendulum of Telluric Currents +(60490, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Embrace of the Spider +(60519, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Spark of Life +(60529, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), -- Forethought Talisman +(60537, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 45), -- Soul of the Dead +(61356, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x000002A8, 0x00000002, 0.000000, 0.000000, 45), -- Invigorating Earthsiege Diamond +(61618, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45); -- Chuchu's Tiny Box of Horrors diff --git a/sql/updates/9010_01_realmd_realmlist.sql b/sql/updates/9010_01_realmd_realmlist.sql new file mode 100644 index 000000000..223e5d678 --- /dev/null +++ b/sql/updates/9010_01_realmd_realmlist.sql @@ -0,0 +1,4 @@ +ALTER TABLE realmd_db_version CHANGE COLUMN required_8728_01_realmd_account required_9010_01_realmd_realmlist bit; + +ALTER TABLE realmlist + ADD COLUMN realmbuilds varchar(64) NOT NULL default '' AFTER population; diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index 4a0300e6c..56d235f6d 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -208,6 +208,10 @@ pkgdata_DATA = \ 8993_01_mangos_spell_proc_event.sql \ 8995_01_mangos_spell_proc_event.sql \ 8996_01_mangos_spell_proc_event.sql \ + 9001_01_mangos_spell_proc_event.sql \ + 9005_01_mangos_spell_proc_event.sql \ + 9007_01_mangos_spell_proc_event.sql \ + 9010_01_realmd_realmlist.sql \ README ## Additional files to include when running 'make dist' @@ -396,4 +400,8 @@ EXTRA_DIST = \ 8993_01_mangos_spell_proc_event.sql \ 8995_01_mangos_spell_proc_event.sql \ 8996_01_mangos_spell_proc_event.sql \ + 9001_01_mangos_spell_proc_event.sql \ + 9005_01_mangos_spell_proc_event.sql \ + 9007_01_mangos_spell_proc_event.sql \ + 9010_01_realmd_realmlist.sql \ README diff --git a/src/game/DBCStructure.h b/src/game/DBCStructure.h index 7eca5cdba..78025add1 100644 --- a/src/game/DBCStructure.h +++ b/src/game/DBCStructure.h @@ -1491,11 +1491,11 @@ struct SpellShapeshiftEntry int32 creatureType; // 20 <=0 humanoid, other normal creature types //uint32 unk1; // 21 unused, related to next field uint32 attackSpeed; // 22 - //uint32 modelID; // 23 unused, alliance modelid (where horde case?) - //uint32 unk2; // 24 unused, also modelid (single case) - //uint32 unk3; // 25 unused, all zeros - //uint32 unk4; // 26 unused, all zeros - //uint32 spellids[8]; // 27-34 unused + uint32 modelID_A; // 23 alliance modelid (0 means no model) + uint32 modelID_H; // 24 horde modelid (but only for one form) + //uint32 unk3; // 25 unused always 0 + //uint32 unk4; // 26 unused always 0 + //uint32 spell[8]; // 27-34 unused, spells which appear in the bar after shapeshifting }; struct SpellDurationEntry diff --git a/src/game/DBCfmt.h b/src/game/DBCfmt.h index 20ceff1b8..0d0fadef7 100644 --- a/src/game/DBCfmt.h +++ b/src/game/DBCfmt.h @@ -91,7 +91,7 @@ const char SpellItemEnchantmentConditionfmt[]="nbbbbbxxxxxbbbbbbbbbbiiiiiXXXXX"; const char SpellRadiusfmt[]="nfxf"; const char SpellRangefmt[]="nffffxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char SpellRuneCostfmt[]="niiii"; -const char SpellShapeshiftfmt[]="nxxxxxxxxxxxxxxxxxxiixixxxxxxxxxxxx"; +const char SpellShapeshiftfmt[]="nxxxxxxxxxxxxxxxxxxiixiiixxxxxxxxxx"; const char StableSlotPricesfmt[] = "ni"; const char SummonPropertiesfmt[] = "niiiii"; const char TalentEntryfmt[]="niiiiiiiixxxxixxixxxxxx"; diff --git a/src/game/Mail.cpp b/src/game/Mail.cpp index 0557b6a59..fda9b7714 100644 --- a/src/game/Mail.cpp +++ b/src/game/Mail.cpp @@ -914,7 +914,7 @@ void MailDraft::SendReturnToSender(uint32 sender_acc, uint32 sender_guid, uint32 void MailDraft::SendMailTo(MailReceiver const& receiver, MailSender const& sender, MailCheckMask checked, uint32 deliver_delay) { Player* pReceiver = receiver.GetPlayer(); // can be NULL - + if (pReceiver) prepareItems(pReceiver); // generate mail template items diff --git a/src/game/NPCHandler.cpp b/src/game/NPCHandler.cpp index 80a049303..a489f8bb5 100644 --- a/src/game/NPCHandler.cpp +++ b/src/game/NPCHandler.cpp @@ -306,7 +306,8 @@ void WorldSession::HandleGossipSelectOptionOpcode( WorldPacket & recv_data ) // TODO: determine if scriptCall is needed for GO and also if scriptCall can be same as current, with modified argument WorldObject* - if (IS_CREATURE_GUID(guid)) + // can vehicle have gossip? If so, need check for this also. + if (IS_CREATURE_OR_PET_GUID(guid)) { Creature *pCreature = GetPlayer()->GetNPCIfCanInteractWith(guid, UNIT_NPC_FLAG_NONE); diff --git a/src/game/PetHandler.cpp b/src/game/PetHandler.cpp index a58f7e5bf..8dc158f3d 100644 --- a/src/game/PetHandler.cpp +++ b/src/game/PetHandler.cpp @@ -352,22 +352,28 @@ void WorldSession::HandlePetSetAction( WorldPacket & recv_data ) } } - // check swap + // check swap (at command->spell swap client remove spell first in another packet, so check only command move correctness) if (move_command) { uint8 act_state_0 = UNIT_ACTION_BUTTON_TYPE(data[0]); - uint32 spell_id_0 = UNIT_ACTION_BUTTON_ACTION(data[0]); - UnitActionBarEntry const* actionEntry_1 = charmInfo->GetActionBarEntry(position[1]); - if (!actionEntry_1 || spell_id_0 != actionEntry_1->GetAction() || - act_state_0 != actionEntry_1->GetType()) - return; + if(act_state_0 == ACT_COMMAND || act_state_0 == ACT_REACTION) + { + uint32 spell_id_0 = UNIT_ACTION_BUTTON_ACTION(data[0]); + UnitActionBarEntry const* actionEntry_1 = charmInfo->GetActionBarEntry(position[1]); + if (!actionEntry_1 || spell_id_0 != actionEntry_1->GetAction() || + act_state_0 != actionEntry_1->GetType()) + return; + } uint8 act_state_1 = UNIT_ACTION_BUTTON_TYPE(data[1]); - uint32 spell_id_1 = UNIT_ACTION_BUTTON_ACTION(data[1]); - UnitActionBarEntry const* actionEntry_0 = charmInfo->GetActionBarEntry(position[0]); - if (!actionEntry_0 || spell_id_1 != actionEntry_0->GetAction() || - act_state_1 != actionEntry_0->GetType()) - return; + if(act_state_1 == ACT_COMMAND || act_state_1 == ACT_REACTION) + { + uint32 spell_id_1 = UNIT_ACTION_BUTTON_ACTION(data[1]); + UnitActionBarEntry const* actionEntry_0 = charmInfo->GetActionBarEntry(position[0]); + if (!actionEntry_0 || spell_id_1 != actionEntry_0->GetAction() || + act_state_1 != actionEntry_0->GetType()) + return; + } } for(uint8 i = 0; i < count; ++i) diff --git a/src/game/PoolManager.cpp b/src/game/PoolManager.cpp index f1c41ca11..28093b14a 100644 --- a/src/game/PoolManager.cpp +++ b/src/game/PoolManager.cpp @@ -202,7 +202,7 @@ void PoolGroup::SpawnObject(uint32 limit, uint32 triggerFrom) int count = limit - m_SpawnedPoolAmount; // If triggered from some object respawn this object is still marked as spawned - // and also counted into m_SpawnedPoolAmount so we need increase count to be + // and also counted into m_SpawnedPoolAmount so we need increase count to be // spawned by 1 if (triggerFrom) ++count; diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index 9052f386b..6edbf5ba6 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -2640,4 +2640,10 @@ enum PetTameFailureReason PETTAME_UNKNOWNERROR = 12 }; +// 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.3.0a client build 11159... + +#define EXPECTED_MANGOSD_CLIENT_BUILD {11159, 0} + #endif diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 6467ff854..500f529d5 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -4320,7 +4320,7 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_BAD_IMPLICIT_TARGETS; Pet* target = m_caster->GetMap()->GetPet(((Player*)m_caster)->GetSelection()); - // alive + // alive if (!target || target->isDead()) return SPELL_FAILED_BAD_IMPLICIT_TARGETS; // undead diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 186d53825..993753eb3 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -2572,7 +2572,7 @@ void Aura::HandleAuraDummy(bool apply, bool Real) break; case SPELLFAMILY_WARLOCK: { - // Haunt + // Haunt if (GetSpellProto()->SpellIconID == 3172 && (GetSpellProto()->SpellFamilyFlags & UI64LIT(0x0004000000000000))) { // NOTE: for avoid use additional field damage stored in dummy value (replace unused 100% @@ -2923,86 +2923,68 @@ void Aura::HandleAuraModShapeshift(bool apply, bool Real) uint32 modelid = 0; Powers PowerType = POWER_MANA; ShapeshiftForm form = ShapeshiftForm(m_modifier.m_miscvalue); + + SpellShapeshiftEntry const* ssEntry = sSpellShapeshiftStore.LookupEntry(form); + if(ssEntry && ssEntry->modelID_A) + { + // i will asume that creatures will always take the defined model from the dbc + // since no field in creature_templates describes wether an alliance or + // horde modelid should be used at shapeshifting + if (m_target->GetTypeId() != TYPEID_PLAYER) + modelid = ssEntry->modelID_A; + else + { + // players are a bit difficult since the dbc has seldomly an horde modelid + // so we add hacks here to set the right model + if (Player::TeamForRace(m_target->getRace()) == ALLIANCE) + modelid = ssEntry->modelID_A; + else // 3.2.3 only the moonkin form has this information + modelid = ssEntry->modelID_H; + + // no model found, if player is horde we look here for our hardcoded modelids + if (!modelid && Player::TeamForRace(m_target->getRace()) == HORDE) + { + + switch(form) + { + case FORM_CAT: + modelid = 8571; + break; + case FORM_BEAR: + case FORM_DIREBEAR: + modelid = 2289; + break; + case FORM_FLIGHT: + modelid = 20872; + break; + case FORM_FLIGHT_EPIC: + modelid = 21244; + break; + // per default use alliance modelid + // mostly horde and alliance share the same + default: + modelid = ssEntry->modelID_A; + break; + } + } + } + } + + // now only powertype must be set switch(form) { case FORM_CAT: - if(Player::TeamForRace(m_target->getRace()) == ALLIANCE) - modelid = 892; - else - modelid = 8571; PowerType = POWER_ENERGY; break; - case FORM_TRAVEL: - modelid = 632; - break; - case FORM_AQUA: - if(Player::TeamForRace(m_target->getRace()) == ALLIANCE) - modelid = 2428; - else - modelid = 2428; - break; case FORM_BEAR: - if(Player::TeamForRace(m_target->getRace()) == ALLIANCE) - modelid = 2281; - else - modelid = 2289; - PowerType = POWER_RAGE; - break; - case FORM_GHOUL: - if(Player::TeamForRace(m_target->getRace()) == ALLIANCE) - modelid = 10045; - break; case FORM_DIREBEAR: - if(Player::TeamForRace(m_target->getRace()) == ALLIANCE) - modelid = 2281; - else - modelid = 2289; - PowerType = POWER_RAGE; - break; - case FORM_CREATUREBEAR: - modelid = 902; - break; - case FORM_GHOSTWOLF: - modelid = 4613; - break; - case FORM_FLIGHT: - if(Player::TeamForRace(m_target->getRace()) == ALLIANCE) - modelid = 20857; - else - modelid = 20872; - break; - case FORM_MOONKIN: - if(Player::TeamForRace(m_target->getRace()) == ALLIANCE) - modelid = 15374; - else - modelid = 15375; - break; - case FORM_FLIGHT_EPIC: - if(Player::TeamForRace(m_target->getRace()) == ALLIANCE) - modelid = 21243; - else - modelid = 21244; - break; - case FORM_METAMORPHOSIS: - modelid = 25277; - break; - case FORM_AMBIENT: - case FORM_SHADOW: - case FORM_STEALTH: - break; - case FORM_TREE: - modelid = 864; - break; case FORM_BATTLESTANCE: case FORM_BERSERKERSTANCE: case FORM_DEFENSIVESTANCE: PowerType = POWER_RAGE; break; - case FORM_SPIRITOFREDEMPTION: - modelid = 16031; - break; default: - sLog.outError("Auras: Unknown Shapeshift Type: %u, SpellId %u.", m_modifier.m_miscvalue, GetId()); + break; } // remove polymorph before changing display id to keep new display id @@ -5915,7 +5897,7 @@ void Aura::HandleSpellSpecificBoosts(bool apply) case SPELLFAMILY_MAGE: { // Ice Barrier (non stacking from one caster) - if (m_spellProto->SpellIconID == 32) + if (m_spellProto->SpellIconID == 32) { if (!apply && (m_removeMode == AURA_REMOVE_BY_DISPEL || (m_removeMode == AURA_REMOVE_BY_DEFAULT && !GetModifier()->m_amount))) { @@ -6010,7 +5992,7 @@ void Aura::HandleSpellSpecificBoosts(bool apply) for(Unit::AuraList::const_iterator itr = dummyAuras.begin(); itr != dummyAuras.end(); ++itr) { // Shadow Affinity - if ((*itr)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_PRIEST + if ((*itr)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_PRIEST && (*itr)->GetSpellProto()->SpellIconID == 178) { // custom cast code diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index db710d714..5ea7e012f 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -3414,16 +3414,15 @@ void Spell::EffectSummonType(uint32 i) { switch(summon_prop->Type) { - case SUMMON_PROP_TYPE_SIEGE_VEH: - case SUMMON_PROP_TYPE_DRAKE_VEH: + case SUMMON_PROP_TYPE_OTHER: { - // TODO - // EffectSummonVehicle(i); - break; - } - case SUMMON_PROP_TYPE_TOTEM: - { - EffectSummonTotem(i, summon_prop->Slot); + // those are classical totems - effectbasepoints is their hp and not summon ammount! + //SUMMON_TYPE_TOTEM = 121: 23035, battlestands + //SUMMON_TYPE_TOTEM2 = 647: 52893, Anti-Magic Zone (npc used) + if(prop_id == 121 || prop_id == 647) + EffectSummonTotem(i); + else + EffectSummonWild(i, summon_prop->FactionId); break; } case SUMMON_PROP_TYPE_SUMMON: @@ -3441,25 +3440,22 @@ void Spell::EffectSummonType(uint32 i) EffectSummonGuardian(i, summon_prop->FactionId); break; } + case SUMMON_PROP_TYPE_TOTEM: + EffectSummonTotem(i, summon_prop->Slot); + break; case SUMMON_PROP_TYPE_CRITTER: - case SUMMON_PROP_TYPE_REPAIR_BOT: - { EffectSummonCritter(i, summon_prop->FactionId); break; - } - case SUMMON_PROP_TYPE_OTHER: case SUMMON_PROP_TYPE_PHASING: case SUMMON_PROP_TYPE_LIGHTWELL: - { - // those are classical totems - effectbasepoints is their hp and not summon ammount! - //SUMMON_TYPE_TOTEM = 121: 23035, battlestands - //SUMMON_TYPE_TOTEM2 = 647: 52893, Anti-Magic Zone (npc used) - if(prop_id == 121 || prop_id == 647) - EffectSummonTotem(i); - else - EffectSummonWild(i, summon_prop->FactionId); + case SUMMON_PROP_TYPE_REPAIR_BOT: + EffectSummonWild(i, summon_prop->FactionId); + break; + case SUMMON_PROP_TYPE_SIEGE_VEH: + case SUMMON_PROP_TYPE_DRAKE_VEH: + // TODO + // EffectSummonVehicle(i); break; - } default: sLog.outError("EffectSummonType: Unhandled summon type %u", summon_prop->Type); break; diff --git a/src/game/SpellHandler.cpp b/src/game/SpellHandler.cpp index da998c78f..ce6b3f715 100644 --- a/src/game/SpellHandler.cpp +++ b/src/game/SpellHandler.cpp @@ -311,6 +311,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) // not have spell in spellbook or spell passive and not casted by client if (!((Player*)mover)->HasActiveSpell (spellId) || IsPassiveSpell(spellId) ) { + sLog.outError("World: Player %u casts spell %u which he shouldn't have", mover->GetGUIDLow(), spellId); //cheater? kick? ban? recvPacket.rpos(recvPacket.wpos()); // prevent spam at ignore packet return; diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 5bcac4181..b1a5d84d2 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -6253,7 +6253,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu break; } // Sacred Shield (talent rank) - case 53601: + case 53601: { triggered_spell_id = 58597; target = this; @@ -7638,16 +7638,6 @@ bool Unit::HandleOverrideClassScriptAuraProc(Unit *pVictim, uint32 damage, Aura case 6953: // Warbringer RemoveAurasAtMechanicImmunity(IMMUNE_TO_ROOT_AND_SNARE_MASK,0,true); return true; - case 8152: // Serendipity - { - // if heal your target over maximum health - if (pVictim->GetHealth() + damage < pVictim->GetMaxHealth()) - return false; - int32 cost = procSpell->manaCost + procSpell->ManaCostPercentage * GetCreateMana() / 100; - int32 basepoints0 = cost * triggeredByAura->GetModifier()->m_amount/100; - CastCustomSpell(this, 47762, &basepoints0, NULL, NULL, true, NULL, triggeredByAura); - return true; - } } // not processed @@ -8993,7 +8983,7 @@ bool Unit::isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolM // Lava Burst if (spellProto->SpellFamilyFlags & UI64LIT(0x0000100000000000)) { - // Flame Shock + // Flame Shock if (Aura *flameShock = pVictim->GetAura(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, UI64LIT(0x0000000010000000), 0, GetGUID())) return true; } @@ -10827,7 +10817,7 @@ int32 Unit::CalculateSpellDuration(SpellEntry const* spellProto, uint8 effect_in durationMod_always+=target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_DURATION_OF_EFFECTS_BY_DISPEL, spellProto->Dispel); // Find max mod (negative bonus) int32 durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, mechanic); - + if (!IsPositiveSpell(spellProto->Id)) durationMod_always += target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_DURATION_OF_MAGIC_EFFECTS, spellProto->DmgClass); @@ -13055,4 +13045,4 @@ void Unit::CleanupDeletedAuars() for(AuraList::const_iterator itr = m_deletedAuras.begin(); itr != m_deletedAuras.end(); ++itr) delete *itr; m_deletedAuras.clear(); -} \ No newline at end of file +} diff --git a/src/game/Unit.h b/src/game/Unit.h index 3f942586e..669916759 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -173,6 +173,11 @@ enum ShapeshiftForm FORM_AMBIENT = 0x06, FORM_GHOUL = 0x07, FORM_DIREBEAR = 0x08, + FORM_STEVES_GHOUL = 0x09, + FORM_THARONJA_SKELETON = 0x0A, + FORM_TEST_OF_STRENGTH = 0x0B, + FORM_BLB_PLAYER = 0x0C, + FORM_SHADOW_DANCE = 0x0D, FORM_CREATUREBEAR = 0x0E, FORM_CREATURECAT = 0x0F, FORM_GHOSTWOLF = 0x10, @@ -182,12 +187,14 @@ enum ShapeshiftForm FORM_TEST = 0x14, FORM_ZOMBIE = 0x15, FORM_METAMORPHOSIS = 0x16, + FORM_UNDEAD = 0x19, + FORM_FRENZY = 0x1A, FORM_FLIGHT_EPIC = 0x1B, FORM_SHADOW = 0x1C, FORM_FLIGHT = 0x1D, FORM_STEALTH = 0x1E, FORM_MOONKIN = 0x1F, - FORM_SPIRITOFREDEMPTION = 0x20 + FORM_SPIRITOFREDEMPTION = 0x20, }; // low byte ( 0 from 0..3 ) of UNIT_FIELD_BYTES_2 diff --git a/src/game/WorldSocket.cpp b/src/game/WorldSocket.cpp index ba7fbbefc..f76a1d142 100644 --- a/src/game/WorldSocket.cpp +++ b/src/game/WorldSocket.cpp @@ -745,7 +745,7 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) BigNumber K; // Read the content of the packet - recvPacket >> ClientBuild; // for now no use + recvPacket >> ClientBuild; recvPacket >> unk2; recvPacket >> account; recvPacket >> unk3; @@ -760,6 +760,29 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) unk3, clientSeed); + // Check the version of client trying to connect + bool valid_version = false; + int accepted_versions[] = EXPECTED_MANGOSD_CLIENT_BUILD; + for(int i = 0; accepted_versions[i]; ++i) + { + if(ClientBuild == accepted_versions[i]) + { + valid_version = true; + break; + } + } + + if(!valid_version) + { + packet.Initialize (SMSG_AUTH_RESPONSE, 1); + packet << uint8 (AUTH_VERSION_MISMATCH); + + SendPacket (packet); + + sLog.outError ("WorldSocket::HandleAuthSession: Sent Auth Response (version mismatch)."); + return -1; + } + // Get the account information from the realmd database std::string safe_account = account; // Duplicate, else will screw the SHA hash verification below loginDatabase.escape_string (safe_account); diff --git a/src/mangosd/Master.cpp b/src/mangosd/Master.cpp index 829725f32..d4c60d5dd 100644 --- a/src/mangosd/Master.cpp +++ b/src/mangosd/Master.cpp @@ -226,9 +226,17 @@ int Master::Run() ///- Launch WorldRunnable thread ACE_Based::Thread world_thread(new WorldRunnable); world_thread.setPriority(ACE_Based::Highest); - - // set server online - loginDatabase.PExecute("UPDATE realmlist SET color = 0, population = 0 WHERE id = '%d'",realmID); + + // set realmbuilds depend on mangosd expected builds, and set server online + { + std::ostringstream data; + int accepted_versions[] = EXPECTED_MANGOSD_CLIENT_BUILD; + for(int i = 0; accepted_versions[i]; ++i) + { + data << accepted_versions[i] << " "; + } + loginDatabase.PExecute("UPDATE realmlist SET color = 0, population = 0, realmbuilds = '%s' WHERE id = '%d'", data.str().c_str(), realmID); + } ACE_Based::Thread* cliThread = NULL; diff --git a/src/realmd/AuthCodes.h b/src/realmd/AuthCodes.h index 2ca888e96..1e104b3d8 100644 --- a/src/realmd/AuthCodes.h +++ b/src/realmd/AuthCodes.h @@ -64,11 +64,18 @@ enum LoginResult LOGIN_LOCKED_ENFORCED = 0x10, }; -// 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.3.0a client build 11159... +// will only support WoW 1.12.1/1.12.2 , WoW:TBC 2.4.3 and WoW:WotLK 3.2.2a, client builds 10505, 8606, 6005, 5875 +// if you need more from old build then add it in cases in relamd sources code +// list sorted from high to low build and first build used as low bound for accepted by default range (any > it will accepted by realmd at least) -#define EXPECTED_MANGOS_CLIENT_BUILD {11159, 0} +#define EXPECTED_REALMD_CLIENT_BUILD \ +{ \ + 10505, /* 3.2.2a and higher */ \ + 8606, /* 2.4.3 */ \ + 6005, /* 1.12.2 */ \ + 5875, /* 1.12.1 */ \ + 0 \ +} // At update excepted builds please update if need define DEFAULT_MAX_LEVEL // in DBCEnum.h to default max player level expected by build diff --git a/src/realmd/AuthSocket.cpp b/src/realmd/AuthSocket.cpp index 0c9cf073a..3f75e872e 100644 --- a/src/realmd/AuthSocket.cpp +++ b/src/realmd/AuthSocket.cpp @@ -22,14 +22,12 @@ #include "Common.h" #include "Database/DatabaseEnv.h" -#include "ByteBuffer.h" #include "Config/ConfigEnv.h" #include "Log.h" #include "RealmList.h" #include "AuthSocket.h" #include "AuthCodes.h" #include -#include "Auth/Sha1.h" //#include "Util.h" -- for commented utf8ToUpperOnlyLatin extern DatabaseType loginDatabase; @@ -129,6 +127,16 @@ typedef struct AUTH_LOGON_PROOF_S uint16 unk3; } sAuthLogonProof_S; +typedef struct AUTH_LOGON_PROOF_S_BUILD_6005 +{ + uint8 cmd; + uint8 error; + uint8 M2[20]; + //uint32 unk1; + uint32 unk2; + //uint16 unk3; +} sAuthLogonProof_S_BUILD_6005; + typedef struct AUTH_RECONNECT_PROOF_C { uint8 cmd; @@ -321,6 +329,40 @@ void AuthSocket::_SetVSFields(const std::string& rI) OPENSSL_free((void*)s_hex); } +void AuthSocket::SendProof(Sha1Hash sha) +{ + switch(_build) + { + case 5875: // 1.12.1 + case 6005: // 1.12.2 + { + sAuthLogonProof_S_BUILD_6005 proof; + memcpy(proof.M2, sha.GetDigest(), 20); + proof.cmd = AUTH_LOGON_PROOF; + proof.error = 0; + proof.unk2 = 0x00; + + SendBuf((char *)&proof, sizeof(proof)); + break; + } + case 8606: // 2.4.3 + case 10505: // 3.2.2a + default: // or later + { + sAuthLogonProof_S proof; + memcpy(proof.M2, sha.GetDigest(), 20); + proof.cmd = AUTH_LOGON_PROOF; + proof.error = 0; + proof.unk1 = 0x00800000; + proof.unk2 = 0x00; + proof.unk3 = 0x00; + + SendBuf((char *)&proof, sizeof(proof)); + break; + } + } +} + /// Logon Challenge command handler bool AuthSocket::_HandleLogonChallenge() { @@ -536,13 +578,19 @@ bool AuthSocket::_HandleLogonProof() ///- Check if the client has one of the expected version numbers bool valid_version = false; - int accepted_versions[] = EXPECTED_MANGOS_CLIENT_BUILD; - for(int i = 0; accepted_versions[i]; ++i) + int accepted_versions[] = EXPECTED_REALMD_CLIENT_BUILD; + if (_build >= accepted_versions[0]) // first build is low bound of always accepted range + valid_version = true; + else { - if(_build == accepted_versions[i]) + // continue from 1 with explict equal check + for(int i = 1; accepted_versions[i]; ++i) { - valid_version = true; - break; + if(_build == accepted_versions[i]) + { + valid_version = true; + break; + } } } @@ -690,16 +738,8 @@ bool AuthSocket::_HandleLogonProof() sha.Initialize(); sha.UpdateBigNumbers(&A, &M, &K, NULL); sha.Finalize(); - - sAuthLogonProof_S proof; - memcpy(proof.M2, sha.GetDigest(), 20); - proof.cmd = AUTH_LOGON_PROOF; - proof.error = 0; - proof.unk1 = 0x00800000; - proof.unk2 = 0x00; - proof.unk3 = 0x00; - - SendBuf((char *)&proof, sizeof(proof)); + + SendProof(sha); ///- Set _authed to true! _authed = true; @@ -882,39 +922,8 @@ bool AuthSocket::_HandleRealmList() ///- Circle through realms in the RealmList and construct the return packet (including # of user characters in each realm) ByteBuffer pkt; - pkt << (uint32) 0; - pkt << (uint16) sRealmList.size(); - RealmList::RealmMap::const_iterator i; - for( i = sRealmList.begin(); i != sRealmList.end(); ++i ) - { - uint8 AmountOfCharacters; - - // No SQL injection. id of realm is controlled by the database. - result = loginDatabase.PQuery( "SELECT numchars FROM realmcharacters WHERE realmid = '%d' AND acctid='%u'",i->second.m_ID,id); - if( result ) - { - Field *fields = result->Fetch(); - AmountOfCharacters = fields[0].GetUInt8(); - delete result; - } - else - AmountOfCharacters = 0; - - uint8 lock = (i->second.allowedSecurityLevel > _accountSecurityLevel) ? 1 : 0; - - pkt << i->second.icon; // realm type - pkt << lock; // if 1, then realm locked - pkt << i->second.color; // if 2, then realm is offline - pkt << i->first; - pkt << i->second.address; - pkt << i->second.populationLevel; - pkt << AmountOfCharacters; - pkt << i->second.timezone; // realm category - pkt << (uint8) 0x2C; // unk, may be realm number/id? - } - pkt << (uint8) 0x10; - pkt << (uint8) 0x00; - + LoadRealmlist(pkt, id); + ByteBuffer hdr; hdr << (uint8) REALM_LIST; hdr << (uint16)pkt.size(); @@ -925,6 +934,95 @@ bool AuthSocket::_HandleRealmList() return true; } +void AuthSocket::LoadRealmlist(ByteBuffer &pkt, uint32 acctid) +{ + switch(_build) + { + case 5875: // 1.12.1 + case 6005: // 1.12.2 + { + pkt << uint32(0); + pkt << uint8(sRealmList.size()); + + for(RealmList::RealmMap::const_iterator i = sRealmList.begin(); i != sRealmList.end(); ++i) + { + uint8 AmountOfCharacters; + + // No SQL injection. id of realm is controlled by the database. + QueryResult *result = loginDatabase.PQuery( "SELECT numchars FROM realmcharacters WHERE realmid = '%d' AND acctid='%u'", i->second.m_ID, acctid); + if( result ) + { + Field *fields = result->Fetch(); + AmountOfCharacters = fields[0].GetUInt8(); + delete result; + } + else + AmountOfCharacters = 0; + + // Show offline state for unsupported client builds + uint8 color = (std::find(i->second.realmbuilds.begin(), i->second.realmbuilds.end(), _build) != i->second.realmbuilds.end()) ? i->second.color : 2; + color = (i->second.allowedSecurityLevel > _accountSecurityLevel) ? 2 : color; + + pkt << uint32(i->second.icon); // realm type + pkt << uint8(color); // if 2, then realm is offline + pkt << i->first; // name + pkt << i->second.address; // address + pkt << float(i->second.populationLevel); + pkt << uint8(AmountOfCharacters); + pkt << uint8(i->second.timezone); // realm category + pkt << uint8(0x00); // unk, may be realm number/id? + } + + pkt << uint8(0x00); + pkt << uint8(0x02); + break; + } + + case 8606: // 2.4.3 + case 10505: // 3.2.2a + default: // and later + { + pkt << uint32(0); + pkt << uint16(sRealmList.size()); + + for(RealmList::RealmMap::const_iterator i = sRealmList.begin(); i != sRealmList.end(); ++i) + { + uint8 AmountOfCharacters; + + // No SQL injection. id of realm is controlled by the database. + QueryResult *result = loginDatabase.PQuery( "SELECT numchars FROM realmcharacters WHERE realmid = '%d' AND acctid='%u'", i->second.m_ID, acctid); + if( result ) + { + Field *fields = result->Fetch(); + AmountOfCharacters = fields[0].GetUInt8(); + delete result; + } + else + AmountOfCharacters = 0; + + uint8 lock = (i->second.allowedSecurityLevel > _accountSecurityLevel) ? 1 : 0; + + // Show offline state for unsupported client builds + uint8 color = (std::find(i->second.realmbuilds.begin(), i->second.realmbuilds.end(), _build) != i->second.realmbuilds.end()) ? i->second.color : 2; + + pkt << uint8(i->second.icon); // realm type + pkt << uint8(lock); // if 1, then realm locked + pkt << uint8(color); // if 2, then realm is offline + pkt << i->first; // name + pkt << i->second.address; // address + pkt << float(i->second.populationLevel); + pkt << uint8(AmountOfCharacters); + pkt << uint8(i->second.timezone); // realm category + pkt << uint8(0x2C); // unk, may be realm number/id? + } + + pkt << uint8(0x10); + pkt << uint8(0x00); + break; + } + } +} + /// Resume patch transfer bool AuthSocket::_HandleXferResume() { diff --git a/src/realmd/AuthSocket.h b/src/realmd/AuthSocket.h index cf82f34f7..4c892101b 100644 --- a/src/realmd/AuthSocket.h +++ b/src/realmd/AuthSocket.h @@ -31,6 +31,8 @@ #include "sockets/Utility.h" #include "sockets/Parse.h" #include "sockets/Socket.h" +#include "Auth/Sha1.h" +#include "ByteBuffer.h" /// Handle login commands class AuthSocket: public TcpSocket @@ -43,6 +45,8 @@ class AuthSocket: public TcpSocket void OnAccept(); void OnRead(); + void SendProof(Sha1Hash sha); + void LoadRealmlist(ByteBuffer &pkt, uint32 acctid); bool _HandleLogonChallenge(); bool _HandleLogonProof(); diff --git a/src/realmd/RealmList.cpp b/src/realmd/RealmList.cpp index 23255eb60..cf99f144c 100644 --- a/src/realmd/RealmList.cpp +++ b/src/realmd/RealmList.cpp @@ -22,6 +22,8 @@ #include "Common.h" #include "RealmList.h" +#include "AuthCodes.h" +#include "Util.h" // for Tokens typedef #include "Policies/SingletonImp.h" #include "Database/DatabaseEnv.h" @@ -48,11 +50,11 @@ void RealmList::Initialize(uint32 updateInterval) UpdateRealms(true); } -void RealmList::UpdateRealm( uint32 ID, const std::string& name, const std::string& address, uint32 port, uint8 icon, uint8 color, uint8 timezone, AccountTypes allowedSecurityLevel, float popu) -{ +void RealmList::UpdateRealm( uint32 ID, const std::string& name, const std::string& address, uint32 port, uint8 icon, uint8 color, uint8 timezone, AccountTypes allowedSecurityLevel, float popu, const char* builds) +{ ///- Create new if not exist or update existed Realm& realm = m_realms[name]; - + realm.m_ID = ID; realm.icon = icon; realm.color = color; @@ -60,6 +62,15 @@ void RealmList::UpdateRealm( uint32 ID, const std::string& name, const std::stri realm.allowedSecurityLevel = allowedSecurityLevel; realm.populationLevel = popu; + Tokens tokens = StrSplit(builds, " "); + Tokens::iterator iter; + + for (iter = tokens.begin(); iter != tokens.end(); ++iter) + { + uint32 build = atol((*iter).c_str()); + realm.realmbuilds.insert(build); + } + ///- Append port to IP address. std::ostringstream ss; ss << address << ":" << port; @@ -85,7 +96,8 @@ void RealmList::UpdateRealms(bool init) { sLog.outDetail("Updating Realm List..."); - QueryResult *result = loginDatabase.Query( "SELECT id, name, address, port, icon, color, timezone, allowedSecurityLevel, population FROM realmlist WHERE color <> 3 ORDER BY name" ); + //// 0 1 2 3 4 5 6 7 8 9 + QueryResult *result = loginDatabase.Query( "SELECT id, name, address, port, icon, color, timezone, allowedSecurityLevel, population, realmbuilds FROM realmlist WHERE color <> 3 ORDER BY name" ); ///- Circle through results and add them to the realm map if(result) @@ -96,9 +108,9 @@ void RealmList::UpdateRealms(bool init) uint8 allowedSecurityLevel = fields[7].GetUInt8(); - UpdateRealm(fields[0].GetUInt32(), fields[1].GetCppString(),fields[2].GetCppString(),fields[3].GetUInt32(),fields[4].GetUInt8(), fields[5].GetUInt8(), fields[6].GetUInt8(), (allowedSecurityLevel <= SEC_ADMINISTRATOR ? AccountTypes(allowedSecurityLevel) : SEC_ADMINISTRATOR), fields[8].GetFloat() ); + UpdateRealm(fields[0].GetUInt32(), fields[1].GetCppString(),fields[2].GetCppString(),fields[3].GetUInt32(),fields[4].GetUInt8(), fields[5].GetUInt8(), fields[6].GetUInt8(), (allowedSecurityLevel <= SEC_ADMINISTRATOR ? AccountTypes(allowedSecurityLevel) : SEC_ADMINISTRATOR), fields[8].GetFloat(), fields[9].GetString() ); if(init) - sLog.outString("Added realm \"%s\".", fields[1].GetString()); + sLog.outString("Added realm \"%s\"", fields[1].GetString()); } while( result->NextRow() ); delete result; } diff --git a/src/realmd/RealmList.h b/src/realmd/RealmList.h index 936f83e4e..a127ed68d 100644 --- a/src/realmd/RealmList.h +++ b/src/realmd/RealmList.h @@ -35,6 +35,7 @@ struct Realm uint32 m_ID; AccountTypes allowedSecurityLevel; float populationLevel; + std::set realmbuilds; }; /// Storage object for the list of realms on the server @@ -57,7 +58,7 @@ class RealmList uint32 size() const { return m_realms.size(); } private: void UpdateRealms(bool init); - void UpdateRealm( uint32 ID, const std::string& name, const std::string& address, uint32 port, uint8 icon, uint8 color, uint8 timezone, AccountTypes allowedSecurityLevel, float popu); + void UpdateRealm( uint32 ID, const std::string& name, const std::string& address, uint32 port, uint8 icon, uint8 color, uint8 timezone, AccountTypes allowedSecurityLevel, float popu, const char* builds); private: RealmMap m_realms; ///< Internal map of realms uint32 m_UpdateInterval; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 221acd420..20a391ce4 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "8997" + #define REVISION_NR "9010" #endif // __REVISION_NR_H__ diff --git a/src/shared/revision_sql.h b/src/shared/revision_sql.h index ac8865c84..4a288f87f 100644 --- a/src/shared/revision_sql.h +++ b/src/shared/revision_sql.h @@ -1,6 +1,6 @@ #ifndef __REVISION_SQL_H__ #define __REVISION_SQL_H__ #define REVISION_DB_CHARACTERS "required_8874_01_characters_character_skills" - #define REVISION_DB_MANGOS "required_8996_01_mangos_spell_proc_event" - #define REVISION_DB_REALMD "required_8728_01_realmd_account" + #define REVISION_DB_MANGOS "required_9007_01_mangos_spell_proc_event" + #define REVISION_DB_REALMD "required_9010_01_realmd_realmlist" #endif // __REVISION_SQL_H__