diff options
-rw-r--r-- | Makefile.am | 22 | ||||
-rw-r--r-- | sql/FULL/world_spell_full.sql | 27 | ||||
-rw-r--r-- | sql/mangos.sql | 2 | ||||
-rw-r--r-- | sql/updates/4377_world_spell_proc_event.sql | 5 | ||||
-rw-r--r-- | sql/updates/4382_8115_world_playercreateinfo_action.sql | 358 | ||||
-rw-r--r-- | sql/updates/4392_world.sql | 3 | ||||
-rw-r--r-- | sql/updates/4393_world_spell_proc_event.sql | 8 | ||||
-rw-r--r-- | sql/updates/4394_world_spell_proc_event.sql | 12 | ||||
-rw-r--r-- | sql/updates/4397_world_playercreateinfo_spell_TDB.sql | 6 | ||||
-rw-r--r-- | sql/world.sql | 548 | ||||
-rw-r--r-- | src/game/CreatureEventAIMgr.cpp | 3 | ||||
-rw-r--r-- | src/game/DestinationHolderImp.h | 2 | ||||
-rw-r--r-- | src/game/Group.cpp | 2 | ||||
-rw-r--r-- | src/game/ItemHandler.cpp | 26 | ||||
-rw-r--r-- | src/game/Level3.cpp | 7 | ||||
-rw-r--r-- | src/game/Player.cpp | 157 | ||||
-rw-r--r-- | src/game/Player.h | 7 | ||||
-rw-r--r-- | src/game/PointMovementGenerator.cpp | 3 | ||||
-rw-r--r-- | src/game/SharedDefines.h | 5 | ||||
-rw-r--r-- | src/game/SkillDiscovery.cpp | 2 | ||||
-rw-r--r-- | src/game/Spell.cpp | 30 | ||||
-rw-r--r-- | src/game/SpellAuras.cpp | 2 | ||||
-rw-r--r-- | src/game/SpellEffects.cpp | 36 | ||||
-rw-r--r-- | src/game/SpellMgr.cpp | 41 | ||||
-rw-r--r-- | src/game/Unit.cpp | 142 |
25 files changed, 971 insertions, 485 deletions
diff --git a/Makefile.am b/Makefile.am index eb58ac488f2..4edbad5947c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -22,17 +22,6 @@ SUBDIRS = dep doc src ## Additional files to include when running 'make dist' -# Win32 project workspace for Visual Studio .NET 2003 -EXTRA_DIST = \ - win/mangosdVC71.sln \ - win/VC71/framework.vcproj \ - win/VC71/game.vcproj \ - win/VC71/mangosd.vcproj \ - win/VC71/realmd.vcproj \ - win/VC71/shared.vcproj \ - win/VC71/zlib.vcproj \ - win/VC71/g3dlite.vcproj - # Win32 project workspace for Visual Studio .NET 2005 EXTRA_DIST += \ win/mangosdVC80.sln \ @@ -55,3 +44,14 @@ EXTRA_DIST += \ win/VC90/zlib.vcproj \ win/VC90/g3dlite.vcproj +# Win32 project workspace for Visual Studio .NET 2010 +EXTRA_DIST = \ + win/mangosdVC100.sln \ + win/VC100/framework.vcxproj \ + win/VC100/game.vcxproj \ + win/VC100/mangosd.vcxproj \ + win/VC100/realmd.vcxproj \ + win/VC100/shared.vcxproj \ + win/VC100/zlib.vcxproj \ + win/VC100/g3dlite.vcxproj + diff --git a/sql/FULL/world_spell_full.sql b/sql/FULL/world_spell_full.sql index 60a2616d999..e3794783b4b 100644 --- a/sql/FULL/world_spell_full.sql +++ b/sql/FULL/world_spell_full.sql @@ -72,6 +72,7 @@ INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comm (48384, 50170, 2, 'Improved Moonkin Form'), (48395, 50171, 2, 'Improved Moonkin Form'), (48396, 50172, 2, 'Improved Moonkin Form'), +( 20594, 65116, 2, 'Stoneform'), -- Creature ( 36574, 36650, 0, 'Apply Phase Slip Vulnerability'), @@ -694,8 +695,6 @@ INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `Spell ( 17803, 0x00, 5, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0, 0, 0), -- Improved Shadow Bolt (Rank 5) ( 18094, 0x00, 5, 0x0000000A, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Nightfall (Rank 1) ( 18095, 0x00, 5, 0x0000000A, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Nightfall (Rank 2) -( 18119, 0x00, 5, 0x000003E5, 0x000010C0, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Aftermath (Rank 1) -( 18120, 0x00, 5, 0x000003E5, 0x000010C0, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Aftermath (Rank 2) ( 18820, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0, 0, 0), -- Insight ( 19184, 0x00, 9, 0x00000014, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Entrapment (Rank 1) ( 19387, 0x00, 9, 0x00000014, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Entrapment (Rank 2) @@ -951,8 +950,6 @@ INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `Spell ( 35080, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 1, 0, 60), -- Band of the Eternal Champion ( 35083, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 60), -- Band of the Eternal Sage ( 35086, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 60), -- Band of the Eternal Restorer -( 35100, 0x00, 9, 0x00003001, 0x00000000, 0x00000000, 0x00010140, 0x00000000, 0, 0, 0), -- Concussive Barrage (Rank 1) -( 35102, 0x00, 9, 0x00003001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Concussive Barrage (Rank 2) ( 35121, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0, 0, 0), -- Nether Power ( 35541, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00800000, 0x00000000, 0, 0, 0), -- Combat Potency (Rank 1) ( 35550, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00800000, 0x00000000, 0, 0, 0), -- Combat Potency (Rank 2) @@ -1268,6 +1265,7 @@ INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `Spell ( 53256, 0x00, 9, 0x00000800, 0x00800001, 0x00000000, 0x00000000, 0x00000002, 0, 0, 0), -- Cobra Strikes (Rank 1) ( 53259, 0x00, 9, 0x00000800, 0x00800001, 0x00000000, 0x00000000, 0x00000002, 0, 0, 0), -- Cobra Strikes (Rank 2) ( 53260, 0x00, 9, 0x00000800, 0x00800001, 0x00000000, 0x00000000, 0x00000002, 0, 0, 0), -- Cobra Strikes (Rank 3) + ( 53290, 0x00, 9, 0x00000800, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000002, 0, 0, 0), -- Hunting Party (Rank 1) ( 53291, 0x00, 9, 0x00000800, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000002, 0, 0, 0), -- Hunting Party (Rank 2) ( 53292, 0x00, 9, 0x00000800, 0x7FFFFFFF, 0x00000000, 0x00000000, 0x00000002, 0, 0, 0), -- Hunting Party (Rank 3) @@ -1292,6 +1290,9 @@ INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `Spell ( 53671, 0x00, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Judgements of the Pure (Rank 1) ( 53672, 0x00, 10, 0x00200000, 0x00010000, 0x00000000, 0x00000000, 0x00000002, 0, 0, 0), -- Infusion of Light ( 53673, 0x00, 10, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Judgements of the Pure (Rank 2) +( 53709, 0x02, 10, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Shield of the templar +( 53710, 0x02, 10, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Shield of the templar +( 53711, 0x02, 10, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Shield of the templar ( 53754, 0x00, 5, 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00006000, 0, 0, 0), -- Improved Fear (Rank 1) ( 53759, 0x00, 5, 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00006000, 0, 0, 0), -- Improved Fear (Rank 2) ( 54149, 0x00, 10, 0x00200000, 0x00010000, 0x00000000, 0x00000000, 0x00000002, 0, 0, 0), -- Infusion of Light (Rank 2) @@ -1485,7 +1486,23 @@ INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `Spell ( 64882, 0x00, 10, 0x00000000, 0x00100000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Item - Paladin T8 Protection 4P Bonus ( 64890, 0x00, 10, 0x00000000, 0x00010000, 0x00000000, 0x00000000, 0x00000002, 0, 0, 0), -- Item - Paladin T8 Holy 2P Bonus ( 64908, 0x00, 6, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0x00000000, 0, 0, 0), -- Item - Priest T8 Shadow 4P Bonus -( 64912, 0x00, 6, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0); -- Item - Priest T8 Healer 4P Bonus +( 64912, 0x00, 6, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Item - Priest T8 Healer 4P Bonus +( 57470, 0x00, 6, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Renewed Hope +( 57472, 0x00, 6, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Renewed Hope +( 35100, 0x00, 9, 0x00001000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0, 0, 0), -- Concussive Barrage +( 35102, 0x00, 9, 0x00001000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0, 0, 0), -- Concussive Barrage +( 18119, 0x00, 5, 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Aftermath +( 18120, 0x00, 5, 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Aftermath +( 13165, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Hawk +( 14318, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Hawk +( 14319, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Hawk +( 14320, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Hawk +( 14321, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Hawk +( 14322, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Hawk +( 25296, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Hawk +( 27044, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Hawk +( 61846, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Dragonhawk +( 61847, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0); -- Aspect of the Dragonhawk -- -------- -- ENCHANT PROC diff --git a/sql/mangos.sql b/sql/mangos.sql index 4f7970d1712..18babeabd2f 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -23,7 +23,7 @@ DROP TABLE IF EXISTS `db_version`; CREATE TABLE `db_version` ( `version` varchar(120) default NULL, `creature_ai_version` varchar(120) default NULL, - `required_8098_02_mangos_playercreateinfo_action` bit(1) default NULL + `required_8115_01_mangos_playercreateinfo_action` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; -- diff --git a/sql/updates/4377_world_spell_proc_event.sql b/sql/updates/4377_world_spell_proc_event.sql new file mode 100644 index 00000000000..bc006708b82 --- /dev/null +++ b/sql/updates/4377_world_spell_proc_event.sql @@ -0,0 +1,5 @@ +DELETE FROM `spell_proc_event` WHERE `entry` IN (53709, 53710, 53711); +INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES +(53709, 2, 10, 16384, 0, 0, 0, 0, 0, 0, 0), +(53710, 2, 10, 16384, 0, 0, 0, 0, 0, 0, 0), +(53711, 2, 10, 16384, 0, 0, 0, 0, 0, 0, 0); diff --git a/sql/updates/4382_8115_world_playercreateinfo_action.sql b/sql/updates/4382_8115_world_playercreateinfo_action.sql new file mode 100644 index 00000000000..1af313a0626 --- /dev/null +++ b/sql/updates/4382_8115_world_playercreateinfo_action.sql @@ -0,0 +1,358 @@ +-- ALTER TABLE db_version CHANGE COLUMN required_8112_01_mangos_spell_proc_event required_8115_01_mangos_playercreateinfo_action bit; + +TRUNCATE TABLE `playercreateinfo_action`; +INSERT INTO `playercreateinfo_action` VALUES +(1,1,1,78,0), +(1,1,0,6603,0), +(1,1,11,117,128), +(1,2,2,635,0), +(1,2,0,6603,0), +(1,2,1,21084,0), +(1,2,10,159,128), +(1,2,11,2070,128), +(1,4,1,1752,0), +(1,4,2,2098,0), +(1,4,3,2764,0), +(1,4,0,6603,0), +(1,4,11,2070,128), +(1,5,1,585,0), +(1,5,2,2050,0), +(1,5,0,6603,0), +(1,5,10,159,128), +(1,5,11,2070,128), +(1,6,0,6603,0), +(1,6,1,49576,0), +(1,6,2,45477,0), +(1,6,3,45462,0), +(1,6,4,45902,0), +(1,6,5,47541,0), +(1,6,11,59752,0), +(1,8,1,133,0), +(1,8,2,168,0), +(1,8,0,6603,0), +(1,8,10,159,128), +(1,8,11,2070,128), +(1,9,1,686,0), +(1,9,2,687,0), +(1,9,0,6603,0), +(1,9,10,159,128), +(1,9,11,4604,128), +(2,1,1,78,0), +(2,1,0,6603,0), +(2,1,11,117,128), +(2,3,2,75,0), +(2,3,1,2973,0), +(2,3,0,6603,0), +(2,3,11,117,128), +(2,3,10,159,128), +(2,4,10,0,128), +(2,4,1,1752,0), +(2,4,2,2098,0), +(2,4,0,6603,0), +(2,4,11,117,128), +(2,6,0,6603,0), +(2,6,1,49576,0), +(2,6,2,45477,0), +(2,6,3,45462,0), +(2,6,4,45902,0), +(2,6,5,47541,0), +(2,6,10,20572,0), +(2,7,2,331,0), +(2,7,1,403,0), +(2,7,0,6603,0), +(2,7,11,117,128), +(2,7,10,159,128), +(2,9,1,686,0), +(2,9,2,687,0), +(2,9,0,6603,0), +(2,9,11,117,128), +(2,9,10,159,128), +(3,1,1,78,0), +(3,1,0,6603,0), +(3,1,11,117,128), +(3,2,2,635,0), +(3,2,0,6603,0), +(3,2,1,21084,0), +(3,2,10,159,128), +(3,2,11,4540,128), +(3,3,2,75,0), +(3,3,1,2973,0), +(3,3,0,6603,0), +(3,3,11,117,128), +(3,3,10,159,128), +(3,4,1,1752,0), +(3,4,2,2098,0), +(3,4,3,2764,0), +(3,4,0,6603,0), +(3,4,11,4540,128), +(3,5,1,585,0), +(3,5,2,2050,0), +(3,5,0,6603,0), +(3,5,10,159,128), +(3,5,11,4540,128), +(3,6,0,6603,0), +(3,6,1,49576,0), +(3,6,2,45477,0), +(3,6,3,45462,0), +(3,6,4,45902,0), +(3,6,5,47541,0), +(3,6,10,2481,0), +(4,1,1,78,0), +(4,1,0,6603,0), +(4,1,11,117,128), +(4,3,2,75,0), +(4,3,1,2973,0), +(4,3,0,6603,0), +(4,3,11,117,128), +(4,3,10,159,128), +(4,4,1,1752,0), +(4,4,2,2098,0), +(4,4,3,2764,0), +(4,4,0,6603,0), +(4,4,11,4540,128), +(4,5,1,585,0), +(4,5,2,2050,0), +(4,5,0,6603,0), +(4,5,10,159,128), +(4,5,11,2070,128), +(4,6,0,6603,0), +(4,6,1,49576,0), +(4,6,2,45477,0), +(4,6,3,45462,0), +(4,6,4,45902,0), +(4,6,5,47541,0), +(4,6,10,58984,0), +(4,6,83,58984,0), +(4,11,1,5176,0), +(4,11,2,5185,0), +(4,11,0,6603,0), +(4,11,10,159,128), +(4,11,11,4536,128), +(5,1,11,4604,128), +(5,1,0,6603,0), +(5,1,1,78,0), +(5,4,11,4604,128), +(5,4,3,2764,0), +(5,4,2,2098,0), +(5,4,1,1752,0), +(5,4,0,6603,0), +(5,5,10,159,128), +(5,5,2,2050,0), +(5,5,1,585,0), +(5,5,11,4604,128), +(5,5,0,6603,0), +(5,6,0,6603,0), +(5,6,1,49576,0), +(5,6,2,45477,0), +(5,6,3,45462,0), +(5,6,4,45902,0), +(5,6,5,47541,0), +(5,6,10,20577,0), +(5,8,11,4604,128), +(5,8,10,159,128), +(5,8,2,168,0), +(5,8,1,133,0), +(5,8,0,6603,0), +(5,9,1,686,0), +(5,9,10,159,128), +(5,9,2,687,0), +(5,9,11,4604,128), +(5,9,0,6603,0), +(6,1,1,78,0), +(6,1,2,20549,0), +(6,1,11,4540,128), +(6,1,0,6603,0), +(6,3,1,2973,0), +(6,3,10,159,128), +(6,3,2,75,0), +(6,3,3,20549,0), +(6,3,11,117,128), +(6,3,0,6603,0), +(6,6,0,6603,0), +(6,6,1,49576,0), +(6,6,2,45477,0), +(6,6,3,45462,0), +(6,6,4,45902,0), +(6,6,5,47541,0), +(6,6,10,20549,0), +(6,6,75,20549,0), +(6,7,1,403,0), +(6,7,10,159,128), +(6,7,2,331,0), +(6,7,3,20549,0), +(6,7,11,4604,128), +(6,7,0,6603,0), +(6,11,1,5176,0), +(6,11,10,159,128), +(6,11,2,5185,0), +(6,11,3,20549,0), +(6,11,11,4536,128), +(6,11,0,6603,0), +(7,1,11,117,128), +(7,1,1,78,0), +(7,1,0,6603,0), +(7,4,11,117,128), +(7,4,3,2764,0), +(7,4,1,1752,0), +(7,4,2,2098,0), +(7,4,0,6603,0), +(7,6,0,6603,0), +(7,6,1,49576,0), +(7,6,2,45477,0), +(7,6,3,45462,0), +(7,6,4,45902,0), +(7,6,5,47541,0), +(7,6,10,20589,0), +(7,6,72,6603,0), +(7,6,83,117,128), +(7,6,84,6603,0), +(7,6,96,6603,0), +(7,6,108,6603,0), +(7,8,11,4536,128), +(7,8,1,133,0), +(7,8,2,168,0), +(7,8,10,159,128), +(7,8,0,6603,0), +(7,9,11,4604,128), +(7,9,1,686,0), +(7,9,2,687,0), +(7,9,10,159,128), +(7,9,0,6603,0), +(8,1,11,117,128), +(8,1,1,78,0), +(8,1,3,2764,0), +(8,1,0,6603,0), +(8,3,10,159,128), +(8,3,11,4604,128), +(8,3,1,2973,0), +(8,3,2,75,0), +(8,3,0,6603,0), +(8,4,1,1752,0), +(8,4,3,2764,0), +(8,4,2,2098,0), +(8,4,11,117,128), +(8,4,0,6603,0), +(8,5,1,585,0), +(8,5,10,159,128), +(8,5,2,2050,0), +(8,5,11,4540,128), +(8,5,0,6603,0), +(8,6,0,6603,0), +(8,6,1,49576,0), +(8,6,2,45477,0), +(8,6,3,45462,0), +(8,6,4,45902,0), +(8,6,5,47541,0), +(8,6,10,50621,0), +(8,7,1,403,0), +(8,7,10,159,128), +(8,7,2,331,0), +(8,7,11,117,128), +(8,7,0,6603,0), +(8,8,1,133,0), +(8,8,10,159,128), +(8,8,2,168,0), +(8,8,11,117,128), +(8,8,0,6603,0), +(10,2,0,6603,0), +(10,2,1,21084,0), +(10,2,2,635,0), +(10,2,3,28734,0), +(10,2,4,28730,0), +(10,2,10,159,128), +(10,2,11,20857,128), +(10,3,0,6603,0), +(10,3,1,2973,0), +(10,3,2,75,0), +(10,3,3,28734,0), +(10,3,4,28730,0), +(10,3,10,159,128), +(10,3,11,20857,128), +(10,4,0,6603,0), +(10,4,1,1752,0), +(10,4,2,2098,0), +(10,4,3,2764,0), +(10,4,4,28734,0), +(10,4,5,25046,0), +(10,4,11,20857,128), +(10,5,0,6603,0), +(10,5,1,585,0), +(10,5,2,2050,0), +(10,5,3,28734,0), +(10,5,4,28730,0), +(10,5,10,159,128), +(10,5,11,20857,128), +(10,6,0,6603,0), +(10,6,1,49576,0), +(10,6,2,45477,0), +(10,6,3,45462,0), +(10,6,4,45902,0), +(10,6,5,47541,0), +(10,6,6,50613,0), +(10,8,0,6603,0), +(10,8,1,133,0), +(10,8,2,168,0), +(10,8,3,28734,0), +(10,8,4,28730,0), +(10,8,10,159,128), +(10,8,11,20857,128), +(10,9,11,20857,128), +(10,9,10,159,128), +(10,9,4,28730,0), +(10,9,3,28734,0), +(10,9,2,687,0), +(10,9,1,686,0), +(10,9,0,6603,0), +(11,1,0,6603,0), +(11,1,72,6603,0), +(11,1,73,78,0), +(11,1,74,28880,0), +(11,1,83,4540,128), +(11,1,84,6603,0), +(11,1,96,6603,0), +(11,1,108,6603,0), +(11,2,0,6603,0), +(11,2,1,21084,0), +(11,2,2,635,0), +(11,2,3,59542,0), +(11,2,10,159,128), +(11,2,11,4540,128), +(11,2,83,4540,128), +(11,3,0,6603,0), +(11,3,1,2973,0), +(11,3,2,75,0), +(11,3,3,59543,0), +(11,3,10,159,128), +(11,3,11,4540,128), +(11,3,72,6603,0), +(11,3,73,2973,0), +(11,3,74,75,0), +(11,3,82,159,128), +(11,3,83,4540,128), +(11,5,0,6603,0), +(11,5,1,585,0), +(11,5,2,2050,0), +(11,5,3,59544,0), +(11,5,10,159,128), +(11,5,11,4540,128), +(11,5,83,4540,128), +(11,6,0,6603,0), +(11,6,1,49576,0), +(11,6,2,45477,0), +(11,6,3,45462,0), +(11,6,4,45902,0), +(11,6,5,47541,0), +(11,6,6,59545,0), +(11,7,0,6603,0), +(11,7,1,403,0), +(11,7,2,331,0), +(11,7,3,59547,0), +(11,7,10,159,128), +(11,7,11,4540,128), +(11,8,0,6603,0), +(11,8,1,133,0), +(11,8,2,168,0), +(11,8,3,59548,0), +(11,8,10,159,128), +(11,8,11,4540,128), +(11,8,83,4540,128); diff --git a/sql/updates/4392_world.sql b/sql/updates/4392_world.sql new file mode 100644 index 00000000000..7be4514cb8c --- /dev/null +++ b/sql/updates/4392_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` IN (20594); +INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES +( 20594, 65116, 2, 'Stoneform');
\ No newline at end of file diff --git a/sql/updates/4393_world_spell_proc_event.sql b/sql/updates/4393_world_spell_proc_event.sql new file mode 100644 index 00000000000..9d2fb7d776a --- /dev/null +++ b/sql/updates/4393_world_spell_proc_event.sql @@ -0,0 +1,8 @@ +DELETE FROM `spell_proc_event` WHERE `entry` IN (57470, 57472, 18119, 18120, 35100, 35102); +INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES +( 57470, 0x00, 6, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Renewed Hope +( 57472, 0x00, 6, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Renewed Hope +( 35100, 0x00, 9, 0x00001000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0, 0, 0), -- Concussive Barrage +( 35102, 0x00, 9, 0x00001000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0, 0, 0), -- Concussive Barrage +( 18119, 0x00, 5, 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Aftermath +( 18120, 0x00, 5, 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0); -- Aftermath diff --git a/sql/updates/4394_world_spell_proc_event.sql b/sql/updates/4394_world_spell_proc_event.sql new file mode 100644 index 00000000000..babd3782fea --- /dev/null +++ b/sql/updates/4394_world_spell_proc_event.sql @@ -0,0 +1,12 @@ +DELETE FROM `spell_proc_event` WHERE `entry` IN (13165, 14318, 14319, 14320, 14321, 14322, 25296, 27044, 61846, 61847); +INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES +( 13165, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Hawk +( 14318, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Hawk +( 14319, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Hawk +( 14320, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Hawk +( 14321, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Hawk +( 14322, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Hawk +( 25296, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Hawk +( 27044, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Hawk +( 61846, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0), -- Aspect of the Dragonhawk +( 61847, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0, 0, 0); -- Aspect of the Dragonhawk diff --git a/sql/updates/4397_world_playercreateinfo_spell_TDB.sql b/sql/updates/4397_world_playercreateinfo_spell_TDB.sql new file mode 100644 index 00000000000..5bc5689bbf1 --- /dev/null +++ b/sql/updates/4397_world_playercreateinfo_spell_TDB.sql @@ -0,0 +1,6 @@ +DELETE FROM `playercreateinfo_spell` WHERE `spell` = 60091; +INSERT INTO `playercreateinfo_spell` (`race`, `class`, `Spell`, `Note`) VALUES +(1, 2, 60091, 'Judgement Anti-Parry/Dodge Passive'), +(3, 2, 60091, 'Judgement Anti-Parry/Dodge Passive'), +(10, 2, 60091, 'Judgement Anti-Parry/Dodge Passive'), +(11, 2, 60091, 'Judgement Anti-Parry/Dodge Passive'); diff --git a/sql/world.sql b/sql/world.sql index 0d545243433..3f13cf48326 100644 --- a/sql/world.sql +++ b/sql/world.sql @@ -13734,270 +13734,294 @@ SET character_set_client = @saved_cs_client; LOCK TABLES `spell_bonus_data` WRITE; /*!40000 ALTER TABLE `spell_bonus_data` DISABLE KEYS */; INSERT INTO `spell_bonus_data` VALUES -(17,0.8068,0,0,'Priest - Power Word: Shield'), -(116,0.8143,0,0,'Mage - Frost Bolt'), -(120,0.214,0,0,'Mage - Cone of Cold'), -(122,0.193,0,0,'Mage - Frost Nova'), -(133,1,0,0,'Mage - Fire Ball'), -(139,0,0.376,0,'Priest - Renew'), -(172,0,0.2,0,'Warlock - Corruption'), -(331,1.6106,0,0,'Shaman - Healing Wave'), -(339,0,0.1,0,'Druid - Entangling Roots'), -(348,0.2,0.2,0,'Warlock - Immolate'), -(379,0.4762,0,0,'Shaman - Earth Shield Triggered'), -(403,0.7143,0,0,'Shaman - Lightning Bolt'), -(421,0.57,0,0,'Shaman - Chain Lightning'), -(585,0.714,0,0,'Priest - Smite'), -(589,0,0.1829,0,'Priest - Shadow Word: Pain'), -(596,0.8086,0,0,'Priest - Prayer of Healing'), -(603,0,2,0,'Warlock - Curse of Doom'), -(635,1.66,0,0,'Paladin - Holy Light'), -(686,0.8569,0,0,'Warlock - Shadow Bolt'), -(689,0,0.143,0,'Warlock - Drain Life'), -(755,0,0.4485,0,'Warlock - Health Funnel'), -(774,0,0.37604,0,'Druid - Rejuvenation'), -(879,0.15,0,0.15,'Paladin - Exorcism'), -(980,0,0.1,0,'Warlock - Curse of Agony'), -(1064,1.34,0,0,'Shaman - Chain Heal'), -(1120,0,0.429,0,'Warlock - Drain Soul'), -(1449,0.2128,0,0,'Mage - Arcane Explosion'), -(1463,0.8053,0,0,'Mage - Mana Shield'), -(1949,0,0.0949,0,'Warlock - Hellfire'), -(2060,1.6135,0,0,'Priest - Greater Heal'), -(2061,0.8068,0,0,'Priest - Flash Heal'), -(2120,0.2357,0.122,0,'Mage - Flamestrike'), -(2136,0.4286,0,0,'Mage - Fire Blast'), -(2812,0.07,0,0.07,'Paladin - Holy Wrath'), -(2912,1,0,0,'Druid - Starfire'), -(2944,0.1849,0,0,'Priest - Devouring Plague'), -(2948,0.4286,0,0,'Mage - Scorch'), -(3606,0.1667,0,0,'Shaman - Searing Totem Attack Rank 1'), -(5138,0,0,0,'Warlock - Drain Mana'), -(5176,0.5714,0,0,'Druid - Wrath'), -(5185,1.6104,0,0,'Druid - Healing Touch'), -(5570,0,0.2,0,'Druid - Insect Swarm'), -(5676,0.4293,0,0,'Warlock - Searing Pain'), -(5857,0.1427,0,0,'Warlock - Hellfire Effect on Enemy Rank 1'), -(6229,0.3,0,0,'Warlock - Shadow Ward'), -(6350,0.1667,0,0,'Shaman - Searing Totem Attack Rank 2'), -(6351,0.1667,0,0,'Shaman - Searing Totem Attack Rank 3'), -(6352,0.1667,0,0,'Shaman - Searing Totem Attack Rank 4'), -(6353,1.15,0,0,'Warlock - Soul Fire'), -(6789,0.214,0,0,'Warlock - Death Coil'), -(7268,0.2857,0,0,'Mage - Arcane Missiles Triggered Spell Rank 1'), -(7269,0.2857,0,0,'Mage - Arcane Missiles Triggered Spell Rank 2'), -(7270,0.2857,0,0,'Mage - Arcane Missiles Triggered Spell Rank 3'), -(8004,0.8082,0,0,'Shaman - Lesser Healing Wave'), -(8026,0.1,0,0,'Shaman - Flametongue Weapon Proc Rank 1'), -(8028,0.1,0,0,'Shaman - Flametongue Weapon Proc Rank 2'), -(8029,0.1,0,0,'Shaman - Flametongue Weapon Proc Rank 3'), -(8034,0.1,0,0,'Shaman - Frostbrand Attack Rank 1'), -(8037,0.1,0,0,'Shaman - Frostbrand Attack Rank 2'), -(8042,0.3858,0,0,'Shaman - Earth Shock'), -(8050,0.2142,0.1,0,'Shaman - Flame Shock'), -(8056,0.3858,0,0,'Shaman - Frost Shock'), -(8092,0.428,0,0,'Priest - Mind Blast'), -(8129,0,0,0,'Priest - Mana Burn'), -(8188,0.1,0,0,'Shaman - Magma Totam Passive Rank 1'), -(8418,0.2857,0,0,'Mage - Arcane Missiles Triggered Spell Rank 5'), -(8419,0.2857,0,0,'Mage - Arcane Missiles Triggered Spell Rank 4'), -(8443,0.2142,0,0,'Shaman - Fire Nova Totem Casted by Totem Rank 1'), -(8504,0.2142,0,0,'Shaman - Fire Nova Totem Casted by Totem Rank 2'), -(8505,0.2142,0,0,'Shaman - Fire Nova Totem Casted by Totem Rank 3'), -(8921,0.1515,0.13,0,'Druid - Moonfire'), -(8936,0.539,0.188,0,'Druid - Regrowth'), -(10273,0.2857,0,0,'Mage - Arcane Missiles Triggered Spell Rank 6'), -(10274,0.2857,0,0,'Mage - Arcane Missiles Triggered Spell Rank 7'), -(10435,0.1667,0,0,'Shaman - Searing Totem Attack Rank 5'), -(10436,0.1667,0,0,'Shaman - Searing Totem Attack Rank 6'), -(10445,0.1,0,0,'Shaman - Flametongue Weapon Proc Rank 4'), -(10458,0.1,0,0,'Shaman - Frostbrand Attack Rank 3'), -(10582,0.1,0,0,'Shaman - Magma Totam Passive Rank 2'), -(10583,0.1,0,0,'Shaman - Magma Totam Passive Rank 3'), -(10584,0.1,0,0,'Shaman - Magma Totam Passive Rank 4'), -(11113,0.1936,0,0,'Mage - Blast Wave Rank'), -(11310,0.2142,0,0,'Shaman - Fire Nova Totem Casted by Totem Rank 4'), -(11311,0.2142,0,0,'Shaman - Fire Nova Totem Casted by Totem Rank 5'), -(11366,1.15,0.05,0,'Mage - Pyroblast'), -(11426,0.8053,0,0,'Mage - Ice Barrier'), -(11681,0.1427,0,0,'Warlock - Hellfire Effect on Enemy Rank 2'), -(11682,0.1427,0,0,'Warlock - Hellfire Effect on Enemy Rank 3'), -(14914,0.5711,0.024,0,'Priest - Holy Fire'), -(15237,0.1606,0,0,'Priest - Holy Nova Damage'), -(15407,0.257,0,0,'Priest - Mind Flay'), -(16343,0.1,0,0,'Shaman - Flametongue Weapon Proc Rank 5'), -(16344,0.1,0,0,'Shaman - Flametongue Weapon Proc Rank 6'), -(16352,0.1,0,0,'Shaman - Frostbrand Attack Rank 4'), -(16353,0.1,0,0,'Shaman - Frostbrand Attack Rank 5'), -(17877,0.4293,0,0,'Warlock - Shadowburn'), -(17962,0,0,0,'Warlock - Conflagrate'), -(18220,0.96,0,0,'Warlock - Dark Pact Rank 1'), -(18562,0,0,0,'Druid - Swiftmend'), -(18937,0.96,0,0,'Warlock - Dark Pact Rank 2'), -(18938,0.96,0,0,'Warlock - Dark Pact Rank 3'), -(19236,0.8068,0,0,'Priest - Desperate Prayer'), -(19750,1,0,0,'Paladin - Flash of Light'), -(20167,0.25,0,0.16,'Paladin - Seal of Light Proc'), -(20424,0.25,0,0.16,'Paladin - Seal of Command Proc'), -(20925,0.09,0,0.056,'Paladin - Holy Shield'), -(23455,0.3035,0,0,'Priest - Holy Nova Heal Rank 1'), -(23458,0.3035,0,0,'Priest - Holy Nova Heal Rank 2'), -(23459,0.3035,0,0,'Priest - Holy Nova Heal Rank 3'), -(24275,0.15,0,0.15,'Paladin - Hammer of Wrath'), -(25329,0.3035,0,0,'Priest - Holy Nova Heal Rank 7'), -(25346,0.2857,0,0,'Mage - Arcane Missiles Triggered Spell Rank 8'), -(25488,0.1,0,0,'Shaman - Flametongue Weapon Proc Rank 7'), -(25501,0.1,0,0,'Shaman - Frostbrand Attack Rank 6'), -(25530,0.1667,0,0,'Shaman - Searing Totem Attack Rank 7'), -(25538,0.2142,0,0,'Shaman - Fire Nova Totem Casted by Totem Rank 6'), -(25539,0.2142,0,0,'Shaman - Fire Nova Totem Casted by Totem Rank 7'), -(25551,0.1,0,0,'Shaman - Magma Totam Passive Rank 5'), -(25742,0.07,0,0.039,'Paladin - Seal of Righteousness Dummy Proc'), -(25902,0.4286,0,0,'Paladin - Holy Shock Triggered Hurt Rank 3'), -(25903,0.81,0,0,'Paladin - Holy Shock Triggered Heal Rank 3'), -(25911,0.4286,0,0,'Paladin - Holy Shock Triggered Hurt Rank 2'), -(25912,0.4286,0,0,'Paladin - Holy Shock Triggered Hurt Rank 1'), -(25913,0.81,0,0,'Paladin - Holy Shock Triggered Heal Rank 2'), -(25914,0.81,0,0,'Paladin - Holy Shock Triggered Heal Rank 1'), -(26363,0.33,0,0,'Shaman - Lightning Shield Proc Rank 7'), -(26364,0.33,0,0,'Shaman - Lightning Shield Proc Rank 1'), -(26365,0.33,0,0,'Shaman - Lightning Shield Proc Rank 2'), -(26366,0.33,0,0,'Shaman - Lightning Shield Proc Rank 3'), -(26367,0.33,0,0,'Shaman - Lightning Shield Proc Rank 4'), -(26369,0.33,0,0,'Shaman - Lightning Shield Proc Rank 5'), -(26370,0.33,0,0,'Shaman - Lightning Shield Proc Rank 6'), -(26371,0.33,0,0,'Shaman - Lightning Shield Proc Rank 8'), -(26372,0.33,0,0,'Shaman - Lightning Shield Proc Rank 9'), -(26573,0,0.04,0.04,'Paladin - Consecration'), -(27076,0.2857,0,0,'Mage - Arcane Missiles Triggered Spell Rank 9'), -(27175,0.81,0,0,'Paladin - Holy Shock Triggered Heal Rank 4'), -(27176,0.4286,0,0,'Paladin - Holy Shock Triggered Hurt Rank 4'), -(27214,0.1427,0,0,'Warlock - Hellfire Effect on Enemy Rank 4'), -(27243,0.2129,0.25,0,'Warlock - Seed of Corruption'), -(27265,0.96,0,0,'Warlock - Dark Pact Rank 4'), -(27803,0.3035,0,0,'Priest - Holy Nova Heal Rank 4'), -(27804,0.3035,0,0,'Priest - Holy Nova Heal Rank 5'), -(27805,0.3035,0,0,'Priest - Holy Nova Heal Rank 6'), -(28176,0,0,0,'Warlock - Fel Armor'), -(29722,0.7139,0,0,'Warlock - Incinerate'), -(30108,0,0.2,0,'Warlock - Unstable Affliction'), -(30283,0.1932,0,0,'Warlock - Shadowfury'), -(30451,0.7143,0,0,'Mage - Arcane Blast'), -(30455,0.1429,0,0,'Mage - Ice Lance'), -(31117,1.8,0,0,'Warlock - Unstable Affliction Dispell'), -(31661,0.1936,0,0,'Mage - Dragons Breath'), -(31803,0,0.013,0.025,'Paladin - Holy Vengeance'), -(31893,0,0,0,"Paladin - Seal of Blood Proc Enemy"), -(31898,0.25,0,0.16,"Paladin - Judgement of Blood Enemy"), -(31935,0.07,0,0.07,'Paladin - Avengers Shiled'), -(32220,0.0833,0,0.0533,"Paladin - Judgement of Blood Self"), -(32221,0,0,0,"Paladin - Seal of Blood Proc Self"), -(32379,0.4296,0,0,'Priest - Shadow Word: Death'), -(32546,0.8068,0,0,'Priest - Binding Heal'), -(33073,0.4286,0,0,'Paladin - Holy Shock Triggered Hurt Rank 5'), -(33074,0.81,0,0,'Paladin - Holy Shock Triggered Heal Rank 5'), -(33110,0.8068,0,0,'Priest - Prayer of Mending Heal Proc'), -(33763,0.6453,0.09518,0,'Druid - Lifebloom'), -(34433,0.65,0,0,'Priest - Shadowfiend'), -(34861,0.402,0,0,'Priest - Circle of Healing'), -(34913,0,0,0,'Mage - Molten Armor Triggered Rank 1'), -(34914,0,0.4,0,'Priest - Vampiric Touch'), -(38700,0.2857,0,0,'Mage - Arcane Missiles Triggered Spell Rank 10'), -(38703,0.2857,0,0,'Mage - Arcane Missiles Triggered Spell Rank 11'), -(42198,0.1437,0,0,'Mage - Blizzard Triggered Spell Rank 7'), -(42208,0.1437,0,0,'Mage - Blizzard Triggered Spell Rank 1'), -(42209,0.1437,0,0,'Mage - Blizzard Triggered Spell Rank 2'), -(42210,0.1437,0,0,'Mage - Blizzard Triggered Spell Rank 3'), -(42211,0.1437,0,0,'Mage - Blizzard Triggered Spell Rank 4'), -(42212,0.1437,0,0,'Mage - Blizzard Triggered Spell Rank 5'), -(42213,0.1437,0,0,'Mage - Blizzard Triggered Spell Rank 6'), -(42218,0.7024,0,0,'Warlock - Rain of Fire Triggered Rank 5'), -(42223,0.7024,0,0,'Warlock - Rain of Fire Triggered Rank 1'), -(42224,0.7024,0,0,'Warlock - Rain of Fire Triggered Rank 2'), -(42225,0.7024,0,0,'Warlock - Rain of Fire Triggered Rank 3'), -(42226,0.7024,0,0,'Warlock - Rain of Fire Triggered Rank 4'), -(42231,0.12898,0,0,'Druid - Hurricane Triggered'), -(42844,0.2857,0,0,'Mage - Arcane Missiles Triggered Spell Rank 12'), -(42845,0.2857,0,0,'Mage - Arcane Missiles Triggered Spell Rank 13'), -(42937,0.1437,0,0,'Mage - Blizzard Triggered Spell Rank 8'), -(42938,0.1437,0,0,'Mage - Blizzard Triggered Spell Rank 9'), -(43043,0,0,0,'Mage - Molten Armor Triggered Rank 2'), -(43044,0,0,0,'Mage - Molten Armor Triggered Rank 3'), -(44203,0.538,0,0,'Druid - Tranquility Triggered'), -(44425,0.7143,0,0,'Mage - Arcane Barrage'), -(44457,0.4,0.2,0,'Mage - Living Bomb'), -(44614,0.8571,0,0,'Mage - Frostfire Bolt'), -(45477,0,0,0.1,'DK - Icy Touch'), -(47632,0,0,0.15,'DK - Death Coil'), -(47757,1.6135,0,0,'Priest - Penance (Rank 1'), -(47817,0.7024,0,0,'Warlock - Rain of Fire Triggered Rank 6'), -(47818,0.7024,0,0,'Warlock - Rain of Fire Triggered Rank 7'), -(47822,0.1427,0,0,'Warlock - Hellfire Effect on Enemy Rank 5'), -(47897,0.1064,0.0667,0,'Warlock - Shadowflame'), -(48181,0.4793,0,0,'Warlock - Haunt'), -(48438,0,0.11505,0,'Druid - Wild Growth'), -(48721,0,0,0.04,'DK - Blood Boil'), -(48820,0.4286,0,0,'Paladin - Holy Shock Triggered Heal Rank 6'), -(48821,0.81,0,0,'Paladin - Holy Shock Triggered Heal Rank 7'), -(48822,0.4286,0,0,'Paladin - Holy Shock Triggered Hurt Rank 6'), -(48823,0.4286,0,0,'Paladin - Holy Shock Triggered Hurt Rank 7'), -(49184,0,0,0.1,'DK - Howling Blast'), -(49278,0.33,0,0,'Shaman - Lightning Shield Proc Rank 10'), -(49279,0.33,0,0,'Shaman - Lightning Shield Proc Rank 11'), -(49821,0.2861,0,0,'Priest - Mind Sear Trigger Rank 1'), -(50288,0.05,0,0,'Druid - Starfall rank 1'), -(50294,0.012,0,0,'Druid - Starfall AOE rank 1'), -(50464,0.67305,0,0,'Druid - Nourish'), -(50536,0,0,0.013,'DK - Unholy Blight (Rank1)'), -(50590,0,0.1622,0,'Warlock - Immolation Aura'), -(50796,0.7139,0,0,'Warlock - Chaos Bolt'), -(51373,0,0,0.013,'DK - Unholy Blight (Rank2)'), -(51374,0,0,0.013,'DK - Unholy Blight (Rank3)'), -(51375,0,0,0.013,'DK - Unholy Blight (Rank4)'), -(51505,0.5714,0,0,'Shaman - Lava Burst'), -(52042,0.045,0,0,'Shaman - Healing Stream Totem Triggered Heal'), -(52212,0,0,0.0475,'DK - Death and Decay'), -(52986,1.6135,0,0,'Priest - Penance (Rank 2'), -(52987,1.6135,0,0,'Priest - Penance (Rank 3'), -(52988,1.6135,0,0,'Priest - Penance (Rank 4'), -(53022,0.2861,0,0,'Priest - Mind Sear Trigger Rank 2'), -(53188,0.012,0,0,'Druid - Starfall AOE rank 2'), -(53189,0.012,0,0,'Druid - Starfall AOE rank 3'), -(53190,0.012,0,0,'Druid - Starfall AOE rank 4'), -(53191,0.05,0,0,'Druid - Starfall rank 2'), -(53194,0.05,0,0,'Druid - Starfall rank 3'), -(53195,0.05,0,0,'Druid - Starfall rank 4'), -(53595,0,0,0,'Paladin - Hammer of the Righteous'), -(53718,0,0,0,"Paladin - Seal of the Martyr Proc Self"), -(53719,0,0,0,"Paladin - Seal of the Martyr Proc Enemy"), -(53725,0.0833,0,0.0533,"Paladin - Judgement of the Martyr Self"), -(53726,0.25,0,0.16,"Paladin - Judgement of the Martyr Enemy"), -(53742,0.013,0,0.025,'Paladin - Blood Corruption'), -(55078,0,0,0.055,'DK - Blood Plague'), -(55095,0,0,0.055,'DK - Frost Fever'), -(58597,0.75,0,0,'Paladin - Sacred Shield'), -(58700,0.1667,0,0,'Shaman - Searing Totem Attack Rank 8'), -(58701,0.1667,0,0,'Shaman - Searing Totem Attack Rank 9'), -(58702,0.1667,0,0,'Shaman - Searing Totem Attack Rank 10'), -(58733,0.1,0,0,'Shaman - Magma Totam Passive Rank 6'), -(58736,0.1,0,0,'Shaman - Magma Totam Passive Rank 7'), -(58786,0.1,0,0,'Shaman - Flametongue Weapon Proc Rank 8'), -(58787,0.1,0,0,'Shaman - Flametongue Weapon Proc Rank 9'), -(58788,0.1,0,0,'Shaman - Flametongue Weapon Proc Rank 10'), -(58797,0.1,0,0,'Shaman - Frostbrand Attack Rank 7'), -(58798,0.1,0,0,'Shaman - Frostbrand Attack Rank 8'), -(58799,0.1,0,0,'Shaman - Frostbrand Attack Rank 9'), -(59092,0.96,0,0,'Warlock - Dark Pact Rank 5'), -(61295,0.4,0.18,0,'Shaman - Riptide'), -(61391,0.193,0,0,'Druid - Typhoon'), -(61651,0.2142,0,0,'Shaman - Fire Nova Totem Casted by Totem Rank 8'), -(61660,0.2142,0,0,'Shaman - Fire Nova Totem Casted by Totem Rank 9'), -('17962', '0', '0', '0', 'Warlock - Conflagrate'); +(49941, 0, 0, 0.04, 'Death Knight - Blood Boil'), +(48721, 0, 0, 0.04, 'Death Knight - Blood Boil'), +(55078, 0, 0, 0.055, 'Death Knight - Blood Plague'), +(50444, 0, 0, 0.105, 'Death Knight - Corpse Explosion Triggered'), +(52212, 0, 0, 0.0475, 'Death Knight - Death and Decay'), +(47632, 0, 0, 0.15, 'Death Knight - Death Coil'), +(47633, 0, 0, 0.15, 'Death Knight - Death Coil Heal'), +(55095, 0, 0, 0.055, 'Death Knight - Frost Fever'), +(49184, 0, 0, 0.1, 'Death Knight - Howling Blast'), +(45477, 0, 0, 0.1, 'Death Knight - Icy Touch'), +(56903, 0, 0, 0, 'Death Knight - Lichflame'), +(50842, 0, 0, 0.04, 'Death Knight - Pestilence'), +(50401, 0, 0, 0, 'Death Knight - Razor Frost'), +(47476, 0, 0, 0.06, 'Death Knight - Strangulate'), +(50536, 0, 0, 0.013, 'Death Knight - Unholy Blight (Rank1)'), +(51373, 0, 0, 0.013, 'Death Knight - Unholy Blight (Rank2)'), +(51374, 0, 0, 0.013, 'Death Knight - Unholy Blight (Rank3)'), +(51375, 0, 0, 0.013, 'Death Knight - Unholy Blight (Rank4)'), +(339, 0, 0.1, 0, 'Druid - Entangling Roots'), +(5185, 1.611, 0, 0, 'Druid - Healing Touch'), +(42231, 0.12898, 0, 0, 'Druid - Hurricane Triggered'), +(5570, 0, 0.2, 0, 'Druid - Insect Swarm'), +(33763, 0.6453, 0.09518, 0, 'Druid - Lifebloom'), +(8921, 0.1515, 0.13, 0, 'Druid - Moonfire'), +(50464, 0.67305, 0, 0, 'Druid - Nourish'), +(8936, 0.539, 0.188, 0, 'Druid - Regrowth'), +(774, 0, 0.37604, 0, 'Druid - Rejuvenation'), +(50294, 0.0119, 0, 0, 'Druid - Starfall AOE rank 1'), +(53188, 0.0119, 0, 0, 'Druid - Starfall AOE rank 2'), +(53189, 0.0119, 0, 0, 'Druid - Starfall AOE rank 3'), +(53190, 0.0119, 0, 0, 'Druid - Starfall AOE rank 4'), +(50288, 0.0458, 0, 0, 'Druid - Starfall rank 1'), +(53191, 0.0458, 0, 0, 'Druid - Starfall rank 2'), +(53194, 0.0458, 0, 0, 'Druid - Starfall rank 3'), +(53195, 0.0458, 0, 0, 'Druid - Starfall rank 4'), +(2912, 1, 0, 0, 'Druid - Starfire'), +(18562, 0, 0, 0, 'Druid - Swiftmend'), +(44203, 0.538, 0, 0, 'Druid - Tranquility Triggered'), +(61391, 0.193, 0, 0, 'Druid - Typhoon'), +(48438, 0, 0.11505, 0, 'Druid - Wild Growth'), +(5176, 0.5714, 0, 0, 'Druid - Wrath'), +(60089, 0, 0, 0.05, 'Faerie Fire (feral)'), +(55039, 0, 0, 0, 'Item - Gnomish Lightning Generator'), +(44425, 0.7143, 0, 0, 'Mage - Arcane Barrage'), +(30451, 0.7143, 0, 0, 'Mage - Arcane Blast'), +(1449, 0.2128, 0, 0, 'Mage - Arcane Explosion'), +(7268, 0.2857, 0, 0, 'Mage - Arcane Missiles Triggered Spell Rank 1'), +(38700, 0.2857, 0, 0, 'Mage - Arcane Missiles Triggered Spell Rank 10'), +(38703, 0.2857, 0, 0, 'Mage - Arcane Missiles Triggered Spell Rank 11'), +(42844, 0.2857, 0, 0, 'Mage - Arcane Missiles Triggered Spell Rank 12'), +(42845, 0.2857, 0, 0, 'Mage - Arcane Missiles Triggered Spell Rank 13'), +(7269, 0.2857, 0, 0, 'Mage - Arcane Missiles Triggered Spell Rank 2'), +(7270, 0.2857, 0, 0, 'Mage - Arcane Missiles Triggered Spell Rank 3'), +(8419, 0.2857, 0, 0, 'Mage - Arcane Missiles Triggered Spell Rank 4'), +(8418, 0.2857, 0, 0, 'Mage - Arcane Missiles Triggered Spell Rank 5'), +(10273, 0.2857, 0, 0, 'Mage - Arcane Missiles Triggered Spell Rank 6'), +(10274, 0.2857, 0, 0, 'Mage - Arcane Missiles Triggered Spell Rank 7'), +(25346, 0.2857, 0, 0, 'Mage - Arcane Missiles Triggered Spell Rank 8'), +(27076, 0.2857, 0, 0, 'Mage - Arcane Missiles Triggered Spell Rank 9'), +(11113, 0.1936, 0, 0, 'Mage - Blast Wave'), +(42208, 0.1437, 0, 0, 'Mage - Blizzard Triggered Spell Rank 1'), +(42209, 0.1437, 0, 0, 'Mage - Blizzard Triggered Spell Rank 2'), +(42210, 0.1437, 0, 0, 'Mage - Blizzard Triggered Spell Rank 3'), +(42211, 0.1437, 0, 0, 'Mage - Blizzard Triggered Spell Rank 4'), +(42212, 0.1437, 0, 0, 'Mage - Blizzard Triggered Spell Rank 5'), +(42213, 0.1437, 0, 0, 'Mage - Blizzard Triggered Spell Rank 6'), +(42198, 0.1437, 0, 0, 'Mage - Blizzard Triggered Spell Rank 7'), +(42937, 0.1437, 0, 0, 'Mage - Blizzard Triggered Spell Rank 8'), +(42938, 0.1437, 0, 0, 'Mage - Blizzard Triggered Spell Rank 9'), +(120, 0.214, 0, 0, 'Mage - Cone of Cold'), +(31661, 0.1936, 0, 0, 'Mage - Dragons Breath'), +(133, 1, 0, 0, 'Mage - Fire Ball'), +(2136, 0.4286, 0, 0, 'Mage - Fire Blast'), +(543, 0.1, 0, 0, 'Mage - Fire Ward'), +(2120, 0.2357, 0.122, 0, 'Mage - Flamestrike'), +(116, 0.8143, 0, 0, 'Mage - Frost Bolt'), +(122, 0.193, 0, 0, 'Mage - Frost Nova'), +(6143, 0.1, 0, 0, 'Mage - Frost Ward'), +(44614, 0.8571, 0, 0, 'Mage - Frostfire Bolt'), +(11426, 0.8053, 0, 0, 'Mage - Ice Barrier'), +(30455, 0.1429, 0, 0, 'Mage - Ice Lance'), +(44457, 0.4, 0.2, 0, 'Mage - Living Bomb'), +(1463, 0.8053, 0, 0, 'Mage - Mana Shield'), +(34913, 0, 0, 0, 'Mage - Molten Armor Triggered Rank 1'), +(43043, 0, 0, 0, 'Mage - Molten Armor Triggered Rank 2'), +(43044, 0, 0, 0, 'Mage - Molten Armor Triggered Rank 3'), +(11366, 1.15, 0.05, 0, 'Mage - Pyroblast'), +(2948, 0.4286, 0, 0, 'Mage - Scorch'), +(31935, 0.07, 0, 0.07, 'Paladin - Avenger Shield'), +(53742, 0, 0.0176, 0.03, 'Paladin - Blood Corruption'), +(26573, 0, 0.04, 0.04, 'Paladin - Consecration'), +(879, 0.15, 0, 0.15, 'Paladin - Exorcism'), +(19750, 1, 0, 0, 'Paladin - Flash of Light'), +(53595, 0, 0, 0, 'Paladin - Hammer of the Righteous'), +(24275, 0.15, 0, 0.15, 'Paladin - Hammer of Wrath'), +(635, 1.66, 0, 0, 'Paladin - Holy Light'), +(20925, 0.09, 0, 0.056, 'Paladin - Holy Shield'), +(25914, 0.81, 0, 0, 'Paladin - Holy Shock Triggered Heal Rank 1'), +(25913, 0.81, 0, 0, 'Paladin - Holy Shock Triggered Heal Rank 2'), +(25903, 0.81, 0, 0, 'Paladin - Holy Shock Triggered Heal Rank 3'), +(27175, 0.81, 0, 0, 'Paladin - Holy Shock Triggered Heal Rank 4'), +(33074, 0.81, 0, 0, 'Paladin - Holy Shock Triggered Heal Rank 5'), +(48820, 0.81, 0, 0, 'Paladin - Holy Shock Triggered Heal Rank 6'), +(48821, 0.81, 0, 0, 'Paladin - Holy Shock Triggered Heal Rank 7'), +(25912, 0.4286, 0, 0, 'Paladin - Holy Shock Triggered Hurt Rank 1'), +(25911, 0.4286, 0, 0, 'Paladin - Holy Shock Triggered Hurt Rank 2'), +(25902, 0.4286, 0, 0, 'Paladin - Holy Shock Triggered Hurt Rank 3'), +(27176, 0.4286, 0, 0, 'Paladin - Holy Shock Triggered Hurt Rank 4'), +(33073, 0.4286, 0, 0, 'Paladin - Holy Shock Triggered Hurt Rank 5'), +(48822, 0.4286, 0, 0, 'Paladin - Holy Shock Triggered Hurt Rank 6'), +(48823, 0.4286, 0, 0, 'Paladin - Holy Shock Triggered Hurt Rank 7'), +(31803, 0, 0.0176, 0.03, 'Paladin - Holy Vengeance'), +(2812, 0.07, 0, 0.07, 'Paladin - Holy Wrath'), +(31898, 0.25, 0, 0.16, 'Paladin - Judgement of Blood Enemy'), +(32220, 0.0833, 0, 0.0533, 'Paladin - Judgement of Blood Self'), +(20467, 0.25, 0, 0.16, 'Paladin - Judgement of Command'), +(53733, 0, 0, 0, 'Paladin - Judgement of Corruption'), +(20267, 0.1, 0, 0.1, 'Paladin - Judgement of Light Proc'), +(20187, 0.4, 0, 0.25, 'Paladin - Judgement of Righteousness'), +(53726, 0.25, 0, 0.16, 'Paladin - Judgement of the Martyr Enemy'), +(53725, 0.0833, 0, 0.0533, 'Paladin - Judgement of the Martyr Self'), +(31804, 0, 0, 0, 'Paladin - Judgement of Vengeance'), +(58597, 0.75, 0, 0, 'Paladin - Sacred Shield'), +(53601, 0.75, 0, 0, 'Paladin - Sacred Shield'), +(31893, 0, 0, 0, 'Paladin - Seal of Blood Proc Enemy'), +(32221, 0, 0, 0, 'Paladin - Seal of Blood Proc Self'), +(20424, 0, 0, 0, 'Paladin - Seal of Command Proc'), +(20167, 0.15, 0, 0.15, 'Paladin - Seal of Light Proc'), +(25742, 0.07, 0, 0.039, 'Paladin - Seal of Righteousness Dummy Proc'), +(53719, 0, 0, 0, 'Paladin - Seal of the Martyr Proc Enemy'), +(53718, 0, 0, 0, 'Paladin - Seal of the Martyr Proc Self'), +(53600, 0, 0, 0, 'Paladin - Shield of Righteousness'), +(32546, 0.8068, 0, 0, 'Priest - Binding Heal'), +(27813, 0, 0, 0, 'Priest - Blessed Recovery Rank 1'), +(27817, 0, 0, 0, 'Priest - Blessed Recovery Rank 2'), +(27818, 0, 0, 0, 'Priest - Blessed Recovery Rank 3'), +(34861, 0.402, 0, 0, 'Priest - Circle of Healing'), +(19236, 0.8068, 0, 0, 'Priest - Desperate Prayer'), +(2944, 0, 0.1849, 0, 'Priest - Devouring Plague'), +(2061, 0.8068, 0, 0, 'Priest - Flash Heal'), +(2060, 1.6135, 0, 0, 'Priest - Greater Heal'), +(14914, 0.5711, 0.024, 0, 'Priest - Holy Fire'), +(15237, 0.1606, 0, 0, 'Priest - Holy Nova Damage'), +(23455, 0.3035, 0, 0, 'Priest - Holy Nova Heal Rank 1'), +(23458, 0.3035, 0, 0, 'Priest - Holy Nova Heal Rank 2'), +(23459, 0.3035, 0, 0, 'Priest - Holy Nova Heal Rank 3'), +(27803, 0.3035, 0, 0, 'Priest - Holy Nova Heal Rank 4'), +(27804, 0.3035, 0, 0, 'Priest - Holy Nova Heal Rank 5'), +(27805, 0.3035, 0, 0, 'Priest - Holy Nova Heal Rank 6'), +(25329, 0.3035, 0, 0, 'Priest - Holy Nova Heal Rank 7'), +(8129, 0, 0, 0, 'Priest - Mana Burn'), +(8092, 0.428, 0, 0, 'Priest - Mind Blast'), +(15407, 0.257, 0, 0, 'Priest - Mind Flay'), +(49821, 0.2861, 0, 0, 'Priest - Mind Sear Trigger Rank 1'), +(53022, 0.2861, 0, 0, 'Priest - Mind Sear Trigger Rank 2'), +(47757, 1.6135, 0, 0, 'Priest - Penance (Rank 1'), +(52986, 1.6135, 0, 0, 'Priest - Penance (Rank 2'), +(52987, 1.6135, 0, 0, 'Priest - Penance (Rank 3'), +(52988, 1.6135, 0, 0, 'Priest - Penance (Rank 4'), +(17, 0.8068, 0, 0, 'Priest - Power Word: Shield'), +(596, 0.8068, 0, 0, 'Priest - Prayer of Healing'), +(33110, 0.8068, 0, 0, 'Priest - Prayer of Mending Heal Proc'), +(33619, 0, 0, 0, 'Priest - Reflective Shield'), +(139, 0, 0.376, 0, 'Priest - Renew'), +(32379, 0.4296, 0, 0, 'Priest - Shadow Word: Death'), +(589, 0, 0.1829, 0, 'Priest - Shadow Word: Pain'), +(34433, 0.65, 0, 0, 'Priest - Shadowfiend'), +(585, 0.714, 0, 0, 'Priest - Smite'), +(34914, 0, 0.4, 0, 'Priest - Vampiric Touch'), +(1064, 1.34, 0, 0, 'Shaman - Chain Heal'), +(421, 0.57, 0, 0, 'Shaman - Chain Lightning'), +(974, 0.4762, 0, 0, 'Shaman - Earth Shield'), +(379, 0, 0, 0, 'Shaman - Earth Shield Triggered'), +(8042, 0.3858, 0, 0, 'Shaman - Earth Shock'), +(8443, 0.2142, 0, 0, 'Shaman - Fire Nova Totem Casted by Totem Rank 1'), +(8504, 0.2142, 0, 0, 'Shaman - Fire Nova Totem Casted by Totem Rank 2'), +(8505, 0.2142, 0, 0, 'Shaman - Fire Nova Totem Casted by Totem Rank 3'), +(11310, 0.2142, 0, 0, 'Shaman - Fire Nova Totem Casted by Totem Rank 4'), +(11311, 0.2142, 0, 0, 'Shaman - Fire Nova Totem Casted by Totem Rank 5'), +(25538, 0.2142, 0, 0, 'Shaman - Fire Nova Totem Casted by Totem Rank 6'), +(25539, 0.2142, 0, 0, 'Shaman - Fire Nova Totem Casted by Totem Rank 7'), +(61651, 0.2142, 0, 0, 'Shaman - Fire Nova Totem Casted by Totem Rank 8'), +(61660, 0.2142, 0, 0, 'Shaman - Fire Nova Totem Casted by Totem Rank 9'), +(8050, 0.2142, 0.1, 0, 'Shaman - Flame Shock'), +(8026, 0.1, 0, 0, 'Shaman - Flametongue Weapon Proc Rank 1'), +(58788, 0.1, 0, 0, 'Shaman - Flametongue Weapon Proc Rank 10'), +(8028, 0.1, 0, 0, 'Shaman - Flametongue Weapon Proc Rank 2'), +(8029, 0.1, 0, 0, 'Shaman - Flametongue Weapon Proc Rank 3'), +(10445, 0.1, 0, 0, 'Shaman - Flametongue Weapon Proc Rank 4'), +(16343, 0.1, 0, 0, 'Shaman - Flametongue Weapon Proc Rank 5'), +(16344, 0.1, 0, 0, 'Shaman - Flametongue Weapon Proc Rank 6'), +(25488, 0.1, 0, 0, 'Shaman - Flametongue Weapon Proc Rank 7'), +(58786, 0.1, 0, 0, 'Shaman - Flametongue Weapon Proc Rank 8'), +(58787, 0.1, 0, 0, 'Shaman - Flametongue Weapon Proc Rank 9'), +(8056, 0.3858, 0, 0, 'Shaman - Frost Shock'), +(8034, 0.1, 0, 0, 'Shaman - Frostbrand Attack Rank 1'), +(8037, 0.1, 0, 0, 'Shaman - Frostbrand Attack Rank 2'), +(10458, 0.1, 0, 0, 'Shaman - Frostbrand Attack Rank 3'), +(16352, 0.1, 0, 0, 'Shaman - Frostbrand Attack Rank 4'), +(16353, 0.1, 0, 0, 'Shaman - Frostbrand Attack Rank 5'), +(25501, 0.1, 0, 0, 'Shaman - Frostbrand Attack Rank 6'), +(58797, 0.1, 0, 0, 'Shaman - Frostbrand Attack Rank 7'), +(58798, 0.1, 0, 0, 'Shaman - Frostbrand Attack Rank 8'), +(58799, 0.1, 0, 0, 'Shaman - Frostbrand Attack Rank 9'), +(2645, 0, 0, 0, 'Shaman - Glyph of Ghost Wolf'), +(52042, 0.045, 0, 0, 'Shaman - Healing Stream Totem Triggered Heal'), +(331, 1.6106, 0, 0, 'Shaman - Healing Wave'), +(51505, 0.5714, 0, 0, 'Shaman - Lava Burst'), +(8004, 0.8082, 0, 0, 'Shaman - Lesser Healing Wave'), +(403, 0.7143, 0, 0, 'Shaman - Lightning Bolt'), +(26364, 0.33, 0, 0, 'Shaman - Lightning Shield Proc Rank 1'), +(49278, 0.33, 0, 0, 'Shaman - Lightning Shield Proc Rank 10'), +(49279, 0.33, 0, 0, 'Shaman - Lightning Shield Proc Rank 11'), +(26365, 0.33, 0, 0, 'Shaman - Lightning Shield Proc Rank 2'), +(26366, 0.33, 0, 0, 'Shaman - Lightning Shield Proc Rank 3'), +(26367, 0.33, 0, 0, 'Shaman - Lightning Shield Proc Rank 4'), +(26369, 0.33, 0, 0, 'Shaman - Lightning Shield Proc Rank 5'), +(26370, 0.33, 0, 0, 'Shaman - Lightning Shield Proc Rank 6'), +(26363, 0.33, 0, 0, 'Shaman - Lightning Shield Proc Rank 7'), +(26371, 0.33, 0, 0, 'Shaman - Lightning Shield Proc Rank 8'), +(26372, 0.33, 0, 0, 'Shaman - Lightning Shield Proc Rank 9'), +(8188, 0.1, 0, 0, 'Shaman - Magma Totam Passive Rank 1'), +(10582, 0.1, 0, 0, 'Shaman - Magma Totam Passive Rank 2'), +(10583, 0.1, 0, 0, 'Shaman - Magma Totam Passive Rank 3'), +(10584, 0.1, 0, 0, 'Shaman - Magma Totam Passive Rank 4'), +(25551, 0.1, 0, 0, 'Shaman - Magma Totam Passive Rank 5'), +(58733, 0.1, 0, 0, 'Shaman - Magma Totam Passive Rank 6'), +(58736, 0.1, 0, 0, 'Shaman - Magma Totam Passive Rank 7'), +(61295, 0.4, 0.18, 0, 'Shaman - Riptide'), +(3606, 0.1667, 0, 0, 'Shaman - Searing Totem Attack Rank 1'), +(58702, 0.1667, 0, 0, 'Shaman - Searing Totem Attack Rank 10'), +(6350, 0.1667, 0, 0, 'Shaman - Searing Totem Attack Rank 2'), +(6351, 0.1667, 0, 0, 'Shaman - Searing Totem Attack Rank 3'), +(6352, 0.1667, 0, 0, 'Shaman - Searing Totem Attack Rank 4'), +(10435, 0.1667, 0, 0, 'Shaman - Searing Totem Attack Rank 5'), +(10436, 0.1667, 0, 0, 'Shaman - Searing Totem Attack Rank 6'), +(25530, 0.1667, 0, 0, 'Shaman - Searing Totem Attack Rank 7'), +(58700, 0.1667, 0, 0, 'Shaman - Searing Totem Attack Rank 8'), +(58701, 0.1667, 0, 0, 'Shaman - Searing Totem Attack Rank 9'), +(50796, 0.7139, 0, 0, 'Warlock - Chaos Bolt'), +(17962, 0, 0, 0, 'Warlock - Conflagrate'), +(172, 0, 0.2, 0, 'Warlock - Corruption'), +(980, 0, 0.1, 0, 'Warlock - Curse of Agony'), +(603, 0, 2, 0, 'Warlock - Curse of Doom'), +(18220, 0.96, 0, 0, 'Warlock - Dark Pact Rank 1'), +(18937, 0.96, 0, 0, 'Warlock - Dark Pact Rank 2'), +(18938, 0.96, 0, 0, 'Warlock - Dark Pact Rank 3'), +(27265, 0.96, 0, 0, 'Warlock - Dark Pact Rank 4'), +(59092, 0.96, 0, 0, 'Warlock - Dark Pact Rank 5'), +(6789, 0.214, 0, 0, 'Warlock - Death Coil'), +(689, 0, 0.143, 0, 'Warlock - Drain Life'), +(5138, 0, 0, 0, 'Warlock - Drain Mana'), +(1120, 0, 0.429, 0, 'Warlock - Drain Soul'), +(28176, 0, 0, 0, 'Warlock - Fel Armor'), +(18790, 0, 0, 0, 'Warlock - Fel Stamina'), +(48181, 0.4793, 0, 0, 'Warlock - Haunt'), +(755, 0, 0.4485, 0, 'Warlock - Health Funnel'), +(1949, 0, 0.0949, 0, 'Warlock - Hellfire'), +(5857, 0.145, 0, 0, 'Warlock - Hellfire Effect on Enemy Rank 1'), +(11681, 0.145, 0, 0, 'Warlock - Hellfire Effect on Enemy Rank 2'), +(11682, 0.145, 0, 0, 'Warlock - Hellfire Effect on Enemy Rank 3'), +(27214, 0.145, 0, 0, 'Warlock - Hellfire Effect on Enemy Rank 4'), +(47822, 0.145, 0, 0, 'Warlock - Hellfire Effect on Enemy Rank 5'), +(348, 0.2, 0.2, 0, 'Warlock - Immolate'), +(29722, 0.7139, 0, 0, 'Warlock - Incinerate'), +(42223, 0.286, 0, 0, 'Warlock - Rain of Fire Triggered Rank 1'), +(42224, 0.286, 0, 0, 'Warlock - Rain of Fire Triggered Rank 2'), +(42225, 0.286, 0, 0, 'Warlock - Rain of Fire Triggered Rank 3'), +(42226, 0.286, 0, 0, 'Warlock - Rain of Fire Triggered Rank 4'), +(42218, 0.286, 0, 0, 'Warlock - Rain of Fire Triggered Rank 5'), +(47817, 0.286, 0, 0, 'Warlock - Rain of Fire Triggered Rank 6'), +(47818, 0.286, 0, 0, 'Warlock - Rain of Fire Triggered Rank 7'), +(5676, 0.4293, 0, 0, 'Warlock - Searing Pain'), +(27243, 0.2129, 0.25, 0, 'Warlock - Seed of Corruption'), +(686, 0.8569, 0, 0, 'Warlock - Shadow Bolt'), +(6229, 0.3, 0, 0, 'Warlock - Shadow Ward'), +(17877, 0.4293, 0, 0, 'Warlock - Shadowburn'), +(47960, 0.1064, 0.0667, 0, 'Warlock - Shadowflame Rank 1'), +(61291, 0.1064, 0.0667, 0, 'Warlock - Shadowflame Rank 2'), +(30283, 0.1932, 0, 0, 'Warlock - Shadowfury'), +(63106, 0, 0, 0, 'Warlock - Siphon Life Triggered'), +(6353, 1.15, 0, 0, 'Warlock - Soul Fire'), +(30294, 0, 0, 0, 'Warlock - Soul Leech'), +(30108, 0, 0.2, 0, 'Warlock - Unstable Affliction'), +(31117, 1.8, 0, 0, 'Warlock - Unstable Affliction Dispell'); /*!40000 ALTER TABLE `spell_bonus_data` ENABLE KEYS */; UNLOCK TABLES; -// TODO: update this after UDB release - -- -- Table structure for table `spell_disabled` -- @@ -15416,7 +15440,7 @@ INSERT INTO `trinity_string` VALUES (5016,'[Arena]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (5017,'[Raid reset time: %s]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (5018,'[Heroic reset time: %s]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), -(5019,'[Mountable]',NULL NULL,NULL,NULL,NULL,NULL,NULL,NULL), +(5019,'[Mountable]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (6613,'|cfff00000[GM Announcement]: %s|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (6614,'Notification to GM\'s - ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (6615,'|cffffff00[|c1f40af20GM Announce by|r |cffff0000%s|cffffff00]:|r %s|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), diff --git a/src/game/CreatureEventAIMgr.cpp b/src/game/CreatureEventAIMgr.cpp index 38cc84177e4..18db935536b 100644 --- a/src/game/CreatureEventAIMgr.cpp +++ b/src/game/CreatureEventAIMgr.cpp @@ -473,9 +473,8 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts() action.morph.modelId = 0; } } - - break; } + break; case ACTION_T_SOUND: if (!sSoundEntriesStore.LookupEntry(action.sound.soundId)) sLog.outErrorDb("CreatureEventAI: Event %u Action %u uses non-existant SoundID %u.", i, j+1, action.sound.soundId); diff --git a/src/game/DestinationHolderImp.h b/src/game/DestinationHolderImp.h index d50d8c3e727..c84ce19a96d 100644 --- a/src/game/DestinationHolderImp.h +++ b/src/game/DestinationHolderImp.h @@ -142,7 +142,7 @@ DestinationHolder<TRAVELLER>::UpdateTraveller(TRAVELLER &traveller, uint32 diff, i_fromZ = z; } - if( traveller.GetTraveller().GetPositionX() != x || traveller.GetTraveller().GetPositionY() != y ) + if( traveller.GetTraveller().GetPositionX() != x || traveller.GetTraveller().GetPositionY() != y || traveller.GetTraveller().GetPositionZ() != z) { float ori = traveller.GetTraveller().GetAngle(x, y); traveller.Relocation(x, y, z, ori); diff --git a/src/game/Group.cpp b/src/game/Group.cpp index 9db043b28f1..8a02afa25d2 100644 --- a/src/game/Group.cpp +++ b/src/game/Group.cpp @@ -1510,7 +1510,7 @@ void Group::ResetInstances(uint8 method, Player* SendMsgTo) bool isEmpty = true; // if the map is loaded, reset it Map *map = MapManager::Instance().FindMap(p->GetMapId(), p->GetInstanceId()); - if(map && map->IsDungeon()) + if(map && map->IsDungeon() && !(method == INSTANCE_RESET_GROUP_DISBAND && !p->CanReset())) { if(p->CanReset()) isEmpty = ((InstanceMap*)map)->Reset(method); diff --git a/src/game/ItemHandler.cpp b/src/game/ItemHandler.cpp index cf762dd0cb2..d886cda742b 100644 --- a/src/game/ItemHandler.cpp +++ b/src/game/ItemHandler.cpp @@ -674,7 +674,31 @@ void WorldSession::HandleBuyItemInSlotOpcode( WorldPacket & recv_data ) recv_data >> vendorguid >> item >> slot >> bagguid >> bagslot >> count; - GetPlayer()->BuyItemFromVendor(vendorguid,item,count,bagguid,bagslot); + uint8 bag = NULL_BAG; // init for case invalid bagGUID + + // find bag slot by bag guid + if (bagguid == _player->GetGUID()) + bag = INVENTORY_SLOT_BAG_0; + else + { + for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END;++i) + { + if (Bag *pBag = (Bag*)_player->GetItemByPos(INVENTORY_SLOT_BAG_0,i)) + { + if (bagguid == pBag->GetGUID()) + { + bag = i; + break; + } + } + } + } + + // bag not found, cheating? + if (bag == NULL_BAG) + return; + + GetPlayer()->BuyItemFromVendor(vendorguid,item,count,bag,bagslot); } void WorldSession::HandleBuyItemOpcode( WorldPacket & recv_data ) diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index ba956ac38f4..a099aa8f66c 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -1640,6 +1640,9 @@ bool ChatHandler::HandleUnLearnCommand(const char* args) else SendSysMessage(LANG_FORGET_SPELL); + if(GetTalentSpellCost(spell_id)) + target->SendTalentsInfoData(false); + return true; } @@ -2582,6 +2585,10 @@ bool ChatHandler::HandleLearnCommand(const char* args) else targetPlayer->learnSpell(spell,false); + uint32 first_spell = spellmgr.GetFirstSpellInChain(spell); + if(GetTalentSpellCost(first_spell)) + targetPlayer->SendTalentsInfoData(false); + return true; } diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 15dc3c69bd8..a3f784ac292 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -2992,7 +2992,7 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen if(!rankSpellId || rankSpellId==spell_id) continue; - removeSpell(rankSpellId); + removeSpell(rankSpellId,false,false); } } } @@ -3268,7 +3268,7 @@ void Player::learnSpell(uint32 spell_id, bool dependent) GetSession()->SendPacket(&data); } -void Player::removeSpell(uint32 spell_id, bool disabled, bool update_action_bar_for_low_rank) +void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank) { PlayerSpellMap::iterator itr = m_spells.find(spell_id); if (itr == m_spells.end()) @@ -3288,7 +3288,7 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool update_action_bar_ SpellsRequiringSpellMap const& reqMap = spellmgr.GetSpellsRequiringSpell(); SpellsRequiringSpellMap::const_iterator itr2 = reqMap.find(spell_id); for (uint32 i=reqMap.count(spell_id);i>0;i--,itr2++) - removeSpell(itr2->second,disabled); + removeSpell(itr2->second,disabled,false); // re-search, it can be corrupted in prev loop itr = m_spells.find(spell_id); @@ -3417,15 +3417,17 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool update_action_bar_ { SpellEntry const *spellInfo = sSpellStore.LookupEntry(spell_id); - // if talent then lesser rank also talent and need learn + // if talent then lesser rank also talent and need learn if(talentCosts) { - //learnSpell (prev_id,false); + // I cannot see why mangos has these lines. + //if(learn_low_rank) + // learnSpell (prev_id,false); } - // if ranked non-stackable spell: need activate lesser rank and update dendence state + // if ranked non-stackable spell: need activate lesser rank and update dendence state else if(cur_active && !SpellMgr::canStackSpellRanks(spellInfo) && spellmgr.GetSpellRank(spellInfo->Id) != 0) { - // need manually update dependence state (learn spell ignore like attempts) + // need manually update dependence state (learn spell ignore like attempts) PlayerSpellMap::iterator prev_itr = m_spells.find(prev_id); if (prev_itr != m_spells.end()) { @@ -3437,19 +3439,16 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool update_action_bar_ } // now re-learn if need re-activate - if(cur_active && !prev_itr->second->active) + if(cur_active && !prev_itr->second->active && learn_low_rank) { if(addSpell(prev_id,true,false,prev_itr->second->dependent,prev_itr->second->disabled)) { - if(update_action_bar_for_low_rank) - { - // downgrade spell ranks in spellbook and action bar - WorldPacket data(SMSG_SUPERCEDED_SPELL, 4 + 4); - data << uint32(spell_id); - data << uint32(prev_id); - GetSession()->SendPacket( &data ); - prev_activate = true; - } + // downgrade spell ranks in spellbook and action bar + WorldPacket data(SMSG_SUPERCEDED_SPELL, 4 + 4); + data << uint32(spell_id); + data << uint32(prev_id); + GetSession()->SendPacket( &data ); + prev_activate = true; } } } @@ -3473,6 +3472,7 @@ void Player::RemoveSpellCooldown( uint32 spell_id, bool update /* = false */ ) SendClearCooldown(spell_id, this); } +// I am not sure which one is more efficient void Player::RemoveCategoryCooldown( uint32 cat ) { SpellCategoryStore::const_iterator i_scstore = sSpellCategoryStore.find(cat); @@ -3481,6 +3481,22 @@ void Player::RemoveCategoryCooldown( uint32 cat ) RemoveSpellCooldown(*i_scset, true); } +void Player::RemoveSpellCategoryCooldown(uint32 cat, bool update /* = false */) +{ + SpellCategoryStore::const_iterator ct = sSpellCategoryStore.find(cat); + if (ct == sSpellCategoryStore.end()) + return; + + const SpellCategorySet& ct_set = ct->second; + for (SpellCooldowns::const_iterator i = m_spellCooldowns.begin(); i != m_spellCooldowns.end();) + { + if (ct_set.find(i->first) != ct_set.end()) + RemoveSpellCooldown((i++)->first, update); + else + ++i; + } +} + void Player::RemoveArenaSpellCooldowns() { // remove cooldowns on spells that has < 15 min CD @@ -3664,7 +3680,13 @@ bool Player::resetTalents(bool no_cost) uint32 itrFirstId = spellmgr.GetFirstSpellInChain(itr->first); // unlearn if first rank is talent or learned by talent - if (itrFirstId == talentInfo->RankID[j] || spellmgr.IsSpellLearnToSpell(talentInfo->RankID[j],itrFirstId)) + if (itrFirstId == talentInfo->RankID[j]) + { + removeSpell(itr->first,!IsPassiveSpell(itr->first),false); + itr = GetSpellMap().begin(); + continue; + } + else if (spellmgr.IsSpellLearnToSpell(talentInfo->RankID[j],itrFirstId)) { removeSpell(itr->first,!IsPassiveSpell(itr->first)); itr = GetSpellMap().begin(); @@ -17849,20 +17871,20 @@ void Player::InitDataForForm(bool reapplyMods) } // Return true is the bought item has a max count to force refresh of window by caller -bool Player::BuyItemFromVendor(uint64 vendorguid, uint32 item, uint8 count, uint64 bagguid, uint8 slot) +bool Player::BuyItemFromVendor(uint64 vendorguid, uint32 item, uint8 count, uint8 bag, uint8 slot) { // cheating attempt - if(count < 1) count = 1; + if (count < 1) count = 1; // cheating attempt if(slot > MAX_BAG_SIZE && slot !=NULL_SLOT) return false; - if(!isAlive()) + if (!isAlive()) return false; ItemPrototype const *pProto = objmgr.GetItemPrototype( item ); - if( !pProto ) + if (!pProto) { SendBuyError( BUY_ERR_CANT_FIND_ITEM, NULL, item, 0); return false; @@ -17884,7 +17906,7 @@ bool Player::BuyItemFromVendor(uint64 vendorguid, uint32 item, uint8 count, uint } size_t vendor_slot = vItems->FindItemSlot(item); - if(vendor_slot >= vItems->GetItemCount()) + if (vendor_slot >= vItems->GetItemCount()) { SendBuyError( BUY_ERR_CANT_FIND_ITEM, pCreature, item, 0); return false; @@ -17893,39 +17915,39 @@ bool Player::BuyItemFromVendor(uint64 vendorguid, uint32 item, uint8 count, uint VendorItem const* crItem = vItems->m_items[vendor_slot]; // check current item amount if it limited - if( crItem->maxcount != 0 ) + if (crItem->maxcount != 0) { - if(pCreature->GetVendorItemCurrentCount(crItem) < pProto->BuyCount * count ) + if (pCreature->GetVendorItemCurrentCount(crItem) < pProto->BuyCount * count ) { SendBuyError( BUY_ERR_ITEM_ALREADY_SOLD, pCreature, item, 0); return false; } } - if( uint32(GetReputationRank(pProto->RequiredReputationFaction)) < pProto->RequiredReputationRank) + if (uint32(GetReputationRank(pProto->RequiredReputationFaction)) < pProto->RequiredReputationRank) { SendBuyError( BUY_ERR_REPUTATION_REQUIRE, pCreature, item, 0); return false; } - if(crItem->ExtendedCost) + if (crItem->ExtendedCost) { ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost); - if(!iece) + if (!iece) { sLog.outError("Item %u have wrong ExtendedCost field value %u", pProto->ItemId, crItem->ExtendedCost); return false; } // honor points price - if(GetHonorPoints() < (iece->reqhonorpoints * count)) + if (GetHonorPoints() < (iece->reqhonorpoints * count)) { SendEquipError(EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS, NULL, NULL); return false; } // arena points price - if(GetArenaPoints() < (iece->reqarenapoints * count)) + if (GetArenaPoints() < (iece->reqarenapoints * count)) { SendEquipError(EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS, NULL, NULL); return false; @@ -17955,69 +17977,38 @@ bool Player::BuyItemFromVendor(uint64 vendorguid, uint32 item, uint8 count, uint // reputation discount price = uint32(floor(price * GetReputationPriceDiscount(pCreature))); - if( GetMoney() < price ) + if (GetMoney() < price) { SendBuyError( BUY_ERR_NOT_ENOUGHT_MONEY, pCreature, item, 0); return false; } - uint8 bag = 0; // init for case invalid bagGUID - - if (bagguid != NULL_BAG && slot != NULL_SLOT) - { - if( bagguid == GetGUID() ) - { - bag = INVENTORY_SLOT_BAG_0; - } - else - { - for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END;i++) - { - if( Bag *pBag = (Bag*)GetItemByPos(INVENTORY_SLOT_BAG_0,i) ) - { - if( bagguid == pBag->GetGUID() ) - { - // slot is counted from 0 but BagSize from 1 - if(slot+1 > pBag->GetBagSize()) - { - sLog.outDebug("CHEATING ATTEMPT slot > bagSize in BuyItemFromVendor playerGUID: "I64FMT" name: %s slot: %u", GetGUID(), GetName(), slot); - return false; - } - if(slot < pBag->GetBagSlot() && !pBag->GetItemByPos(slot)) - bag = i; - break; - } - } - } - } - } - - if( IsInventoryPos( bag, slot ) || (bagguid == NULL_BAG && slot == NULL_SLOT) ) + if ((bag == NULL_BAG && slot == NULL_SLOT) || IsInventoryPos(bag, slot)) { ItemPosCountVec dest; uint8 msg = CanStoreNewItem( bag, slot, dest, item, pProto->BuyCount * count ); - if( msg != EQUIP_ERR_OK ) + if (msg != EQUIP_ERR_OK) { SendEquipError( msg, NULL, NULL ); return false; } ModifyMoney( -(int32)price ); - if(crItem->ExtendedCost) // case for new honor system + if (crItem->ExtendedCost) // case for new honor system { ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost); - if(iece->reqhonorpoints) + if (iece->reqhonorpoints) ModifyHonorPoints( - int32(iece->reqhonorpoints * count)); - if(iece->reqarenapoints) + if (iece->reqarenapoints) ModifyArenaPoints( - int32(iece->reqarenapoints * count)); for (uint8 i = 0; i < 5; ++i) { - if(iece->reqitem[i]) + if (iece->reqitem[i]) DestroyItemCount(iece->reqitem[i], (iece->reqitemcount[i] * count), true); } } - if(Item *it = StoreNewItem( dest, item, true )) + if (Item *it = StoreNewItem( dest, item, true )) { uint32 new_count = pCreature->UpdateVendorItemCurrentCount(crItem,pProto->BuyCount * count); @@ -18031,9 +18022,9 @@ bool Player::BuyItemFromVendor(uint64 vendorguid, uint32 item, uint8 count, uint SendNewItem(it, pProto->BuyCount*count, true, false, false); } } - else if( IsEquipmentPos( bag, slot ) ) + else if (IsEquipmentPos(bag, slot)) { - if(pProto->BuyCount * count != 1) + if (pProto->BuyCount * count != 1) { SendEquipError( EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, NULL, NULL ); return false; @@ -18041,19 +18032,19 @@ bool Player::BuyItemFromVendor(uint64 vendorguid, uint32 item, uint8 count, uint uint16 dest; uint8 msg = CanEquipNewItem( slot, dest, item, false ); - if( msg != EQUIP_ERR_OK ) + if (msg != EQUIP_ERR_OK) { SendEquipError( msg, NULL, NULL ); return false; } ModifyMoney( -(int32)price ); - if(crItem->ExtendedCost) // case for new honor system + if (crItem->ExtendedCost) // case for new honor system { ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost); - if(iece->reqhonorpoints) + if (iece->reqhonorpoints) ModifyHonorPoints( - int32(iece->reqhonorpoints)); - if(iece->reqarenapoints) + if (iece->reqarenapoints) ModifyArenaPoints( - int32(iece->reqarenapoints)); for (uint8 i = 0; i < 5; ++i) { @@ -18062,7 +18053,7 @@ bool Player::BuyItemFromVendor(uint64 vendorguid, uint32 item, uint8 count, uint } } - if(Item *it = EquipNewItem( dest, item, true )) + if (Item *it = EquipNewItem( dest, item, true )) { uint32 new_count = pCreature->UpdateVendorItemCurrentCount(crItem,pProto->BuyCount * count); @@ -18084,7 +18075,7 @@ bool Player::BuyItemFromVendor(uint64 vendorguid, uint32 item, uint8 count, uint return false; } - return crItem->maxcount!=0; + return crItem->maxcount != 0; } uint32 Player::GetMaxPersonalArenaRatingRequirement() @@ -19106,7 +19097,7 @@ void Player::resetSpells() PlayerSpellMap smap = GetSpellMap(); for(PlayerSpellMap::const_iterator iter = smap.begin();iter != smap.end(); ++iter) - removeSpell(iter->first); // only iter->first can be accessed, object by iter->second can be deleted already + removeSpell(iter->first,false,false); // only iter->first can be accessed, object by iter->second can be deleted already learnDefaultSpells(); learnQuestRewardedSpells(); @@ -19167,8 +19158,10 @@ void Player::learnQuestRewardedSpells(Quest const* quest) if(!learnedInfo) return; + uint32 profSpell = spellmgr.GetSpellRequired(learned_0); + // specialization - if(learnedInfo->Effect[0]==SPELL_EFFECT_TRADE_SKILL && learnedInfo->Effect[1]==0) + if(learnedInfo->Effect[0]==SPELL_EFFECT_TRADE_SKILL && learnedInfo->Effect[1]==0 && profSpell) { // search other specialization for same prof for(PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr) @@ -19185,11 +19178,7 @@ void Player::learnQuestRewardedSpells(Quest const* quest) continue; // compare same chain spells - if(spellmgr.GetFirstSpellInChain(itr->first) != first_spell) - continue; - - // now we have 2 specialization, learn possible only if found is lesser specialization rank - if(!spellmgr.IsHighRankOfSpell(learned_0,itr->first)) + if (spellmgr.GetSpellRequired(itr->first) == profSpell) return; } } diff --git a/src/game/Player.h b/src/game/Player.h index 38de51033c3..17563688da6 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1126,7 +1126,7 @@ class TRINITY_DLL_SPEC Player : public Unit return mainItem && mainItem->GetProto()->InventoryType == INVTYPE_2HWEAPON && !CanTitanGrip(); } void SendNewItem( Item *item, uint32 count, bool received, bool created, bool broadcast = false ); - bool BuyItemFromVendor(uint64 vendorguid, uint32 item, uint8 count, uint64 bagguid, uint8 slot); + bool BuyItemFromVendor(uint64 vendorguid, uint32 item, uint8 count, uint8 bag, uint8 slot); float GetReputationPriceDiscount( Creature const* pCreature ) const; Player* GetTrader() const { return pTrader; } @@ -1395,7 +1395,7 @@ class TRINITY_DLL_SPEC Player : public Unit void SendInitialSpells(); bool addSpell(uint32 spell_id, bool active, bool learning, bool dependent, bool disabled); void learnSpell(uint32 spell_id, bool dependent); - void removeSpell(uint32 spell_id, bool disabled = false, bool update_action_bar_for_low_rank = false); + void removeSpell(uint32 spell_id, bool disabled = false, bool learn_low_rank = true); void resetSpells(); void learnDefaultSpells(); void learnQuestRewardedSpells(); @@ -1437,6 +1437,8 @@ class TRINITY_DLL_SPEC Player : public Unit PlayerSpellMap const& GetSpellMap() const { return m_spells; } PlayerSpellMap & GetSpellMap() { return m_spells; } + SpellCooldowns const& GetSpellCooldownMap() const { return m_spellCooldowns; } + void AddSpellMod(SpellModifier* mod, bool apply); bool IsAffectedBySpellmod(SpellEntry const *spellInfo, SpellModifier *mod, Spell * spell = NULL); template <class T> T ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell * spell = NULL); @@ -1463,6 +1465,7 @@ class TRINITY_DLL_SPEC Player : public Unit void SendCooldownEvent(SpellEntry const *spellInfo, uint32 itemId = 0, Spell* spell = NULL); void ProhibitSpellScholl(SpellSchoolMask idSchoolMask, uint32 unTimeMs ); void RemoveSpellCooldown(uint32 spell_id, bool update = false); + void RemoveSpellCategoryCooldown(uint32 cat, bool update = false); void SendClearCooldown( uint32 spell_id, Unit* target ); void RemoveCategoryCooldown(uint32 cat); diff --git a/src/game/PointMovementGenerator.cpp b/src/game/PointMovementGenerator.cpp index ed057854aaa..24baa4939b4 100644 --- a/src/game/PointMovementGenerator.cpp +++ b/src/game/PointMovementGenerator.cpp @@ -32,7 +32,8 @@ void PointMovementGenerator<T>::Initialize(T &unit) unit.StopMoving(); unit.clearUnitState(UNIT_STAT_MOVING); Traveller<T> traveller(unit); - i_destinationHolder.SetDestination(traveller,i_x,i_y,i_z, !unit.hasUnitState(UNIT_STAT_JUMPING)); + // knockback effect has UNIT_STAT_JUMPING set,so if here we disable sentmonstermove there will be creature position sync problem between client and server + i_destinationHolder.SetDestination(traveller,i_x,i_y,i_z, true /* !unit.hasUnitState(UNIT_STAT_JUMPING)*/); if (unit.GetTypeId() == TYPEID_UNIT && ((Creature*)&unit)->canFly()) unit.AddUnitMovementFlag(MOVEMENTFLAG_FLYING); diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index 35e16f9d6bf..13d02702bb8 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -251,6 +251,7 @@ enum SpellCategory #define SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY 0x20000000 // 29 unaffected by invulnerability (hmm possible not...) #define SPELL_ATTR_BREAKABLE_BY_DAMAGE 0x40000000 // 30 breakable by damage? #define SPELL_ATTR_CANT_CANCEL 0x80000000 // 31 positive aura can't be canceled + #define SPELL_ATTR_EX_DISMISS_PET 0x00000001 // 0 dismiss pet and not allow to summon new one? #define SPELL_ATTR_EX_DRAIN_ALL_POWER 0x00000002 // 1 use all power (Only paladin Lay of Hands and Bunyanize) #define SPELL_ATTR_EX_CHANNELED_1 0x00000004 // 2 channeled target @@ -324,7 +325,7 @@ enum SpellCategory #define SPELL_ATTR_EX3_UNK4 0x00000010 // 4 Druid Rebirth only this spell have this flag #define SPELL_ATTR_EX3_UNK5 0x00000020 // 5 #define SPELL_ATTR_EX3_UNK6 0x00000040 // 6 -#define SPELL_ATTR_EX3_UNK7 0x00000080 // 7 separate stack for every caster +#define SPELL_ATTR_EX3_STACKS_FOR_DIFFERENT_CASTERS 0x00000080 // 7 separate stack for every caster #define SPELL_ATTR_EX3_PLAYERS_ONLY 0x00000100 // 8 Player only? #define SPELL_ATTR_EX3_TRIGGERED_CAN_TRIGGER_2 0x00000200 // 9 triggered from effect? #define SPELL_ATTR_EX3_MAIN_HAND 0x00000400 // 10 Main hand weapon required @@ -336,7 +337,7 @@ enum SpellCategory #define SPELL_ATTR_EX3_UNK16 0x00010000 // 16 no triggers effects that trigger on casting a spell?? #define SPELL_ATTR_EX3_NO_INITIAL_AGGRO 0x00020000 // 17 Soothe Animal, 39758, Mind Soothe #define SPELL_ATTR_EX3_UNK18 0x00040000 // 18 -#define SPELL_ATTR_EX3_UNK19 0x00080000 // 19 spells triggered by spell with this flag can't proc caster auras and can proc from triggered (swings too - 20178) +#define SPELL_ATTR_EX3_DISABLE_PROC 0x00080000 // 19 during aura proc no spells can trigger (20178, 20375) #define SPELL_ATTR_EX3_DEATH_PERSISTENT 0x00100000 // 20 Death persistent spells #define SPELL_ATTR_EX3_UNK21 0x00200000 // 21 #define SPELL_ATTR_EX3_REQ_WAND 0x00400000 // 22 Req wand diff --git a/src/game/SkillDiscovery.cpp b/src/game/SkillDiscovery.cpp index 2116e554a9f..837d39d4067 100644 --- a/src/game/SkillDiscovery.cpp +++ b/src/game/SkillDiscovery.cpp @@ -37,7 +37,7 @@ struct SkillDiscoveryEntry SkillDiscoveryEntry() : spellId(0), reqSkillValue(0), chance(0) {} - SkillDiscoveryEntry(uint16 _spellId, uint32 req_skill_val, float _chance) + SkillDiscoveryEntry(uint32 _spellId, uint32 req_skill_val, float _chance) : spellId(_spellId), reqSkillValue(req_skill_val), chance(_chance) {} }; diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index a0cd094a27b..8864c5f683f 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -809,27 +809,21 @@ void Spell::prepareDataForTriggerSystem(AuraEffect * triggeredByAura) m_canTrigger=false; } - if (m_IsTriggeredSpell && - (m_spellInfo->AttributesEx2 & SPELL_ATTR_EX2_TRIGGERED_CAN_TRIGGER || - m_spellInfo->AttributesEx3 & SPELL_ATTR_EX3_TRIGGERED_CAN_TRIGGER_2)) - m_procEx |= PROC_EX_INTERNAL_CANT_PROC; - else if (m_IsTriggeredSpell) - m_procEx |= PROC_EX_INTERNAL_TRIGGERED; - + // Ranged autorepeat attack is set as triggered spell - ignore it + if (!(m_procAttacker & PROC_FLAG_SUCCESSFUL_RANGED_HIT)) + { + if (m_IsTriggeredSpell && + (m_spellInfo->AttributesEx2 & SPELL_ATTR_EX2_TRIGGERED_CAN_TRIGGER || + m_spellInfo->AttributesEx3 & SPELL_ATTR_EX3_TRIGGERED_CAN_TRIGGER_2)) + m_procEx |= PROC_EX_INTERNAL_CANT_PROC; + else if (m_IsTriggeredSpell) + m_procEx |= PROC_EX_INTERNAL_TRIGGERED; + } // Totem casts require spellfamilymask defined in spell_proc_event to proc if (m_originalCaster && m_caster != m_originalCaster && m_caster->GetTypeId()==TYPEID_UNIT && ((Creature*)m_caster)->isTotem() && m_caster->IsControlledByPlayer()) { m_procEx |= PROC_EX_INTERNAL_REQ_FAMILY; } - // Check done for judgements to make them not trigger seal effects - else if (m_spellInfo->AttributesEx2 & SPELL_ATTR_EX2_UNK1) - { - // Rogue poisons - if (m_spellInfo->SpellFamilyName && m_spellInfo->SpellFamilyFlags) - m_procEx |= PROC_EX_INTERNAL_REQ_FAMILY; - else - m_canTrigger=false; - } } } @@ -1359,7 +1353,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask, bool // Now Reduce spell duration using data received at spell hit int32 duration = Aur->GetAuraMaxDuration(); int32 limitduration = GetDiminishingReturnsLimitDuration(m_diminishGroup,aurSpellInfo); - unitTarget->ApplyDiminishingToDuration(m_diminishGroup, duration, m_caster, m_diminishLevel,limitduration); + unitTarget->ApplyDiminishingToDuration(m_diminishGroup, duration, caster, m_diminishLevel,limitduration); Aur->setDiminishGroup(m_diminishGroup); duration = caster->ModSpellDuration(aurSpellInfo, unit, duration, Aur->IsPositive()); @@ -2831,8 +2825,6 @@ void Spell::cast(bool skipCheck) { if (m_spellInfo->Mechanic == MECHANIC_BANDAGE) // Bandages m_preCastSpell = 11196; // Recently Bandaged - else if(m_spellInfo->SpellIconID == 1662 && m_spellInfo->AttributesEx & 0x20) - m_preCastSpell = 23230; // Blood Fury - Healing Reduction break; } case SPELLFAMILY_DRUID: diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index e28e3c1b656..84755b8036e 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -960,7 +960,7 @@ void Aura::SendAuraUpdate() data << uint32(GetId()); data << uint8(m_auraFlags); data << uint8(m_auraLevel); - data << uint8(m_stackAmount > 1 ? m_stackAmount : m_procCharges); + data << uint8(m_stackAmount > 1 ? m_stackAmount : (m_procCharges) ? m_procCharges : 1); if(!(m_auraFlags & AFLAG_CASTER)) { diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 67b87d7c93e..d8828e3f26b 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -1328,21 +1328,19 @@ void Spell::EffectDummy(uint32 i) return; // immediately finishes the cooldown on Frost spells - const PlayerSpellMap& sp_list = ((Player *)m_caster)->GetSpellMap(); - for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr) + const SpellCooldowns& cm = ((Player *)m_caster)->GetSpellCooldownMap(); + for (SpellCooldowns::const_iterator itr = cm.begin(); itr != cm.end();) { - if (itr->second->state == PLAYERSPELL_REMOVED) - continue; - - uint32 classspell = itr->first; - SpellEntry const *spellInfo = sSpellStore.LookupEntry(classspell); + SpellEntry const *spellInfo = sSpellStore.LookupEntry(itr->first); if( spellInfo->SpellFamilyName == SPELLFAMILY_MAGE && (GetSpellSchoolMask(spellInfo) & SPELL_SCHOOL_MASK_FROST) && spellInfo->Id != 11958 && GetSpellRecoveryTime(spellInfo) > 0 ) { - ((Player*)m_caster)->RemoveSpellCooldown(classspell, true); + ((Player*)m_caster)->RemoveSpellCooldown((itr++)->first, true); } + else + ++itr; } return; } @@ -1619,14 +1617,15 @@ void Spell::EffectDummy(uint32 i) return; //immediately finishes the cooldown on certain Rogue abilities - const PlayerSpellMap& sp_list = ((Player *)m_caster)->GetSpellMap(); - for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr) + const SpellCooldowns& cm = ((Player *)m_caster)->GetSpellCooldownMap(); + for (SpellCooldowns::const_iterator itr = cm.begin(); itr != cm.end();) { - uint32 classspell = itr->first; - SpellEntry const *spellInfo = sSpellStore.LookupEntry(classspell); + SpellEntry const *spellInfo = sSpellStore.LookupEntry(itr->first); if (spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE && (spellInfo->SpellFamilyFlags[1] & 0x00000240 || spellInfo->SpellFamilyFlags[0] & 0x00000860)) - ((Player*)m_caster)->RemoveSpellCooldown(classspell,true); + ((Player*)m_caster)->RemoveSpellCooldown((itr++)->first,true); + else + ++itr; } return; } @@ -1646,14 +1645,15 @@ void Spell::EffectDummy(uint32 i) return; //immediately finishes the cooldown for hunter abilities - const PlayerSpellMap& sp_list = ((Player *)m_caster)->GetSpellMap(); - for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr) + const SpellCooldowns& cm = ((Player*)m_caster)->GetSpellCooldownMap(); + for (SpellCooldowns::const_iterator itr = cm.begin(); itr != cm.end();) { - uint32 classspell = itr->first; - SpellEntry const *spellInfo = sSpellStore.LookupEntry(classspell); + SpellEntry const *spellInfo = sSpellStore.LookupEntry(itr->first); if (spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER && spellInfo->Id != 23989 && GetSpellRecoveryTime(spellInfo) > 0 ) - ((Player*)m_caster)->RemoveSpellCooldown(classspell,true); + ((Player*)m_caster)->RemoveSpellCooldown((itr++)->first,true); + else + ++itr; } return; } diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index 32759951f84..4ec9ff516d1 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -2586,6 +2586,16 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto // Explicit Diminishing Groups switch(spellproto->SpellFamilyName) { + case SPELLFAMILY_MAGE: + { + // Frostbite 0x80000000 + if (spellproto->SpellFamilyFlags[1] & 0x80000000) + return DIMINISHING_TRIGGER_ROOT; + // Frost Nova / Freeze (Water Elemental) + else if (spellproto->SpellIconID == 193) + return DIMINISHING_CONTROL_ROOT; + break; + } case SPELLFAMILY_ROGUE: { // Sap 0x80 Gouge 0x8 @@ -2597,6 +2607,9 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto // Cheap Shot else if (spellproto->SpellFamilyFlags[0] & 0x400) return DIMINISHING_CHEAPSHOT_POUNCE; + // Crippling poison - Limit to 10 seconds in PvP (No SpellFamilyFlags) + else if (spellproto->SpellIconID == 163) + return DIMINISHING_LIMITONLY; break; } case SPELLFAMILY_WARLOCK: @@ -2610,9 +2623,6 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto // Howl of Terror else if (spellproto->SpellFamilyFlags[1] & 0x8) return DIMINISHING_FEAR_BLIND; - // Seduction - else if (spellproto->SpellFamilyFlags[1] & 0x40000000) - return DIMINISHING_CHARM; break; } case SPELLFAMILY_DRUID: @@ -2626,13 +2636,9 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto //Entangling Roots: to force natures grasp proc to be control root else if (spellproto->SpellFamilyFlags[0] & 0x00000200) return DIMINISHING_CONTROL_ROOT; - break; - } - case SPELLFAMILY_MAGE: - { - // Frostbite - if (spellproto->SpellFamilyFlags[1] & 0x80000000) - return DIMINISHING_TRIGGER_ROOT; + // Faerie Fire + else if (spellproto->SpellFamilyFlags[0] & 0x400) + return DIMINISHING_LIMITONLY; break; } case SPELLFAMILY_WARRIOR: @@ -2715,6 +2721,13 @@ int32 GetDiminishingReturnsLimitDuration(DiminishingGroup group, SpellEntry cons return 6000; break; } + case SPELLFAMILY_DRUID: + { + // Faerie Fire - limit to 40 seconds in PvP (3.1) + if (spellproto->SpellFamilyFlags[0] & 0x400) + return 40000; + break; + } default: break; } @@ -2754,9 +2767,9 @@ DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group) case DIMINISHING_CONTROL_STUN: case DIMINISHING_TRIGGER_STUN: case DIMINISHING_CHEAPSHOT_POUNCE: - case DIMINISHING_FEAR_BLIND: case DIMINISHING_CYCLONE: return DRTYPE_ALL; + case DIMINISHING_FEAR_BLIND: case DIMINISHING_CONTROL_ROOT: case DIMINISHING_TRIGGER_ROOT: case DIMINISHING_CHARM: @@ -2842,7 +2855,7 @@ bool SpellMgr::IsNoStackSpellDueToSpell(uint32 spellId_1, uint32 spellId_2, bool SpellSpecific spellId_spec_2 = GetSpellSpecific(spellId_2); if (spellId_spec_1 && spellId_spec_2) if (IsSingleFromSpellSpecificPerTarget(spellId_spec_1, spellId_spec_2) - ||(IsSingleFromSpellSpecificPerCaster(spellId_spec_1, spellId_spec_2) && sameCaster)) + ||(sameCaster && IsSingleFromSpellSpecificPerCaster(spellId_spec_1, spellId_spec_2))) return true; if(spellInfo_1->SpellFamilyName != spellInfo_2->SpellFamilyName) @@ -2883,7 +2896,7 @@ bool SpellMgr::IsNoStackSpellDueToSpell(uint32 spellId_1, uint32 spellId_2, bool spellId_1 = GetLastSpellInChain(spellId_1); // Hack for Incanter's Absorption - if (spellId_1 == spellId_2 && spellId_1 == 44413) + if (spellId_1 == spellId_2 && (spellId_1 == 44413 || (!sameCaster && spellInfo_1->AttributesEx3 & SPELL_ATTR_EX3_STACKS_FOR_DIFFERENT_CASTERS))) return false; if (spellId_1 == spellId_2) @@ -2917,7 +2930,7 @@ bool SpellMgr::IsNoStackSpellDueToSpell(uint32 spellId_1, uint32 spellId_2, bool || spellInfo_1->EffectMiscValue[i] != spellInfo_2->EffectMiscValue[i]) // paladin resist aura return false; // need itemtype check? need an example to add that check - return true; + return (!(!sameCaster && spellInfo_1->AttributesEx3 & SPELL_ATTR_EX3_STACKS_FOR_DIFFERENT_CASTERS)); } bool IsDispelableBySpell(SpellEntry const * dispelSpell, uint32 spellId, bool def) diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 33a6c55433f..e2872012842 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -211,6 +211,10 @@ void Unit::Update( uint32 p_time ) m_Events.Update( p_time ); _UpdateSpells( p_time ); + // If this is set during update SetCantProc(false) call is missing somewhere in the code + // Having this would prevent spells from being proced, so let's crash + assert(!m_procDeep) + if (CanHaveThreatList() && getThreatManager().isNeedUpdateToClient(p_time)) SendThreatListUpdate(); @@ -2785,11 +2789,9 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit *pVictim, SpellEntry const *spell) tmp += resist_chance; if (roll < tmp) return SPELL_MISS_RESIST; - - // Ranged attack cannot be parry/dodge only deflect - // Check damage class instead of attack type to correctly handle judgements - // - they are meele, but can't be dodged/parried/deflected because of ranged dmg class - if (spell->DmgClass == SPELL_DAMAGE_CLASS_RANGED) + + // Ranged attacks can only miss, resist and deflect + if (attType == RANGED_ATTACK) { // only if in front if (pVictim->HasInArc(M_PI,this)) @@ -4858,6 +4860,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger uint32 triggered_spell_id = 0; Unit* target = pVictim; int32 basepoints0 = 0; + uint64 originalCaster = 0; // Master of subtlety (checked here because ranks have different spellfamilynames) if (dummySpell->Id == 31223 || dummySpell->Id == 31221 || dummySpell->Id == 31222) @@ -6588,6 +6591,8 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger // Earth Shield if(dummySpell->SpellFamilyFlags[1] & 0x00000400) { + // 3.0.8: Now correctly uses the Shaman's own spell critical strike chance to determine the chance of a critical heal. + originalCaster = triggeredByAura->GetCasterGUID(); basepoints0 = triggerAmount; target = this; triggered_spell_id = 379; @@ -6951,9 +6956,9 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger return false; if(basepoints0) - CastCustomSpell(target,triggered_spell_id,&basepoints0,NULL,NULL,true,castItem,triggeredByAura); + CastCustomSpell(target,triggered_spell_id,&basepoints0,NULL,NULL,true,castItem,triggeredByAura, originalCaster); else - CastSpell(target,triggered_spell_id,true,castItem,triggeredByAura); + CastSpell(target,triggered_spell_id,true,castItem,triggeredByAura, originalCaster); if( cooldown && GetTypeId()==TYPEID_PLAYER ) ((Player*)this)->AddSpellCooldown(triggered_spell_id,0,time(NULL) + cooldown); @@ -7789,9 +7794,9 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, AuraEffect* trig // Sword and Board case 50227: { - // remove cooldown of Shield Slam + // Remove cooldown on Shield Slam if (GetTypeId()==TYPEID_PLAYER) - ((Player*)this)->RemoveCategoryCooldown(1209); + ((Player*)this)->RemoveSpellCategoryCooldown(1209, true); break; } case 63375: // Improved Stormstrike @@ -9496,8 +9501,9 @@ bool Unit::isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolM float crit_chance = 0.0f; switch(spellProto->DmgClass) { - case SPELL_DAMAGE_CLASS_NONE: - return false; + case SPELL_DAMAGE_CLASS_NONE: // Exception for earth shield + if (spellProto->Id != 379) // We need more spells to find a general way (if there is any) + return false; case SPELL_DAMAGE_CLASS_MAGIC: { if (schoolMask & SPELL_SCHOOL_MASK_NORMAL) @@ -10526,6 +10532,7 @@ void Unit::SetInCombatState(bool PvP, Unit* enemy) if(GetTypeId() != TYPEID_PLAYER) { //if(GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_IDLE) != IDLE_MOTION_TYPE) + if (((Creature *)this)->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) ((Creature*)this)->SetHomePosition(GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); if(enemy) { @@ -11291,7 +11298,7 @@ Unit* Creature::SelectVictim() // it in combat but attacker not make any damage and not enter to aggro radius to have record in threat list // for example at owner command to pet attack some far away creature // Note: creature not have targeted movement generator but have attacker in this case - if(m_attackers.size()) + if(m_attackers.size() && m_ThreatManager.isThreatListEmpty()) //there are some cases null target are always returned,so creature evade can not be called at all. such as pull creature at a distance beyond the attackdist to the attacker return NULL; /*if( GetMotionMaster()->GetCurrentMovementGeneratorType() != TARGETED_MOTION_TYPE ) { @@ -11532,7 +11539,7 @@ void Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration,Un if(duration == -1 || group == DIMINISHING_NONE || caster->IsFriendlyTo(this) ) return; - // test pet/charm masters instead pets/charmeds + // test pet/charm masters instead pets/charmeds Unit const* targetOwner = GetCharmerOrOwner(); Unit const* casterOwner = caster->GetCharmerOrOwner(); @@ -11549,7 +11556,7 @@ void Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration,Un float mod = 1.0f; // Some diminishings applies to mobs too (for example, Stun) - if((GetDiminishingReturnsGroupType(group) == DRTYPE_PLAYER && (targetOwner ? targetOwner->GetTypeId():GetTypeId()) == TYPEID_PLAYER) || GetDiminishingReturnsGroupType(group) == DRTYPE_ALL) + if((GetDiminishingReturnsGroupType(group) == DRTYPE_PLAYER && (targetOwner ? (targetOwner->GetTypeId() == TYPEID_PLAYER) : (GetTypeId() == TYPEID_PLAYER))) || GetDiminishingReturnsGroupType(group) == DRTYPE_ALL) { DiminishingLevels diminish = Level; switch(diminish) @@ -12636,6 +12643,9 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag if (GetTypeId() == TYPEID_PLAYER && i->spellProcEvent && i->spellProcEvent->cooldown) cooldown = i->spellProcEvent->cooldown; + if (spellInfo->AttributesEx3 & SPELL_ATTR_EX3_DISABLE_PROC) + SetCantProc(true); + // This bool is needed till separate aura effect procs are still here bool handled = false; if (HandleAuraProc(pTarget, damage, i->aura, procSpell, procFlag, procExtra, cooldown, &handled)) @@ -12660,8 +12670,8 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag { sLog.outDebug("ProcDamageAndSpell: casting spell %u (triggered by %s aura of spell %u)", spellInfo->Id,(isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId()); // Don`t drop charge or add cooldown for not started trigger - if (!HandleProcTriggerSpell(pTarget, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown)) - continue; + if (HandleProcTriggerSpell(pTarget, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown)) + takeCharges=true; break; } case SPELL_AURA_PROC_TRIGGER_DAMAGE: @@ -12679,47 +12689,57 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag case SPELL_AURA_DUMMY: { sLog.outDebug("ProcDamageAndSpell: casting spell id %u (triggered by %s dummy aura of spell %u)", spellInfo->Id,(isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId()); - if (!HandleDummyAuraProc(pTarget, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown)) - continue; - if (procDebug & 1) - sLog.outError("Dummy aura of spell %d procs twice from one effect!",spellInfo->Id); - procDebug |= 1; + if (HandleDummyAuraProc(pTarget, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown)) + { + takeCharges=true; + if (procDebug & 1) + sLog.outError("Dummy aura of spell %d procs twice from one effect!",spellInfo->Id); + procDebug |= 1; + } break; } case SPELL_AURA_OBS_MOD_ENERGY: sLog.outDebug("ProcDamageAndSpell: casting spell id %u (triggered by %s aura of spell %u)", spellInfo->Id,(isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId()); - if (!HandleObsModEnergyAuraProc(pTarget, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown)) - continue; - if (procDebug & 2) - sLog.outError("ObsModEnergy aura of spell %d procs twice from one effect!",spellInfo->Id); - procDebug |= 2; + if (HandleObsModEnergyAuraProc(pTarget, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown)) + { + takeCharges=true; + if (procDebug & 2) + sLog.outError("ObsModEnergy aura of spell %d procs twice from one effect!",spellInfo->Id); + procDebug |= 2; + } break; case SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN: sLog.outDebug("ProcDamageAndSpell: casting spell id %u (triggered by %s aura of spell %u)", spellInfo->Id,(isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId()); - if (!HandleModDamagePctTakenAuraProc(pTarget, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown)) - continue; - if (procDebug & 16) - sLog.outError("ModDamagePctTaken aura of spell %d procs twice from one effect!",spellInfo->Id); - procDebug |= 16; + if (HandleModDamagePctTakenAuraProc(pTarget, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown)) + { + takeCharges=true; + if (procDebug & 16) + sLog.outError("ModDamagePctTaken aura of spell %d procs twice from one effect!",spellInfo->Id); + procDebug |= 16; + } break; case SPELL_AURA_MOD_HASTE: { sLog.outDebug("ProcDamageAndSpell: casting spell id %u (triggered by %s haste aura of spell %u)", spellInfo->Id,(isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId()); - if (!HandleHasteAuraProc(pTarget, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown)) - continue; - if (procDebug & 4) - sLog.outError("Haste aura of spell %d procs twice from one effect!",spellInfo->Id); - procDebug |= 4; + if (HandleHasteAuraProc(pTarget, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown)) + { + takeCharges=true; + if (procDebug & 4) + sLog.outError("Haste aura of spell %d procs twice from one effect!",spellInfo->Id); + procDebug |= 4; + } break; } case SPELL_AURA_OVERRIDE_CLASS_SCRIPTS: { sLog.outDebug("ProcDamageAndSpell: casting spell id %u (triggered by %s aura of spell %u)", spellInfo->Id,(isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId()); - if (!HandleOverrideClassScriptAuraProc(pTarget, damage, triggeredByAura, procSpell, cooldown)) - continue; - if (procDebug & 8) - sLog.outError("OverrideClassScripts aura of spell %d procs twice from one effect!",spellInfo->Id); - procDebug |= 8; + if (HandleOverrideClassScriptAuraProc(pTarget, damage, triggeredByAura, procSpell, cooldown)) + { + takeCharges=true; + if (procDebug & 8) + sLog.outError("OverrideClassScripts aura of spell %d procs twice from one effect!",spellInfo->Id); + procDebug |= 8; + } break; } case SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE: @@ -12742,46 +12762,46 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag { sLog.outDebug("ProcDamageAndSpell: casting spell %u (triggered with value by %s aura of spell %u)", spellInfo->Id,(isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId()); - if (!HandleProcTriggerSpell(pTarget, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown)) - continue; + if (HandleProcTriggerSpell(pTarget, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown)) + takeCharges=true; break; } case SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK: // Skip melee hits or instant cast spells - if (procSpell == NULL || GetSpellCastTime(procSpell) == 0) - continue; + if (procSpell && GetSpellCastTime(procSpell) != 0) + takeCharges=true; break; case SPELL_AURA_REFLECT_SPELLS_SCHOOL: // Skip Melee hits and spells ws wrong school - if (procSpell == NULL || (triggeredByAura->GetMiscValue() & procSpell->SchoolMask) == 0) - continue; + if (procSpell && (triggeredByAura->GetMiscValue() & procSpell->SchoolMask)) // School check + takeCharges=true; break; case SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT: case SPELL_AURA_MOD_POWER_COST_SCHOOL: // Skip melee hits and spells ws wrong school or zero cost - if (procSpell == NULL || - (procSpell->manaCost == 0 && procSpell->ManaCostPercentage == 0) || // Cost check + if (procSpell && + (procSpell->manaCost != 0 || procSpell->ManaCostPercentage != 0) && // Cost check (triggeredByAura->GetMiscValue() & procSpell->SchoolMask) == 0) // School check - continue; + takeCharges=true; break; case SPELL_AURA_MECHANIC_IMMUNITY: // Compare mechanic - if (procSpell==NULL || procSpell->Mechanic != triggeredByAura->GetMiscValue()) - continue; + if (procSpell && procSpell->Mechanic == triggeredByAura->GetMiscValue()) + takeCharges=true; break; case SPELL_AURA_MOD_MECHANIC_RESISTANCE: // Compare mechanic - if (procSpell==NULL || procSpell->Mechanic != triggeredByAura->GetMiscValue()) - continue; + if (procSpell && procSpell->Mechanic == triggeredByAura->GetMiscValue()) + takeCharges=true; break; case SPELL_AURA_MOD_DAMAGE_FROM_CASTER: // Compare casters - if (triggeredByAura->GetCasterGUID() != pTarget->GetGUID()) - continue; + if (triggeredByAura->GetCasterGUID() == pTarget->GetGUID()) + takeCharges=true; break; case SPELL_AURA_MOD_SPELL_CRIT_CHANCE: - if (!procSpell) - continue; + if (procSpell) + takeCharges=true; break; // These auras may not have charges - that means they have chance to remove based on dmg case SPELL_AURA_MOD_FEAR: @@ -12795,6 +12815,8 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag if (roll_chance_f(chance)) RemoveAura(i->aura); } + else + takeCharges=true; break; /*case SPELL_AURA_ADD_FLAT_MODIFIER: case SPELL_AURA_ADD_PCT_MODIFIER: @@ -12802,15 +12824,17 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag break;*/ default: // nothing do, just charges counter + takeCharges=true; break; } - takeCharges=true; } // Remove charge (aura can be removed by triggers) if(useCharges && takeCharges) { i->aura->DropAuraCharge(); } + if (spellInfo->AttributesEx3 & SPELL_ATTR_EX3_DISABLE_PROC) + SetCantProc(false); } // Cleanup proc requirements |