aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am22
-rw-r--r--sql/FULL/world_spell_full.sql27
-rw-r--r--sql/mangos.sql2
-rw-r--r--sql/updates/4377_world_spell_proc_event.sql5
-rw-r--r--sql/updates/4382_8115_world_playercreateinfo_action.sql358
-rw-r--r--sql/updates/4392_world.sql3
-rw-r--r--sql/updates/4393_world_spell_proc_event.sql8
-rw-r--r--sql/updates/4394_world_spell_proc_event.sql12
-rw-r--r--sql/updates/4397_world_playercreateinfo_spell_TDB.sql6
-rw-r--r--sql/world.sql548
-rw-r--r--src/game/CreatureEventAIMgr.cpp3
-rw-r--r--src/game/DestinationHolderImp.h2
-rw-r--r--src/game/Group.cpp2
-rw-r--r--src/game/ItemHandler.cpp26
-rw-r--r--src/game/Level3.cpp7
-rw-r--r--src/game/Player.cpp157
-rw-r--r--src/game/Player.h7
-rw-r--r--src/game/PointMovementGenerator.cpp3
-rw-r--r--src/game/SharedDefines.h5
-rw-r--r--src/game/SkillDiscovery.cpp2
-rw-r--r--src/game/Spell.cpp30
-rw-r--r--src/game/SpellAuras.cpp2
-rw-r--r--src/game/SpellEffects.cpp36
-rw-r--r--src/game/SpellMgr.cpp41
-rw-r--r--src/game/Unit.cpp142
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