aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmake/compiler/gcc/settings.cmake2
-rw-r--r--cmake/macros/FindBoost.cmake1
-rw-r--r--dep/boost/CMakeLists.txt2
-rw-r--r--dep/recastnavigation/CMakeLists.txt2
-rw-r--r--sql/updates/world/3.3.5/2016_05_20_00_world.sql37
-rw-r--r--sql/updates/world/3.3.5/2016_05_23_00_world.sql225
-rw-r--r--sql/updates/world/3.3.5/2016_05_24_00_world.sql14
-rw-r--r--sql/updates/world/3.3.5/2016_05_24_01_world.sql5
-rw-r--r--sql/updates/world/3.3.5/2016_05_25_00_world.sql2
-rw-r--r--sql/updates/world/3.3.5/2016_05_25_01_world_335.sql592
-rw-r--r--sql/updates/world/3.3.5/2016_05_26_00_world.sql19
-rw-r--r--sql/updates/world/3.3.5/2016_05_26_01_world.sql8
-rw-r--r--sql/updates/world/3.3.5/2016_05_26_02_world.sql2
-rw-r--r--sql/updates/world/3.3.5/2016_05_26_03_world.sql21
-rw-r--r--sql/updates/world/3.3.5/2016_05_26_04_world.sql27
-rw-r--r--sql/updates/world/3.3.5/2016_05_26_05_world.sql3
-rw-r--r--sql/updates/world/3.3.5/2016_05_26_06_world_335.sql5
-rw-r--r--sql/updates/world/3.3.5/2016_05_26_07_world.sql5
-rw-r--r--sql/updates/world/3.3.5/2016_05_26_08_world.sql1
-rw-r--r--sql/updates/world/3.3.5/2016_05_26_09_world.sql14
-rw-r--r--src/common/Utilities/Containers.h9
-rw-r--r--src/server/database/Database/Implementation/WorldDatabase.cpp4
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.cpp28
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.h2
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp2
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp2
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp2
-rw-r--r--src/server/game/Accounts/RBAC.h2
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp2
-rw-r--r--src/server/game/DataStores/M2Stores.cpp2
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp2
-rw-r--r--src/server/game/Entities/Creature/Creature.h10
-rw-r--r--src/server/game/Entities/Object/Object.cpp40
-rw-r--r--src/server/game/Entities/Object/Object.h2
-rw-r--r--src/server/game/Entities/Player/CinematicMgr.cpp3
-rw-r--r--src/server/game/Entities/Player/Player.cpp8
-rw-r--r--src/server/game/Entities/Player/Player.h14
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp645
-rw-r--r--src/server/game/Entities/Unit/Unit.h14
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp24
-rw-r--r--src/server/game/Loot/LootMgr.cpp2
-rw-r--r--src/server/game/Maps/MapManager.h8
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h66
-rw-r--r--src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp5
-rw-r--r--src/server/game/Spells/Auras/SpellAuraDefines.h2
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp2
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp24
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.h10
-rw-r--r--src/server/game/Spells/Spell.cpp41
-rw-r--r--src/server/game/Spells/SpellEffects.cpp8
-rw-r--r--src/server/game/Spells/SpellInfo.cpp6
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp28
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp38
-rw-r--r--src/server/scripts/Northrend/zone_grizzly_hills.cpp6
-rw-r--r--src/server/scripts/Spells/spell_dk.cpp192
-rw-r--r--src/server/scripts/Spells/spell_druid.cpp231
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp56
-rw-r--r--src/server/scripts/Spells/spell_hunter.cpp106
-rw-r--r--src/server/scripts/Spells/spell_item.cpp403
-rw-r--r--src/server/scripts/Spells/spell_mage.cpp38
-rw-r--r--src/server/scripts/Spells/spell_paladin.cpp57
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp46
-rw-r--r--src/server/scripts/Spells/spell_rogue.cpp38
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp109
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp96
66 files changed, 2699 insertions, 725 deletions
diff --git a/cmake/compiler/gcc/settings.cmake b/cmake/compiler/gcc/settings.cmake
index c4f97f4ffd4..a0c2b737475 100644
--- a/cmake/compiler/gcc/settings.cmake
+++ b/cmake/compiler/gcc/settings.cmake
@@ -1,7 +1,7 @@
# Set build-directive (used in core to tell which buildtype we used)
add_definitions(-D_BUILD_DIRECTIVE='"${CMAKE_BUILD_TYPE}"')
-set(GCC_EXPECTED_VERSION 4.7.2)
+set(GCC_EXPECTED_VERSION 4.9.0)
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS GCC_EXPECTED_VERSION)
message(FATAL_ERROR "GCC: TrinityCore requires version ${GCC_EXPECTED_VERSION} to build but found ${CMAKE_CXX_COMPILER_VERSION}")
diff --git a/cmake/macros/FindBoost.cmake b/cmake/macros/FindBoost.cmake
index 997336261d3..62da7fc4caf 100644
--- a/cmake/macros/FindBoost.cmake
+++ b/cmake/macros/FindBoost.cmake
@@ -478,6 +478,7 @@ else()
# The user has not requested an exact version. Among known
# versions, find those that are acceptable to the user request.
set(_Boost_KNOWN_VERSIONS ${Boost_ADDITIONAL_VERSIONS}
+ "1.61.0" "1.61"
"1.60.0" "1.60" "1.59.0" "1.59" "1.58.0" "1.58" "1.57.0" "1.57" "1.56.0" "1.56"
"1.55.0" "1.55" "1.54.0" "1.54" "1.53.0" "1.53" "1.52.0" "1.52" "1.51.0" "1.51"
"1.50.0" "1.50" "1.49.0" "1.49" "1.48.0" "1.48" "1.47.0" "1.47" "1.46.1"
diff --git a/dep/boost/CMakeLists.txt b/dep/boost/CMakeLists.txt
index 6cda5fbec4e..764953ab587 100644
--- a/dep/boost/CMakeLists.txt
+++ b/dep/boost/CMakeLists.txt
@@ -26,7 +26,7 @@ if(WIN32)
set(Boost_USE_STATIC_RUNTIME OFF)
endif()
-find_package(Boost 1.51 REQUIRED system filesystem thread program_options iostreams regex)
+find_package(Boost 1.55 REQUIRED system filesystem thread program_options iostreams regex)
# Find if Boost was compiled in C++03 mode because it requires -DBOOST_NO_CXX11_SCOPED_ENUMS
diff --git a/dep/recastnavigation/CMakeLists.txt b/dep/recastnavigation/CMakeLists.txt
index 4a406f7833c..dd28884eb1f 100644
--- a/dep/recastnavigation/CMakeLists.txt
+++ b/dep/recastnavigation/CMakeLists.txt
@@ -1,4 +1,4 @@
-#
+# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
# Copyright (C) 2005-2011 MaNGOS project <http://getmangos.com/>
#
# This program is free software; you can redistribute it and/or modify
diff --git a/sql/updates/world/3.3.5/2016_05_20_00_world.sql b/sql/updates/world/3.3.5/2016_05_20_00_world.sql
new file mode 100644
index 00000000000..67fc3e7a5d7
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_05_20_00_world.sql
@@ -0,0 +1,37 @@
+DELETE FROM `spell_script_names` WHERE `ScriptName` IN
+('spell_mage_blazing_speed','spell_pri_blessed_recovery','spell_dru_forms_trinket','spell_dru_t9_feral_relic',
+'spell_sha_nature_guardian','spell_warl_nether_protection','spell_hun_piercing_shots','spell_hun_t9_4p_bonus',
+'spell_sha_lightning_shield','spell_dk_acclimation','spell_dk_advantage_t10_4p','spell_dk_improved_blood_presence_triggered',
+'spell_rog_t10_2p_bonus','spell_pal_illumination','spell_item_soul_preserver','spell_item_death_choice',
+'spell_item_lightning_capacitor','spell_item_thunder_capacitor','spell_item_toc25_normal_caster_trinket','spell_item_toc25_heroic_caster_trinket',
+'spell_igb_battle_experience_check','spell_gen_blood_reserve','spell_item_darkmoon_card_greatness',
+'spell_item_charm_witch_doctor','spell_item_mana_drain');
+
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(-49200, 'spell_dk_acclimation'), -- DK Acclimation
+(70656, 'spell_dk_advantage_t10_4p'), -- DK Advantage t10 4p melee
+(63611, 'spell_dk_improved_blood_presence_triggered'), -- DK Improved blood Presence Triggered
+(37336, 'spell_dru_forms_trinket'), -- Druid Forms Trinket
+(67353, 'spell_dru_t9_feral_relic'), -- Druid T9 Feral Relic (Idol of Mutilation)
+(64568, 'spell_gen_blood_reserve'), -- Blood Reserve (weapon enchant proc)
+(-53234, 'spell_hun_piercing_shots'), -- Hunter Piercing Shots
+(-67151, 'spell_hun_t9_4p_bonus'), -- Hunter T9 Bonus
+(71201, 'spell_igb_battle_experience_check'), -- Battle Experience (Gunship - ICC)
+(60510, 'spell_item_soul_preserver'), -- Soul Preserver
+(67702, 'spell_item_death_choice'), -- Death Choice Trinket
+(67771, 'spell_item_death_choice'), -- Death Choice Trinket
+(37657, 'spell_item_lightning_capacitor'), -- Lightning Capcitor
+(54841, 'spell_item_thunder_capacitor'), -- Thunder Capacitor
+(67712, 'spell_item_toc25_normal_caster_trinket'), -- Item - Coliseum 25 Normal Caster Trinket
+(67758, 'spell_item_toc25_heroic_caster_trinket'), -- Item - Coliseum 25 Heroic Caster Trinket
+(57345, 'spell_item_darkmoon_card_greatness'), -- Darkmoon Card: Greatness
+(43820, 'spell_item_charm_witch_doctor'), -- Charm of the Witch Doctor
+(27522, 'spell_item_mana_drain'), -- Mana Drain
+(40336, 'spell_item_mana_drain'), -- Mana Drain
+(-31641, 'spell_mage_blazing_speed'), -- Mage Blazing Speed
+(-20210, 'spell_pal_illumination'), -- Paladin Illumination (for Holy Shock)
+(-27811, 'spell_pri_blessed_recovery'), -- Priest Blessed Recovery
+(70805, 'spell_rog_t10_2p_bonus'), -- Rogue T10 2P bonus
+(-30881, 'spell_sha_nature_guardian'), -- Shaman Nature's Guardian
+(-324, 'spell_sha_lightning_shield'), -- Shaman Lightning Shield
+(-30299, 'spell_warl_nether_protection'); -- Warlock Nether protection
diff --git a/sql/updates/world/3.3.5/2016_05_23_00_world.sql b/sql/updates/world/3.3.5/2016_05_23_00_world.sql
new file mode 100644
index 00000000000..b2b9b9b0b34
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_05_23_00_world.sql
@@ -0,0 +1,225 @@
+SET @CGUID:=145211;
+
+-- Add missing creature spawns in Ghostlands & Eversong Woods
+DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+215;
+INSERT INTO `creature` (`guid`, `id`, `map`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `curhealth`) VALUES
+(@CGUID+0 , 1420, 530, 6785.898, -7607.692, 128.1121, 3.815103, 120, 0), -- Toad
+(@CGUID+1 , 1420, 530, 6753.482, -7647.198, 128.3187, 3.793595, 120, 0), -- 1420 (Area: -1)
+(@CGUID+2 , 2914, 530, 6830.517, -7396.761, 46.36444, 2.204267, 120, 0), -- Snake
+(@CGUID+3 , 2914, 530, 6967.708, -7464.932, 47.05861, 1.433785, 120, 0), -- 2914 (Area: 3508)
+(@CGUID+4 , 2914, 530, 6764.093, -7363.276, 50.46708, 2.048597, 120, 0), -- 2914 (Area: 3517)
+(@CGUID+5 , 2914, 530, 6703.647, -7402.308, 51.60884, 5.743487, 120, 0), -- 2914 (Area: 3517)
+(@CGUID+6 , 2914, 530, 9898.549, -6844.095, 21.79119, 5.635744, 120, 0), -- 2914 (Area: 0)
+(@CGUID+7 , 2914, 530, 9200.372, -7787.419, 114.7875, 3.199877, 120, 0), -- 2914 (Area: 3480)
+(@CGUID+8 , 2914, 530, 9155.745, -7848.188, 106.3085, 5.677832, 120, 0), -- 2914 (Area: 3480) (possible waypoints or random movement)
+(@CGUID+9 , 2914, 530, 8850.941, -7711.045, 142.8265, 0.9482585, 120, 0), -- 2914 (Area: 0)
+(@CGUID+10 , 2914, 530, 8728.21, -7871.131, 167.5767, 3.596344, 120, 0), -- 2914 (Area: 3476)
+(@CGUID+11 , 2914, 530, 8637.07, -8030.312, 172.4991, 0.7605414, 120, 0), -- 2914 (Area: 3476) (possible waypoints or random movement)
+(@CGUID+12 , 2914, 530, 8105.803, -7868.944, 182.6229, 3.106677, 120, 0), -- 2914 (Area: 3476)
+(@CGUID+13 , 13321, 530, 6804.864, -7692.796, 123.9494, 1.613627, 120, 0), -- Frog
+(@CGUID+14 , 13321, 530, 7139.874, -6836.952, 42.78193, 3.004393, 120, 0), -- 13321 (Area: 0)
+(@CGUID+15 , 13321, 530, 6874.098, -6292.956, 28.83097, 2.986305, 120, 0), -- 13321 (Area: 0)
+(@CGUID+16 , 13321, 530, 6896.695, -6237.083, 27.97087, 3.193066, 120, 0), -- 13321 (Area: 0)
+(@CGUID+17 , 16355, 530, 6590.018, -6665.895, 47.47748, 3.028023, 120, 0), -- Lesser Scourgebat
+(@CGUID+18 , 16355, 530, 6615.374, -6649.544, 47.67059, 2.618959, 120, 0), -- 16355 (Area: 3861)
+(@CGUID+19 , 16355, 530, 6678.834, -6669.411, 46.41251, 2.527587, 120, 0), -- 16355 (Area: 3861)
+(@CGUID+20 , 16355, 530, 6751.53, -6650.502, 40.92892, 3.361847, 120, 0), -- 16355 (Area: 3861)
+(@CGUID+21 , 16355, 530, 6694.581, -6614.153, 42.82938, 1.788726, 120, 0), -- 16355 (Area: 3861)
+(@CGUID+22 , 16355, 530, 6746.584, -6637.266, 40.26681, 1.167443, 120, 0), -- 16355 (Area: 3861)
+(@CGUID+23 , 16355, 530, 6613.917, -6613.427, 45.56771, 1.741399, 120, 0), -- 16355 (Area: 0)
+(@CGUID+24 , 16355, 530, 6709.029, -6582.425, 38.43601, 3.079052, 120, 0), -- 16355 (Area: 0)
+(@CGUID+25 , 16355, 530, 6655.542, -6584.168, 47.69909, 1.860139, 120, 0), -- 16355 (Area: 0)
+(@CGUID+26 , 16355, 530, 6777.141, -6576.169, 22.53009, 2.004029, 120, 0), -- 16355 (Area: 5779)
+(@CGUID+27 , 16355, 530, 6820.745, -6629.127, 29.34797, 4.576158, 120, 0), -- 16355 (Area: 0)
+(@CGUID+28 , 16355, 530, 6913.5, -6392.067, 32.9911, 1.252754, 120, 0), -- 16355 (Area: 3514)
+(@CGUID+29 , 16355, 530, 6786.887, -6389.533, 33.69895, 1.401155, 120, 0), -- 16355 (Area: 3514)
+(@CGUID+30 , 16355, 530, 6834.158, -6266.923, 28.88157, 0.7696482, 120, 0), -- 16355 (Area: 0)
+(@CGUID+31 , 16355, 530, 6811.086, -6309.688, 32.27558, 6.07257, 120, 0), -- 16355 (Area: 0)
+(@CGUID+32 , 16355, 530, 6746.925, -6374.906, 38.59792, 0.9527051, 120, 0), -- 16355 (Area: 0)
+(@CGUID+33 , 16355, 530, 6743.388, -6254.041, 35.68666, 0.4505479, 120, 0), -- 16355 (Area: 0)
+(@CGUID+34 , 16352, 530, 6607.711, -7228.053, 47.55958, 2.182768, 120, 0), -- Greater Spindleweb
+(@CGUID+35 , 16352, 530, 6840.333, -6911.398, 80.30796, 5.87111, 120, 0), -- 16352 (Area: 0)
+(@CGUID+36 , 16352, 530, 6950.854, -6882.652, 51.16842, 4.52, 120, 0), -- 16352 (Area: 3506)
+(@CGUID+37 , 16352, 530, 6768.055, -6851.429, 87.48727, 5.528165, 120, 0), -- 16352 (Area: 0)
+(@CGUID+38 , 16352, 530, 6770.479, -6850.35, 87.49597, 3.62482, 120, 0), -- 16352 (Area: 0)
+(@CGUID+39 , 16352, 530, 6559.612, -6826.08, 105.455, 4.570914, 120, 0), -- 16352 (Area: 0)
+(@CGUID+40 , 16352, 530, 6601.431, -6767.694, 109.1149, 4.307267, 120, 0), -- 16352 (Area: 0)
+(@CGUID+41 , 16352, 530, 6599.975, -6751.242, 116.5198, 3.551486, 120, 0), -- 16352 (Area: 0)
+(@CGUID+42 , 16352, 530, 7008.281, -6705.673, 28.26144, 4.884287, 120, 0), -- 16352 (Area: 0)
+(@CGUID+43 , 16352, 530, 6871.393, -6317.614, 32.46682, 3.043771, 120, 0), -- 16352 (Area: 3514)
+(@CGUID+44 , 16352, 530, 6878.775, -6305.776, 31.08891, 5.672717, 120, 0), -- 16352 (Area: 3514)
+(@CGUID+45 , 16352, 530, 6843.483, -6281.33, 26.38034, 3.213944, 120, 0), -- 16352 (Area: 0)
+(@CGUID+46 , 16352, 530, 6876.344, -6120.826, 27.65071, 0.7722683, 120, 0), -- 16352 (Area: 0)
+(@CGUID+47 , 16352, 530, 6918.788, -6012.118, 16.0651, 0.2698549, 120, 0), -- 16352 (Area: 0)
+(@CGUID+48 , 16352, 530, 6780.824, -5914.694, 55.04383, 4.475933, 120, 0), -- 16352 (Area: 0)
+(@CGUID+49 , 16352, 530, 6833.493, -5866.168, 14.88271, 0.9358938, 120, 0), -- 16352 (Area: 0)
+(@CGUID+50 , 16352, 530, 6840.229, -5885.817, 18.84746, 0.9175394, 120, 0), -- 16352 (Area: 0)
+(@CGUID+51 , 16352, 530, 6880.296, -5831.833, 12.60031, 4.379216, 120, 0), -- 16352 (Area: 0)
+(@CGUID+52 , 16352, 530, 6921.029, -5888.282, 11.06036, 3.010598, 120, 0), -- 16352 (Area: 0)
+(@CGUID+53 , 16349, 530, 6889.151, -7353.237, 48.22483, 4.51504, 120, 0), -- Ghostclaw Ravager
+(@CGUID+54 , 16349, 530, 6842.837, -7303.427, 54.16766, 1.288876, 120, 0), -- 16349 (Area: 3517)
+(@CGUID+55 , 16349, 530, 6546.021, -7284.988, 56.26369, 1.260878, 120, 0), -- 16349 (Area: 3517)
+(@CGUID+56 , 16349, 530, 6679.54, -7225.896, 45.35223, 4.113977, 120, 0), -- 16349 (Area: 3517)
+(@CGUID+57 , 16349, 530, 6643.776, -7193.75, 54.53874, 0, 120, 0), -- 16349 (Area: 3517)
+(@CGUID+58 , 16349, 530, 6814.677, -6882.684, 88.09016, 2.293302, 120, 0), -- 16349 (Area: 0)
+(@CGUID+59 , 16349, 530, 6721.141, -6838.881, 103.265, 6.057627, 120, 0), -- 16349 (Area: 0)
+(@CGUID+60 , 16349, 530, 6697.734, -6834.776, 102.7457, 6.008372, 120, 0), -- 16349 (Area: 0)
+(@CGUID+61 , 16349, 530, 6650.794, -6857.804, 114.3118, 2.645206, 120, 0), -- 16349 (Area: 0)
+(@CGUID+62 , 16349, 530, 6848.059, -6343.108, 31.09843, 4.492753, 120, 0), -- 16349 (Area: 3514)
+(@CGUID+63 , 16349, 530, 6946.989, -6384.78, 39.4313, 4.954051, 120, 0), -- 16349 (Area: 3514)
+(@CGUID+64 , 16349, 530, 6912.969, -6363.86, 34.72787, 3.331182, 120, 0), -- 16349 (Area: 3514)
+(@CGUID+65 , 16349, 530, 6766.795, -6363.485, 39.13235, 0.5625338, 120, 0), -- 16349 (Area: 0)
+(@CGUID+66 , 16349, 530, 6946.226, -6247.874, 32.41405, 5.925901, 120, 0), -- 16349 (Area: 0)
+(@CGUID+67 , 16349, 530, 6788.563, -6065.623, 76.42849, 3.921466, 120, 0), -- 16349 (Area: 0)
+(@CGUID+68 , 16349, 530, 6792.339, -6061.395, 74.22968, 3.969122, 120, 0), -- 16349 (Area: 0)
+(@CGUID+69 , 16349, 530, 6810.644, -5954.92, 53.78344, 3.796812, 120, 0), -- 16349 (Area: 0)
+(@CGUID+70 , 16348, 530, 7063.472, -7130.528, 46.0153, 6.204991, 120, 0), -- Ghostclaw Lynx
+(@CGUID+71 , 16348, 530, 7284.161, -6991.957, 49.69464, 1.443535, 120, 0), -- 16348 (Area: 0)
+(@CGUID+72 , 16348, 530, 7213.42, -6959.183, 48.15844, 1.778343, 120, 0), -- 16348 (Area: 0)
+(@CGUID+73 , 16348, 530, 7250.096, -6969.17, 47.61874, 1.986341, 120, 0), -- 16348 (Area: 0)
+(@CGUID+74 , 16348, 530, 7050.619, -6915.433, 49.37156, 2.73385, 120, 0), -- 16348 (Area: 0)
+(@CGUID+75 , 16348, 530, 7451.216, -7814.882, 147.9057, 3.899374, 120, 0), -- 16348 (Area: 3516)
+(@CGUID+76 , 16348, 530, 7396.958, -7735.421, 126.7814, 2.59045, 120, 0), -- 16348 (Area: 3516)
+(@CGUID+77 , 16348, 530, 7340.802, -7687.29, 114.7227, 0.2125256, 120, 0), -- 16348 (Area: 3516)
+(@CGUID+78 , 16348, 530, 7183.236, -7268.509, 46.15837, 4.739726, 120, 0), -- 16348 (Area: -1)
+(@CGUID+79 , 16348, 530, 7229.547, -7256.011, 50.49553, 3.413854, 120, 0), -- 16348 (Area: -1)
+(@CGUID+80 , 16348, 530, 7087.505, -7228.648, 47.83735, 2.820592, 120, 0), -- 16348 (Area: -1)
+(@CGUID+81 , 16348, 530, 7216.22, -6980.535, 45.21544, 2.602345, 120, 0), -- 16348 (Area: -1)
+(@CGUID+82 , 16348, 530, 7314.215, -6966.182, 50.0986, 1.607889, 120, 0), -- 16348 (Area: 0)
+(@CGUID+83 , 16348, 530, 7330.698, -6964.013, 48.61691, 2.429726, 120, 0), -- 16348 (Area: 0)
+(@CGUID+84 , 16348, 530, 7381.186, -6840.756, 49.09549, 5.203093, 120, 0), -- 16348 (Area: 0)
+(@CGUID+85 , 16348, 530, 7338.635, -6880.206, 47.74126, 3.243301, 120, 0), -- 16348 (Area: 0)
+(@CGUID+86 , 16348, 530, 7245.959, -6846.432, 44.47991, 3.107588, 120, 0), -- 16348 (Area: 0)
+(@CGUID+87 , 16348, 530, 7271.94, -6770.036, 41.23086, 3.766337, 120, 0), -- 16348 (Area: 0)
+(@CGUID+88 , 16348, 530, 7214.612, -6826.908, 47.06087, 1.656858, 120, 0), -- 16348 (Area: 0)
+(@CGUID+89 , 16354, 530, 7076.276, -6972.893, 46.59879, 5.554435, 120, 0), -- Vampiric Mistbat
+(@CGUID+90 , 16354, 530, 7017.884, -6890.591, 51.47795, 0.1461384, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+91 , 16354, 530, 7113.623, -6924.28, 47.51407, 1.275599, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+92 , 16354, 530, 7120.204, -6986.206, 46.46815, 3.014331, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+93 , 16354, 530, 7042.884, -7063.796, 47.43617, 0.2345574, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+94 , 16354, 530, 7126.826, -6958.08, 46.08292, 1.337121, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+95 , 16354, 530, 7014.953, -7154.451, 44.05517, 4.580289, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+96 , 16354, 530, 7049.035, -7179.571, 44.51942, 2.854439, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+97 , 16354, 530, 7192.258, -6990.721, 45.789, 6.118358, 120, 0), -- 16354 (Area: 3493) (Auras: 29363 - 29363)
+(@CGUID+98 , 16354, 530, 7297.3, -6952.889, 48.22968, 0.04103268, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+99 , 16354, 530, 7256.268, -6915.919, 49.01978, 6.275373, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+100, 16354, 530, 7100.769, -6852.027, 48.50787, 3.594324, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+101, 16354, 530, 7115.031, -6797.596, 43.95771, 4.893901, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+102, 16354, 530, 7046.083, -6001.001, 5.373741, 1.707996, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+103, 16354, 530, 7657.632, -7820.115, 155.0192, 0.007812341, 120, 0), -- 16354 (Area: 5780) (Auras: 29363 - 29363)
+(@CGUID+104, 16354, 530, 7625.615, -7846.144, 163.4028, 4.013608, 120, 0), -- 16354 (Area: 5780) (Auras: 29363 - 29363)
+(@CGUID+105, 16354, 530, 7122.203, -7253.339, 46.5706, 5.714052, 120, 0), -- 16354 (Area: -1) (Auras: 29363 - 29363)
+(@CGUID+106, 16354, 530, 7217.567, -6982.356, 45.42596, 2.619296, 120, 0), -- 16354 (Area: -1) (Auras: 29363 - 29363)
+(@CGUID+107, 16354, 530, 7117.631, -7009.641, 45.96103, 1.385088, 120, 0), -- 16354 (Area: -1) (Auras: 29363 - 29363)
+(@CGUID+108, 16354, 530, 7166.285, -6976.54, 44.8732, 4.951204, 120, 0), -- 16354 (Area: -1) (Auras: 29363 - 29363)
+(@CGUID+109, 16354, 530, 7312.727, -6912.875, 50.63189, 4.525721, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+110, 16354, 530, 7320.769, -6873.548, 46.65247, 4.479732, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+111, 16354, 530, 7280.374, -6883.919, 46.72137, 2.94094, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+112, 16354, 530, 7311.557, -6785.887, 42.1341, 3.170881, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+113, 16354, 530, 7346.644, -6818.584, 45.92062, 3.949025, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+114, 16354, 530, 7288.737, -6849.499, 44.25882, 4.882647, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+115, 16354, 530, 7377.227, -6753.976, 31.68961, 0.03127035, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+116, 16354, 530, 7416.598, -6716.583, 28.30837, 0.7370265, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+117, 16354, 530, 7353.333, -6720.048, 30.60197, 2.399705, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+118, 16354, 530, 7259.75, -6787.555, 40.84682, 6.201098, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+119, 16354, 530, 7108.942, -6779.335, 39.96529, 5.709267, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+120, 16354, 530, 7133.71, -6917.99, 50.83417, 2.893063, 120, 0), -- 16354 (Area: 0) (Auras: 29363 - 29363)
+(@CGUID+121, 16405, 530, 6988.21, -5644.906, -3.24633, 3.193715, 120, 0), -- Whitetail Frenzy (fishy!)
+(@CGUID+122, 16405, 530, 7185.634, -5581.585, -7.89854, 1.237991, 120, 0), -- 16405 (Area: 3455) (possible waypoints or random movement)
+(@CGUID+123, 16405, 530, 7125.062, -5516.672, -5.845787, 0.05448707, 120, 0), -- 16405 (Area: 3455)
+(@CGUID+124, 16405, 530, 7250.163, -5645.383, -4.686822, 1.609466, 120, 0), -- 16405 (Area: 3455) (possible waypoints or random movement)
+(@CGUID+125, 16405, 530, 7251.583, -5518.657, -14.82046, 5.090523, 120, 0), -- 16405 (Area: 3455)
+(@CGUID+126, 16405, 530, 7319, -5583.684, -5.345567, 4.631339, 120, 0), -- 16405 (Area: 3455)
+(@CGUID+127, 16405, 530, 7385.255, -5514.504, -23.83957, 4.482534, 120, 0), -- 16405 (Area: 3455)
+(@CGUID+128, 16404, 530, 7453.585, -5582.35, -4.679311, 1.291544, 120, 0), -- Yellowgill Frenzy (fishy!)
+(@CGUID+129, 16404, 530, 7650.671, -5514.592, -49.15406, 0.4712389, 120, 0), -- 16404 (Area: 3455)
+(@CGUID+130, 16404, 530, 7584.502, -5583.413, -24.85344, 3.455752, 120, 0), -- 16404 (Area: 3455)
+(@CGUID+131, 16404, 530, 7583.759, -5452.181, -46.03991, 2.70526, 120, 0), -- 16404 (Area: 3455)
+(@CGUID+132, 16404, 530, 7714.01, -5449.991, -64.69885, 5.61996, 120, 0), -- 16404 (Area: 3455)
+(@CGUID+133, 16404, 530, 7646.778, -5386.804, -65.33501, 3.752458, 120, 0), -- 16404 (Area: 3455)
+(@CGUID+134, 16404, 530, 7782.522, -5520.318, -25.0596, 2.251475, 120, 0), -- 16404 (Area: 3455)
+(@CGUID+135, 16404, 530, 7851.458, -5451.522, -47.55369, 0.6981317, 120, 0), -- 16404 (Area: 3455)
+(@CGUID+136, 16404, 530, 7916.752, -5518.634, -40.62648, 0.08726646, 120, 0), -- 16404 (Area: 3455)
+(@CGUID+137, 16404, 530, 7981.461, -5584.885, -4.679321, 2.984513, 120, 0), -- 16404 (Area: 3455)
+(@CGUID+138, 16404, 530, 7981.47, -5453.279, -45.36422, 2.443461, 120, 0), -- 16404 (Area: 3455)
+(@CGUID+139, 16404, 530, 8049.632, -5517.96, -25.7112, 5.201081, 120, 0), -- 16404 (Area: 3455)
+(@CGUID+140, 16404, 530, 8116.961, -5448.617, -46.06174, 0.6981317, 120, 0), -- 16404 (Area: 3455)
+(@CGUID+141, 16404, 530, 8115.655, -5582.934, -4.67935, 3.071779, 120, 0), -- 16404 (Area: 3455)
+(@CGUID+142, 16404, 530, 8181.515, -5517.779, -21.47383, 3.996804, 120, 0), -- 16404 (Area: 3455)
+(@CGUID+143, 33712, 530, 8581.657, -5615.35, -1.142317, 1.903857, 120, 0), -- Golden Crawler
+(@CGUID+144, 33712, 530, 8504.382, -5543.861, -1.478864, 3.13378, 120, 0), -- 33712 (Area: 3460)
+(@CGUID+145, 33712, 530, 8514.937, -5619.518, -0.04902005, 2.168977, 120, 0), -- 33712 (Area: 3460)
+(@CGUID+146, 33712, 530, 8415.799, -5584.587, -1.309665, 0, 120, 0), -- 33712 (Area: 3460)
+(@CGUID+147, 33712, 530, 8332.279, -5641.95, -1.466211, 2.25529, 120, 0), -- 33712 (Area: 3460)
+(@CGUID+148, 33712, 530, 8283.341, -5648.665, -1.085784, 0, 120, 0), -- 33712 (Area: 3460)
+(@CGUID+149, 33712, 530, 8282.833, -5682.408, 1.912665, 1.05757, 120, 0), -- 33712 (Area: 3460)
+(@CGUID+150, 33712, 530, 8293.516, -5772.522, 0.8719814, 5.366834, 120, 0), -- 33712 (Area: 3460)
+(@CGUID+151, 33712, 530, 8308.861, -5862.752, 0.241255, 6.083331, 120, 0), -- 33712 (Area: 3460)
+(@CGUID+152, 33712, 530, 9197.843, -5831.596, -1.436119, 3.801267, 120, 0), -- 33712 (Area: 3911)
+(@CGUID+153, 33712, 530, 9354.067, -5992.446, 0.5006291, 4.806949, 120, 0), -- 33712 (Area: 3911)
+(@CGUID+154, 33712, 530, 9355.795, -6054.746, -10.57742, 5.58345, 120, 0), -- 33712 (Area: 3911)
+(@CGUID+155, 15372, 530, 10655.46, -6208.573, 44.35903, 3.352107, 120, 0), -- 15372 (Area: 3431)
+(@CGUID+156, 15372, 530, 10664.23, -6132.04, 28.6685, 2.430012, 120, 0), -- 15372 (Area: 3431)
+(@CGUID+157, 15372, 530, 10680.05, -6169.8, 39.0421, 1.041597, 120, 0), -- 15372 (Area: 3431)
+(@CGUID+158, 721, 530, 8518.23, -5731.495, 13.00602, 3.633779, 120, 0), -- Rabbit
+(@CGUID+159, 721, 530, 8639.186, -5761.18, 11.46758, 3.938846, 120, 0), -- 721 (Area: 3460)
+(@CGUID+160, 721, 530, 8778.733, -5847.375, 7.75886, 4.726789, 120, 0), -- 721 (Area: 3460)
+(@CGUID+161, 721, 530, 8984.896, -5983.854, 19.71628, 4.000124, 120, 0), -- 721 (Area: 3911)
+(@CGUID+162, 721, 530, 9145.909, -5946.4, 28.77039, 2.019282, 120, 0), -- 721 (Area: 3911)
+(@CGUID+163, 721, 530, 9231.008, -6160.386, 25.5099, 0.5819958, 120, 0), -- 721 (Area: 3911)
+(@CGUID+164, 721, 530, 9452.181, -7939.893, 11.60837, 3.357151, 120, 0), -- 721 (Area: 3472)
+(@CGUID+165, 721, 530, 9438.168, -7889.708, 21.39819, 2.464021, 120, 0), -- 721 (Area: 3472)
+(@CGUID+166, 721, 530, 9396.646, -7802.477, 55.43135, 0.6543702, 120, 0), -- 721 (Area: 3480)
+(@CGUID+167, 4075, 530, 6658.765, -6295.493, 29.20658, 2.160989, 120, 0), -- Rat
+(@CGUID+168, 4075, 530, 7113.27, -5958.493, 12.98514, 1.957865, 120, 0), -- 4075 (Area: 0)
+(@CGUID+169, 4075, 530, 7308.667, -5989.029, 16.2368, 2.572109, 120, 0), -- 4075 (Area: 3491)
+(@CGUID+170, 15649, 530, 10060.82, -6872.714, 24.29431, 4.285359, 120, 0), -- Feral Dragonhawk Hatchling
+(@CGUID+171, 15651, 530, 8653.924, -5784.069, 18.15051, 3.120111, 120, 0), -- Springpaw Stalker
+(@CGUID+172, 15651, 530, 10048.03, -6717.27, 31.03372, 4.651473, 120, 0), -- 15651 (Area: 3533)
+(@CGUID+173, 15651, 530, 10116.2, -7079.959, 11.65078, 5.202464, 120, 0), -- 15651 (Area: 0)
+(@CGUID+174, 15651, 530, 10119.57, -7117.229, 11.13619, 5.610377, 120, 0), -- 15651 (Area: 0)
+(@CGUID+175, 15651, 530, 10245.07, -7154.263, 5.379348, 3.824573, 120, 0), -- 15651 (Area: 0)
+(@CGUID+176, 15651, 530, 10312.5, -7285.686, 10.4436, 3.958998, 120, 0), -- 15651 (Area: 0)
+(@CGUID+177, 15651, 530, 0155.74, -7315.172, 46.89272, 1.747505, 120, 0), -- 15651 (Area: 0)
+(@CGUID+178, 15651, 530, 10212.78, -7312.304, 43.83004, 2.297004, 120, 0), -- 15651 (Area: 0)
+(@CGUID+179, 15651, 530, 10120.49, -7380.654, 41.25549, 3.739351, 120, 0), -- 15651 (Area: 0)
+(@CGUID+180, 15651, 530, 10222.12, -7377.514, 42.6799, 6.21672, 120, 0), -- 15651 (Area: 0)
+(@CGUID+181, 15651, 530, 10287.61, -7510.908, 45.47846, 4.328416, 120, 0), -- 15651 (Area: 0)
+(@CGUID+182, 15651, 530, 10307.25, -7600.326, 27.67019, 1.3225, 120, 0), -- 15651 (Area: 0)
+(@CGUID+183, 15651, 530, 10261.34, -7483.148, 64.01847, 4.310963, 120, 0), -- 15651 (Area: 0)
+(@CGUID+184, 15651, 530, 10222.87, -7613.924, 61.70162, 2.482553, 120, 0), -- 15651 (Area: 0)
+(@CGUID+185, 15650, 530, 10279.31, -7324.253, 33.49329, 4.19599, 120, 0), -- Crazed Dragonhawk
+(@CGUID+186, 15650, 530, 10192.26, -7320.828, 45.92649, 5.882011, 120, 0), -- 15650 (Area: 0) (Auras: 29119 - 29119)
+(@CGUID+187, 15650, 530, 10171.51, -7404.468, 48.17466, 5.125631, 120, 0), -- 15650 (Area: 0) (Auras: 29119 - 29119)
+(@CGUID+188, 15650, 530, 10225.49, -7453.733, 75.07253, 4.820997, 120, 0), -- 15650 (Area: 0) (Auras: 29119 - 29119)
+(@CGUID+189, 15650, 530, 10095.22, -7399.66, 33.8582, 1.982334, 120, 0), -- 15650 (Area: 0) (Auras: 29119 - 29119)
+(@CGUID+190, 15650, 530, 10089.92, -7352.991, 24.48084, 3.473843, 120, 0), -- 15650 (Area: 0) (Auras: 29119 - 29119)
+(@CGUID+191, 15650, 530, 10304.47, -7592.876, 23.93329, 4.038411, 120, 0), -- 15650 (Area: 0) (Auras: 29119 - 29119)
+(@CGUID+192, 15650, 530, 9840.896, -7878.327, 39.42878, 0.1114382, 120, 0), -- 15650 (Area: 3472) (Auras: 29119 - 29119)
+(@CGUID+193, 15650, 530, 9008.495, -8056.905, 185.9688, 1.125495, 120, 0), -- 15650 (Area: 0) (Auras: 29119 - 29119)
+(@CGUID+194, 15650, 530, 9009.816, -7833.289, 159.5567, 4.887175, 120, 0), -- 15650 (Area: 0) (Auras: 29119 - 29119)
+(@CGUID+195, 15650, 530, 9015.15, -7667.337, 140.8466, 4.705554, 120, 0), -- 15650 (Area: 0) (Auras: 29119 - 29119)
+(@CGUID+196, 15650, 530, 8824.381, -7819.187, 175.3332, 3.444827, 120, 0), -- 15650 (Area: 0) (Auras: 29119 - 29119)
+(@CGUID+197, 15650, 530, 8785.419, -7913.549, 175.9667, 0.7577809, 120, 0), -- 15650 (Area: 3476) (Auras: 29119 - 29119)
+(@CGUID+198, 15650, 530, 8848.306, -7942.777, 220.488, 5.064994, 120, 0), -- 15650 (Area: 3476) (Auras: 29119 - 29119)
+(@CGUID+199, 15650, 530, 8333.768, -8008.462, 206.4037, 2.313344, 120, 0), -- 15650 (Area: 3476) (Auras: 29119 - 29119)
+(@CGUID+200, 15650, 530, 8269.027, -8019.356, 224.7379, 5.511599, 120, 0), -- 15650 (Area: 3476) (Auras: 29119 - 29119)
+(@CGUID+201, 15650, 530, 8213.844, -7896.639, 190.6529, 2.801, 120, 0), -- 15650 (Area: 3476) (Auras: 29119 - 29119)
+(@CGUID+202, 15650, 530, 8216.283, -7952.173, 209.498, 1.65485, 120, 0), -- 15650 (Area: 3476) (Auras: 29119 - 29119)
+(@CGUID+203, 16541, 530, 7244.089, -7125.762, 61.12453, 0.4067548, 120, 0), -- Ghostlands Guardian
+(@CGUID+204, 16541, 530, 7182.639, -7079.073, 56.25724, 2.565634, 120, 0), -- 16541 (Area: 0)
+(@CGUID+205, 16541, 530, 7168.553, -7095.772, 56.25724, 2.426008, 120, 0), -- 16541 (Area: 0)
+(@CGUID+206, 14881, 530, 6908.589, -7112.601, 45.76462, 0.250855, 120, 0), -- Spider
+(@CGUID+207, 14881, 530, 7087.832, -7109.549, 46.94461, 3.255385, 120, 0), -- 14881 (Area: 0)
+(@CGUID+208, 14881, 530, 6913.161, -6316.999, 33.59887, 5.188184, 120, 0), -- 14881 (Area: 3514)
+(@CGUID+209, 14881, 530, 7177.549, -7263.504, 45.25873, 4.996254, 120, 0), -- 14881 (Area: -1) (possible waypoints or random movement)
+(@CGUID+210, 14881, 530, 7295.609, -7026.236, 48.24609, 0.2017749, 120, 0), -- 14881 (Area: -1) (possible waypoints or random movement)
+(@CGUID+211, 14881, 530, 7120.973, -6668.307, 45.87799, 1.187052, 120, 0), -- 14881 (Area: 0)
+(@CGUID+212, 33713, 530, 6896.669, -5765.082, -2.75388, 1.12993, 120, 0), -- 33713 (Area: 0)
+(@CGUID+213, 33713, 530, 6853.869, -5738.312, -9.519895, 1.390244, 120, 0), -- 33713 (Area: 0)
+(@CGUID+214, 33713, 530, 7173.716, -5696.389, -4.92298, 4.901935, 120, 0), -- 33713 (Area: 3491)
+(@CGUID+215, 33713, 530, 7336.688, -5723.884, 0.3463151, 6.180531, 120, 0); -- 33713 (Area: 3491)
+
+-- Update movement
+UPDATE `creature` SET `spawndist`=15, `MovementType`=1 WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+215;
+UPDATE `creature` SET `spawndist`=0, `MovementType`=0 WHERE `guid` IN (@CGUID+203, @CGUID+204, @CGUID+205, @CGUID+206);
diff --git a/sql/updates/world/3.3.5/2016_05_24_00_world.sql b/sql/updates/world/3.3.5/2016_05_24_00_world.sql
new file mode 100644
index 00000000000..b07a3288642
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_05_24_00_world.sql
@@ -0,0 +1,14 @@
+SET @OGUID:=85056;
+
+-- Add missing objects spawns in Ghostlands & Eversong Woods
+DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+8;
+INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES
+(@OGUID+0, 191460, 530, 1, 1, 6947.801, -7648.626, 131.9498, 0.2191041, 0, 0, 0.1093339, 0.9940051, 120, 255, 1), -- 191460 (Area: -1) -- Bonfire
+(@OGUID+1, 181326, 530, 1, 1, 6772.437, -7350.587, 48.96166, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181326 (Area: 3517) -- Bonfire
+(@OGUID+2, 191460, 530, 1, 1, 6663.345, -7398.321, 57.63737, 2.111147, 0, 0, 0.8701838, 0.4927272, 120, 255, 1), -- 191460 (Area: 3517) -- Bonfire
+(@OGUID+3, 181327, 530, 1, 1, 6610.271, -7352.757, 54.1082, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181327 (Area: 3517) -- Cauldron
+(@OGUID+4, 181362, 530, 1, 1, 6773.446, -7150.986, 48.90046, 3.141534, 0, 0, 0, 1, 120, 255, 1), -- 181362 (Area: 0) -- Campfire
+(@OGUID+5, 181352, 530, 1, 1, 6785.604, -7192.486, 25.77958, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181352 (Area: 0) -- Campfire
+(@OGUID+6, 181319, 530, 1, 1, 7150.752, -6823.163, 43.91896, 3.141326, 0, 0, 0, 1, 120, 255, 1), -- 181319 (Area: 0) -- Campfire
+(@OGUID+7, 191460, 530, 1, 1, 7410.167, -7966.508, 161.3317, 2.984498, 0, 0, 0.9969173, 0.07845911, 120, 255, 1), -- 191460 (Area: 3516) -- Bonfire
+(@OGUID+8, 191460, 530, 1, 1, 7274.042, -7768.146, 150.1007, 0.7679439, 0, 0, 0.3746067, 0.9271838, 120, 255, 1); -- 191460 (Area: 3516) -- Bonfire
diff --git a/sql/updates/world/3.3.5/2016_05_24_01_world.sql b/sql/updates/world/3.3.5/2016_05_24_01_world.sql
new file mode 100644
index 00000000000..58ac4b0a40e
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_05_24_01_world.sql
@@ -0,0 +1,5 @@
+DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_dru_eclipse';
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(-48516, 'spell_dru_eclipse');
+
+UPDATE `spell_proc_event` SET `Cooldown`=0 WHERE `entry`=-48516; -- set cooldown to 0, handled by a script
diff --git a/sql/updates/world/3.3.5/2016_05_25_00_world.sql b/sql/updates/world/3.3.5/2016_05_25_00_world.sql
new file mode 100644
index 00000000000..401f374d81a
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_05_25_00_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `spell_script_names` SET `spell_id`=67151 WHERE (`ScriptName`='spell_hun_t9_4p_bonus');
diff --git a/sql/updates/world/3.3.5/2016_05_25_01_world_335.sql b/sql/updates/world/3.3.5/2016_05_25_01_world_335.sql
new file mode 100644
index 00000000000..603e8921a69
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_05_25_01_world_335.sql
@@ -0,0 +1,592 @@
+RENAME TABLE `game_graveyard_zone` TO `graveyard_zone`;
+ALTER TABLE `graveyard_zone` CHANGE `id` `ID` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0';
+ALTER TABLE `graveyard_zone` CHANGE `ghost_zone` `GhostZone` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0';
+ALTER TABLE `graveyard_zone` CHANGE `faction` `Faction` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0';
+ALTER TABLE `graveyard_zone` ADD COLUMN `Comment` TEXT AFTER `Faction`;
+
+UPDATE `command` SET `help`='Syntax: .reload all area\n\nReload areatrigger_teleport, areatrigger_tavern, graveyard_zone tables.' WHERE `permission`=613;
+UPDATE `command` SET `name`='reload graveyard_zone', `help`='Syntax: .reload graveyard_zone\nReload graveyard_zone table.' WHERE `permission`=645;
+
+UPDATE `graveyard_zone` SET `Comment`='Redridge Mountains - Redridge Mountains' WHERE `ID`=2;
+UPDATE `graveyard_zone` SET `Comment`='Duskwood, Darkshire - Duskwood' WHERE `ID`=3;
+UPDATE `graveyard_zone` SET `Comment`='Westfall, Sentinel Hill GY - Westfall' WHERE `ID`=4;
+UPDATE `graveyard_zone` SET `Comment`='Loch Modan, Thelsamar - Loch Modan' WHERE `ID`=6;
+UPDATE `graveyard_zone` SET `Comment`='Wetlands, Crossroads GY' WHERE `ID`=7;
+UPDATE `graveyard_zone` SET `Comment`='Badlands, Graveyard NE' WHERE `ID`=8;
+UPDATE `graveyard_zone` SET `Comment`='The Barrens, The Crossroads - Northern Barrens' WHERE `ID`=10;
+UPDATE `graveyard_zone` SET `Comment`='Desolace, Ethel Rethor GY' WHERE `ID`=31;
+UPDATE `graveyard_zone` SET `Comment`='Durotar, Razor Hill GY' WHERE `ID`=32;
+UPDATE `graveyard_zone` SET `Comment`='Mulgore, Red Cloud Mesa GY - Mulgore' WHERE `ID`=34;
+UPDATE `graveyard_zone` SET `Comment`='Darkshore, New Auberdine GY - Darkshore' WHERE `ID`=35;
+UPDATE `graveyard_zone` SET `Comment`='Deadwind Pass, Morgan''s Plot' WHERE `ID`=36;
+UPDATE `graveyard_zone` SET `Comment`='Silithus, Valor''s Rest - Silithus' WHERE `ID`=70;
+UPDATE `graveyard_zone` SET `Comment`='Mulgore, Bloodhoof Village GY - Mulgore' WHERE `ID`=89;
+UPDATE `graveyard_zone` SET `Comment`='Teldrassil, Darnassus GY' WHERE `ID`=90;
+UPDATE `graveyard_zone` SET `Comment`='Teldrassil, Dolanaar GY - Teldrassil' WHERE `ID`=91;
+UPDATE `graveyard_zone` SET `Comment`='Ashenvale, Astranaar GY - Ashenvale' WHERE `ID`=92;
+UPDATE `graveyard_zone` SET `Comment`='Teldrassil, Aldrassil GY - Teldrassil' WHERE `ID`=93;
+UPDATE `graveyard_zone` SET `Comment`='Tirisfal Glades, Deathknell - Tirisfal Glades' WHERE `ID`=94;
+UPDATE `graveyard_zone` SET `Comment`='Tirisfal Glades, Undercity' WHERE `ID`=96;
+UPDATE `graveyard_zone` SET `Comment`='Silverpine Forest, The Sepulcher - Silverpine Forest' WHERE `ID`=97;
+UPDATE `graveyard_zone` SET `Comment`='Hillsbrad Foothills, Tarren Mill - Hillsbrad Foothills' WHERE `ID`=98;
+UPDATE `graveyard_zone` SET `Comment`='Arathi Highlands, Eastern Road - Arathi Highlands' WHERE `ID`=99;
+UPDATE `graveyard_zone` SET `Comment`='Dun Morogh, Anvilmar - Dun Morogh' WHERE `ID`=100;
+UPDATE `graveyard_zone` SET `Comment`='Dun Morogh, Kharanos' WHERE `ID`=101;
+UPDATE `graveyard_zone` SET `Comment`='Badlands, Kargath - Badlands' WHERE `ID`=103;
+UPDATE `graveyard_zone` SET `Comment`='Redridge Mountains, Lakeshire' WHERE `ID`=104;
+UPDATE `graveyard_zone` SET `Comment`='Elwynn Forest, Northshire - Elwynn Forest' WHERE `ID`=105;
+UPDATE `graveyard_zone` SET `Comment`='Elwynn Forest, Goldshire - Elwynn Forest' WHERE `ID`=106;
+UPDATE `graveyard_zone` SET `Comment`='Elwynn Forest, Stormwind' WHERE `ID`=107;
+UPDATE `graveyard_zone` SET `Comment`='Swamp of Sorrows, Stonard GY' WHERE `ID`=108;
+UPDATE `graveyard_zone` SET `Comment`='Stranglethorn Vale, Booty Bay GY - Stranglethorn Vale' WHERE `ID`=109;
+UPDATE `graveyard_zone` SET `Comment`='Teldrassil, Rut''theran Village GY - Teldrassil' WHERE `ID`=129;
+UPDATE `graveyard_zone` SET `Comment`='Hillsbrad Foothills, Southshore' WHERE `ID`=149;
+UPDATE `graveyard_zone` SET `Comment`='Alterac Valley, Snowfall Graveyard (Mid) - Alterac Valley' WHERE `ID`=169;
+UPDATE `graveyard_zone` SET `Comment`='Dustwallow Marsh, Theramore Isle GY - Dustwallow Marsh' WHERE `ID`=189;
+UPDATE `graveyard_zone` SET `Comment`='Tanaris, Gadgetzan GY' WHERE `ID`=209;
+UPDATE `graveyard_zone` SET `Comment`='The Barrens, Camp Taurajo GY - Southern Barrens' WHERE `ID`=229;
+UPDATE `graveyard_zone` SET `Comment`='The Barrens, Ratchet' WHERE `ID`=249;
+UPDATE `graveyard_zone` SET `Comment`='Tirisfal Glades, Brill - Tirisfal Glades' WHERE `ID`=289;
+UPDATE `graveyard_zone` SET `Comment`='Feralas, New Feathermoon Stronghold GY (A) - Feralas' WHERE `ID`=309;
+UPDATE `graveyard_zone` SET `Comment`='Feralas, Camp Mojache GY (H) - Feralas' WHERE `ID`=310;
+UPDATE `graveyard_zone` SET `Comment`='Thousand Needles, Splithoof Heights GY (MOVED) - Thousand Needles' WHERE `ID`=329;
+UPDATE `graveyard_zone` SET `Comment`='The Hinterlands, Aerie Peak - The Hinterlands' WHERE `ID`=349;
+UPDATE `graveyard_zone` SET `Comment`='Azshara, Northern Azshara GY - Azshara' WHERE `ID`=369;
+UPDATE `graveyard_zone` SET `Comment`='Blasted Lands, Dreadmaul Hold GY - Blasted Lands' WHERE `ID`=370;
+UPDATE `graveyard_zone` SET `Comment`='Blasted Lands, Dreadmaul Hold GY - Swamp of Sorrows' WHERE `ID`=370;
+UPDATE `graveyard_zone` SET `Comment`='Stranglethorn Vale, Northern Stranglethorn GY - Stranglethorn Vale' WHERE `ID`=389;
+UPDATE `graveyard_zone` SET `Comment`='Stonetalon Mountains, Webwinder Path GY - Stonetalon Mountains' WHERE `ID`=409;
+UPDATE `graveyard_zone` SET `Comment`='Felwood, Morlos''Aran - Felwood' WHERE `ID`=449;
+UPDATE `graveyard_zone` SET `Comment`='Un''Goro Crater, The Marshlands - Un''Goro Crater' WHERE `ID`=450;
+UPDATE `graveyard_zone` SET `Comment`='Darkshore, Twilight Vale GY' WHERE `ID`=469;
+UPDATE `graveyard_zone` SET `Comment`='Wetlands, Baradin Bay GY - Wetlands' WHERE `ID`=489;
+UPDATE `graveyard_zone` SET `Comment`='Western Plaguelands, Chillwind Camp - Western Plaguelands' WHERE `ID`=509;
+UPDATE `graveyard_zone` SET `Comment`='Eastern Plaguelands, Pestilent Scar - Eastern Plaguelands' WHERE `ID`=510;
+UPDATE `graveyard_zone` SET `Comment`='Winterspring, Everlook GY - Winterspring' WHERE `ID`=511;
+UPDATE `graveyard_zone` SET `Comment`='Ashenvale, Kargathia GY' WHERE `ID`=512;
+UPDATE `graveyard_zone` SET `Comment`='Programmer Isle - Programmer Isle' WHERE `ID`=529;
+UPDATE `graveyard_zone` SET `Comment`='Western Plaguelands, Bulwark' WHERE `ID`=569;
+UPDATE `graveyard_zone` SET `Comment`='Azshara, (Overlooks) The Shattered Strand GY - Azshara' WHERE `ID`=609;
+UPDATE `graveyard_zone` SET `Comment`='Alterac Valley, Horde Safe - Alterac Valley' WHERE `ID`=610;
+UPDATE `graveyard_zone` SET `Comment`='Alterac Valley, Alliance Safe - Alterac Valley' WHERE `ID`=611;
+UPDATE `graveyard_zone` SET `Comment`='TEST for GM Client Only - Do Not Bug - Tirisfal Glades' WHERE `ID`=629;
+UPDATE `graveyard_zone` SET `Comment`='Azshara, Bitter Reaches GY - Azshara' WHERE `ID`=630;
+UPDATE `graveyard_zone` SET `Comment`='Dustwallow Marsh, Brackenwall Village GY - Dustwallow Marsh' WHERE `ID`=631;
+UPDATE `graveyard_zone` SET `Comment`='Moonglade GY - Moonglade' WHERE `ID`=633;
+UPDATE `graveyard_zone` SET `Comment`='Eastern Plaguelands, Darrowshire - Eastern Plaguelands' WHERE `ID`=634;
+UPDATE `graveyard_zone` SET `Comment`='Felwood, Irontree Woods - Felwood' WHERE `ID`=635;
+UPDATE `graveyard_zone` SET `Comment`='Searing Gorge, Thorium Point - Searing Gorge' WHERE `ID`=636;
+UPDATE `graveyard_zone` SET `Comment`='Durotar, Sen''jin Village GY - Durotar' WHERE `ID`=649;
+UPDATE `graveyard_zone` SET `Comment`='Programmer Isle, Bucklers Cemetery 2 - Programmer Isle' WHERE `ID`=669;
+UPDATE `graveyard_zone` SET `Comment`='Programmer Isle, Bucklers Cemetery 1 - Programmer Isle' WHERE `ID`=670;
+UPDATE `graveyard_zone` SET `Comment`='Programmer Isle, Bucklers Cemetery 3 - Programmer Isle' WHERE `ID`=671;
+UPDATE `graveyard_zone` SET `Comment`='Alterac Valley, Stormpike Graveyard (Hi) - Alterac Valley' WHERE `ID`=689;
+UPDATE `graveyard_zone` SET `Comment`='Durotar, Valley of Trials GY - Durotar' WHERE `ID`=709;
+UPDATE `graveyard_zone` SET `Comment`='Alterac Valley, PvP Alliance Choke Graveyard (A-choke) - Alterac Valley' WHERE `ID`=729;
+UPDATE `graveyard_zone` SET `Comment`='Alterac Valley, PvP Horde Choke Graveyard (H-choke) - Alterac Valley' WHERE `ID`=749;
+UPDATE `graveyard_zone` SET `Comment`='Alterac Valley, Frostwolf Relief Hut (H-base) - Alterac Valley' WHERE `ID`=750;
+UPDATE `graveyard_zone` SET `Comment`='Alterac Valley, Stormpike Aid Station (A-base) - Alterac Valley' WHERE `ID`=751;
+UPDATE `graveyard_zone` SET `Comment`='Warsong Gulch - Alliance Enter Loc - Warsong Gulch' WHERE `ID`=769;
+UPDATE `graveyard_zone` SET `Comment`='Warsong Gulch - Horde Enter Loc - Warsong Gulch' WHERE `ID`=770;
+UPDATE `graveyard_zone` SET `Comment`='Warsong Gulch - Alliance Rez Loc - Warsong Gulch' WHERE `ID`=771;
+UPDATE `graveyard_zone` SET `Comment`='Warsong Gulch - Horde Rez Loc - Warsong Gulch' WHERE `ID`=772;
+UPDATE `graveyard_zone` SET `Comment`='The Hinterlands, The Overlook Cliffs - The Hinterlands' WHERE `ID`=789;
+UPDATE `graveyard_zone` SET `Comment`='Warsong Gulch - Horde Exit Loc - Warsong Gulch' WHERE `ID`=809;
+UPDATE `graveyard_zone` SET `Comment`='Warsong Gulch - Alliance Exit Loc - Warsong Gulch' WHERE `ID`=810;
+UPDATE `graveyard_zone` SET `Comment`='Alterac Valley, Alliance Exit' WHERE `ID`=829;
+UPDATE `graveyard_zone` SET `Comment`='Alterac Valley, Horde Exit - Alterac Valley' WHERE `ID`=830;
+UPDATE `graveyard_zone` SET `Comment`='Feralas, Dire Maul Stonemaul Hold GY - Feralas' WHERE `ID`=849;
+UPDATE `graveyard_zone` SET `Comment`='Durotar, Northern Durotar GY' WHERE `ID`=850;
+UPDATE `graveyard_zone` SET `Comment`='Mulgore, Thunder Bluff GY' WHERE `ID`=851;
+UPDATE `graveyard_zone` SET `Comment`='Dun Morogh, Gates of Ironforge - Dun Morogh' WHERE `ID`=852;
+UPDATE `graveyard_zone` SET `Comment`='Elwynn Forest, Eastvale Logging Camp' WHERE `ID`=854;
+UPDATE `graveyard_zone` SET `Comment`='Western Plaguelands, Caer Darrow - Western Plaguelands' WHERE `ID`=869;
+UPDATE `graveyard_zone` SET `Comment`='Arathi Basin - Horde Entrance - Arathi Basin' WHERE `ID`=889;
+UPDATE `graveyard_zone` SET `Comment`='Arathi Basin - Alliance Entrance - Arathi Basin' WHERE `ID`=890;
+UPDATE `graveyard_zone` SET `Comment`='Arathi Basin - Horde Exit - Arathi Basin' WHERE `ID`=891;
+UPDATE `graveyard_zone` SET `Comment`='Arathi Basin - Alliance Exit - Arathi Basin' WHERE `ID`=892;
+UPDATE `graveyard_zone` SET `Comment`='Arathi Basin - Graveyard, H-Mid (Farm) - Arathi Basin' WHERE `ID`=893;
+UPDATE `graveyard_zone` SET `Comment`='Arathi Basin - Graveyard, Mid (Blacksmith) - Arathi Basin' WHERE `ID`=894;
+UPDATE `graveyard_zone` SET `Comment`='Arathi Basin - Graveyard, A-Mid (Stables) - Arathi Basin' WHERE `ID`=895;
+UPDATE `graveyard_zone` SET `Comment`='Arathi Basin - Graveyard, ALT-N (Gold Mine) - Arathi Basin' WHERE `ID`=896;
+UPDATE `graveyard_zone` SET `Comment`='Arathi Basin - Graveyard, ALT-S (Lumber Mill) - Arathi Basin' WHERE `ID`=897;
+UPDATE `graveyard_zone` SET `Comment`='Arathi Basin - Graveyard, A-Base (Trollbane Hall) - Arathi Basin' WHERE `ID`=898;
+UPDATE `graveyard_zone` SET `Comment`='Arathi Basin - Graveyard, H-Base (Defiler''s Den) - Arathi Basin' WHERE `ID`=899;
+UPDATE `graveyard_zone` SET `Comment`='Eastern Plaguelands, Blackwood Lake - Eastern Plaguelands' WHERE `ID`=909;
+UPDATE `graveyard_zone` SET `Comment`='Eastern Plaguelands, Blackwood Lake - Stratholme' WHERE `ID`=909;
+UPDATE `graveyard_zone` SET `Comment`='Silithus, Cenarion Hold - Ruins of Ahn''Qiraj' WHERE `ID`=910;
+UPDATE `graveyard_zone` SET `Comment`='Silithus, Cenarion Hold - Silithus' WHERE `ID`=910;
+UPDATE `graveyard_zone` SET `Comment`='Duskwood, Ravenhill - Duskwood' WHERE `ID`=911;
+UPDATE `graveyard_zone` SET `Comment`='Eversong Woods, Sunstrider Isle - Eversong Woods' WHERE `ID`=912;
+UPDATE `graveyard_zone` SET `Comment`='Silithus, Scarab Wall (AQ Only)' WHERE `ID`=913;
+UPDATE `graveyard_zone` SET `Comment`='Eversong Woods, Farstrider Lodge GY - Eversong Woods' WHERE `ID`=914;
+UPDATE `graveyard_zone` SET `Comment`='Ghostlands, Tranquillien - Ghostlands' WHERE `ID`=915;
+UPDATE `graveyard_zone` SET `Comment`='Ghostlands, Sanctum - Ghostlands' WHERE `ID`=916;
+UPDATE `graveyard_zone` SET `Comment`='Ghostlands, Amani Pass' WHERE `ID`=917;
+UPDATE `graveyard_zone` SET `Comment`='Azuremyst Isle, Ammen Vale' WHERE `ID`=918;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Thrallmar' WHERE `ID`=919;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Honor Hold' WHERE `ID`=920;
+UPDATE `graveyard_zone` SET `Comment`='Eversong Woods, Silvermoon City' WHERE `ID`=921;
+UPDATE `graveyard_zone` SET `Comment`='Azuremyst, Azure Watch GY - Azuremyst Isle' WHERE `ID`=923;
+UPDATE `graveyard_zone` SET `Comment`='Azuremyst, Stillpine GY' WHERE `ID`=924;
+UPDATE `graveyard_zone` SET `Comment`='Bloodmyst, Blood Watch GY - Bloodmyst Isle' WHERE `ID`=925;
+UPDATE `graveyard_zone` SET `Comment`='Bloodmyst, Wilderness GY' WHERE `ID`=926;
+UPDATE `graveyard_zone` SET `Comment`='Eastern Plaguelands, Graveyard CG Tower - Eastern Plaguelands' WHERE `ID`=927;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Zabra''jin GY' WHERE `ID`=928;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, SE Graveyard - Nagrand' WHERE `ID`=930;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Temple - Hellfire Peninsula' WHERE `ID`=933;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Falcon Watch - Hellfire Peninsula' WHERE `ID`=934;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 001 - Twisting Nether' WHERE `ID`=942;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 002 - Twisting Nether' WHERE `ID`=943;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 003 - Twisting Nether' WHERE `ID`=944;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 005 - Twisting Nether' WHERE `ID`=945;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 006 - Twisting Nether' WHERE `ID`=946;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 007 - Twisting Nether' WHERE `ID`=947;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 008 - Twisting Nether' WHERE `ID`=948;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 009 - Twisting Nether' WHERE `ID`=949;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 010 - Twisting Nether' WHERE `ID`=950;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 011 - Twisting Nether' WHERE `ID`=951;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 012 - Twisting Nether' WHERE `ID`=952;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 013 - Twisting Nether' WHERE `ID`=953;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 014 - Twisting Nether' WHERE `ID`=954;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 015 - Twisting Nether' WHERE `ID`=955;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 016 - Twisting Nether' WHERE `ID`=956;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 017 - Twisting Nether' WHERE `ID`=957;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 018 - Twisting Nether' WHERE `ID`=958;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 019 - Twisting Nether' WHERE `ID`=959;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 020 - Twisting Nether' WHERE `ID`=960;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 021 - Twisting Nether' WHERE `ID`=961;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 022 - Twisting Nether' WHERE `ID`=962;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 023 - Twisting Nether' WHERE `ID`=963;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 024 - Twisting Nether' WHERE `ID`=964;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 025 - Twisting Nether' WHERE `ID`=965;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 026 - Twisting Nether' WHERE `ID`=966;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 027 - Twisting Nether' WHERE `ID`=967;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Corpse Location 028 - Twisting Nether' WHERE `ID`=968;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, PvP GY' WHERE `ID`=969;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Telredor GY' WHERE `ID`=970;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 006 - Twisting Nether' WHERE `ID`=972;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Cenarion GY - Zangarmarsh' WHERE `ID`=973;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 001 - Twisting Nether' WHERE `ID`=974;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 002 - Twisting Nether' WHERE `ID`=975;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 003 - Twisting Nether' WHERE `ID`=976;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 004 - Twisting Nether' WHERE `ID`=977;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 008 - Twisting Nether' WHERE `ID`=978;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 005 - Twisting Nether' WHERE `ID`=979;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 007 - Twisting Nether' WHERE `ID`=980;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 009 - Twisting Nether' WHERE `ID`=981;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 011 - Twisting Nether' WHERE `ID`=982;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 010 - Twisting Nether' WHERE `ID`=983;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 012 - Twisting Nether' WHERE `ID`=984;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 013 - Twisting Nether' WHERE `ID`=985;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 014 - Twisting Nether' WHERE `ID`=986;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 016 - Twisting Nether' WHERE `ID`=987;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 015 - Twisting Nether' WHERE `ID`=988;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 017 - Twisting Nether' WHERE `ID`=989;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 018 - Twisting Nether' WHERE `ID`=990;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Corpse Location 019 - Twisting Nether' WHERE `ID`=991;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Northwind Cleft - Nagrand' WHERE `ID`=992;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Halaa GY - Nagrand' WHERE `ID`=993;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Shattrath GY' WHERE `ID`=994;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Wilderness GY - Terokkar Forest' WHERE `ID`=995;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Corpse Location 001 - Twisting Nether' WHERE `ID`=999;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Corpse Location 002 - Twisting Nether' WHERE `ID`=1000;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Corpse Location 003 - Twisting Nether' WHERE `ID`=1001;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Corpse Location 004 - Twisting Nether' WHERE `ID`=1002;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Corpse Location 005 - Twisting Nether' WHERE `ID`=1003;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Corpse Location 006 - Twisting Nether' WHERE `ID`=1004;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Corpse Location 007 - Twisting Nether' WHERE `ID`=1005;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Corpse Location 008 - Twisting Nether' WHERE `ID`=1006;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Corpse Location 009 - Twisting Nether' WHERE `ID`=1007;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Corpse Location 010 - Twisting Nether' WHERE `ID`=1008;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Corpse Location 011 - Twisting Nether' WHERE `ID`=1009;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Corpse Location 012 - Twisting Nether' WHERE `ID`=1010;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Corpse Location 013 - Twisting Nether' WHERE `ID`=1011;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Corpse Location 014 - Twisting Nether' WHERE `ID`=1012;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 001 - Twisting Nether' WHERE `ID`=1013;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 002 - Twisting Nether' WHERE `ID`=1014;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 003 - Twisting Nether' WHERE `ID`=1015;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 004 - Twisting Nether' WHERE `ID`=1016;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 005 - Twisting Nether' WHERE `ID`=1017;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 006 - Twisting Nether' WHERE `ID`=1018;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 007 - Twisting Nether' WHERE `ID`=1019;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 008 - Twisting Nether' WHERE `ID`=1020;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 009 - Twisting Nether' WHERE `ID`=1021;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 010 - Twisting Nether' WHERE `ID`=1022;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 011 - Twisting Nether' WHERE `ID`=1023;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 001 - Twisting Nether' WHERE `ID`=1024;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 002 - Twisting Nether' WHERE `ID`=1025;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 003 - Twisting Nether' WHERE `ID`=1026;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 004 - Twisting Nether' WHERE `ID`=1027;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 016 - Twisting Nether' WHERE `ID`=1028;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 017 - Twisting Nether' WHERE `ID`=1029;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 018 - Twisting Nether' WHERE `ID`=1030;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 019 - Twisting Nether' WHERE `ID`=1031;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 020 - Twisting Nether' WHERE `ID`=1032;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 021 - Twisting Nether' WHERE `ID`=1033;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 022 - Twisting Nether' WHERE `ID`=1034;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Corpse Location 023 - Twisting Nether' WHERE `ID`=1035;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Portal Plateau - Nagrand' WHERE `ID`=1037;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, Elemental Plateau - Nagrand' WHERE `ID`=1038;
+UPDATE `graveyard_zone` SET `Comment`='Nagrand, SW Graveyard - Nagrand' WHERE `ID`=1039;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Throne of Kil''Jaedan - Hellfire Peninsula' WHERE `ID`=1040;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Dark Portal - Hellfire Peninsula' WHERE `ID`=1041;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Bone Wastes GY' WHERE `ID`=1042;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Harborage GY - Zangarmarsh' WHERE `ID`=1043;
+UPDATE `graveyard_zone` SET `Comment`='Zangarmarsh, Sporeggar GY - Zangarmarsh' WHERE `ID`=1044;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm, Stormspire GY - Netherstorm' WHERE `ID`=1045;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm, Area 52 GY - Netherstorm' WHERE `ID`=1046;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon Valley, Shadowmoon Village GY - Shadowmoon Valley' WHERE `ID`=1047;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon Valley, Wildhammer GY - Shadowmoon Valley' WHERE `ID`=1048;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Sylvanaar GY - Blade''s Edge Mountains' WHERE `ID`=1049;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Thunderlord GY - Blade''s Edge Mountains' WHERE `ID`=1050;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Skettis GY - Terokkar Forest' WHERE `ID`=1051;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 005 - Twisting Nether' WHERE `ID`=1052;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 006 - Twisting Nether' WHERE `ID`=1053;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 007 - Twisting Nether' WHERE `ID`=1054;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 008 - Twisting Nether' WHERE `ID`=1055;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 009 - Twisting Nether' WHERE `ID`=1056;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 010 - Twisting Nether' WHERE `ID`=1057;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 011 - Twisting Nether' WHERE `ID`=1058;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 012 - Twisting Nether' WHERE `ID`=1059;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 013 - Twisting Nether' WHERE `ID`=1060;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 014 - Twisting Nether' WHERE `ID`=1061;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 015 - Twisting Nether' WHERE `ID`=1062;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 016 - Twisting Nether' WHERE `ID`=1063;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 017 - Twisting Nether' WHERE `ID`=1064;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 018 - Twisting Nether' WHERE `ID`=1065;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 019 - Twisting Nether' WHERE `ID`=1066;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 020 - Twisting Nether' WHERE `ID`=1067;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 021 - Twisting Nether' WHERE `ID`=1068;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 022 - Twisting Nether' WHERE `ID`=1069;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon, Corpse Location 023 - Twisting Nether' WHERE `ID`=1070;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 000 - Twisting Nether' WHERE `ID`=1072;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 001 - Twisting Nether' WHERE `ID`=1073;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 002 - Twisting Nether' WHERE `ID`=1074;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 003 - Twisting Nether' WHERE `ID`=1075;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 004 - Twisting Nether' WHERE `ID`=1076;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 005 - Twisting Nether' WHERE `ID`=1077;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 006 - Twisting Nether' WHERE `ID`=1078;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 007 - Twisting Nether' WHERE `ID`=1079;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 008 - Twisting Nether' WHERE `ID`=1080;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 009 - Twisting Nether' WHERE `ID`=1081;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 010 - Twisting Nether' WHERE `ID`=1082;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 011 - Twisting Nether' WHERE `ID`=1083;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 012 - Twisting Nether' WHERE `ID`=1084;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 013 - Twisting Nether' WHERE `ID`=1085;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 014 - Twisting Nether' WHERE `ID`=1086;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 015 - Twisting Nether' WHERE `ID`=1087;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 016 - Twisting Nether' WHERE `ID`=1088;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 017 - Twisting Nether' WHERE `ID`=1089;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 018 - Twisting Nether' WHERE `ID`=1090;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 019 - Twisting Nether' WHERE `ID`=1091;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 020 - Twisting Nether' WHERE `ID`=1092;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 021 - Twisting Nether' WHERE `ID`=1093;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 022 - Twisting Nether' WHERE `ID`=1094;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 023 - Twisting Nether' WHERE `ID`=1095;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 024 - Twisting Nether' WHERE `ID`=1096;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 025 - Twisting Nether' WHERE `ID`=1097;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 026 - Twisting Nether' WHERE `ID`=1098;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 027 - Twisting Nether' WHERE `ID`=1099;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 028 - Twisting Nether' WHERE `ID`=1100;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 029 - Twisting Nether' WHERE `ID`=1101;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Corpse Location 030 - Twisting Nether' WHERE `ID`=1102;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 000 - Twisting Nether' WHERE `ID`=1134;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 001 - Twisting Nether' WHERE `ID`=1135;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 002 - Twisting Nether' WHERE `ID`=1136;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 003 - Twisting Nether' WHERE `ID`=1137;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 004 - Twisting Nether' WHERE `ID`=1138;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 005 - Twisting Nether' WHERE `ID`=1139;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 006 - Twisting Nether' WHERE `ID`=1140;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 007 - Twisting Nether' WHERE `ID`=1141;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 008 - Twisting Nether' WHERE `ID`=1142;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 009 - Twisting Nether' WHERE `ID`=1143;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 010 - Twisting Nether' WHERE `ID`=1144;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 011 - Twisting Nether' WHERE `ID`=1145;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 012 - Twisting Nether' WHERE `ID`=1146;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 013 - Twisting Nether' WHERE `ID`=1147;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 014 - Twisting Nether' WHERE `ID`=1148;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 015 - Twisting Nether' WHERE `ID`=1149;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 016 - Twisting Nether' WHERE `ID`=1150;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 017 - Twisting Nether' WHERE `ID`=1151;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 018 - Twisting Nether' WHERE `ID`=1152;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 019 - Twisting Nether' WHERE `ID`=1153;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 020 - Twisting Nether' WHERE `ID`=1154;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 021 - Twisting Nether' WHERE `ID`=1155;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 022 - Twisting Nether' WHERE `ID`=1156;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 023 - Twisting Nether' WHERE `ID`=1157;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 024 - Twisting Nether' WHERE `ID`=1158;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 025 - Twisting Nether' WHERE `ID`=1159;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 026 - Twisting Nether' WHERE `ID`=1160;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 027 - Twisting Nether' WHERE `ID`=1161;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 028 - Twisting Nether' WHERE `ID`=1162;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 029 - Twisting Nether' WHERE `ID`=1163;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 030 - Twisting Nether' WHERE `ID`=1164;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 031 - Twisting Nether' WHERE `ID`=1165;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 032 - Twisting Nether' WHERE `ID`=1166;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 033 - Twisting Nether' WHERE `ID`=1167;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 034 - Twisting Nether' WHERE `ID`=1168;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 035 - Twisting Nether' WHERE `ID`=1169;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 036 - Twisting Nether' WHERE `ID`=1170;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 037 - Twisting Nether' WHERE `ID`=1171;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 038 - Twisting Nether' WHERE `ID`=1172;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 039 - Twisting Nether' WHERE `ID`=1173;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 040 - Twisting Nether' WHERE `ID`=1174;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 041 - Twisting Nether' WHERE `ID`=1175;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 042 - Twisting Nether' WHERE `ID`=1176;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 043 - Twisting Nether' WHERE `ID`=1177;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 044 - Twisting Nether' WHERE `ID`=1178;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 045 - Twisting Nether' WHERE `ID`=1179;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 046 - Twisting Nether' WHERE `ID`=1180;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 047 - Twisting Nether' WHERE `ID`=1181;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 048 - Twisting Nether' WHERE `ID`=1182;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 049 - Twisting Nether' WHERE `ID`=1183;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 050 - Twisting Nether' WHERE `ID`=1184;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 051 - Twisting Nether' WHERE `ID`=1185;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 052 - Twisting Nether' WHERE `ID`=1186;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 053 - Twisting Nether' WHERE `ID`=1187;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 054 - Twisting Nether' WHERE `ID`=1188;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 055 - Twisting Nether' WHERE `ID`=1189;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 056 - Twisting Nether' WHERE `ID`=1190;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 057 - Twisting Nether' WHERE `ID`=1191;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 058 - Twisting Nether' WHERE `ID`=1192;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 059 - Twisting Nether' WHERE `ID`=1193;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 060 - Twisting Nether' WHERE `ID`=1194;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 061 - Twisting Nether' WHERE `ID`=1195;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 062 - Twisting Nether' WHERE `ID`=1196;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 063 - Twisting Nether' WHERE `ID`=1197;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 064 - Twisting Nether' WHERE `ID`=1198;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 065 - Twisting Nether' WHERE `ID`=1199;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 066 - Twisting Nether' WHERE `ID`=1200;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 067 - Twisting Nether' WHERE `ID`=1201;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 068 - Twisting Nether' WHERE `ID`=1202;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 069 - Twisting Nether' WHERE `ID`=1203;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 070 - Twisting Nether' WHERE `ID`=1204;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 071 - Twisting Nether' WHERE `ID`=1205;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 072 - Twisting Nether' WHERE `ID`=1206;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 073 - Twisting Nether' WHERE `ID`=1207;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 074 - Twisting Nether' WHERE `ID`=1208;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 075 - Twisting Nether' WHERE `ID`=1209;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 076 - Twisting Nether' WHERE `ID`=1210;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 077 - Twisting Nether' WHERE `ID`=1211;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 078 - Twisting Nether' WHERE `ID`=1212;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 079 - Twisting Nether' WHERE `ID`=1213;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 080 - Twisting Nether' WHERE `ID`=1214;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 081 - Twisting Nether' WHERE `ID`=1215;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 082 - Twisting Nether' WHERE `ID`=1216;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 083 - Twisting Nether' WHERE `ID`=1217;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 084 - Twisting Nether' WHERE `ID`=1218;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 085 - Twisting Nether' WHERE `ID`=1219;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 086 - Twisting Nether' WHERE `ID`=1220;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 087 - Twisting Nether' WHERE `ID`=1221;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 088 - Twisting Nether' WHERE `ID`=1222;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 089 - Twisting Nether' WHERE `ID`=1223;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 090 - Twisting Nether' WHERE `ID`=1224;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 091 - Twisting Nether' WHERE `ID`=1225;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 092 - Twisting Nether' WHERE `ID`=1226;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 093 - Twisting Nether' WHERE `ID`=1227;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 094 - Twisting Nether' WHERE `ID`=1228;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 095 - Twisting Nether' WHERE `ID`=1229;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 096 - Twisting Nether' WHERE `ID`=1230;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 097 - Twisting Nether' WHERE `ID`=1231;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 098 - Twisting Nether' WHERE `ID`=1232;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 099 - Twisting Nether' WHERE `ID`=1233;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 100 - Twisting Nether' WHERE `ID`=1234;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 101 - Twisting Nether' WHERE `ID`=1235;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 102 - Twisting Nether' WHERE `ID`=1236;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 103 - Twisting Nether' WHERE `ID`=1237;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 104 - Twisting Nether' WHERE `ID`=1238;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm - Corpse Catcher 105 - Twisting Nether' WHERE `ID`=1239;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Force Camps (Alliance) - Hellfire Peninsula' WHERE `ID`=1240;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Evergrove GY' WHERE `ID`=1241;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, North Ridge GY - Blade''s Edge Mountains' WHERE `ID`=1242;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, West Ridge GY - Blade''s Edge Mountains' WHERE `ID`=1243;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, East Ridge GY - Blade''s Edge Mountains' WHERE `ID`=1244;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm, Cosmowrench GY' WHERE `ID`=1247;
+UPDATE `graveyard_zone` SET `Comment`='Hellfire Peninsula, Spinebreaker GY - Hellfire Peninsula' WHERE `ID`=1248;
+UPDATE `graveyard_zone` SET `Comment`='Tanaris, CoT GY' WHERE `ID`=1249;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon Valley, Altar GY - Shadowmoon Valley' WHERE `ID`=1250;
+UPDATE `graveyard_zone` SET `Comment`='Shadowmoon Valley, Sanctum GY - Shadowmoon Valley' WHERE `ID`=1251;
+UPDATE `graveyard_zone` SET `Comment`='Netherstorm, Kirin''Var GY - Netherstorm' WHERE `ID`=1252;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Toshley GY - Blade''s Edge Mountains' WHERE `ID`=1253;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, Raven Wood GY - Blade''s Edge Mountains' WHERE `ID`=1254;
+UPDATE `graveyard_zone` SET `Comment`='Blade''s Edge, NE Ridge GY - Blade''s Edge Mountains' WHERE `ID`=1255;
+UPDATE `graveyard_zone` SET `Comment`='Silverpine Forest, South GY - Silverpine Forest' WHERE `ID`=1256;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Ogre GY - Terokkar Forest' WHERE `ID`=1257;
+UPDATE `graveyard_zone` SET `Comment`='Black Temple, Alliance GY - Black Temple' WHERE `ID`=1261;
+UPDATE `graveyard_zone` SET `Comment`='Black Temple, Horde GY - Black Temple' WHERE `ID`=1262;
+UPDATE `graveyard_zone` SET `Comment`='Dustwallow Marsh, Tabetha''s GY - Dustwallow Marsh' WHERE `ID`=1264;
+UPDATE `graveyard_zone` SET `Comment`='Dustwallow Marsh, Mudsprocket GY - Onyxia''s Lair' WHERE `ID`=1265;
+UPDATE `graveyard_zone` SET `Comment`='Dustwallow Marsh, Mudsprocket GY - Dustwallow Marsh' WHERE `ID`=1265;
+UPDATE `graveyard_zone` SET `Comment`='Howling Fjord, Northwest GY - Howling Fjord' WHERE `ID`=1266;
+UPDATE `graveyard_zone` SET `Comment`='Howling Fjord, Tuskarr GY - Howling Fjord' WHERE `ID`=1267;
+UPDATE `graveyard_zone` SET `Comment`='Howling Fjord, Island GY - Howling Fjord' WHERE `ID`=1268;
+UPDATE `graveyard_zone` SET `Comment`='Howling Fjord, Central GY - Howling Fjord' WHERE `ID`=1269;
+UPDATE `graveyard_zone` SET `Comment`='Howling Fjord, North GY - Howling Fjord' WHERE `ID`=1270;
+UPDATE `graveyard_zone` SET `Comment`='Howling Fjord, Vengance GY - Howling Fjord' WHERE `ID`=1271;
+UPDATE `graveyard_zone` SET `Comment`='Howling Fjord, Southeast GY - Howling Fjord' WHERE `ID`=1272;
+UPDATE `graveyard_zone` SET `Comment`='Howling Fjord, South Beach GY - Howling Fjord' WHERE `ID`=1273;
+UPDATE `graveyard_zone` SET `Comment`='Howling Fjord, South GY - Howling Fjord' WHERE `ID`=1274;
+UPDATE `graveyard_zone` SET `Comment`='Howling Fjord, Valgarde GY - Howling Fjord' WHERE `ID`=1275;
+UPDATE `graveyard_zone` SET `Comment`='Howling Fjord, Northeast GY - Howling Fjord' WHERE `ID`=1276;
+UPDATE `graveyard_zone` SET `Comment`='Un''Goro Crater, Central GY - Un''Goro Crater' WHERE `ID`=1277;
+UPDATE `graveyard_zone` SET `Comment`='Un''Goro Crater, Marshal''s GY - Un''Goro Crater' WHERE `ID`=1278;
+UPDATE `graveyard_zone` SET `Comment`='Stonetalon Mountains, Charred Vale GY - Stonetalon Mountains' WHERE `ID`=1279;
+UPDATE `graveyard_zone` SET `Comment`='Stonetalon Mountains, Peak GY - Stonetalon Mountains' WHERE `ID`=1280;
+UPDATE `graveyard_zone` SET `Comment`='Tanaris, Pirate GY - Tanaris' WHERE `ID`=1281;
+UPDATE `graveyard_zone` SET `Comment`='Tanaris, Central GY - Tanaris' WHERE `ID`=1282;
+UPDATE `graveyard_zone` SET `Comment`='Winterspring, South GY - Winterspring' WHERE `ID`=1283;
+UPDATE `graveyard_zone` SET `Comment`='Winterspring, West GY - Winterspring' WHERE `ID`=1284;
+UPDATE `graveyard_zone` SET `Comment`='Western Plaguelands, Central GY - Western Plaguelands' WHERE `ID`=1286;
+UPDATE `graveyard_zone` SET `Comment`='Searing Gorge, SE GY - Searing Gorge' WHERE `ID`=1287;
+UPDATE `graveyard_zone` SET `Comment`='Badlands, South GY - Badlands' WHERE `ID`=1288;
+UPDATE `graveyard_zone` SET `Comment`='The Barrens, South GY - Southern Barrens' WHERE `ID`=1289;
+UPDATE `graveyard_zone` SET `Comment`='Borean Tundra, Tuskar GY - Borean Tundra' WHERE `ID`=1290;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Razorthorn Rise GY - Terokkar Forest' WHERE `ID`=1291;
+UPDATE `graveyard_zone` SET `Comment`='Isle of Quel''Danas, Staging Area GY - Isle of Quel''Danas' WHERE `ID`=1292;
+UPDATE `graveyard_zone` SET `Comment`='Isle of Quel''Danas, Staging Area GY - Magisters'' Terrace' WHERE `ID`=1293;
+UPDATE `graveyard_zone` SET `Comment`='Isle of Quel''Danas, Staging Area GY - Sunwell Plateau' WHERE `ID`=1293;
+UPDATE `graveyard_zone` SET `Comment`='Terokkar Forest, Lake Jorune GY - Terokkar Forest' WHERE `ID`=1298;
+UPDATE `graveyard_zone` SET `Comment`='Grizzly Hills, Vileprey GY - Grizzly Hills' WHERE `ID`=1300;
+UPDATE `graveyard_zone` SET `Comment`='Grizzly Hills, Amberpine GY - Grizzly Hills' WHERE `ID`=1301;
+UPDATE `graveyard_zone` SET `Comment`='Grizzly Hills, Westfall GY - Grizzly Hills' WHERE `ID`=1302;
+UPDATE `graveyard_zone` SET `Comment`='Grizzly Hills, Eastern GY - Grizzly Hills' WHERE `ID`=1303;
+UPDATE `graveyard_zone` SET `Comment`='Grizzly Hills, Northwestern GY - Grizzly Hills' WHERE `ID`=1304;
+UPDATE `graveyard_zone` SET `Comment`='Grizzly Hills, Southwestern GY - Grizzly Hills' WHERE `ID`=1305;
+UPDATE `graveyard_zone` SET `Comment`='Grizzly Hills, Central GY - Grizzly Hills' WHERE `ID`=1306;
+UPDATE `graveyard_zone` SET `Comment`='Dragonblight, Northeastern GY - Dragonblight' WHERE `ID`=1307;
+UPDATE `graveyard_zone` SET `Comment`='Dragonblight, Wintergarde GY - Naxxramas' WHERE `ID`=1308;
+UPDATE `graveyard_zone` SET `Comment`='Dragonblight, Wintergarde GY - Dragonblight' WHERE `ID`=1308;
+UPDATE `graveyard_zone` SET `Comment`='Dragonblight, Forsaken East GY - Naxxramas' WHERE `ID`=1309;
+UPDATE `graveyard_zone` SET `Comment`='Dragonblight, Agmar''s Hammer GY - Dragonblight' WHERE `ID`=1310;
+UPDATE `graveyard_zone` SET `Comment`='Dragonblight, Star''s Rest GY - Dragonblight' WHERE `ID`=1311;
+UPDATE `graveyard_zone` SET `Comment`='Dragonblight, Moa''ki Harbor GY - Dragonblight' WHERE `ID`=1312;
+UPDATE `graveyard_zone` SET `Comment`='Dragonblight, Borean Border GY - Dragonblight' WHERE `ID`=1313;
+UPDATE `graveyard_zone` SET `Comment`='Dragonblight, Wyrmrest GY - Dragonblight' WHERE `ID`=1314;
+UPDATE `graveyard_zone` SET `Comment`='Dragonblight, Wrathgate Horde GY - Dragonblight' WHERE `ID`=1315;
+UPDATE `graveyard_zone` SET `Comment`='Dragonblight, Wrathgate Alliance GY - Dragonblight' WHERE `ID`=1316;
+UPDATE `graveyard_zone` SET `Comment`='Borean Tundra, Warsong Hold GY - Borean Tundra' WHERE `ID`=1317;
+UPDATE `graveyard_zone` SET `Comment`='Borean Tundra, Riplash GY - Borean Tundra' WHERE `ID`=1318;
+UPDATE `graveyard_zone` SET `Comment`='Borean Tundra, Coldarra GY' WHERE `ID`=1319;
+UPDATE `graveyard_zone` SET `Comment`='Borean Tundra, Amber Ledge GY - Borean Tundra' WHERE `ID`=1320;
+UPDATE `graveyard_zone` SET `Comment`='Borean Tundra, Fizzcrank GY - Borean Tundra' WHERE `ID`=1321;
+UPDATE `graveyard_zone` SET `Comment`='Borean Tundra, Bor''Gorok GY - Borean Tundra' WHERE `ID`=1322;
+UPDATE `graveyard_zone` SET `Comment`='Borean Tundra, Death''s Stand GY - Borean Tundra' WHERE `ID`=1323;
+UPDATE `graveyard_zone` SET `Comment`='Borean Tundra, Taunka''le GY - Borean Tundra' WHERE `ID`=1324;
+UPDATE `graveyard_zone` SET `Comment`='Borean Tundra, Coast of Echoes GY - Borean Tundra' WHERE `ID`=1325;
+UPDATE `graveyard_zone` SET `Comment`='Borean Tundra, Valiance Keep GY - Borean Tundra' WHERE `ID`=1326;
+UPDATE `graveyard_zone` SET `Comment`='Wintergrasp, Fortress (West) - Wintergrasp' WHERE `ID`=1328;
+UPDATE `graveyard_zone` SET `Comment`='Wintergrasp, Siege Factory (Defense NE) - Wintergrasp' WHERE `ID`=1329;
+UPDATE `graveyard_zone` SET `Comment`='Wintergrasp, Siege Factory (Defense NW) - Wintergrasp' WHERE `ID`=1330;
+UPDATE `graveyard_zone` SET `Comment`='Wintergrasp, Horde Starting Area - Wintergrasp' WHERE `ID`=1331;
+UPDATE `graveyard_zone` SET `Comment`='Wintergrasp, Alliance Starting Area - Wintergrasp' WHERE `ID`=1332;
+UPDATE `graveyard_zone` SET `Comment`='Wintergrasp, Siege Factory (SE) - Wintergrasp' WHERE `ID`=1333;
+UPDATE `graveyard_zone` SET `Comment`='Wintergrasp, Siege Factory (SW) - Wintergrasp' WHERE `ID`=1334;
+UPDATE `graveyard_zone` SET `Comment`='Sholazar Basin, South GY - Sholazar Basin' WHERE `ID`=1336;
+UPDATE `graveyard_zone` SET `Comment`='Howling Fjord, Utgarde GY - Utgarde Pinnacle' WHERE `ID`=1337;
+UPDATE `graveyard_zone` SET `Comment`='Sholazar Basin, Nesingwary GY - Sholazar Basin' WHERE `ID`=1341;
+UPDATE `graveyard_zone` SET `Comment`='Sholazar Basin, Central GY - Sholazar Basin' WHERE `ID`=1342;
+UPDATE `graveyard_zone` SET `Comment`='Sholazar Basin, Northwest GY - Sholazar Basin' WHERE `ID`=1343;
+UPDATE `graveyard_zone` SET `Comment`='Sholazar Basin, Northeast GY - Sholazar Basin' WHERE `ID`=1344;
+UPDATE `graveyard_zone` SET `Comment`='Sholazar Basin, East GY - Sholazar Basin' WHERE `ID`=1345;
+UPDATE `graveyard_zone` SET `Comment`='Zul''Drak, Western GY - Zul''Drak' WHERE `ID`=1352;
+UPDATE `graveyard_zone` SET `Comment`='Zul''Drak, Northwestern GY - Zul''Drak' WHERE `ID`=1353;
+UPDATE `graveyard_zone` SET `Comment`='Zul''Drak, Southwestern GY - Zul''Drak' WHERE `ID`=1354;
+UPDATE `graveyard_zone` SET `Comment`='Zul''Drak, Southern GY - Zul''Drak' WHERE `ID`=1355;
+UPDATE `graveyard_zone` SET `Comment`='Zul''Drak, Central GY - Zul''Drak' WHERE `ID`=1356;
+UPDATE `graveyard_zone` SET `Comment`='Zul''Drak, Southeastern GY - Zul''Drak' WHERE `ID`=1357;
+UPDATE `graveyard_zone` SET `Comment`='Zul''Drak, Gun''Drak GY - Zul''Drak' WHERE `ID`=1358;
+UPDATE `graveyard_zone` SET `Comment`='Crystalsong Forest, Dalaran GY' WHERE `ID`=1359;
+UPDATE `graveyard_zone` SET `Comment`='Ebon Hold GY - Chapter I - Plaguelands: The Scarlet Enclave' WHERE `ID`=1360;
+UPDATE `graveyard_zone` SET `Comment`='Eastern Plaguelands, Ebon Hold GY - Eastern Plaguelands' WHERE `ID`=1369;
+UPDATE `graveyard_zone` SET `Comment`='Ebon Hold GY - Chapter II/III - Plaguelands: The Scarlet Enclave' WHERE `ID`=1370;
+UPDATE `graveyard_zone` SET `Comment`='Ebon Hold GY - Chapter IV - Plaguelands: The Scarlet Enclave' WHERE `ID`=1371;
+UPDATE `graveyard_zone` SET `Comment`='Un''Goro Crater, Shaper''s Terrace GY - Un''Goro Crater' WHERE `ID`=1372;
+UPDATE `graveyard_zone` SET `Comment`='Howling Fjord, Utgarde 2 GY - Utgarde Keep' WHERE `ID`=1376;
+UPDATE `graveyard_zone` SET `Comment`='Sholazar Basin, Stormwright GY - Sholazar Basin' WHERE `ID`=1379;
+UPDATE `graveyard_zone` SET `Comment`='Crystalsong Forest, Alliance GY - Crystalsong Forest' WHERE `ID`=1380;
+UPDATE `graveyard_zone` SET `Comment`='Icecrown, Argent Vanguard - Icecrown' WHERE `ID`=1381;
+UPDATE `graveyard_zone` SET `Comment`='Storm Peaks, Valkyrion GY - The Storm Peaks' WHERE `ID`=1383;
+UPDATE `graveyard_zone` SET `Comment`='Storm Peaks, Ulduar GY - The Storm Peaks' WHERE `ID`=1384;
+UPDATE `graveyard_zone` SET `Comment`='Storm Peaks, Temple East GY - The Storm Peaks' WHERE `ID`=1385;
+UPDATE `graveyard_zone` SET `Comment`='Storm Peaks, Temple West GY - The Storm Peaks' WHERE `ID`=1387;
+UPDATE `graveyard_zone` SET `Comment`='Storm Peaks, Frostfield GY - The Storm Peaks' WHERE `ID`=1388;
+UPDATE `graveyard_zone` SET `Comment`='Crystalsong Forest, West GY - Crystalsong Forest' WHERE `ID`=1391;
+UPDATE `graveyard_zone` SET `Comment`='Crystalsong Forest, Horde GY - Crystalsong Forest' WHERE `ID`=1392;
+UPDATE `graveyard_zone` SET `Comment`='Dragonblight, Naxxramas GY - Dragonblight' WHERE `ID`=1393;
+UPDATE `graveyard_zone` SET `Comment`='Dragonblight, Icemist GY - Dragonblight' WHERE `ID`=1394;
+UPDATE `graveyard_zone` SET `Comment`='Icecrown Glacier, Quarry GY - Icecrown' WHERE `ID`=1395;
+UPDATE `graveyard_zone` SET `Comment`='Icecrown Glacier, Vrykul Central GY - Icecrown' WHERE `ID`=1396;
+UPDATE `graveyard_zone` SET `Comment`='Icecrown Glacier, Northeast Ice GY - Icecrown' WHERE `ID`=1397;
+UPDATE `graveyard_zone` SET `Comment`='Grizzly Hills, Drak''tharon GY - Grizzly Hills' WHERE `ID`=1398;
+UPDATE `graveyard_zone` SET `Comment`='Storm Peaks, Temple of the Makers GY - The Storm Peaks' WHERE `ID`=1400;
+UPDATE `graveyard_zone` SET `Comment`='Storm Peaks, Snowdrift GY - The Storm Peaks' WHERE `ID`=1401;
+UPDATE `graveyard_zone` SET `Comment`='Storm Peaks, Temple of Storms GY - The Storm Peaks' WHERE `ID`=1402;
+UPDATE `graveyard_zone` SET `Comment`='Storm Peaks, K3 GY - The Storm Peaks' WHERE `ID`=1403;
+UPDATE `graveyard_zone` SET `Comment`='Sholazar Basin, Frenzyheart GY - Sholazar Basin' WHERE `ID`=1404;
+UPDATE `graveyard_zone` SET `Comment`='Eastern Plaguelands: Acherus - Eastern Plaguelands' WHERE `ID`=1405;
+UPDATE `graveyard_zone` SET `Comment`='Icecrown Glacier, Jotunheim GY - Icecrown' WHERE `ID`=1407;
+UPDATE `graveyard_zone` SET `Comment`='Storm Peaks, Foot Steppes GY - The Storm Peaks' WHERE `ID`=1408;
+UPDATE `graveyard_zone` SET `Comment`='Undercity - Alliance - Wrath Gate - Tirisfal Glades' WHERE `ID`=1409;
+UPDATE `graveyard_zone` SET `Comment`='Alterac Mountains - Central GY - Hillsbrad Foothills' WHERE `ID`=1411;
+UPDATE `graveyard_zone` SET `Comment`='Winterspring, Wintersaber GY - Winterspring' WHERE `ID`=1416;
+UPDATE `graveyard_zone` SET `Comment`='Winterspring, Crossroad GY - Winterspring' WHERE `ID`=1417;
+UPDATE `graveyard_zone` SET `Comment`='Winterspring, Darkwhisper GY - Winterspring' WHERE `ID`=1418;
+UPDATE `graveyard_zone` SET `Comment`='Azshara, Southern Azshara GY - Azshara' WHERE `ID`=1419;
+UPDATE `graveyard_zone` SET `Comment`='Azshara, Bilgewater Harbor GY - Azshara' WHERE `ID`=1420;
+UPDATE `graveyard_zone` SET `Comment`='Desolace, Ghost Walker Post GY - Desolace' WHERE `ID`=1421;
+UPDATE `graveyard_zone` SET `Comment`='Desolace, Sar''theris Strand GY - Desolace' WHERE `ID`=1422;
+UPDATE `graveyard_zone` SET `Comment`='Desolace, Mannoroc Coven GY - Desolace' WHERE `ID`=1423;
+UPDATE `graveyard_zone` SET `Comment`='Desolace, Magram Village GY - Desolace' WHERE `ID`=1424;
+UPDATE `graveyard_zone` SET `Comment`='Desolace, Roadside GY - Desolace' WHERE `ID`=1425;
+UPDATE `graveyard_zone` SET `Comment`='Ashenvale, Shrine of Aessina GY - Ashenvale' WHERE `ID`=1426;
+UPDATE `graveyard_zone` SET `Comment`='Ashenvale, Nightsong GY - Ashenvale' WHERE `ID`=1427;
+UPDATE `graveyard_zone` SET `Comment`='Stonetalon Mountains, Windshear Crag GY - Stonetalon Mountains' WHERE `ID`=1428;
+UPDATE `graveyard_zone` SET `Comment`='Stonetalon Mountains, Mirkfallon GY - Stonetalon Mountains' WHERE `ID`=1429;
+UPDATE `graveyard_zone` SET `Comment`='The Barrens, Forgotten Pools - Northern Barrens' WHERE `ID`=1430;
+UPDATE `graveyard_zone` SET `Comment`='The Barrens, North GY - Northern Barrens' WHERE `ID`=1431;
+UPDATE `graveyard_zone` SET `Comment`='The Barrens, Raptor Grounds - Southern Barrens' WHERE `ID`=1432;
+UPDATE `graveyard_zone` SET `Comment`='The Barrens, Central GY - Southern Barrens' WHERE `ID`=1433;
+UPDATE `graveyard_zone` SET `Comment`='The Barrens, East GY - Northern Barrens' WHERE `ID`=1434;
+UPDATE `graveyard_zone` SET `Comment`='Mulgore, Southeast GY - Mulgore' WHERE `ID`=1435;
+UPDATE `graveyard_zone` SET `Comment`='Mulgore, Red Rocks GY - Mulgore' WHERE `ID`=1436;
+UPDATE `graveyard_zone` SET `Comment`='Thousand Needles, Freewind Post GY (MOVED) - Thousand Needles' WHERE `ID`=1437;
+UPDATE `graveyard_zone` SET `Comment`='Thousand Needles, Speed Barge GY (MOVED) - Thousand Needles' WHERE `ID`=1438;
+UPDATE `graveyard_zone` SET `Comment`='Tanaris, Southwest GY - Tanaris' WHERE `ID`=1439;
+UPDATE `graveyard_zone` SET `Comment`='Tanaris, Abyssal Sands GY - Tanaris' WHERE `ID`=1440;
+UPDATE `graveyard_zone` SET `Comment`='Feralas, Ruins of Isildien GY - Feralas' WHERE `ID`=1441;
+UPDATE `graveyard_zone` SET `Comment`='Feralas, Lower Wilds GY - Feralas' WHERE `ID`=1442;
+UPDATE `graveyard_zone` SET `Comment`='Feralas, Twin Colossals GY - Feralas' WHERE `ID`=1443;
+UPDATE `graveyard_zone` SET `Comment`='Silithus, Hive''Regal - Silithus' WHERE `ID`=1444;
+UPDATE `graveyard_zone` SET `Comment`='Silithus, Twilight Base Camp - Silithus' WHERE `ID`=1445;
+UPDATE `graveyard_zone` SET `Comment`='Arathi Highlands, Stromgarde - Arathi Highlands' WHERE `ID`=1446;
+UPDATE `graveyard_zone` SET `Comment`='Hillsbrad Foothills, Thoradin''s Wall - Hillsbrad Foothills' WHERE `ID`=1447;
+UPDATE `graveyard_zone` SET `Comment`='Eastern Plaguelands, Northdale - Eastern Plaguelands' WHERE `ID`=1448;
+UPDATE `graveyard_zone` SET `Comment`='Eastern Plaguelands, Stratholme - Eastern Plaguelands' WHERE `ID`=1449;
+UPDATE `graveyard_zone` SET `Comment`='Eastern Plaguelands, West GY - Eastern Plaguelands' WHERE `ID`=1450;
+UPDATE `graveyard_zone` SET `Comment`='Western Plaguelands, Hearthglen - Eastern Plaguelands' WHERE `ID`=1451;
+UPDATE `graveyard_zone` SET `Comment`='Hillsbrad Foothills, Hillsbrad Fields GY - Hillsbrad Foothills' WHERE `ID`=1452;
+UPDATE `graveyard_zone` SET `Comment`='The Hinterlands, Seradane - The Hinterlands' WHERE `ID`=1453;
+UPDATE `graveyard_zone` SET `Comment`='The Hinterlands, Shadra''Alor - The Hinterlands' WHERE `ID`=1454;
+UPDATE `graveyard_zone` SET `Comment`='Wetlands, Sundown Marsh GY - Wetlands' WHERE `ID`=1455;
+UPDATE `graveyard_zone` SET `Comment`='Wetlands, South Road GY - Wetlands' WHERE `ID`=1456;
+UPDATE `graveyard_zone` SET `Comment`='Wetlands, Raptor Ridge GY - Wetlands' WHERE `ID`=1457;
+UPDATE `graveyard_zone` SET `Comment`='AAA - Arena (Dev Test) - Stranglethorn Vale' WHERE `ID`=1458;
+UPDATE `graveyard_zone` SET `Comment`='Stranglethorn Vale, Central GY - Stranglethorn Vale' WHERE `ID`=1459;
+UPDATE `graveyard_zone` SET `Comment`='Stranglethorn Vale, Savage Coast GY - Stranglethorn Vale' WHERE `ID`=1460;
+UPDATE `graveyard_zone` SET `Comment`='Duskwood, Central GY - Duskwood' WHERE `ID`=1461;
+UPDATE `graveyard_zone` SET `Comment`='Westfall, Dagger Hills GY - Westfall' WHERE `ID`=1462;
+UPDATE `graveyard_zone` SET `Comment`='Westfall, Longshore - Westfall' WHERE `ID`=1463;
+UPDATE `graveyard_zone` SET `Comment`='Blasted Lands, Dark Portal GY - Blasted Lands' WHERE `ID`=1464;
+UPDATE `graveyard_zone` SET `Comment`='Swamp of Sorrows, Alliance Hub GY - Swamp of Sorrows' WHERE `ID`=1465;
+UPDATE `graveyard_zone` SET `Comment`='Swamp of Sorrows, Splinterspear GY - Swamp of Sorrows' WHERE `ID`=1466;
+UPDATE `graveyard_zone` SET `Comment`='Redridge Mountains, Stonewatch - Redridge Mountains' WHERE `ID`=1467;
+UPDATE `graveyard_zone` SET `Comment`='Elwynn Forest, Tower of Azora - Elwynn Forest' WHERE `ID`=1468;
+UPDATE `graveyard_zone` SET `Comment`='Burning Steppes, Blackrock Mountain - Blackrock Mountain' WHERE `ID`=1469;
+UPDATE `graveyard_zone` SET `Comment`='Burning Steppes, East GY - Burning Steppes' WHERE `ID`=1470;
+UPDATE `graveyard_zone` SET `Comment`='Dun Morogh, Iceflow Lake - Dun Morogh' WHERE `ID`=1471;
+UPDATE `graveyard_zone` SET `Comment`='Dun Morogh, East Road - Dun Morogh' WHERE `ID`=1472;
+UPDATE `graveyard_zone` SET `Comment`='Loch Modan, The Loch - Loch Modan' WHERE `ID`=1473;
+UPDATE `graveyard_zone` SET `Comment`='Wintergrasp, Fortress Graveyard (Indoors) - Vault of Archavon' WHERE `ID`=1474;
+UPDATE `graveyard_zone` SET `Comment`='Icecrown, Argent Tournament GY' WHERE `ID`=1478;
+UPDATE `graveyard_zone` SET `Comment`='Icecrown Glacier, Citadel GY' WHERE `ID`=1682;
diff --git a/sql/updates/world/3.3.5/2016_05_26_00_world.sql b/sql/updates/world/3.3.5/2016_05_26_00_world.sql
new file mode 100644
index 00000000000..39e16aba39e
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_05_26_00_world.sql
@@ -0,0 +1,19 @@
+-- Localized name for gameobject entry 1638 and 2035 (English name "Deathknell")
+DELETE FROM `gameobject_template_locale` WHERE `entry` IN (1638,2035);
+INSERT INTO `gameobject_template_locale` (`entry`,`locale`,`name`,`castBarCaption`,`VerifiedBuild`) VALUES
+(1638,'deDE','Todesend','',0),
+(1638,'esES','Camposanto','',0),
+(1638,'esMX','Camposanto','',0),
+(1638,'frFR','Le Glas','',0),
+(1638,'koKR','죽음의 종소리 마을','',0),
+(1638,'ruRU','Похоронный Звон','',0),
+(1638,'zhCN','丧钟镇','',0),
+(1638,'zhTW','喪鐘鎮','',0),
+(2035,'deDE','Todesend','',0),
+(2035,'esES','Camposanto','',0),
+(2035,'esMX','Camposanto','',0),
+(2035,'frFR','Le Glas','',0),
+(2035,'koKR','죽음의 종소리 마을','',0),
+(2035,'ruRU','Похоронный Звон','',0),
+(2035,'zhCN','丧钟镇','',0),
+(2035,'zhTW','喪鐘鎮','',0);
diff --git a/sql/updates/world/3.3.5/2016_05_26_01_world.sql b/sql/updates/world/3.3.5/2016_05_26_01_world.sql
new file mode 100644
index 00000000000..705a6c3ac21
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_05_26_01_world.sql
@@ -0,0 +1,8 @@
+--
+DELETE FROM `smart_scripts` WHERE `entryorguid`=18794 AND `id`=34;
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(18794,0,34,0,1,0,100,0,0,0,0,0,11,32958,0,0,0,0,0,1,0,0,0,0,0,0,0,"Cabal Ritualist - Out of Combat - Cast 'Crystal Channel'");
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=0 AND `SourceEntry`=32958;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(13,1,32958,0,0,31,0,3,18793,0,0,"","Crystal Channel – Effect 0 - Cast only on Invisible Target 18793.");
diff --git a/sql/updates/world/3.3.5/2016_05_26_02_world.sql b/sql/updates/world/3.3.5/2016_05_26_02_world.sql
new file mode 100644
index 00000000000..4cacdc73a47
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_05_26_02_world.sql
@@ -0,0 +1,2 @@
+-- Fix bounding radius for 'Ice Tomb'
+UPDATE `creature_model_info` SET `BoundingRadius`=7.5, `CombatReach`=6 WHERE `DisplayID`=30890;
diff --git a/sql/updates/world/3.3.5/2016_05_26_03_world.sql b/sql/updates/world/3.3.5/2016_05_26_03_world.sql
new file mode 100644
index 00000000000..f3a419e9bd0
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_05_26_03_world.sql
@@ -0,0 +1,21 @@
+-- Pathing for Clam Master K Entry: 25800 'TDB FORMAT'
+SET @NPC := 114803;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=2342.325,`position_y`=5050.552,`position_z`=-21.01424 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,2342.325,5050.552,-21.01424,0,0,0,0,100,0), -- 06:32:15
+(@PATH,2,2338.003,5044.308,-22.64446,0,0,0,0,100,0), -- 06:32:22
+(@PATH,3,2336.804,5029.821,-26.94789,0,0,0,0,100,0), -- 06:32:27
+(@PATH,4,2341.884,5018.865,-30.1459,0,0,0,0,100,0), -- 06:32:33
+(@PATH,5,2348.352,5002.221,-30.94783,0,0,0,0,100,0), -- 06:32:40
+(@PATH,6,2349.925,4993.154,-32.16956,0,0,0,0,100,0), -- 06:32:45
+(@PATH,7,2354.025,4983.295,-33.4639,0,0,0,0,100,0), -- 06:32:50
+(@PATH,8,2357.896,4977.057,-33.84595,0,0,0,0,100,0), -- 06:32:53
+(@PATH,9,2353.561,4983.914,-33.77616,0,0,0,0,100,0), -- 06:33:00
+(@PATH,10,2349.806,4994.94,-31.05927,0,0,0,0,100,0), -- 06:33:04
+(@PATH,11,2346.473,5009.516,-31.52969,0,0,0,0,100,0), -- 06:33:08
+(@PATH,12,2338.316,5025.714,-28.18582,0,0,0,0,100,0), -- 06:33:13
+(@PATH,13,2334.683,5038.239,-23.58451,0,0,0,0,100,0); -- 06:33:20
diff --git a/sql/updates/world/3.3.5/2016_05_26_04_world.sql b/sql/updates/world/3.3.5/2016_05_26_04_world.sql
new file mode 100644
index 00000000000..00ae15af434
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_05_26_04_world.sql
@@ -0,0 +1,27 @@
+-- Pathing for Houndmaster Grebmar Entry: 9319 'TDB FORMAT'
+SET @NPC := 46284;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=594.4585,`position_y`=-178.3237,`position_z`=-84.23994 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,594.4585,-178.3237,-84.23994,0,0,0,0,100,0),
+(@PATH,2,598.2085,-180.3237,-84.23994,0,0,0,0,100,0),
+(@PATH,3,601.2085,-182.3237,-84.23994,0,0,0,0,100,0),
+(@PATH,4,605.1209,-184.6363,-84.23941,0,0,0,0,100,0),
+(@PATH,5,608.8709,-188.1363,-84.23941,0,0,0,0,100,0),
+(@PATH,6,612.06,-191.0042,-84.23634,0,0,0,0,100,0),
+(@PATH,7,611.81,-184.0042,-84.23634,0,0,0,0,100,0),
+(@PATH,8,611.5181,-178.7817,-84.23982,0,0,0,0,100,0),
+(@PATH,9,606.7681,-173.7817,-84.23982,0,0,0,0,100,0),
+(@PATH,10,601.315,-167.8244,-84.23912,0,0,0,0,100,0),
+(@PATH,11,594.565,-168.8244,-84.23912,0,0,0,0,100,0),
+(@PATH,12,585.8881,-169.7204,-84.24162,0,0,0,0,100,0),
+(@PATH,13,582.8881,-176.2204,-84.24162,0,0,0,0,100,0),
+(@PATH,14,579.5485,-182.8368,-84.24379,0,0,0,0,100,0),
+(@PATH,15,583.2985,-189.3368,-84.24379,0,0,0,0,100,0),
+(@PATH,16,586.8497,-196.4224,-84.24238,0,0,0,0,100,0),
+(@PATH,17,587.5997,-187.1724,-84.24238,0,0,0,0,100,0),
+(@PATH,18,591.6155,-181.6407,-84.24092,0,0,0,0,100,0),
+(@PATH,19,594.4585,-178.3237,-84.23994,0,0,0,0,100,0);
diff --git a/sql/updates/world/3.3.5/2016_05_26_05_world.sql b/sql/updates/world/3.3.5/2016_05_26_05_world.sql
new file mode 100644
index 00000000000..192ea0893d3
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_05_26_05_world.sql
@@ -0,0 +1,3 @@
+-- DB/Creature: Add flag guard Deathguard Elite
+-- creature is a guard (Will ignore feign death and vanish)
+UPDATE `creature_template` SET `flags_extra`=32768 WHERE `entry`=7980;
diff --git a/sql/updates/world/3.3.5/2016_05_26_06_world_335.sql b/sql/updates/world/3.3.5/2016_05_26_06_world_335.sql
new file mode 100644
index 00000000000..0b8903f527d
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_05_26_06_world_335.sql
@@ -0,0 +1,5 @@
+-- Anvilrage Overseer SAI (3.3.5 Only)
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=8889;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=8889 AND `source_type`=0;
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(8889, 0, 0, 0, 0, 0, 100, 2, 4000, 6000, 7000, 9000, 11, 15580, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Anvilrage Overseer - In Combat - Cast \'Strike\' (Normal Dungeon)');
diff --git a/sql/updates/world/3.3.5/2016_05_26_07_world.sql b/sql/updates/world/3.3.5/2016_05_26_07_world.sql
new file mode 100644
index 00000000000..0749f080581
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_05_26_07_world.sql
@@ -0,0 +1,5 @@
+-- DB/Creature: Add missing Ornery Plainstrider SAI
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=3245;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=3245 AND `source_type`=0;
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(3245, 0, 0, 0, 2, 0, 100, 1, 0, 40, 0, 0, 11, 3019, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ornery Plainstrider - Between 0-40% Health - Cast \'Frenzy\' (No Repeat)');
diff --git a/sql/updates/world/3.3.5/2016_05_26_08_world.sql b/sql/updates/world/3.3.5/2016_05_26_08_world.sql
new file mode 100644
index 00000000000..af1d7a3d515
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_05_26_08_world.sql
@@ -0,0 +1 @@
+UPDATE `quest_offer_reward` SET `RewardText`= "I can't believe it! It was the gnome all along... I should have known!" WHERE `id` = 9531;
diff --git a/sql/updates/world/3.3.5/2016_05_26_09_world.sql b/sql/updates/world/3.3.5/2016_05_26_09_world.sql
new file mode 100644
index 00000000000..0ad751a01d4
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_05_26_09_world.sql
@@ -0,0 +1,14 @@
+-- Mebok Mizzyrix, NPC entry 3446
+SET @ENTRY := 3446;
+
+DELETE FROM `creature_text` WHERE `entry`= @ENTRY;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES
+(@ENTRY,0,0,"Now let's try it...", 12,0,100, 7,0,0,2078,0,'Mebok Mizzyrix on Quest 865 rewarded'),
+(@ENTRY,1,0,"Ugh! That's terrible!",12,0,100,33,0,0,2079,0,'Mebok Mizzyrix on Quest 865 rewarded');
+
+UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry`= @ENTRY;
+
+DELETE FROM `smart_scripts` WHERE `source_type`= 0 AND `entryorguid`= @ENTRY;
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(@ENTRY,0,0,1,20,0,100,0,865,0,0,0,1,0,4000,0,0,0,0,1,0,0,0,0,0,0,0,'Mebok Mizzyrix - on Quest 865 Rewarded - Say Line 0'),
+(@ENTRY,0,1,0,61,0,100,0, 0,0,0,0,1,1,4000,0,0,0,0,1,0,0,0,0,0,0,0,'Mebok Mizzyrix - on Quest 865 Rewarded - Say Line 1');
diff --git a/src/common/Utilities/Containers.h b/src/common/Utilities/Containers.h
index 0f83b52f9d0..5edb245fd87 100644
--- a/src/common/Utilities/Containers.h
+++ b/src/common/Utilities/Containers.h
@@ -31,9 +31,9 @@ namespace Trinity
namespace Containers
{
template<class T>
- void RandomResizeList(std::list<T> &list, uint32 size)
+ void RandomResizeList(std::list<T>& list, uint32 size)
{
- size_t list_size = list.size();
+ uint32 list_size = uint32(list.size());
while (list_size > size)
{
@@ -56,7 +56,7 @@ namespace Trinity
if (size)
RandomResizeList(listCopy, size);
- list = listCopy;
+ list = std::move(listCopy);
}
/*
@@ -68,7 +68,7 @@ namespace Trinity
typename C::value_type const& SelectRandomContainerElement(C const& container)
{
typename C::const_iterator it = container.begin();
- std::advance(it, urand(0, container.size() - 1));
+ std::advance(it, urand(0, uint32(container.size()) - 1));
return *it;
}
@@ -170,7 +170,6 @@ namespace Trinity
++itr;
}
}
-
}
//! namespace Containers
}
diff --git a/src/server/database/Database/Implementation/WorldDatabase.cpp b/src/server/database/Database/Implementation/WorldDatabase.cpp
index 7a183d5bf78..83720c1a996 100644
--- a/src/server/database/Database/Implementation/WorldDatabase.cpp
+++ b/src/server/database/Database/Implementation/WorldDatabase.cpp
@@ -30,8 +30,8 @@ void WorldDatabaseConnection::DoPrepareStatements()
PrepareStatement(WORLD_SEL_SMARTAI_WP, "SELECT entry, pointid, position_x, position_y, position_z FROM waypoints ORDER BY entry, pointid", CONNECTION_SYNCH);
PrepareStatement(WORLD_DEL_GAMEOBJECT, "DELETE FROM gameobject WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(WORLD_DEL_EVENT_GAMEOBJECT, "DELETE FROM game_event_gameobject WHERE guid = ?", CONNECTION_ASYNC);
- PrepareStatement(WORLD_INS_GRAVEYARD_ZONE, "INSERT INTO game_graveyard_zone (id, ghost_zone, faction) VALUES (?, ?, ?)", CONNECTION_ASYNC);
- PrepareStatement(WORLD_DEL_GRAVEYARD_ZONE, "DELETE FROM game_graveyard_zone WHERE id = ? AND ghost_zone = ? AND faction = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_INS_GRAVEYARD_ZONE, "INSERT INTO graveyard_zone (ID, GhostZone, Faction) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_GRAVEYARD_ZONE, "DELETE FROM graveyard_zone WHERE ID = ? AND GhostZone = ? AND Faction = ?", CONNECTION_ASYNC);
PrepareStatement(WORLD_INS_GAME_TELE, "INSERT INTO game_tele (id, position_x, position_y, position_z, orientation, map, name) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(WORLD_DEL_GAME_TELE, "DELETE FROM game_tele WHERE name = ?", CONNECTION_ASYNC);
PrepareStatement(WORLD_INS_NPC_VENDOR, "INSERT INTO npc_vendor (entry, item, maxcount, incrtime, extendedcost) VALUES(?, ?, ?, ?, ?)", CONNECTION_ASYNC);
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
index 8c088e4da19..6475cc8117e 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
@@ -547,7 +547,7 @@ void BossAI::UpdateAI(uint32 diff)
DoMeleeAttackIfReady();
}
-void BossAI::_DespawnAtEvade(uint32 delayToRespawn)
+void BossAI::_DespawnAtEvade(uint32 delayToRespawn, Creature* who)
{
if (delayToRespawn < 2)
{
@@ -555,18 +555,28 @@ void BossAI::_DespawnAtEvade(uint32 delayToRespawn)
delayToRespawn = 2;
}
- uint32 corpseDelay = me->GetCorpseDelay();
- uint32 respawnDelay = me->GetRespawnDelay();
+ if (!who)
+ who = me;
- me->SetCorpseDelay(1);
- me->SetRespawnDelay(delayToRespawn - 1);
+ if (TempSummon* whoSummon = who->ToTempSummon())
+ {
+ TC_LOG_WARN("scripts", "_DespawnAtEvade called on a temporary summon.");
+ whoSummon->UnSummon();
+ return;
+ }
- me->DespawnOrUnsummon();
+ uint32 corpseDelay = who->GetCorpseDelay();
+ uint32 respawnDelay = who->GetRespawnDelay();
- me->SetCorpseDelay(corpseDelay);
- me->SetRespawnDelay(respawnDelay);
+ who->SetCorpseDelay(1);
+ who->SetRespawnDelay(delayToRespawn - 1);
- if (instance)
+ who->DespawnOrUnsummon();
+
+ who->SetCorpseDelay(corpseDelay);
+ who->SetRespawnDelay(respawnDelay);
+
+ if (instance && who == me)
instance->SetBossState(_bossId, FAIL);
}
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h
index 58a0253e46b..6144a4e5203 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h
@@ -367,7 +367,7 @@ class TC_GAME_API BossAI : public ScriptedAI
void _EnterCombat();
void _JustDied();
void _JustReachedHome() { me->setActive(false); }
- void _DespawnAtEvade(uint32 delayToRespawn = 30);
+ void _DespawnAtEvade(uint32 delayToRespawn = 30, Creature* who = nullptr);
void TeleportCheaters();
diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
index fa80634e0f0..1b8b472b805 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
@@ -72,7 +72,7 @@ bool npc_escortAI::AssistPlayerInCombat(Unit* who)
return false;
//experimental (unknown) flag not present
- if (!(me->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_AID_PLAYERS))
+ if (!(me->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST))
return false;
//not a player
diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
index 778edf8cab5..bd07e688fb0 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
@@ -69,7 +69,7 @@ bool FollowerAI::AssistPlayerInCombat(Unit* who)
return false;
//experimental (unknown) flag not present
- if (!(me->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_AID_PLAYERS))
+ if (!(me->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST))
return false;
//not a player
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index 60df4fe6d5a..e21f59fe582 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -468,7 +468,7 @@ bool SmartAI::AssistPlayerInCombat(Unit* who)
return false;
//experimental (unknown) flag not present
- if (!(me->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_AID_PLAYERS))
+ if (!(me->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST))
return false;
//not a player
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h
index 9dd56ec8180..d1d418b0931 100644
--- a/src/server/game/Accounts/RBAC.h
+++ b/src/server/game/Accounts/RBAC.h
@@ -540,7 +540,7 @@ enum RBACPermissions
RBAC_PERM_COMMAND_RELOAD_DISENCHANT_LOOT_TEMPLATE = 642,
RBAC_PERM_COMMAND_RELOAD_EVENT_SCRIPTS = 643,
RBAC_PERM_COMMAND_RELOAD_FISHING_LOOT_TEMPLATE = 644,
- RBAC_PERM_COMMAND_RELOAD_GAME_GRAVEYARD_ZONE = 645,
+ RBAC_PERM_COMMAND_RELOAD_GRAVEYARD_ZONE = 645,
RBAC_PERM_COMMAND_RELOAD_GAME_TELE = 646,
RBAC_PERM_COMMAND_RELOAD_GAMEOBJECT_QUESTENDER = 647,
RBAC_PERM_COMMAND_RELOAD_GAMEOBJECT_QUEST_LOOT_TEMPLATE = 648,
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index afb6255079b..74e94135b86 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -738,7 +738,7 @@ bool ConditionMgr::IsObjectMeetToConditionList(ConditionSourceInfo& sourceInfo,
//! If not found, add an entry in the store and set to true (placeholder)
if (itr == elseGroupStore.end())
elseGroupStore[condition->ElseGroup] = true;
- else if (!(*itr).second)
+ else if (!(*itr).second) //! If another condition in this group was unmatched before this, don't bother checking (the group is false anyway)
continue;
if (condition->ReferenceId)//handle reference
diff --git a/src/server/game/DataStores/M2Stores.cpp b/src/server/game/DataStores/M2Stores.cpp
index 5cff66e6107..69581f16549 100644
--- a/src/server/game/DataStores/M2Stores.cpp
+++ b/src/server/game/DataStores/M2Stores.cpp
@@ -193,7 +193,7 @@ void LoadM2Cameras(std::string const& dataPath)
{
if (CinematicCameraEntry const* dbcentry = sCinematicCameraStore.LookupEntry(i))
{
- std::string filenameWork = dataPath.c_str();
+ std::string filenameWork = dataPath;
filenameWork.append(dbcentry->Model);
// Replace slashes (always to forward slash, because boost!)
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 450cf2396a8..22e917448c3 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -1823,7 +1823,7 @@ bool Creature::isWorldBoss() const
if (IsPet())
return false;
- return (GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_BOSS) != 0;
+ return (GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_BOSS_MOB) != 0;
}
SpellInfo const* Creature::reachWithSpellAttack(Unit* victim)
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 97b7b86d4b9..cc0e0559d28 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -146,11 +146,11 @@ struct TC_GAME_API CreatureTemplate
// helpers
SkillType GetRequiredLootSkill() const
{
- if (type_flags & CREATURE_TYPEFLAGS_HERBLOOT)
+ if (type_flags & CREATURE_TYPE_FLAG_HERB_SKINNING_SKILL)
return SKILL_HERBALISM;
- else if (type_flags & CREATURE_TYPEFLAGS_MININGLOOT)
+ else if (type_flags & CREATURE_TYPE_FLAG_MINING_SKINNING_SKILL)
return SKILL_MINING;
- else if (type_flags & CREATURE_TYPEFLAGS_ENGINEERLOOT)
+ else if (type_flags & CREATURE_TYPE_FLAG_ENGINEERING_SKINNING_SKILL)
return SKILL_ENGINEERING;
else
return SKILL_SKINNING; // normal case
@@ -158,12 +158,12 @@ struct TC_GAME_API CreatureTemplate
bool IsExotic() const
{
- return (type_flags & CREATURE_TYPEFLAGS_EXOTIC) != 0;
+ return (type_flags & CREATURE_TYPE_FLAG_EXOTIC_PET) != 0;
}
bool IsTameable(bool canTameExotic) const
{
- if (type != CREATURE_TYPE_BEAST || family == CREATURE_FAMILY_NONE || (type_flags & CREATURE_TYPEFLAGS_TAMEABLE) == 0)
+ if (type != CREATURE_TYPE_BEAST || family == CREATURE_FAMILY_NONE || (type_flags & CREATURE_TYPE_FLAG_TAMEABLE_PET) == 0)
return false;
// if can tame exotic then can tame any tameable
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index a2f519a681c..daad0c9d958 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -1154,9 +1154,13 @@ bool WorldObject::IsWithinLOSInMap(const WorldObject* obj) const
if (!IsInMap(obj))
return false;
- float ox, oy, oz;
- obj->GetPosition(ox, oy, oz);
- return IsWithinLOS(ox, oy, oz);
+ float x, y, z;
+ if (obj->GetTypeId() == TYPEID_PLAYER)
+ obj->GetPosition(x, y, z);
+ else
+ obj->GetHitSpherePointFor(GetPosition(), x, y, z);
+
+ return IsWithinLOS(x, y, z);
}
float WorldObject::GetDistance(const WorldObject* obj) const
@@ -1240,11 +1244,36 @@ bool WorldObject::IsWithinLOS(float ox, float oy, float oz) const
VMAP::IVMapManager* vMapManager = VMAP::VMapFactory::createOrGetVMapManager();
return vMapManager->isInLineOfSight(GetMapId(), x, y, z+2.0f, ox, oy, oz+2.0f);*/
if (IsInWorld())
- return GetMap()->isInLineOfSight(GetPositionX(), GetPositionY(), GetPositionZ()+2.f, ox, oy, oz+2.f, GetPhaseMask());
+ {
+ float x, y, z;
+ if (GetTypeId() == TYPEID_PLAYER)
+ GetPosition(x, y, z);
+ else
+ GetHitSpherePointFor({ ox, oy, oz }, x, y, z);
+
+ return GetMap()->isInLineOfSight(x, y, z + 2.0f, ox, oy, oz + 2.0f, GetPhaseMask());
+ }
return true;
}
+Position WorldObject::GetHitSpherePointFor(Position const& dest) const
+{
+ G3D::Vector3 vThis(GetPositionX(), GetPositionY(), GetPositionZ());
+ G3D::Vector3 vObj(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ());
+ G3D::Vector3 contactPoint = vThis + (vObj - vThis).directionOrZero() * GetObjectSize();
+
+ return Position(contactPoint.x, contactPoint.y, contactPoint.z, GetAngle(contactPoint.x, contactPoint.y));
+}
+
+void WorldObject::GetHitSpherePointFor(Position const& dest, float& x, float& y, float& z) const
+{
+ Position pos = GetHitSpherePointFor(dest);
+ x = pos.GetPositionX();
+ y = pos.GetPositionY();
+ z = pos.GetPositionZ();
+}
+
bool WorldObject::GetDistanceOrder(WorldObject const* obj1, WorldObject const* obj2, bool is3D /* = true */) const
{
float dx1 = GetPositionX() - obj1->GetPositionX();
@@ -2038,7 +2067,10 @@ void WorldObject::SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list
std::vector<TempSummonData> const* data = sObjectMgr->GetSummonGroup(GetEntry(), GetTypeId() == TYPEID_GAMEOBJECT ? SUMMONER_TYPE_GAMEOBJECT : SUMMONER_TYPE_CREATURE, group);
if (!data)
+ {
+ TC_LOG_WARN("scripts", "%s (%s) tried to summon non-existing summon group %u.", GetName().c_str(), GetGUID().ToString().c_str(), group);
return;
+ }
for (std::vector<TempSummonData>::const_iterator itr = data->begin(); itr != data->end(); ++itr)
if (TempSummon* summon = SummonCreature(itr->entry, itr->pos, itr->type, itr->time))
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 5c8a84453c3..47b28d8ea3a 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -488,6 +488,8 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
bool IsWithinDistInMap(WorldObject const* obj, float dist2compare, bool is3D = true) const;
bool IsWithinLOS(float x, float y, float z) const;
bool IsWithinLOSInMap(WorldObject const* obj) const;
+ Position GetHitSpherePointFor(Position const& dest) const;
+ void GetHitSpherePointFor(Position const& dest, float& x, float& y, float& z) const;
bool GetDistanceOrder(WorldObject const* obj1, WorldObject const* obj2, bool is3D = true) const;
bool IsInRange(WorldObject const* obj, float minRange, float maxRange, bool is3D = true) const;
bool IsInRange2d(float x, float y, float minRange, float maxRange) const;
diff --git a/src/server/game/Entities/Player/CinematicMgr.cpp b/src/server/game/Entities/Player/CinematicMgr.cpp
index 07bf733c9ff..cc5a62300ad 100644
--- a/src/server/game/Entities/Player/CinematicMgr.cpp
+++ b/src/server/game/Entities/Player/CinematicMgr.cpp
@@ -27,6 +27,7 @@ CinematicMgr::CinematicMgr(Player* playerref)
m_cinematicDiff = 0;
m_lastCinematicCheck = 0;
m_activeCinematicCameraId = 0;
+ m_cinematicLength = 0;
m_cinematicCamera = nullptr;
m_remoteSightPosition = Position(0.0f, 0.0f, 0.0f);
m_CinematicObject = nullptr;
@@ -70,6 +71,8 @@ void CinematicMgr::BeginCinematic()
FlyByCameraCollection::const_reverse_iterator camrevitr = m_cinematicCamera->rbegin();
if (camrevitr != m_cinematicCamera->rend())
m_cinematicLength = camrevitr->timeStamp;
+ else
+ m_cinematicLength = 0;
}
}
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index ad53c750de6..586491e31be 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -567,6 +567,7 @@ Player::~Player()
delete m_runes;
delete m_achievementMgr;
delete m_reputationMgr;
+ delete _cinematicMgr;
sWorld->DecreasePlayerCount();
}
@@ -2418,11 +2419,11 @@ Creature* Player::GetNPCIfCanInteractWith(ObjectGuid const& guid, uint32 npcflag
return nullptr;
// Deathstate checks
- if (!IsAlive() && !(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_GHOST))
+ if (!IsAlive() && !(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_GHOST_VISIBLE))
return nullptr;
// alive or spirit healer
- if (!creature->IsAlive() && !(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_DEAD_INTERACT))
+ if (!creature->IsAlive() && !(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_INTERACT_WHILE_DEAD))
return nullptr;
// appropriate npc type
@@ -4940,6 +4941,9 @@ void Player::DurabilityPointsLossAll(int32 points, bool inventory)
void Player::DurabilityPointsLoss(Item* item, int32 points)
{
+ if (HasAuraType(SPELL_AURA_PREVENT_DURABILITY_LOSS))
+ return;
+
int32 pMaxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
int32 pOldDurability = item->GetUInt32Value(ITEM_FIELD_DURABILITY);
int32 pNewDurability = pOldDurability - points;
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 372a49b4f9d..6a38cd3b9fe 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1596,7 +1596,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void AddSpellMod(SpellModifier* mod, bool apply);
bool IsAffectedBySpellmod(SpellInfo const* spellInfo, SpellModifier* mod, Spell* spell = nullptr) const;
- template <class T> T ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell* spell = nullptr);
+ template <class T>
+ void ApplySpellMod(uint32 spellId, SpellModOp op, T& basevalue, Spell* spell = nullptr);
void RemoveSpellMods(Spell* spell);
void RestoreSpellMods(Spell* spell, uint32 ownerAuraId = 0, Aura* aura = nullptr);
void RestoreAllSpellMods(uint32 ownerAuraId = 0, Aura* aura = nullptr);
@@ -2604,11 +2605,13 @@ TC_GAME_API void AddItemsSetItem(Player* player, Item* item);
TC_GAME_API void RemoveItemsSetItem(Player* player, ItemTemplate const* proto);
// "the bodies of template functions must be made available in a header file"
-template <class T> T Player::ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell* spell)
+template <class T>
+void Player::ApplySpellMod(uint32 spellId, SpellModOp op, T& basevalue, Spell* spell /*= nullptr*/)
{
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
if (!spellInfo)
- return 0;
+ return;
+
float totalmul = 1.0f;
int32 totalflat = 0;
@@ -2644,9 +2647,8 @@ template <class T> T Player::ApplySpellMod(uint32 spellId, SpellModOp op, T &bas
DropModCharge(mod, spell);
}
- float diff = (float)basevalue * (totalmul - 1.0f) + (float)totalflat;
- basevalue = T((float)basevalue + diff);
- return T(diff);
+
+ basevalue = T(float(basevalue + totalflat) * totalmul);
}
#endif
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index ee815f199bd..9afc2987319 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -599,11 +599,14 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam
if (victim->GetTypeId() == TYPEID_PLAYER && this != victim)
{
- // Signal to pets that their owner was attacked
- Pet* pet = victim->ToPlayer()->GetPet();
+ // Signal to pets that their owner was attacked - except when DOT.
+ if (damagetype != DOT)
+ {
+ Pet* pet = victim->ToPlayer()->GetPet();
- if (pet && pet->IsAlive())
- pet->AI()->OwnerAttackedBy(this);
+ if (pet && pet->IsAlive())
+ pet->AI()->OwnerAttackedBy(this);
+ }
if (victim->ToPlayer()->GetCommandStatus(CHEAT_GOD))
return 0;
@@ -3189,6 +3192,15 @@ int32 Unit::GetCurrentSpellCastTime(uint32 spell_id) const
return 0;
}
+bool Unit::CanMoveDuringChannel() const
+{
+ if (Spell* spell = m_currentSpells[CURRENT_CHANNELED_SPELL])
+ if (spell->getState() != SPELL_STATE_FINISHED)
+ return spell->GetSpellInfo()->HasAttribute(SPELL_ATTR5_CAN_CHANNEL_WHEN_MOVING) && spell->IsChannelActive();
+
+ return false;
+}
+
bool Unit::isInFrontInMap(Unit const* target, float distance, float arc) const
{
return IsWithinDistInMap(target, distance) && HasInArc(arc, target);
@@ -5287,7 +5299,7 @@ void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 /*SwingType
}
//victim may be NULL
-bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown)
+bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, Milliseconds& cooldown)
{
SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
uint32 effIndex = triggeredByAura->GetEffIndex();
@@ -5297,8 +5309,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : NULL;
uint32 triggered_spell_id = 0;
- uint32 cooldown_spell_id = 0; // for random trigger, will be one of the triggered spell to avoid repeatable triggers
- // otherwise, it's the triggered_spell_id by default
Unit* target = victim;
int32 basepoints0 = 0;
ObjectGuid originalCaster;
@@ -5374,24 +5384,20 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
case CLASS_PALADIN: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
case CLASS_DRUID: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
triggered_spell_id = RAND(39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409);
- cooldown_spell_id = 39511;
break;
case CLASS_ROGUE: // 39511, 40997, 40998, 41002, 41005, 41011
case CLASS_WARRIOR: // 39511, 40997, 40998, 41002, 41005, 41011
case CLASS_DEATH_KNIGHT:
triggered_spell_id = RAND(39511, 40997, 40998, 41002, 41005, 41011);
- cooldown_spell_id = 39511;
break;
case CLASS_PRIEST: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
case CLASS_SHAMAN: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
case CLASS_MAGE: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
case CLASS_WARLOCK: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
triggered_spell_id = RAND(40999, 41002, 41005, 41009, 41011, 41406, 41409);
- cooldown_spell_id = 40999;
break;
case CLASS_HUNTER: // 40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409
triggered_spell_id = RAND(40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409);
- cooldown_spell_id = 40997;
break;
default:
return false;
@@ -5621,11 +5627,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
uint8 rand_spell = urand(0, (RandomSpells.size() - 1));
CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
- for (std::vector<uint32>::iterator itr = RandomSpells.begin(); itr != RandomSpells.end(); ++itr)
- {
- if (!GetSpellHistory()->HasCooldown(*itr))
- GetSpellHistory()->AddCooldown(*itr, 0, std::chrono::seconds(cooldown));
- }
break;
}
case 71562: // Deathbringer's Will Heroic
@@ -5667,11 +5668,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
uint8 rand_spell = urand(0, (RandomSpells.size() - 1));
CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
- for (std::vector<uint32>::iterator itr = RandomSpells.begin(); itr != RandomSpells.end(); ++itr)
- {
- if (!GetSpellHistory()->HasCooldown(*itr))
- GetSpellHistory()->AddCooldown(*itr, 0, std::chrono::seconds(cooldown));
- }
break;
}
case 65032: // Boom aura (321 Boombot)
@@ -6309,24 +6305,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
return true;
}
}
- // Eclipse
- if (dummySpell->SpellIconID == 2856 && GetTypeId() == TYPEID_PLAYER)
- {
- if (!procSpell || effIndex != 0)
- return false;
-
- bool isWrathSpell = (procSpell->SpellFamilyFlags[0] & 1);
-
- if (!roll_chance_f(dummySpell->ProcChance * (isWrathSpell ? 0.6f : 1.0f)))
- return false;
-
- target = this;
- if (target->HasAura(isWrathSpell ? 48517 : 48518))
- return false;
-
- triggered_spell_id = isWrathSpell ? 48518 : 48517;
- break;
- }
break;
}
case SPELLFAMILY_ROGUE:
@@ -6507,7 +6485,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
// Item - Paladin T8 Holy 4P Bonus
if (Unit* caster = triggeredByAura->GetCaster())
if (AuraEffect const* aurEff = caster->GetAuraEffect(64895, 0))
- cooldown = aurEff->GetAmount();
+ cooldown = Milliseconds(aurEff->GetAmount());
target = this;
break;
@@ -6822,10 +6800,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
if (!player || !castItem || !castItem->IsEquipped() || !victim || !victim->IsAlive())
return false;
- // custom cooldown processing case
- if (cooldown && GetSpellHistory()->HasCooldown(dummySpell->Id))
- return false;
-
if (triggeredByAura->GetBase() && castItem->GetGUID() != triggeredByAura->GetBase()->GetCastItemGUID())
return false;
@@ -6888,8 +6862,8 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
triggered_spell_id = 33750;
// apply cooldown before cast to prevent processing itself
- if (cooldown)
- player->GetSpellHistory()->AddCooldown(dummySpell->Id, 0, std::chrono::seconds(cooldown));
+ triggeredByAura->GetBase()->AddProcCooldown(std::chrono::steady_clock::now() + cooldown);
+ cooldown = Milliseconds::zero();
// Attack Twice
for (uint32 i = 0; i < 2; ++i)
@@ -7132,10 +7106,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
if (!procSpell || GetTypeId() != TYPEID_PLAYER || !victim)
return false;
- // custom cooldown processing case
- if (cooldown && GetTypeId() == TYPEID_PLAYER && GetSpellHistory()->HasCooldown(dummySpell->Id))
- return false;
-
uint32 spellId = 0;
// Every Lightning Bolt and Chain Lightning spell have duplicate vs half damage and zero cost
switch (procSpell->Id)
@@ -7181,10 +7151,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
}
CastSpell(victim, spellId, true, castItem, triggeredByAura);
-
- if (cooldown && GetTypeId() == TYPEID_PLAYER)
- GetSpellHistory()->AddCooldown(dummySpell->Id, 0, std::chrono::seconds(cooldown));
-
return true;
}
// Static Shock
@@ -7486,26 +7452,17 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
return false;
}
- if (cooldown_spell_id == 0)
- cooldown_spell_id = triggered_spell_id;
-
- if (cooldown && GetTypeId() == TYPEID_PLAYER && GetSpellHistory()->HasCooldown(cooldown_spell_id))
- return false;
-
if (basepoints0)
CastCustomSpell(target, triggered_spell_id, &basepoints0, NULL, NULL, true, castItem, triggeredByAura, originalCaster);
else
CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
- if (cooldown && GetTypeId() == TYPEID_PLAYER)
- GetSpellHistory()->AddCooldown(cooldown_spell_id, 0, std::chrono::seconds(cooldown));
-
return true;
}
// Used in case when access to whole aura is needed
// All procs should be handled like this...
-bool Unit::HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, SpellInfo const* procSpell, uint32 /*procFlag*/, uint32 procEx, uint32 cooldown, bool * handled)
+bool Unit::HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, SpellInfo const* procSpell, uint32 /*procFlag*/, uint32 procEx, bool* handled)
{
SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
@@ -7717,12 +7674,6 @@ bool Unit::HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, Sp
case 49222:
{
*handled = true;
- if (cooldown && GetTypeId() == TYPEID_PLAYER)
- {
- if (GetSpellHistory()->HasCooldown(100000))
- return false;
- GetSpellHistory()->AddCooldown(100000, 0, std::chrono::seconds(cooldown));
- }
return true;
}
// Hungering Cold aura drop
@@ -7765,7 +7716,7 @@ bool Unit::HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, Sp
return false;
}
-bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlags, uint32 procEx, uint32 cooldown)
+bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx)
{
// Get triggered aura spell info
SpellInfo const* auraSpellInfo = triggeredByAura->GetSpellInfo();
@@ -7791,95 +7742,6 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
{
switch (auraSpellInfo->SpellFamilyName)
{
- case SPELLFAMILY_GENERIC:
- switch (auraSpellInfo->Id)
- {
- case 43820: // Charm of the Witch Doctor (Amani Charm of the Witch Doctor trinket)
- // Pct value stored in dummy
- basepoints0 = victim->GetCreateHealth() * auraSpellInfo->Effects[1].CalcValue() / 100;
- target = victim;
- break;
- case 57345: // Darkmoon Card: Greatness
- {
- float stat = 0.0f;
- // strength
- if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 60229;stat = GetStat(STAT_STRENGTH); }
- // agility
- if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 60233;stat = GetStat(STAT_AGILITY); }
- // intellect
- if (GetStat(STAT_INTELLECT)> stat) { trigger_spell_id = 60234;stat = GetStat(STAT_INTELLECT);}
- // spirit
- if (GetStat(STAT_SPIRIT) > stat) { trigger_spell_id = 60235; }
- break;
- }
- case 64568: // Blood Reserve
- {
- if (HealthBelowPctDamaged(35, damage))
- {
- CastCustomSpell(this, 64569, &triggerAmount, NULL, NULL, true);
- RemoveAura(64568);
- }
- return false;
- }
- case 67702: // Death's Choice, Item - Coliseum 25 Normal Melee Trinket
- {
- float stat = 0.0f;
- // strength
- if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67708;stat = GetStat(STAT_STRENGTH); }
- // agility
- if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67703; }
- break;
- }
- case 67771: // Death's Choice (heroic), Item - Coliseum 25 Heroic Melee Trinket
- {
- float stat = 0.0f;
- // strength
- if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67773;stat = GetStat(STAT_STRENGTH); }
- // agility
- if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67772; }
- break;
- }
- // Mana Drain Trigger
- case 27522:
- case 40336:
- {
- // On successful melee or ranged attack gain $29471s1 mana and if possible drain $27526s1 mana from the target.
- if (IsAlive())
- CastSpell(this, 29471, true, castItem, triggeredByAura);
- if (victim && victim->IsAlive())
- CastSpell(victim, 27526, true, castItem, triggeredByAura);
- return true;
- }
- // Evasive Maneuvers
- case 50240:
- {
- // Remove a Evasive Charge
- Aura* charge = GetAura(50241);
- if (charge && charge->ModStackAmount(-1, AURA_REMOVE_BY_ENEMY_SPELL))
- RemoveAurasDueToSpell(50240);
- break;
- }
- // Battle Experience
- // already handled in gunship battle script
- case 71201:
- return false;
- }
- break;
- case SPELLFAMILY_MAGE:
- if (auraSpellInfo->SpellIconID == 2127) // Blazing Speed
- {
- switch (auraSpellInfo->Id)
- {
- case 31641: // Rank 1
- case 31642: // Rank 2
- trigger_spell_id = 31643;
- break;
- default:
- TC_LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell %u miss posibly Blazing Speed", auraSpellInfo->Id);
- return false;
- }
- }
- break;
case SPELLFAMILY_WARLOCK:
{
// Drain Soul
@@ -7902,325 +7764,6 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
// Need for correct work Drain Soul SPELL_AURA_CHANNEL_DEATH_ITEM aura
return false;
}
- // Nether Protection
- else if (auraSpellInfo->SpellIconID == 1985)
- {
- if (!procSpell)
- return false;
- switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
- {
- case SPELL_SCHOOL_NORMAL:
- return false; // ignore
- case SPELL_SCHOOL_HOLY: trigger_spell_id = 54370; break;
- case SPELL_SCHOOL_FIRE: trigger_spell_id = 54371; break;
- case SPELL_SCHOOL_NATURE: trigger_spell_id = 54375; break;
- case SPELL_SCHOOL_FROST: trigger_spell_id = 54372; break;
- case SPELL_SCHOOL_SHADOW: trigger_spell_id = 54374; break;
- case SPELL_SCHOOL_ARCANE: trigger_spell_id = 54373; break;
- default:
- return false;
- }
- }
- break;
- }
- case SPELLFAMILY_PRIEST:
- {
- // Blessed Recovery
- if (auraSpellInfo->SpellIconID == 1875)
- {
- switch (auraSpellInfo->Id)
- {
- case 27811: trigger_spell_id = 27813; break;
- case 27815: trigger_spell_id = 27817; break;
- case 27816: trigger_spell_id = 27818; break;
- default:
- TC_LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell %u not handled in BR", auraSpellInfo->Id);
- return false;
- }
- basepoints0 = CalculatePct(int32(damage), triggerAmount) / 3;
- target = this;
- // Add remaining ticks to healing done
- basepoints0 += GetRemainingPeriodicAmount(GetGUID(), trigger_spell_id, SPELL_AURA_PERIODIC_HEAL);
- }
- break;
- }
- case SPELLFAMILY_DRUID:
- {
- switch (auraSpellInfo->Id)
- {
- // Druid Forms Trinket
- case 37336:
- {
- switch (GetShapeshiftForm())
- {
- case FORM_NONE: trigger_spell_id = 37344; break;
- case FORM_CAT: trigger_spell_id = 37341; break;
- case FORM_BEAR:
- case FORM_DIREBEAR: trigger_spell_id = 37340; break;
- case FORM_TREE: trigger_spell_id = 37342; break;
- case FORM_MOONKIN: trigger_spell_id = 37343; break;
- default:
- return false;
- }
- break;
- }
- // Druid T9 Feral Relic (Lacerate, Swipe, Mangle, and Shred)
- case 67353:
- {
- switch (GetShapeshiftForm())
- {
- case FORM_CAT: trigger_spell_id = 67355; break;
- case FORM_BEAR:
- case FORM_DIREBEAR: trigger_spell_id = 67354; break;
- default:
- return false;
- }
- break;
- }
- default:
- break;
- }
- break;
- }
- case SPELLFAMILY_HUNTER:
- {
- if (auraSpellInfo->SpellIconID == 3247) // Piercing Shots
- {
- switch (auraSpellInfo->Id)
- {
- case 53234: // Rank 1
- case 53237: // Rank 2
- case 53238: // Rank 3
- trigger_spell_id = 63468;
- break;
- default:
- TC_LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell %u miss posibly Piercing Shots", auraSpellInfo->Id);
- return false;
- }
- SpellInfo const* TriggerPS = sSpellMgr->GetSpellInfo(trigger_spell_id);
- if (!TriggerPS)
- return false;
-
- basepoints0 = CalculatePct(int32(damage), triggerAmount) / (TriggerPS->GetMaxDuration() / TriggerPS->Effects[0].Amplitude);
- basepoints0 += victim->GetRemainingPeriodicAmount(GetGUID(), trigger_spell_id, SPELL_AURA_PERIODIC_DAMAGE);
- break;
- }
- // Item - Hunter T9 4P Bonus
- if (auraSpellInfo->Id == 67151)
- {
- trigger_spell_id = 68130;
- target = this;
- break;
- }
- break;
- }
- case SPELLFAMILY_PALADIN:
- {
- switch (auraSpellInfo->Id)
- {
- // Soul Preserver
- case 60510:
- {
- switch (getClass())
- {
- case CLASS_DRUID:
- trigger_spell_id = 60512;
- break;
- case CLASS_PALADIN:
- trigger_spell_id = 60513;
- break;
- case CLASS_PRIEST:
- trigger_spell_id = 60514;
- break;
- case CLASS_SHAMAN:
- trigger_spell_id = 60515;
- break;
- }
-
- target = this;
- break;
- }
- case 37657: // Lightning Capacitor
- case 54841: // Thunder Capacitor
- case 67712: // Item - Coliseum 25 Normal Caster Trinket
- case 67758: // Item - Coliseum 25 Heroic Caster Trinket
- {
- if (!victim || !victim->IsAlive() || GetTypeId() != TYPEID_PLAYER)
- return false;
-
- uint32 stack_spell_id = 0;
- switch (auraSpellInfo->Id)
- {
- case 37657:
- stack_spell_id = 37658;
- trigger_spell_id = 37661;
- break;
- case 54841:
- stack_spell_id = 54842;
- trigger_spell_id = 54843;
- break;
- case 67712:
- stack_spell_id = 67713;
- trigger_spell_id = 67714;
- break;
- case 67758:
- stack_spell_id = 67759;
- trigger_spell_id = 67760;
- break;
- }
-
- CastSpell(this, stack_spell_id, true, NULL, triggeredByAura);
-
- Aura* dummy = GetAura(stack_spell_id);
- if (!dummy || dummy->GetStackAmount() < triggerAmount)
- return false;
-
- RemoveAurasDueToSpell(stack_spell_id);
- target = victim;
- break;
- }
- default:
- // Illumination
- if (auraSpellInfo->SpellIconID == 241)
- {
- if (!procSpell)
- return false;
- // procspell is triggered spell but we need mana cost of original cast spell
- uint32 originalSpellId = procSpell->Id;
- // Holy Shock heal
- if (procSpell->SpellFamilyFlags[1] & 0x00010000)
- {
- switch (procSpell->Id)
- {
- case 25914: originalSpellId = 20473; break;
- case 25913: originalSpellId = 20929; break;
- case 25903: originalSpellId = 20930; break;
- case 27175: originalSpellId = 27174; break;
- case 33074: originalSpellId = 33072; break;
- case 48820: originalSpellId = 48824; break;
- case 48821: originalSpellId = 48825; break;
- default:
- TC_LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell %u not handled in HShock", procSpell->Id);
- return false;
- }
- }
- SpellInfo const* originalSpell = sSpellMgr->GetSpellInfo(originalSpellId);
- if (!originalSpell)
- {
- TC_LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell %u unknown but selected as original in Illu", originalSpellId);
- return false;
- }
- // percent stored in effect 1 (class scripts) base points
- int32 cost = int32(originalSpell->ManaCost + CalculatePct(GetCreateMana(), originalSpell->ManaCostPercentage));
- basepoints0 = CalculatePct(cost, auraSpellInfo->Effects[1].CalcValue());
- trigger_spell_id = 20272;
- target = this;
- }
- break;
- }
- break;
- }
- case SPELLFAMILY_SHAMAN:
- {
- switch (auraSpellInfo->Id)
- {
- case 30881: // Nature's Guardian Rank 1
- case 30883: // Nature's Guardian Rank 2
- case 30884: // Nature's Guardian Rank 3
- case 30885: // Nature's Guardian Rank 4
- case 30886: // Nature's Guardian Rank 5
- {
- if (HealthBelowPct(30))
- {
- basepoints0 = int32(auraSpellInfo->Effects[EFFECT_0].CalcValue() * GetMaxHealth() / 100.0f);
- target = this;
- trigger_spell_id = 31616;
- /// @todo Threat part
- }
- else
- return false;
- break;
- }
- default:
- {
- // Lightning Shield (overwrite non existing triggered spell call in spell.dbc
- if (auraSpellInfo->SpellFamilyFlags[0] & 0x400)
- {
- trigger_spell_id = sSpellMgr->GetSpellWithRank(26364, auraSpellInfo->GetRank());
- }
- // Nature's Guardian
- else if (auraSpellInfo->SpellIconID == 2013)
- {
- // Check health condition - should drop to less 30% (damage deal after this!)
- if (!HealthBelowPctDamaged(30, damage))
- return false;
-
- if (victim && victim->IsAlive())
- victim->getThreatManager().modifyThreatPercent(this, -10);
-
- basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
- trigger_spell_id = 31616;
- target = this;
- }
- }
- }
- break;
- }
- case SPELLFAMILY_DEATHKNIGHT:
- {
- // Acclimation
- if (auraSpellInfo->SpellIconID == 1930)
- {
- if (!procSpell)
- return false;
- switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
- {
- case SPELL_SCHOOL_NORMAL:
- return false; // ignore
- case SPELL_SCHOOL_HOLY: trigger_spell_id = 50490; break;
- case SPELL_SCHOOL_FIRE: trigger_spell_id = 50362; break;
- case SPELL_SCHOOL_NATURE: trigger_spell_id = 50488; break;
- case SPELL_SCHOOL_FROST: trigger_spell_id = 50485; break;
- case SPELL_SCHOOL_SHADOW: trigger_spell_id = 50489; break;
- case SPELL_SCHOOL_ARCANE: trigger_spell_id = 50486; break;
- default:
- return false;
- }
- }
- // Blood Presence (Improved)
- else if (auraSpellInfo->Id == 63611)
- {
- if (GetTypeId() != TYPEID_PLAYER)
- return false;
-
- trigger_spell_id = 50475;
- basepoints0 = CalculatePct(int32(damage), triggerAmount);
- }
- // Item - Death Knight T10 Melee 4P Bonus
- else if (auraSpellInfo->Id == 70656)
- {
- if (GetTypeId() != TYPEID_PLAYER || getClass() != CLASS_DEATH_KNIGHT)
- return false;
-
- for (uint8 i = 0; i < MAX_RUNES; ++i)
- if (ToPlayer()->GetRuneCooldown(i) == 0)
- return false;
- }
- break;
- }
- case SPELLFAMILY_ROGUE:
- {
- switch (auraSpellInfo->Id)
- {
- // Rogue T10 2P bonus, should only proc on caster
- case 70805:
- {
- if (victim != this)
- return false;
- break;
- }
- }
- break;
}
default:
break;
@@ -8254,7 +7797,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
float averageDmg = 0;
// now compute approximate weapon damage by formula from wowwiki.com
- if (procFlags & PROC_FLAG_DONE_OFFHAND_ATTACK)
+ if (procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
averageDmg = (GetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE) + GetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE)) / 2.f;
else
averageDmg = (GetFloatValue(UNIT_FIELD_MINDAMAGE) + GetFloatValue(UNIT_FIELD_MAXDAMAGE)) / 2.f;
@@ -8416,13 +7959,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
if (!target)
return false;
- if (cooldown && target->GetTypeId() == TYPEID_PLAYER && target->GetSpellHistory()->HasCooldown(trigger_spell_id))
- return false;
-
target->CastSpell(target, trigger_spell_id, true, castItem, triggeredByAura);
-
- if (cooldown && GetTypeId() == TYPEID_PLAYER)
- GetSpellHistory()->AddCooldown(trigger_spell_id, 0, std::chrono::seconds(cooldown));
return true;
}
// Cast positive spell on enemy target
@@ -8553,7 +8090,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
case 56453:
{
// Proc only from Frost/Freezing trap activation or from Freezing Arrow (the periodic dmg proc handled elsewhere)
- if (!(procFlags & PROC_FLAG_DONE_TRAP_ACTIVATION) || !procSpell || !(procSpell->SchoolMask & SPELL_SCHOOL_MASK_FROST) || !roll_chance_i(triggerAmount))
+ if (!(procFlag & PROC_FLAG_DONE_TRAP_ACTIVATION) || !procSpell || !(procSpell->SchoolMask & SPELL_SCHOOL_MASK_FROST) || !roll_chance_i(triggerAmount))
return false;
break;
}
@@ -8600,29 +8137,23 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
}
}
- if (cooldown && GetTypeId() == TYPEID_PLAYER && GetSpellHistory()->HasCooldown(trigger_spell_id))
- return false;
-
// extra attack should hit same target
if (triggerEntry->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS))
target = victim;
// try detect target manually if not set
if (target == NULL)
- target = !(procFlags & (PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)) && triggerEntry->IsPositive() ? this : victim;
+ target = !(procFlag & (PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)) && triggerEntry->IsPositive() ? this : victim;
if (basepoints0)
CastCustomSpell(target, trigger_spell_id, &basepoints0, NULL, NULL, true, castItem, triggeredByAura);
else
CastSpell(target, trigger_spell_id, true, castItem, triggeredByAura);
- if (cooldown && GetTypeId() == TYPEID_PLAYER)
- GetSpellHistory()->AddCooldown(trigger_spell_id, 0, std::chrono::seconds(cooldown));
-
return true;
}
-bool Unit::HandleOverrideClassScriptAuraProc(Unit* victim, uint32 /*damage*/, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 cooldown)
+bool Unit::HandleOverrideClassScriptAuraProc(Unit* victim, uint32 /*damage*/, AuraEffect* triggeredByAura, SpellInfo const* procSpell)
{
int32 scriptId = triggeredByAura->GetMiscValue();
@@ -8713,14 +8244,7 @@ bool Unit::HandleOverrideClassScriptAuraProc(Unit* victim, uint32 /*damage*/, Au
return false;
}
- if (cooldown && GetTypeId() == TYPEID_PLAYER && GetSpellHistory()->HasCooldown(triggered_spell_id))
- return false;
-
CastSpell(victim, triggered_spell_id, true, castItem, triggeredByAura);
-
- if (cooldown && GetTypeId() == TYPEID_PLAYER)
- GetSpellHistory()->AddCooldown(triggered_spell_id, 0, std::chrono::seconds(cooldown));
-
return true;
}
@@ -11889,7 +11413,7 @@ void Unit::SetInCombatState(bool PvP, Unit* enemy)
UpdateSpeed(MOVE_FLIGHT);
}
- if (!(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_MOUNTED_COMBAT))
+ if (!(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_MOUNTED_COMBAT_ALLOWED))
Dismount();
}
@@ -12042,7 +11566,7 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo
}
Creature const* creatureAttacker = ToCreature();
- if (creatureAttacker && creatureAttacker->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER)
+ if (creatureAttacker && creatureAttacker->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)
return false;
// check duel - before sanctuary checks
@@ -12126,7 +11650,7 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co
// can't assist non-friendly targets
if (GetReactionTo(target) < REP_NEUTRAL
&& target->GetReactionTo(this) < REP_NEUTRAL
- && (!ToCreature() || !(ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER)))
+ && (!ToCreature() || !(ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)))
return false;
// PvP case
@@ -12160,7 +11684,7 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co
&& !((target->GetByteValue(UNIT_FIELD_BYTES_2, 1) & UNIT_BYTE2_FLAG_PVP)))
{
if (Creature const* creatureTarget = target->ToCreature())
- return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_AID_PLAYERS;
+ return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST;
}
return true;
}
@@ -14254,6 +13778,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
HealInfo healInfo = HealInfo(actor, actionTarget, damage, procSpell, procSpell ? SpellSchoolMask(procSpell->SchoolMask) : SPELL_SCHOOL_MASK_NORMAL);
ProcEventInfo eventInfo = ProcEventInfo(actor, actionTarget, target, procFlag, 0, 0, procExtra, nullptr, &damageInfo, &healInfo);
+ std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
ProcTriggeredList procTriggered;
// Fill procTriggered list
for (AuraApplicationMap::const_iterator itr = GetAppliedAuras().begin(); itr!= GetAppliedAuras().end(); ++itr)
@@ -14261,6 +13786,10 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
// Do not allow auras to proc from effect triggered by itself
if (procAura && procAura->Id == itr->first)
continue;
+
+ if (itr->second->GetBase()->IsProcOnCooldown(now))
+ continue;
+
ProcTriggeredData triggerData(itr->second->GetBase());
// Defensive procs are active on absorbs (so absorption effects are not a hindrance)
bool active = damage || (procExtra & PROC_EX_BLOCK && isVictim);
@@ -14285,6 +13814,10 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
if (!triggerData.aura->CallScriptCheckProcHandlers(itr->second, eventInfo))
continue;
+ bool procSuccess = RollProcResult(target, triggerData.aura, attType, isVictim, triggerData.spellProcEvent);
+ if (!procSuccess)
+ continue;
+
// Triggered spells not triggering additional spells
bool triggered = !spellProto->HasAttribute(SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED) ?
(procExtra & PROC_EX_INTERNAL_TRIGGERED && !(procFlag & PROC_FLAG_DONE_TRAP_ACTIVATION)) : false;
@@ -14338,9 +13871,9 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
bool prepare = i->aura->CallScriptPrepareProcHandlers(aurApp, eventInfo);
// For players set spell cooldown if need
- uint32 cooldown = 0;
+ Milliseconds cooldown = Milliseconds::zero();
if (prepare && GetTypeId() == TYPEID_PLAYER && i->spellProcEvent && i->spellProcEvent->cooldown)
- cooldown = i->spellProcEvent->cooldown;
+ cooldown = Seconds(i->spellProcEvent->cooldown);
// Note: must SetCantProc(false) before return
if (spellInfo->HasAttribute(SPELL_ATTR3_DISABLE_PROC))
@@ -14349,9 +13882,9 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
bool handled = i->aura->CallScriptProcHandlers(aurApp, eventInfo);
// "handled" is needed as long as proc can be handled in multiple places
- if (!handled && HandleAuraProc(target, damage, i->aura, procSpell, procFlag, procExtra, cooldown, &handled))
+ if (!handled && HandleAuraProc(target, damage, i->aura, procSpell, procFlag, procExtra, &handled))
{
- TC_LOG_DEBUG("spells", "ProcDamageAndSpell: casting spell %u (triggered with value by %s aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), Id);
+ TC_LOG_DEBUG("spells", "ProcDamageAndSpell: casting spell %u (triggered with value by %s aura of spell %u)", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), Id);
takeCharges = true;
}
@@ -14359,7 +13892,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
{
for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
{
- if (!(i->effMask & (1<<effIndex)))
+ if (!(i->effMask & (1 << effIndex)))
continue;
AuraEffect* triggeredByAura = i->aura->GetEffect(effIndex);
@@ -14376,9 +13909,10 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
{
case SPELL_AURA_PROC_TRIGGER_SPELL:
{
- TC_LOG_DEBUG("spells", "ProcDamageAndSpell: casting spell %u (triggered by %s aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+ TC_LOG_DEBUG("spells", "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(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
+ if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpell, procFlag, procExtra))
takeCharges = true;
break;
}
@@ -14395,7 +13929,8 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
case SPELL_AURA_MANA_SHIELD:
case SPELL_AURA_DUMMY:
{
- TC_LOG_DEBUG("spells", "ProcDamageAndSpell: casting spell id %u (triggered by %s dummy aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+ TC_LOG_DEBUG("spells", "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(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
takeCharges = true;
break;
@@ -14404,20 +13939,22 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
case SPELL_AURA_MOD_SPELL_CRIT_CHANCE:
case SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN:
case SPELL_AURA_MOD_MELEE_HASTE:
- TC_LOG_DEBUG("spells", "ProcDamageAndSpell: casting spell id %u (triggered by %s aura of spell %u)", spellInfo->Id, isVictim ? "a victim's" : "an attacker's", triggeredByAura->GetId());
+ TC_LOG_DEBUG("spells", "ProcDamageAndSpell: casting spell id %u (triggered by %s aura of spell %u)",
+ spellInfo->Id, isVictim ? "a victim's" : "an attacker's", triggeredByAura->GetId());
takeCharges = true;
break;
case SPELL_AURA_OVERRIDE_CLASS_SCRIPTS:
{
- TC_LOG_DEBUG("spells", "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(target, damage, triggeredByAura, procSpell, cooldown))
+ TC_LOG_DEBUG("spells", "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(target, damage, triggeredByAura, procSpell))
takeCharges = true;
break;
}
case SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE:
{
TC_LOG_DEBUG("spells", "ProcDamageAndSpell: casting mending (triggered by %s dummy aura of spell %u)",
- (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+ (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
HandleAuraRaidProcFromChargeWithValue(triggeredByAura);
takeCharges = true;
@@ -14426,7 +13963,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
case SPELL_AURA_RAID_PROC_FROM_CHARGE:
{
TC_LOG_DEBUG("spells", "ProcDamageAndSpell: casting mending (triggered by %s dummy aura of spell %u)",
- (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+ (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
HandleAuraRaidProcFromCharge(triggeredByAura);
takeCharges = true;
@@ -14434,9 +13971,10 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
}
case SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE:
{
- TC_LOG_DEBUG("spells", "ProcDamageAndSpell: casting spell %u (triggered with value by %s aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+ TC_LOG_DEBUG("spells", "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(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
+ if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpell, procFlag, procExtra))
takeCharges = true;
break;
}
@@ -14521,6 +14059,9 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
} // for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
} // if (!handled)
+ if (prepare && takeCharges && cooldown != Milliseconds::zero())
+ i->aura->AddProcCooldown(now + cooldown);
+
// Remove charge (aura can be removed by triggers)
if (prepare && useCharges && takeCharges)
{
@@ -14549,6 +14090,8 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
void Unit::GetProcAurasTriggeredOnEvent(std::list<AuraApplication*>& aurasTriggeringProc, std::list<AuraApplication*>* procAuras, ProcEventInfo eventInfo)
{
+ std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
+
// use provided list of auras which can proc
if (procAuras)
{
@@ -14556,9 +14099,9 @@ void Unit::GetProcAurasTriggeredOnEvent(std::list<AuraApplication*>& aurasTrigge
{
ASSERT((*itr)->GetTarget() == this);
if (!(*itr)->GetRemoveMode())
- if ((*itr)->GetBase()->IsProcTriggeredOnEvent(*itr, eventInfo))
+ if ((*itr)->GetBase()->IsProcTriggeredOnEvent(*itr, eventInfo, now))
{
- (*itr)->GetBase()->PrepareProcToTrigger(*itr, eventInfo);
+ (*itr)->GetBase()->PrepareProcToTrigger(*itr, eventInfo, now);
aurasTriggeringProc.push_back(*itr);
}
}
@@ -14568,9 +14111,9 @@ void Unit::GetProcAurasTriggeredOnEvent(std::list<AuraApplication*>& aurasTrigge
{
for (AuraApplicationMap::iterator itr = GetAppliedAuras().begin(); itr!= GetAppliedAuras().end(); ++itr)
{
- if (itr->second->GetBase()->IsProcTriggeredOnEvent(itr->second, eventInfo))
+ if (itr->second->GetBase()->IsProcTriggeredOnEvent(itr->second, eventInfo, now))
{
- itr->second->GetBase()->PrepareProcToTrigger(itr->second, eventInfo);
+ itr->second->GetBase()->PrepareProcToTrigger(itr->second, eventInfo, now);
aurasTriggeringProc.push_back(itr->second);
}
}
@@ -15192,23 +14735,23 @@ bool Unit::InitTamedPet(Pet* pet, uint8 level, uint32 spell_id)
return true;
}
-bool Unit::IsTriggeredAtSpellProcEvent(Unit* victim, Aura* aura, SpellInfo const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const* & spellProcEvent)
+bool Unit::IsTriggeredAtSpellProcEvent(Unit* victim, Aura* aura, SpellInfo const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const*& spellProcEvent)
{
- SpellInfo const* spellProto = aura->GetSpellInfo();
+ SpellInfo const* spellInfo = aura->GetSpellInfo();
// let the aura be handled by new proc system if it has new entry
- if (sSpellMgr->GetSpellProcEntry(spellProto->Id))
+ if (sSpellMgr->GetSpellProcEntry(spellInfo->Id))
return false;
// Get proc Event Entry
- spellProcEvent = sSpellMgr->GetSpellProcEvent(spellProto->Id);
+ spellProcEvent = sSpellMgr->GetSpellProcEvent(spellInfo->Id);
// Get EventProcFlag
uint32 EventProcFlag;
if (spellProcEvent && spellProcEvent->procFlags) // if exist get custom spellProcEvent->procFlags
EventProcFlag = spellProcEvent->procFlags;
else
- EventProcFlag = spellProto->ProcFlags; // else get from spell proto
+ EventProcFlag = spellInfo->ProcFlags; // else get from spell proto
// Continue if no trigger exist
if (!EventProcFlag)
return false;
@@ -15216,12 +14759,12 @@ bool Unit::IsTriggeredAtSpellProcEvent(Unit* victim, Aura* aura, SpellInfo const
// Additional checks for triggered spells (ignore trap casts)
if (procExtra & PROC_EX_INTERNAL_TRIGGERED && !(procFlag & PROC_FLAG_DONE_TRAP_ACTIVATION))
{
- if (!spellProto->HasAttribute(SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED))
+ if (!spellInfo->HasAttribute(SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED))
return false;
}
// Check spellProcEvent data requirements
- if (!sSpellMgr->IsSpellProcEventCanTriggeredBy(spellProto, spellProcEvent, EventProcFlag, procSpell, procFlag, procExtra, active))
+ if (!sSpellMgr->IsSpellProcEventCanTriggeredBy(spellInfo, spellProcEvent, EventProcFlag, procSpell, procFlag, procExtra, active))
return false;
// In most cases req get honor or XP from kill
if (EventProcFlag & PROC_FLAG_KILL && GetTypeId() == TYPEID_PLAYER)
@@ -15239,15 +14782,15 @@ bool Unit::IsTriggeredAtSpellProcEvent(Unit* victim, Aura* aura, SpellInfo const
}
// Aura added by spell can`t trigger from self (prevent drop charges/do triggers)
// But except periodic and kill triggers (can triggered from self)
- if (procSpell && procSpell->Id == spellProto->Id
- && !(spellProto->ProcFlags&(PROC_FLAG_TAKEN_PERIODIC | PROC_FLAG_KILL)))
+ if (procSpell && procSpell->Id == spellInfo->Id
+ && !(spellInfo->ProcFlags&(PROC_FLAG_TAKEN_PERIODIC | PROC_FLAG_KILL)))
return false;
// Check if current equipment allows aura to proc
if (!isVictim && GetTypeId() == TYPEID_PLAYER)
{
Player* player = ToPlayer();
- if (spellProto->EquippedItemClass == ITEM_CLASS_WEAPON)
+ if (spellInfo->EquippedItemClass == ITEM_CLASS_WEAPON)
{
Item* item = NULL;
if (attType == BASE_ATTACK)
@@ -15260,19 +14803,26 @@ bool Unit::IsTriggeredAtSpellProcEvent(Unit* victim, Aura* aura, SpellInfo const
if (player->IsInFeralForm())
return false;
- if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_WEAPON || !((1<<item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
+ if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_WEAPON || !((1<<item->GetTemplate()->SubClass) & spellInfo->EquippedItemSubClassMask))
return false;
}
- else if (spellProto->EquippedItemClass == ITEM_CLASS_ARMOR)
+ else if (spellInfo->EquippedItemClass == ITEM_CLASS_ARMOR)
{
// Check if player is wearing shield
Item* item = player->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
- if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_ARMOR || !((1<<item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
+ if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_ARMOR || !((1<<item->GetTemplate()->SubClass) & spellInfo->EquippedItemSubClassMask))
return false;
}
}
+
+ return true;
+}
+
+bool Unit::RollProcResult(Unit* victim, Aura* aura, WeaponAttackType attType, bool isVictim, SpellProcEventEntry const* spellProcEvent)
+{
+ SpellInfo const* spellInfo = aura->GetSpellInfo();
// Get chance from spell
- float chance = float(spellProto->ProcChance);
+ float chance = float(spellInfo->ProcChance);
// If in spellProcEvent exist custom chance, chance = spellProcEvent->customChance;
if (spellProcEvent && spellProcEvent->customChance)
chance = spellProcEvent->customChance;
@@ -15282,19 +14832,18 @@ bool Unit::IsTriggeredAtSpellProcEvent(Unit* victim, Aura* aura, SpellInfo const
if (!isVictim)
{
uint32 weaponSpeed = GetAttackTime(attType);
- chance = GetPPMProcChance(weaponSpeed, spellProcEvent->ppmRate, spellProto);
+ chance = GetPPMProcChance(weaponSpeed, spellProcEvent->ppmRate, spellInfo);
}
else if (victim)
{
uint32 weaponSpeed = victim->GetAttackTime(attType);
- chance = victim->GetPPMProcChance(weaponSpeed, spellProcEvent->ppmRate, spellProto);
+ chance = victim->GetPPMProcChance(weaponSpeed, spellProcEvent->ppmRate, spellInfo);
}
}
// Apply chance modifer aura
if (Player* modOwner = GetSpellModOwner())
- {
- modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CHANCE_OF_SUCCESS, chance);
- }
+ modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CHANCE_OF_SUCCESS, chance);
+
return roll_chance_f(chance);
}
@@ -16300,8 +15849,8 @@ bool Unit::IsInPartyWith(Unit const* unit) const
if (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_PLAYER)
return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer());
- else if ((u2->GetTypeId() == TYPEID_PLAYER && u1->GetTypeId() == TYPEID_UNIT && u1->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER) ||
- (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_UNIT && u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER))
+ else if ((u2->GetTypeId() == TYPEID_PLAYER && u1->GetTypeId() == TYPEID_UNIT && u1->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) ||
+ (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_UNIT && u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT))
return true;
else
return false;
@@ -16319,8 +15868,8 @@ bool Unit::IsInRaidWith(Unit const* unit) const
if (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_PLAYER)
return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer());
- else if ((u2->GetTypeId() == TYPEID_PLAYER && u1->GetTypeId() == TYPEID_UNIT && u1->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER) ||
- (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_UNIT && u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PARTY_MEMBER))
+ else if ((u2->GetTypeId() == TYPEID_PLAYER && u1->GetTypeId() == TYPEID_UNIT && u1->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) ||
+ (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_UNIT && u2->ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT))
return true;
else
return false;
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index d49d2fd9842..30ef6eb394f 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1858,6 +1858,9 @@ class TC_GAME_API Unit : public WorldObject
Spell* FindCurrentSpellBySpellId(uint32 spell_id) const;
int32 GetCurrentSpellCastTime(uint32 spell_id) const;
+ // Check if our current channel spell has attribute SPELL_ATTR5_CAN_CHANNEL_WHEN_MOVING
+ bool CanMoveDuringChannel() const;
+
SpellHistory* GetSpellHistory() { return m_spellHistory; }
SpellHistory const* GetSpellHistory() const { return m_spellHistory; }
@@ -2252,11 +2255,12 @@ class TC_GAME_API Unit : public WorldObject
void DisableSpline();
private:
- bool IsTriggeredAtSpellProcEvent(Unit* victim, Aura* aura, SpellInfo const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const* & spellProcEvent);
- bool HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
- bool HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool * handled);
- bool HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
- bool HandleOverrideClassScriptAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 cooldown);
+ bool IsTriggeredAtSpellProcEvent(Unit* victim, Aura* aura, SpellInfo const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const*& spellProcEvent);
+ bool RollProcResult(Unit* victim, Aura* aura, WeaponAttackType attType, bool isVictim, SpellProcEventEntry const* spellProcEvent);
+ bool HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, Milliseconds& cooldown);
+ bool HandleAuraProc(Unit* victim, uint32 damage, Aura* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, bool* handled);
+ bool HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx);
+ bool HandleOverrideClassScriptAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell);
bool HandleAuraRaidProcFromChargeWithValue(AuraEffect* triggeredByAura);
bool HandleAuraRaidProcFromCharge(AuraEffect* triggeredByAura);
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 0976534f3ca..33a0325851a 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -5946,14 +5946,14 @@ void ObjectMgr::LoadGraveyardZones()
{
uint32 oldMSTime = getMSTime();
- GraveYardStore.clear(); // need for reload case
+ GraveYardStore.clear(); // need for reload case
- // 0 1 2
- QueryResult result = WorldDatabase.Query("SELECT id, ghost_zone, faction FROM game_graveyard_zone");
+ // 0 1 2
+ QueryResult result = WorldDatabase.Query("SELECT ID, GhostZone, Faction FROM graveyard_zone");
if (!result)
{
- TC_LOG_INFO("server.loading", ">> Loaded 0 graveyard-zone links. DB table `game_graveyard_zone` is empty.");
+ TC_LOG_INFO("server.loading", ">> Loaded 0 graveyard-zone links. DB table `graveyard_zone` is empty.");
return;
}
@@ -5972,31 +5972,31 @@ void ObjectMgr::LoadGraveyardZones()
WorldSafeLocsEntry const* entry = sWorldSafeLocsStore.LookupEntry(safeLocId);
if (!entry)
{
- TC_LOG_ERROR("sql.sql", "Table `game_graveyard_zone` has a record for not existing graveyard (WorldSafeLocs.dbc id) %u, skipped.", safeLocId);
+ TC_LOG_ERROR("sql.sql", "Table `graveyard_zone` has a record for non-existing graveyard (WorldSafeLocsID: %u), skipped.", safeLocId);
continue;
}
AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(zoneId);
if (!areaEntry)
{
- TC_LOG_ERROR("sql.sql", "Table `game_graveyard_zone` has a record for not existing zone id (%u), skipped.", zoneId);
+ TC_LOG_ERROR("sql.sql", "Table `graveyard_zone` has a record for non-existing Zone (ID: %u), skipped.", zoneId);
continue;
}
if (areaEntry->zone != 0)
{
- TC_LOG_ERROR("sql.sql", "Table `game_graveyard_zone` has a record for subzone id (%u) instead of zone, skipped.", zoneId);
+ TC_LOG_ERROR("sql.sql", "Table `graveyard_zone` has a record for SubZone (ID: %u) instead of zone, skipped.", zoneId);
continue;
}
if (team != 0 && team != HORDE && team != ALLIANCE)
{
- TC_LOG_ERROR("sql.sql", "Table `game_graveyard_zone` has a record for non player faction (%u), skipped.", team);
+ TC_LOG_ERROR("sql.sql", "Table `graveyard_zone` has a record for non player faction (%u), skipped.", team);
continue;
}
if (!AddGraveYardLink(safeLocId, zoneId, team, false))
- TC_LOG_ERROR("sql.sql", "Table `game_graveyard_zone` has a duplicate record for Graveyard (ID: %u) and Zone (ID: %u), skipped.", safeLocId, zoneId);
+ TC_LOG_ERROR("sql.sql", "Table `graveyard_zone` has a duplicate record for Graveyard (ID: %u) and Zone (ID: %u), skipped.", safeLocId, zoneId);
} while (result->NextRow());
TC_LOG_INFO("server.loading", ">> Loaded %u graveyard-zone links in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
@@ -6045,7 +6045,7 @@ WorldSafeLocsEntry const* ObjectMgr::GetClosestGraveYard(float x, float y, float
if (range.first == range.second && !map->IsBattlegroundOrArena())
{
if (zoneId != 0) // zone == 0 can't be fixed, used by bliz for bugged zones
- TC_LOG_ERROR("sql.sql", "Table `game_graveyard_zone` incomplete: Zone %u Team %u does not have a linked graveyard.", zoneId, team);
+ TC_LOG_ERROR("sql.sql", "Table `graveyard_zone` incomplete: Zone %u Team %u does not have a linked graveyard.", zoneId, team);
return GetDefaultGraveYard(team);
}
@@ -6071,7 +6071,7 @@ WorldSafeLocsEntry const* ObjectMgr::GetClosestGraveYard(float x, float y, float
WorldSafeLocsEntry const* entry = sWorldSafeLocsStore.LookupEntry(data.safeLocId);
if (!entry)
{
- TC_LOG_ERROR("sql.sql", "Table `game_graveyard_zone` has record for not existing graveyard (WorldSafeLocs.dbc id) %u, skipped.", data.safeLocId);
+ TC_LOG_ERROR("sql.sql", "Table `graveyard_zone` has record for not existing graveyard (WorldSafeLocsID %u), skipped.", data.safeLocId);
continue;
}
@@ -6186,7 +6186,7 @@ void ObjectMgr::RemoveGraveYardLink(uint32 id, uint32 zoneId, uint32 team, bool
GraveYardMapBoundsNonConst range = GraveYardStore.equal_range(zoneId);
if (range.first == range.second)
{
- //TC_LOG_ERROR("sql.sql", "Table `game_graveyard_zone` incomplete: Zone %u Team %u does not have a linked graveyard.", zoneId, team);
+ //TC_LOG_ERROR("sql.sql", "Table `graveyard_zone` incomplete: Zone %u Team %u does not have a linked graveyard.", zoneId, team);
return;
}
diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp
index 5cede9a32d5..390b636bb5e 100644
--- a/src/server/game/Loot/LootMgr.cpp
+++ b/src/server/game/Loot/LootMgr.cpp
@@ -704,7 +704,7 @@ void Loot::DeleteLootItemFromContainerItemDB(uint32 itemID)
if (_itr->itemid != itemID)
continue;
- _itr->canSave = true;
+ _itr->canSave = false;
break;
}
}
diff --git a/src/server/game/Maps/MapManager.h b/src/server/game/Maps/MapManager.h
index a7fdc37d324..91a26c29150 100644
--- a/src/server/game/Maps/MapManager.h
+++ b/src/server/game/Maps/MapManager.h
@@ -126,9 +126,9 @@ class TC_GAME_API MapManager
template<typename Worker>
void DoForAllMapsWithMapId(uint32 mapId, Worker&& worker);
- uint32 IncreaseScheduledScriptsCount() { return ++_scheduledScripts; }
- uint32 DecreaseScheduledScriptCount() { return --_scheduledScripts; }
- uint32 DecreaseScheduledScriptCount(size_t count) { return _scheduledScripts -= count; }
+ void IncreaseScheduledScriptsCount() { ++_scheduledScripts; }
+ void DecreaseScheduledScriptCount() { --_scheduledScripts; }
+ void DecreaseScheduledScriptCount(std::size_t count) { _scheduledScripts -= count; }
bool IsScriptScheduled() const { return _scheduledScripts > 0; }
private:
@@ -157,7 +157,7 @@ class TC_GAME_API MapManager
MapUpdater m_updater;
// atomic op counter for active scripts amount
- std::atomic<uint32> _scheduledScripts;
+ std::atomic<std::size_t> _scheduledScripts;
};
template<typename Worker>
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 42eac0ead79..b9df9e3accc 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -456,7 +456,7 @@ enum SpellAttr4
enum SpellAttr5
{
- SPELL_ATTR5_UNK0 = 0x00000001, // 0
+ SPELL_ATTR5_CAN_CHANNEL_WHEN_MOVING = 0x00000001, // 0 available casting channel spell when moving
SPELL_ATTR5_NO_REAGENT_WHILE_PREP = 0x00000002, // 1 not need reagents if UNIT_FLAG_PREPARATION
SPELL_ATTR5_UNK2 = 0x00000004, // 2
SPELL_ATTR5_USABLE_WHILE_STUNNED = 0x00000008, // 3 usable while stunned
@@ -2577,38 +2577,38 @@ enum CreatureFamily
enum CreatureTypeFlags
{
- CREATURE_TYPEFLAGS_TAMEABLE = 0x00000001, // Tameable by any hunter
- CREATURE_TYPEFLAGS_GHOST = 0x00000002, // Creature are also visible for not alive player. Allow gossip interaction if npcflag allow?
- CREATURE_TYPEFLAGS_BOSS = 0x00000004,
- CREATURE_TYPEFLAGS_UNK3 = 0x00000008,
- CREATURE_TYPEFLAGS_UNK4 = 0x00000010,
- CREATURE_TYPEFLAGS_UNK5 = 0x00000020,
- CREATURE_TYPEFLAGS_UNK6 = 0x00000040,
- CREATURE_TYPEFLAGS_DEAD_INTERACT = 0x00000080, // Player can interact with the creature if its dead (not player dead)
- CREATURE_TYPEFLAGS_HERBLOOT = 0x00000100, // Can be looted by herbalist
- CREATURE_TYPEFLAGS_MININGLOOT = 0x00000200, // Can be looted by miner
- CREATURE_TYPEFLAGS_DONT_LOG_DEATH = 0x00000400, // Death event will not show up in combat log
- CREATURE_TYPEFLAGS_MOUNTED_COMBAT = 0x00000800, // Creature can remain mounted when entering combat
- CREATURE_TYPEFLAGS_AID_PLAYERS = 0x00001000, // ? Can aid any player in combat if in range?
- CREATURE_TYPEFLAGS_UNK13 = 0x00002000,
- CREATURE_TYPEFLAGS_UNK14 = 0x00004000, // ? Possibly not in use
- CREATURE_TYPEFLAGS_ENGINEERLOOT = 0x00008000, // Can be looted by engineer
- CREATURE_TYPEFLAGS_EXOTIC = 0x00010000, // Can be tamed by hunter as exotic pet
- CREATURE_TYPEFLAGS_UNK17 = 0x00020000, // ? Related to vehicles/pvp?
- CREATURE_TYPEFLAGS_UNK18 = 0x00040000, // ? Related to vehicle/siege weapons?
- CREATURE_TYPEFLAGS_PROJECTILE_COLLISION = 0x00080000, // Projectiles can collide with this creature - interacts with TARGET_DEST_TRAJ
- CREATURE_TYPEFLAGS_UNK20 = 0x00100000,
- CREATURE_TYPEFLAGS_UNK21 = 0x00200000,
- CREATURE_TYPEFLAGS_UNK22 = 0x00400000,
- CREATURE_TYPEFLAGS_UNK23 = 0x00800000, // ? First seen in 3.2.2. Related to banner/backpack of creature/companion?
- CREATURE_TYPEFLAGS_UNK24 = 0x01000000,
- CREATURE_TYPEFLAGS_UNK25 = 0x02000000,
- CREATURE_TYPEFLAGS_PARTY_MEMBER = 0x04000000, //! Creature can be targeted by spells that require target to be in caster's party/raid
- CREATURE_TYPEFLAGS_UNK27 = 0x08000000,
- CREATURE_TYPEFLAGS_UNK28 = 0x10000000,
- CREATURE_TYPEFLAGS_UNK29 = 0x20000000,
- CREATURE_TYPEFLAGS_UNK30 = 0x40000000,
- CREATURE_TYPEFLAGS_UNK31 = 0x80000000
+ CREATURE_TYPE_FLAG_TAMEABLE_PET = 0x00000001, // Makes the mob tameable (must also be a beast and have family set)
+ CREATURE_TYPE_FLAG_GHOST_VISIBLE = 0x00000002, // Creature are also visible for not alive player. Allow gossip interaction if npcflag allow?
+ CREATURE_TYPE_FLAG_BOSS_MOB = 0x00000004, // Changes creature's visible level to "??" in the creature's portrait - Immune Knockback.
+ CREATURE_TYPE_FLAG_DO_NOT_PLAY_WOUND_PARRY_ANIMATION = 0x00000008,
+ CREATURE_TYPE_FLAG_HIDE_FACTION_TOOLTIP = 0x00000010,
+ CREATURE_TYPE_FLAG_UNK5 = 0x00000020, // Sound related
+ CREATURE_TYPE_FLAG_SPELL_ATTACKABLE = 0x00000040,
+ CREATURE_TYPE_FLAG_CAN_INTERACT_WHILE_DEAD = 0x00000080, // Player can interact with the creature if its dead (not player dead)
+ CREATURE_TYPE_FLAG_HERB_SKINNING_SKILL = 0x00000100, // Can be looted by herbalist
+ CREATURE_TYPE_FLAG_MINING_SKINNING_SKILL = 0x00000200, // Can be looted by miner
+ CREATURE_TYPE_FLAG_DO_NOT_LOG_DEATH = 0x00000400, // Death event will not show up in combat log
+ CREATURE_TYPE_FLAG_MOUNTED_COMBAT_ALLOWED = 0x00000800, // Creature can remain mounted when entering combat
+ CREATURE_TYPE_FLAG_CAN_ASSIST = 0x00001000, // ? Can aid any player in combat if in range?
+ CREATURE_TYPE_FLAG_IS_PET_BAR_USED = 0x00002000,
+ CREATURE_TYPE_FLAG_MASK_UID = 0x00004000,
+ CREATURE_TYPE_FLAG_ENGINEERING_SKINNING_SKILL = 0x00008000, // Can be looted by engineer
+ CREATURE_TYPE_FLAG_EXOTIC_PET = 0x00010000, // Can be tamed by hunter as exotic pet
+ CREATURE_TYPE_FLAG_USE_DEFAULT_COLLISION_BOX = 0x00020000, // Collision related. (always using default collision box?)
+ CREATURE_TYPE_FLAG_IS_SIEGE_WEAPON = 0x00040000,
+ CREATURE_TYPE_FLAG_CAN_COLLIDE_WITH_MISSILES = 0x00080000, // Projectiles can collide with this creature - interacts with TARGET_DEST_TRAJ
+ CREATURE_TYPE_FLAG_HIDE_NAME_PLATE = 0x00100000,
+ CREATURE_TYPE_FLAG_DO_NOT_PLAY_MOUNTED_ANIMATIONS = 0x00200000,
+ CREATURE_TYPE_FLAG_IS_LINK_ALL = 0x00400000,
+ CREATURE_TYPE_FLAG_INTERACT_ONLY_WITH_CREATOR = 0x00800000,
+ CREATURE_TYPE_FLAG_DO_NOT_PLAY_UNIT_EVENT_SOUNDS = 0x01000000,
+ CREATURE_TYPE_FLAG_HAS_NO_SHADOW_BLOB = 0x02000000,
+ CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT = 0x04000000, // ! Creature can be targeted by spells that require target to be in caster's party/raid
+ CREATURE_TYPE_FLAG_FORCE_GOSSIP = 0x08000000, // Allows the creature to display a single gossip option.
+ CREATURE_TYPE_FLAG_DO_NOT_SHEATHE = 0x10000000,
+ CREATURE_TYPE_FLAG_DO_NOT_TARGET_ON_INTERACTION = 0x20000000,
+ CREATURE_TYPE_FLAG_DO_NOT_RENDER_OBJECT_NAME = 0x40000000,
+ CREATURE_TYPE_FLAG_UNIT_IS_QUEST_BOSS = 0x80000000 // Not verified
};
enum CreatureEliteType
diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp
index 403ccf684e7..3fd3b702ba5 100644
--- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp
@@ -36,6 +36,9 @@ void TargetedMovementGeneratorMedium<T, D>::_setTargetLocation(T* owner, bool up
if (owner->HasUnitState(UNIT_STATE_NOT_MOVE))
return;
+ if (owner->HasUnitState(UNIT_STATE_CASTING) && !owner->CanMoveDuringChannel())
+ return;
+
if (owner->GetTypeId() == TYPEID_UNIT && !i_target->isInAccessiblePlaceFor(owner->ToCreature()))
{
owner->ToCreature()->SetCannotReachTarget(true);
@@ -146,7 +149,7 @@ bool TargetedMovementGeneratorMedium<T, D>::DoUpdate(T* owner, uint32 time_diff)
}
// prevent movement while casting spells with cast time or channel time
- if (owner->HasUnitState(UNIT_STATE_CASTING))
+ if (owner->HasUnitState(UNIT_STATE_CASTING) && !owner->CanMoveDuringChannel())
{
if (!owner->IsStopped())
owner->StopMoving();
diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h
index e0daf59fcc2..02dd88e582a 100644
--- a/src/server/game/Spells/Auras/SpellAuraDefines.h
+++ b/src/server/game/Spells/Auras/SpellAuraDefines.h
@@ -348,7 +348,7 @@ enum AuraType
SPELL_AURA_ABILITY_PERIODIC_CRIT = 286,
SPELL_AURA_DEFLECT_SPELLS = 287,
SPELL_AURA_IGNORE_HIT_DIRECTION = 288,
- SPELL_AURA_289 = 289,
+ SPELL_AURA_PREVENT_DURABILITY_LOSS = 289,
SPELL_AURA_MOD_CRIT_PCT = 290,
SPELL_AURA_MOD_XP_QUEST_PCT = 291,
SPELL_AURA_OPEN_STABLE = 292,
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index ffe79293430..4133d0c8d65 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -346,7 +346,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]=
&AuraEffect::HandleNoImmediateEffect, //286 SPELL_AURA_ABILITY_PERIODIC_CRIT implemented in AuraEffect::PeriodicTick
&AuraEffect::HandleNoImmediateEffect, //287 SPELL_AURA_DEFLECT_SPELLS implemented in Unit::MagicSpellHitResult and Unit::MeleeSpellHitResult
&AuraEffect::HandleNoImmediateEffect, //288 SPELL_AURA_IGNORE_HIT_DIRECTION implemented in Unit::MagicSpellHitResult and Unit::MeleeSpellHitResult Unit::RollMeleeOutcomeAgainst
- &AuraEffect::HandleNULL, //289 unused (3.2.0)
+ &AuraEffect::HandleNoImmediateEffect, //289 SPELL_AURA_PREVENT_DURABILITY_LOSS implemented in Player::DurabilityPointsLoss
&AuraEffect::HandleAuraModCritPct, //290 SPELL_AURA_MOD_CRIT_PCT
&AuraEffect::HandleNoImmediateEffect, //291 SPELL_AURA_MOD_XP_QUEST_PCT implemented in Player::RewardQuest
&AuraEffect::HandleAuraOpenStable, //292 SPELL_AURA_OPEN_STABLE
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 74a94a63594..3d35e4039ba 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -337,7 +337,8 @@ m_spellInfo(spellproto), m_casterGuid(casterGUID ? casterGUID : caster->GetGUID(
m_castItemGuid(castItem ? castItem->GetGUID() : ObjectGuid::Empty), m_applyTime(time(NULL)),
m_owner(owner), m_timeCla(0), m_updateTargetMapInterval(0),
m_casterLevel(caster ? caster->getLevel() : m_spellInfo->SpellLevel), m_procCharges(0), m_stackAmount(1),
-m_isRemoved(false), m_isSingleTarget(false), m_isUsingCharges(false), m_dropEvent(nullptr)
+m_isRemoved(false), m_isSingleTarget(false), m_isUsingCharges(false), m_dropEvent(nullptr),
+m_procCooldown(std::chrono::steady_clock::time_point::min())
{
if (m_spellInfo->ManaPerSecond || m_spellInfo->ManaPerSecondPerLevel)
m_timeCla = 1 * IN_MILLISECONDS;
@@ -1851,22 +1852,17 @@ bool Aura::CanStackWith(Aura const* existingAura) const
return true;
}
-bool Aura::IsProcOnCooldown() const
+bool Aura::IsProcOnCooldown(std::chrono::steady_clock::time_point now) const
{
- /*if (m_procCooldown)
- {
- if (m_procCooldown > time(NULL))
- return true;
- }*/
- return false;
+ return m_procCooldown > now;
}
-void Aura::AddProcCooldown(Milliseconds /*msec*/)
+void Aura::AddProcCooldown(std::chrono::steady_clock::time_point cooldownEnd)
{
- //m_procCooldown = std::chrono::steady_clock::now() + msec;
+ m_procCooldown = cooldownEnd;
}
-void Aura::PrepareProcToTrigger(AuraApplication* aurApp, ProcEventInfo& eventInfo)
+void Aura::PrepareProcToTrigger(AuraApplication* aurApp, ProcEventInfo& eventInfo, std::chrono::steady_clock::time_point now)
{
bool prepare = CallScriptPrepareProcHandlers(aurApp, eventInfo);
if (!prepare)
@@ -1884,10 +1880,10 @@ void Aura::PrepareProcToTrigger(AuraApplication* aurApp, ProcEventInfo& eventInf
ASSERT(procEntry);
// cooldowns should be added to the whole aura (see 51698 area aura)
- AddProcCooldown(procEntry->Cooldown);
+ AddProcCooldown(now + procEntry->Cooldown);
}
-bool Aura::IsProcTriggeredOnEvent(AuraApplication* aurApp, ProcEventInfo& eventInfo) const
+bool Aura::IsProcTriggeredOnEvent(AuraApplication* aurApp, ProcEventInfo& eventInfo, std::chrono::steady_clock::time_point now) const
{
SpellProcEntry const* procEntry = sSpellMgr->GetSpellProcEntry(GetId());
// only auras with spell proc entry can trigger proc
@@ -1899,7 +1895,7 @@ bool Aura::IsProcTriggeredOnEvent(AuraApplication* aurApp, ProcEventInfo& eventI
return false;
// check proc cooldown
- if (IsProcOnCooldown())
+ if (IsProcOnCooldown(now))
return false;
/// @todo
diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h
index f792581c86d..a147957f258 100644
--- a/src/server/game/Spells/Auras/SpellAuras.h
+++ b/src/server/game/Spells/Auras/SpellAuras.h
@@ -203,12 +203,12 @@ class TC_GAME_API Aura
// this subsystem is not yet in use - the core of it is functional, but still some research has to be done
// and some dependant problems fixed before it can replace old proc system (for example cooldown handling)
// currently proc system functionality is implemented in Unit::ProcDamageAndSpell
- bool IsProcOnCooldown() const;
- void AddProcCooldown(Milliseconds msec);
+ bool IsProcOnCooldown(std::chrono::steady_clock::time_point now) const;
+ void AddProcCooldown(std::chrono::steady_clock::time_point cooldownEnd);
bool IsUsingCharges() const { return m_isUsingCharges; }
void SetUsingCharges(bool val) { m_isUsingCharges = val; }
- void PrepareProcToTrigger(AuraApplication* aurApp, ProcEventInfo& eventInfo);
- bool IsProcTriggeredOnEvent(AuraApplication* aurApp, ProcEventInfo& eventInfo) const;
+ void PrepareProcToTrigger(AuraApplication* aurApp, ProcEventInfo& eventInfo, std::chrono::steady_clock::time_point now);
+ bool IsProcTriggeredOnEvent(AuraApplication* aurApp, ProcEventInfo& eventInfo, std::chrono::steady_clock::time_point now) const;
float CalcProcChance(SpellProcEntry const& procEntry, ProcEventInfo& eventInfo) const;
void TriggerProcOnEvent(AuraApplication* aurApp, ProcEventInfo& eventInfo);
@@ -269,6 +269,8 @@ class TC_GAME_API Aura
ChargeDropEvent* m_dropEvent;
+ std::chrono::steady_clock::time_point m_procCooldown;
+
private:
Unit::AuraApplicationList m_removedApplications;
};
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 60554e0717c..883f051b700 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -1564,7 +1564,7 @@ void Spell::SelectImplicitTrajTargets(SpellEffIndex effIndex)
if (Creature* creatureTarget = unit->ToCreature())
{
- if (!(creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_PROJECTILE_COLLISION))
+ if (!(creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_COLLIDE_WITH_MISSILES))
continue;
}
}
@@ -2320,8 +2320,13 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
}
}
+ bool enablePvP = false; // need to check PvP state before spell effects, but act on it afterwards
+
if (spellHitTarget)
{
+ // if target is flagged for pvp also flag caster if a player
+ if (unit->IsPvP() && m_caster->GetTypeId() == TYPEID_PLAYER)
+ enablePvP = true; // Decide on PvP flagging now, but act on it later.
SpellMissInfo missInfo2 = DoSpellHitOnUnit(spellHitTarget, mask, target->scaleAura);
if (missInfo2 != SPELL_MISS_NONE)
{
@@ -2474,8 +2479,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
// Needs to be called after dealing damage/healing to not remove breaking on damage auras
DoTriggersOnSpellHit(spellHitTarget, mask);
- // if target is fallged for pvp also flag caster if a player
- if (unit->IsPvP() && m_caster->GetTypeId() == TYPEID_PLAYER)
+ if (enablePvP)
m_caster->ToPlayer()->UpdatePvP(true);
CallScriptAfterHitHandlers();
@@ -2986,12 +2990,17 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered
}
// don't allow channeled spells / spells with cast time to be cast while moving
+ // exception are only channeled spells that have no casttime and SPELL_ATTR5_CAN_CHANNEL_WHEN_MOVING
// (even if they are interrupted on moving, spells with almost immediate effect get to have their effect processed before movement interrupter kicks in)
if ((m_spellInfo->IsChanneled() || m_casttime) && m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->isMoving() && m_spellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_MOVEMENT)
{
- SendCastResult(SPELL_FAILED_MOVING);
- finish(false);
- return;
+ // 1. Is a channel spell, 2. Has no casttime, 3. And has flag to allow movement during channel
+ if (!(m_spellInfo->IsChanneled() && !m_casttime && m_spellInfo->HasAttribute(SPELL_ATTR5_CAN_CHANNEL_WHEN_MOVING)))
+ {
+ SendCastResult(SPELL_FAILED_MOVING);
+ finish(false);
+ return;
+ }
}
// set timer base at cast time
@@ -3219,6 +3228,10 @@ void Spell::cast(bool skipCheck)
return;
}
+ if (m_spellInfo->HasAttribute(SPELL_ATTR1_DISMISS_PET))
+ if (Creature* pet = ObjectAccessor::GetCreature(*m_caster, m_caster->GetPetGUID()))
+ pet->DespawnOrUnsummon();
+
PrepareTriggersExecutedOnHit();
CallScriptOnCastHandlers();
@@ -3528,11 +3541,11 @@ void Spell::update(uint32 difftime)
// check if the player caster has moved before the spell finished
if ((m_caster->GetTypeId() == TYPEID_PLAYER && m_timer != 0) &&
- m_caster->isMoving() && (m_spellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_MOVEMENT) &&
- (m_spellInfo->Effects[0].Effect != SPELL_EFFECT_STUCK || !m_caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING_FAR)))
+ m_caster->isMoving() && (m_spellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_MOVEMENT &&
+ (m_spellInfo->Effects[0].Effect != SPELL_EFFECT_STUCK || !m_caster->HasUnitMovementFlag(MOVEMENTFLAG_FALLING_FAR))))
{
// don't cancel for melee, autorepeat, triggered and instant spells
- if (!IsNextMeleeSwingSpell() && !IsAutoRepeat() && !IsTriggered())
+ if (!IsNextMeleeSwingSpell() && !IsAutoRepeat() && !IsTriggered() && !(IsChannelActive() && m_spellInfo->HasAttribute(SPELL_ATTR5_CAN_CHANNEL_WHEN_MOVING)))
cancel();
}
@@ -5286,7 +5299,7 @@ SpellCastResult Spell::CheckCast(bool strict)
switch (SummonProperties->Category)
{
case SUMMON_CATEGORY_PET:
- if (m_caster->GetPetGUID())
+ if (!m_spellInfo->HasAttribute(SPELL_ATTR1_DISMISS_PET) && m_caster->GetPetGUID())
return SPELL_FAILED_ALREADY_HAVE_SUMMON;
// intentional missing break, check both GetPetGUID() and GetCharmGUID for SUMMON_CATEGORY_PET
case SUMMON_CATEGORY_PUPPET:
@@ -5302,7 +5315,7 @@ SpellCastResult Spell::CheckCast(bool strict)
{
if (m_targets.GetUnitTarget()->GetTypeId() != TYPEID_PLAYER)
return SPELL_FAILED_BAD_TARGETS;
- if (m_targets.GetUnitTarget()->GetPetGUID())
+ if (!m_spellInfo->HasAttribute(SPELL_ATTR1_DISMISS_PET) && m_targets.GetUnitTarget()->GetPetGUID())
return SPELL_FAILED_ALREADY_HAVE_SUMMON;
}
break;
@@ -5311,13 +5324,13 @@ SpellCastResult Spell::CheckCast(bool strict)
{
if (m_caster->GetPetGUID()) //let warlock do a replacement summon
{
- if (m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->getClass() == CLASS_WARLOCK)
+ if (m_caster->GetTypeId() == TYPEID_PLAYER)
{
if (strict) //starting cast, trigger pet stun (cast by pet so it doesn't attack player)
if (Pet* pet = m_caster->ToPlayer()->GetPet())
pet->CastSpell(pet, 32752, true, NULL, NULL, pet->GetGUID());
}
- else
+ else if (!m_spellInfo->HasAttribute(SPELL_ATTR1_DISMISS_PET))
return SPELL_FAILED_ALREADY_HAVE_SUMMON;
}
@@ -5444,7 +5457,7 @@ SpellCastResult Spell::CheckCast(bool strict)
if (m_spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_CHARM
|| m_spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_POSSESS)
{
- if (m_caster->GetPetGUID())
+ if (!m_spellInfo->HasAttribute(SPELL_ATTR1_DISMISS_PET) && m_caster->GetPetGUID())
return SPELL_FAILED_ALREADY_HAVE_SUMMON;
if (m_caster->GetCharmGUID())
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 51b6db197db..8a16812034c 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -3019,6 +3019,12 @@ void Spell::EffectSummonPet(SpellEffIndex effIndex)
//OldSummon->Relocate(px, py, pz, OldSummon->GetOrientation());
//OldSummon->SetMap(owner->GetMap());
//owner->GetMap()->Add(OldSummon->ToCreature());
+ if (OldSummon->getPetType() == SUMMON_PET)
+ {
+ OldSummon->SetHealth(OldSummon->GetMaxHealth());
+ OldSummon->SetPower(OldSummon->getPowerType(),
+ OldSummon->GetMaxPower(OldSummon->getPowerType()));
+ }
if (owner->GetTypeId() == TYPEID_PLAYER && OldSummon->isControlled())
owner->ToPlayer()->PetSpellInitialize();
@@ -5475,7 +5481,7 @@ void Spell::EffectActivateRune(SpellEffIndex effIndex)
for (uint32 l = 0; l + 1 < MAX_RUNES && count > 0; ++l)
{
// Check if both runes are on cd as that is the only time when this needs to come into effect
- if ((player->GetRuneCooldown(l) && player->GetCurrentRune(l) == RuneType(m_spellInfo->Effects[effIndex].MiscValueB)) && (player->GetRuneCooldown(l+1) && player->GetCurrentRune(l+1) == RuneType(m_spellInfo->Effects[effIndex].MiscValueB)))
+ if ((player->GetRuneCooldown(l) && player->GetBaseRune(l) == RuneType(m_spellInfo->Effects[effIndex].MiscValueB)) && (player->GetRuneCooldown(l+1) && player->GetBaseRune(l+1) == RuneType(m_spellInfo->Effects[effIndex].MiscValueB)))
{
// Should always update the rune with the lowest cd
if (l + 1 < MAX_RUNES && player->GetRuneCooldown(l) >= player->GetRuneCooldown(l+1))
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index f6078bd063f..ac157b48783 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -525,10 +525,10 @@ float SpellEffectInfo::CalcValueMultiplier(Unit* caster, Spell* spell) const
float SpellEffectInfo::CalcDamageMultiplier(Unit* caster, Spell* spell) const
{
- float multiplier = DamageMultiplier;
+ float multiplierPercent = DamageMultiplier * 100.0f;
if (Player* modOwner = (caster ? caster->GetSpellModOwner() : NULL))
- modOwner->ApplySpellMod(_spellInfo->Id, SPELLMOD_DAMAGE_MULTIPLIER, multiplier, spell);
- return multiplier;
+ modOwner->ApplySpellMod(_spellInfo->Id, SPELLMOD_DAMAGE_MULTIPLIER, multiplierPercent, spell);
+ return multiplierPercent / 100.0f;
}
bool SpellEffectInfo::HasRadius() const
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index eb28a8adae4..4470fa7de42 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -91,7 +91,7 @@ public:
{ "disenchant_loot_template", rbac::RBAC_PERM_COMMAND_RELOAD_DISENCHANT_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesDisenchantCommand, "" },
{ "event_scripts", rbac::RBAC_PERM_COMMAND_RELOAD_EVENT_SCRIPTS, true, &HandleReloadEventScriptsCommand, "" },
{ "fishing_loot_template", rbac::RBAC_PERM_COMMAND_RELOAD_FISHING_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesFishingCommand, "" },
- { "game_graveyard_zone", rbac::RBAC_PERM_COMMAND_RELOAD_GAME_GRAVEYARD_ZONE, true, &HandleReloadGameGraveyardZoneCommand, "" },
+ { "graveyard_zone", rbac::RBAC_PERM_COMMAND_RELOAD_GRAVEYARD_ZONE, true, &HandleReloadGameGraveyardZoneCommand, "" },
{ "game_tele", rbac::RBAC_PERM_COMMAND_RELOAD_GAME_TELE, true, &HandleReloadGameTeleCommand, "" },
{ "gameobject_questender", rbac::RBAC_PERM_COMMAND_RELOAD_GAMEOBJECT_QUESTENDER, true, &HandleReloadGOQuestEnderCommand, "" },
{ "gameobject_loot_template", rbac::RBAC_PERM_COMMAND_RELOAD_GAMEOBJECT_QUEST_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesGameobjectCommand, "" },
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
index d77842fff0a..73a7de36580 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
@@ -2461,6 +2461,33 @@ class spell_igb_teleport_players_on_victory : public SpellScriptLoader
}
};
+// 71201 - Battle Experience - proc should never happen, handled in script
+class spell_igb_battle_experience_check : public SpellScriptLoader
+{
+public:
+ spell_igb_battle_experience_check() : SpellScriptLoader("spell_igb_battle_experience_check") { }
+
+ class spell_igb_battle_experience_check_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_igb_battle_experience_check_AuraScript);
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ return false;
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_igb_battle_experience_check_AuraScript::CheckProc);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_igb_battle_experience_check_AuraScript();
+ }
+};
+
class achievement_im_on_a_boat : public AchievementCriteriaScript
{
public:
@@ -2500,5 +2527,6 @@ void AddSC_boss_icecrown_gunship_battle()
new spell_igb_gunship_fall_teleport();
new spell_igb_check_for_players();
new spell_igb_teleport_players_on_victory();
+ new spell_igb_battle_experience_check();
new achievement_im_on_a_boat();
}
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
index 05beacca638..fa59c021cad 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
@@ -171,8 +171,7 @@ enum FreyaNpcs
enum FreyaActions
{
- ACTION_ELDER_DEATH = 1,
- ACTION_ELDER_FREYA_KILLED = 2
+ ACTION_ELDER_FREYA_KILLED = 1
};
enum FreyaEvents
@@ -619,7 +618,7 @@ class boss_freya : public CreatureScript
Elder->AttackStop();
Elder->CombatStop(true);
Elder->DeleteThreatList();
- Elder->GetAI()->DoAction(ACTION_ELDER_FREYA_KILLED);
+ Elder->AI()->DoAction(ACTION_ELDER_FREYA_KILLED);
}
}
}
@@ -705,19 +704,10 @@ class boss_elder_brightleaf : public CreatureScript
Talk(SAY_ELDER_SLAY);
}
- void JustDied(Unit* killer) override
+ void JustDied(Unit* /*killer*/) override
{
_JustDied();
Talk(SAY_ELDER_DEATH);
-
- if (killer->GetTypeId() == TYPEID_PLAYER)
- {
- if (Creature* Ironbranch = ObjectAccessor::GetCreature(*me, instance->GetGuidData(BOSS_IRONBRANCH)))
- Ironbranch->AI()->DoAction(ACTION_ELDER_DEATH);
-
- if (Creature* Stonebark = ObjectAccessor::GetCreature(*me, instance->GetGuidData(BOSS_STONEBARK)))
- Stonebark->AI()->DoAction(ACTION_ELDER_DEATH);
- }
}
void EnterCombat(Unit* /*who*/) override
@@ -812,19 +802,10 @@ class boss_elder_stonebark : public CreatureScript
Talk(SAY_ELDER_SLAY);
}
- void JustDied(Unit* killer) override
+ void JustDied(Unit* /*killer*/) override
{
_JustDied();
Talk(SAY_ELDER_DEATH);
-
- if (killer->GetTypeId() == TYPEID_PLAYER)
- {
- if (Creature* Ironbranch = ObjectAccessor::GetCreature(*me, instance->GetGuidData(BOSS_IRONBRANCH)))
- Ironbranch->AI()->DoAction(ACTION_ELDER_DEATH);
-
- if (Creature* Brightleaf = ObjectAccessor::GetCreature(*me, instance->GetGuidData(BOSS_BRIGHTLEAF)))
- Brightleaf->AI()->DoAction(ACTION_ELDER_DEATH);
- }
}
void EnterCombat(Unit* /*who*/) override
@@ -925,19 +906,10 @@ class boss_elder_ironbranch : public CreatureScript
Talk(SAY_ELDER_SLAY);
}
- void JustDied(Unit* killer) override
+ void JustDied(Unit* /*killer*/) override
{
_JustDied();
Talk(SAY_ELDER_DEATH);
-
- if (killer->GetTypeId() == TYPEID_PLAYER)
- {
- if (Creature* Brightleaf = ObjectAccessor::GetCreature(*me, instance->GetGuidData(BOSS_BRIGHTLEAF)))
- Brightleaf->AI()->DoAction(ACTION_ELDER_DEATH);
-
- if (Creature* Stonebark = ObjectAccessor::GetCreature(*me, instance->GetGuidData(BOSS_STONEBARK)))
- Stonebark->AI()->DoAction(ACTION_ELDER_DEATH);
- }
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp
index 4eafc1cd94e..adade245c2b 100644
--- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp
+++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp
@@ -1044,6 +1044,12 @@ public:
{
PrepareAuraScript(spell_z_check_AuraScript);
+ public:
+ spell_z_check_AuraScript()
+ {
+ _posZ = 0.0f;
+ }
+
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
_posZ = GetTarget()->GetPositionZ();
diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp
index 724019a1b19..980c0db19cc 100644
--- a/src/server/scripts/Spells/spell_dk.cpp
+++ b/src/server/scripts/Spells/spell_dk.cpp
@@ -30,6 +30,13 @@
enum DeathKnightSpells
{
+ SPELL_DK_ACCLIMATION_HOLY = 50490,
+ SPELL_DK_ACCLIMATION_FIRE = 50362,
+ SPELL_DK_ACCLIMATION_FROST = 50485,
+ SPELL_DK_ACCLIMATION_ARCANE = 50486,
+ SPELL_DK_ACCLIMATION_SHADOW = 50489,
+ SPELL_DK_ACCLIMATION_NATURE = 50488,
+ SPELL_DK_ADVANTAGE_T10_4P_MELEE = 70657,
SPELL_DK_ANTI_MAGIC_SHELL_TALENT = 51052,
SPELL_DK_BLACK_ICE_R1 = 49140,
SPELL_DK_BLOOD_BOIL_TRIGGERED = 65658,
@@ -51,6 +58,7 @@ enum DeathKnightSpells
SPELL_DK_IMPROVED_BLOOD_PRESENCE_R1 = 50365,
SPELL_DK_IMPROVED_FROST_PRESENCE_R1 = 50384,
SPELL_DK_IMPROVED_UNHOLY_PRESENCE_R1 = 50391,
+ SPELL_DK_IMPROVED_BLOOD_PRESENCE_HEAL = 50475,
SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED = 63611,
SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED = 63622,
SPELL_DK_ITEM_SIGIL_VENGEFUL_HEART = 64962,
@@ -78,6 +86,141 @@ enum Misc
NPC_DK_GHOUL = 26125
};
+// -49200 - Acclimation
+class spell_dk_acclimation : public SpellScriptLoader
+{
+public:
+ spell_dk_acclimation() : SpellScriptLoader("spell_dk_acclimation") { }
+
+ class spell_dk_acclimation_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dk_acclimation_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_ACCLIMATION_HOLY) ||
+ !sSpellMgr->GetSpellInfo(SPELL_DK_ACCLIMATION_FIRE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_DK_ACCLIMATION_FROST) ||
+ !sSpellMgr->GetSpellInfo(SPELL_DK_ACCLIMATION_NATURE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_DK_ACCLIMATION_SHADOW) ||
+ !sSpellMgr->GetSpellInfo(SPELL_DK_ACCLIMATION_ARCANE))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (eventInfo.GetDamageInfo())
+ {
+ switch (GetFirstSchoolInMask(eventInfo.GetDamageInfo()->GetSchoolMask()))
+ {
+ case SPELL_SCHOOL_HOLY:
+ case SPELL_SCHOOL_FIRE:
+ case SPELL_SCHOOL_NATURE:
+ case SPELL_SCHOOL_FROST:
+ case SPELL_SCHOOL_SHADOW:
+ case SPELL_SCHOOL_ARCANE:
+ return true;
+ default:
+ break;
+ }
+ }
+
+ return false;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ uint32 triggerspell = 0;
+
+ switch (GetFirstSchoolInMask(eventInfo.GetDamageInfo()->GetSchoolMask()))
+ {
+ case SPELL_SCHOOL_HOLY:
+ triggerspell = SPELL_DK_ACCLIMATION_HOLY;
+ break;
+ case SPELL_SCHOOL_FIRE:
+ triggerspell = SPELL_DK_ACCLIMATION_FIRE;
+ break;
+ case SPELL_SCHOOL_NATURE:
+ triggerspell = SPELL_DK_ACCLIMATION_NATURE;
+ break;
+ case SPELL_SCHOOL_FROST:
+ triggerspell = SPELL_DK_ACCLIMATION_FROST;
+ break;
+ case SPELL_SCHOOL_SHADOW:
+ triggerspell = SPELL_DK_ACCLIMATION_SHADOW;
+ break;
+ case SPELL_SCHOOL_ARCANE:
+ triggerspell = SPELL_DK_ACCLIMATION_ARCANE;
+ break;
+ default:
+ return;
+ }
+
+ if (Unit* target = eventInfo.GetActionTarget())
+ target->CastSpell(target, triggerspell, true, nullptr, aurEff);
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_dk_acclimation_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_dk_acclimation_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_dk_acclimation_AuraScript();
+ }
+};
+
+// 70656 - Advantage (T10 4P Melee Bonus)
+class spell_dk_advantage_t10_4p : public SpellScriptLoader
+{
+public:
+ spell_dk_advantage_t10_4p() : SpellScriptLoader("spell_dk_advantage_t10_4p") { }
+
+ class spell_dk_advantage_t10_4p_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dk_advantage_t10_4p_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_ADVANTAGE_T10_4P_MELEE))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (Unit* caster = eventInfo.GetActor())
+ {
+ if (caster->GetTypeId() != TYPEID_PLAYER || caster->getClass() != CLASS_DEATH_KNIGHT)
+ return false;
+
+ for (uint8 i = 0; i < MAX_RUNES; ++i)
+ if (caster->ToPlayer()->GetRuneCooldown(i) == 0)
+ return false;
+
+ return true;
+ }
+
+ return false;
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_dk_advantage_t10_4p_AuraScript::CheckProc);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_dk_advantage_t10_4p_AuraScript();
+ }
+};
+
// 50462 - Anti-Magic Shell (on raid member)
class spell_dk_anti_magic_shell_raid : public SpellScriptLoader
{
@@ -919,6 +1062,52 @@ class spell_dk_improved_blood_presence : public SpellScriptLoader
}
};
+// 63611 - Improved Blood Presence Triggered
+class spell_dk_improved_blood_presence_triggered : public SpellScriptLoader
+{
+public:
+ spell_dk_improved_blood_presence_triggered() : SpellScriptLoader("spell_dk_improved_blood_presence_triggered") { }
+
+ class spell_dk_improved_blood_presence_triggered_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dk_improved_blood_presence_triggered_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_BLOOD_PRESENCE_HEAL))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (eventInfo.GetActor()->GetTypeId() == TYPEID_PLAYER)
+ return true;
+
+ return false;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ if (DamageInfo* dmgInfo = eventInfo.GetDamageInfo())
+ eventInfo.GetActor()->CastCustomSpell(SPELL_DK_IMPROVED_BLOOD_PRESENCE_HEAL, SPELLVALUE_BASE_POINT0, CalculatePct(int32(dmgInfo->GetDamage()), aurEff->GetAmount()),
+ eventInfo.GetActor(), true, nullptr, aurEff);
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_dk_improved_blood_presence_triggered_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_dk_improved_blood_presence_triggered_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_dk_improved_blood_presence_triggered_AuraScript();
+ }
+};
+
// -50384 - Improved Frost Presence
class spell_dk_improved_frost_presence : public SpellScriptLoader
{
@@ -2006,6 +2195,8 @@ public:
void AddSC_deathknight_spell_scripts()
{
+ new spell_dk_acclimation();
+ new spell_dk_advantage_t10_4p();
new spell_dk_anti_magic_shell_raid();
new spell_dk_anti_magic_shell_self();
new spell_dk_anti_magic_zone();
@@ -2022,6 +2213,7 @@ void AddSC_deathknight_spell_scripts()
new spell_dk_ghoul_explode();
new spell_dk_icebound_fortitude();
new spell_dk_improved_blood_presence();
+ new spell_dk_improved_blood_presence_triggered();
new spell_dk_improved_frost_presence();
new spell_dk_improved_unholy_presence();
new spell_dk_pestilence();
diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp
index c088ae07e66..0bf5ab01f45 100644
--- a/src/server/scripts/Spells/spell_druid.cpp
+++ b/src/server/scripts/Spells/spell_druid.cpp
@@ -31,6 +31,13 @@ enum DruidSpells
{
SPELL_DRUID_BEAR_FORM_PASSIVE = 1178,
SPELL_DRUID_DIRE_BEAR_FORM_PASSIVE = 9635,
+ SPELL_DRUID_ECLIPSE_LUNAR_PROC = 48518,
+ SPELL_DRUID_ECLIPSE_SOLAR_PROC = 48517,
+ SPELL_DRUID_FORMS_TRINKET_BEAR = 37340,
+ SPELL_DRUID_FORMS_TRINKET_CAT = 37341,
+ SPELL_DRUID_FORMS_TRINKET_MOONKIN = 37343,
+ SPELL_DRUID_FORMS_TRINKET_NONE = 37344,
+ SPELL_DRUID_FORMS_TRINKET_TREE = 37342,
SPELL_DRUID_ENRAGE = 5229,
SPELL_DRUID_ENRAGE_MOD_DAMAGE = 51185,
SPELL_DRUID_ENRAGED_DEFENSE = 70725,
@@ -48,6 +55,8 @@ enum DruidSpells
SPELL_DRUID_NATURES_SPLENDOR = 57865,
SPELL_DRUID_SURVIVAL_INSTINCTS = 50322,
SPELL_DRUID_SAVAGE_ROAR = 62071,
+ SPELL_DRUID_T9_FERAL_RELIC_BEAR = 67354,
+ SPELL_DRUID_T9_FERAL_RELIC_CAT = 67355,
SPELL_DRUID_TIGER_S_FURY_ENERGIZE = 51178
};
@@ -131,6 +140,69 @@ class spell_dru_dash : public SpellScriptLoader
}
};
+class spell_dru_eclipse : public SpellScriptLoader
+{
+public:
+ spell_dru_eclipse() : SpellScriptLoader("spell_dru_eclipse") { }
+
+ class spell_dru_eclipse_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_eclipse_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_ECLIPSE_LUNAR_PROC))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_ECLIPSE_SOLAR_PROC))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (!eventInfo.GetSpellInfo())
+ return false;
+
+ if (eventInfo.GetActor()->HasAura(SPELL_DRUID_ECLIPSE_LUNAR_PROC) || eventInfo.GetActor()->HasAura(SPELL_DRUID_ECLIPSE_SOLAR_PROC))
+ return false;
+
+ // Triggered by Wrath?
+ if (eventInfo.GetSpellInfo()->SpellFamilyFlags[0] & 1)
+ return roll_chance_f(GetSpellInfo()->ProcChance * 0.6f) && _lunarProcCooldownEnd <= std::chrono::steady_clock::now();
+
+ return _solarProcCooldownEnd <= std::chrono::steady_clock::now();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ if (eventInfo.GetSpellInfo()->SpellFamilyFlags[0] & 1)
+ {
+ _lunarProcCooldownEnd = std::chrono::steady_clock::now() + Seconds(aurEff->GetAmount());
+ eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_DRUID_ECLIPSE_LUNAR_PROC, TRIGGERED_FULL_MASK, nullptr, aurEff);
+ }
+ else
+ {
+ _solarProcCooldownEnd = std::chrono::steady_clock::now() + Seconds(aurEff->GetAmount());
+ eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_DRUID_ECLIPSE_SOLAR_PROC, TRIGGERED_FULL_MASK, nullptr, aurEff);
+ }
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_dru_eclipse_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_dru_eclipse_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+
+ std::chrono::steady_clock::time_point _lunarProcCooldownEnd = std::chrono::steady_clock::time_point::min();
+ std::chrono::steady_clock::time_point _solarProcCooldownEnd = std::chrono::steady_clock::time_point::min();
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_dru_eclipse_AuraScript();
+ }
+};
+
// 5229 - Enrage
class spell_dru_enrage : public SpellScriptLoader
{
@@ -197,6 +269,91 @@ class spell_dru_enrage : public SpellScriptLoader
}
};
+// 37336 - Druid Forms Trinket
+class spell_dru_forms_trinket : public SpellScriptLoader
+{
+public:
+ spell_dru_forms_trinket() : SpellScriptLoader("spell_dru_forms_trinket") { }
+
+ class spell_dru_forms_trinket_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_forms_trinket_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_FORMS_TRINKET_BEAR) ||
+ !sSpellMgr->GetSpellInfo(SPELL_DRUID_FORMS_TRINKET_CAT) ||
+ !sSpellMgr->GetSpellInfo(SPELL_DRUID_FORMS_TRINKET_MOONKIN) ||
+ !sSpellMgr->GetSpellInfo(SPELL_DRUID_FORMS_TRINKET_NONE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_DRUID_FORMS_TRINKET_TREE))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ Unit* target = eventInfo.GetActor();
+
+ switch (target->GetShapeshiftForm())
+ {
+ case FORM_BEAR:
+ case FORM_DIREBEAR:
+ case FORM_CAT:
+ case FORM_MOONKIN:
+ case FORM_NONE:
+ case FORM_TREE:
+ return true;
+ default:
+ break;
+ }
+
+ return false;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ Unit* target = eventInfo.GetActor();
+ uint32 triggerspell = 0;
+
+ switch (target->GetShapeshiftForm())
+ {
+ case FORM_BEAR:
+ case FORM_DIREBEAR:
+ triggerspell = SPELL_DRUID_FORMS_TRINKET_BEAR;
+ break;
+ case FORM_CAT:
+ triggerspell = SPELL_DRUID_FORMS_TRINKET_CAT;
+ break;
+ case FORM_MOONKIN:
+ triggerspell = SPELL_DRUID_FORMS_TRINKET_MOONKIN;
+ break;
+ case FORM_NONE:
+ triggerspell = SPELL_DRUID_FORMS_TRINKET_NONE;
+ break;
+ case FORM_TREE:
+ triggerspell = SPELL_DRUID_FORMS_TRINKET_TREE;
+ break;
+ default:
+ return;
+ }
+
+ target->CastSpell(target, triggerspell, true, nullptr, aurEff);
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_dru_forms_trinket_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_dru_forms_trinket_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_dru_forms_trinket_AuraScript();
+ }
+};
+
// 54846 - Glyph of Starfire
class spell_dru_glyph_of_starfire : public SpellScriptLoader
{
@@ -1079,6 +1236,77 @@ class spell_dru_typhoon : public SpellScriptLoader
}
};
+// 67353 - T9 Feral Relic (Idol of Mutilation)
+class spell_dru_t9_feral_relic : public SpellScriptLoader
+{
+public:
+ spell_dru_t9_feral_relic() : SpellScriptLoader("spell_dru_t9_feral_relic") { }
+
+ class spell_dru_t9_feral_relic_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_t9_feral_relic_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_T9_FERAL_RELIC_BEAR) ||
+ !sSpellMgr->GetSpellInfo(SPELL_DRUID_T9_FERAL_RELIC_CAT))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ Unit* target = eventInfo.GetActor();
+
+ switch (target->GetShapeshiftForm())
+ {
+ case FORM_BEAR:
+ case FORM_DIREBEAR:
+ case FORM_CAT:
+ return true;
+ default:
+ break;
+ }
+
+ return false;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ uint32 triggerspell = 0;
+
+ Unit* target = eventInfo.GetActor();
+
+ switch (target->GetShapeshiftForm())
+ {
+ case FORM_BEAR:
+ case FORM_DIREBEAR:
+ triggerspell = SPELL_DRUID_T9_FERAL_RELIC_BEAR;
+ break;
+ case FORM_CAT:
+ triggerspell = SPELL_DRUID_T9_FERAL_RELIC_CAT;
+ break;
+ default:
+ return;
+ }
+
+ target->CastSpell(target, triggerspell, true, nullptr, aurEff);
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_dru_t9_feral_relic_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_dru_t9_feral_relic_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_dru_t9_feral_relic_AuraScript();
+ }
+};
+
// 70691 - Item T10 Restoration 4P Bonus
class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader
{
@@ -1208,7 +1436,9 @@ void AddSC_druid_spell_scripts()
{
new spell_dru_bear_form_passive();
new spell_dru_dash();
+ new spell_dru_eclipse();
new spell_dru_enrage();
+ new spell_dru_forms_trinket();
new spell_dru_glyph_of_starfire();
new spell_dru_idol_lifebloom();
new spell_dru_innervate();
@@ -1230,6 +1460,7 @@ void AddSC_druid_spell_scripts()
new spell_dru_flight_form();
new spell_dru_tiger_s_fury();
new spell_dru_typhoon();
+ new spell_dru_t9_feral_relic();
new spell_dru_t10_restoration_4p_bonus();
new spell_dru_wild_growth();
}
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 8b8c5300a9e..233819b04e8 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -430,6 +430,61 @@ class spell_gen_bandage : public SpellScriptLoader
}
};
+// Blood Reserve - 64568
+enum BloodReserve
+{
+ SPELL_GEN_BLOOD_RESERVE_AURA = 64568,
+ SPELL_GEN_BLOOD_RESERVE_HEAL = 64569
+};
+
+class spell_gen_blood_reserve : public SpellScriptLoader
+{
+ public:
+ spell_gen_blood_reserve() : SpellScriptLoader("spell_gen_blood_reserve") { }
+
+ class spell_gen_blood_reserve_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_gen_blood_reserve_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_GEN_BLOOD_RESERVE_HEAL))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (DamageInfo* dmgInfo = eventInfo.GetDamageInfo())
+ if (Unit* caster = eventInfo.GetActionTarget())
+ if (caster->HealthBelowPctDamaged(35, dmgInfo->GetDamage()))
+ return true;
+
+ return false;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ Unit* caster = eventInfo.GetActionTarget();
+ caster->CastCustomSpell(SPELL_GEN_BLOOD_RESERVE_HEAL, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), caster, TRIGGERED_FULL_MASK, nullptr, aurEff);
+ caster->RemoveAura(SPELL_GEN_BLOOD_RESERVE_AURA);
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_gen_blood_reserve_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_gen_blood_reserve_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_gen_blood_reserve_AuraScript();
+ }
+};
+
enum Bonked
{
SPELL_BONKED = 62991,
@@ -4199,6 +4254,7 @@ void AddSC_generic_spell_scripts()
new spell_gen_aura_service_uniform();
new spell_gen_av_drekthar_presence();
new spell_gen_bandage();
+ new spell_gen_blood_reserve();
new spell_gen_bonked();
new spell_gen_break_shield("spell_gen_break_shield");
new spell_gen_break_shield("spell_gen_tournament_counterattack");
diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp
index 82d9d134445..0e952818a2f 100644
--- a/src/server/scripts/Spells/spell_hunter.cpp
+++ b/src/server/scripts/Spells/spell_hunter.cpp
@@ -51,9 +51,11 @@ enum HunterSpells
SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED = 54114,
SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF = 55711,
SPELL_HUNTER_PET_CARRION_FEEDER_TRIGGERED = 54045,
+ SPELL_HUNTER_PIERCING_SHOTS = 63468,
SPELL_HUNTER_READINESS = 23989,
SPELL_HUNTER_SNIPER_TRAINING_R1 = 53302,
SPELL_HUNTER_SNIPER_TRAINING_BUFF_R1 = 64418,
+ SPELL_HUNTER_T9_4P_GREATNESS = 68130,
SPELL_HUNTER_VICIOUS_VIPER = 61609,
SPELL_HUNTER_VIPER_ATTACK_SPEED = 60144,
SPELL_DRAENEI_GIFT_OF_THE_NAARU = 59543
@@ -704,6 +706,63 @@ class spell_hun_pet_heart_of_the_phoenix : public SpellScriptLoader
}
};
+// -53234 - Piercing Shots
+class spell_hun_piercing_shots : public SpellScriptLoader
+{
+public:
+ spell_hun_piercing_shots() : SpellScriptLoader("spell_hun_piercing_shots") { }
+
+ class spell_hun_piercing_shots_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_hun_piercing_shots_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_PIERCING_SHOTS))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (eventInfo.GetActionTarget())
+ return true;
+ return false;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ Unit* caster = eventInfo.GetActor();
+ Unit* target = eventInfo.GetActionTarget();
+
+ if (DamageInfo* dmgInfo = eventInfo.GetDamageInfo())
+ {
+ SpellInfo const* piercingShots = sSpellMgr->AssertSpellInfo(SPELL_HUNTER_PIERCING_SHOTS);
+ int32 duration = piercingShots->GetMaxDuration();
+ uint32 amplitude = piercingShots->Effects[EFFECT_0].Amplitude;
+ uint32 dmg = dmgInfo->GetDamage();
+
+ uint32 bp = CalculatePct(int32(dmg), aurEff->GetAmount()) / (duration / int32(amplitude));
+ bp += target->GetRemainingPeriodicAmount(target->GetGUID(), SPELL_HUNTER_PIERCING_SHOTS, SPELL_AURA_PERIODIC_DAMAGE);
+
+ caster->CastCustomSpell(SPELL_HUNTER_PIERCING_SHOTS, SPELLVALUE_BASE_POINT0, bp, target, true, nullptr, aurEff);
+ }
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_hun_piercing_shots_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_hun_piercing_shots_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_hun_piercing_shots_AuraScript();
+ }
+};
+
// 56654, 58882 - Rapid Recuperation
class spell_hun_rapid_recuperation : public SpellScriptLoader
{
@@ -967,6 +1026,51 @@ class spell_hun_target_only_pet_and_owner : public SpellScriptLoader
}
};
+// 67151 - T9 4P Bonus
+class spell_hun_t9_4p_bonus : public SpellScriptLoader
+{
+public:
+ spell_hun_t9_4p_bonus() : SpellScriptLoader("spell_hun_t9_4p_bonus") { }
+
+ class spell_hun_t9_4p_bonus_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_hun_t9_4p_bonus_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_T9_4P_GREATNESS))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (eventInfo.GetActor()->GetTypeId() == TYPEID_PLAYER && eventInfo.GetActor()->ToPlayer()->GetPet())
+ return true;
+ return false;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ Unit* caster = eventInfo.GetActor();
+
+ caster->CastSpell(caster->ToPlayer()->GetPet(), SPELL_HUNTER_T9_4P_GREATNESS, true, nullptr, aurEff);
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_hun_t9_4p_bonus_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_hun_t9_4p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_hun_t9_4p_bonus_AuraScript();
+ }
+};
+
// 60144 - Viper Attack Speed
class spell_hun_viper_attack_speed : public SpellScriptLoader
{
@@ -1025,11 +1129,13 @@ void AddSC_hunter_spell_scripts()
new spell_hun_misdirection_proc();
new spell_hun_pet_carrion_feeder();
new spell_hun_pet_heart_of_the_phoenix();
+ new spell_hun_piercing_shots();
new spell_hun_rapid_recuperation();
new spell_hun_readiness();
new spell_hun_scatter_shot();
new spell_hun_sniper_training();
new spell_hun_tame_beast();
new spell_hun_target_only_pet_and_owner();
+ new spell_hun_t9_4p_bonus();
new spell_hun_viper_attack_speed();
}
diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp
index 84c67bad63b..f7c2cefa202 100644
--- a/src/server/scripts/Spells/spell_item.cpp
+++ b/src/server/scripts/Spells/spell_item.cpp
@@ -2731,6 +2731,70 @@ public:
}
};
+enum SoulPreserver
+{
+ SPELL_SOUL_PRESERVER_DRUID = 60512,
+ SPELL_SOUL_PRESERVER_PALADIN = 60513,
+ SPELL_SOUL_PRESERVER_PRIEST = 60514,
+ SPELL_SOUL_PRESERVER_SHAMAN = 60515,
+};
+
+class spell_item_soul_preserver : public SpellScriptLoader
+{
+public:
+ spell_item_soul_preserver() : SpellScriptLoader("spell_item_soul_preserver") { }
+
+ class spell_item_soul_preserver_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_soul_preserver_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SOUL_PRESERVER_DRUID) ||
+ !sSpellMgr->GetSpellInfo(SPELL_SOUL_PRESERVER_PALADIN) ||
+ !sSpellMgr->GetSpellInfo(SPELL_SOUL_PRESERVER_PRIEST) ||
+ !sSpellMgr->GetSpellInfo(SPELL_SOUL_PRESERVER_SHAMAN))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ Unit* caster = eventInfo.GetActor();
+
+ switch (caster->getClass())
+ {
+ case CLASS_DRUID:
+ caster->CastSpell(caster, SPELL_SOUL_PRESERVER_DRUID, true, nullptr, aurEff);
+ break;
+ case CLASS_PALADIN:
+ caster->CastSpell(caster, SPELL_SOUL_PRESERVER_PALADIN, true, nullptr, aurEff);
+ break;
+ case CLASS_PRIEST:
+ caster->CastSpell(caster, SPELL_SOUL_PRESERVER_PRIEST, true, nullptr, aurEff);
+ break;
+ case CLASS_SHAMAN:
+ caster->CastSpell(caster, SPELL_SOUL_PRESERVER_SHAMAN, true, nullptr, aurEff);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_item_soul_preserver_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_item_soul_preserver_AuraScript();
+ }
+};
+
class spell_item_toy_train_set_pulse : public SpellScriptLoader
{
public:
@@ -2768,6 +2832,336 @@ public:
}
};
+enum DeathChoiceSpells
+{
+ SPELL_DEATH_CHOICE_NORMAL_AURA = 67702,
+ SPELL_DEATH_CHOICE_NORMAL_AGILITY = 67703,
+ SPELL_DEATH_CHOICE_NORMAL_STRENGTH = 67708,
+ SPELL_DEATH_CHOICE_HEROIC_AURA = 67771,
+ SPELL_DEATH_CHOICE_HEROIC_AGILITY = 67772,
+ SPELL_DEATH_CHOICE_HEROIC_STRENGTH = 67773
+};
+
+class spell_item_death_choice : public SpellScriptLoader
+{
+public:
+ spell_item_death_choice() : SpellScriptLoader("spell_item_death_choice") { }
+
+ class spell_item_death_choice_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_death_choice_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DEATH_CHOICE_NORMAL_STRENGTH) ||
+ !sSpellMgr->GetSpellInfo(SPELL_DEATH_CHOICE_NORMAL_AGILITY) ||
+ !sSpellMgr->GetSpellInfo(SPELL_DEATH_CHOICE_HEROIC_STRENGTH) ||
+ !sSpellMgr->GetSpellInfo(SPELL_DEATH_CHOICE_HEROIC_AGILITY))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ Unit* caster = eventInfo.GetActor();
+ float str = caster->GetStat(STAT_STRENGTH);
+ float agi = caster->GetStat(STAT_AGILITY);
+
+ switch (aurEff->GetId())
+ {
+ case SPELL_DEATH_CHOICE_NORMAL_AURA:
+ {
+ if (str > agi)
+ caster->CastSpell(caster, SPELL_DEATH_CHOICE_NORMAL_STRENGTH, true, nullptr, aurEff);
+ else
+ caster->CastSpell(caster, SPELL_DEATH_CHOICE_NORMAL_AGILITY, true, nullptr, aurEff);
+ break;
+ }
+ case SPELL_DEATH_CHOICE_HEROIC_AURA:
+ {
+ if (str > agi)
+ caster->CastSpell(caster, SPELL_DEATH_CHOICE_HEROIC_STRENGTH, true, nullptr, aurEff);
+ else
+ caster->CastSpell(caster, SPELL_DEATH_CHOICE_HEROIC_AGILITY, true, nullptr, aurEff);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_item_death_choice_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_item_death_choice_AuraScript();
+ }
+};
+
+enum TrinketStackSpells
+{
+ SPELL_LIGHTNING_CAPACITOR_AURA = 37657, // Lightning Capacitor
+ SPELL_LIGHTNING_CAPACITOR_STACK = 37658,
+ SPELL_LIGHTNING_CAPACITOR_TRIGGER = 37661,
+ SPELL_THUNDER_CAPACITOR_AURA = 54841, // Thunder Capacitor
+ SPELL_THUNDER_CAPACITOR_STACK = 54842,
+ SPELL_THUNDER_CAPACITOR_TRIGGER = 54843,
+ SPELL_TOC25_CASTER_TRINKET_NORMAL_AURA = 67712, // Item - Coliseum 25 Normal Caster Trinket
+ SPELL_TOC25_CASTER_TRINKET_NORMAL_STACK = 67713,
+ SPELL_TOC25_CASTER_TRINKET_NORMAL_TRIGGER = 67714,
+ SPELL_TOC25_CASTER_TRINKET_HEROIC_AURA = 67758, // Item - Coliseum 25 Heroic Caster Trinket
+ SPELL_TOC25_CASTER_TRINKET_HEROIC_STACK = 67759,
+ SPELL_TOC25_CASTER_TRINKET_HEROIC_TRIGGER = 67760,
+};
+
+class spell_item_trinket_stack : public SpellScriptLoader
+{
+public:
+ spell_item_trinket_stack(char const* scriptName, uint32 stackSpell, uint32 triggerSpell) : SpellScriptLoader(scriptName),
+ _stackSpell(stackSpell), _triggerSpell(triggerSpell)
+ {
+ }
+
+ class spell_item_trinket_stack_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_trinket_stack_AuraScript);
+
+ public:
+ spell_item_trinket_stack_AuraScript(uint32 stackSpell, uint32 triggerSpell) : _stackSpell(stackSpell), _triggerSpell(triggerSpell)
+ {
+ }
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(_stackSpell) || !sSpellMgr->GetSpellInfo(_triggerSpell))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ Unit* caster = eventInfo.GetActor();
+
+ caster->CastSpell(caster, _stackSpell, true, nullptr, aurEff); // cast the stack
+
+ Aura* dummy = caster->GetAura(_stackSpell); // retrieve aura
+
+ //dont do anything if it's not the right amount of stacks;
+ if (!dummy || dummy->GetStackAmount() < aurEff->GetAmount())
+ return;
+
+ // if right amount, remove the aura and cast real trigger
+ caster->RemoveAurasDueToSpell(_stackSpell);
+ if (Unit* target = eventInfo.GetActionTarget())
+ caster->CastSpell(target, _triggerSpell, true, nullptr, aurEff);
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_item_trinket_stack_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+
+ private:
+ uint32 _stackSpell;
+ uint32 _triggerSpell;
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_item_trinket_stack_AuraScript(_stackSpell, _triggerSpell);
+ }
+
+private:
+ uint32 _stackSpell;
+ uint32 _triggerSpell;
+};
+
+// 57345 - Darkmoon Card: Greatness
+enum DarkmoonCardSpells
+{
+ SPELL_DARKMOON_CARD_STRENGHT = 60229,
+ SPELL_DARKMOON_CARD_AGILITY = 60233,
+ SPELL_DARKMOON_CARD_INTELLECT = 60234,
+ SPELL_DARKMOON_CARD_SPIRIT = 60235,
+};
+
+class spell_item_darkmoon_card_greatness : public SpellScriptLoader
+{
+public:
+ spell_item_darkmoon_card_greatness() : SpellScriptLoader("spell_item_darkmoon_card_greatness") { }
+
+ class spell_item_darkmoon_card_greatness_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_darkmoon_card_greatness_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DARKMOON_CARD_STRENGHT) ||
+ !sSpellMgr->GetSpellInfo(SPELL_DARKMOON_CARD_AGILITY) ||
+ !sSpellMgr->GetSpellInfo(SPELL_DARKMOON_CARD_INTELLECT) ||
+ !sSpellMgr->GetSpellInfo(SPELL_DARKMOON_CARD_SPIRIT))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ Unit* caster = eventInfo.GetActor();
+ float str = caster->GetStat(STAT_STRENGTH);
+ float agi = caster->GetStat(STAT_AGILITY);
+ float intl = caster->GetStat(STAT_INTELLECT);
+ float spi = caster->GetStat(STAT_SPIRIT);
+ float stat = 0.0f;
+
+ uint32 spellTrigger = SPELL_DARKMOON_CARD_STRENGHT;
+
+ if (str > stat)
+ {
+ spellTrigger = SPELL_DARKMOON_CARD_STRENGHT;
+ stat = str;
+ }
+
+ if (agi > stat)
+ {
+ spellTrigger = SPELL_DARKMOON_CARD_AGILITY;
+ stat = agi;
+ }
+
+ if (intl > stat)
+ {
+ spellTrigger = SPELL_DARKMOON_CARD_INTELLECT;
+ stat = intl;
+ }
+
+ if (spi > stat)
+ {
+ spellTrigger = SPELL_DARKMOON_CARD_SPIRIT;
+ stat = spi;
+ }
+
+ caster->CastSpell(caster, spellTrigger, true, nullptr, aurEff);
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_item_darkmoon_card_greatness_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_item_darkmoon_card_greatness_AuraScript();
+ }
+};
+
+// 43820 - Amani Charm of the Witch Doctor
+enum CharmWitchDoctor
+{
+ SPELL_CHARM_WITCH_DOCTOR_PROC = 43821
+};
+
+class spell_item_charm_witch_doctor : public SpellScriptLoader
+{
+public:
+ spell_item_charm_witch_doctor() : SpellScriptLoader("spell_item_charm_witch_doctor") { }
+
+ class spell_item_charm_witch_doctor_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_charm_witch_doctor_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_CHARM_WITCH_DOCTOR_PROC))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ Unit* caster = eventInfo.GetActor();
+ Unit* target = eventInfo.GetActionTarget();
+
+ if (target)
+ {
+ int32 bp = CalculatePct(target->GetCreateHealth(),aurEff->GetSpellInfo()->Effects[1].CalcValue());
+ caster->CastCustomSpell(target, SPELL_CHARM_WITCH_DOCTOR_PROC, &bp, nullptr, nullptr, true, nullptr, aurEff);
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_item_charm_witch_doctor_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_item_charm_witch_doctor_AuraScript();
+ }
+};
+
+// 27522,40336 - Mana Drain
+enum ManaDrainSpells
+{
+ SPELL_MANA_DRAIN_ENERGIZE = 29471,
+ SPELL_MANA_DRAIN_LEECH = 27526
+};
+
+class spell_item_mana_drain : public SpellScriptLoader
+{
+public:
+ spell_item_mana_drain() : SpellScriptLoader("spell_item_mana_drain") { }
+
+ class spell_item_mana_drain_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_mana_drain_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MANA_DRAIN_ENERGIZE)
+ || !sSpellMgr->GetSpellInfo(SPELL_MANA_DRAIN_LEECH))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ Unit* caster = eventInfo.GetActor();
+ Unit* target = eventInfo.GetActionTarget();
+
+ if (caster->IsAlive())
+ caster->CastSpell(caster, SPELL_MANA_DRAIN_ENERGIZE, true, nullptr, aurEff);
+
+ if (target && target->IsAlive())
+ caster->CastSpell(target, SPELL_MANA_DRAIN_LEECH, true, nullptr, aurEff);
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_item_mana_drain_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_item_mana_drain_AuraScript();
+ }
+};
+
void AddSC_item_spell_scripts()
{
// 23074 Arcanite Dragonling
@@ -2838,5 +3232,14 @@ void AddSC_item_spell_scripts()
new spell_item_chicken_cover();
new spell_item_muisek_vessel();
new spell_item_greatmothers_soulcatcher();
+ new spell_item_soul_preserver();
new spell_item_toy_train_set_pulse();
+ new spell_item_death_choice();
+ new spell_item_trinket_stack("spell_item_lightning_capacitor", SPELL_LIGHTNING_CAPACITOR_STACK, SPELL_LIGHTNING_CAPACITOR_TRIGGER);
+ new spell_item_trinket_stack("spell_item_thunder_capacitor", SPELL_THUNDER_CAPACITOR_STACK, SPELL_THUNDER_CAPACITOR_TRIGGER);
+ new spell_item_trinket_stack("spell_item_toc25_normal_caster_trinket", SPELL_TOC25_CASTER_TRINKET_NORMAL_STACK, SPELL_TOC25_CASTER_TRINKET_NORMAL_TRIGGER);
+ new spell_item_trinket_stack("spell_item_toc25_heroic_caster_trinket", SPELL_TOC25_CASTER_TRINKET_HEROIC_STACK, SPELL_TOC25_CASTER_TRINKET_HEROIC_TRIGGER);
+ new spell_item_darkmoon_card_greatness();
+ new spell_item_charm_witch_doctor();
+ new spell_item_mana_drain();
}
diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp
index 2f4e4fa6f44..bacbe31630c 100644
--- a/src/server/scripts/Spells/spell_mage.cpp
+++ b/src/server/scripts/Spells/spell_mage.cpp
@@ -29,6 +29,7 @@
enum MageSpells
{
+ SPELL_MAGE_BLAZING_SPEED = 31643,
SPELL_MAGE_BURNOUT = 29077,
SPELL_MAGE_COLD_SNAP = 11958,
SPELL_MAGE_FOCUS_MAGIC_PROC = 54648,
@@ -116,6 +117,42 @@ class spell_mage_blast_wave : public SpellScriptLoader
}
};
+// -31641 - Blazing Speed
+class spell_mage_blazing_speed : public SpellScriptLoader
+{
+public:
+ spell_mage_blazing_speed() : SpellScriptLoader("spell_mage_blazing_speed") { }
+
+ class spell_mage_blazing_speed_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_mage_blazing_speed_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_BLAZING_SPEED))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ if (Unit* target = eventInfo.GetActionTarget())
+ target->CastSpell(target, SPELL_MAGE_BLAZING_SPEED, true, nullptr, aurEff);
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_mage_blazing_speed_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_mage_blazing_speed_AuraScript();
+ }
+};
+
// -44449 - Burnout
class spell_mage_burnout : public SpellScriptLoader
{
@@ -647,6 +684,7 @@ class spell_mage_summon_water_elemental : public SpellScriptLoader
void AddSC_mage_spell_scripts()
{
new spell_mage_blast_wave();
+ new spell_mage_blazing_speed();
new spell_mage_burnout();
new spell_mage_cold_snap();
new spell_mage_fire_frost_ward();
diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp
index d9fd36f5fd4..eed84d4ff6b 100644
--- a/src/server/scripts/Spells/spell_paladin.cpp
+++ b/src/server/scripts/Spells/spell_paladin.cpp
@@ -37,6 +37,7 @@ enum PaladinSpells
SPELL_PALADIN_HOLY_SHOCK_R1 = 20473,
SPELL_PALADIN_HOLY_SHOCK_R1_DAMAGE = 25912,
SPELL_PALADIN_HOLY_SHOCK_R1_HEALING = 25914,
+ SPELL_PALADIN_ILLUMINATION_ENERGIZE = 20272,
SPELL_PALADIN_BLESSING_OF_LOWER_CITY_DRUID = 37878,
SPELL_PALADIN_BLESSING_OF_LOWER_CITY_PALADIN = 37879,
@@ -871,6 +872,61 @@ class spell_pal_holy_shock : public SpellScriptLoader
}
};
+// -20210 - Illumination
+class spell_pal_illumination : public SpellScriptLoader
+{
+public:
+ spell_pal_illumination() : SpellScriptLoader("spell_pal_illumination") { }
+
+ class spell_pal_illumination_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pal_illumination_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_HOLY_SHOCK_R1_HEALING) ||
+ !sSpellMgr->GetSpellInfo(SPELL_PALADIN_ILLUMINATION_ENERGIZE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_PALADIN_HOLY_SHOCK_R1))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ // this script is valid only for the Holy Shock procs of illumination
+ if (eventInfo.GetHealInfo() && eventInfo.GetHealInfo()->GetSpellInfo())
+ {
+ if (eventInfo.GetHealInfo()->GetSpellInfo()->SpellFamilyFlags[1] & 0x00010000)
+ {
+ PreventDefaultAction();
+ Unit* target = eventInfo.GetActor(); // Paladin is the target of the energize
+
+ // proc comes from the Holy Shock heal, need to get mana cost of original spell
+ uint32 originalspellid = sSpellMgr->GetSpellWithRank(SPELL_PALADIN_HOLY_SHOCK_R1, eventInfo.GetHealInfo()->GetSpellInfo()->GetRank());
+ SpellInfo const* originalSpell = sSpellMgr->GetSpellInfo(originalspellid);
+ if (originalSpell && aurEff->GetSpellInfo())
+ {
+ uint32 bp = CalculatePct(originalSpell->CalcPowerCost(target, originalSpell->GetSchoolMask()), aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue());
+ target->CastCustomSpell(SPELL_PALADIN_ILLUMINATION_ENERGIZE, SPELLVALUE_BASE_POINT0, bp, target, true, nullptr, aurEff);
+ }
+ }
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_pal_illumination_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_pal_illumination_AuraScript();
+ }
+};
+
// Maybe this is incorrect
// These spells should always be cast on login, regardless of whether the player has the talent or not
@@ -1393,6 +1449,7 @@ void AddSC_paladin_spell_scripts()
new spell_pal_hand_of_sacrifice();
new spell_pal_hand_of_salvation();
new spell_pal_holy_shock();
+ new spell_pal_illumination();
new spell_pal_improved_aura("spell_pal_improved_concentraction_aura", SPELL_PALADIN_IMPROVED_CONCENTRACTION_AURA);
new spell_pal_improved_aura("spell_pal_improved_devotion_aura", SPELL_PALADIN_IMPROVED_DEVOTION_AURA);
new spell_pal_improved_aura("spell_pal_sanctified_retribution", SPELL_PALADIN_SANCTIFIED_RETRIBUTION_AURA);
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index 51f03346df1..9e2d265aa9c 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -29,6 +29,7 @@
enum PriestSpells
{
+ SPELL_PRIEST_BLESSED_RECOVERY_R1 = 27813,
SPELL_PRIEST_DIVINE_AEGIS = 47753,
SPELL_PRIEST_EMPOWERED_RENEW = 63544,
SPELL_PRIEST_GLYPH_OF_CIRCLE_OF_HEALING = 55675,
@@ -88,6 +89,50 @@ class RaidCheck
Unit const* _caster;
};
+// -27811 - Blessed Recovery
+class spell_pri_blessed_recovery : public SpellScriptLoader
+{
+public:
+ spell_pri_blessed_recovery() : SpellScriptLoader("spell_pri_blessed_recovery") { }
+
+ class spell_pri_blessed_recovery_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_blessed_recovery_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_BLESSED_RECOVERY_R1))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ if (DamageInfo* dmgInfo = eventInfo.GetDamageInfo())
+ {
+ if (Unit* target = eventInfo.GetActionTarget())
+ {
+ uint32 triggerSpell = sSpellMgr->GetSpellWithRank(SPELL_PRIEST_BLESSED_RECOVERY_R1, aurEff->GetSpellInfo()->GetRank());
+ uint32 bp = CalculatePct(int32(dmgInfo->GetDamage()), aurEff->GetAmount()) / 3;
+ bp += target->GetRemainingPeriodicAmount(target->GetGUID(), triggerSpell, SPELL_AURA_PERIODIC_HEAL);
+ target->CastCustomSpell(triggerSpell, SPELLVALUE_BASE_POINT0, bp, target, true, nullptr, aurEff);
+ }
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_pri_blessed_recovery_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_pri_blessed_recovery_AuraScript();
+ }
+};
+
// -34861 - Circle of Healing
class spell_pri_circle_of_healing : public SpellScriptLoader
{
@@ -869,6 +914,7 @@ class spell_pri_vampiric_touch : public SpellScriptLoader
void AddSC_priest_spell_scripts()
{
+ new spell_pri_blessed_recovery();
new spell_pri_circle_of_healing();
new spell_pri_divine_aegis();
new spell_pri_divine_hymn();
diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp
index affc4d1c26c..1abb6741e0d 100644
--- a/src/server/scripts/Spells/spell_rogue.cpp
+++ b/src/server/scripts/Spells/spell_rogue.cpp
@@ -43,7 +43,8 @@ enum RogueSpells
SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC = 59628,
SPELL_ROGUE_HONOR_AMONG_THIEVES = 51698,
SPELL_ROGUE_HONOR_AMONG_THIEVES_PROC = 52916,
- SPELL_ROGUE_HONOR_AMONG_THIEVES_2 = 51699
+ SPELL_ROGUE_HONOR_AMONG_THIEVES_2 = 51699,
+ SPELL_ROGUE_T10_2P_BONUS = 70804,
};
// 13877, 33735, (check 51211, 65956) - Blade Flurry
@@ -843,6 +844,40 @@ public:
}
};
+// 70805 - Rogue T10 2P Bonus -- THIS SHOULD BE REMOVED WITH NEW PROC SYSTEM.
+class spell_rog_t10_2p_bonus : public SpellScriptLoader
+{
+public:
+ spell_rog_t10_2p_bonus() : SpellScriptLoader("spell_rog_t10_2p_bonus") { }
+
+ class spell_rog_t10_2p_bonus_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_rog_t10_2p_bonus_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_T10_2P_BONUS))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetActor() == eventInfo.GetActionTarget();
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_rog_t10_2p_bonus_AuraScript::CheckProc);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_rog_t10_2p_bonus_AuraScript();
+ }
+};
+
void AddSC_rogue_spell_scripts()
{
new spell_rog_blade_flurry();
@@ -858,4 +893,5 @@ void AddSC_rogue_spell_scripts()
new spell_rog_tricks_of_the_trade_proc();
new spell_rog_honor_among_thieves();
new spell_rog_honor_among_thieves_proc();
+ new spell_rog_t10_2p_bonus();
}
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index 41e72b1388b..ad65c7c6ec7 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -48,8 +48,10 @@ enum ShamanSpells
SPELL_SHAMAN_ITEM_MANA_SURGE = 23571,
SPELL_SHAMAN_LAVA_FLOWS_R1 = 51480,
SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1 = 64694,
+ SPELL_SHAMAN_LIGHTNING_SHIELD_R1 = 26364,
SPELL_SHAMAN_MANA_SPRING_TOTEM_ENERGIZE = 52032,
SPELL_SHAMAN_MANA_TIDE_TOTEM = 39609,
+ SPELL_SHAMAN_NATURE_GUARDIAN = 31616,
SPELL_SHAMAN_SATED = 57724,
SPELL_SHAMAN_STORM_EARTH_AND_FIRE = 51483,
SPELL_SHAMAN_TOTEM_EARTHBIND_EARTHGRAB = 64695,
@@ -671,7 +673,7 @@ class spell_sha_heroism : public SpellScriptLoader
}
};
-// 23551 - Lightning Shield
+// 23551 - Lightning Shield T2 Bonus
class spell_sha_item_lightning_shield : public SpellScriptLoader
{
public:
@@ -706,7 +708,7 @@ class spell_sha_item_lightning_shield : public SpellScriptLoader
}
};
-// 23552 - Lightning Shield
+// 23552 - Lightning Shield T2 Bonus
class spell_sha_item_lightning_shield_trigger : public SpellScriptLoader
{
public:
@@ -718,7 +720,7 @@ class spell_sha_item_lightning_shield_trigger : public SpellScriptLoader
bool Validate(SpellInfo const* /*spellInfo*/) override
{
- if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ITEM_MANA_SURGE))
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE))
return false;
return true;
}
@@ -753,7 +755,7 @@ class spell_sha_item_mana_surge : public SpellScriptLoader
bool Validate(SpellInfo const* /*spellInfo*/) override
{
- if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE))
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ITEM_MANA_SURGE))
return false;
return true;
}
@@ -865,6 +867,51 @@ class spell_sha_lava_lash : public SpellScriptLoader
}
};
+// -324 - Lightning Shield
+class spell_sha_lightning_shield : public SpellScriptLoader
+{
+public:
+ spell_sha_lightning_shield() : SpellScriptLoader("spell_sha_lightning_shield") { }
+
+ class spell_sha_lightning_shield_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_sha_lightning_shield_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LIGHTNING_SHIELD_R1))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (eventInfo.GetActionTarget())
+ return true;
+ return false;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ uint32 triggerSpell = sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_LIGHTNING_SHIELD_R1, aurEff->GetSpellInfo()->GetRank());
+
+ eventInfo.GetActionTarget()->CastSpell(eventInfo.GetActor(), triggerSpell, true, nullptr, aurEff);
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_sha_lightning_shield_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_sha_lightning_shield_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_sha_lightning_shield_AuraScript();
+ }
+};
+
// 52031, 52033, 52034, 52035, 52036, 58778, 58779, 58780 - Mana Spring Totem
class spell_sha_mana_spring_totem : public SpellScriptLoader
{
@@ -924,6 +971,7 @@ class spell_sha_mana_tide_totem : public SpellScriptLoader
void HandleDummy(SpellEffIndex /*effIndex*/)
{
if (Unit* caster = GetCaster())
+ {
if (Unit* unitTarget = GetHitUnit())
{
if (unitTarget->getPowerType() == POWER_MANA)
@@ -938,6 +986,7 @@ class spell_sha_mana_tide_totem : public SpellScriptLoader
caster->CastCustomSpell(unitTarget, SPELL_SHAMAN_MANA_TIDE_TOTEM, &effBasePoints0, NULL, NULL, true, NULL, NULL, GetOriginalCaster()->GetGUID());
}
}
+ }
}
void Register() override
@@ -952,6 +1001,56 @@ class spell_sha_mana_tide_totem : public SpellScriptLoader
}
};
+// -30881 - Nature's Guardian
+class spell_sha_nature_guardian : public SpellScriptLoader
+{
+public:
+ spell_sha_nature_guardian() : SpellScriptLoader("spell_sha_nature_guardian") { }
+
+ class spell_sha_nature_guardian_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_sha_nature_guardian_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_NATURE_GUARDIAN))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 healthpct = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); // %s2 - the 30% threshold for health
+
+ if (Unit* target = eventInfo.GetActionTarget())
+ {
+ if (target->HealthBelowPctDamaged(healthpct, eventInfo.GetDamageInfo()->GetDamage()))
+ {
+
+ uint32 bp = CalculatePct(target->GetMaxHealth(), aurEff->GetAmount());
+ target->CastCustomSpell(SPELL_SHAMAN_NATURE_GUARDIAN, SPELLVALUE_BASE_POINT0, bp, target, true, nullptr, aurEff);
+
+ // Threat reduction is around 10% confirmed in retail and from wiki
+ Unit* attacker = eventInfo.GetActor();
+ if (attacker->IsAlive())
+ attacker->getThreatManager().modifyThreatPercent(target, -10);
+ }
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_sha_nature_guardian_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_sha_nature_guardian_AuraScript();
+ }
+};
+
// 6495 - Sentry Totem
class spell_sha_sentry_totem : public SpellScriptLoader
{
@@ -1085,8 +1184,10 @@ void AddSC_shaman_spell_scripts()
new spell_sha_item_mana_surge();
new spell_sha_item_t10_elemental_2p_bonus();
new spell_sha_lava_lash();
+ new spell_sha_lightning_shield();
new spell_sha_mana_spring_totem();
new spell_sha_mana_tide_totem();
+ new spell_sha_nature_guardian();
new spell_sha_sentry_totem();
new spell_sha_thunderstorm();
new spell_sha_totemic_mastery();
diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp
index 1f2ddcfa9c7..5e0074bf9f7 100644
--- a/src/server/scripts/Spells/spell_warlock.cpp
+++ b/src/server/scripts/Spells/spell_warlock.cpp
@@ -50,6 +50,12 @@ enum WarlockSpells
SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2 = 60956,
SPELL_WARLOCK_LIFE_TAP_ENERGIZE = 31818,
SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2 = 32553,
+ SPELL_WARLOCK_NETHER_PROTECTION_HOLY = 54370,
+ SPELL_WARLOCK_NETHER_PROTECTION_FIRE = 54371,
+ SPELL_WARLOCK_NETHER_PROTECTION_FROST = 54372,
+ SPELL_WARLOCK_NETHER_PROTECTION_ARCANE = 54373,
+ SPELL_WARLOCK_NETHER_PROTECTION_SHADOW = 54374,
+ SPELL_WARLOCK_NETHER_PROTECTION_NATURE = 54375,
SPELL_WARLOCK_SOULSHATTER = 32835,
SPELL_WARLOCK_SIPHON_LIFE_HEAL = 63106,
SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL = 31117
@@ -684,6 +690,95 @@ class spell_warl_life_tap : public SpellScriptLoader
}
};
+// -30299 - Nether Protection
+class spell_warl_nether_protection : public SpellScriptLoader
+{
+public:
+ spell_warl_nether_protection() : SpellScriptLoader("spell_warl_nether_protection") { }
+
+ class spell_warl_nether_protection_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warl_nether_protection_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_NETHER_PROTECTION_HOLY) ||
+ !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_NETHER_PROTECTION_FIRE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_NETHER_PROTECTION_FROST) ||
+ !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_NETHER_PROTECTION_ARCANE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_NETHER_PROTECTION_SHADOW) ||
+ !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_NETHER_PROTECTION_NATURE))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (eventInfo.GetDamageInfo())
+ {
+ switch (GetFirstSchoolInMask(eventInfo.GetDamageInfo()->GetSchoolMask()))
+ {
+ case SPELL_SCHOOL_HOLY:
+ case SPELL_SCHOOL_FIRE:
+ case SPELL_SCHOOL_NATURE:
+ case SPELL_SCHOOL_FROST:
+ case SPELL_SCHOOL_SHADOW:
+ case SPELL_SCHOOL_ARCANE:
+ return true;
+ default:
+ break;
+ }
+ }
+
+ return false;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ uint32 triggerspell = 0;
+
+ switch (GetFirstSchoolInMask(eventInfo.GetDamageInfo()->GetSchoolMask()))
+ {
+ case SPELL_SCHOOL_HOLY:
+ triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_HOLY;
+ break;
+ case SPELL_SCHOOL_FIRE:
+ triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_FIRE;
+ break;
+ case SPELL_SCHOOL_NATURE:
+ triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_NATURE;
+ break;
+ case SPELL_SCHOOL_FROST:
+ triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_FROST;
+ break;
+ case SPELL_SCHOOL_SHADOW:
+ triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_SHADOW;
+ break;
+ case SPELL_SCHOOL_ARCANE:
+ triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_ARCANE;
+ break;
+ default:
+ return;
+ }
+
+ if (Unit* target = eventInfo.GetActionTarget())
+ target->CastSpell(target, triggerspell, true, nullptr, aurEff);
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_warl_nether_protection_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_warl_nether_protection_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_warl_nether_protection_AuraScript();
+ }
+};
+
// 18541 - Ritual of Doom Effect
class spell_warl_ritual_of_doom_effect : public SpellScriptLoader
{
@@ -919,6 +1014,7 @@ void AddSC_warlock_spell_scripts()
new spell_warl_haunt();
new spell_warl_health_funnel();
new spell_warl_life_tap();
+ new spell_warl_nether_protection();
new spell_warl_ritual_of_doom_effect();
new spell_warl_seed_of_corruption();
new spell_warl_shadow_ward();