Merge remote branch 'origin/master' into 330

This commit is contained in:
tomrus88 2009-12-16 02:45:05 +03:00
commit c745c5072f
31 changed files with 1000 additions and 760 deletions

View file

@ -24,7 +24,7 @@ CREATE TABLE `db_version` (
`version` varchar(120) default NULL, `version` varchar(120) default NULL,
`creature_ai_version` varchar(120) default NULL, `creature_ai_version` varchar(120) default NULL,
`cache_id` int(10) default '0', `cache_id` int(10) default '0',
`required_8965_02_mangos_command` bit(1) default NULL `required_8996_01_mangos_spell_proc_event` bit(1) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';
-- --
@ -14174,6 +14174,7 @@ INSERT INTO `spell_bonus_data` VALUES
(30294, 0, 0, 0, 'Warlock - Soul Leech'), (30294, 0, 0, 0, 'Warlock - Soul Leech'),
(31117, 1.8, 0, 0, 'Warlock - Unstable Affliction Dispell'), (31117, 1.8, 0, 0, 'Warlock - Unstable Affliction Dispell'),
/* Item */ /* Item */
(56160, 0, 0, 0, 'Item - Glyph of Power Word: Shield'),
(40293, 0, 0, 0, 'Item - Siphon Essence'); (40293, 0, 0, 0, 'Item - Siphon Essence');
/*!40000 ALTER TABLE `spell_bonus_data` ENABLE KEYS */; /*!40000 ALTER TABLE `spell_bonus_data` ENABLE KEYS */;
UNLOCK TABLES; UNLOCK TABLES;
@ -14633,6 +14634,10 @@ INSERT INTO spell_chain VALUES
(27067,20910,19306,4,0), (27067,20910,19306,4,0),
(48998,27067,19306,5,0), (48998,27067,19306,5,0),
(48999,48998,19306,6,0), (48999,48998,19306,6,0),
/*Entrapment*/
(19184,0,19184,1,0),
(19387,19184,19184,2,0),
(19388,19387,19184,3,0),
/*ExplosiveShot*/ /*ExplosiveShot*/
(53301,0,53301,1,0), (53301,0,53301,1,0),
(60051,53301,53301,2,0), (60051,53301,53301,2,0),
@ -14649,6 +14654,10 @@ INSERT INTO spell_chain VALUES
(1499,0,1499,1,0), (1499,0,1499,1,0),
(14310,1499,1499,2,0), (14310,1499,1499,2,0),
(14311,14310,1499,3,0), (14311,14310,1499,3,0),
/*Hunting Party*/
(53290,0,53290,1,0),
(53291,53290,53290,2,0),
(53292,53291,53290,3,0),
/*ImmolationTrap*/ /*ImmolationTrap*/
(13795,0,13795,1,0), (13795,0,13795,1,0),
(14302,13795,13795,2,0), (14302,13795,13795,2,0),
@ -14658,6 +14667,12 @@ INSERT INTO spell_chain VALUES
(27023,14305,13795,6,0), (27023,14305,13795,6,0),
(49055,27023,13795,7,0), (49055,27023,13795,7,0),
(49056,49055,13795,8,0), (49056,49055,13795,8,0),
/**Master Tactician*/
(34506,0,34506,1,0),
(34507,34506,34506,2,0),
(34508,34507,34506,3,0),
(34838,34508,34506,4,0),
(34839,34838,34506,5,0),
/*MongooseBite*/ /*MongooseBite*/
(1495,0,1495,1,0), (1495,0,1495,1,0),
(14269,1495,1495,2,0), (14269,1495,1495,2,0),
@ -15088,7 +15103,7 @@ INSERT INTO spell_chain VALUES
/*------------------ /*------------------
--(163)Marksmanship --(163)Marksmanship
------------------*/ ------------------*/
/*AimedShot*/ /*Aimed Shot*/
(19434,0,19434,1,0), (19434,0,19434,1,0),
(20900,19434,19434,2,0), (20900,19434,19434,2,0),
(20901,20900,19434,3,0), (20901,20900,19434,3,0),
@ -15098,7 +15113,7 @@ INSERT INTO spell_chain VALUES
(27065,20904,19434,7,0), (27065,20904,19434,7,0),
(49049,27065,19434,8,0), (49049,27065,19434,8,0),
(49050,49049,19434,9,0), (49050,49049,19434,9,0),
/*ArcaneShot*/ /*Arcane Shot*/
(3044,0,3044,1,0), (3044,0,3044,1,0),
(14281,3044,3044,2,0), (14281,3044,3044,2,0),
(14282,14281,3044,3,0), (14282,14281,3044,3,0),
@ -15110,13 +15125,16 @@ INSERT INTO spell_chain VALUES
(27019,14287,3044,9,0), (27019,14287,3044,9,0),
(49044,27019,3044,10,0), (49044,27019,3044,10,0),
(49045,49044,3044,11,0), (49045,49044,3044,11,0),
/*Hunter'sMark*/ /*Concussive Barrage*/
(35100,0,35100,1,0),
(35102,35100,35100,2,0),
/*Hunter's Mark*/
(1130,0,1130,1,0), (1130,0,1130,1,0),
(14323,1130,1130,2,0), (14323,1130,1130,2,0),
(14324,14323,1130,3,0), (14324,14323,1130,3,0),
(14325,14324,1130,4,0), (14325,14324,1130,4,0),
(53338,14325,1130,5,0), (53338,14325,1130,5,0),
/*KillShot*/ /*Kill Shot*/
(53351,0,53351,1,0), (53351,0,53351,1,0),
(61005,53351,53351,2,0), (61005,53351,53351,2,0),
(61006,61005,53351,3,0), (61006,61005,53351,3,0),
@ -15771,6 +15789,10 @@ INSERT INTO spell_chain VALUES
(25289,11551,6673,7,0), (25289,11551,6673,7,0),
(2048,25289,6673,8,0), (2048,25289,6673,8,0),
(47436,2048,6673,9,0), (47436,2048,6673,9,0),
/*Bloodsurge*/
(46913,0,46913,1,0),
(46914,46913,46913,2,0),
(46915,46914,46913,3,0),
/*Cleave*/ /*Cleave*/
(845,0,845,1,0), (845,0,845,1,0),
(7369,845,845,2,0), (7369,845,845,2,0),
@ -16208,6 +16230,9 @@ INSERT INTO spell_chain VALUES
/*Frozen Power*/ /*Frozen Power*/
(63373,0,63373,1,0), (63373,0,63373,1,0),
(63374,63373,63373,2,0), (63374,63373,63373,2,0),
/*Improved Stormstrike*/
(51521,0,51521,1,0),
(51522,51521,51521,2,0),
/*Life Tap*/ /*Life Tap*/
(1454,0,1454,1,0), (1454,0,1454,1,0),
(1455,1454,1454,2,0), (1455,1454,1454,2,0),
@ -17836,9 +17861,7 @@ INSERT INTO `spell_proc_event` VALUES
(18119, 0x00000000, 5, 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (18119, 0x00000000, 5, 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(18120, 0x00000000, 5, 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (18120, 0x00000000, 5, 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(18820, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0), (18820, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0.000000, 0.000000, 0),
(19184, 0x00000000, 9, 0x00000014, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (19184, 0x00000000, 9, 0x00000010, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(19387, 0x00000000, 9, 0x00000014, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(19388, 0x00000000, 9, 0x00000014, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(19572, 0x00000000, 9, 0x00800000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0), (19572, 0x00000000, 9, 0x00800000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0),
(19573, 0x00000000, 9, 0x00800000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0), (19573, 0x00000000, 9, 0x00800000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0),
(20049, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (20049, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
@ -17863,6 +17886,7 @@ INSERT INTO `spell_proc_event` VALUES
(20500, 0x00000000, 4, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (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), (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), (20705, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(20784, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(20911, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000070, 0.000000, 0.000000, 0), (20911, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000070, 0.000000, 0.000000, 0),
(20925, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0), (20925, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0.000000, 0.000000, 0),
(21185, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 10), (21185, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 10),
@ -18035,12 +18059,14 @@ INSERT INTO `spell_proc_event` VALUES
(34262, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 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, 0),
(34355, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 3), (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), (34497, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(34498, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (34498, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(34499, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (34499, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(34500, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (34500, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(34502, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (34502, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(34503, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (34503, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(34506, 0x00000000, 9, 0x0007FA01, 0x00801081, 0x08000201, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(34584, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 30), (34584, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 30),
(34586, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 1.500000, 0.000000, 0), (34586, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 1.500000, 0.000000, 0),
(34598, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45), (34598, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 45),
@ -18061,8 +18087,7 @@ INSERT INTO `spell_proc_event` VALUES
(35080, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 1.000000, 0.000000, 60), (35080, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 1.000000, 0.000000, 60),
(35083, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60), (35083, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60),
(35086, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60), (35086, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 60),
(35100, 0x00000000, 9, 0x00003001, 0x00000000, 0x00000000, 0x00010140, 0x00000000, 0.000000, 0.000000, 0), (35100, 0x00000000, 9, 0x00001000, 0x00000000, 0x00000001, 0x00000100, 0x00000000, 0.000000, 0.000000, 0),
(35102, 0x00000000, 9, 0x00003001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(35121, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (35121, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(36096, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800, 0.000000, 0.000000, 0), (36096, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800, 0.000000, 0.000000, 0),
(36111, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (36111, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
@ -18189,9 +18214,7 @@ INSERT INTO `spell_proc_event` VALUES
(46854, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (46854, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(46855, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (46855, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(46867, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (46867, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(46913, 0x00000000, 4, 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (46913, 0x00000000, 4, 0x00000040, 0x00000404, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(46914, 0x00000000, 4, 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(46915, 0x00000000, 4, 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(46916, 0x00000000, 4, 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (46916, 0x00000000, 4, 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(46951, 0x00000000, 4, 0x00000400, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (46951, 0x00000000, 4, 0x00000400, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(46952, 0x00000000, 0, 0x00000400, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (46952, 0x00000000, 0, 0x00000400, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
@ -18270,6 +18293,7 @@ INSERT INTO `spell_proc_event` VALUES
(51483, 0x00000001, 11, 0x20000000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0), (51483, 0x00000001, 11, 0x20000000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0),
(51485, 0x00000001, 11, 0x20000000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0), (51485, 0x00000001, 11, 0x20000000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0),
(51486, 0x00000001, 11, 0x20000000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0), (51486, 0x00000001, 11, 0x20000000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0),
(51521, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 1),
(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),
(51556, 0x00000000, 11, 0x000000C0, 0x00000000, 0x00000010, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (51556, 0x00000000, 11, 0x000000C0, 0x00000000, 0x00000010, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(51557, 0x00000000, 11, 0x000000C0, 0x00000000, 0x00000010, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (51557, 0x00000000, 11, 0x000000C0, 0x00000000, 0x00000010, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
@ -18332,9 +18356,7 @@ INSERT INTO `spell_proc_event` VALUES
(53256, 0x00000000, 9, 0x00000800, 0x00800001, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53256, 0x00000000, 9, 0x00000800, 0x00800001, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53259, 0x00000000, 9, 0x00000800, 0x00800001, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53259, 0x00000000, 9, 0x00000800, 0x00800001, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53260, 0x00000000, 9, 0x00000800, 0x00800001, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53260, 0x00000000, 9, 0x00000800, 0x00800001, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53290, 0x00000000, 9, 0x00000800, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53290, 0x00000000, 9, 0x00000800, 0x00000001, 0x00000200, 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),
(53380, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53380, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53381, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53381, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53382, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53382, 0x00000000, 10, 0x00800000, 0x00020000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
@ -18353,6 +18375,7 @@ INSERT INTO `spell_proc_event` VALUES
(53646, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (53646, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(53671, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (53671, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(53673, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (53673, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(53817, 0x00000000, 11, 0x000001C3, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(54149, 0x00000000, 10, 0x00200000, 0x00010000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0), (54149, 0x00000000, 10, 0x00200000, 0x00010000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0),
(54151, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (54151, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(54154, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (54154, 0x00000000, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
@ -18405,7 +18428,7 @@ INSERT INTO `spell_proc_event` VALUES
(56822, 0x00000000, 15, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (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), (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), (56835, 0x00000000, 15, 0x00440000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(57352, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00010154, 0x00000003, 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), (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), (57472, 0x00000000, 6, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(57499, 0x00000000, 4, 0x40000001, 0x00010000, 0x00000000, 0x00014000, 0x00000000, 0.000000, 0.000000, 0), (57499, 0x00000000, 4, 0x40000001, 0x00010000, 0x00000000, 0x00014000, 0x00000000, 0.000000, 0.000000, 0),
@ -18424,7 +18447,7 @@ INSERT INTO `spell_proc_event` VALUES
(58631, 0x00000000, 15, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (58631, 0x00000000, 15, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(58644, 0x00000000, 15, 0x00000000, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (58644, 0x00000000, 15, 0x00000000, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(58647, 0x00000000, 15, 0x00000000, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (58647, 0x00000000, 15, 0x00000000, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(58677, 0x00000000, 15, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (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), (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), (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, 0),
@ -18456,6 +18479,7 @@ INSERT INTO `spell_proc_event` VALUES
(60770, 0x00000000, 11, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (60770, 0x00000000, 11, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(60818, 0x00000000, 10, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (60818, 0x00000000, 10, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(60826, 0x00000000, 15, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (60826, 0x00000000, 15, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(61062, 0x00000000, 3, 0x00000000, 0x00000100, 0x00000000, 0x00004000, 0x00010000, 0.000000, 0.000000, 0),
(61188, 0x00000000, 5, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (61188, 0x00000000, 5, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),
(61257, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x000202A8, 0x00010000, 0.000000, 0.000000, 0), (61257, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x000202A8, 0x00010000, 0.000000, 0.000000, 0),
(61324, 0x00000000, 10, 0x00000000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), (61324, 0x00000000, 10, 0x00000000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0),

View file

@ -0,0 +1,5 @@
ALTER TABLE db_version CHANGE COLUMN required_8965_02_mangos_command required_8980_01_mangos_spell_bonus_data bit;
DELETE FROM spell_bonus_data WHERE entry = 56160;
INSERT INTO spell_bonus_data (entry, direct_bonus, dot_bonus, ap_bonus, comments) VALUES
(56160, 0, 0, 0, 'Item - Glyph of Power Word: Shield');

View file

@ -0,0 +1,5 @@
ALTER TABLE db_version CHANGE COLUMN required_8980_01_mangos_spell_bonus_data required_8981_01_mangos_spell_proc_event bit;
DELETE FROM `spell_proc_event` WHERE `entry` = 57352;
INSERT INTO `spell_proc_event` VALUES
(57352, 0x00000000, 0, 0x00000001, 0x00000040, 0x00000000, 0x00010154, 0x00000003, 0.000000, 0.000000, 45);

View file

@ -0,0 +1,5 @@
ALTER TABLE db_version CHANGE COLUMN required_8981_01_mangos_spell_proc_event required_8988_01_mangos_spell_proc_event bit;
DELETE FROM `spell_proc_event` WHERE `entry` IN (53817);
INSERT INTO `spell_proc_event` VALUES
(53817, 0x00000000, 11, 0x00000143, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000,0);

View file

@ -0,0 +1,41 @@
ALTER TABLE db_version CHANGE COLUMN required_8988_01_mangos_spell_proc_event required_8992_01_mangos_spell_proc_event bit;
/*Ferocious Inspiration*/
DELETE FROM `spell_proc_event` WHERE `entry` IN (34457);
INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES
(34457, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0);
/*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
(20784, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0.000000, 0.000000, 0);
/*Master Tactician*/
DELETE FROM `spell_proc_event` WHERE `entry` IN (34506, 34507, 34508, 34838, 34839);
INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES
(34506, 0x00000000, 9, 0x0007FA01, 0x00801081, 0x08000201, 0x00000000, 0x00000000, 0.000000, 0.000000, 0);
/*Hunting Party*/
DELETE FROM `spell_proc_event` WHERE entry IN (53290, 53291, 53292);
INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES
(53290, 0x00000000, 9, 0x00000800, 0x00000001, 0x00000200, 0x00000000, 0x00000002, 0.000000, 0.000000, 0);
/*Bloodsurge*/
DELETE FROM `spell_proc_event` WHERE `entry` IN (46913, 46914, 46915);
INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `cooldown`) VALUES
(46913, 0x00000000, 4, 0x00000040, 0x00000404, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0);
/*Entrapment*/
DELETE FROM `spell_proc_event` WHERE `entry` IN (19184, 19387, 19388);
INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES
(19184, 0x00000000, 9, 0x00000010, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0);
/*Concussive Barrage*/
DELETE FROM `spell_proc_event` WHERE `entry` IN (35100, 35102);
INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES
(35100, 0x00000000, 9, 0x00001000, 0x00000000, 0x00000001, 0x00000100, 0x00000000, 0.000000, 0.000000, 0);
/*Improved Stormstrike*/
DELETE FROM `spell_proc_event` WHERE `entry` IN (51521, 51522);
INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES
(51521, 0x00000000, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 1);

View file

@ -0,0 +1,43 @@
ALTER TABLE db_version CHANGE COLUMN required_8992_01_mangos_spell_proc_event required_8992_02_mangos_spell_chain bit;
/*Master Tactician*/
DELETE FROM spell_chain WHERE first_spell = 34506;
INSERT INTO spell_chain VALUES
(34506, 0, 34506, 1, 0),
(34507, 34506, 34506, 2, 0),
(34508, 34507, 34506, 3, 0),
(34838, 34508, 34506, 4, 0),
(34839, 34838, 34506, 5, 0);
/*Hunting Party*/
DELETE FROM spell_chain WHERE first_spell = 53290;
INSERT INTO spell_chain VALUES
(53290, 0, 53290, 1, 0),
(53291, 53290, 53290, 2, 0),
(53292, 53291, 53290, 3, 0);
/*Bloodsurge*/
DELETE FROM spell_chain WHERE first_spell = 46913;
INSERT INTO spell_chain VALUES
(46913, 0, 46913, 1, 0),
(46914, 46913, 46913, 2, 0),
(46915, 46914, 46913, 3, 0);
/*Entrapment*/
DELETE FROM spell_chain WHERE first_spell = 19184;
INSERT INTO spell_chain VALUES
(19184, 0, 19184, 1, 0),
(19387, 19184, 19184, 2, 0),
(19388, 19387, 19184, 3, 0);
/*Concussive Barrage*/
DELETE FROM spell_chain WHERE first_spell = 35100;
INSERT INTO spell_chain VALUES
(35100, 0, 35100, 1, 0),
(35102, 35100, 35100, 2, 0);
/*Improved Stormstrike*/
DELETE FROM spell_chain WHERE first_spell = 51521;
INSERT INTO spell_chain VALUES
(51521, 0, 51521, 1, 0),
(51522, 51521, 51521, 2, 0);

View file

@ -0,0 +1,5 @@
ALTER TABLE db_version CHANGE COLUMN required_8992_02_mangos_spell_chain required_8993_01_mangos_spell_proc_event bit;
DELETE FROM `spell_proc_event` WHERE `entry` IN (53817);
INSERT INTO `spell_proc_event` VALUES
(53817, 0x00000000, 11, 0x000001C3, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000,0);

View file

@ -0,0 +1,5 @@
ALTER TABLE db_version CHANGE COLUMN required_8993_01_mangos_spell_proc_event required_8995_01_mangos_spell_proc_event bit;
DELETE FROM spell_proc_event WHERE entry=58677;
INSERT INTO spell_proc_event VALUES
(58677, 0x00000000, 15, 0x00002000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0.000000, 0.000000, 0);

View file

@ -0,0 +1,6 @@
ALTER TABLE db_version CHANGE COLUMN required_8995_01_mangos_spell_proc_event required_8996_01_mangos_spell_proc_event bit;
DELETE FROM spell_proc_event WHERE entry=61062;
INSERT INTO spell_proc_event VALUES
(61062, 0x00000000, 3, 0x00000000, 0x00000100, 0x00000000, 0x00004000, 0x00010000, 0.000000, 0.000000, 0);

View file

@ -200,6 +200,14 @@ pkgdata_DATA = \
8950_01_mangos_spell_proc_event.sql \ 8950_01_mangos_spell_proc_event.sql \
8965_01_mangos_mangos_string.sql \ 8965_01_mangos_mangos_string.sql \
8965_02_mangos_command.sql \ 8965_02_mangos_command.sql \
8980_01_mangos_spell_bonus_data.sql \
8981_01_mangos_spell_proc_event.sql \
8988_01_mangos_spell_proc_event.sql \
8992_01_mangos_spell_proc_event.sql \
8992_02_mangos_spell_chain.sql \
8993_01_mangos_spell_proc_event.sql \
8995_01_mangos_spell_proc_event.sql \
8996_01_mangos_spell_proc_event.sql \
README README
## Additional files to include when running 'make dist' ## Additional files to include when running 'make dist'
@ -380,4 +388,12 @@ EXTRA_DIST = \
8950_01_mangos_spell_proc_event.sql \ 8950_01_mangos_spell_proc_event.sql \
8965_01_mangos_mangos_string.sql \ 8965_01_mangos_mangos_string.sql \
8965_02_mangos_command.sql \ 8965_02_mangos_command.sql \
8980_01_mangos_spell_bonus_data.sql \
8981_01_mangos_spell_proc_event.sql \
8988_01_mangos_spell_proc_event.sql \
8992_01_mangos_spell_proc_event.sql \
8992_02_mangos_spell_chain.sql \
8993_01_mangos_spell_proc_event.sql \
8995_01_mangos_spell_proc_event.sql \
8996_01_mangos_spell_proc_event.sql \
README README

View file

@ -348,7 +348,8 @@ enum SummonPropType
SUMMON_PROP_TYPE_PHASING = 8, // something todo with DK prequest line, 2 spells in 3.0.3 "%s's Opponent" SUMMON_PROP_TYPE_PHASING = 8, // something todo with DK prequest line, 2 spells in 3.0.3 "%s's Opponent"
SUMMON_PROP_TYPE_SIEGE_VEH = 9, // summon different vehicles, 14 spells in 3.0.3 "%s's Vehicle" SUMMON_PROP_TYPE_SIEGE_VEH = 9, // summon different vehicles, 14 spells in 3.0.3 "%s's Vehicle"
SUMMON_PROP_TYPE_DRAKE_VEH = 10, // summon drake (vehicle), 3 spells SUMMON_PROP_TYPE_DRAKE_VEH = 10, // summon drake (vehicle), 3 spells
SUMMON_PROP_TYPE_LIGHTWELL = 11 // summon lightwell, 6 spells in 3.0.3 SUMMON_PROP_TYPE_LIGHTWELL = 11, // summon lightwell, 6 spells in 3.0.3
SUMMON_PROP_TYPE_REPAIR_BOT = 12 // summon repir bot, 1 spells in 3.2.2a
}; };
// SummonProperties.dbc, col 5 // SummonProperties.dbc, col 5

View file

@ -70,7 +70,7 @@ enum GossipOptionIcon
//POI icons. Many more exist, list not complete. //POI icons. Many more exist, list not complete.
enum Poi_Icon enum Poi_Icon
{ {
ICON_POI_BLANK = 0, // Blank (not visible) ICON_POI_BLANK = 0, // Blank (not visible), in 2.4.3 have value 15 with 1..15 values in 0..14 range
ICON_POI_GREY_AV_MINE = 1, // Grey mine lorry ICON_POI_GREY_AV_MINE = 1, // Grey mine lorry
ICON_POI_RED_AV_MINE = 2, // Red mine lorry ICON_POI_RED_AV_MINE = 2, // Red mine lorry
ICON_POI_BLUE_AV_MINE = 3, // Blue mine lorry ICON_POI_BLUE_AV_MINE = 3, // Blue mine lorry

View file

@ -1026,9 +1026,12 @@ void WorldSession::HandleMoveTimeSkippedOpcode( WorldPacket & recv_data )
*/ */
} }
void WorldSession::HandleFeatherFallAck(WorldPacket &/*recv_data*/) void WorldSession::HandleFeatherFallAck(WorldPacket &recv_data)
{ {
DEBUG_LOG("WORLD: CMSG_MOVE_FEATHER_FALL_ACK"); DEBUG_LOG("WORLD: CMSG_MOVE_FEATHER_FALL_ACK");
// no used
recv_data.rpos(recv_data.wpos()); // prevent warnings spam
} }
void WorldSession::HandleMoveUnRootAck(WorldPacket& recv_data) void WorldSession::HandleMoveUnRootAck(WorldPacket& recv_data)

View file

@ -248,8 +248,8 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
if (movementInfo.HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) if (movementInfo.HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
{ {
// transports size limited // transports size limited
// (also received at zeppelin leave by some reason with t_* as absolute in continent coordinates, can be safely skipped) // (also received at zeppelin/lift leave by some reason with t_* as absolute in continent coordinates, can be safely skipped)
if( movementInfo.t_x > 50 || movementInfo.t_y > 50 || movementInfo.t_z > 50 ) if( movementInfo.t_x > 50 || movementInfo.t_y > 50 || movementInfo.t_z > 100 )
{ {
recv_data.rpos(recv_data.wpos()); // prevent warnings spam recv_data.rpos(recv_data.wpos()); // prevent warnings spam
return; return;

View file

@ -667,6 +667,12 @@ void Object::BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask *
if (!((Creature*)this)->isCanTrainingOf(target, false)) if (!((Creature*)this)->isCanTrainingOf(target, false))
appendValue &= ~(UNIT_NPC_FLAG_TRAINER | UNIT_NPC_FLAG_TRAINER_CLASS | UNIT_NPC_FLAG_TRAINER_PROFESSION); appendValue &= ~(UNIT_NPC_FLAG_TRAINER | UNIT_NPC_FLAG_TRAINER_CLASS | UNIT_NPC_FLAG_TRAINER_PROFESSION);
} }
if (appendValue & UNIT_NPC_FLAG_STABLEMASTER)
{
if (target->getClass() != CLASS_HUNTER)
appendValue &= ~UNIT_NPC_FLAG_STABLEMASTER;
}
} }
*data << uint32(appendValue); *data << uint32(appendValue);

View file

@ -7315,6 +7315,10 @@ bool PlayerCondition::Meets(Player const * player) const
} }
return false; return false;
} }
case CONDITION_RACE_CLASS:
if ((!value1 || (player->getRaceMask() & value1)) && (!value2 || (player->getClassMask() & value2)))
return true;
return false;
default: default:
return false; return false;
} }
@ -7468,6 +7472,27 @@ bool PlayerCondition::IsValid(ConditionType condition, uint32 value1, uint32 val
} }
break; break;
} }
case CONDITION_RACE_CLASS:
{
if (!value1 && !value2)
{
sLog.outErrorDb("Race_class condition has both values like 0, skipped");
return false;
}
if (value1 && !(value1 & RACEMASK_ALL_PLAYABLE))
{
sLog.outErrorDb("Race_class condition has invalid player class %u, skipped", value1);
return false;
}
if (value2 && !(value2 & CLASSMASK_ALL_PLAYABLE))
{
sLog.outErrorDb("Race_class condition has invalid race mask %u, skipped", value2);
return false;
}
break;
}
case CONDITION_NONE: case CONDITION_NONE:
break; break;
} }

View file

@ -319,11 +319,12 @@ enum ConditionType
CONDITION_QUESTTAKEN = 9, // quest_id 0, for condition true while quest active. CONDITION_QUESTTAKEN = 9, // quest_id 0, for condition true while quest active.
CONDITION_AD_COMMISSION_AURA = 10, // 0 0, for condition true while one from AD commission aura active CONDITION_AD_COMMISSION_AURA = 10, // 0 0, for condition true while one from AD commission aura active
CONDITION_NO_AURA = 11, // spell_id effindex CONDITION_NO_AURA = 11, // spell_id effindex
CONDITION_ACTIVE_EVENT = 12, // event_id CONDITION_ACTIVE_EVENT = 12, // event_id 0
CONDITION_AREA_FLAG = 13 // area_flag area_flag_not CONDITION_AREA_FLAG = 13, // area_flag area_flag_not
CONDITION_RACE_CLASS = 14, // race_mask class_mask
}; };
#define MAX_CONDITION 14 // maximum value in ConditionType enum #define MAX_CONDITION 15 // maximum value in ConditionType enum
struct PlayerCondition struct PlayerCondition
{ {

View file

@ -414,8 +414,7 @@ void Pet::SavePetToDB(PetSaveMode mode)
<< curmana << ", " << curmana << ", "
<< GetPower(POWER_HAPPINESS) << ", '"; << GetPower(POWER_HAPPINESS) << ", '";
// save only spell slots from action bar for(uint32 i = ACTION_BAR_INDEX_START; i < ACTION_BAR_INDEX_END; ++i)
for(uint32 i = ACTION_BAR_INDEX_PET_SPELL_START; i < ACTION_BAR_INDEX_PET_SPELL_END; ++i)
{ {
ss << uint32(m_charmInfo->GetActionBarEntry(i)->GetType()) << " " ss << uint32(m_charmInfo->GetActionBarEntry(i)->GetType()) << " "
<< uint32(m_charmInfo->GetActionBarEntry(i)->GetAction()) << " "; << uint32(m_charmInfo->GetActionBarEntry(i)->GetAction()) << " ";

View file

@ -324,23 +324,59 @@ void WorldSession::HandlePetSetAction( WorldPacket & recv_data )
} }
count = (recv_data.size() == 24) ? 2 : 1; count = (recv_data.size() == 24) ? 2 : 1;
uint32 position[2];
uint32 data[2];
bool move_command = false;
for(uint8 i = 0; i < count; ++i) for(uint8 i = 0; i < count; ++i)
{ {
uint32 position; recv_data >> position[i];
uint32 data; recv_data >> data[i];
recv_data >> position; uint8 act_state = UNIT_ACTION_BUTTON_TYPE(data[i]);
recv_data >> data;
uint32 spell_id = UNIT_ACTION_BUTTON_ACTION(data);
uint8 act_state = UNIT_ACTION_BUTTON_TYPE(data);
sLog.outDetail( "Player %s has changed pet spell action. Position: %u, Spell: %u, State: 0x%X", _player->GetName(), position, spell_id, uint32(act_state));
//ignore invalid position //ignore invalid position
if(position >= MAX_UNIT_ACTION_BAR_INDEX) if(position[i] >= MAX_UNIT_ACTION_BAR_INDEX)
return; return;
// in the normal case, command and reaction buttons can only be moved, not removed
// at moving count ==2, at removing count == 1
// ignore attempt to remove command|reaction buttons (not possible at normal case)
if (act_state == ACT_COMMAND || act_state == ACT_REACTION)
{
if (count == 1)
return;
move_command = true;
}
}
// check swap
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;
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;
}
for(uint8 i = 0; i < count; ++i)
{
uint32 spell_id = UNIT_ACTION_BUTTON_ACTION(data[i]);
uint8 act_state = UNIT_ACTION_BUTTON_TYPE(data[i]);
sLog.outDetail( "Player %s has changed pet spell action. Position: %u, Spell: %u, State: 0x%X", _player->GetName(), position[i], spell_id, uint32(act_state));
//if it's act for spell (en/disable/cast) and there is a spell given (0 = remove spell) which pet doesn't know, don't add //if it's act for spell (en/disable/cast) and there is a spell given (0 = remove spell) which pet doesn't know, don't add
if(!((act_state == ACT_ENABLED || act_state == ACT_DISABLED || act_state == ACT_PASSIVE) && spell_id && !pet->HasSpell(spell_id))) if(!((act_state == ACT_ENABLED || act_state == ACT_DISABLED || act_state == ACT_PASSIVE) && spell_id && !pet->HasSpell(spell_id)))
{ {
@ -361,7 +397,7 @@ void WorldSession::HandlePetSetAction( WorldPacket & recv_data )
((Pet*)pet)->ToggleAutocast(spell_id, false); ((Pet*)pet)->ToggleAutocast(spell_id, false);
} }
charmInfo->SetActionBar(position,spell_id,ActiveStates(act_state)); charmInfo->SetActionBar(position[i],spell_id,ActiveStates(act_state));
} }
} }
} }

View file

@ -2088,6 +2088,12 @@ Creature* Player::GetNPCIfCanInteractWith(uint64 guid, uint32 npcflagmask)
if (npcflagmask && !unit->HasFlag( UNIT_NPC_FLAGS, npcflagmask )) if (npcflagmask && !unit->HasFlag( UNIT_NPC_FLAGS, npcflagmask ))
return NULL; return NULL;
if (npcflagmask == UNIT_NPC_FLAG_STABLEMASTER)
{
if (getClass() != CLASS_HUNTER)
return NULL;
}
// if a dead unit should be able to talk - the creature must be alive and have special flags // if a dead unit should be able to talk - the creature must be alive and have special flags
if (!unit->isAlive()) if (!unit->isAlive())
return NULL; return NULL;
@ -5008,8 +5014,8 @@ void Player::SetRegularAttackTime()
{ {
for(int i = 0; i < MAX_ATTACK; ++i) for(int i = 0; i < MAX_ATTACK; ++i)
{ {
Item *tmpitem = GetWeaponForAttack(WeaponAttackType(i)); Item *tmpitem = GetWeaponForAttack(WeaponAttackType(i),true,false);
if(tmpitem && !tmpitem->IsBroken()) if (tmpitem)
{ {
ItemPrototype const *proto = tmpitem->GetProto(); ItemPrototype const *proto = tmpitem->GetProto();
if(proto->Delay) if(proto->Delay)
@ -5215,7 +5221,7 @@ void Player::UpdateWeaponSkill (WeaponAttackType attType)
{ {
case BASE_ATTACK: case BASE_ATTACK:
{ {
Item *tmpitem = GetWeaponForAttack(attType,true); Item *tmpitem = GetWeaponForAttack(attType,true,true);
if (!tmpitem) if (!tmpitem)
UpdateSkill(SKILL_UNARMED,weapon_skill_gain); UpdateSkill(SKILL_UNARMED,weapon_skill_gain);
@ -5226,7 +5232,7 @@ void Player::UpdateWeaponSkill (WeaponAttackType attType)
case OFF_ATTACK: case OFF_ATTACK:
case RANGED_ATTACK: case RANGED_ATTACK:
{ {
Item *tmpitem = GetWeaponForAttack(attType,true); Item *tmpitem = GetWeaponForAttack(attType,true,true);
if (tmpitem) if (tmpitem)
UpdateSkill(tmpitem->GetSkill(),weapon_skill_gain); UpdateSkill(tmpitem->GetSkill(),weapon_skill_gain);
break; break;
@ -7034,8 +7040,8 @@ void Player::UpdateEquipSpellsAtFormChange()
void Player::CastItemCombatSpell(Unit* Target, WeaponAttackType attType) void Player::CastItemCombatSpell(Unit* Target, WeaponAttackType attType)
{ {
Item *item = GetWeaponForAttack(attType, false); Item *item = GetWeaponForAttack(attType, true, false);
if(!item || item->IsBroken()) if(!item)
return; return;
ItemPrototype const *proto = item->GetProto(); ItemPrototype const *proto = item->GetProto();
@ -7355,8 +7361,8 @@ bool Player::CheckAmmoCompatibility(const ItemPrototype *ammo_proto) const
return false; return false;
// check ranged weapon // check ranged weapon
Item *weapon = GetWeaponForAttack( RANGED_ATTACK ); Item *weapon = GetWeaponForAttack( RANGED_ATTACK, true, false );
if(!weapon || weapon->IsBroken() ) if (!weapon)
return false; return false;
ItemPrototype const* weapon_proto = weapon->GetProto(); ItemPrototype const* weapon_proto = weapon->GetProto();
@ -8173,14 +8179,14 @@ void Player::SetSheath( SheathState sheathed )
break; break;
case SHEATH_STATE_MELEE: // prepared melee weapon case SHEATH_STATE_MELEE: // prepared melee weapon
{ {
SetVirtualItemSlot(0,GetWeaponForAttack(BASE_ATTACK,true)); SetVirtualItemSlot(0,GetWeaponForAttack(BASE_ATTACK,true,true));
SetVirtualItemSlot(1,GetWeaponForAttack(OFF_ATTACK,true)); SetVirtualItemSlot(1,GetWeaponForAttack(OFF_ATTACK,true,true));
SetVirtualItemSlot(2,NULL); SetVirtualItemSlot(2,NULL);
}; break; }; break;
case SHEATH_STATE_RANGED: // prepared ranged weapon case SHEATH_STATE_RANGED: // prepared ranged weapon
SetVirtualItemSlot(0,NULL); SetVirtualItemSlot(0,NULL);
SetVirtualItemSlot(1,NULL); SetVirtualItemSlot(1,NULL);
SetVirtualItemSlot(2,GetWeaponForAttack(RANGED_ATTACK,true)); SetVirtualItemSlot(2,GetWeaponForAttack(RANGED_ATTACK,true,true));
break; break;
default: default:
SetVirtualItemSlot(0,NULL); SetVirtualItemSlot(0,NULL);
@ -8551,7 +8557,7 @@ Item* Player::GetItemByPos( uint8 bag, uint8 slot ) const
return NULL; return NULL;
} }
Item* Player::GetWeaponForAttack(WeaponAttackType attackType, bool useable) const Item* Player::GetWeaponForAttack(WeaponAttackType attackType, bool nonbroken, bool useable) const
{ {
uint16 slot; uint16 slot;
switch (attackType) switch (attackType)
@ -8566,10 +8572,10 @@ Item* Player::GetWeaponForAttack(WeaponAttackType attackType, bool useable) cons
if (!item || item->GetProto()->Class != ITEM_CLASS_WEAPON) if (!item || item->GetProto()->Class != ITEM_CLASS_WEAPON)
return NULL; return NULL;
if(!useable) if (useable && !IsUseEquipedWeapon(attackType==BASE_ATTACK))
return item; return NULL;
if( item->IsBroken() || !IsUseEquipedWeapon(attackType==BASE_ATTACK) ) if (nonbroken && item->IsBroken())
return NULL; return NULL;
return item; return item;
@ -12491,7 +12497,7 @@ void Player::OnGossipSelect(WorldObject* pSource, uint32 gossipListId, uint32 me
uint32 Player::GetGossipTextId(WorldObject *pSource) uint32 Player::GetGossipTextId(WorldObject *pSource)
{ {
if (!pSource || pSource->GetTypeId() != TYPEID_UNIT || !((Creature*)pSource)->GetDBTableGUIDLow()) if (!pSource || pSource->GetTypeId() != TYPEID_UNIT || !((Creature*)pSource)->GetDBTableGUIDLow())
return 0; return DEFAULT_GOSSIP_MESSAGE;
if (uint32 pos = sObjectMgr.GetNpcGossip(((Creature*)pSource)->GetDBTableGUIDLow())) if (uint32 pos = sObjectMgr.GetNpcGossip(((Creature*)pSource)->GetDBTableGUIDLow()))
return pos; return pos;
@ -19638,7 +19644,7 @@ bool Player::IsAtGroupRewardDistance(WorldObject const* pRewardSource) const
uint32 Player::GetBaseWeaponSkillValue (WeaponAttackType attType) const uint32 Player::GetBaseWeaponSkillValue (WeaponAttackType attType) const
{ {
Item* item = GetWeaponForAttack(attType,true); Item* item = GetWeaponForAttack(attType,true,true);
// unarmed only with base attack // unarmed only with base attack
if(attType != BASE_ATTACK && !item) if(attType != BASE_ATTACK && !item)

View file

@ -1163,7 +1163,8 @@ class MANGOS_DLL_SPEC Player : public Unit
Item* GetItemByGuid( uint64 guid ) const; Item* GetItemByGuid( uint64 guid ) const;
Item* GetItemByPos( uint16 pos ) const; Item* GetItemByPos( uint16 pos ) const;
Item* GetItemByPos( uint8 bag, uint8 slot ) const; Item* GetItemByPos( uint8 bag, uint8 slot ) const;
Item* GetWeaponForAttack(WeaponAttackType attackType, bool useable = false) const; Item* GetWeaponForAttack(WeaponAttackType attackType) const { return GetWeaponForAttack(attackType,false,false); }
Item* GetWeaponForAttack(WeaponAttackType attackType, bool nonbroken, bool useable) const;
Item* GetShield(bool useable = false) const; Item* GetShield(bool useable = false) const;
static uint32 GetAttackBySlot( uint8 slot ); // MAX_ATTACK if not weapon slot static uint32 GetAttackBySlot( uint8 slot ); // MAX_ATTACK if not weapon slot
std::vector<Item *> &GetItemUpdateQueue() { return m_itemUpdateQueue; } std::vector<Item *> &GetItemUpdateQueue() { return m_itemUpdateQueue; }

View file

@ -686,6 +686,9 @@ void Spell::prepareDataForTriggerSystem()
// Clearcasting trigger need do it // Clearcasting trigger need do it
else if (m_spellInfo->SpellFamilyFlags & UI64LIT(0x0000000200000000) && m_spellInfo->SpellFamilyFlags2 & 0x8) else if (m_spellInfo->SpellFamilyFlags & UI64LIT(0x0000000200000000) && m_spellInfo->SpellFamilyFlags2 & 0x8)
m_canTrigger = true; m_canTrigger = true;
// Replenish Mana, item spell with triggered cases (Mana Agate, etc mana gems)
else if (m_spellInfo->SpellFamilyFlags & UI64LIT(0x0000010000000000))
m_canTrigger = true;
break; break;
case SPELLFAMILY_WARLOCK: // For Hellfire Effect / Rain of Fire / Seed of Corruption triggers need do it case SPELLFAMILY_WARLOCK: // For Hellfire Effect / Rain of Fire / Seed of Corruption triggers need do it
if (m_spellInfo->SpellFamilyFlags & UI64LIT(0x0000800000000060)) if (m_spellInfo->SpellFamilyFlags & UI64LIT(0x0000800000000060))
@ -2417,11 +2420,10 @@ void Spell::cancel()
{ {
Unit* unit = m_caster->GetGUID()==(*ihit).targetGUID ? m_caster : ObjectAccessor::GetUnit(*m_caster, ihit->targetGUID); Unit* unit = m_caster->GetGUID()==(*ihit).targetGUID ? m_caster : ObjectAccessor::GetUnit(*m_caster, ihit->targetGUID);
if( unit && unit->isAlive() ) if( unit && unit->isAlive() )
unit->RemoveAurasDueToSpell(m_spellInfo->Id); unit->RemoveAurasByCasterSpell(m_spellInfo->Id,m_caster->GetGUID());
} }
} }
m_caster->RemoveAurasDueToSpell(m_spellInfo->Id);
SendChannelUpdate(0); SendChannelUpdate(0);
SendInterrupted(0); SendInterrupted(0);
SendCastResult(SPELL_FAILED_INTERRUPTED); SendCastResult(SPELL_FAILED_INTERRUPTED);
@ -3441,6 +3443,13 @@ void Spell::SendChannelUpdate(uint32 time)
{ {
if(time == 0) if(time == 0)
{ {
m_caster->RemoveAurasByCasterSpell(m_spellInfo->Id,m_caster->GetGUID());
if(uint64 target_guid = m_caster->GetChannelObjectGUID())
if(target_guid != m_caster->GetGUID() && IS_UNIT_GUID(target_guid))
if(Unit* target = ObjectAccessor::GetUnit(*m_caster, target_guid))
target->RemoveAurasByCasterSpell(m_spellInfo->Id,m_caster->GetGUID());
m_caster->SetChannelObjectGUID(0); m_caster->SetChannelObjectGUID(0);
m_caster->SetUInt32Value(UNIT_CHANNEL_SPELL, 0); m_caster->SetUInt32Value(UNIT_CHANNEL_SPELL, 0);
} }
@ -5563,8 +5572,8 @@ SpellCastResult Spell::CheckItems()
if(m_caster->GetTypeId() != TYPEID_PLAYER) return SPELL_FAILED_TARGET_NOT_PLAYER; if(m_caster->GetTypeId() != TYPEID_PLAYER) return SPELL_FAILED_TARGET_NOT_PLAYER;
if( m_attackType != RANGED_ATTACK ) if( m_attackType != RANGED_ATTACK )
break; break;
Item *pItem = ((Player*)m_caster)->GetWeaponForAttack(m_attackType); Item *pItem = ((Player*)m_caster)->GetWeaponForAttack(m_attackType,true,false);
if(!pItem || pItem->IsBroken()) if (!pItem)
return SPELL_FAILED_EQUIPPED_ITEM; return SPELL_FAILED_EQUIPPED_ITEM;
switch(pItem->GetProto()->SubClass) switch(pItem->GetProto()->SubClass)

View file

@ -628,27 +628,20 @@ void Aura::Update(uint32 diff)
return; return;
} }
// Get spell range // need check distance for channeled target only
float radius; if (caster->GetChannelObjectGUID() == m_target->GetGUID())
SpellModOp mod;
if (m_spellProto->EffectRadiusIndex[GetEffIndex()])
{ {
radius = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellProto->EffectRadiusIndex[GetEffIndex()])); // Get spell range
mod = SPELLMOD_RADIUS; float max_range = GetSpellMaxRange(sSpellRangeStore.LookupEntry(m_spellProto->rangeIndex));
}
else
{
radius = GetSpellMaxRange(sSpellRangeStore.LookupEntry(m_spellProto->rangeIndex));
mod = SPELLMOD_RANGE;
}
if(Player* modOwner = caster->GetSpellModOwner()) if(Player* modOwner = caster->GetSpellModOwner())
modOwner->ApplySpellMod(GetId(), mod, radius, NULL); modOwner->ApplySpellMod(GetId(), SPELLMOD_RANGE, max_range, NULL);
if(!caster->IsWithinDistInMap(m_target, radius)) if(!caster->IsWithinDistInMap(m_target, max_range))
{ {
m_target->RemoveAura(GetId(), GetEffIndex()); m_target->RemoveAura(GetId(), GetEffIndex());
return; return;
}
} }
} }
@ -1331,7 +1324,7 @@ bool Aura::isAffectedOnSpell(SpellEntry const *spell) const
return false; return false;
} }
void Aura::ReapplyAffectedPassiveAuras( Unit* target ) void Aura::ReapplyAffectedPassiveAuras( Unit* target, bool owner_mode )
{ {
std::set<uint32> affectedSelf; std::set<uint32> affectedSelf;
std::set<uint32> affectedAuraCaster; std::set<uint32> affectedAuraCaster;
@ -1339,16 +1332,17 @@ void Aura::ReapplyAffectedPassiveAuras( Unit* target )
for(Unit::AuraMap::const_iterator itr = target->GetAuras().begin(); itr != target->GetAuras().end(); ++itr) for(Unit::AuraMap::const_iterator itr = target->GetAuras().begin(); itr != target->GetAuras().end(); ++itr)
{ {
// permanent passive or permanent area aura // permanent passive or permanent area aura
if (itr->second->IsPermanent() && (itr->second->IsPassive() || itr->second->IsAreaAura()) && // passive spells can be affected only by own or owner spell mods)
if (itr->second->IsPermanent() && (owner_mode && itr->second->IsPassive() || itr->second->IsAreaAura()) &&
// non deleted and not same aura (any with same spell id) // non deleted and not same aura (any with same spell id)
!itr->second->IsDeleted() && itr->second->GetId() != GetId() && !itr->second->IsDeleted() && itr->second->GetId() != GetId() &&
// and affected by aura // and affected by aura
isAffectedOnSpell(itr->second->GetSpellProto())) isAffectedOnSpell(itr->second->GetSpellProto()))
{ {
// only applied by self or aura caster // only applied by self or aura caster
if(itr->second->GetCasterGUID() == target->GetGUID()) if (itr->second->GetCasterGUID() == target->GetGUID())
affectedSelf.insert(itr->second->GetId()); affectedSelf.insert(itr->second->GetId());
else if(itr->second->GetCasterGUID() == GetCasterGUID()) else if (itr->second->GetCasterGUID() == GetCasterGUID())
affectedAuraCaster.insert(itr->second->GetId()); affectedAuraCaster.insert(itr->second->GetId());
} }
} }
@ -1429,25 +1423,26 @@ void Aura::HandleAddModifier(bool apply, bool Real)
((Player*)m_target)->AddSpellMod(m_spellmod, apply); ((Player*)m_target)->AddSpellMod(m_spellmod, apply);
// reapply talents to own passive persistent auras // reapply talents to own passive persistent auras
ReapplyAffectedPassiveAuras(m_target); ReapplyAffectedPassiveAuras(m_target, true);
// re-apply talents/passives/area auras applied to pet (it affected by player spellmods) // re-apply talents/passives/area auras applied to pet (it affected by player spellmods)
if(Pet* pet = m_target->GetPet()) if(Pet* pet = m_target->GetPet())
ReapplyAffectedPassiveAuras(pet); ReapplyAffectedPassiveAuras(pet, true);
// re-apply talents/passives/area auras applied to totems (it affected by player spellmods) // re-apply talents/passives/area auras applied to totems (it affected by player spellmods)
for(int i = 0; i < MAX_TOTEM; ++i) for(int i = 0; i < MAX_TOTEM; ++i)
if(m_target->m_TotemSlot[i]) if(m_target->m_TotemSlot[i])
if(Creature* totem = m_target->GetMap()->GetCreature(m_target->m_TotemSlot[i])) if(Creature* totem = m_target->GetMap()->GetCreature(m_target->m_TotemSlot[i]))
ReapplyAffectedPassiveAuras(totem); ReapplyAffectedPassiveAuras(totem, true);
// re-apply talents/passives/area auras applied to group members (it affected by player spellmods) // re-apply talents/passives/area auras applied to group members (it affected by player spellmods)
if (Group* group = ((Player*)m_target)->GetGroup()) if (Group* group = ((Player*)m_target)->GetGroup())
for(GroupReference *itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) for(GroupReference *itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
if (Player* member = itr->getSource()) if (Player* member = itr->getSource())
if (member != m_target && member->IsInMap(m_target)) if (member != m_target && member->IsInMap(m_target))
ReapplyAffectedPassiveAuras(member); ReapplyAffectedPassiveAuras(member, false);
} }
void Aura::HandleAddTargetTrigger(bool apply, bool /*Real*/) void Aura::HandleAddTargetTrigger(bool apply, bool /*Real*/)
{ {
// Use SpellModifier structure for check // Use SpellModifier structure for check
@ -5295,7 +5290,7 @@ void Aura::HandleAuraModCritPercent(bool apply, bool Real)
if(Real) if(Real)
{ {
for(int i = 0; i < MAX_ATTACK; ++i) for(int i = 0; i < MAX_ATTACK; ++i)
if(Item* pItem = ((Player*)m_target)->GetWeaponForAttack(WeaponAttackType(i))) if(Item* pItem = ((Player*)m_target)->GetWeaponForAttack(WeaponAttackType(i),true,false))
((Player*)m_target)->_ApplyWeaponDependentAuraCritMod(pItem, WeaponAttackType(i), this, apply); ((Player*)m_target)->_ApplyWeaponDependentAuraCritMod(pItem, WeaponAttackType(i), this, apply);
} }
@ -5495,7 +5490,7 @@ void Aura::HandleModDamageDone(bool apply, bool Real)
if(Real && m_target->GetTypeId() == TYPEID_PLAYER) if(Real && m_target->GetTypeId() == TYPEID_PLAYER)
{ {
for(int i = 0; i < MAX_ATTACK; ++i) for(int i = 0; i < MAX_ATTACK; ++i)
if(Item* pItem = ((Player*)m_target)->GetWeaponForAttack(WeaponAttackType(i))) if(Item* pItem = ((Player*)m_target)->GetWeaponForAttack(WeaponAttackType(i),true,false))
((Player*)m_target)->_ApplyWeaponDependentAuraDamageMod(pItem, WeaponAttackType(i), this, apply); ((Player*)m_target)->_ApplyWeaponDependentAuraDamageMod(pItem, WeaponAttackType(i), this, apply);
} }
@ -5578,7 +5573,7 @@ void Aura::HandleModDamagePercentDone(bool apply, bool Real)
if(Real && m_target->GetTypeId() == TYPEID_PLAYER) if(Real && m_target->GetTypeId() == TYPEID_PLAYER)
{ {
for(int i = 0; i < MAX_ATTACK; ++i) for(int i = 0; i < MAX_ATTACK; ++i)
if(Item* pItem = ((Player*)m_target)->GetWeaponForAttack(WeaponAttackType(i))) if(Item* pItem = ((Player*)m_target)->GetWeaponForAttack(WeaponAttackType(i),true,false))
((Player*)m_target)->_ApplyWeaponDependentAuraDamageMod(pItem, WeaponAttackType(i), this, apply); ((Player*)m_target)->_ApplyWeaponDependentAuraDamageMod(pItem, WeaponAttackType(i), this, apply);
} }
@ -5897,7 +5892,7 @@ void Aura::HandleShapeshiftBoosts(bool apply)
void Aura::HandleSpellSpecificBoosts(bool apply) void Aura::HandleSpellSpecificBoosts(bool apply)
{ {
bool cast_at_remove = false; // if spell must be casted at aura remove bool cast_at_remove = false; // if spell must be casted at last aura from stack remove
uint32 spellId1 = 0; uint32 spellId1 = 0;
uint32 spellId2 = 0; uint32 spellId2 = 0;
uint32 spellId3 = 0; uint32 spellId3 = 0;
@ -5905,9 +5900,21 @@ void Aura::HandleSpellSpecificBoosts(bool apply)
switch(GetSpellProto()->SpellFamilyName) switch(GetSpellProto()->SpellFamilyName)
{ {
case SPELLFAMILY_GENERIC:
{
// Illusionary Barrier
if(GetId() == 57350 && !apply && m_target->getPowerType() == POWER_MANA)
{
cast_at_remove = true;
spellId1 = 60242; // Darkmoon Card: Illusion
}
else
return;
break;
}
case SPELLFAMILY_MAGE: case SPELLFAMILY_MAGE:
{ {
// Ice Barrier // 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))) if (!apply && (m_removeMode == AURA_REMOVE_BY_DISPEL || (m_removeMode == AURA_REMOVE_BY_DEFAULT && !GetModifier()->m_amount)))
@ -5954,7 +5961,7 @@ void Aura::HandleSpellSpecificBoosts(bool apply)
break; break;
} }
case SPELLFAMILY_WARLOCK: case SPELLFAMILY_WARLOCK:
// Fear // Fear (non stacking)
if (m_spellProto->SpellFamilyFlags & UI64LIT(0x0000040000000000)) if (m_spellProto->SpellFamilyFlags & UI64LIT(0x0000040000000000))
{ {
if(!apply) if(!apply)
@ -6632,7 +6639,11 @@ void Aura::PeriodicTick()
// send critical in hit info for threat calculation // send critical in hit info for threat calculation
if (isCrit) if (isCrit)
{
cleanDamage.hitOutCome = MELEE_HIT_CRIT; cleanDamage.hitOutCome = MELEE_HIT_CRIT;
// Resilience - reduce crit damage
pdamage -= m_target->GetSpellCritDamageReduction(pdamage);
}
// only from players // only from players
// FIXME: need use SpellDamageBonus instead? // FIXME: need use SpellDamageBonus instead?

View file

@ -352,7 +352,7 @@ class MANGOS_DLL_SPEC Aura
void PeriodicDummyTick(); void PeriodicDummyTick();
bool IsCritFromAbilityAura(Unit* caster, uint32& damage); bool IsCritFromAbilityAura(Unit* caster, uint32& damage);
void ReapplyAffectedPassiveAuras(Unit* target); void ReapplyAffectedPassiveAuras(Unit* target, bool owner_mode);
Modifier m_modifier; Modifier m_modifier;
SpellModifier *m_spellmod; SpellModifier *m_spellmod;

View file

@ -2223,10 +2223,10 @@ void Spell::EffectTriggerSpell(uint32 effIndex)
// main hand weapon required // main hand weapon required
if (spellInfo->AttributesEx3 & SPELL_ATTR_EX3_MAIN_HAND) if (spellInfo->AttributesEx3 & SPELL_ATTR_EX3_MAIN_HAND)
{ {
Item* item = ((Player*)m_caster)->GetWeaponForAttack(BASE_ATTACK); Item* item = ((Player*)m_caster)->GetWeaponForAttack(BASE_ATTACK, true, false);
// skip spell if no weapon in slot or broken // skip spell if no weapon in slot or broken
if (!item || item->IsBroken() ) if (!item)
return; return;
// skip spell if weapon not fit to triggered spell // skip spell if weapon not fit to triggered spell
@ -2237,10 +2237,10 @@ void Spell::EffectTriggerSpell(uint32 effIndex)
// offhand hand weapon required // offhand hand weapon required
if (spellInfo->AttributesEx3 & SPELL_ATTR_EX3_REQ_OFFHAND) if (spellInfo->AttributesEx3 & SPELL_ATTR_EX3_REQ_OFFHAND)
{ {
Item* item = ((Player*)m_caster)->GetWeaponForAttack(OFF_ATTACK); Item* item = ((Player*)m_caster)->GetWeaponForAttack(OFF_ATTACK, true, false);
// skip spell if no weapon in slot or broken // skip spell if no weapon in slot or broken
if (!item || item->IsBroken() ) if (!item)
return; return;
// skip spell if weapon not fit to triggered spell // skip spell if weapon not fit to triggered spell
@ -3442,6 +3442,7 @@ void Spell::EffectSummonType(uint32 i)
break; break;
} }
case SUMMON_PROP_TYPE_CRITTER: case SUMMON_PROP_TYPE_CRITTER:
case SUMMON_PROP_TYPE_REPAIR_BOT:
{ {
EffectSummonCritter(i, summon_prop->FactionId); EffectSummonCritter(i, summon_prop->FactionId);
break; break;
@ -4586,7 +4587,7 @@ void Spell::EffectWeaponDmg(uint32 i)
// Whirlwind, single only spell with 2 weapon white damage apply if have // Whirlwind, single only spell with 2 weapon white damage apply if have
if(m_caster->GetTypeId()==TYPEID_PLAYER && (m_spellInfo->SpellFamilyFlags & UI64LIT(0x00000400000000))) if(m_caster->GetTypeId()==TYPEID_PLAYER && (m_spellInfo->SpellFamilyFlags & UI64LIT(0x00000400000000)))
{ {
if(((Player*)m_caster)->GetWeaponForAttack(OFF_ATTACK,true)) if(((Player*)m_caster)->GetWeaponForAttack(OFF_ATTACK, true, true))
spell_bonus += m_caster->CalculateDamage (OFF_ATTACK, normalized); spell_bonus += m_caster->CalculateDamage (OFF_ATTACK, normalized);
} }
// Devastate bonus and sunder armor refresh // Devastate bonus and sunder armor refresh
@ -4646,7 +4647,7 @@ void Spell::EffectWeaponDmg(uint32 i)
// Fan of Knives // Fan of Knives
else if (m_caster->GetTypeId()==TYPEID_PLAYER && (m_spellInfo->SpellFamilyFlags & UI64LIT(0x0004000000000000))) else if (m_caster->GetTypeId()==TYPEID_PLAYER && (m_spellInfo->SpellFamilyFlags & UI64LIT(0x0004000000000000)))
{ {
Item* weapon = ((Player*)m_caster)->GetWeaponForAttack(m_attackType,true); Item* weapon = ((Player*)m_caster)->GetWeaponForAttack(m_attackType,true,true);
if (weapon && weapon->GetProto()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER) if (weapon && weapon->GetProto()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER)
totalDamagePercentMod *= 1.5f; // 150% to daggers totalDamagePercentMod *= 1.5f; // 150% to daggers
} }
@ -4821,13 +4822,13 @@ void Spell::EffectWeaponDmg(uint32 i)
// take ammo // take ammo
if(m_attackType == RANGED_ATTACK && m_caster->GetTypeId() == TYPEID_PLAYER) if(m_attackType == RANGED_ATTACK && m_caster->GetTypeId() == TYPEID_PLAYER)
{ {
Item *pItem = ((Player*)m_caster)->GetWeaponForAttack( RANGED_ATTACK ); Item *pItem = ((Player*)m_caster)->GetWeaponForAttack(RANGED_ATTACK, true, false);
// wands don't have ammo // wands don't have ammo
if(!pItem || pItem->IsBroken() || pItem->GetProto()->SubClass == ITEM_SUBCLASS_WEAPON_WAND) if (!pItem || pItem->GetProto()->SubClass == ITEM_SUBCLASS_WEAPON_WAND)
return; return;
if( pItem->GetProto()->InventoryType == INVTYPE_THROWN ) if (pItem->GetProto()->InventoryType == INVTYPE_THROWN)
{ {
if(pItem->GetMaxStackCount()==1) if(pItem->GetMaxStackCount()==1)
{ {

View file

@ -483,7 +483,7 @@ bool IsPositiveEffect(uint32 spellId, uint32 effIndex)
break; break;
} }
} break; } break;
case SPELL_AURA_MOD_DAMAGE_DONE: // dependent from bas point sign (negative -> negative) case SPELL_AURA_MOD_DAMAGE_DONE: // dependent from base point sign (negative -> negative)
case SPELL_AURA_MOD_STAT: case SPELL_AURA_MOD_STAT:
case SPELL_AURA_MOD_SKILL: case SPELL_AURA_MOD_SKILL:
case SPELL_AURA_MOD_HEALING_PCT: case SPELL_AURA_MOD_HEALING_PCT:
@ -496,8 +496,10 @@ bool IsPositiveEffect(uint32 spellId, uint32 effIndex)
return false; return false;
break; break;
case SPELL_AURA_MOD_SPELL_CRIT_CHANCE: case SPELL_AURA_MOD_SPELL_CRIT_CHANCE:
case SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT:
case SPELL_AURA_MOD_DAMAGE_PERCENT_DONE:
if(spellproto->CalculateSimpleValue(effIndex) > 0) if(spellproto->CalculateSimpleValue(effIndex) > 0)
return true; // some expected positive spells have SPELL_ATTR_EX_NEGATIVE return true; // some expected positive spells have SPELL_ATTR_EX_NEGATIVE or unclear target modes
break; break;
case SPELL_AURA_ADD_TARGET_TRIGGER: case SPELL_AURA_ADD_TARGET_TRIGGER:
return true; return true;
@ -573,6 +575,8 @@ bool IsPositiveEffect(uint32 spellId, uint32 effIndex)
// some spells negative // some spells negative
switch(spellproto->Id) switch(spellproto->Id)
{ {
case 802: // Mutate Bug, wrongly negative by target modes
return true;
case 36900: // Soul Split: Evil! case 36900: // Soul Split: Evil!
case 36901: // Soul Split: Good case 36901: // Soul Split: Good
case 36893: // Transporter Malfunction (decrease size case) case 36893: // Transporter Malfunction (decrease size case)

File diff suppressed because it is too large Load diff

View file

@ -1247,7 +1247,6 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
void RemoveAurasByCasterSpell(uint32 spellId, uint32 effindex, uint64 casterGUID); void RemoveAurasByCasterSpell(uint32 spellId, uint32 effindex, uint64 casterGUID);
void RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit *stealer); void RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit *stealer);
void RemoveAurasDueToSpellByCancel(uint32 spellId); void RemoveAurasDueToSpellByCancel(uint32 spellId);
void RemoveAurasAtChanneledTarget(SpellEntry const* spellInfo);
// removing unknown aura stacks by diff reasons and selections // removing unknown aura stacks by diff reasons and selections
void RemoveNotOwnSingleTargetAuras(uint32 newPhase = 0x0); void RemoveNotOwnSingleTargetAuras(uint32 newPhase = 0x0);
@ -1618,6 +1617,8 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
uint32 m_lastManaUseTimer; uint32 m_lastManaUseTimer;
private: private:
void CleanupDeletedAuars();
bool IsTriggeredAtSpellProcEvent(Unit *pVictim, Aura* aura, SpellEntry const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const*& spellProcEvent ); bool IsTriggeredAtSpellProcEvent(Unit *pVictim, Aura* aura, SpellEntry const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const*& spellProcEvent );
bool HandleDummyAuraProc( Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); bool HandleDummyAuraProc( Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
bool HandleHasteAuraProc( Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown); bool HandleHasteAuraProc( Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);

View file

@ -45,18 +45,20 @@ alter table creature_movement add `wpguid` int(11) default '0';
//-----------------------------------------------// //-----------------------------------------------//
void WaypointMovementGenerator<Creature>::LoadPath(Creature &c) void WaypointMovementGenerator<Creature>::LoadPath(Creature &c)
{ {
sLog.outDetail("LoadPath: loading waypoint path for creature %d,%d", c.GetGUIDLow(), c.GetDBTableGUIDLow()); sLog.outDetail("LoadPath: loading waypoint path for creature %u, %u", c.GetGUIDLow(), c.GetDBTableGUIDLow());
i_path = sWaypointMgr.GetPath(c.GetDBTableGUIDLow()); i_path = sWaypointMgr.GetPath(c.GetDBTableGUIDLow());
if(!i_path)
if (!i_path)
{ {
sLog.outErrorDb("WaypointMovementGenerator::LoadPath: creature %s (Entry: %u GUID: %d) doesn't have waypoint path", sLog.outErrorDb("WaypointMovementGenerator::LoadPath: creature %s (Entry: %u GUID: %u) doesn't have waypoint path",
c.GetName(), c.GetEntry(), c.GetDBTableGUIDLow()); c.GetName(), c.GetEntry(), c.GetDBTableGUIDLow());
return; return;
} }
uint32 node_count = i_path->size(); uint32 node_count = i_path->size();
i_hasDone.resize(node_count); i_hasDone.resize(node_count);
for(uint32 i = 0; i < node_count-1; ++i) for(uint32 i = 0; i < node_count-1; ++i)
i_hasDone[i] = false; i_hasDone[i] = false;
@ -78,22 +80,23 @@ void WaypointMovementGenerator<Creature>::Initialize()
bool WaypointMovementGenerator<Creature>::Update(Creature &creature, const uint32 &diff) bool WaypointMovementGenerator<Creature>::Update(Creature &creature, const uint32 &diff)
{ {
if(!&creature) if (!&creature)
return true; return true;
// Waypoint movement can be switched on/off // Waypoint movement can be switched on/off
// This is quite handy for escort quests and other stuff // This is quite handy for escort quests and other stuff
if(creature.hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED | UNIT_STAT_DIED)) if (creature.hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED | UNIT_STAT_DIED))
return true; return true;
// prevent a crash at empty waypoint path. // prevent a crash at empty waypoint path.
if(!i_path || i_path->empty()) if (!i_path || i_path->empty())
return true; return true;
// i_path was modified by chat commands for example // i_path was modified by chat commands for example
if(i_path->size() != i_hasDone.size()) if (i_path->size() != i_hasDone.size())
i_hasDone.resize(i_path->size()); i_hasDone.resize(i_path->size());
if(i_currentNode >= i_path->size())
if (i_currentNode >= i_path->size())
i_currentNode = 0; i_currentNode = 0;
CreatureTraveller traveller(creature); CreatureTraveller traveller(creature);
@ -104,56 +107,67 @@ bool WaypointMovementGenerator<Creature>::Update(Creature &creature, const uint3
// creature has been stopped in middle of the waypoint segment // creature has been stopped in middle of the waypoint segment
if (!i_destinationHolder.HasArrived() && creature.IsStopped()) if (!i_destinationHolder.HasArrived() && creature.IsStopped())
{ {
if( i_nextMoveTime.Passed()) // Timer has elapsed, meaning this part controlled it // Timer has elapsed, meaning this part controlled it
if (i_nextMoveTime.Passed())
{ {
SetStoppedByPlayer(false); SetStoppedByPlayer(false);
// Now we re-set destination to same node and start travel
creature.addUnitState(UNIT_STAT_ROAMING); creature.addUnitState(UNIT_STAT_ROAMING);
if (creature.canFly()) if (creature.canFly())
creature.AddMonsterMoveFlag(MONSTER_MOVE_FLY); creature.AddMonsterMoveFlag(MONSTER_MOVE_FLY);
// Now we re-set destination to same node and start travel
const WaypointNode &node = i_path->at(i_currentNode); const WaypointNode &node = i_path->at(i_currentNode);
i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z); i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z);
i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime()); i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime());
} }
else // if( !i_nextMoveTime.Passed()) else // if( !i_nextMoveTime.Passed())
{ // unexpected end of timer && creature stopped && not at end of segment {
// unexpected end of timer && creature stopped && not at end of segment
if (!IsStoppedByPlayer()) if (!IsStoppedByPlayer())
{ // Put 30 seconds delay {
// Put 30 seconds delay
i_destinationHolder.IncreaseTravelTime(STOP_TIME_FOR_PLAYER); i_destinationHolder.IncreaseTravelTime(STOP_TIME_FOR_PLAYER);
i_nextMoveTime.Reset(STOP_TIME_FOR_PLAYER); i_nextMoveTime.Reset(STOP_TIME_FOR_PLAYER);
SetStoppedByPlayer(true); // Mark we did it SetStoppedByPlayer(true); // Mark we did it
} }
} }
return true; // Abort here this update return true; // Abort here this update
} }
if( creature.IsStopped()) if (creature.IsStopped())
{ {
uint32 idx = i_currentNode > 0 ? i_currentNode-1 : i_path->size()-1; uint32 idx = i_currentNode > 0 ? i_currentNode-1 : i_path->size()-1;
if (!i_hasDone[idx]) if (!i_hasDone[idx])
{ {
if (i_path->at(idx).orientation !=100) if (i_path->at(idx).orientation != 100)
creature.SetOrientation(i_path->at(idx).orientation); creature.SetOrientation(i_path->at(idx).orientation);
if(WaypointBehavior *behavior = i_path->at(idx).behavior) if (WaypointBehavior *behavior = i_path->at(idx).behavior)
{ {
if(behavior->emote != 0) if (behavior->emote != 0)
creature.SetUInt32Value(UNIT_NPC_EMOTESTATE,behavior->emote); creature.SetUInt32Value(UNIT_NPC_EMOTESTATE, behavior->emote);
if(behavior->spell != 0)
creature.CastSpell(&creature,behavior->spell, false); if (behavior->spell != 0)
if(behavior->model1 != 0) creature.CastSpell(&creature, behavior->spell, false);
if (behavior->model1 != 0)
creature.SetDisplayId(behavior->model1); creature.SetDisplayId(behavior->model1);
if(behavior->textid[0])
if (behavior->textid[0])
{ {
// Not only one text is set // Not only one text is set
if( behavior->textid[1] ) if (behavior->textid[1])
{ {
// Select one from max 5 texts (0 and 1 laready checked) // Select one from max 5 texts (0 and 1 already checked)
int i = 2; int i = 2;
for( ; i < MAX_WAYPOINT_TEXT; ++i ) for(; i < MAX_WAYPOINT_TEXT; ++i)
if( !behavior->textid[i] ) {
if (!behavior->textid[i])
break; break;
}
creature.Say(behavior->textid[rand() % i], 0, 0); creature.Say(behavior->textid[rand() % i], 0, 0);
} }
@ -167,37 +181,46 @@ bool WaypointMovementGenerator<Creature>::Update(Creature &creature, const uint3
} // HasDone == false } // HasDone == false
} // i_creature.IsStopped() } // i_creature.IsStopped()
if( i_nextMoveTime.Passed() ) // This is at the end of waypoint segment or has been stopped by player // This is at the end of waypoint segment or has been stopped by player
if (i_nextMoveTime.Passed())
{ {
if( creature.IsStopped() ) // If stopped then begin a new move segment // If stopped then begin a new move segment
if (creature.IsStopped())
{ {
creature.addUnitState(UNIT_STAT_ROAMING); creature.addUnitState(UNIT_STAT_ROAMING);
if (creature.canFly()) if (creature.canFly())
creature.AddMonsterMoveFlag(MONSTER_MOVE_FLY); creature.AddMonsterMoveFlag(MONSTER_MOVE_FLY);
const WaypointNode &node = i_path->at(i_currentNode); const WaypointNode &node = i_path->at(i_currentNode);
i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z); i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z);
i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime()); i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime());
uint32 idx = i_currentNode > 0 ? i_currentNode-1 : i_path->size()-1; uint32 idx = i_currentNode > 0 ? i_currentNode-1 : i_path->size()-1;
if (i_path->at(idx).orientation !=100) if (i_path->at(idx).orientation != 100)
creature.SetOrientation(i_path->at(idx).orientation); creature.SetOrientation(i_path->at(idx).orientation);
if(WaypointBehavior *behavior = i_path->at(idx).behavior ) if (WaypointBehavior *behavior = i_path->at(idx).behavior)
{ {
i_hasDone[idx] = false; i_hasDone[idx] = false;
if(behavior->model2 != 0)
if (behavior->model2 != 0)
creature.SetDisplayId(behavior->model2); creature.SetDisplayId(behavior->model2);
creature.SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); creature.SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
} }
} }
else // If not stopped then stop it and set the reset of TimeTracker to waittime else
{ {
// If not stopped then stop it and set the reset of TimeTracker to waittime
creature.StopMoving(); creature.StopMoving();
SetStoppedByPlayer(false); SetStoppedByPlayer(false);
i_nextMoveTime.Reset(i_path->at(i_currentNode).delay); i_nextMoveTime.Reset(i_path->at(i_currentNode).delay);
++i_currentNode; ++i_currentNode;
if( i_currentNode >= i_path->size() )
if (i_currentNode >= i_path->size())
i_currentNode = 0; i_currentNode = 0;
} }
} }
@ -206,7 +229,7 @@ bool WaypointMovementGenerator<Creature>::Update(Creature &creature, const uint3
void WaypointMovementGenerator<Creature>::MovementInform(Creature &unit) void WaypointMovementGenerator<Creature>::MovementInform(Creature &unit)
{ {
if(unit.AI()) if (unit.AI())
unit.AI()->MovementInform(WAYPOINT_MOTION_TYPE, i_currentNode); unit.AI()->MovementInform(WAYPOINT_MOTION_TYPE, i_currentNode);
} }

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "8971" #define REVISION_NR "8997"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__

View file

@ -1,6 +1,6 @@
#ifndef __REVISION_SQL_H__ #ifndef __REVISION_SQL_H__
#define __REVISION_SQL_H__ #define __REVISION_SQL_H__
#define REVISION_DB_CHARACTERS "required_8874_01_characters_character_skills" #define REVISION_DB_CHARACTERS "required_8874_01_characters_character_skills"
#define REVISION_DB_MANGOS "required_8965_02_mangos_command" #define REVISION_DB_MANGOS "required_8996_01_mangos_spell_proc_event"
#define REVISION_DB_REALMD "required_8728_01_realmd_account" #define REVISION_DB_REALMD "required_8728_01_realmd_account"
#endif // __REVISION_SQL_H__ #endif // __REVISION_SQL_H__