aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/old/3.3.5a/TDB41_to_TDB42_updates/world/2011_08_18_01_world_misc.sql2
-rw-r--r--sql/old/3.3.5a/TDB45_to_TDB46_updates/world/2012_01_24_00_world_misc.sql2
-rw-r--r--sql/old/3.3.5a/TDB47_to_TDB48_updates/world/2012_07_02_02_world_sai.sql6
-rw-r--r--sql/old/3.3.5a/TDB49_to_TDB50_updates/world/2012_11_14_00_world_various_fixes.sql2
-rw-r--r--sql/updates/world/2013_08_04_00_world_quests.sql390
-rw-r--r--sql/updates/world/2013_08_04_01_world_sai.sql21
-rw-r--r--sql/updates/world/2013_08_04_02_world_sai.sql45
-rw-r--r--sql/updates/world/2013_08_04_03_world_sai.sql20
-rw-r--r--sql/updates/world/2013_08_04_04_world_trinity_string.sql3
-rw-r--r--sql/updates/world/2013_08_05_00_world_sai.sql3
-rw-r--r--sql/updates/world/2013_08_05_01_world_misc.sql2
-rw-r--r--sql/updates/world/2013_08_05_01_world_trinity_string.sql8
-rw-r--r--sql/updates/world/2013_08_05_02_world_quest_relation_tables.sql28
-rw-r--r--sql/updates/world/2013_08_06_00_world_item_template.sql1
-rw-r--r--sql/updates/world/2013_08_06_01_world_hor.sql24
-rw-r--r--sql/updates/world/2013_08_06_02_world_command.sql3
-rw-r--r--sql/updates/world/2013_08_06_03_world_area_4522.sql95
-rw-r--r--sql/updates/world/2013_08_06_04_world_sai.sql35
-rw-r--r--sql/updates/world/2013_08_06_05_world_misc.sql333
-rw-r--r--sql/updates/world/2013_08_07_00_world_creature_template.sql1
-rw-r--r--sql/updates/world/2013_08_07_01_world_misc.sql6
-rw-r--r--sql/updates/world/2013_08_07_02_world_misc.sql3
-rw-r--r--sql/updates/world/2013_08_07_03_world_drak_tharon_keep.sql48
-rw-r--r--sql/updates/world/2013_08_07_04_world_misc.sql8
-rw-r--r--sql/updates/world/2013_08_07_05_world_misc.sql2
-rw-r--r--sql/updates/world/2013_08_07_06_world_drak_tharon_keep.sql31
-rw-r--r--sql/updates/world/2013_08_07_06_world_sai.sql96
-rw-r--r--sql/updates/world/2013_08_07_07_world_pathing.sql29
-rw-r--r--sql/updates/world/2013_08_07_08_world_sai.sql22
-rw-r--r--sql/updates/world/2013_08_07_09_world_sai.sql22
-rw-r--r--sql/updates/world/2013_08_07_10_world_sai.sql78
-rw-r--r--sql/updates/world/2013_08_07_11_world_sai.sql28
-rw-r--r--sql/updates/world/2013_08_07_12_world_sai.sql1
-rw-r--r--sql/updates/world/2013_08_07_13_world_creature_template.sql1
-rw-r--r--sql/updates/world/2013_08_07_14_world_sai_335.sql13
-rw-r--r--sql/updates/world/2013_08_08_00_world_creature_template.sql1
-rw-r--r--sql/updates/world/2013_08_08_01_world_creature_template.sql1
-rw-r--r--sql/updates/world/2013_08_08_02_world_creature_template.sql2
-rw-r--r--sql/updates/world/2013_08_09_00_world_sai.sql87
-rw-r--r--sql/updates/world/2013_08_09_01_world_sai.sql1
-rw-r--r--sql/updates/world/2013_08_09_02_world_cond_335.sql8
-rw-r--r--sql/updates/world/2013_08_09_03_world_sai.sql12
-rw-r--r--sql/updates/world/2013_08_09_04_world_sai.sql22
-rw-r--r--sql/updates/world/2013_08_09_05_world_sai.sql29
-rw-r--r--sql/updates/world/2013_08_09_06_world_ainame.sql8
-rw-r--r--sql/updates/world/2013_08_09_07_world_sai.sql41
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp69
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp11
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h12
-rw-r--r--src/server/game/Accounts/AccountMgr.cpp7
-rw-r--r--src/server/game/Accounts/RBAC.cpp1
-rw-r--r--src/server/game/Accounts/RBAC.h2
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp1
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp44
-rw-r--r--src/server/game/Battlegrounds/Battleground.h23
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp26
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAB.h4
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp96
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAV.h16
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundBE.cpp2
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp1
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp82
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundEY.h5
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp77
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundIC.h9
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp26
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundSA.h4
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp173
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundWS.h14
-rw-r--r--src/server/game/Conditions/ConditionMgr.h2
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp2
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp26
-rw-r--r--src/server/game/Entities/Item/Item.cpp4
-rw-r--r--src/server/game/Entities/Player/Player.cpp49
-rw-r--r--src/server/game/Entities/Player/Player.h5
-rw-r--r--src/server/game/Entities/Unit/Unit.h3
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp32
-rw-r--r--src/server/game/Globals/ObjectMgr.h18
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp160
-rw-r--r--src/server/game/Maps/Map.cpp2
-rw-r--r--src/server/game/Miscellaneous/Language.h4
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h3
-rw-r--r--src/server/game/Scripting/ScriptLoader.cpp4
-rw-r--r--src/server/game/Spells/SpellEffects.cpp4
-rw-r--r--src/server/game/Spells/SpellMgr.cpp61
-rw-r--r--src/server/game/World/World.cpp4
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp104
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp44
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h (renamed from src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockDepths/boss_ambassador_flamelash.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockDepths/boss_anubshiah.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_general_angerforge.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockDepths/boss_general_angerforge.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockDepths/boss_gorosh_the_dervish.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockDepths/boss_grizzle.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockDepths/boss_high_interrogator_gerstahn.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockDepths/boss_magmus.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockDepths/boss_moira_bronzebeard.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockDepths/boss_tomb_of_seven.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockDepths/instance_blackrock_depths.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h (renamed from src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h)20
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_drakkisath.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gizrul_the_slavener.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gizrul_the_slavener.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockSpire/boss_halycon.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_highlord_omokk.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp138
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_mother_smolderweb.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_overlord_wyrmthalak.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp)2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_quartermaster_zigris.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockSpire/boss_the_beast.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_urok_doomhowl.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockSpire/boss_urok_doomhowl.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp (renamed from src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp)14
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h (renamed from src/server/scripts/EasternKingdoms/BlackwingLair/blackwing_lair.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp (renamed from src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp (renamed from src/server/scripts/EasternKingdoms/BlackwingLair/boss_chromaggus.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp (renamed from src/server/scripts/EasternKingdoms/BlackwingLair/boss_ebonroc.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp (renamed from src/server/scripts/EasternKingdoms/BlackwingLair/boss_firemaw.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp (renamed from src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp (renamed from src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp (renamed from src/server/scripts/EasternKingdoms/BlackwingLair/boss_razorgore.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp (renamed from src/server/scripts/EasternKingdoms/BlackwingLair/boss_vaelastrasz.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp (renamed from src/server/scripts/EasternKingdoms/BlackwingLair/instance_blackwing_lair.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp (renamed from src/server/scripts/EasternKingdoms/MoltenCore/boss_baron_geddon.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp (renamed from src/server/scripts/EasternKingdoms/MoltenCore/boss_garr.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp (renamed from src/server/scripts/EasternKingdoms/MoltenCore/boss_gehennas.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp (renamed from src/server/scripts/EasternKingdoms/MoltenCore/boss_golemagg.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp (renamed from src/server/scripts/EasternKingdoms/MoltenCore/boss_lucifron.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp (renamed from src/server/scripts/EasternKingdoms/MoltenCore/boss_magmadar.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp (renamed from src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp (renamed from src/server/scripts/EasternKingdoms/MoltenCore/boss_ragnaros.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp (renamed from src/server/scripts/EasternKingdoms/MoltenCore/boss_shazzrah.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp (renamed from src/server/scripts/EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp (renamed from src/server/scripts/EasternKingdoms/MoltenCore/instance_molten_core.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h (renamed from src/server/scripts/EasternKingdoms/MoltenCore/molten_core.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/CMakeLists.txt103
-rw-r--r--src/server/scripts/Examples/example_spell.cpp4
-rw-r--r--src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp18
-rw-r--r--src/server/scripts/Kalimdor/zone_durotar.cpp8
-rw-r--r--src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp6
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp2
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp4
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp2
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h8
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp99
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp365
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h16
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp39
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp1354
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h11
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp113
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp19
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp6
-rw-r--r--src/server/scripts/Northrend/Naxxramas/naxxramas.h1
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp8
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp7
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp13
-rw-r--r--src/server/scripts/Northrend/zone_zuldrak.cpp6
-rw-r--r--src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp56
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp172
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp138
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp46
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp95
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h21
-rw-r--r--src/server/scripts/Outland/BlackTemple/illidari_council.cpp2
-rw-r--r--src/server/scripts/Outland/CMakeLists.txt1
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp2
-rw-r--r--src/server/scripts/Outland/zone_netherstorm.cpp6
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp31
-rw-r--r--src/server/scripts/Spells/spell_item.cpp22
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp92
-rw-r--r--src/server/scripts/World/achievement_scripts.cpp106
-rw-r--r--src/server/scripts/World/npcs_special.cpp2
-rw-r--r--src/server/shared/DataStores/DBCFileLoader.h2
179 files changed, 4758 insertions, 1282 deletions
diff --git a/sql/old/3.3.5a/TDB41_to_TDB42_updates/world/2011_08_18_01_world_misc.sql b/sql/old/3.3.5a/TDB41_to_TDB42_updates/world/2011_08_18_01_world_misc.sql
index 0a01fc87763..eaaeb6e505b 100644
--- a/sql/old/3.3.5a/TDB41_to_TDB42_updates/world/2011_08_18_01_world_misc.sql
+++ b/sql/old/3.3.5a/TDB41_to_TDB42_updates/world/2011_08_18_01_world_misc.sql
@@ -1,4 +1,4 @@
-UPDATE `creature_template` SET `npcflag`=`npcflag`|0x1000000,`VehicleId`=165,`spell1`=54420,`AIName`='SmartAI',`InhabitType`=5 WHERE `entry`=29403;
+UPDATE `creature_template` SET `npcflag`=`npcflag`|0x1000000,`VehicleId`=165,`spell1`=54420,`InhabitType`=5 WHERE `entry`=29403;
DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=29403;
INSERT INTO `npc_spellclick_spells` VALUES
(29403,49641,0,0,0,1,0,0,0);
diff --git a/sql/old/3.3.5a/TDB45_to_TDB46_updates/world/2012_01_24_00_world_misc.sql b/sql/old/3.3.5a/TDB45_to_TDB46_updates/world/2012_01_24_00_world_misc.sql
index e93f33dfec4..7520b1b4f05 100644
--- a/sql/old/3.3.5a/TDB45_to_TDB46_updates/world/2012_01_24_00_world_misc.sql
+++ b/sql/old/3.3.5a/TDB45_to_TDB46_updates/world/2012_01_24_00_world_misc.sql
@@ -1,5 +1,5 @@
-- Make Dame Evniki Kapsalis show vendor gossip option only to players with Crusader title
-UPDATE `creature_template` SET `AIName` = 'SmartAI',`ScriptName` = '' WHERE `entry` = 34885;
+UPDATE `creature_template` SET `ScriptName` = '' WHERE `entry` = 34885;
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=10598;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`COMMENT`) VALUES
(15,10598,0,0,17,2816,0,0,0,'',"Evniki Kapsalis should only sell to Crusaders"),
diff --git a/sql/old/3.3.5a/TDB47_to_TDB48_updates/world/2012_07_02_02_world_sai.sql b/sql/old/3.3.5a/TDB47_to_TDB48_updates/world/2012_07_02_02_world_sai.sql
index 6b6b0eb587c..f1d0c3f8968 100644
--- a/sql/old/3.3.5a/TDB47_to_TDB48_updates/world/2012_07_02_02_world_sai.sql
+++ b/sql/old/3.3.5a/TDB47_to_TDB48_updates/world/2012_07_02_02_world_sai.sql
@@ -141,7 +141,7 @@ DELETE FROM `spell_target_position` WHERE `id`=57897; -- there was none, but jus
INSERT INTO `spell_target_position` (`id`,`target_map`,`target_position_x`,`target_position_y`,`target_position_z`,`target_orientation`) VALUES
(57897,571,6383.445801,229.091522,397.031127,1.660376);
-- Add info for Munch's Death Gate spell click
-UPDATE `creature_template` SET `unit_flags`=567296,`exp`=2,`speed_run`=1,`minlevel`=80, `maxlevel`=80,`AIName`="SmartAI",`npcflag`=16777216 WHERE `entry`=30850;
+UPDATE `creature_template` SET `unit_flags`=567296,`exp`=2,`speed_run`=1,`minlevel`=80, `maxlevel`=80,`npcflag`=16777216 WHERE `entry`=30850;
DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=30850;
INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`cast_flags`,`user_type`) VALUES
(30850,57897,2,1);
@@ -150,7 +150,7 @@ DELETE FROM `creature_template_addon` WHERE `entry`=30850;
INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
(30850,0,0,1,0, NULL); -- Death Gate (Munch)
-- Add info for Jayde's Death Gate spell click
-UPDATE `creature_template` SET `exp`=2,`speed_run`=1,`unit_flags`=567296,`minlevel`=80, `maxlevel`=80,`unit_flags`=567296, `speed_run`=1,`AIName`="SmartAI",`npcflag`=16777216 WHERE `entry`=30852;
+UPDATE `creature_template` SET `exp`=2,`speed_run`=1,`unit_flags`=567296,`minlevel`=80, `maxlevel`=80,`unit_flags`=567296, `speed_run`=1,`npcflag`=16777216 WHERE `entry`=30852;
DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=30852;
INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`cast_flags`,`user_type`) VALUES
(30852,57897,2,1);
@@ -161,7 +161,7 @@ DELETE FROM `creature_template_addon` WHERE `entry`=30852;
INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
(30852,0,0,1,0, NULL); -- Death Gate (Jayde)
-- Add info for Mograine's Death Gate spell click
-UPDATE `creature_template` SET `unit_flags`=567296,`exp`=2,`speed_run`=1,`minlevel`=80, `maxlevel`=80,`AIName`="SmartAI",`npcflag`=16777216 WHERE `entry`=30841;
+UPDATE `creature_template` SET `unit_flags`=567296,`exp`=2,`speed_run`=1,`minlevel`=80, `maxlevel`=80,`npcflag`=16777216 WHERE `entry`=30841;
DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=30841;
INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`cast_flags`,`user_type`) VALUES
(30841,57897,2,1);
diff --git a/sql/old/3.3.5a/TDB49_to_TDB50_updates/world/2012_11_14_00_world_various_fixes.sql b/sql/old/3.3.5a/TDB49_to_TDB50_updates/world/2012_11_14_00_world_various_fixes.sql
index 01655b674b1..903dafa3987 100644
--- a/sql/old/3.3.5a/TDB49_to_TDB50_updates/world/2012_11_14_00_world_various_fixes.sql
+++ b/sql/old/3.3.5a/TDB49_to_TDB50_updates/world/2012_11_14_00_world_various_fixes.sql
@@ -24,7 +24,7 @@ SET @Saber :=10042; -- Big green cat
-- Add SAI support for Corrupted Kitten
UPDATE `creature_template` SET `AIName`='SmartAI',`gossip_menu_id`=@SGossip,`npcflag`=1 WHERE `entry`=@CorruptedKitten;
UPDATE `creature_template` SET `AIName`='SmartAI',`gossip_menu_id`=@SGossip,`npcflag`=1 WHERE `entry`=@CommonKitten;
-DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@CorruptedKitten,@CommonKitten);
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@CorruptedKitten, @CommonKitten);
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
(@CommonKitten,0,0,1,54,0,100,0,0,0,0,0,36,@CorruptedKitten,0,0,0,0,0,1,0,0,0,0,0,0,0,'Common Kitten - On spawn - Change template to corrupted one'),
(@CommonKitten,0,1,2,61,0,100,0,0,0,0,0,11,@SpellVisual,0,0,0,0,0,1,0,0,0,0,0,0,0,'Common Kitten - On OOC of 10 sec - Cast Corrupted Saber visual to self'),
diff --git a/sql/updates/world/2013_08_04_00_world_quests.sql b/sql/updates/world/2013_08_04_00_world_quests.sql
new file mode 100644
index 00000000000..00f71824236
--- /dev/null
+++ b/sql/updates/world/2013_08_04_00_world_quests.sql
@@ -0,0 +1,390 @@
+-- The Nightmare Manifests/Hope Within the Emerald Nightmare/The Boon of Remulos/Walking Legend
+SET @TYRANDE := 15633;
+SET @ERANIKUS := 15491;
+SET @REMULOS := 11832;
+SET @MALFURION := 17949;
+SET @PHANTASM := 15629;
+SET @E_REDEEM := 15628;
+
+DELETE FROM `creature_ai_scripts` WHERE creature_id=@ERANIKUS;
+-- Tyrande
+UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='', `flags_extra`=0, `type_flags`=0, `unit_flags`=32768, `faction_H`=1254, `faction_A`=1254 WHERE `entry`=@TYRANDE;
+-- Eranikus, Tyrant of the Dream
+UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='', `InhabitType`=7, `faction_A`=35, `faction_H`=35, `unit_flags`=0, `flags_extra`=2097152, `type_flags`=8, `dynamicflags`=128, `speed_walk`=2 WHERE `entry`=@ERANIKUS;
+-- Keeper Remulos
+UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='', `speed_walk`=2.5, `speed_run`=3.75, `type_flags`=0, `unit_flags`=32768, `faction_H`=1254, `faction_A`=1254 WHERE `entry`=@REMULOS;
+-- Malfurion
+UPDATE `creature_template` SET `InhabitType`=4,`AIName`='SmartAI',`ScriptName`='' WHERE `entry`=@MALFURION;
+-- Not sure if these are set on stock DB, but I'll still add them just in case.
+UPDATE `creature_template` SET `IconName`='Interact', `npcflag`=16777216 WHERE `entry` IN (32788,32790);
+-- Wrong gameobject, no idea who spawned it there.
+DELETE FROM `gameobject` WHERE `guid`=99849;
+
+-- NPC texts
+DELETE FROM `creature_text` WHERE entry IN (@REMULOS,@ERANIKUS,@PHANTASM,@TYRANDE,@E_REDEEM,@MALFURION);
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
+(@REMULOS,0,0,'We will locate the origin of the Nightmare through the fragments you collected, $n. From there, we will pull Eranikus through a rift in the Dream. Steel yourself, $c. We are inviting the embodiment of the Nightmare into our world.',12,0,100,0,0,0,'Keeper Remulos Say 0'),
+(@REMULOS,1,1,'The rift will be opened there, above the Lake Elun''ara. Prepare yourself, $n. Eranikus''s entry into our world will be wrought with chaos and strife.',12,0,100,0,0,0,'Keeper Remulos Say 1'),
+(@REMULOS,2,2,'He will stop at nothing to get to Malfurion''s physical manifistation. That must not happen... We must keep the beast occupied long enough for Tyrande to arrive.',12,0,100,0,0,0,'Keeper Remulos Say 2'),
+(@REMULOS,3,3,'Defend Nighthaven, hero...',12,0,100,0,0,0,'Keeper Remulos Say 3'),
+(@REMULOS,4,4,'Fiend! Face the might of Cenarius!',14,0,100,0,0,0,'Keeper Remulos Say 4'),
+(@REMULOS,5,5,'Who is the predictable one, beast? Surely you did not think that we would summon you on top of Malfurion? Your redemption comes, Eranikus. You will be cleansed of this madness - this corruption.',14,0,100,0,0,0,'Keeper Remulos Say 4'),
+(@REMULOS,6,6,'Hurry, $N! We must find protective cover!',12,0,100,0,0,0,'Keeper Remulos Say 6'),
+(@REMULOS,7,7,'Please, champion, protect our people.',12,0,100,0,0,0,'Keeper Remulos Say 7'),
+(@REMULOS,8,8,'It will be done, Eranikus. Be well, ancient one.',12,0,100,0,0,0,'Keeper Remulos Say 8'),
+(@REMULOS,9,9,'Let us leave Nighthaven, hero Seek me out at the grove.',12,0,100,0,0,0,'Keeper Remulos Say 9'),
+--
+(@REMULOS,10,10,'Come, $N. The lake is around the bend.',12,0,100,1,0,0,'Keeper Remulos - say Text 0'),
+(@REMULOS,11,11,'Stand near me, $N. I will protect you should anything go wrong.',12,0,100,1,0,0,'Keeper Remulos - say Text 1'),
+(@REMULOS,12,12,'Malfurion!',12,0,100,5,0,0,'Keeper Remulos - say Text 2'),
+(@REMULOS,13,13,'It was shrouded in nightmares, Malfurion. What is happening in the Dream? What could cause such atrocities?',12,0,100,6,0,0,'Keeper Remulos - say Text 3'),
+(@REMULOS,14,14,'I sensed as much, Malfurion. Dark days loom ahead.',12,0,100,1,0,0,'Keeper Remulos - say Text 4'),
+(@REMULOS,15,15,'You have been gone too long, Malfurion. Peace between the Children of Azeroth has become tenuous at best. What of my father? Of your brother? Have you any news?',12,0,100,6,0,0,'Keeper Remulos - say Text 5'),
+(@REMULOS,16,16,'Farewell, old friend... Farewell...',12,0,100,1,0,0,'Keeper Remulos - say Text 6'),
+(@REMULOS,17,17,'Let us return to the grove, mortal.',12,0,100,1,0,0,'Keeper Remulos - say Text 7'),
+--
+(@ERANIKUS,0,0,'Pitful predictable mortals... You know not what you have done! The master''s will fulfilled. The Moonglade shall be destroyed and Malfurion along with it!',14,0,100,0,0,0,'Eranikus Say 0'),
+(@ERANIKUS,1,1,'Eranikus, Tyrant of the Dream lets loose a sinister laugh.',16,0,100,0,0,0,'Eranikus Say 1'),
+(@ERANIKUS,2,2,'You are certanly not your father, insect. Should it interest me, I would crush you with but a swipe of my claws. Turn Shan''do Stormrage over to me and your pitiful life will be spared along with the lives of your people.',14,0,100,0,0,0,'Eranikus Say 2'),
+(@ERANIKUS,3,3,'My redemption? You are bold, little one. My redemption comes by the will of my god.',14,0,100,0,0,0,'Eranikus Say 3'),
+(@ERANIKUS,4,4,'Eranikus, Tyrant of the Dream roars furiously',16,0,100,0,0,0,'Eranikus Say 4'),
+(@ERANIKUS,5,5,'Rise, servants of the Nightmare! Rise and destroy this world! Let there be no survivors...',14,0,100,0,0,0,'Eranikus Say 5'),
+(@ERANIKUS,6,6,'Where is your savior? How long can you hold out against my attacks?',14,0,100,0,0,0,'Eranikus Say 6'),
+(@ERANIKUS,7,7,'Remulos, look how easy they fall before me? You can stop this, fool. Turn the druid over to me and it will all be over...',14,0,100,0,0,0,'Eranikus Say 7'),
+(@ERANIKUS,8,8,'Defeated my minions? Then face me, mortals!',14,0,100,0,0,0,'Eranikus Say 8'),
+(@ERANIKUS,9,9,'IT BURNS! THE PAIN.. SEARING...',14,0,100,0,0,0,'Eranikus Say 9'),
+(@ERANIKUS,10,10,'WHY? Why did this happen to... to me? Where were you Tyrande? Where were you when I fell from the grace of Elune?',14,0,100,0,0,0,'Eranikus Say 10'),
+(@ERANIKUS,11,11,'I... I feel... I feel the touch of Elune upon my being once more... She smiles upon me... Yes... I...',14,0,100,0,0,0,'Eranikus Say 11'),
+(@ERANIKUS,12,12,'Tyrande falls to one knee.',16,0,100,0,0,0,'Eranikus Say 12'),
+--
+(@TYRANDE,0,0,'Seek absolution, Eranikus. All will be forgiven..',14,0,100,0,0,0,'Tyrande Say 0'),
+(@TYRANDE,1,1,'You will be forgiven, Eranikus. Elune will always love you. Break free of the bonds that command you!',14,0,100,0,0,0,'Tyrande Say 0'),
+(@TYRANDE,2,2,'The grasp of the Old Gods is unmoving. He is consumed by their dark thoughts... I... I... I cannot... cannot channel much longer... Elune aide me.',12,0,100,0,0,0,'Tyrande Say 0'),
+--
+(@E_REDEEM,0,0,'For so long, I was lost... The Nightmare''s corruption had consumed me... And now, you... all of you.. you have saved me. Released me from its grasp.',12,0,100,0,0,0,'Eranikus the Redeemed Say 0'),
+(@E_REDEEM,1,1,'But... Malfurion, Cenarius, Ysera... They still fight. They need me. I must return to the Dream at once.',12,0,100,0,0,0,'Eranikus the Redeemed Say 0'),
+(@E_REDEEM,2,2,'My lady, I am unworthy of your prayer. Truly, you are an angel of light. Please, assist me in returning to the barrow den so that I may return to the Dream. I like Malfurion, also have a love awaiting me... I must return to her... to protect her...',12,0,100,0,0,0,'Eranikus the Redeemed Say 0'),
+(@E_REDEEM,3,3,'And heroes... I hold that which you seek. May it once more see the evil dissolved. Remulos, see to it that our champion receives the shard of the Green Flight.',12,0,100,0,0,0,'Eranikus the Redeemed Say 0'),
+--
+(@PHANTASM,0,0,'Nightmare Phantasm drinks in the suffering of the fallen.',16,0,100,0,0,0,'Nightmare Phantasm Say 0'),
+--
+(@MALFURION,0,0,'Remulos, old friend. It is good to see you once more. I knew the message would find its way to you; one way or another.',12,0,100,1,0,0,'Malfurion Stormrage - say Text 0'),
+(@MALFURION,1,0,'I fear for the worst, old friend. Within the Dream we fight a new foe, born of an ancient evil. Ysera''s noble brood has fallen victim to the old whisperings. It seems as if the Nightmare has broken through the realm to find a new host on Azeroth.',12,0,100,1,0,0,'Malfurion Stormrage - say Text 1'),
+(@MALFURION,2,0,'Aye Remulos, prepare the mortal races.',12,0,100,1,0,0,'Malfurion Stormrage - say Text 2'),
+(@MALFURION,3,0,'Cenarius fights at my side. Illidan sits atop his throne in Outland; brooding. I''m afraid that the loss to Arthas proved to be his breaking point. Madness has embraced him, Remulos. He replays the events in his mind a thousand times per day, but in his mind, he is the victor and Arthas is utterly defeated. He is too far gone, old friend. I fear that the time may soon come that our bond is tested and it will not be as it was at the Well in Zin-Azshari.',12,0,100,1,0,0,'Malfurion Stormrage - say Text 3'),
+(@MALFURION,4,0,'Remulos, I am being drawn back... Tyrande... send her my love... Tell her I am safe... Tell her... Tell her I will return... Farewell...',12,0,100,1,0,0,'Malfurion Stormrage - say Text 4');
+
+
+-- Remulos SAI
+DELETE FROM `smart_scripts` WHERE `source_type`IN (0,9) AND `entryorguid` IN (@REMULOS,@REMULOS*100,@REMULOS*100+1,@REMULOS*100+2);
+DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` = @MALFURION;
+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
+-- Quests: Hope Within the Emerald Nightmare & The Boon of Remulos
+(@REMULOS,0,0,0,62,0,100,0,10215,0,0,0,11,57413,1,0,0,0,0,7,0,0,0,0,0,0,0,'Keeper Remulos - On gossip option select - cast spell'),
+(@REMULOS,0,1,2,62,0,100,0,10215,1,0,0,11,57670,1,0,0,0,0,7,0,0,0,0,0,0,0,'Keeper Remulos - On gossip option select - cast spell'),
+(@REMULOS,0,2,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Keeper Remulos - On gossip option select - Close gossip'),
+(@REMULOS,0,3,0,19,0,100,0,13074,0,0,0,11,57413,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Keeper Remulos - On Quest Accept - Cast Fitful Dream'),
+-- The Nightmare Manifests
+(@REMULOS,0,4,0,19,0,100,1,8736,0,0,0,1,0,15000,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On Quest Accept - Say 0'),
+(@REMULOS,0,5,0,52,0,100,0,0,@REMULOS,0,0,53,0,@REMULOS,0,8736,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On Say 0 - Start WayPoint'),
+(@REMULOS,0,6,0,52,0,100,0,0,@REMULOS,0,0,83,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On Quest Accept - Remove Npcflag'),
+(@REMULOS,0,7,0,40,0,100,0,13,@REMULOS,0,0,54,95000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On WayPoint 13 - Pause WP'),
+(@REMULOS,0,8,0,40,0,100,0,13,@REMULOS,0,0,1,1,10000,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On WayPoint 13 - Say 1'),
+(@REMULOS,0,9,0,52,0,100,0,1,@REMULOS,0,0,1,2,10000,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On Say 1 - Say 2'),
+(@REMULOS,0,10,0,52,0,100,0,2,@REMULOS,0,0,11,25813,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On Say 3 - Cast Conjure Dream Rift'),
+(@REMULOS,0,11,0,52,0,100,0,2,@REMULOS,0,0,12,@ERANIKUS,3,3600000,0,0,0,8,0,0,0,7872.5888, -2664.55888, 497.139282,0.63583,'Keeper Remulos - On Say 3 - Summon Eranikus'),
+(@REMULOS,0,12,0,52,0,100,0,2,@REMULOS,0,0,1,3,23000,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On Say 2 - Say 3'),
+(@REMULOS,0,13,0,52,0,100,0,3,@REMULOS,0,0,1,4,31000,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On Say 3 - Say 4'),
+(@REMULOS,0,14,0,52,0,100,0,4,@REMULOS,0,0,1,5,22000,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On Say 4 - Say 5'),
+(@REMULOS,0,15,0,52,0,100,0,5,@REMULOS,0,0,1,6,10000,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On Say 5 - Say 6'),
+(@REMULOS,0,16,0,40,0,100,0,20,@REMULOS,0,0,54,60000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On WayPoint 20 - Pause WP'),
+(@REMULOS,0,17,0,40,0,100,0,20,@REMULOS,0,0,1,7,20000,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On WayPoint 20 - Say 7'),
+(@REMULOS,0,18,0,52,0,100,0,7,@REMULOS,0,0,12,@PHANTASM,3,3600000,0,0,0,8,0,0,0,7829.066,-2562.347,489.299,5.234,'Keeper Remulos - On Say 7 - Summon Nightmare Phantasm'),
+(@REMULOS,0,19,0,52,0,100,0,7,@REMULOS,0,0,12,@PHANTASM,3,3600000,0,0,0,8,0,0,0,7828.889,-2580.694,489.299,0.753,'Keeper Remulos - On Say 7 -Summon Nightmare Phantasm'),
+(@REMULOS,0,20,0,52,0,100,0,7,@REMULOS,0,0,8,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On Say 7 - Set react state aggresive'),
+(@REMULOS,0,21,0,52,0,100,0,7,@REMULOS,0,0,49,0,0,0,0,0,0,19,@PHANTASM,0,0,0,0,0,0,'Keeper Remulos - On Say 7 - Attack'),
+(@REMULOS,0,22,0,0,0,100,0,7000,14000,6000,12000,11,20665,0,0,0,0,0,18,20,0,0,0,0,0,0,'Keeper Remulos - In Combat - Cast Regrowth'),
+(@REMULOS,0,23,0,0,0,100,0,26000,52000,34000,46000,11,20664,0,0,0,0,0,18,20,0,0,0,0,0,0,'Keeper Remulos - In Combat - Cast Regrowth'),
+(@REMULOS,0,24,0,0,0,100,0,25000,25000,25000,50000,11,23381,0,0,0,0,0,18,20,0,0,0,0,0,0,'Keeper Remulos - In Combat - Cast Healing Touch'),
+(@REMULOS,0,25,0,0,0,100,0,10000,40000,40000,40000,11,25817,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - In Combat - Cast Tranquility'),
+(@REMULOS,0,26,0,0,0,100,0,16000,21000,19000,25000,11,21668,0,0,0,0,0,2,0,0,0,0,0,0,0,'Keeper Remulos - In Combat - Cast Starfall'),
+(@REMULOS,0,27,0,38,0,100,0,1,1,0,0,1,8,10000,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On Data Set - Say 8'),
+(@REMULOS,0,28,0,52,0,100,0,8,@REMULOS,0,0,1,9,10000,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - Said 8 8 - Say 9'),
+(@REMULOS,0,29,0,40,0,100,1,21,@REMULOS,0,0,49,0,0,0,0,0,0,11,@ERANIKUS,30,0,0,0,0,0,'Keeper Remulos - On Waypoint Reached - Attack Eranikus'),
+(@REMULOS,0,30,0,6,0,100,0,0,0,0,0,6,8736,0,0,0,0,0,18,40,0,0,0,0,0,0,'Keeper Remulos - On Death - Fail Quest'),
+(@REMULOS,0,31,0,40,0,100,1,23,@REMULOS,0,0,54,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On WayPoint 23 - Pause WP'),
+(@REMULOS,0,32,0,40,0,100,1,23,@REMULOS,0,0,66,2.835,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On WayPoint 23 - Set Orientation'),
+(@REMULOS,0,33,0,52,0,100,0,9,@REMULOS,0,0,53,1,@REMULOS*100+1,0,8736,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On Said 9 - Go Home'),
+(@REMULOS,0,34,0,40,0,100,0,12,@REMULOS*100+1,0,0,82,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On WayPoint 12 - Set Npcflags'),
+(@REMULOS,0,35,0,40,0,100,0,12,@REMULOS*100+1,0,0,66,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On WayPoint 12 - Set Orientation'),
+(@REMULOS,0,36,0,40,0,100,0,24,@REMULOS,0,0,80,@REMULOS*100+1,0,1,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - On WayPoint 24 - Run Script only when OOC'),
+-- Quest: Waking Legends
+(@REMULOS,0,37,38,19,0,100,0,8447,0,0,0,81,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - on Quest Accept - Turn off Quest Giver & Gossip Flag'),
+(@REMULOS,0,38,39,61,0,100,0,0,0,0,0,53,0,@REMULOS*100,0,8447,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - on Quest Accept - start WP'),
+(@REMULOS,0,39,0,61,0,100,0,0,0,0,0,1,10,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - on Quest Accept - say Text 10'),
+(@REMULOS,0,40,41,40,0,100,0,5,@REMULOS*100,0,0,54,83000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - reached WP 5 - pause WP'),
+(@REMULOS,0,41,42,61,0,100,0,0,0,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,3.12180,'Keeper Remulos - reached WP5 - set orientation'),
+(@REMULOS,0,42,0,61,0,100,0,0,0,0,0,80,@REMULOS*100+2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - reached WP 5 - run Script'),
+(@REMULOS,0,43,0,40,0,100,0,10,@REMULOS*100,0,0,81,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - reached WP 10 - Turn on Quest Giver & Gossip Flag'),
+(@REMULOS,0,44,0,40,0,100,0,10,@REMULOS*100,0,0,66,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - reached WP 10 - set orientation'),
+-- Script
+(@REMULOS*100+2,9,0,0,0,0,100,0,2000,2000,0,0,1,11,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - Say Text 1'),
+(@REMULOS*100+2,9,1,0,0,0,100,0,3000,3000,0,0,11,25004,1,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - Cast Spell: Throw Nightmare Object to Position'),
+(@REMULOS*100+2,9,2,0,0,0,100,0,5000,5000,0,0,12,@MALFURION,8,0,0,0,0,8,0,0,0,7730.5288,-2318.8596,453.8706,6.14985,'Keeper Remulos - Summon Malfurion Stormrage'),
+(@REMULOS*100+2,9,3,0,0,0,100,0,2000,2000,0,0,1,12,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - Say Text 12'),
+(@REMULOS*100+2,9,4,0,0,0,100,0,3000,3000,0,0,1,0,0,0,0,0,0,9,@MALFURION,0,30,0,0,0,0,'Malfurion Stormrage - Say Text 0'),
+(@REMULOS*100+2,9,5,0,0,0,100,0,6000,6000,0,0,1,13,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - Say Text 13'),
+(@REMULOS*100+2,9,6,0,0,0,100,0,7000,7000,0,0,1,1,0,0,0,0,0,9,@MALFURION,0,30,0,0,0,0,'Malfurion Stormrage - Say Text 1'),
+(@REMULOS*100+2,9,7,0,0,0,100,0,11000,11000,0,0,1,14,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - Say Text 14'),
+(@REMULOS*100+2,9,8,0,0,0,100,0,3500,3500,0,0,1,2,0,0,0,0,0,9,@MALFURION,0,30,0,0,0,0,'Malfurion Stormrage - Say Text 2'),
+(@REMULOS*100+2,9,9,0,0,0,100,0,4000,4000,0,0,1,15,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - Say Text 15'),
+(@REMULOS*100+2,9,10,0,0,0,100,0,9000,9000,0,0,1,3,0,0,0,0,0,9,@MALFURION,0,30,0,0,0,0,'Malfurion Stormrage - Say Text 3'),
+(@REMULOS*100+2,9,11,0,0,0,100,0,19000,19000,0,0,1,4,0,0,0,0,0,9,@MALFURION,0,30,0,0,0,0,'Malfurion Stormrage - Say Text 4'),
+(@REMULOS*100+2,9,12,0,0,0,100,0,6000,6000,0,0,1,16,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - Say Text 16'),
+(@REMULOS*100+2,9,13,0,0,0,100,0,2000,2000,0,0,1,17,0,0,0,0,0,1,0,0,0,0,0,0,0,'Keeper Remulos - Say Text 17'),
+(@REMULOS*100+2,9,14,0,0,0,100,0,0,0,0,0,15,8447,0,0,0,0,0,7,0,0,0,0,0,0,0,'Keeper Remulos - Give Quest Credit'),
+(@REMULOS*100+2,9,15,0,0,0,100,0,1000,1000,0,0,45,0,1,0,0,0,0,9,@MALFURION,0,30,0,0,0,0,'Keeper Remulos - Set data 0 1 to Malfurion Stormrage'),
+ --
+(@MALFURION,0,0,0,54,0,100,0,0,0,0,0,11,52096,2,0,0,0,0,1,0,0,0,0,0,0,0,'Malfurion Stormrage - On summon - Cast Cosmetic Teleport Effect on self'),
+(@MALFURION,0,1,0,38,0,100,0,0,1,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Malfurion Stormrage - On data set 0 1 - Despawn'),
+ --
+(@REMULOS*100+1,9,0,0,1,0,100,1,60000,60000,0,0,53,0,@REMULOS*100+1,0,8736,0,0,1,0,0,0,0,0,0,0,'On Script - OOC 1 Mintues - Go Home');
+
+-- Eranikus, Tyrant of the Dream SAI
+DELETE FROM `smart_scripts` WHERE entryorguid IN(@ERANIKUS,@ERANIKUS*100,@ERANIKUS*100+1);
+INSERT INTO `smart_scripts` VALUES
+(@ERANIKUS,0,0,0,1,0,100,1,13000,13000,13000,13000,1,0,15000,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - OOC 13 Sec - Say 0'),
+(@ERANIKUS,0,1,0,52,0,100,0,0,@ERANIKUS,0,0,1,1,6000,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On Say 0 - Say 1'),
+(@ERANIKUS,0,2,0,52,0,100,0,1,@ERANIKUS,0,0,1,2,34000,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On Say 1 - Say 2'),
+(@ERANIKUS,0,3,0,52,0,100,0,2,@ERANIKUS,0,0,1,3,3000,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On Say 2 - Say 3'),
+(@ERANIKUS,0,4,0,52,0,100,0,3,@ERANIKUS,0,0,1,4,3000,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On Say 3 - Say 4'),
+(@ERANIKUS,0,5,0,52,0,100,0,4,@ERANIKUS,0,0,53,0,@ERANIKUS,0,8736,0,0,1,0,0,0,0,0,0,0,'Eranikus - On Say 4 - Start WayPoint'),
+(@ERANIKUS,0,6,0,40,0,100,0,3,@ERANIKUS,0,0,54,130000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On WayPoint 3 - Pause'),
+(@ERANIKUS,0,7,0,40,0,100,0,3,@ERANIKUS,0,0,1,5,10000,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On WayPoint 3 - Say 5'),
+(@ERANIKUS,0,8,0,52,0,100,0,5,@ERANIKUS,0,0,80,@ERANIKUS*100,0,2,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On Say 5 - Start Script'),
+(@ERANIKUS*100,9,0,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7865.966,-2554.104,486.967,5.492,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100,9,1,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7873.412,-2587.454,486.946,0.924,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100,9,2,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7901.544,-2581.989,487.178,2.059,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100,9,3,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7918.844,-2553.987,486.911,3.772,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100,9,4,0,0,0,100,0,5000,5000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7865.966,-2554.104,486.967,5.492,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100,9,5,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7873.412,-2587.454,486.946,0.924,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100,9,6,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7901.544,-2581.989,487.178,2.059,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100,9,7,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7918.844,-2553.987,486.911,3.772,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100,9,8,0,0,0,100,0,5000,5000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7865.966,-2554.104,486.967,5.492,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100,9,9,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7873.412,-2587.454,486.946,0.924,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100,9,10,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7901.544,-2581.989,487.178,2.059,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100,9,11,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7918.844,-2553.987,486.911,3.772,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100,9,12,0,0,0,100,0,5000,5000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7865.966,-2554.104,486.967,5.492,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100,9,13,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7873.412,-2587.454,486.946,0.924,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100,9,14,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7901.544,-2581.989,487.178,2.059,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100,9,15,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7918.844,-2553.987,486.911,3.772,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100,9,16,0,0,0,100,0,1000,1000,0,0,1,6,35000,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On Script - Say 6'),
+(@ERANIKUS,0,9,0,52,0,100,0,6,@ERANIKUS,0,0,80,@ERANIKUS*100+1,0,2,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On Say 6 - Start Script'),
+(@ERANIKUS*100+1,9,0,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7865.966,-2554.104,486.967,5.492,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100+1,9,1,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7873.412,-2587.454,486.946,0.924,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100+1,9,2,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7901.544,-2581.989,487.178,2.059,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100+1,9,3,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7918.844,-2553.987,486.911,3.772,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100+1,9,4,0,0,0,100,0,5000,5000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7865.966,-2554.104,486.967,5.492,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100+1,9,5,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7873.412,-2587.454,486.946,0.924,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100+1,9,6,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7901.544,-2581.989,487.178,2.059,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100+1,9,7,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7918.844,-2553.987,486.911,3.772,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100+1,9,8,0,0,0,100,0,5000,5000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7865.966,-2554.104,486.967,5.492,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100+1,9,9,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7873.412,-2587.454,486.946,0.924,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100+1,9,10,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7901.544,-2581.989,487.178,2.059,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100+1,9,11,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7918.844,-2553.987,486.911,3.772,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100+1,9,12,0,0,0,100,0,5000,5000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7865.966,-2554.104,486.967,5.492,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100+1,9,13,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7873.412,-2587.454,486.946,0.924,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100+1,9,14,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7901.544,-2581.989,487.178,2.059,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100+1,9,15,0,0,0,100,0,1000,1000,0,0,12,@PHANTASM,3,600000,0,0,0,8,0,0,0,7918.844,-2553.987,486.911,3.772,'Eranikus - On Script - Summon Nightmare Phantasm'),
+(@ERANIKUS*100+1,9,16,0,0,0,100,0,1000,1000,0,0,1,7,33000,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On Script - Say 7'),
+(@ERANIKUS,0,10,0,40,0,100,0,4,@ERANIKUS,0,0,2,14,0,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - Waypont 4 reached - Set faction enemy'),
+(@ERANIKUS,0,38,0,40,0,100,0,4,@ERANIKUS,0,0,8,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - Waypont 4 - Set react state aggresive'),
+(@ERANIKUS,0,11,0,2,0,100,0,30,65,12000,35000,12,@PHANTASM,3,600000,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - In Combat - Summon Nightmare Phantasm'),
+(@ERANIKUS,0,12,0,4,1,100,0,0,0,0,0,1,8,0,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On aggro - Say 8'),
+(@ERANIKUS,0,13,0,4,0,100,0,0,0,0,0,8,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On aggro - Set react state aggresive'),
+(@ERANIKUS,0,14,0,4,0,100,0,0,0,0,0,49,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Eranikus - On aggro - Start Attack'),
+(@ERANIKUS,0,15,0,0,0,100,0,2000,4000,55000,60000,11,24818,0,0,0,0,0,2,0,0,0,0,0,0,0,'Eranikus - In Combat - Cast Noxious Breath'),
+(@ERANIKUS,0,16,0,0,0,100,0,9000,14000,50000,55000,11,24839,0,0,0,0,0,2,0,0,0,0,0,0,0,'Eranikus - In Combat - Cast Acid Spit'),
+(@ERANIKUS,0,17,0,0,0,100,0,10000,20000,15000,25000,11,22878,0,0,0,0,0,2,0,0,0,0,0,0,0,'Eranikus - In Combat - Cast Shadow Bolt Volley'),
+(@ERANIKUS,0,18,0,2,0,100,1,0,70,0,0,12,@TYRANDE,3,3600000,0,0,0,8,0,0,0,7900.216,-2572.621,488.176,2.330,'Eranikus - At 70% - Summon Tyrande'),
+(@ERANIKUS,0,34,0,2,0,100,1,0,69,0,0,1,0,0,0,0,0,0,11,@TYRANDE,30,0,0,0,0,0,'Eranikus - At 69% - Tyrande Say 0'),
+(@ERANIKUS,0,35,0,2,0,100,1,0,30,0,0,1,1,0,0,0,0,0,11,@TYRANDE,30,0,0,0,0,0,'Eranikus - At 30% - Tyrande Say 1'),
+(@ERANIKUS,0,19,0,2,0,100,1,0,25,0,0,1,9,0,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - At 25% - Say 9'),
+(@ERANIKUS,0,20,0,2,0,100,1,0,22,0,0,1,10,0,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - At 22% - Say 10'),
+(@ERANIKUS,0,21,0,2,0,100,1,0,20,0,0,1,11,0,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - At 20% - Say 11'),
+(@ERANIKUS,0,22,0,52,0,100,0,11,@ERANIKUS,0,0,2,35,0,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On Say 2 - Set faction friendly'),
+(@ERANIKUS,0,23,0,52,0,100,0,11,@ERANIKUS,0,0,8,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On Say 2 - Set react state passive'),
+(@ERANIKUS,0,24,0,52,0,100,0,11,@ERANIKUS,0,0,18,33555200,0,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On Say 2 - Set unit flags'),
+(@ERANIKUS,0,25,0,52,0,100,0,11,@ERANIKUS,0,0,20,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On Say 2 - Stop AutoAttack'),
+(@ERANIKUS,0,26,0,52,0,100,0,11,@ERANIKUS,0,0,1,12,3000,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - Say 11 - Say 12'),
+(@ERANIKUS,0,27,0,52,0,100,0,12,@ERANIKUS,0,0,12,@E_REDEEM,3,60000,0,0,0,8,0,0,0,7904.248,-2564.867,488.156,5.116,'Eranikus - On Say 12 - Summon Eranikus the Redeemed'),
+(@ERANIKUS,0,28,0,52,0,100,0,12,@ERANIKUS,0,0,37,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - Say 12 - Kill'),
+(@ERANIKUS,0,31,0,7,0,100,0,0,0,0,0,6,8736,0,0,0,0,0,18,40,0,0,0,0,0,0,'Eranikus - On Evade - Quest Fail'),
+(@ERANIKUS,0,32,0,6,0,100,0,0,0,0,0,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On Death - Set invisibility'),
+(@ERANIKUS,0,33,0,40,0,100,0,5,@ERANIKUS,0,0,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On WayPoint 5 - Set invisibility'),
+(@ERANIKUS,0,36,0,40,0,100,0,5,@ERANIKUS,0,0,37,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus - On WayPoint 5 - Die'),
+(@ERANIKUS,0,37,0,40,0,100,0,5,@ERANIKUS,0,0,6,8736,0,0,0,0,0,18,40,0,0,0,0,0,0,'Eranikus - On WayPoint 5 - Quest Fail');
+
+-- Tyrande SAI
+DELETE FROM `smart_scripts` WHERE entryorguid IN (@TYRANDE);
+INSERT INTO `smart_scripts` VALUES
+(@TYRANDE,0,0,0,54,0,100,1,0,0,0,0,8,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tyrande - On Summon - Set react state aggresive'),
+(@TYRANDE,0,1,0,1,0,100,1,95000,95000,95000,95000,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tyrande - OOC 60 Sec - Set invisibility'),
+(@TYRANDE,0,2,0,1,0,100,1,96000,96000,96000,96000,37,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tyrande - OOC 61 Sec - Kill'),
+(@TYRANDE,0,3,0,0,0,100,0,1000,2000,2300,2500,11,21668,0,0,0,0,0,11,@ERANIKUS,20,0,0,0,0,0,'Tyrande - In Combat - Cast Starfall');
+
+-- Eranikus the Redeemed SAI
+UPDATE `creature_template` SET AIName='SmartAI', modelid1=6984 WHERE entry=@E_REDEEM;
+DELETE FROM `smart_scripts` WHERE entryorguid IN(@E_REDEEM);
+INSERT INTO `smart_scripts` VALUES
+(@E_REDEEM,0,0,0,1,0,100,1,7000,7000,7000,7000,1,0,10000,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus the Redeemed - OOC 7 Secs - Say 0'),
+(@E_REDEEM,0,1,0,52,0,100,0,0,@E_REDEEM,0,0,1,1,10000,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus the Redeemed - On Say 0 - Say 1'),
+(@E_REDEEM,0,2,0,52,0,100,0,1,@E_REDEEM,0,0,1,2,10000,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus the Redeemed - On Say 1 - Say 2'),
+(@E_REDEEM,0,3,0,52,0,100,0,2,@E_REDEEM,0,0,1,3,10000,0,0,0,0,1,0,0,0,0,0,0,0,'Eranikus the Redeemed - On Say 2 - Say 3'),
+(@E_REDEEM,0,5,0,52,0,100,0,3,@E_REDEEM,0,0,15,8736,0,0,0,0,0,18,30,0,0,0,0,0,0,'Eranikus the Redeemed - On Say 3 - Credit'),
+(@E_REDEEM,0,6,0,52,0,100,0,3,@E_REDEEM,0,0,45,1,1,0,0,0,0,11,@REMULOS,40,0,0,0,0,0,'Eranikus the Redeemed - On Say 3 - Set Data');
+
+UPDATE `creature_template` SET AIName='SmartAI', Faction_A=14, Faction_H=14 WHERE entry=@PHANTASM;
+DELETE FROM `smart_scripts` WHERE entryorguid IN(@PHANTASM);
+INSERT INTO `smart_scripts` VALUES
+(@PHANTASM,0,0,0,54,0,100,0,0,0,0,0,53,1,@PHANTASM,0,8736,0,0,1,0,0,0,0,0,0,0,'Nightmare Phantasm - Summon - Start WayPoint'),
+(@PHANTASM,0,1,0,54,0,100,0,0,0,0,0,8,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Nightmare Phantasm - Summon - Aggresive'),
+(@PHANTASM,0,2,0,54,0,100,0,0,0,0,0,49,0,0,0,0,0,0,18,50,0,0,0,0,0,0,'Nightmare Phantasm - Summon - Attack Player'),
+(@PHANTASM,0,3,0,6,0,75,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Nightmare Phantasm - Death - Say 0'),
+(@PHANTASM,0,4,0,40,0,100,0,4,@PHANTASM,0,0,53,1,@PHANTASM,0,8736,0,0,1,0,0,0,0,0,0,0,'Nightmare Phantasm - WayPoint 20 - Start Again'),
+(@PHANTASM,0,5,0,1,0,100,1,60000,60000,60000,60000,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Nightmare Phantasm - OOC 60 Secs - Unseen'),
+(@PHANTASM,0,6,0,1,0,100,1,63000,63000,63000,63000,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Nightmare Phantasm - OOC 63 Secs - Despawn'),
+(@PHANTASM,0,7,0,1,0,100,1,5000,5000,5000,5000,53,1,@PHANTASM,0,8736,0,0,1,0,0,0,0,0,0,0,'Nightmare Phantasm - OOC 5 Secs - Start WayPoint');
+
+DELETE FROM `creature_template_addon` WHERE `entry`=@MALFURION;
+INSERT INTO `creature_template_addon` (`entry`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
+(@MALFURION,0,0,33554432,0,0,'24999'); -- Malfurion's Shade Aura & Hover Mode
+
+DELETE FROM `creature_template_addon` WHERE `entry`=@ERANIKUS;
+INSERT INTO `creature_template_addon` (`entry`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
+(@ERANIKUS,0,0,33554432,0,0,'');
+
+DELETE FROM `spell_target_position` WHERE `id`=25004;
+INSERT INTO `spell_target_position` (`id`,`target_map`,`target_position_x`,`target_position_y`,`target_position_z`,`target_orientation`) VALUES
+(25004,1,7730.5288,-2318.8596,451.34,0);
+
+-- Waypoints
+DELETE FROM `waypoints` WHERE entry=@REMULOS;
+INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES
+(@REMULOS,1,7829.66,-2244.87,463.87,'Keeper Remulos'),
+(@REMULOS,2,7817.25,-2306.20,456.00,'Keeper Remulos'),
+(@REMULOS,3,7866.54,-2312.20,463.32,'Keeper Remulos'),
+(@REMULOS,4,7908.488,-2309.086,467.677,'Keeper Remulos'),
+(@REMULOS,5,7933.290,-2314.777,473.674,'Keeper Remulos'),
+(@REMULOS,6,7942.543457,-2320.170654,476.770355,'Keeper Remulos'),
+(@REMULOS,7,7953.036133,-2357.953613,486.379303,'Keeper Remulos'),
+(@REMULOS,8,7962.706055,-2411.155518,488.955231,'Keeper Remulos'),
+(@REMULOS,9,7976.860352,-2552.697998,490.081390,'Keeper Remulos'),
+(@REMULOS,10,7949.307617,-2569.120361,489.716248,'Keeper Remulos'),
+(@REMULOS,11,7950.945801,-2597.000000,489.765564,'Keeper Remulos'),
+(@REMULOS,12,7948.758301,-2610.823486,492.368988,'Keeper Remulos'),
+(@REMULOS,13,7928.785156,-2629.920654,492.524933,'Keeper Remulos'), ## stop
+(@REMULOS,14,7948.697754,-2610.551758,492.363983,'Keeper Remulos'),
+(@REMULOS,15,7952.019531,-2591.974609,490.081238,'Keeper Remulos'),
+(@REMULOS,16,7940.567871,-2577.845703,488.946808,'Keeper Remulos'),
+(@REMULOS,17,7908.662109,-2566.450439,488.634644,'Keeper Remulos'),
+(@REMULOS,18,7873.132324,-2567.422363,486.946442,'Keeper Remulos'),
+(@REMULOS,19,7839.844238,-2570.598877,489.286224,'Keeper Remulos'),
+(@REMULOS,20,7830.678597,-2572.878974,489.286224,'Keeper Remulos'),
+(@REMULOS,21,7890.504,-2567.259,487.306,'Keeper Remulos'),
+(@REMULOS,22,7906.447,-2566.105,488.435,'Keeper Remulos'),
+(@REMULOS,23,7925.861,-2573.601,489.642,'Keeper Remulos'),
+(@REMULOS,24,7912.283,-2568.500,488.891,'Keeper Remulos');
+
+DELETE FROM `waypoints` WHERE `entry`=@REMULOS*100;
+INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES
+(@REMULOS*100,1,7828.5752,-2246.8354,463.5159,'Keeper Remulos - WP1'),
+(@REMULOS*100,2,7824.6440,-2279.0273,459.3173,'Keeper Remulos - WP2'),
+(@REMULOS*100,3,7814.1699,-2302.2565,456.2227,'Keeper Remulos - WP3'),
+(@REMULOS*100,4,7787.4604,-2320.9807,454.5470,'Keeper Remulos - WP4'),
+(@REMULOS*100,5,7753.7495,-2319.0832,454.7066,'Keeper Remulos - WP5'),
+(@REMULOS*100,6,7787.4604,-2320.9807,454.5470,'Keeper Remulos - WP6'),
+(@REMULOS*100,7,7814.1699,-2302.2565,456.2227,'Keeper Remulos - WP7'),
+(@REMULOS*100,8,7824.6440,-2279.0273,459.3173,'Keeper Remulos - WP8'),
+(@REMULOS*100,9,7828.5752,-2246.8354,463.5159,'Keeper Remulos - WP9'),
+(@REMULOS*100,10,7848.3,-2216.35,470.888,'Keeper Remulos - WP10 (Home)');
+
+
+-- Waypoints
+DELETE FROM `waypoints` WHERE entry IN(@ERANIKUS);
+INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES
+(@ERANIKUS,1,7949.812,-2605.4748,513.591,'Eranikus'),
+(@ERANIKUS,2,7931.3330,-2575.2097,489.6286,'Eranikus'),
+(@ERANIKUS,3,7925.129,-2573.747,493.901,'Eranikus'),
+(@ERANIKUS,4,7910.554,-2565.5534,488.616,'Eranikus'),
+(@ERANIKUS,5,7867.442,-2567.334,486.946,'Eranikus');
+
+
+-- Waypoints
+DELETE FROM `waypoints` WHERE entry IN(@PHANTASM);
+INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES
+(@PHANTASM,1,7891.990,-2566.737,487.385,'Phantasm'),
+(@PHANTASM,2,7865.966,-2554.104,486.967,'Phantasm'),
+(@PHANTASM,3,7901.544,-2581.989,487.178,'Phantasm'),
+(@PHANTASM,4,7918.844,-2553.987,486.911,'Phantasm'),
+(@PHANTASM,5,7873.412,-2587.454,486.946,'Phantasm');
+
+-- Waypoints
+DELETE FROM `waypoints` WHERE entry=@REMULOS*100+1;
+INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES
+(@REMULOS*100+1,12,7847.066,-2217.571,470.403,'Keeper Remulos'),
+(@REMULOS*100+1,11,7829.66,-2244.87,463.87,'Keeper Remulos'),
+(@REMULOS*100+1,10,7817.25,-2306.20,456.00,'Keeper Remulos'),
+(@REMULOS*100+1,9,7866.54,-2312.20,463.32,'Keeper Remulos'),
+(@REMULOS*100+1,8,7908.488,-2309.086,467.677,'Keeper Remulos'),
+(@REMULOS*100+1,7,7933.290,-2314.777,473.674,'Keeper Remulos'),
+(@REMULOS*100+1,6,7942.543457,-2320.170654,476.770355,'Keeper Remulos'),
+(@REMULOS*100+1,5,7953.036133,-2357.953613,486.379303,'Keeper Remulos'),
+(@REMULOS*100+1,4,7962.706055,-2411.155518,488.955231,'Keeper Remulos'),
+(@REMULOS*100+1,3,7976.860352,-2552.697998,490.081390,'Keeper Remulos'),
+(@REMULOS*100+1,2,7949.307617,-2569.120361,489.716248,'Keeper Remulos'),
+(@REMULOS*100+1,1,7940.567871,-2577.845703,488.946808,'Keeper Remulos');
+
+-- Arch Druid Lilliandra
+DELETE FROM `smart_scripts` WHERE entryorguid = 30630 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
+(30630, 0, 0, 1, 62, 0, 100, 0, 9991, 0, 0, 0, 85, 57536, 0, 0, 0, 0, 0, 19, 30630, 0, 0, 0, 0, 0, 0, 'Arch Druid Lilliandra - On gossip option select - Player Cast Forcecast Portal: Moonglade on Arch Druid Lilliandra');
+
+-- Icecrown's Moonglade portal
+DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=32790;
+INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES
+(32790,57654,1,0);
+
+DELETE FROM `smart_scripts` WHERE entryorguid IN (32790) AND `source_type` IN (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
+(32790, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 3, 0, 11686, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Moonglade Portal - On Respawn - Morph Into 0'),
+(32790, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 11, 61722, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Moonglade Portal - On Respawn - Cast Nature Portal State');
+
+-- Moonglade's return portal
+DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=32788;
+INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES
+(32788,57539,1,0);
+
+DELETE FROM `smart_scripts` WHERE entryorguid IN (32788) AND `source_type` IN (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
+(32788, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 3, 0, 11686, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Moonglade Return Portal - On Respawn - Morph Into 0'),
+(32788, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 61722, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Moonglade Return Portal - On Respawn - Cast Nature Portal State');
+
+-- Conditions for portals
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=18 AND `SourceEntry` IN (57654,57539);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(18, 32790, 57654, 0, 0, 28, 0, 13073, 0, 0, 0, 0, 0, '', 'Required quest active for spellclick'),
+(18, 32788, 57539, 0, 0, 28, 0, 13075, 0, 0, 0, 0, 0, '', 'Required quest active for spellclick');
+
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9991,10215);
+INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`) VALUES
+(9991, 0, 0, 'It''s a pleasure to meet you as well, Arch Druid. I am on a task from Tirion and time is short, might I trouble you for a portal to Moonglade?', 1, 1, 9992, 0, 0, 0, ''),
+(10215, 0, 0, 'Please send me into the Emerald Dream to recover the acorns. I know of the danger and I do not fear it.', 1, 1, 0, 0, 0, 0, ''),
+(10215, 1, 0, 'I wish to return to Arch Druid Lilliandra. Can you send me back to her?', 1, 1, 0, 0, 0, 0, '');
+
+-- Conditions for gossip
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (9991,10215);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(15, 9991, 0, 0, 0, 28, 0, 13073, 0, 0, 0, 0, 0, '', 'Show gossip menu option only if player has quest 13073 complete'),
+(15, 10215, 1, 0, 0, 28, 0, 13075, 0, 0, 0, 0, 0, '', 'Show gossip menu option only if player has quest 13075 complete'),
+(15, 10215, 0, 0, 0, 9, 0, 13074, 0, 0, 0, 0, 0, '', 'Show gossip menu option only if player has quest 13074 taken');
diff --git a/sql/updates/world/2013_08_04_01_world_sai.sql b/sql/updates/world/2013_08_04_01_world_sai.sql
new file mode 100644
index 00000000000..b327d567024
--- /dev/null
+++ b/sql/updates/world/2013_08_04_01_world_sai.sql
@@ -0,0 +1,21 @@
+SET @NPC := 7271;
+DELETE FROM `creature_ai_scripts` WHERE creature_id=@NPC;
+UPDATE `creature_template` SET `AIName`='SmartAI', `unit_flags`=32768 WHERE `entry`=@NPC;
+DELETE FROM `smart_scripts` WHERE (`entryorguid`=@NPC 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
+(@NPC, 0, 0, 1, 10, 0, 100, 1, 0, 10, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Witch Doctor Zum''rah - On OOC Los - Say Line 0'),
+(@NPC, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 2, 14, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Witch Doctor Zum''rah - On Link - Remove PC immunity'),
+(@NPC, 0, 3, 0, 0, 0, 100, 0, 1000, 3000, 6000, 10000, 11, 12739, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Witch Doctor Zum''rah - IC - Cast Shadowbolt '),
+(@NPC, 0, 4, 0, 2, 0, 100, 0, 30, 100, 30, 100, 23, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Witch Doctor Zum''rah - On mana pct above 30% - Decrement Phase'),
+(@NPC, 0, 5, 0, 0, 0, 100, 0, 15, 0, 15, 0, 23, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Witch Doctor Zum''rah - On mana pct 15 - Decrement Phase'),
+(@NPC, 0, 6, 0, 0, 0, 100, 0, 7000, 13000, 22000, 36000, 11, 15245, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Witch Doctor Zum''rah - IC - Cast Shadowbolt Volley'),
+(@NPC, 0, 7, 0, 0, 0, 100, 0, 8000, 15000, 26000, 39000, 11, 11086, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Witch Doctor Zum''rah - IC - Cast Ward of Zum''rah '),
+(@NPC, 0, 8, 0, 0, 0, 100, 0, 4000, 19000, 23000, 30000, 11, 12491, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Witch Doctor Zum''rah - IC - Cast Healing Wave'),
+(@NPC, 0, 9, 10, 6, 0, 100, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Witch Doctor Zum''rah - On Death - Yell'),
+(@NPC, 0, 10, 0, 61, 0, 100, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Witch Doctor Zum''rah - On Death - Set Phase 0'),
+(@NPC, 0, 11, 0, 7, 0, 100, 0, 0, 0, 0, 0, 2, 35, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Witch Doctor Zum''rah - On Evade - Set Friendly');
+
+DELETE FROM `creature_text` WHERE `entry` =@NPC;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
+(@NPC, 0, 0, 'How dare you enter my sanctum!', 12, 0, 100, 0, 0, 0, 'Witch Doctor Zum''rah'),
+(@NPC, 1, 0, 'T''eif godehsi wha!', 14, 14, 100, 0, 0, 0, 'Witch Doctor Zum''rah');
diff --git a/sql/updates/world/2013_08_04_02_world_sai.sql b/sql/updates/world/2013_08_04_02_world_sai.sql
new file mode 100644
index 00000000000..3cf828456c0
--- /dev/null
+++ b/sql/updates/world/2013_08_04_02_world_sai.sql
@@ -0,0 +1,45 @@
+-- Added missing gossip and text for Meridith the Mermaiden.Her gossip should now cast spell=25678 Siren's Song if player has Quest:Love_Song_for_Narain done, which will make players with quest Draconic for Dummies swim faster and not suffer from fatigue loss in waters.
+
+-- Meridith the Mermaiden NPC id (15526)
+-- http://www.youtube.com/watch?v=8lz_LbsEsBQ Video of her giving spell on gossip select
+
+SET @MERIDITH := 15526;
+SET @SPELL := 25678; -- http://www.wowhead.com/spell=25678
+SET @GOSSIP := 6658;
+SET @NPCTEXT := 7916;
+SET @NPCTEXT1 := 7917;
+SET @QUEST := 8599;
+
+UPDATE `creature_template` SET `gossip_menu_id`=@GOSSIP WHERE `entry`=@MERIDITH;
+
+DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id` IN (@NPCTEXT,@NPCTEXT1);
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES
+(@GOSSIP,@NPCTEXT),
+(@GOSSIP,@NPCTEXT1);
+
+DELETE FROM `gossip_menu_option` WHERE `menu_id`=@GOSSIP;
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(@GOSSIP,0,0,"That would be wonderful! Thank you, Meridith.",1,1,0,0,0,0,'');
+
+-- SAI for Meridith the Mermaiden
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@MERIDITH;
+
+DELETE FROM `smart_scripts` WHERE (`entryorguid`=15526 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
+(@MERIDITH,0,0,1,62,0,100,0,@GOSSIP,0,0,0,11,@SPELL,0,0,0,0,0,7,0,0,0,0,0,0,0,'Meridith the Mermaiden - On gossip select - Spellcast'),
+(@MERIDITH,0,1,2,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Meridith the Mermaiden - On gossip select - Close Gossip'),
+(@MERIDITH,0,2,0,61,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Meridith the Mermaiden - On Gossip select - Say');
+
+-- Conditions for Spellcast
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=@GOSSIP;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(14,@GOSSIP,@NPCTEXT,0,0,8,0,@QUEST,0,0,1,0,'','Show text if player doesn''t have quest rewarded' ),
+(14,@GOSSIP,@NPCTEXT1,0,0,8,0,@QUEST,0,0,0,0,'','Show text if player has quest rewarded'),
+(15,@GOSSIP,0,0,0,8,0,@QUEST,0,0,0,0,'','Show gossip only if player has quest done');
+
+
+-- Creature text
+DELETE FROM `npc_text` WHERE `ID` IN (@NPCTEXT,@NPCTEXT1);
+INSERT INTO `npc_text` (`ID`, `text0_0`, `text0_1`, `lang0`, `prob0`, `em0_0`, `em0_1`, `em0_2`, `em0_3`, `em0_4`, `em0_5`, `text1_0`, `text1_1`, `lang1`, `prob1`, `em1_0`, `em1_1`, `em1_2`, `em1_3`, `em1_4`, `em1_5`, `text2_0`, `text2_1`, `lang2`, `prob2`, `em2_0`, `em2_1`, `em2_2`, `em2_3`, `em2_4`, `em2_5`, `text3_0`, `text3_1`, `lang3`, `prob3`, `em3_0`, `em3_1`, `em3_2`, `em3_3`, `em3_4`, `em3_5`, `text4_0`, `text4_1`, `lang4`, `prob4`, `em4_0`, `em4_1`, `em4_2`, `em4_3`, `em4_4`, `em4_5`, `text5_0`, `text5_1`, `lang5`, `prob5`, `em5_0`, `em5_1`, `em5_2`, `em5_3`, `em5_4`, `em5_5`, `text6_0`, `text6_1`, `lang6`, `prob6`, `em6_0`, `em6_1`, `em6_2`, `em6_3`, `em6_4`, `em6_5`, `text7_0`, `text7_1`, `lang7`, `prob7`, `em7_0`, `em7_1`, `em7_2`, `em7_3`, `em7_4`, `em7_5`, `WDBVerified`) VALUES
+(@NPCTEXT, '', 'It''s so lovely to see you again, $N! I really can''t thank you enough for delivering that message to my dear little gnome.$B$BWould you like to hear a song? It will make traveling in the rough seas much easier!', 0, 1, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 11723),
+(@NPCTEXT1, '', 'I find the ocean floor to be very peaceful.', 0, 1, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 11723);
diff --git a/sql/updates/world/2013_08_04_03_world_sai.sql b/sql/updates/world/2013_08_04_03_world_sai.sql
new file mode 100644
index 00000000000..bd82b937ed7
--- /dev/null
+++ b/sql/updates/world/2013_08_04_03_world_sai.sql
@@ -0,0 +1,20 @@
+-- Random comment
+
+UPDATE `creature_template` SET AIName='SmartAI' WHERE entry IN (26417*100,26417);
+DELETE FROM `smart_scripts` WHERE source_type=0 AND entryorguid = 26417;
+DELETE FROM `smart_scripts` WHERE (`entryorguid`= 26417*100 AND `source_type`=9);
+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
+(26417, 0, 0, 0, 8, 0, 25, 0, 47604, 0, 10000, 10000, 80, 2641700, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Runed Giant - Start Script for Free At Last'),
+(2641700, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 2, 35, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Runed Giant - Change Faction'),
+(2641700, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Runed Giant - Stop Attack'),
+(2641700, 9, 2, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 33, 26783, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Runed Giant - Quest Credit'),
+(2641700, 9, 3, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Runed Giant - Say Lines'),
+(2641700, 9, 4, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Runed Giant - Despawn'),
+(2641700, 9, 5, 0, 0, 0, 100, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Runed Giant - Reset Faction');
+
+DELETE FROM `creature_text` WHERE `entry` =26417;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
+(26417, 0, 0, 'I thought I was doomed. Thank you for freeing me.', 12, 0, 100, 0, 0, 0, ''),
+(26417, 0, 1, 'You have my gratitude.', 12, 0, 100, 0, 0, 0, ''),
+(26417, 0, 2, 'I never thought I''d be free from that terrible spell!', 12, 0, 100, 0, 0, 0, ''),
+(26417, 0, 3, 'Thank you, small one.', 12, 0, 100, 0, 0, 0, '');
diff --git a/sql/updates/world/2013_08_04_04_world_trinity_string.sql b/sql/updates/world/2013_08_04_04_world_trinity_string.sql
new file mode 100644
index 00000000000..cab49ba73f3
--- /dev/null
+++ b/sql/updates/world/2013_08_04_04_world_trinity_string.sql
@@ -0,0 +1,3 @@
+DELETE FROM `trinity_string` WHERE `entry`=5037;
+INSERT INTO `trinity_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES
+(5037, 'MechanicImmuneMask: %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
diff --git a/sql/updates/world/2013_08_05_00_world_sai.sql b/sql/updates/world/2013_08_05_00_world_sai.sql
new file mode 100644
index 00000000000..05a675394c2
--- /dev/null
+++ b/sql/updates/world/2013_08_05_00_world_sai.sql
@@ -0,0 +1,3 @@
+-- Fix Redridge Mystic
+DELETE FROM `smart_scripts` WHERE `entryorguid`=430 AND `id`=12;
+UPDATE `smart_scripts` SET `link`=0 WHERE `entryorguid`=430 AND `id`=11;
diff --git a/sql/updates/world/2013_08_05_01_world_misc.sql b/sql/updates/world/2013_08_05_01_world_misc.sql
new file mode 100644
index 00000000000..a1e9aee50e7
--- /dev/null
+++ b/sql/updates/world/2013_08_05_01_world_misc.sql
@@ -0,0 +1,2 @@
+UPDATE `smart_scripts` SET `event_type`=2 WHERE `entryorguid`=7271 AND `source_type`=0 AND `id`=5 AND `link`=0;
+UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='', `InhabitType`=7, `faction_A`=35, `faction_H`=35, `unit_flags`=0, `type_flags`=8, `dynamicflags`=128, `flags_extra`=0, `speed_walk`=2 WHERE `entry`= 15491;
diff --git a/sql/updates/world/2013_08_05_01_world_trinity_string.sql b/sql/updates/world/2013_08_05_01_world_trinity_string.sql
new file mode 100644
index 00000000000..7e9a465d49a
--- /dev/null
+++ b/sql/updates/world/2013_08_05_01_world_trinity_string.sql
@@ -0,0 +1,8 @@
+DELETE FROM `trinity_string` WHERE `entry`=5038;
+INSERT INTO `trinity_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES
+(5038, 'Unit Flags: %u', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+
+UPDATE `trinity_string` SET `content_default`=
+'Unit Flags 2: %u.
+Dynamic Flags: %u.
+Faction Template: %u.' WHERE `entry`=542;
diff --git a/sql/updates/world/2013_08_05_02_world_quest_relation_tables.sql b/sql/updates/world/2013_08_05_02_world_quest_relation_tables.sql
new file mode 100644
index 00000000000..a7d2af1725a
--- /dev/null
+++ b/sql/updates/world/2013_08_05_02_world_quest_relation_tables.sql
@@ -0,0 +1,28 @@
+ALTER TABLE `creature_questrelation` RENAME `creature_queststarter`;
+ALTER TABLE `creature_involvedrelation` RENAME `creature_questender`;
+ALTER TABLE `gameobject_questrelation` RENAME `gameobject_queststarter`;
+ALTER TABLE `gameobject_involvedrelation` RENAME `gameobject_questender`;
+
+UPDATE `command` SET
+ `name` = 'reload gameobject_queststarter',
+ `help` = 'Syntax: .reload gameobject_queststarter\nReload gameobject_queststarter table.'
+WHERE
+ `name` = 'reload gameobject_questrelation';
+
+UPDATE `command` SET
+ `name` = 'reload gameobject_questender',
+ `help` = 'Syntax: .reload gameobject_questender\nReload gameobject_questender table.'
+WHERE
+ `name` = 'reload gameobject_questrelation';
+
+UPDATE `command` SET
+ `name` = 'reload creature_queststarter',
+ `help` = 'Syntax: .reload creature_queststarter\nReload creature_queststarter table.'
+WHERE
+ `name` = 'reload creature_questrelation';
+
+UPDATE `command` SET
+ `name` = 'reload creature_questender',
+ `help` = 'Syntax: .reload creature_questender\nReload creature_questender table.'
+WHERE
+ `name` = 'reload creature_involvedrelation';
diff --git a/sql/updates/world/2013_08_06_00_world_item_template.sql b/sql/updates/world/2013_08_06_00_world_item_template.sql
new file mode 100644
index 00000000000..15cc7ddfa5a
--- /dev/null
+++ b/sql/updates/world/2013_08_06_00_world_item_template.sql
@@ -0,0 +1 @@
+UPDATE `item_template` SET `spellcharges_1`=-1 WHERE `entry`=45008; -- confirmed in 4.x itemsparse
diff --git a/sql/updates/world/2013_08_06_01_world_hor.sql b/sql/updates/world/2013_08_06_01_world_hor.sql
new file mode 100644
index 00000000000..c9b8ccf8266
--- /dev/null
+++ b/sql/updates/world/2013_08_06_01_world_hor.sql
@@ -0,0 +1,24 @@
+-- areatrigger for the shadow throne
+DELETE FROM `areatrigger_scripts` WHERE `entry` = 5605;
+INSERT INTO `areatrigger_scripts` (`entry`,`scriptname`) VALUES
+(5605, 'at_shadow_throne');
+
+-- jaina's equipment
+DELETE FROM `creature_equip_template` WHERE `entry` = 36955 AND `id` = 1;
+INSERT INTO `creature_equip_template` (`entry`, `id`, `itementry1`, `itementry2`,`itementry3`) VALUES
+(36955, 1, 2177, 12869, 0);
+
+-- jaina's gossip menu (the same one FROM sylvanas)
+UPDATE `creature_template` SET `gossip_menu_id` = 10909 WHERE `entry` = 36955;
+
+-- jaina's scriptai part 2
+UPDATE `creature_template` SET `ScriptName` = 'npc_jaina_or_sylvanas_escape_hor' WHERE `entry` in (36955, 37554);
+
+-- Raging Ghoul scriptai
+UPDATE `creature_template` SET `ScriptName` = 'npc_raging_ghoul' WHERE `entry` = 36940;
+
+-- Risen Witch Doctor scriptai
+UPDATE `creature_template` SET `ScriptName` = 'npc_risen_witch_doctor' WHERE `entry` = 36941;
+
+-- LumberINg Abomination scriptai
+UPDATE `creature_template` SET `ScriptName` = 'npc_lumbering_abomination' WHERE `entry` = 37069;
diff --git a/sql/updates/world/2013_08_06_02_world_command.sql b/sql/updates/world/2013_08_06_02_world_command.sql
new file mode 100644
index 00000000000..2787cf079cf
--- /dev/null
+++ b/sql/updates/world/2013_08_06_02_world_command.sql
@@ -0,0 +1,3 @@
+DELETE FROM `command` WHERE `name`='reload gameobject_questender';
+INSERT INTO `command` (`name`, `security`, `help`) VALUES
+('reload gameobject_questender', 3, 'Syntax: .reload gameobject_questender\\nReload gameobject_questender table.');
diff --git a/sql/updates/world/2013_08_06_03_world_area_4522.sql b/sql/updates/world/2013_08_06_03_world_area_4522.sql
new file mode 100644
index 00000000000..63ac8c4aeac
--- /dev/null
+++ b/sql/updates/world/2013_08_06_03_world_area_4522.sql
@@ -0,0 +1,95 @@
+SET @CGUID := 120649;
+SET @HULKING_HORROR := 31411;
+SET @HULKING_HORROR1 := 31413;
+SET @KRENDELL := 31444;
+SET @V_COMMANDO := 31414;
+SET @UPPER_CUT := 10966;
+SET @INF_BITE := 49861;
+SET @COSMETIC_EXP := 46225;
+SET @FLAME_PATCH := 42344;
+SET @FC_PITFALL := 59398;
+SET @AURA_FALL := 59396;
+SET @ASPELL := 59073;
+SET @HSPELL := 59087;
+SET @AREA := 4522;
+
+-- Setting new spawns to appropriate phase, and older spawns to their own appropriate phase also.
+UPDATE `creature_template` SET `minlevel`=79, `maxlevel`=80, `exp`=2, `faction_A`=2043, `faction_H`=2043, `speed_run`=1.28968, `mindmg`=422, `maxdmg`=586, `attackpower`=642, `minrangedmg`=345, `maxrangedmg`=509, `rangedattackpower`=103 WHERE `entry`=31413;
+UPDATE `creature_template` SET AIName = 'SmartAI' WHERE entry IN (@HULKING_HORROR,@HULKING_HORROR1);
+UPDATE `creature` SET `phaseMask` = 2 WHERE id IN (@KRENDELL,@V_COMMANDO,@HULKING_HORROR);
+UPDATE `creature` SET `phaseMask` = 8 WHERE id = @HULKING_HORROR1;
+UPDATE `gameobject` SET `phaseMask` = 10 WHERE id IN (193401,193400);
+UPDATE `creature` SET `phaseMask` = 10 WHERE id IN (31641, 31644);
+
+-- Phasing zone to both Alliance and Horde sides so they don't collide with the npc's there.
+DELETE FROM `spell_area` WHERE `spell` IN (@HSPELL,@ASPELL) AND `area`=@AREA;
+INSERT INTO `spell_area` (`spell`,`area`,`quest_start`,`quest_end`,`aura_spell`,`racemask`,`gender`,`autocast`,`quest_start_status`,`quest_end_status`) VALUES
+(@HSPELL,@AREA,13258,13282,0, 690,2,1,66,43), -- Horde version
+(@ASPELL,@AREA,13386,13392,0,1101,2,1,66,43); -- Alliance version
+
+-- Missing Hulking Horrors
+DELETE FROM `creature` WHERE guid BETWEEN @CGUID AND @CGUID+22;
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`) VALUES
+(@CGUID, 31413, 571, 1, 8, 23681, 0, 5814.02, 1985.69, 503.881, 2.51188, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+1, 31413, 571, 1, 8, 23681, 0, 5816.86, 1943.29, 507.56, 3.40633, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+2, 31413, 571, 1, 8, 23681, 0, 5863.57, 1984, 507.648, 5.88321, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+3, 31413, 571, 1, 8, 23681, 0, 5778.56, 1957.5, 503.857, 3.27375, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+4, 31413, 571, 1, 8, 23681, 0, 5732.14, 1937.82, 506.014, 5.41257, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+5, 31413, 571, 1, 8, 23681, 0, 5706.3, 1977.47, 503.911, 4.05224, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+6, 31413, 571, 1, 8, 23681, 0, 5685.71, 1974.25, 503.863, 2.57831, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+7, 31413, 571, 1, 8, 23681, 0, 5673.84, 2094.37, 503.889, 5.52857, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+8, 31413, 571, 1, 8, 23681, 0, 5831.47, 2106.11, 503.89, 6.24962, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+9, 31413, 571, 1, 8, 23681, 0, 5826.33, 2149.32, 505.746, 2.48705, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+10, 31413, 571, 1, 8, 23681, 0, 5754.92, 2151.17, 503.91, 1.93734, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+11, 31413, 571, 1, 8, 23681, 0, 5775.43, 2193.86, 512.998, 0.776427, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+12, 31413, 571, 1, 8, 23681, 0, 5729.88, 2136.62, 503.894, 1.79434, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+13, 31413, 571, 1, 8, 23681, 0, 5782.62, 2140.68, 503.9, 0.783972, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+14, 31413, 571, 1, 8, 23681, 0, 5754.13, 2174.58, 506.181, 1.25723, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+15, 31413, 571, 1, 8, 23681, 0, 5650.03, 2055.57, 503.868, 0.939173, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+16, 31413, 571, 1, 8, 23681, 0, 5660.07, 2125.83, 505.943, 0.534949, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+17, 31413, 571, 1, 8, 23681, 0, 5700.89, 2148.91, 503.999, 5.77704, 300, 0, 0, 12175, 0, 0, 0, 0, 0),
+(@CGUID+18, 31413, 571, 1, 8, 23681, 0, 5651.27, 2007.15, 504.97, 1.98891, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+19, 31413, 571, 1, 8, 23681, 0, 5858.93, 2108.63, 505.124, 2.30257, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+20, 31413, 571, 1, 8, 23681, 0, 5688.14, 2001.98, 503.924, 0.151243, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+21, 31413, 571, 1, 8, 23681, 0, 5845.64, 2080.43, 503.97, 2.90496, 300, 5, 0, 12175, 0, 1, 0, 0, 0),
+(@CGUID+22, 31413, 571, 1, 8, 23681, 0, 5876.8, 2037.78, 506.147, 0.498635, 300, 0, 0, 12175, 0, 0, 0, 0, 0);
+
+-- Conditions for Aura fall
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 and `SourceEntry` = @AURA_FALL;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, @AURA_FALL, 0, 0, 31, 0, 3, 31641, 0, 0, 0, 0, '', 'Aura fall hits only pitfall npc');
+
+-- Saronite bomb should blow-up the player into the pit
+UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry`=193400;
+DELETE FROM `smart_scripts` WHERE `source_type`=1 AND `entryorguid`=193400;
+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
+(193400, 1, 0, 0, 19, 0, 100, 0, 13389, 0, 0, 0, 45, 1, 1, 0, 0, 0, 0, 10, 123287, 31644, 0, 0, 0, 0, 0, 'Saronite Bomb Stack - On quest accept - Set Data'),
+(193400, 1, 1, 0, 19, 0, 100, 0, 13263, 0, 0, 0, 45, 1, 1, 0, 0, 0, 0, 10, 123287, 31644, 0, 0, 0, 0, 0, 'Saronite Bomb Stack - On quest accept - Set Data');
+
+-- Cosmetic Explosion bunny
+UPDATE `creature_template` SET AIName = 'SmartAI' WHERE entry = 31644;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=31644 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
+(31644, 0, 0, 1, 38, 0, 100, 0, 1, 1, 0, 0, 11, @COSMETIC_EXP, 2, 0, 0, 0, 0, 9, 31644, 20, 40, 0, 0, 0, 0, 'Cosmetic Trigger - On Data set - Cosmetic Explosion'),
+(31644, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 11, @FLAME_PATCH, 2, 0, 0, 0, 0, 9, 31644, 20, 40, 0, 0, 0, 0, 'Cosmetic Trigger - On Link - Cast flame patch on npc''s'),
+(31644, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 12, 31641, 1, 0, 0, 0, 0, 21, 10, 0, 0, 0, 0, 0, 0, 'Saronite Bomb Stack - On Link - Summon Pitfall bunny');
+
+-- "Fall" vehicle bunny
+UPDATE `creature_template` SET AIName = 'SmartAI', `speed_walk`=20.1429, `speed_run`=20.1429 WHERE entry = 31641;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=31641 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
+(31641, 0, 0, 1, 54, 0, 100, 0, 0, 0, 0, 0, 11, @FC_PITFALL, 2, 0, 0, 0, 0, 21, 100, 0, 0, 0, 0, 0, 0, 'Pitfall bunny - On respawn - Cast FC pitfall'),
+(31641, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 5756.644, 2050.579, 480.6346, 0, 'Pitfall bunny - On Link - Go to PoS');
+
+-- Hulking Horror phase 2
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@HULKING_HORROR 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
+(@HULKING_HORROR,0,0,0,0,0,100,0,8000,16000,24000,32000,11,@INF_BITE,0,0,0,0,0,5,0,0,0,0,0,0,0,'Hulking Horror - In Combat - Cast Infected Bite'),
+(@HULKING_HORROR,0,1,0,0,0,100,0,4000,9000,14000,19000,11,@UPPER_CUT,0,0,0,0,0,5,0,0,0,0,0,0,0,'Hulking Horror - In Combat - Cast Uppercut'),
+(@HULKING_HORROR,0,2,0,6,0,100,0,0,0,0,0,33,31413,0,0,0,0,0,5,0,0,0,0,0,0,0,'Hulking Horror - On Death - Killcredit');
+
+-- Hulking Horrors phase 8
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@HULKING_HORROR1 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
+(@HULKING_HORROR1,0,0,0,0,0,100,0,8000,16000,24000,32000,11,@INF_BITE,0,0,0,0,0,5,0,0,0,0,0,0,0,'Hulking Horror - In Combat - Cast Infected Bite'),
+(@HULKING_HORROR1,0,1,0,0,0,100,0,4000,9000,14000,19000,11,@UPPER_CUT,0,0,0,0,0,5,0,0,0,0,0,0,0,'Hulking Horror - In Combat - Cast Uppercut');
diff --git a/sql/updates/world/2013_08_06_04_world_sai.sql b/sql/updates/world/2013_08_06_04_world_sai.sql
new file mode 100644
index 00000000000..54124c1ea41
--- /dev/null
+++ b/sql/updates/world/2013_08_06_04_world_sai.sql
@@ -0,0 +1,35 @@
+-- Into The Wild Green Yonder (13045)
+SET @NPC_CAPTURED := 30407; -- Captured Crusader
+SET @NPC_SKYTALON := 30500; -- Argent Skytalon (not the mount)
+SET @NPC_SKYTALON_MOUNT := 30228; -- Argent Skytalon (mount)
+
+UPDATE `creature_template` SET `faction_A`=2070,`faction_H`=2070 WHERE `entry`=@NPC_SKYTALON;
+UPDATE `creature_template` SET `npcflag`=0 WHERE `entry`=@NPC_SKYTALON_MOUNT;
+
+-- Re-vamped SAI script
+UPDATE `creature_template` SET `npcflag`=0,`AIName`='SmartAI' WHERE `entry`=@NPC_CAPTURED;
+DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@NPC_CAPTURED;
+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
+(@NPC_CAPTURED,0,0,1,25,0,100,0,0,0,0,0,75,56726,0,0,0,0,0,1,0,0,0,0,0,0,0,'Apply aura on reset, linking to id 1'),
+(@NPC_CAPTURED,0,1,0,61,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'set phasemask to 1'),
+(@NPC_CAPTURED,0,2,0,1,1,100,0,4000,4000,4000,4000,10,70,22,0,0,0,0,1,0,0,0,0,0,0,0,'play emote OOC in phase 1'),
+(@NPC_CAPTURED,0,3,4,8,1,100,0,56683,0,0,0,11,56687,0,0,0,0,0,7,0,0,0,0,0,0,0,'Mount proto drake on spell hit, linking to id 4'),
+(@NPC_CAPTURED,0,4,5,61,1,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Say text , linking to id 5'),
+(@NPC_CAPTURED,0,5,0,61,1,100,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'set phasemask to 2'),
+(@NPC_CAPTURED,0,6,0,1,2,100,0,8000,8000,8000,8000,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Say text OOC in phase 2, starting with 8sec delay, then repeat every 8 secs'),
+(@NPC_CAPTURED,0,7,8,23,2,100,0,56687,0,1000,1000,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'say text if does not have ride aura(check every 1 sec), linking to id 8'),
+(@NPC_CAPTURED,0,8,9,61,2,100,0,0,0,0,0,41,5000,0,0,0,0,0,1,0,0,0,0,0,0,0,'set despawn timer for 5 secs, linking to id 9'),
+(@NPC_CAPTURED,0,9,0,61,2,100,0,0,0,0,0,22,4,0,0,0,0,0,1,0,0,0,0,0,0,0,'set phase to 4');
+-- Re-vamped spellclick
+DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=@NPC_SKYTALON;
+INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`cast_flags`,`user_type`) VALUES
+-- Proper value
+(@NPC_SKYTALON,56922,2,0);
+-- rRe-vamped condition
+DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId`=18 AND `SourceEntry`=56922) OR (`SourceTypeOrReferenceId`=17 AND `SourceEntry`=56684) OR (`SourceTypeOrReferenceId`=13 AND `SourceEntry`=56683);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(18,@NPC_SKYTALON,56922,0,0,8,0,13045,0,0,1,0,'','Forbidden rewarded quest for spellclick'),
+(18,@NPC_SKYTALON,56922,0,0,9,0,13045,0,0,0,0,'','Required quest active for spellclick'),
+(13,1,56683,0,0,31,0,3,@NPC_CAPTURED,0,0,0,'','Grab Captured Crusader targets Captured Crusader'),
+(17,0,56684,0,0,30,0,192523,15,0,0,0,'','Spell focus for Drop Off Captured Crusader'),
+(17,0,56684,0,0,29,0,@NPC_CAPTURED,10,0,0,0,'','Drop Off Captured Crusader requires a Captured Crusader');
diff --git a/sql/updates/world/2013_08_06_05_world_misc.sql b/sql/updates/world/2013_08_06_05_world_misc.sql
new file mode 100644
index 00000000000..505cb81e882
--- /dev/null
+++ b/sql/updates/world/2013_08_06_05_world_misc.sql
@@ -0,0 +1,333 @@
+-- The Last Line Of Defense (13086)
+SET @NEXT := 142412;
+SET @PATH := @NEXT * 10;
+
+DELETE FROM `spell_script_names` WHERE `spell_id` IN (57412,57385);
+INSERT INTO `spell_script_names`(`spell_id`, `ScriptName`) VALUES
+(57412,'spell_q13086_cannons_target'),
+(57385,'spell_q13086_cannons_target');
+
+-- Forgotten Depths Slayer SAI ID: 30593
+UPDATE `creature_template` SET `speed_walk`=5,`movementtype`=1,`faction_A`=2068, `faction_H`=2068,`AIName`= 'SmartAI' WHERE `entry`= 30593;
+DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=30593;
+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
+(30593,0,1,0,0,0,100,0,1000,5000,2500,6500,11,54185,0,0,0,0,0,2,0,0,0,0,0,0,0,'Combat - Claw Slash');
+
+-- Adds 70 Forgotten Depths Slayers for phase 64 ID: 30593
+DELETE FROM `creature` WHERE `id`=30593;
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `MovementType`) VALUES
+(@NEXT+1, 30593, 571, 1, 64, 6442.551758, 222.894867, 397.353943, 2.7317, 5, 60, 0, 1),
+(@NEXT+2, 30593, 571, 1, 64, 6437.940430, 215.351151, 397.798889, 0.929563, 5, 60, 0, 1),
+(@NEXT+3, 30593, 571, 1, 64, 6419.338379, 239.908859, 396.095978, 2.1122, 5, 60, 0, 1),
+(@NEXT+4, 30593, 571, 1, 64, 6428.831055, 239.908859, 396.763702, 3.5549, 5, 60, 0, 1),
+(@NEXT+5, 30593, 571, 1, 64, 6400.702148, 236.755035, 395.685333, 1.32629, 5, 60, 0, 1),
+(@NEXT+6, 30593, 571, 1, 64, 6410.955078, 249.759094, 396.454742, 2.77181, 5, 60, 0, 1),
+(@NEXT+7, 30593, 571, 1, 64, 6367.340820, 183.807068, 391.614655, 0.501217, 5, 60, 0, 1),
+(@NEXT+8, 30593, 571, 1, 64, 6382.062500, 176.836975, 393.132507, 1.22528, 5, 60, 0, 1),
+(@NEXT+9, 30593, 571, 1, 64, 6357.964355, 158.979782, 391.124756, 2.99677, 5, 60, 0, 1),
+(@NEXT+10, 30593, 571, 1, 64, 6373.327537, 146.681412, 392.788330, 3.35221, 5, 60, 0, 1),
+(@NEXT+11, 30593, 571, 1, 64, 6343.335938, 173.300323, 389.862518, 4.18409, 5, 60, 0, 1),
+(@NEXT+12, 30593, 571, 1, 64, 6335.788086, 148.828232, 389.702972, 3.19711, 5, 60, 0, 1),
+(@NEXT+13, 30593, 571, 1, 64, 6347.954590, 129.882919, 3391.126984, 2.81552, 5, 60, 0, 1),
+(@NEXT+14, 30593, 571, 1, 64, 6333.287109, 88.245689, 391.002228, 5.84132, 5, 60, 0, 1),
+(@NEXT+15, 30593, 571, 1, 64, 6336.879395, 71.525627, 390.192871, 0.785398, 5, 60, 0, 1),
+(@NEXT+16, 30593, 571, 1, 64, 6318.244629, 32.249405, 391.493988, 2.1325, 5, 60, 0, 1),
+(@NEXT+17, 30593, 571, 1, 64, 6312.728320, 8.393217, 392.626587, 0.291176, 5, 60, 0, 1),
+(@NEXT+18, 30593, 571, 1, 64, 6326.704590, 107.359123, 391.002045, 0.919091, 5, 60, 0, 1),
+(@NEXT+19, 30593, 571, 1, 64, 6301.972656, 119.744209, 389.925903, 1.55615, 5, 60, 0, 1),
+(@NEXT+20, 30593, 571, 1, 64, 6266.120117, 148.388809, 383.515961, 1.84373, 5, 60, 0, 1),
+(@NEXT+21, 30593, 571, 1, 64, 6251.726074, 153.168182, 381.629669, 1.80125, 5, 60, 0, 1),
+(@NEXT+22, 30593, 571, 1, 64, 6229.003418, 145.614822, 379.721741, 5.84095, 5, 60, 0, 1),
+(@NEXT+23, 30593, 571, 1, 64, 6284.683082, 214.294250, 388.699188, 2.78648, 5, 60, 0, 1),
+(@NEXT+24, 30593, 571, 1, 64, 6302.265625, 212.301346, 390.488556, 3.48219, 5, 60, 0, 1),
+(@NEXT+25, 30593, 571, 1, 64, 6299.725098, 226.082626, 391.288788, 5.13205, 5, 60, 0, 1),
+(@NEXT+26, 30593, 571, 1, 64, 6200.917969, 220.434753, 383.776184, 2.88047, 5, 60, 0, 1),
+(@NEXT+27, 30593, 571, 1, 64, 6200.930664, 234.127823, 384.630798, 1.50529, 5, 60, 0, 1),
+(@NEXT+28, 30593, 571, 1, 64, 6190.595703, 225.242371, 382.554016, 4.4761, 5, 60, 0, 1),
+(@NEXT+29, 30593, 571, 1, 64, 6189.209961, 210.502823, 381.877960, 2.11574, 5, 60, 0, 1),
+(@NEXT+30, 30593, 571, 1, 64, 6176.683594, 213.375336, 380.395172, 0.763302, 5, 60, 0, 1),
+(@NEXT+31, 30593, 571, 1, 64, 6113.089844, 156.401672, 369.398804, 5.60417, 5, 60, 0, 1),
+(@NEXT+32, 30593, 571, 1, 64, 6103.571289, 140.684174, 367.524414, 0.430917, 5, 60, 0, 1),
+(@NEXT+33, 30593, 571, 1, 64, 6093.838867, 143.838867, 367.781097, 6.10437, 5, 60, 0, 1),
+(@NEXT+34, 30593, 571, 1, 64, 6090.764160, 141.764160, 365.786255, 5.91518, 5, 60, 0, 1),
+(@NEXT+35, 30593, 571, 1, 64, 6079.681641, 141.840958, 366.456573, 5.91108, 5, 60, 0, 1),
+(@NEXT+36, 30593, 571, 1, 64, 6062.076660, 155.683197, 363.868896, 2.05191, 5, 60, 0, 1),
+(@NEXT+37, 30593, 571, 1, 64, 6076.666016, 163.742477, 362.454651, 3.57468, 5, 60, 0, 1),
+(@NEXT+38, 30593, 571, 1, 64, 6088.131348, 179.086304, 360.483307, 5.6035, 5, 60, 0, 1),
+(@NEXT+39, 30593, 571, 1, 64, 6098.503418, 176.307312, 364.942688, 5.6035, 5, 60, 0, 1),
+(@NEXT+40, 30593, 571, 1, 64, 6090.764160, 155.876968, 365.786255, 5.6035, 5, 60, 0, 1),
+(@NEXT+41, 30593, 571, 1, 64, 6338.830566, 70.974663, 390.432343, 5.6035, 5, 60, 0, 1),
+(@NEXT+42, 30593, 571, 1, 64, 6339.270508, 63.711479, 389.662994, 5.6035, 5, 60, 0, 1),
+(@NEXT+43, 30593, 571, 1, 64, 6282.305176, 128.449188, 386.556244, 5.6035, 5, 60, 0, 1),
+(@NEXT+44, 30593, 571, 1, 64, 6267.317383, 130.918854, 384.601959, 5.6035, 5, 60, 0, 1),
+(@NEXT+45, 30593, 571, 1, 64, 6182.309082, 94.777863, 377.689959, 5.6035, 5, 60, 0, 1),
+(@NEXT+46, 30593, 571, 1, 64, 6157.960383, 89.072354, 371.833959, 5.6035, 5, 60, 0, 1),
+(@NEXT+47, 30593, 571, 1, 64, 6236.617383, 113.980854, 380.351959, 5.6035, 5, 60, 0, 1),
+(@NEXT+48, 30593, 571, 1, 64, 6295.647383, 137.418854, 387.451959, 5.6035, 5, 60, 0, 1),
+(@NEXT+49, 30593, 571, 1, 64, 6200.917969, 220.434753, 383.776184, 2.88047, 5, 60, 0, 1),
+(@NEXT+50, 30593, 571, 1, 64, 6200.930664, 234.127823, 384.630798, 1.50529, 5, 60, 0, 1),
+(@NEXT+51, 30593, 571, 1, 64, 6190.595703, 225.242371, 382.554016, 4.4761, 5, 60, 0, 1),
+(@NEXT+52, 30593, 571, 1, 64, 6189.209961, 210.502823, 381.877960, 2.11574, 5, 60, 0, 1),
+(@NEXT+53, 30593, 571, 1, 64, 6176.683594, 213.375336, 380.395172, 0.763302, 5, 60, 0, 1),
+(@NEXT+54, 30593, 571, 1, 64, 6113.089844, 156.401672, 369.398804, 5.60417, 5, 60, 0, 1),
+(@NEXT+55, 30593, 571, 1, 64, 6103.571289, 140.684174, 367.524414, 0.430917, 5, 60, 0, 1),
+(@NEXT+56, 30593, 571, 1, 64, 6093.838867, 143.838867, 367.781097, 6.10437, 5, 60, 0, 1),
+(@NEXT+57, 30593, 571, 1, 64, 6090.764160, 141.764160, 365.786255, 5.91518, 5, 60, 0, 1),
+(@NEXT+58, 30593, 571, 1, 64, 6079.681641, 141.840958, 366.456573, 5.91108, 5, 60, 0, 1),
+(@NEXT+59, 30593, 571, 1, 64, 6062.076660, 155.683197, 363.868896, 2.05191, 5, 60, 0, 1),
+(@NEXT+60, 30593, 571, 1, 64, 6076.666016, 163.742477, 362.454651, 3.57468, 5, 60, 0, 1),
+(@NEXT+61, 30593, 571, 1, 64, 6088.131348, 179.086304, 360.483307, 5.6035, 5, 60, 0, 1),
+(@NEXT+62, 30593, 571, 1, 64, 6098.503418, 176.307312, 364.942688, 5.6035, 5, 60, 0, 1),
+(@NEXT+63, 30593, 571, 1, 64, 6090.764160, 155.876968, 365.786255, 5.6035, 5, 60, 0, 1),
+(@NEXT+64, 30593, 571, 1, 64, 6338.830566, 70.974663, 390.432343, 5.6035, 5, 60, 0, 1),
+(@NEXT+65, 30593, 571, 1, 64, 6339.270508, 63.711479, 389.662994, 5.6035, 5, 60, 0, 1),
+(@NEXT+66, 30593, 571, 1, 64, 6282.305176, 128.449188, 386.556244, 5.6035, 5, 60, 0, 1),
+(@NEXT+67, 30593, 571, 1, 64, 6267.317383, 130.918854, 384.601959, 5.6035, 5, 60, 0, 1),
+(@NEXT+68, 30593, 571, 1, 64, 6182.309082, 94.777863, 377.689959, 5.6035, 5, 60, 0, 1),
+(@NEXT+69, 30593, 571, 1, 64, 6157.960383, 89.072354, 371.833959, 5.6035, 5, 60, 0, 1),
+(@NEXT+70, 30593, 571, 1, 64, 6236.617383, 113.980854, 380.351959, 5.6035, 5, 60, 0, 1);
+
+-- Frostbrood Destroyers 5
+UPDATE `creature_template` SET `maxlevel`=80,`minlevel`=80,`exp`=2,`InhabitType`=7,`speed_walk`=3,`mindmg` = 1170,`dmg_multiplier` = 2,`attackpower` = 342,`maxdmg` = 3470,`movementtype`=1,`faction_A`=2068, `faction_H`=2068 WHERE `entry`= 30575;
+DELETE FROM `creature` WHERE `id`=30575;
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES
+(@NEXT+71, 30575,571,1,64,6097.870117, 58.331299, 380.506012, 0.138359, 75,20,1),
+(@NEXT+72, 30575,571,1,64,6243.700195, 183.362000, 392.515015, 4.594332, 75,20,1),
+(@NEXT+73, 30575,571,1,64,6313.589844, 154.557999, 397.022003, 4.739780, 75,20,1),
+(@NEXT+74, 30575,571,1,64,6331.450195, 53.939301, 399.138000, 2.973792, 75,20,1),
+(@NEXT+75, 30575,571,1,64,6187.290039, 131.792999, 386.451996, 3.173792, 75,20,1);
+
+-- Hover mode for Frostbroods
+DELETE FROM `creature_template_addon` WHERE `entry`=30575;
+INSERT INTO `creature_template_addon` (`entry`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
+(30575,0,0,33554432,0,0,'');
+
+-- Pathing
+-- Slayers reinforcements left on main path
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+1;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+1;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES
+(@NEXT+1,@PATH+1,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+1;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+1,1,6442.551758, 222.894867, 397.353943,0,2,0,100,0),
+(@PATH+1,2,6337.383789,113.591568,391.210876,6000,2,0,100,0),
+(@PATH+1,3,6299.144531,126.174286,391.081909,6000,2,0,100,0);
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+2;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+2;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES
+(@NEXT+2,@PATH+2,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+2;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+2,1,6437.940430,215.351151,397.798889,0,2,0,100,0),
+(@PATH+2,2,6327.383789,143.591568,391.210876,6000,2,0,100,0),
+(@PATH+2,3,6296.544531,76.174286,391.081909,6000,2,0,100,0);
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+3;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+3;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES
+(@NEXT+3,@PATH+3,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+3;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+3,1,6419.338379,239.908859,396.095978,0,2,0,100,0),
+(@PATH+3,2,6317.383789,115.591568,391.210876,6000,2,0,100,0),
+(@PATH+3,3,6294.144531,126.174286,391.081909,6000,2,0,100,0);
+
+-- Slayers reinforcements right on main path
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+4;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+4;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES
+(@NEXT+4,@PATH+4,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+4;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+4,1, 6428.831055, 239.908859, 396.763702,0,2,0,100,0),
+(@PATH+4,2,6346.144531,126.174286,391.081909,6000,2,0,100,0),
+(@PATH+4,3,6297.353789,80.591568,391.210876,6000,2,0,100,0);
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+5;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+5;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES
+(@NEXT+5,@PATH+5,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+5;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+5,1, 6400.702148, 236.755035, 395.685333,0,2,0,100,0),
+(@PATH+5,2,6356.144531,106.174286,391.081909,6000,2,0,100,0),
+(@PATH+5,3,6398.383789,70.591568,391.210876,6000,2,0,100,0);
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+6;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+6;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES
+(@NEXT+6,@PATH+6,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+6;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+6,1, 6410.955078, 249.759094, 396.454742,0,2,0,100,0),
+(@PATH+6,2,6376.144531,116.174286,391.081909,6000,2,0,100,0),
+(@PATH+6,3,6295.383789,65.591568,391.210876,6000,2,0,100,0);
+
+-- Slayers reinforcements on the rear
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+31;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+31;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES
+(@NEXT+31,@PATH+7,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+7;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+7,1, 6113.089844, 156.401672, 369.398804,0,2,0,100,0),
+(@PATH+7,2,6175.009766,125.577263,369.434753,6000,2,0,100,0),
+(@PATH+7,3,6109.930176,49.710854,369.404419,6000,2,0,100,0);
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+32;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+32;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NEXT+32,@PATH+8,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+8;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+8,1, 6103.571289, 140.684174, 368.524414,0,2,0,100,0),
+(@PATH+8,2,6165.009766,119.577263,369.434753,6000,2,0,100,0),
+(@PATH+8,3,6118.930176,64.710854,369.404419,6000,2,0,100,0);
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+33;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+33;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NEXT+33,@PATH+9,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+9;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+9,1, 6093.838867, 143.838867, 368.781097,0,2,0,100,0),
+(@PATH+9,2,6171.009766,114.577263,369.434753,6000,2,0,100,0),
+(@PATH+9,3,6114.930176,61.710854,369.404419,6000,2,0,100,0);
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+34;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+34;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NEXT+34,@PATH+10,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+10;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+10,1, 6090.764160, 141.764160, 369.786255,0,2,0,100,0),
+(@PATH+10,2,6183.009766,109.577263,369.434753,6000,2,0,100,0),
+(@PATH+10,3,6109.930176,57.710854,369.404419,6000,2,0,100,0);
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+35;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+35;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NEXT+35,@PATH+11,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+11;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+11,1, 6079.681641, 141.840958, 369.456573,0,2,0,100,0),
+(@PATH+11,2,6180.009766,121.577263,369.434753,6000,2,0,100,0),
+(@PATH+11,3,6124.930176,70.710854,369.404419,6000,2,0,100,0);
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+36;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+36;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NEXT+36,@PATH+12,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+12;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+12,1, 6062.076660, 155.683197, 369.868896,0,2,0,100,0),
+(@PATH+12,2,6114.930176,74.710854,368.404419,6000,2,0,100,0),
+(@PATH+12,3,6187.009766,111.577263,369.434753,6000,2,0,100,0);
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+37;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+37;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NEXT+37,@PATH+13,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+13;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+13,1, 6076.666016, 163.742477, 369.454651,0,2,0,100,0),
+(@PATH+13,2,6117.930176,55.710854,369.404419,6000,2,0,100,0),
+(@PATH+13,3,6178.009766,112.577263,369.434753,6000,2,0,100,0);
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+38;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+38;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NEXT+38,@PATH+14,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+14;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+14,1, 6088.131348, 179.086304, 372.483307,0,2,0,100,0),
+(@PATH+14,2,6115.930176,73.710854,369.404419,6000,2,0,100,0),
+(@PATH+14,3,6185.009766,119.577263,369.434753,6000,2,0,100,0);
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+39;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+39;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NEXT+39,@PATH+15,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+15;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+15,1, 6098.503418, 176.307312, 369.942688,0,2,0,100,0),
+(@PATH+15,2,6115.930176,51.710854,369.404419,6000,2,0,100,0),
+(@PATH+15,3,6185.009766,110.577263,369.434753,6000,2,0,100,0);
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+40;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+40;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NEXT+40,@PATH+16,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+16;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+16,1, 6090.764160, 155.876968, 368.786255,0,2,0,100,0),
+(@PATH+16,2,6112.930176,61.710854,369.404419,6000,2,0,100,0),
+(@PATH+16,3,6176.009766,114.577263,370.434753,6000,2,0,100,0);
+
+-- Slayers from West to both parts
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+26;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+26;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NEXT+26,@PATH+17,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+17;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+17,1, 6200.917969, 220.434753, 372.776184,0,2,0,100,0),
+(@PATH+17,2,6346.144531,126.174286,372.081909,6000,2,0,100,0),
+(@PATH+17,3,6287.383789,80.591568,372.210876,6000,2,0,100,0);
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+27;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+27;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NEXT+27,@PATH+19,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+19;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+19,1, 6200.917969, 220.434753, 372.776184,0,2,0,100,0),
+(@PATH+19,2,6356.144531,106.174286,372.081909,6000,2,0,100,0),
+(@PATH+19,3,6395.383789,70.591568,372.210876,6000,2,0,100,0);
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+28;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+28;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NEXT+28,@PATH+20,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+20;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+20,1, 6190.595703, 225.242371, 372.554016,0,2,0,100,0),
+(@PATH+20,2,6175.009766,125.577263,372.434753,6000,2,0,100,0),
+(@PATH+20,3,6104.930176,59.710854,372.404419,6000,2,0,100,0);
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+29;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+29;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES
+(@NEXT+29,@PATH+21,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+21;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+21,1, 6189.209961, 210.502823, 372.877960,0,2,0,100,0),
+(@PATH+21,2,6171.009766,119.577263,372.434753,6000,2,0,100,0),
+(@PATH+21,3,6118.930176,64.710854,372.404419,6000,2,0,100,0);
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NEXT+29;
+DELETE FROM `creature_addon` WHERE `guid`=@NEXT+29;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES
+(@NEXT+29,@PATH+22,1,0, '');
+
+DELETE FROM `waypoint_data` WHERE `id`=@PATH+22;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH+22,1, 6176.683594, 213.375336, 372.395172,0,2,0,100,0),
+(@PATH+22,2,6173.009766,117.577263,372.434753,6000,2,0,100,0),
+(@PATH+22,3,6118.930176,63.710854,372.404419,6000,2,0,100,0);
+
+-- Turrets
+UPDATE `creature_template` SET `faction_A`=2231,`faction_H`=2231,`unit_flags`=16777220,`npcflag`=16777216,`vehicleid`=292 WHERE `entry`=30236;
+DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=30236;
+INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`cast_flags`,`user_type`) VALUES
+(30236,57573,1,0);
diff --git a/sql/updates/world/2013_08_07_00_world_creature_template.sql b/sql/updates/world/2013_08_07_00_world_creature_template.sql
new file mode 100644
index 00000000000..21372e0180b
--- /dev/null
+++ b/sql/updates/world/2013_08_07_00_world_creature_template.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `faction_A`=35,`faction_H`=35 WHERE `entry`=30236;
diff --git a/sql/updates/world/2013_08_07_01_world_misc.sql b/sql/updates/world/2013_08_07_01_world_misc.sql
new file mode 100644
index 00000000000..557b71742a6
--- /dev/null
+++ b/sql/updates/world/2013_08_07_01_world_misc.sql
@@ -0,0 +1,6 @@
+-- Move boss_lord_valthalak from EAI to CPP
+UPDATE `creature_template` SET `AIName`= '', `ScriptName`= 'boss_lord_valthalak' WHERE `entry`=16042;
+DELETE FROM creature_ai_scripts WHERE `creature_id`=16042;
+DELETE FROM `creature_text` WHERE `entry`=16042 AND `groupid`=0;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
+(16042, 0, 0, '%s goes into a frenzy!', 16, 0, 100, 0, 0, 0, 'Lord Valthalak - Cast Frenzy');
diff --git a/sql/updates/world/2013_08_07_02_world_misc.sql b/sql/updates/world/2013_08_07_02_world_misc.sql
new file mode 100644
index 00000000000..fd5f9893522
--- /dev/null
+++ b/sql/updates/world/2013_08_07_02_world_misc.sql
@@ -0,0 +1,3 @@
+-- Move Yor from EAI to CPP
+UPDATE `creature_template` SET `AIName`= '', `ScriptName`= 'npc_yor' WHERE `entry`=22930;
+DELETE FROM creature_ai_scripts WHERE `creature_id`=22930;
diff --git a/sql/updates/world/2013_08_07_03_world_drak_tharon_keep.sql b/sql/updates/world/2013_08_07_03_world_drak_tharon_keep.sql
new file mode 100644
index 00000000000..80f3a08a0e7
--- /dev/null
+++ b/sql/updates/world/2013_08_07_03_world_drak_tharon_keep.sql
@@ -0,0 +1,48 @@
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 and `SourceEntry` IN (49555,59807,49618,59809,49405,49380,59803);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(13,1,49555,0,0,31,0,3,27709,0,0,0,0,'','Trollgore - Corpse Explode'),
+(13,1,49555,0,1,31,0,3,27753,0,0,0,0,'','Trollgore - Corpse Explode'),
+(13,1,49555,0,2,31,0,3,27754,0,0,0,0,'','Trollgore - Corpse Explode'),
+
+(13,1,59807,0,0,31,0,3,27709,0,0,0,0,'','Trollgore - Corpse Explode'),
+(13,1,59807,0,1,31,0,3,27753,0,0,0,0,'','Trollgore - Corpse Explode'),
+(13,1,59807,0,2,31,0,3,27754,0,0,0,0,'','Trollgore - Corpse Explode'),
+
+(13,1,49618,0,0,31,0,3,27709,0,0,0,0,'','Trollgore - Corpse Explode Damage'),
+(13,1,49618,0,1,31,0,3,27753,0,0,0,0,'','Trollgore - Corpse Explode Damage'),
+(13,1,49618,0,2,31,0,3,27754,0,0,0,0,'','Trollgore - Corpse Explode Damage'),
+(13,1,49618,0,3,31,0,4,0,0,0,0,0,'','Trollgore - Corpse Explode Damage'),
+
+(13,1,59809,0,0,31,0,3,27709,0,0,0,0,'','Trollgore - Corpse Explode Damage'),
+(13,1,59809,0,1,31,0,3,27753,0,0,0,0,'','Trollgore - Corpse Explode Damage'),
+(13,1,59809,0,2,31,0,3,27754,0,0,0,0,'','Trollgore - Corpse Explode Damage'),
+(13,1,59809,0,3,31,0,4,0,0,0,0,0,'','Trollgore - Corpse Explode Damage'),
+
+(13,1,49405,0,0,31,0,3,26630,0,0,0,0,'','Trollgore - Invader Taunt Trigger'),
+
+(13,3,49380,0,0,31,0,3,27709,0,0,0,0,'','Trollgore - Consume'),
+(13,3,49380,0,1,31,0,3,27753,0,0,0,0,'','Trollgore - Consume'),
+(13,3,49380,0,2,31,0,3,27754,0,0,0,0,'','Trollgore - Consume'),
+(13,3,49380,0,3,31,0,4,0,0,0,0,0,'','Trollgore - Consume'),
+
+(13,3,59803,0,0,31,0,3,27709,0,0,0,0,'','Trollgore - Consume'),
+(13,3,59803,0,1,31,0,3,27753,0,0,0,0,'','Trollgore - Consume'),
+(13,3,59803,0,2,31,0,3,27754,0,0,0,0,'','Trollgore - Consume'),
+(13,3,59803,0,3,31,0,4,0,0,0,0,0,'','Trollgore - Consume');
+
+DELETE FROM `spell_script_names` WHERE `spell_id` IN (49555,59807,49405,49380,59803,59910);
+INSERT INTO `spell_script_names`(`spell_id`, `ScriptName`) VALUES
+(49555,'spell_trollgore_corpse_explode'),
+(59807,'spell_trollgore_corpse_explode'),
+(49405,'spell_trollgore_invader_taunt'),
+(49380,'spell_trollgore_consume'),
+(59803,'spell_trollgore_consume'),
+(59910,'spell_novos_summon_minions');
+
+DELETE FROM `creature_text` WHERE `entry`=26631 AND `groupid`=5;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
+(26631, 5, 0, '%s calls for assistance!', 41, 0, 100, 0, 0, 0, 'Novos the Summoner - EMOTE_SUMMONING_ADDS');
+
+DELETE FROM `spelldifficulty_dbc` WHERE `id`=49618;
+INSERT INTO `spelldifficulty_dbc` (`id`, `spellid0`, `spellid1`) VALUES
+(49618, 49618, 59809);
diff --git a/sql/updates/world/2013_08_07_04_world_misc.sql b/sql/updates/world/2013_08_07_04_world_misc.sql
new file mode 100644
index 00000000000..ef29b786ee5
--- /dev/null
+++ b/sql/updates/world/2013_08_07_04_world_misc.sql
@@ -0,0 +1,8 @@
+-- Move boss_anzu from EAI to CPP
+UPDATE `creature_template` SET `AIName`= '', `ScriptName`= 'boss_anzu' WHERE `entry`=23035;
+DELETE FROM creature_ai_scripts WHERE `creature_id`=23035;
+DELETE FROM `creature_text` WHERE `entry`=23035;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
+(23035, 0, 0, 'Awaken, my children and assist your master!', 14, 0, 100, 0, 0, 0, 'Anzu - Summon Brood'),
+(23035, 1, 0, 'Your spells... ke-kaw... are weak magics... easy to turn against you...', 15, 0, 100, 0, 0, 0, 'Anzu - Spell Bomb'),
+(23035, 1, 1, 'Yes... cast your precious little spells, ak-a-ak!', 15, 0, 100, 0, 0, 0, 'Anzu - Spell Bomb');
diff --git a/sql/updates/world/2013_08_07_05_world_misc.sql b/sql/updates/world/2013_08_07_05_world_misc.sql
new file mode 100644
index 00000000000..0bb1bc5c560
--- /dev/null
+++ b/sql/updates/world/2013_08_07_05_world_misc.sql
@@ -0,0 +1,2 @@
+UPDATE `smart_scripts` SET `event_param2`=100, `event_param4`=100 WHERE `entryorguid`=7271 AND `source_type`=0 AND `id`=5 AND `link`=0; -- Kirk
+DELETE FROM `command` WHERE `name`='reload gameobject_involvedrelation'; -- Runico
diff --git a/sql/updates/world/2013_08_07_06_world_drak_tharon_keep.sql b/sql/updates/world/2013_08_07_06_world_drak_tharon_keep.sql
new file mode 100644
index 00000000000..d35fcc9565c
--- /dev/null
+++ b/sql/updates/world/2013_08_07_06_world_drak_tharon_keep.sql
@@ -0,0 +1,31 @@
+DELETE FROM `spelldifficulty_dbc` WHERE `id` IN (49555, 49380, 49381);
+INSERT INTO `spelldifficulty_dbc` (`id`, `spellid0`, `spellid1`) VALUES
+(49555, 49555, 59807),
+(49380, 49380, 59803),
+(49381, 49381, 59805);
+
+UPDATE `creature_template` SET `InhabitType`=5 WHERE `entry`=27724;
+
+DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id` IN (27709,27753,27754));
+INSERT INTO `creature_addon` (`guid`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES
+(127478, 0, 0x0, 0x1, '31261'),
+(127479, 0, 0x0, 0x1, '31261'),
+(127517, 0, 0x0, 0x1, '31261'),
+(127518, 0, 0x0, 0x1, '31261'),
+(127519, 0, 0x0, 0x1, '31261'),
+(127528, 0, 0x0, 0x1, '31261'),
+(127539, 0, 0x0, 0x1, '31261');
+
+DELETE FROM `creature` WHERE `guid` > 127479 AND `guid` < 127489;
+DELETE FROM `creature` WHERE `guid` > 127519 AND `guid` < 127539 AND `guid` != 127528;
+
+UPDATE `creature` SET `spawndist`=0, `MovementType`=0 WHERE `id` IN (27709,27753,27754);
+
+UPDATE `creature_template` SET `faction_A`=1693, `faction_H`=1693, `unit_flags`=768, `InhabitType`=5 WHERE `entry` IN (27709,27753,27754);
+UPDATE `creature_template` SET `ScriptName` = 'npc_drakkari_invader' WHERE `entry` IN (27709,27753,27754);
+
+DELETE FROM `creature_template_addon` WHERE `entry` IN (27709,27753,27754);
+INSERT INTO `creature_template_addon` (`entry`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES
+(27709, 26751, 0x0, 0x1, NULL),
+(27753, 26751, 0x0, 0x1, NULL),
+(27754, 26751, 0x0, 0x1, NULL);
diff --git a/sql/updates/world/2013_08_07_06_world_sai.sql b/sql/updates/world/2013_08_07_06_world_sai.sql
new file mode 100644
index 00000000000..32eb2cfbc5d
--- /dev/null
+++ b/sql/updates/world/2013_08_07_06_world_sai.sql
@@ -0,0 +1,96 @@
+-- Random comment
+SET @IMMOLATION := 58627;
+SET @CHECKTRIGGER := 58594;
+SET @CHECK := 58593;
+SET @ABOMINATION := 30689;
+SET @CREDIT := 58599;
+SET @EXPLOSION := 58596;
+SET @SKELETON := 31048;
+SET @KC := 30995;
+
+-- Add SAI for Burning Skeleton
+UPDATE `creature_template` SET AIName='SmartAI' WHERE `entry`=@SKELETON;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@SKELETON;
+INSERT INTO `smart_scripts` VALUES
+(@SKELETON,0,0,1,25,0,100,0,0,0,0,0,11,@IMMOLATION,0,0,0,0,0,1,0,0,0,0,0,0,0,'Burning Skeleton - On spawn - Cast Immolation on self'),
+(@SKELETON,0,1,0,61,0,100,0,0,0,0,0,11,@CHECKTRIGGER,0,0,0,0,0,1,0,0,0,0,0,0,0,'Burning Skeleton - Linked with event 0 - Cast Skeleton Check Master on self'),
+(@SKELETON,0,2,3,31,0,100,0,@CHECK,0,0,0,33,@KC,0,0,0,0,0,23,0,0,0,0,0,0,0,'Burning Skeleton - On target hit by spell Check - Cast Credit Trigger on self'),
+(@SKELETON,0,3,4,61,0,100,0,0,0,0,0,28,@CHECKTRIGGER,0,0,0,0,0,1,0,0,0,0,0,0,0,'Burning Skeleton - Linked with event 2 - Remove auras from spell CheckTrigger'),
+(@SKELETON,0,4,0,61,0,100,0,0,0,0,0,11,@EXPLOSION,0,0,0,0,0,1,0,0,0,0,0,0,0,'Burning Skeleton - Linked with event 3 - Cast explosion on self');
+
+-- Add condition for Check to target only abominations /that are alive/
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=@CHECK;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition` ,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(13,1,@CHECK,0,0,31,0,3,@ABOMINATION,0,0,0,'','Check can target only chained abominations'),
+(13,1,@CHECK,0,0,36,0,0,0,0,0,0,'','Check can target only target alive creatures');
+
+-- Add conditions for Explosion effect 1
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=@EXPLOSION;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition` ,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(13,2,@EXPLOSION,0,0,31,0,3,@ABOMINATION,0,0,0,'','Explosion effect 1 can target only abomination');
+
+SET @STALKER := 23033;
+SET @ABOMINATION := 30689;
+SET @RIGHT_HAND := 57983; -- Reference to Nayd's wife
+SET @LEFT_HAND := 57980;
+-- Using creature range as a targeting method; guid wise would be wiser but it has bugs out and targets the next living abomination (Not what we want)
+UPDATE `creature_template` SET AIName='SmartAI',`InhabitType`=4 WHERE `entry`=@STALKER;
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (-124991,-124992,-124993,-124981,-124980,-124979);
+INSERT INTO `smart_scripts` VALUES
+(-124991,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-124992,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-124993,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-124981,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination'),
+(-124980,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination'),
+(-124979,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination');
+-- Group 2
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (-124982,-124983,-124984,-124969,-124968,-124967);
+INSERT INTO `smart_scripts` VALUES
+(-124982,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-124983,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-124984,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-124969,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination'),
+(-124968,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination'),
+(-124967,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination');
+-- Group 3
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (-125000,-125001,-125002,-124985,-124986,-124987);
+INSERT INTO `smart_scripts` VALUES
+(-125000,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-125001,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-125002,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-124985,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination'),
+(-124986,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination'),
+(-124987,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination');
+-- Group 4
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (-124973,-124974,-124975,-124976,-124977,-124978);
+INSERT INTO `smart_scripts` VALUES
+(-124973,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-124974,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-124975,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-124976,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination'),
+(-124977,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination'),
+(-124978,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination');
+-- Group 5
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (-124988,-124989,-124990,-124970,-124971,-124972);
+INSERT INTO `smart_scripts` VALUES
+(-124988,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-124989,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-124990,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-124970,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination'),
+(-124971,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination'),
+(-124972,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination');
+-- Group 6
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (-124998,-124999,-124997,-124996,-124995,-124994);
+INSERT INTO `smart_scripts` VALUES
+(-124997,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-124998,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-124999,0,0,0,60,0,100,0,0,1,20000,20000,11,@RIGHT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain right hand on abomination'),
+(-124994,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination'),
+(-124995,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination'),
+(-124996,0,0,0,60,0,100,0,0,1,20000,20000,11,@LEFT_HAND,0,0,0,0,0,11,@ABOMINATION,5,0,0,0,0,0,'Stalker - OOC - Cast Chain left hand on abomination');
+
+-- Add condition target for chains
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (@LEFT_HAND,@RIGHT_HAND);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(13,1,@LEFT_HAND,0,0,31,0,3,@ABOMINATION,0,0,0,'','Left Hand Chains only target Chained Abomination'),
+(13,1,@RIGHT_HAND,0,0,31,0,3,@ABOMINATION,0,0,0,'','Right Hand Chains only target Chained Abomination');
diff --git a/sql/updates/world/2013_08_07_07_world_pathing.sql b/sql/updates/world/2013_08_07_07_world_pathing.sql
new file mode 100644
index 00000000000..55bdf5e752c
--- /dev/null
+++ b/sql/updates/world/2013_08_07_07_world_pathing.sql
@@ -0,0 +1,29 @@
+DELETE FROM `creature_template_addon` WHERE `entry`=27003;
+INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(27003, 270030, 0, 0, 1, 0, NULL);
+
+UPDATE `creature` SET `currentwaypoint`=0,`MovementType`=2,`spawndist`=0 WHERE `guid`=107239;
+DELETE FROM `waypoint_data` WHERE `id`=270030;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(270030, 1, 3671.979, -497.5903, 157.9536, 0, 0, 0, 0, 100, 0),
+(270030, 2, 3693.592, -472.8958, 163.496, 0, 0, 0, 0, 100, 0),
+(270030, 3, 3694.013, -466.6045, 160.7129, 0, 0, 0, 0, 100, 0),
+(270030, 4, 3713.763, -454.1045, 159.2129, 0, 10000, 0, 0, 100, 0),
+(270030, 5, 3717.158, -453.4165, 161.311, 0, 0, 0, 0, 100, 0),
+(270030, 6, 3717.857, -415.6472, 151.0353, 0, 0, 0, 0, 100, 0),
+(270030, 7, 3716.621, -404.0498, 152.4212, 0, 0, 0, 0, 100, 0),
+(270030, 8, 3704.548, -388.2196, 162.9577, 0, 10000, 0, 0, 100, 0),
+(270030, 9, 3717.158, -453.4165, 161.311, 0, 0, 0, 0, 100, 0),
+(270030, 10, 3717.357, -443.3972, 160.0353, 0, 0, 0, 0, 100, 0),
+(270030, 11, 3717.357, -440.3972, 159.2853, 0, 0, 0, 0, 100, 0),
+(270030, 12, 3717.607, -438.3972, 158.7853, 0, 0, 0, 0, 100, 0),
+(270030, 13, 3717.607, -436.3972, 158.0353, 0, 0, 0, 0, 100, 0),
+(270030, 14, 3717.607, -434.3972, 157.2853, 0, 0, 0, 0, 100, 0),
+(270030, 15, 3717.607, -432.6472, 156.2853, 0, 0, 0, 0, 100, 0),
+(270030, 16, 3717.607, -430.6472, 155.5353, 0, 0, 0, 0, 100, 0),
+(270030, 17, 3717.607, -428.6472, 154.5353, 0, 0, 0, 0, 100, 0),
+(270030, 18, 3717.607, -426.6472, 153.7853, 0, 0, 0, 0, 100, 0),
+(270030, 19, 3717.607, -424.6472, 153.0353, 0, 0, 0, 0, 100, 0),
+(270030, 20, 3717.607, -422.6472, 152.2853, 0, 0, 0, 0, 100, 0),
+(270030, 21, 3717.607, -418.6472, 151.5353, 0, 0, 0, 0, 100, 0),
+(270030, 22, 3717.857, -415.6472, 151.0353, 0, 10000, 0, 0, 100, 0);
diff --git a/sql/updates/world/2013_08_07_08_world_sai.sql b/sql/updates/world/2013_08_07_08_world_sai.sql
new file mode 100644
index 00000000000..7da2f89d09c
--- /dev/null
+++ b/sql/updates/world/2013_08_07_08_world_sai.sql
@@ -0,0 +1,22 @@
+-- Fueling the Project (11715)
+-- oh, and guess what! random comment
+SET @NPC_OIL := 25781; -- Oil Pool
+SET @SPELL_OIL_COLLECTOR := 45990; -- Collect Oil
+SET @SPELL_SUMON_COLLECTOR := 45991; -- Summon Oil Collector
+SET @SPELL_OIL_COAT := 46011; -- Oil Coat (small)
+SET @SPELL_FD := 35357; -- Spawn Feign Death
+
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@NPC_OIL;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@NPC_OIL;
+DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@NPC_OIL;
+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
+(@NPC_OIL,0,0,1,25,0,100,0,0,0,0,0,11,@SPELL_FD,0,0,0,0,0,1,0,0,0,0,0,0,0,'On reset - Cast Spawn Feign Death'),
+(@NPC_OIL,0,1,0,61,0,100,0,0,0,0,0,11,@SPELL_OIL_COAT,0,0,0,0,0,1,0,0,0,0,0,0,0,'On link - Cast Oil Coat (small)'),
+--
+(@NPC_OIL,0,2,3,8,0,100,0,@SPELL_OIL_COLLECTOR,0,0,0,11,@SPELL_SUMON_COLLECTOR,0,0,0,0,0,7,0,0,0,0,0,0,0,'On spellhit - Cast Summon Oil Collector'),
+(@NPC_OIL,0,3,4,61,0,100,0,0,0,0,0,33,@NPC_OIL,0,0,0,0,0,7,0,0,0,0,0,0,0,'On spellhit - Give killcredit'),
+(@NPC_OIL,0,4,0,61,0,100,0,0,0,0,0,41,10000,0,0,0,0,0,1,0,0,0,0,0,0,0,'On link - Despawn in 1 sec');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=@SPELL_OIL_COLLECTOR;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(13,1,@SPELL_OIL_COLLECTOR,0,0,31,0,3,@NPC_OIL,0,0,0,'','Collect Oil target Oil Pool');
diff --git a/sql/updates/world/2013_08_07_09_world_sai.sql b/sql/updates/world/2013_08_07_09_world_sai.sql
new file mode 100644
index 00000000000..2f5cf9b026e
--- /dev/null
+++ b/sql/updates/world/2013_08_07_09_world_sai.sql
@@ -0,0 +1,22 @@
+-- Strengthen the Ancients (12092)
+-- Woodlands Walker
+SET @ENTRY := 26421;
+UPDATE `creature_template` SET `npcflag`=1,`AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@ENTRY,@ENTRY*100+0,@ENTRY*100+1);
+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,0,2,0,100,1,0,50,0,0,11,50994,0,0,0,0,0,1,0,0,0,0,0,0,0,'Woodlands Walker - Cast Toughen Hide - at 50% HP'),
+(@ENTRY,0,1,2,64,0,100,1,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'On gossip hello - Close gossip - Invoker'),
+(@ENTRY,0,2,0,61,0,100,1,0,0,0,0,88,@ENTRY*100+0,@ENTRY*100+1,0,0,0,0,1,0,0,0,0,0,0,0,'On link - Run random script - Self'),
+--
+(@ENTRY*100+0,9,0,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Woodlands Walker - Emote text - Self'),
+(@ENTRY*100+0,9,1,0,0,0,100,0,1000,1000,0,0,2,16,0,0,0,0,0,1,0,0,0,0,0,0,0,'Woodlands Walker - Set faction monster - Self'),
+--
+(@ENTRY*100+1,9,0,0,0,0,100,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Woodlands Walker - Emote text - Self'),
+(@ENTRY*100+1,9,1,0,0,0,100,0,1000,1000,0,0,11,47550,0,0,0,0,0,7,0,0,0,0,0,0,0,'Woodlands Walker - Cast Create Bark of the Walkers - Invoker'),
+(@ENTRY*100+1,9,2,0,0,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Woodlands Walker - Despawn - Self');
+
+DELETE FROM `creature_text` WHERE `entry`=@ENTRY;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(@ENTRY,0,0,"The %s is angered by your request and attacks!",16,0,100,0,0,0,"emote text"),
+(@ENTRY,1,0,"Breaking off a piece of its bark, the %s hands it to you before departing.",16,0,100,0,0,0,"emote text");
diff --git a/sql/updates/world/2013_08_07_10_world_sai.sql b/sql/updates/world/2013_08_07_10_world_sai.sql
new file mode 100644
index 00000000000..c43fd76aaf2
--- /dev/null
+++ b/sql/updates/world/2013_08_07_10_world_sai.sql
@@ -0,0 +1,78 @@
+-- See You on the Other Side (12121)
+-- Jin'arrak's End (12152)
+
+SET @ENTRY1 := 27199; -- Warlord Jinarrak
+SET @ENTRY2 := 27200; -- Offering Bunny - Drakil'jin Exterior
+SET @ENTRY3 := 26902; -- Essence of Warlord Jin'arrak
+SET @ENTRY4 := 32742; -- Your Corpse
+SET @ENTRY5 := 27201; -- Offering Target Bunny - Drakil'jin Exterior
+SET @RAGE := 47744; -- Rage of Jin'arrak
+SET @OTOS := 61611; -- On the Other Side
+SET @BODY := 61612; -- Summon Your Corpse
+SET @OFFER := 48059; -- Place Offering
+SET @FEED := 48060; -- Jin'arrak Feeds
+SET @CREDIT := 48194; -- Jin'arrak Kill Credit
+
+-- Warlord Jinarrak
+DELETE FROM `creature_template_addon` WHERE `entry`=@ENTRY1;
+INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
+(@ENTRY1,0,0,0,0,'17327 31951');
+
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@ENTRY1,@ENTRY1*100,@ENTRY1*100+1);
+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
+(@ENTRY1,0,0,0,54,0,100,1,0,0,0,0,44,3,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,'Warlord Jin''Arrak - Just summoned - Set phasemask 3 - Self'),
+(@ENTRY1,0,1,2,38,0,100,0,0,2,0,0,80,@ENTRY1*100+1,0,2,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,'Warlord Jin''Arrak - On dataset 0 2 - Run script - Self'),
+(@ENTRY1,0,2,0,61,0,100,0,0,0,0,0,5,15,0,0,0,0,0,1,0,0,0,0,0,0,0,'Warlord Jin''Arrak - Linked - Play emote roar'),
+(@ENTRY1,0,3,4,38,0,100,0,0,1,0,0,80,@ENTRY1*100,0,2,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,'Warlord Jin''Arrak - On dataset 0 1 - Run script - Self'),
+(@ENTRY1,0,4,0,61,0,100,0,0,0,0,0,5,15,0,0,0,0,0,1,0,0,0,0,0,0,0,'Warlord Jin''Arrak - Linked - Play emote roar'),
+-- Scr 1
+(@ENTRY1*100,9,0,0,0,0,100,1,0,0,0,0,11,47730,0,0,0,0,0,1,0,0,0,0,0,0,0,'Warlord Jin''Arrak - Script - Gong Effect - Self'),
+(@ENTRY1*100,9,1,0,0,0,100,1,10000,10000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Warlord Jin''Arrak - Script - Emote Text - Self'),
+(@ENTRY1*100,9,2,0,0,0,100,1,0,0,0,0,11,@RAGE,0,0,0,0,0,18,20,0,0,0,0,0,0,'Warlord Jin''Arrak - Script - Cast Rage of Jin''arrak - Players in range'),
+(@ENTRY1*100,9,3,0,0,0,100,1,10000,10000,0,0,33,@ENTRY3,0,0,0,0,0,18,20,0,0,0,0,0,0,'Warlord Jin''Arrak - Script- Kill credit - Players in range'),
+-- Scr2
+(@ENTRY1*100+1,9,0,0,0,0,100,0,1500,1500,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Warlord Jin''Arrak - Script - Say 0'),
+(@ENTRY1*100+1,9,1,0,0,0,100,0,1000,1000,0,0,11,48060,0,0,0,0,0,19,@ENTRY5,0,0,0,0,0,0,'Warlord Jin''Arrak - Script - Cast feed'),
+(@ENTRY1*100+1,9,2,0,0,0,100,0,7000,7000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Warlord Jin''Arrak - Script - Say 1'),
+(@ENTRY1*100+1,9,3,0,0,0,100,0,3000,3000,0,0,17,64,0,0,0,0,0,1,0,0,0,0,0,0,0,'Warlord Jin''Arrak - Script - emotestate stun'),
+(@ENTRY1*100+1,9,4,0,0,0,100,0,5000,5000,0,0,17,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Warlord Jin''Arrak - Script - emotestate none'),
+(@ENTRY1*100+1,9,5,0,0,0,100,0,0,0,0,0,90,7,0,0,0,0,0,1,0,0,0,0,0,0,0,'Warlord Jin''Arrak - Script - Set field_byte_1 to 7'),
+(@ENTRY1*100+1,9,6,0,0,0,100,0,2000,2000,0,0,11,@CREDIT,0,0,0,0,0,18,20,0,0,0,0,0,0,'OOC - Cast credit - Players in range'),
+(@ENTRY1*100+1,9,7,0,0,0,100,0,10000,10000,0,0,41,0,0,0,0,0,0,0,1,0,0,0,0,0,0,'OOC - Cast credit - Players in range');
+
+
+DELETE FROM `spell_linked_spell` WHERE `spell_trigger` IN (-@RAGE,@OTOS);
+INSERT INTO `spell_linked_spell` (`spell_trigger`,`spell_effect`,`type`,`comment`) VALUES
+(-@RAGE,@OTOS,0,'Cast other side when curse expires'),
+(@OTOS,@BODY,1,'Summon body when going to other side');
+
+
+DELETE FROM `creature_text` WHERE `entry`=@ENTRY1;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(@ENTRY1,0,0,'Finally, a worthy offering!',41,0,0,0,0,0,'Warlord Jinarrak - Say Text'),
+(@ENTRY1,1,0,'Ahhh! What be happenin'' to me, mon?',41,0,0,0,0,0,'Warlord Jinarrak - Say Text'),
+(@ENTRY1,2,0,'How dare you summon me without an offering!',41,0,0,0,0,0,'Warlord Jinarrak - Say Text');
+
+-- Offering Bunny - Drakil'jin Exterior
+UPDATE `creature_template` SET `AIName`='SmartAI',`flags_extra`=128 WHERE `entry`=@ENTRY2;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY2;
+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
+(@ENTRY2,0,0,1,54,0,100,1,0,0,0,0,12,@ENTRY1,3,180000,0,0,0,8,0,0,0,4678.47,-4859.35,35.48,3.11,'Just summoned - Temp summon Warlord Jinarrak - Position'),
+(@ENTRY2,0,1,0,61,0,100,1,0,0,0,0,11,@OFFER,0,0,0,0,0,1,0,0,0,0,0,0,0,'Link - Cast Place Offering - Self'),
+(@ENTRY2,0,2,0,1,0,100,1,1000,1000,0,0,45,0,2,0,0,0,0,11,@ENTRY1,50,0,0,0,0,0,'OOC 2 sec later - Set data 0 2 - Warlord Jinarrak');
+
+-- Essence of Warlord Jin'arrak
+UPDATE `creature_template` SET `AIName`='SmartAI',`flags_extra`=128 WHERE `entry`=@ENTRY3;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY3;
+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
+(@ENTRY3,0,0,0,54,0,100,1,0,0,0,0,12,@ENTRY1,3,30000,0,0,0,8,0,0,0,4678.47,-4859.35,35.48,3.11,'Just summoned - Temp summon - Position'),
+(@ENTRY3,0,1,0,1,0,100,1,1000,1000,0,0,45,0,1,0,0,0,0,11,@ENTRY1,50,0,0,0,0,0,'OOC 1 sec later - Set data 0 1 - Warlord Jinarrak');
+UPDATE creature_template SET AIName = 'SmartAI' WHERE entry =@ENTRY1;
+UPDATE `creature_template` SET `flags_extra`=128 WHERE `entry`=@ENTRY5;
+-- Your Corpse
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY4;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY4;
+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
+(@ENTRY4,0,0,1,54,0,100,1,0,0,0,0,85,60352,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,'Just summoned - Invoker cast Mirror Image - Invoker'),
+(@ENTRY4,0,1,2,61,0,100,1,0,0,0,0,44,3,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,'Link - Set phasemask 3 - Self'),
+(@ENTRY4,0,2,0,61,0,100,1,0,0,0,0,11,29266,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,'Link - Cast Permanent Feign Death - Self');
diff --git a/sql/updates/world/2013_08_07_11_world_sai.sql b/sql/updates/world/2013_08_07_11_world_sai.sql
new file mode 100644
index 00000000000..c97659b3359
--- /dev/null
+++ b/sql/updates/world/2013_08_07_11_world_sai.sql
@@ -0,0 +1,28 @@
+SET @Crystal=31131; -- Containment Crystal
+SET @Watcher=31110; -- Eidolon Watcher
+
+-- Update creature_templates and template_addons
+UPDATE `creature_template` SET `exp`=2,`minlevel`=80,`maxlevel`=80,`unit_flags`=`unit_flags`|32776 WHERE `entry`=@Watcher;
+UPDATE `creature_template` SET `unit_flags`=`unit_flags`|33555200,`AIname`='SmartAI' WHERE `entry`=@Crystal;
+DELETE FROM `creature_template_addon` WHERE `entry` IN (@Watcher,@Crystal);
+INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
+(@Watcher,0,0,1,0, NULL),
+(@Crystal,0,0,1,0, NULL);
+-- Delete old condition
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=1 AND `SourceEntry`=193058 AND `SourceId`=1;
+-- Four quests need gains control of the Eidolon Watcher not only one
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=10028 AND `sourceEntry`=0;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(15,10028,0,0,0,9,0,13168,0,0,0,0,0,'','Show Gossip option only if player has quest active'),
+(15,10028,0,0,1,9,0,13171,0,0,0,0,0,'','Show Gossip option only if player has quest active'),
+(15,10028,0,0,2,9,0,13169,0,0,0,0,0,'','Show Gossip option only if player has quest active'),
+(15,10028,0,0,3,9,0,13170,0,0,0,0,0,'','Show Gossip option only if player has quest active');
+-- Conditions for Banish Scourge Crystal spell
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `sourceEntry`=58658;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13,1,58658,0,0,31,0,3,@Crystal,0,0,0,0,'','Banish Scourge Crystal Hits Only Containment Crystal');
+-- Sai for Containment Crystal
+DELETE FROM `smart_scripts` WHERE `entryorguid`=31131 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
+(@Crystal,0,0,1,8,0,100,0,58662,0,0,0,33,@Crystal,0,0,0,0,0,7,0,0,0,0,0,0,0,'Containment Crystal - On Spell Hit - Give Quest Credit'),
+(@Crystal,0,1,0,61,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Containment Crystal - Link With Previous Event - Despawn');
diff --git a/sql/updates/world/2013_08_07_12_world_sai.sql b/sql/updates/world/2013_08_07_12_world_sai.sql
new file mode 100644
index 00000000000..61c96994eb7
--- /dev/null
+++ b/sql/updates/world/2013_08_07_12_world_sai.sql
@@ -0,0 +1 @@
+UPDATE `smart_scripts` SET `action_param1`=1 WHERE `entryorguid`=2546000 AND `source_type`=9 AND `id`=1;
diff --git a/sql/updates/world/2013_08_07_13_world_creature_template.sql b/sql/updates/world/2013_08_07_13_world_creature_template.sql
new file mode 100644
index 00000000000..390d43220f1
--- /dev/null
+++ b/sql/updates/world/2013_08_07_13_world_creature_template.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `faction_A`=103, `faction_H`=103 WHERE `entry`=21264; -- Seeping Ooze
diff --git a/sql/updates/world/2013_08_07_14_world_sai_335.sql b/sql/updates/world/2013_08_07_14_world_sai_335.sql
new file mode 100644
index 00000000000..fa7c5e149f9
--- /dev/null
+++ b/sql/updates/world/2013_08_07_14_world_sai_335.sql
@@ -0,0 +1,13 @@
+UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry`=5353;
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=5353 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
+(5353, 0, 0, 1,62, 0, 100, 0, 1364, 0, 0, 0, 85, 12578, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Itharius - On Gossip Select - Cast Create Oathstone of Yseras Dragonflight'),
+(5353, 0, 1, 0,61, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Itharius - Linked with Previous Event - Close Gossip');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=1341;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(15,1341,1,0,0,2,0,10455,1,1,0,0,'','Itharius show gossip only if player has Chained Essence of Eranikus'),
+(15,1341,1,0,0,2,0,10589,1,1,1,0,'','Itharius show gossip only if player Does not have Oathstone of Yseras Dragonflight'),
+(15,1341,1,0,0,8,0,3374,0,0,1,0,'','Itharius show gossip only if player has not completed The Essence of Eranikus q3374'),
+(15,1341,1,0,0,8,0,3373,0,0,0,0,'','Itharius show gossip only if player has completed The Essence of Eranikus q3373');
diff --git a/sql/updates/world/2013_08_08_00_world_creature_template.sql b/sql/updates/world/2013_08_08_00_world_creature_template.sql
new file mode 100644
index 00000000000..63e00e9881e
--- /dev/null
+++ b/sql/updates/world/2013_08_08_00_world_creature_template.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `AIName`='' WHERE `AIName`='0';
diff --git a/sql/updates/world/2013_08_08_01_world_creature_template.sql b/sql/updates/world/2013_08_08_01_world_creature_template.sql
new file mode 100644
index 00000000000..e64befe6269
--- /dev/null
+++ b/sql/updates/world/2013_08_08_01_world_creature_template.sql
@@ -0,0 +1 @@
+UPDATE `smart_scripts` SET `action_param3`=0 WHERE `entryorguid`=19055 AND `source_type`=0 AND `id`=0;
diff --git a/sql/updates/world/2013_08_08_02_world_creature_template.sql b/sql/updates/world/2013_08_08_02_world_creature_template.sql
new file mode 100644
index 00000000000..2baeddd0cd1
--- /dev/null
+++ b/sql/updates/world/2013_08_08_02_world_creature_template.sql
@@ -0,0 +1,2 @@
+UPDATE `creature` SET `MovementType`=0 WHERE `guid`=107239;
+UPDATE `creature_template` SET `MovementType`=2 WHERE `entry`=27003;
diff --git a/sql/updates/world/2013_08_09_00_world_sai.sql b/sql/updates/world/2013_08_09_00_world_sai.sql
new file mode 100644
index 00000000000..8fcdfc6d49e
--- /dev/null
+++ b/sql/updates/world/2013_08_09_00_world_sai.sql
@@ -0,0 +1,87 @@
+DELETE FROM `creature` WHERE `id`=27715;
+UPDATE `creature_template` SET `faction_a`=14, `faction_h`=14, `AIName`='SmartAI' WHERE `entry` IN (27715, 27716, 27717, 27718);
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (27727, 27726);
+
+DELETE FROM `creature_text` WHERE `entry` IN (27719, 27727, 27726);
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
+(27719,0,0,"Ladies and gentlemen! Well... let's just say you don't want to miss this one!",14,0,100,0,0,0,'Grennix Shivwiggle - Quest Accepted'),
+(27727,0,0,"You went behind my back. You neglected my orders. You will pay the price.",12,0,100,0,0,0,'Conqueror Krenna - Say 0'),
+(27727,1,1,"Enough talk. By the time I'm though with you, not even the worgs will go near your corpse.",12,0,100,0,0,0,'Conqueror Krenna - Say 1'),
+(27726,0,0,"I used good judgment when you showed non. I don't want to see you lead us into ruin, Krenna!",12,0,100,0,0,0,'Gorgonna - Say 0'),
+(27726,1,1,"It doesn't have to end this way, you know?",12,0,100,0,0,0,'Gorgonna - Say 1'),
+(27726,2,2,"We'll see about that",12,0,100,0,0,0,'Gorgonna - Say 2'),
+(27726,3,3,"Why... why sister? Why did it have to come to this?",12,0,100,0,0,0,'Gorgonna - Say 3');
+
+-- SAI
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (27715,27716,27717,27718,27727,27719,27726);
+DELETE FROM `creature_ai_scripts` WHERE `creature_id` IN (27715,27716,27717,27718,27727,27719,27726);
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (27715,27716,27717,27718,27727,27719,27726);
+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
+(27715,0,0,0,9,0,100,0,8,25,17000,24000,11,32323,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Ironhide - Cast Charge'),
+(27715,0,1,0,0,0,100,0,5000,7000,7000,9000,11,34298,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Ironhide - Cast Maul'),
+(27715,0,2,0,9,0,100,0,0,5,7000,11000,11,31279,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Ironhide - Cast Swipe'),
+(27715,0,3,0,7,0,100,0,0,0,0,0,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Ironhide - Evade - Unseen'),
+(27715,0,4,0,7,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Ironhide - Evade - Despawn'),
+(27715,0,5,0,6,0,100,0,0,0,0,0,15,12427,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Ironhide - Death - Credit'),
+(27715,0,6,0,6,0,100,0,0,0,0,0,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Ironhide - Death - Unseen'),
+(27715,0,7,0,7,0,100,0,0,0,0,0,6,12427,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Ironhide - Evade - Quest Fail'),
+
+-- Torgg Thundertotem 27716
+(27716,0,0,0,0,0,100,0,1000,3000,6000,8000,11,16033,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Torgg Thundertotem - Cast Chain Lightning'),
+(27716,0,1,0,0,0,100,0,10000,20000,5000,15000,11,15982,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Torgg Thundertotem - Cast Healing Wave'),
+(27716,0,2,0,0,0,100,0,0,0,21000,21000,11,31991,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Torgg Thundertotem - Cast Corrupted Nova Totem'),
+(27716,0,3,0,0,0,100,0,4000,4000,12000,12000,11,15501,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Torgg Thundertotem - Cast Earth Shock'),
+(27716,0,4,0,7,0,100,0,0,0,0,0,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Torgg Thundertotem - Evade - Unseen'),
+(27716,0,5,0,7,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Torgg Thundertotem - Evade - Despawn'),
+(27716,0,6,0,6,0,100,0,0,0,0,0,15,12428,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Torgg Thundertotem - Credit'),
+(27716,0,7,0,6,0,100,0,0,0,0,0,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Torgg Thundertotem - Death - Unseen'),
+(27716,0,8,0,7,0,100,0,0,0,0,0,6,12428,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Torgg Thundertotem - Evade - Quest Fail'),
+
+-- Rustblood 27717
+(27717,0,0,0,0,0,100,0,5000,7000,5000,7000,11,42746,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Rustblood - Cast Cleave'),
+(27717,0,1,0,9,0,100,0,0,5,22000,30000,11,49398,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Rustblood - Cast Knockback'),
+(27717,0,2,0,0,0,100,0,12000,15000,18000,21000,11,14102,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Rustblood - Cast Head Smash'),
+(27717,0,3,0,0,0,100,0,0,3000,12000,12000,11,61893,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Rustblood - Cast Lightning Bolt'),
+(27717,0,4,0,7,0,100,0,0,0,0,0,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Rustblood - Evade - Unseen'),
+(27717,0,5,0,7,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Rustblood - Evade - Despawn'),
+(27717,0,6,0,6,0,100,0,0,0,0,0,15,12429,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Rustblood - Death - Credit'),
+(27717,0,7,0,6,0,100,0,0,0,0,0,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Rustblood - Death - Unseen'),
+(27717,0,8,0,7,0,100,0,0,0,0,0,6,12429,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Rustblood - Evade - Quest Fail'),
+
+-- Horgrenn Hellcleave 27718
+(27718,0,0,0,9,0,100,0,0,10,21000,29000,11,16508,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Horgrenn Hellcleave - Cast Intimidating Roar'),
+(27718,0,1,0,0,0,100,0,3000,6000,8000,12000,11,15572,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Horgrenn Hellcleave - Cast Sunder Armor'),
+(27718,0,2,0,0,0,100,0,9000,12000,12000,16000,11,39171,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Horgrenn Hellcleave - Cast Mortal Strike'),
+(27718,0,3,0,0,0,100,0,13000,15000,13000,18000,11,38618,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Horgrenn Hellcleave - Cast Whirlwind'),
+(27718,0,4,0,7,0,100,0,0,0,0,0,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Horgrenn Hellcleave - Evade - Unseen'),
+(27718,0,5,0,7,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Horgrenn Hellcleave - Evade - Despawn'),
+(27718,0,6,0,6,0,100,0,0,0,0,0,15,12430,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Horgrenn Hellcleave - Death - Credit'),
+(27718,0,7,0,6,0,100,0,0,0,0,0,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Horgrenn Hellcleave - Death - Unseen'),
+(27718,0,8,0,7,0,100,0,0,0,0,0,6,12430,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Horgrenn Hellcleave - Evade - Quest Fail'),
+
+-- Conqueror Krenna 27727
+(27727,0,0,0,9,0,100,0,0,5,7000,9000,11,15284,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Conqueror Krenna - Cast Cleave'),
+(27727,0,1,0,0,0,100,0,9000,12000,12000,17000,11,11430,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Conqueror Krenna - Cast Slam'),
+(27727,0,2,0,13,0,100,0,14000,17000,14000,17000,11,12555,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Conqueror Krenna - Cast Pummel'),
+(27727,0,3,0,13,0,100,0,3000,6000,6000,11000,11,34719,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Conqueror Krenna - Cast Fixate'),
+(27727,0,4,0,54,0,100,0,0,0,0,0,12,27726,3,75000,0,0,0,8,0,0,0,3244.50,-2340.56,92.14,6.27, 'Conqueror Krenna - Summon Gorgonna'),
+(27727,0,5,0,54,0,100,0,0,0,0,0,1,0,18000,0,0,0,0,1,0,0,0,0,0,0,0, 'Conqueror Krenna - Summoned - Say 0'),
+(27727,0,6,0,52,0,100,0,0,27727,0,0,1,1,6000,0,0,0,0,1,0,0,0,0,0,0,0, 'Conqueror Krenna - Say 0 - Say 1'),
+(27727,0,7,0,1,0,100,1,35000,35000,1,1,2,14,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Conqueror Krenna - OOC 35 Sec - Enemy'),
+(27727,0,8,0,6,0,100,0,0,0,0,0,15,12431,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Conqueror Krenna - Death - Credit'),
+(27727,0,9,0,6,0,100,0,0,0,0,0,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Conqueror Krenna - Death - Unseen'),
+(27727,0,10,0,7,0,100,0,0,0,0,0,6,12431,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Conqueror Krenna - Evade - Quest Fail'),
+
+-- Gorgonna 27726
+(27726,0,0,0,1,0,100,1,6000,6000,1,1,1,0,6000,0,0,0,0,1,0,0,0,0,0,0,0,'Gorgonna - OOC 6 Sec - Say 0'),
+(27726,0,1,0,52,0,100,0,0,27726,0,0,1,1,18000,0,0,0,0,1,0,0,0,0,0,0,0,'Gorgonna - Say 0 - Say 1'),
+(27726,0,2,0,52,0,100,0,1,27726,0,0,1,2,15000,0,0,0,0,1,0,0,0,0,0,0,0,'Gorgonna - Say 1 - Say 2'),
+(27726,0,3,0,52,0,100,0,2,27726,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Gorgonna - Say 2 - Say 3'),
+
+-- Grennix Shivwiggle 27719
+(27719, 0, 0, 0, 19, 0, 100, 0, 12427, 0, 0, 0, 12, 27715, 7, 0, 0, 0, 0, 8, 0, 0, 0, 3242.77, -2340.98, 92.34, 0.98, 'Grennix Shivwiggle - Accepted Quest - Summon 27715'),
+(27719, 0, 1, 0, 19, 0, 100, 0, 12428, 0, 0, 0, 12, 27716, 7, 0, 0, 0, 0, 8, 0, 0, 0, 3242.77, -2340.98, 92.34, 0.98, 'Grennix Shivwiggle - Accepted Quest - Summon 27716'),
+(27719, 0, 2, 0, 19, 0, 100, 0, 12429, 0, 0, 0, 12, 27717, 7, 0, 0, 0, 0, 8, 0, 0, 0, 3242.77, -2340.98, 92.34, 0.98, 'Grennix Shivwiggle - Accepted Quest - Summon 27717'),
+(27719, 0, 3, 0, 19, 0, 100, 0, 12430, 0, 0, 0, 12, 27718, 7, 0, 0, 0, 0, 8, 0, 0, 0, 3242.77, -2340.98, 92.34, 0.98, 'Grennix Shivwiggle - Accepted Quest - Summon 27718'),
+(27719, 0, 4, 0, 19, 0, 100, 0, 12431, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Grennix Shivwiggle - Accepted Quest - Say 0'),
+(27719, 0, 5, 0, 19, 0, 100, 0, 12431, 0, 0, 0, 12, 27727, 7, 0, 0, 0, 0, 8, 0, 0, 0, 3251.91, -2340.61, 91.86, 3.1, 'Grennix Shivwiggle - Accepted Quest - Summon 27727');
diff --git a/sql/updates/world/2013_08_09_01_world_sai.sql b/sql/updates/world/2013_08_09_01_world_sai.sql
new file mode 100644
index 00000000000..2f4a1d914da
--- /dev/null
+++ b/sql/updates/world/2013_08_09_01_world_sai.sql
@@ -0,0 +1 @@
+UPDATE `smart_scripts` SET `event_flags`=1 WHERE `entryorguid`=7664 AND `source_type`=0 AND `id`IN (3,5,7) AND `link` IN (4,6,8);
diff --git a/sql/updates/world/2013_08_09_02_world_cond_335.sql b/sql/updates/world/2013_08_09_02_world_cond_335.sql
new file mode 100644
index 00000000000..ba4ce6d5a8f
--- /dev/null
+++ b/sql/updates/world/2013_08_09_02_world_cond_335.sql
@@ -0,0 +1,8 @@
+UPDATE `quest_template` SET `PrevQuestId`=0 WHERE `Id`=8280;
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (19,20) and `SourceEntry`=8280;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(20, 0, 8280, 0, 0, 8, 0, 8275, 0, 0, 0, 0, 0, '', 'Securing the Supply Lines can be taken if Taking Back Silithus (Alliance) Complete'),
+(19, 0, 8280, 0, 0, 8, 0, 8275, 0, 0, 0, 0, 0, '', 'Securing the Supply Lines can be taken if Taking Back Silithus (Alliance) Complete'),
+(20, 0, 8280, 0, 1, 8, 0, 8276, 0, 0, 0, 0, 0, '', 'Securing the Supply Lines can be taken if Taking Back Silithus (Horde) Complete'),
+(19, 0, 8280, 0, 1, 8, 0, 8276, 0, 0, 0, 0, 0, '', 'Securing the Supply Lines can be taken if Taking Back Silithus (Horde) Complete');
diff --git a/sql/updates/world/2013_08_09_03_world_sai.sql b/sql/updates/world/2013_08_09_03_world_sai.sql
new file mode 100644
index 00000000000..71b44ff8966
--- /dev/null
+++ b/sql/updates/world/2013_08_09_03_world_sai.sql
@@ -0,0 +1,12 @@
+SET @RavenousJaws=29392;
+
+UPDATE `creature_template` SET `ainame`='SmartAI' WHERE `entry`=@RavenousJaws;
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=17 AND `SourceEntry`=6509;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(17,0,6509,0,0,1,1,47172,0,0,0,0,0,0,'Cast Gore Bladder only if Cosmetic - Underwater Blood (no sound) aura is active');
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@RavenousJaws 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
+(@RavenousJaws,0,0,0,0,0,100,0,2000,5000,4000,7000,11,3391,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ravenous Jaws - In combat - cast Thrash'),
+(@RavenousJaws,0,1,0,6,0,100,0,0,0,0,0,11,47172,2,0,0,0,0,1,0,0,0,0,0,0,0,'Ravenous Jaws - On death - cast Underwater Blood'),
+(@RavenousJaws,0,2,3,8,0,100,0,6509,0,0,0,28,47172,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ravenous Jaws - On spell hit Gore Bladder - remove aura'),
+(@RavenousJaws,0,3,0,61,0,100,0,0,0,0,0,33,29391,0,0,0,0,0,7,0,0,0,0,0,0,0,'Ravenous Jaws - Link previous event - give quest credit');
diff --git a/sql/updates/world/2013_08_09_04_world_sai.sql b/sql/updates/world/2013_08_09_04_world_sai.sql
new file mode 100644
index 00000000000..57312d76910
--- /dev/null
+++ b/sql/updates/world/2013_08_09_04_world_sai.sql
@@ -0,0 +1,22 @@
+UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` =23162;
+
+DELETE FROM `creature_ai_scripts` WHERE `creature_id` =23162;
+DELETE FROM `smart_scripts` WHERE `entryorguid` =23162 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
+(23162, 0, 0,1,11,0, 100, 0, 0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Vakkiz the Windrager - On Spawn - Say Emote'),
+(23162, 0, 1,2,61,0, 100, 0, 0,0,0,0,19,33088,0,0,0,0,0,1,0,0,0,0,0,0,0,'Vakkiz the Windrager - Linked with Previous Event - Set Unit Flags'),
+(23162, 0, 2,0,61,0, 100, 0, 0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Vakkiz the Windrager - Linked with Previous Event - Set Phase 1'),
+(23162, 0, 3,0, 0,1, 100, 0, 6500,9500,8500,11500,11,40420,0,0,0,0,0,2,0,0,0,0,0,0,0,'Vakkiz the Windrager - IC - Cast Lightning Breath (Phase 1)'),
+(23162, 0, 4,5, 2,1, 100, 0, 0,40,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Vakkiz the Windrager - On 40% HP - Say Emote'),
+(23162, 0, 5,6,61,1, 100, 0, 0,0,0,0,3,0,21296,0,0,0,0,1,0,0,0,0,0,0,0,'Vakkiz the Windrager - Linked with Previous Event - Change Model'),
+(23162, 0, 6,0,61,1, 100, 0, 0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Vakkiz the Windrager - Linked with Previous Event - Set Phase 2'),
+(23162, 0, 7,0, 0,2, 100, 0, 3000,7000,5000,9000,11,40419,0,0,0,0,0,1,0,0,0,0,0,0,0,'Vakkiz the Windrager - IC - Cast Bone Spray (Phase 2)'),
+(23162, 0, 8,9, 7,0, 100, 0, 0,0,0,0,19,33088,0,0,0,0,0,1,0,0,0,0,0,0,0,'Vakkiz the Windrager - On Evade - Set Unit Flags'),
+(23162, 0, 9,10,61,0, 100, 0, 0,0,0,0,3,0,20837,0,0,0,0,1,0,0,0,0,0,0,0,'Vakkiz the Windrager - Linked with Previous Event - Set Model'),
+(23162, 0,10,0,61,0, 100, 0, 0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Vakkiz the Windrager - Linked with Previous Event - Set Phase 1');
+
+DELETE FROM `creature_text` WHERE `entry` =23162;
+DELETE FROM `creature_ai_texts` WHERE `entry` IN (-234,-235);
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
+(23162, 0, 0, 'Furious winds envelop Vakkiz as he writhes menacingly towards you.', 16, 0, 100, 0, 0, 0, 'Vakkiz the Windrager'),
+(23162, 1, 0, '%s''s flesh shatters in an unearthly rage!', 16, 0, 100, 0, 0, 0, 'Vakkiz the Windrager');
diff --git a/sql/updates/world/2013_08_09_05_world_sai.sql b/sql/updates/world/2013_08_09_05_world_sai.sql
new file mode 100644
index 00000000000..889a0351181
--- /dev/null
+++ b/sql/updates/world/2013_08_09_05_world_sai.sql
@@ -0,0 +1,29 @@
+SET @DIBear=30292; -- Dead Icemaw Bear
+SET @LJBunny=30366; -- Lure Jormuttar Bunny
+
+-- WTF?! Spell Carve Bear Flank have no triggered spell
+DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=56562;
+-- Set Spell script
+DELETE FROM `spell_script_names` WHERE `spell_id`=56565;
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(56565,'spell_q13011_bear_flank_master');
+-- Update Item's Target requirement
+UPDATE `conditions` SET `ConditionTypeOrReference`=31 ,`ConditionTarget`=1 ,`ConditionValue1` =3,`ConditionValue2`=@DIBear WHERE `SourceTypeOrReferenceId`=17 AND `SourceGroup`=0 AND `SourceEntry`=56562;
+-- Update creature_templates to use SAI
+UPDATE `creature_template` SET `ainame`='SmartAI' WHERE `entry` IN (@DIBear,@LJBunny);
+-- Update Icy Crater phaseMask
+UPDATE `gameobject` SET `phaseMask`=4 WHERE `guid`=99730;
+-- Add Dead Icemaw Bear SAI
+DELETE FROM `smart_scripts` WHERE `entryorguid`=30292 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
+(@DIBear,0,0,1,8,0,100,0,56562,0,0,0,11,56565,0,0,0,0,0,7,0,0,0,0,0,0,0,'Dead Icemaw Bear - On Spell Hit - Cast Bear Flank Master'),
+(@DIBear,0,1,0,61,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dead Icemaw Bear - Link With Previous Event - Despawn'),
+(@DIBear,0,2,0,8,0,100,0,56569,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dead Icemaw Bear - On Spell Hit - Despawn');
+-- Add Lure Jormuttar Bunny SAI
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@LJBunny 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
+(@LJBunny,0,0,0,11,0,100,0,0,0,0,0,12,30340,2,120000,0,0,0,1,0,0,0,0,0,0,0,'Lure Jormuttar Bunny - On Spawn - Summon Jormuttar');
+-- Add Dead Icemaw Bear creature_text
+DELETE FROM `creature_text` WHERE `entry`=30292;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
+(@DIBear,0,0,'This bear\'s flank is frozen solid... try again.',42,0,0,0,0,0,'');
diff --git a/sql/updates/world/2013_08_09_06_world_ainame.sql b/sql/updates/world/2013_08_09_06_world_ainame.sql
new file mode 100644
index 00000000000..fd25f912bd7
--- /dev/null
+++ b/sql/updates/world/2013_08_09_06_world_ainame.sql
@@ -0,0 +1,8 @@
+UPDATE `creature_template` SET `AIName`='' WHERE `entry`=29400; -- Corrupted Scarlet Onslaught (EAI)
+UPDATE `creature_template` SET `AIName`='' WHERE `entry`=29403; -- Onslaught Gryphon (SAI)
+UPDATE `creature_template` SET `AIName`='' WHERE `entry`=30210; -- Hodir's Helm KC Bunny (SAI)
+UPDATE `creature_template` SET `AIName`='' WHERE `entry`=30575; -- Frostbrood Destroyer (SAI)
+UPDATE `creature_template` SET `AIName`='' WHERE `entry`=30841; -- Death Gate (Mograine) (SAI)
+UPDATE `creature_template` SET `AIName`='' WHERE `entry`=30850; -- Death Gate (Munch) (SAI)
+UPDATE `creature_template` SET `AIName`='' WHERE `entry`=30852; -- Death Gate (Jayde) (SAI)
+UPDATE `creature_template` SET `AIName`='' WHERE `entry`=34885; -- Dame Evniki Kapsalis (SAI)
diff --git a/sql/updates/world/2013_08_09_07_world_sai.sql b/sql/updates/world/2013_08_09_07_world_sai.sql
new file mode 100644
index 00000000000..60699267c4f
--- /dev/null
+++ b/sql/updates/world/2013_08_09_07_world_sai.sql
@@ -0,0 +1,41 @@
+-- Random comment â„¢
+-- Corrupted Scarlet Onslaught
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=29400;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = 29400;
+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
+(29400,0,0,0,0,0,100,0,2000,15000,30000,45000,11,38056,2,0,0,0,0,2,0,0,0,0,0,0,0,'Corrupted Scarlet Onslaught - IC - Flesh Rip');
+
+-- Onslaught Raven Bishop
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=29338;
+DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=29338;
+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
+(29338,0,0,0,4,0,100,1,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Raven Bishop - Set Phase 1 - On Aggro'),
+(29338,0,1,0,4,1,100,1,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Raven Bishop - Stop Moving - On Aggro'),
+(29338,0,2,0,4,1,100,1,0,0,0,0,11,50740,0,0,0,0,0,2,0,0,0,0,0,0,0,'Raven Bishop - Cast bolt on Aggro'),
+(29338,0,3,0,9,1,100,0,0,40,3400,4700,11,50740,0,0,0,0,0,2,0,0,0,0,0,0,0,'Raven Bishop - Cast Raven Flock'),
+(29338,0,4,0,9,1,100,0,40,100,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Raven Bishop - Start Moving - When not in flock Range'),
+(29338,0,5,0,9,1,100,0,10,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Raven Bishop - Stop Moving - 15 Yards'),
+(29338,0,6,0,9,1,100,0,0,40,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Raven Bishop - Stop Moving - When in flock Range'),
+(29338,0,7,0,3,1,100,0,0,15,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Raven Bishop - Set Phase 2 - 15% Mana'),
+(29338,0,8,0,3,2,100,0,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Raven Bishop - Start Moving - 15% Mana'),
+(29338,0,9,0,3,2,100,0,30,100,100,100,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Raven Bishop - Set Phase 1 - When Mana is above 30%'),
+(29338,0,10,0,2,1,100,0,10,50,2000,8000,11,50750,0,0,0,0,0,2,0,0,0,0,0,0,0,'Raven Bishop - Health Pct - Cast Raven Heal');
+
+-- Onslaught Paladin
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=29329;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = 29329;
+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
+(29329,0,0,0,4,0,100,0,0,0,0,0,11,19131,2,0,0,0,0,2,0,0,0,0,0,0,0,'Onslaught Paladin - On Aggro - Cast Charge'),
+(29329,0,1,0,0,0,100,0,2000,9000,17000,30000,11,32774,2,0,0,0,0,2,0,0,0,0,0,0,0,'Onslaught Paladin - IC - Avenger''s Shield');
+
+-- Onslaught Harbor Guard
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=29330;
+DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=29330;
+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
+(29330,0,0,0,4,0,100,1,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Harbor Guard - Set Phase 1 - On Aggro'),
+(29330,0,1,0,4,1,100,1,0,0,0,0,11,6660,0,0,0,0,0,2,0,0,0,0,0,0,0,'Harbor Guard - Cast Shoot - On Aggro'),
+(29330,0,2,0,9,1,100,0,0,40,3400,4700,11,6660,0,0,0,0,0,2,0,0,0,0,0,0,0,'Harbor Guard - Cast Shoot'),
+(29330,0,3,0,9,1,100,0,40,100,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Harbor Guard - Start Moving - When not in Shoot range'),
+(29330,0,4,0,9,1,100,0,10,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Harbor Guard - Stop Moving - 15 Yards'),
+(29330,0,5,0,9,1,100,0,0,40,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Harbor Guard - Stop Moving - When in bolt Range'),
+(29330,0,6,0,0,1,100,0,8000,8000,12000,14000,11,50750,0,0,0,0,0,1,0,0,0,0,0,0,0,'Harbor Guard - IC - Cast Frost Shot');
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 933b7b29892..261c4166a15 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -250,9 +250,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
if (IsUnit(*itr))
{
- (*itr)->SendPlaySound(e.action.sound.sound, e.action.sound.range > 0 ? true : false);
+ (*itr)->SendPlaySound(e.action.sound.sound, e.action.sound.onlySelf > 0 ? true : false);
TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SOUND: target: %s (GuidLow: %u), sound: %u, onlyself: %u",
- (*itr)->GetName().c_str(), (*itr)->GetGUIDLow(), e.action.sound.sound, e.action.sound.range);
+ (*itr)->GetName().c_str(), (*itr)->GetGUIDLow(), e.action.sound.sound, e.action.sound.onlySelf);
}
}
@@ -897,13 +897,19 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
}
case SMART_ACTION_CALL_KILLEDMONSTER:
{
- Player* player = NULL;
- if (me)
- player = me->GetLootRecipient();
+ if (e.target.type == SMART_TARGET_NONE) // Loot recipient and his group members
+ {
+ if (!me)
+ break;
- if (me && player)
- player->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, player);
- else if (GetBaseObject())
+ if (Player* player = me->GetLootRecipient())
+ {
+ player->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, player);
+ TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_KILLEDMONSTER: Player %u, Killcredit: %u",
+ player->GetGUIDLow(), e.action.killedMonster.creature);
+ }
+ }
+ else // Specific target type
{
ObjectList* targets = GetTargets(e, unit);
if (!targets)
@@ -911,29 +917,21 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
{
- // Special handling for vehicles
- if (IsUnit(*itr))
+ if (IsPlayer(*itr))
+ {
+ (*itr)->ToPlayer()->KilledMonsterCredit(e.action.killedMonster.creature);
+ TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_KILLEDMONSTER: Player %u, Killcredit: %u",
+ (*itr)->GetGUIDLow(), e.action.killedMonster.creature);
+ }
+ else if (IsUnit(*itr)) // Special handling for vehicles
if (Vehicle* vehicle = (*itr)->ToUnit()->GetVehicleKit())
- for (SeatMap::iterator it = vehicle->Seats.begin(); it != vehicle->Seats.end(); ++it)
- if (Player* player = ObjectAccessor::FindPlayer(it->second.Passenger.Guid))
- player->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, player);
-
- if (!IsPlayer(*itr))
- continue;
-
- (*itr)->ToPlayer()->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, (*itr)->ToPlayer());
- TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_KILLEDMONSTER: Player %u, Killcredit: %u",
- (*itr)->GetGUIDLow(), e.action.killedMonster.creature);
+ for (SeatMap::iterator itr = vehicle->Seats.begin(); itr != vehicle->Seats.end(); ++itr)
+ if (Player* player = ObjectAccessor::FindPlayer(itr->second.Passenger.Guid))
+ player->KilledMonsterCredit(e.action.killedMonster.creature);
}
delete targets;
}
- else if (trigger && IsPlayer(unit))
- {
- unit->ToPlayer()->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, unit);
- TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction: SMART_ACTION_CALL_KILLEDMONSTER: (trigger == true) Player %u, Killcredit: %u",
- unit->GetGUIDLow(), e.action.killedMonster.creature);
- }
break;
}
case SMART_ACTION_SET_INST_DATA:
@@ -1300,10 +1298,10 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
{
- if (!IsPlayer(*itr))
- continue;
-
- (*itr)->ToPlayer()->TeleportTo(e.action.teleport.mapID, e.target.x, e.target.y, e.target.z, e.target.o);
+ if (IsPlayer(*itr))
+ (*itr)->ToPlayer()->TeleportTo(e.action.teleport.mapID, e.target.x, e.target.y, e.target.z, e.target.o);
+ else if (IsCreature(*itr))
+ (*itr)->ToCreature()->NearTeleportTo(e.target.x, e.target.y, e.target.z, e.target.o);
}
delete targets;
@@ -1424,7 +1422,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
e.GetTargetType() == SMART_TARGET_CREATURE_DISTANCE || e.GetTargetType() == SMART_TARGET_GAMEOBJECT_RANGE ||
e.GetTargetType() == SMART_TARGET_GAMEOBJECT_GUID || e.GetTargetType() == SMART_TARGET_GAMEOBJECT_DISTANCE ||
e.GetTargetType() == SMART_TARGET_CLOSEST_CREATURE || e.GetTargetType() == SMART_TARGET_CLOSEST_GAMEOBJECT ||
- e.GetTargetType() == SMART_TARGET_OWNER_OR_SUMMONER || e.GetTargetType() == SMART_TARGET_ACTION_INVOKER)
+ e.GetTargetType() == SMART_TARGET_OWNER_OR_SUMMONER || e.GetTargetType() == SMART_TARGET_ACTION_INVOKER ||
+ e.GetTargetType() == SMART_TARGET_CLOSEST_ENEMY)
{
ObjectList* targets = GetTargets(e, unit);
if (!targets)
@@ -2487,6 +2486,14 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder const& e, Unit* invoker /*
}
break;
}
+ case SMART_TARGET_CLOSEST_ENEMY:
+ {
+ if (me)
+ if (Unit* target = me->SelectNearestTarget(e.target.closestAttackable.maxDist))
+ l->push_back(target);
+
+ break;
+ }
case SMART_TARGET_POSITION:
default:
break;
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index ec7f307c5ef..eeeacb36032 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -300,6 +300,7 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e)
case SMART_TARGET_THREAT_LIST:
case SMART_TARGET_CLOSEST_GAMEOBJECT:
case SMART_TARGET_CLOSEST_CREATURE:
+ case SMART_TARGET_CLOSEST_ENEMY:
case SMART_TARGET_STORED:
break;
default:
@@ -620,11 +621,6 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_ACTION_SOUND:
if (!IsSoundValid(e, e.action.sound.sound))
return false;
- if (e.action.sound.range > TEXT_RANGE_WORLD)
- {
- TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses invalid Text Range %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.sound.range);
- return false;
- }
break;
case SMART_ACTION_SET_EMOTE_STATE:
case SMART_ACTION_PLAY_EMOTE:
@@ -761,6 +757,11 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_ACTION_CALL_KILLEDMONSTER:
if (!IsCreatureValid(e, e.action.killedMonster.creature))
return false;
+ if (e.GetTargetType() == SMART_TARGET_POSITION)
+ {
+ TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses incorrect TargetType %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.GetTargetType());
+ return false;
+ }
break;
case SMART_ACTION_UPDATE_TEMPLATE:
if (e.action.updateTemplate.creature && !IsCreatureValid(e, e.action.updateTemplate.creature))
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index d1ae47c2afd..394ede7fb54 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -385,7 +385,7 @@ enum SMART_ACTION
SMART_ACTION_TALK = 1, // groupID from creature_text, duration to wait before TEXT_OVER event is triggered
SMART_ACTION_SET_FACTION = 2, // FactionId (or 0 for default)
SMART_ACTION_MORPH_TO_ENTRY_OR_MODEL = 3, // Creature_template entry(param1) OR ModelId (param2) (or 0 for both to demorph)
- SMART_ACTION_SOUND = 4, // SoundId, TextRange
+ SMART_ACTION_SOUND = 4, // SoundId, onlySelf
SMART_ACTION_PLAY_EMOTE = 5, // EmoteId
SMART_ACTION_FAIL_QUEST = 6, // QuestID
SMART_ACTION_ADD_QUEST = 7, // QuestID
@@ -519,7 +519,7 @@ struct SmartAction
struct
{
uint32 sound;
- uint32 range;
+ uint32 onlySelf;
} sound;
struct
@@ -997,7 +997,8 @@ enum SMARTAI_TARGETS
SMART_TARGET_ACTION_INVOKER_VEHICLE = 22, // Unit's vehicle who caused this Event to occur
SMART_TARGET_OWNER_OR_SUMMONER = 23, // Unit's owner or summoner
SMART_TARGET_THREAT_LIST = 24, // All units on creature's threat list
- SMART_TARGET_END = 25
+ SMART_TARGET_CLOSEST_ENEMY = 25, // maxDist
+ SMART_TARGET_END = 26
};
struct SmartTarget
@@ -1081,6 +1082,11 @@ struct SmartTarget
struct
{
+ uint32 maxDist;
+ } closestAttackable;
+
+ struct
+ {
uint32 param1;
uint32 param2;
uint32 param3;
diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp
index 4075ffa4de9..a9f178685d9 100644
--- a/src/server/game/Accounts/AccountMgr.cpp
+++ b/src/server/game/Accounts/AccountMgr.cpp
@@ -549,10 +549,9 @@ bool AccountMgr::HasPermission(uint32 accountId, uint32 permissionId, uint32 rea
return false;
}
- RBACData* rbac = new RBACData(accountId, "", realmId);
- rbac->LoadFromDB();
- bool hasPermission = rbac->HasPermission(permissionId);
- delete rbac;
+ RBACData rbac(accountId, "", realmId);
+ rbac.LoadFromDB();
+ bool hasPermission = rbac.HasPermission(permissionId);
TC_LOG_DEBUG(LOG_FILTER_RBAC, "AccountMgr::HasPermission [AccountId: %u, PermissionId: %u, realmId: %d]: %u",
accountId, permissionId, realmId, hasPermission);
diff --git a/src/server/game/Accounts/RBAC.cpp b/src/server/game/Accounts/RBAC.cpp
index bceae019eec..763b1584431 100644
--- a/src/server/game/Accounts/RBAC.cpp
+++ b/src/server/game/Accounts/RBAC.cpp
@@ -18,6 +18,7 @@
#include "RBAC.h"
#include "AccountMgr.h"
#include "DatabaseEnv.h"
+#include "Log.h"
void RBACRole::GrantPermission(uint32 permissionId)
{
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h
index b97ea196a0a..10f00c0a279 100644
--- a/src/server/game/Accounts/RBAC.h
+++ b/src/server/game/Accounts/RBAC.h
@@ -213,7 +213,7 @@ class RBACData: public RBACObject
* }
* @endcode
*/
- bool HasPermission(uint32 permission) { return _globalPerms.test(permission); }
+ bool HasPermission(uint32 permission) const { return _globalPerms.test(permission); }
// Functions enabled to be used by command system
/// Returns all the granted permissions (after computation)
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 3a39091895f..3d2eaffc15d 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -19,7 +19,6 @@
#include "AchievementMgr.h"
#include "ArenaTeam.h"
#include "ArenaTeamMgr.h"
-#include "BattlegroundAB.h"
#include "Battleground.h"
#include "CellImpl.h"
#include "Common.h"
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index bd8db17b025..21c054c8793 100644
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -524,7 +524,7 @@ inline void Battleground::_ProcessJoin(uint32 diff)
BattlegroundQueueTypeId bgQueueTypeId = sBattlegroundMgr->BGQueueTypeId(m_TypeID, GetArenaType());
uint32 queueSlot = player->GetBattlegroundQueueIndex(bgQueueTypeId);
sBattlegroundMgr->BuildBattlegroundStatusPacket(&status, this, queueSlot, STATUS_IN_PROGRESS, 0, GetStartTime(), GetArenaType(), player->GetBGTeam());
- player->GetSession()->SendPacket(&status);
+ player->SendDirectMessage(&status);
player->RemoveAurasDueToSpell(SPELL_ARENA_PREPARATION);
player->ResetAllPowers();
@@ -639,20 +639,19 @@ void Battleground::SendPacketToAll(WorldPacket* packet)
{
for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
if (Player* player = _GetPlayer(itr, "SendPacketToAll"))
- player->GetSession()->SendPacket(packet);
+ player->SendDirectMessage(packet);
}
void Battleground::SendPacketToTeam(uint32 TeamID, WorldPacket* packet, Player* sender, bool self)
{
for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
+ {
if (Player* player = _GetPlayerForTeam(TeamID, itr, "SendPacketToTeam"))
+ {
if (self || sender != player)
- {
- WorldSession* session = player->GetSession();
- TC_LOG_DEBUG(LOG_FILTER_BATTLEGROUND, "%s %s - SendPacketToTeam %u, Player: %s", GetOpcodeNameForLogging(packet->GetOpcode()).c_str(),
- session->GetPlayerInfo().c_str(), TeamID, sender ? sender->GetName().c_str() : "null");
- session->SendPacket(packet);
- }
+ player->SendDirectMessage(packet);
+ }
+ }
}
void Battleground::PlaySoundToAll(uint32 SoundID)
@@ -669,7 +668,7 @@ void Battleground::PlaySoundToTeam(uint32 SoundID, uint32 TeamID)
if (Player* player = _GetPlayerForTeam(TeamID, itr, "PlaySoundToTeam"))
{
sBattlegroundMgr->BuildPlaySoundPacket(&data, SoundID);
- player->GetSession()->SendPacket(&data);
+ player->SendDirectMessage(&data);
}
}
@@ -694,7 +693,7 @@ void Battleground::YellToAll(Creature* creature, char const* text, uint32 langua
{
WorldPacket data(SMSG_MESSAGECHAT, 200);
creature->BuildMonsterChat(&data, CHAT_MSG_MONSTER_YELL, text, language, creature->GetName(), itr->first);
- player->GetSession()->SendPacket(&data);
+ player->SendDirectMessage(&data);
}
}
@@ -720,11 +719,11 @@ void Battleground::UpdateWorldState(uint32 Field, uint32 Value)
SendPacketToAll(&data);
}
-void Battleground::UpdateWorldStateForPlayer(uint32 Field, uint32 Value, Player* Source)
+void Battleground::UpdateWorldStateForPlayer(uint32 field, uint32 value, Player* player)
{
WorldPacket data;
- sBattlegroundMgr->BuildUpdateWorldStatePacket(&data, Field, Value);
- Source->GetSession()->SendPacket(&data);
+ sBattlegroundMgr->BuildUpdateWorldStatePacket(&data, field, value);
+ player->SendDirectMessage(&data);
}
void Battleground::EndBattleground(uint32 winner)
@@ -916,11 +915,11 @@ void Battleground::EndBattleground(uint32 winner)
BlockMovement(player);
- player->GetSession()->SendPacket(&pvpLogData);
+ player->SendDirectMessage(&pvpLogData);
WorldPacket data;
sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, TIME_TO_AUTOREMOVE, GetStartTime(), GetArenaType(), player->GetBGTeam());
- player->GetSession()->SendPacket(&data);
+ player->SendDirectMessage(&data);
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, 1);
}
@@ -1023,7 +1022,7 @@ void Battleground::RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPac
{
WorldPacket data;
sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_NONE, 0, 0, 0, 0);
- player->GetSession()->SendPacket(&data);
+ player->SendDirectMessage(&data);
}
// this call is important, because player, when joins to battleground, this method is not called, so it must be called when leaving bg
@@ -1727,8 +1726,7 @@ void Battleground::SendWarningToAll(int32 entry, ...)
data << (uint8)0;
for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
if (Player* player = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER)))
- if (player->GetSession())
- player->GetSession()->SendPacket(&data);
+ player->SendDirectMessage(&data);
}
void Battleground::SendMessage2ToAll(int32 entry, ChatMsg type, Player const* source, int32 arg1, int32 arg2)
@@ -1860,10 +1858,10 @@ void Battleground::PlayerAddedToBGCheckIfBGIsRunning(Player* player)
BlockMovement(player);
sBattlegroundMgr->BuildPvpLogDataPacket(&data, this);
- player->GetSession()->SendPacket(&data);
+ player->SendDirectMessage(&data);
sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, GetEndTime(), GetStartTime(), GetArenaType(), player->GetBGTeam());
- player->GetSession()->SendPacket(&data);
+ player->SendDirectMessage(&data);
}
uint32 Battleground::GetAlivePlayersCountByTeam(uint32 Team) const
@@ -1967,3 +1965,9 @@ void Battleground::HandleAreaTrigger(Player* player, uint32 trigger)
TC_LOG_DEBUG(LOG_FILTER_BATTLEGROUND, "Unhandled AreaTrigger %u in Battleground %u. Player coords (x: %f, y: %f, z: %f)",
trigger, player->GetMapId(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ());
}
+
+bool Battleground::CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/)
+{
+ TC_LOG_ERROR(LOG_FILTER_BATTLEGROUND, "Battleground::CheckAchievementCriteriaMeet: No implementation for criteria %u", criteriaId);
+ return false;
+}
diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h
index 52f86b98b79..1f180542016 100644
--- a/src/server/game/Battlegrounds/Battleground.h
+++ b/src/server/game/Battlegrounds/Battleground.h
@@ -27,12 +27,23 @@ class Creature;
class GameObject;
class Group;
class Player;
+class Unit;
class WorldPacket;
class BattlegroundMap;
struct PvPDifficultyEntry;
struct WorldSafeLocsEntry;
+enum BattlegroundCriteriaId
+{
+ BG_CRITERIA_CHECK_RESILIENT_VICTORY,
+ BG_CRITERIA_CHECK_SAVE_THE_DAY,
+ BG_CRITERIA_CHECK_EVERYTHING_COUNTS,
+ BG_CRITERIA_CHECK_AV_PERFECTION,
+ BG_CRITERIA_CHECK_DEFENSE_OF_THE_ANCIENTS,
+ BG_CRITERIA_CHECK_NOT_EVEN_A_SCRATCH,
+};
+
enum BattlegroundSounds
{
SOUND_HORDE_WINS = 8454,
@@ -289,8 +300,9 @@ class Battleground
virtual void DestroyGate(Player* /*player*/, GameObject* /*go*/) {}
/* achievement req. */
- virtual bool IsAllNodesConrolledByTeam(uint32 /*team*/) const { return false; }
+ virtual bool IsAllNodesControlledByTeam(uint32 /*team*/) const { return false; }
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry);
+ virtual bool CheckAchievementCriteriaMeet(uint32 /*criteriaId*/, Player const* /*player*/, Unit const* /*target*/ = NULL, uint32 /*miscvalue1*/ = 0);
/* Battleground */
// Get methods:
@@ -422,7 +434,7 @@ class Battleground
void RewardHonorToTeam(uint32 Honor, uint32 TeamID);
void RewardReputationToTeam(uint32 faction_id, uint32 Reputation, uint32 TeamID);
void UpdateWorldState(uint32 Field, uint32 Value);
- void UpdateWorldStateForPlayer(uint32 Field, uint32 Value, Player* Source);
+ void UpdateWorldStateForPlayer(uint32 Field, uint32 Value, Player* player);
void EndBattleground(uint32 winner);
void BlockMovement(Player* player);
@@ -437,7 +449,7 @@ class Battleground
Group* GetBgRaid(uint32 TeamID) const { return TeamID == ALLIANCE ? m_BgRaids[TEAM_ALLIANCE] : m_BgRaids[TEAM_HORDE]; }
void SetBgRaid(uint32 TeamID, Group* bg_raid);
- virtual void UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor = true);
+ virtual void UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true);
static TeamId GetTeamIndexByTeamId(uint32 Team) { return Team == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE; }
uint32 GetPlayersCountByTeam(uint32 Team) const { return m_PlayersCount[GetTeamIndexByTeamId(Team)]; }
@@ -466,7 +478,7 @@ class Battleground
// Triggers handle
// must be implemented in BG subclass
- virtual void HandleAreaTrigger(Player* /*Source*/, uint32 /*Trigger*/);
+ virtual void HandleAreaTrigger(Player* /*player*/, uint32 /*Trigger*/);
// must be implemented in BG subclass if need AND call base class generic code
virtual void HandleKillPlayer(Player* player, Player* killer);
virtual void HandleKillUnit(Creature* /*unit*/, Player* /*killer*/);
@@ -530,6 +542,9 @@ class Battleground
virtual uint64 GetFlagPickerGUID(int32 /*team*/ = -1) const { return 0; }
virtual void SetDroppedFlagGUID(uint64 /*guid*/, int32 /*team*/ = -1) {}
+ virtual void HandleQuestComplete(uint32 /*questid*/, Player* /*player*/) {}
+ virtual bool CanActivateGO(int32 /*entry*/, uint32 /*team*/) const { return true; }
+ virtual bool IsSpellAllowed(uint32 /*spellId*/, Player const* /*player*/) const { return true; }
uint32 GetTeamScore(uint32 TeamID) const;
virtual uint32 GetPrematureWinner();
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
index 2114fc4ef66..da292d050e9 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
@@ -111,23 +111,28 @@ void BattlegroundAB::PostUpdateImpl(uint32 diff)
int points = team_points[team];
if (!points)
continue;
+
m_lastTick[team] += diff;
+
if (m_lastTick[team] > BG_AB_TickIntervals[points])
{
m_lastTick[team] -= BG_AB_TickIntervals[points];
m_TeamScores[team] += BG_AB_TickPoints[points];
m_HonorScoreTics[team] += BG_AB_TickPoints[points];
m_ReputationScoreTics[team] += BG_AB_TickPoints[points];
+
if (m_ReputationScoreTics[team] >= m_ReputationTics)
{
(team == TEAM_ALLIANCE) ? RewardReputationToTeam(509, 10, ALLIANCE) : RewardReputationToTeam(510, 10, HORDE);
m_ReputationScoreTics[team] -= m_ReputationTics;
}
+
if (m_HonorScoreTics[team] >= m_HonorTics)
{
RewardHonorToTeam(GetBonusHonorFromKill(1), (team == TEAM_ALLIANCE) ? ALLIANCE : HORDE);
m_HonorScoreTics[team] -= m_HonorTics;
}
+
if (!m_IsInformedNearVictory && m_TeamScores[team] > BG_AB_WARNING_NEAR_VICTORY_SCORE)
{
if (team == TEAM_ALLIANCE)
@@ -140,9 +145,10 @@ void BattlegroundAB::PostUpdateImpl(uint32 diff)
if (m_TeamScores[team] > BG_AB_MAX_TEAM_SCORE)
m_TeamScores[team] = BG_AB_MAX_TEAM_SCORE;
+
if (team == TEAM_ALLIANCE)
UpdateWorldState(BG_AB_OP_RESOURCES_ALLY, m_TeamScores[team]);
- if (team == TEAM_HORDE)
+ else if (team == TEAM_HORDE)
UpdateWorldState(BG_AB_OP_RESOURCES_HORDE, m_TeamScores[team]);
// update achievement flags
// we increased m_TeamScores[team] so we just need to check if it is 500 more than other teams resources
@@ -155,7 +161,7 @@ void BattlegroundAB::PostUpdateImpl(uint32 diff)
// Test win condition
if (m_TeamScores[TEAM_ALLIANCE] >= BG_AB_MAX_TEAM_SCORE)
EndBattleground(ALLIANCE);
- if (m_TeamScores[TEAM_HORDE] >= BG_AB_MAX_TEAM_SCORE)
+ else if (m_TeamScores[TEAM_HORDE] >= BG_AB_MAX_TEAM_SCORE)
EndBattleground(HORDE);
}
}
@@ -397,8 +403,7 @@ void BattlegroundAB::_NodeDeOccupied(uint8 node)
RelocateDeadPlayers(BgCreatures[node]);
- if (BgCreatures[node])
- DelCreature(node);
+ DelCreature(node);
// buff object isn't despawned
}
@@ -696,7 +701,7 @@ void BattlegroundAB::UpdatePlayerScore(Player* Source, uint32 type, uint32 value
}
}
-bool BattlegroundAB::IsAllNodesConrolledByTeam(uint32 team) const
+bool BattlegroundAB::IsAllNodesControlledByTeam(uint32 team) const
{
uint32 count = 0;
for (int i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i)
@@ -706,3 +711,14 @@ bool BattlegroundAB::IsAllNodesConrolledByTeam(uint32 team) const
return count == BG_AB_DYNAMIC_NODES_COUNT;
}
+
+bool BattlegroundAB::CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* player, Unit const* target, uint32 miscvalue)
+{
+ switch (criteriaId)
+ {
+ case BG_CRITERIA_CHECK_RESILIENT_VICTORY:
+ return m_TeamScores500Disadvantage[GetTeamIndexByTeamId(player->GetTeam())];
+ }
+
+ return Battleground::CheckAchievementCriteriaMeet(criteriaId, player, target, miscvalue);
+}
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h
index 3467cf56ba6..81a2e899634 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h
@@ -270,8 +270,8 @@ class BattlegroundAB : public Battleground
void EventPlayerClickedOnFlag(Player* source, GameObject* target_obj);
/* achievement req. */
- bool IsAllNodesConrolledByTeam(uint32 team) const; // overwrited
- bool IsTeamScores500Disadvantage(uint32 team) const { return m_TeamScores500Disadvantage[GetTeamIndexByTeamId(team)]; }
+ bool IsAllNodesControlledByTeam(uint32 team) const;
+ bool CheckAchievementCriteriaMeet(uint32 /*criteriaId*/, Player const* /*player*/, Unit const* /*target*/ = NULL, uint32 /*miscvalue1*/ = 0);
uint32 GetPrematureWinner();
private:
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
index a72b1eb4eb1..3be95a86ca8 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
@@ -445,7 +445,7 @@ void BattlegroundAV::StartingEventOpenDoors()
DoorOpen(BG_AV_OBJECT_DOOR_A);
// Achievement: The Alterac Blitz
- StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, AV_EVENT_START_BATTLE);
+ StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, BG_AV_EVENT_START_BATTLE);
}
void BattlegroundAV::AddPlayer(Player* player)
@@ -733,7 +733,7 @@ void BattlegroundAV::ChangeMineOwner(uint8 mine, uint32 team, bool initial)
return;
}
-bool BattlegroundAV::PlayerCanDoMineQuest(int32 GOId, uint32 team)
+bool BattlegroundAV::CanActivateGO(int32 GOId, uint32 team) const
{
if (GOId == BG_AV_OBJECTID_MINE_N)
return (m_Mine_Owner[AV_NORTH_MINE] == team);
@@ -1621,63 +1621,67 @@ void BattlegroundAV::ResetBGSubclass()
DelCreature(i);
}
-bool BattlegroundAV::IsBothMinesControlledByTeam(uint32 team) const
+bool BattlegroundAV::CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* source, Unit const* target, uint32 miscValue)
{
- for (uint8 mine = 0; mine < 2; mine++)
- if (m_Mine_Owner[mine] != team)
- return false;
-
- return true;
-}
-
-bool BattlegroundAV::IsAllTowersControlledAndCaptainAlive(uint32 team) const
-{
- if (team == ALLIANCE)
+ uint8 team = source->GetTeam();
+ switch (criteriaId)
{
- for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_STONEHEART_BUNKER; ++i) // alliance towers controlled
- {
- if (m_Nodes[i].State == POINT_CONTROLED)
- {
- if (m_Nodes[i].Owner != ALLIANCE)
+ case BG_CRITERIA_CHECK_EVERYTHING_COUNTS:
+ for (uint8 mine = 0; mine < 2; mine++)
+ if (m_Mine_Owner[mine] != team)
return false;
- }
- else
- return false;
- }
-
- for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_TOWER; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i) // horde towers destroyed
- if (m_Nodes[i].State != POINT_DESTROYED)
- return false;
- if (!m_CaptainAlive[0])
- return false;
-
- return true;
- }
- else if (team == HORDE)
- {
- for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_TOWER; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i) // horde towers controlled
+ return true;
+ case BG_CRITERIA_CHECK_AV_PERFECTION:
{
- if (m_Nodes[i].State == POINT_CONTROLED)
+ if (team == ALLIANCE)
{
- if (m_Nodes[i].Owner != HORDE)
+ for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_STONEHEART_BUNKER; ++i) // alliance towers controlled
+ {
+ if (m_Nodes[i].State == POINT_CONTROLED)
+ {
+ if (m_Nodes[i].Owner != ALLIANCE)
+ return false;
+ }
+ else
+ return false;
+ }
+
+ for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_TOWER; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i) // horde towers destroyed
+ if (m_Nodes[i].State != POINT_DESTROYED)
+ return false;
+
+ if (!m_CaptainAlive[0])
return false;
+
+ return true;
}
- else
- return false;
- }
+ else if (team == HORDE)
+ {
+ for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_TOWER; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i) // horde towers controlled
+ {
+ if (m_Nodes[i].State == POINT_CONTROLED)
+ {
+ if (m_Nodes[i].Owner != HORDE)
+ return false;
+ }
+ else
+ return false;
+ }
- for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_STONEHEART_BUNKER; ++i) // alliance towers destroyed
- if (m_Nodes[i].State != POINT_DESTROYED)
- return false;
+ for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_STONEHEART_BUNKER; ++i) // alliance towers destroyed
+ if (m_Nodes[i].State != POINT_DESTROYED)
+ return false;
- if (!m_CaptainAlive[1])
- return false;
+ if (!m_CaptainAlive[1])
+ return false;
- return true;
+ return true;
+ }
+ }
}
- return false;
+ return Battleground::CheckAchievementCriteriaMeet(criteriaId, source, target, miscValue);
}
uint32 BattlegroundAV::GetPrematureWinner()
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h
index bbe3b064c35..439fc656925 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h
@@ -50,7 +50,7 @@
#define BG_AV_KILL_SURVIVING_CAPTAIN 2
#define BG_AV_REP_SURVIVING_CAPTAIN 125
-#define AV_EVENT_START_BATTLE 9166 // Achievement: The Alterac Blitz
+#define BG_AV_EVENT_START_BATTLE 9166 // Achievement: The Alterac Blitz
enum BG_AV_Sounds
{ /// @todo: get out if there comes a sound when neutral team captures mine
@@ -1527,7 +1527,8 @@ inline BG_AV_Nodes &operator++(BG_AV_Nodes &i){ return i = BG_AV_Nodes(i + 1); }
struct BattlegroundAVScore : public BattlegroundScore
{
- BattlegroundAVScore() : GraveyardsAssaulted(0), GraveyardsDefended(0), TowersAssaulted(0), TowersDefended(0), MinesCaptured(0), LeadersKilled(0), SecondaryObjectives(0) { }
+ BattlegroundAVScore() : GraveyardsAssaulted(0), GraveyardsDefended(0), TowersAssaulted(0),
+ TowersDefended(0), MinesCaptured(0), LeadersKilled(0), SecondaryObjectives(0) { }
~BattlegroundAVScore() { }
uint32 GraveyardsAssaulted;
uint32 GraveyardsDefended;
@@ -1550,28 +1551,27 @@ class BattlegroundAV : public Battleground
void StartingEventOpenDoors();
void RemovePlayer(Player* player, uint64 guid, uint32 team);
- void HandleAreaTrigger(Player* Source, uint32 Trigger);
+ void HandleAreaTrigger(Player* player, uint32 trigger);
bool SetupBattleground();
void ResetBGSubclass();
/*general stuff*/
void UpdateScore(uint16 team, int16 points);
- void UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor = true);
+ void UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true);
/*handlestuff*/ //these are functions which get called from extern
void EventPlayerClickedOnFlag(Player* source, GameObject* target_obj);
void HandleKillPlayer(Player* player, Player* killer);
void HandleKillUnit(Creature* unit, Player* killer);
void HandleQuestComplete(uint32 questid, Player* player);
- bool PlayerCanDoMineQuest(int32 GOId, uint32 team);
+ bool CanActivateGO(int32 GOId, uint32 team) const;
void EndBattleground(uint32 winner);
WorldSafeLocsEntry const* GetClosestGraveYard(Player* player);
- /* achievement req. */
- bool IsBothMinesControlledByTeam(uint32 team) const;
- bool IsAllTowersControlledAndCaptainAlive(uint32 team) const;
+ // Achievement: Av perfection and Everything counts
+ bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0);
uint32 GetPrematureWinner();
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundBE.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundBE.cpp
index 41b372bfee8..b49ae97493c 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundBE.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundBE.cpp
@@ -142,12 +142,10 @@ bool BattlegroundBE::SetupBattleground()
void BattlegroundBE::UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor)
{
-
BattlegroundScoreMap::iterator itr = PlayerScores.find(Source->GetGUID());
if (itr == PlayerScores.end()) // player not found...
return;
//there is nothing special in this score
Battleground::UpdatePlayerScore(Source, type, value, doAddHonor);
-
}
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp
index fac4c08d70d..83965884029 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp
@@ -33,7 +33,6 @@ BattlegroundDS::BattlegroundDS()
StartDelayTimes[BG_STARTING_EVENT_SECOND] = BG_START_DELAY_30S;
StartDelayTimes[BG_STARTING_EVENT_THIRD] = BG_START_DELAY_15S;
StartDelayTimes[BG_STARTING_EVENT_FOURTH] = BG_START_DELAY_NONE;
- //we must set messageIds
StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_ARENA_ONE_MINUTE;
StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_ARENA_THIRTY_SECONDS;
StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_ARENA_FIFTEEN_SECONDS;
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp
index c87fd3db8ca..95808065d62 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp
@@ -122,7 +122,7 @@ void BattlegroundEY::StartingEventOpenDoors()
}
// Achievement: Flurry
- StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EY_EVENT_START_BATTLE);
+ StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, BG_EY_EVENT_START_BATTLE);
}
void BattlegroundEY::AddPoints(uint32 Team, uint32 Points)
@@ -591,16 +591,16 @@ void BattlegroundEY::HandleKillPlayer(Player* player, Player* killer)
EventPlayerDroppedFlag(player);
}
-void BattlegroundEY::EventPlayerDroppedFlag(Player* Source)
+void BattlegroundEY::EventPlayerDroppedFlag(Player* player)
{
if (GetStatus() != STATUS_IN_PROGRESS)
{
// if not running, do not cast things at the dropper player, neither send unnecessary messages
// just take off the aura
- if (IsFlagPickedup() && GetFlagPickerGUID() == Source->GetGUID())
+ if (IsFlagPickedup() && GetFlagPickerGUID() == player->GetGUID())
{
SetFlagPicker(0);
- Source->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);
+ player->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);
}
return;
}
@@ -608,31 +608,31 @@ void BattlegroundEY::EventPlayerDroppedFlag(Player* Source)
if (!IsFlagPickedup())
return;
- if (GetFlagPickerGUID() != Source->GetGUID())
+ if (GetFlagPickerGUID() != player->GetGUID())
return;
SetFlagPicker(0);
- Source->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);
+ player->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);
m_FlagState = BG_EY_FLAG_STATE_ON_GROUND;
m_FlagsTimer = BG_EY_FLAG_RESPAWN_TIME;
- Source->CastSpell(Source, SPELL_RECENTLY_DROPPED_FLAG, true);
- Source->CastSpell(Source, BG_EY_PLAYER_DROPPED_FLAG_SPELL, true);
+ player->CastSpell(player, SPELL_RECENTLY_DROPPED_FLAG, true);
+ player->CastSpell(player, BG_EY_PLAYER_DROPPED_FLAG_SPELL, true);
//this does not work correctly :((it should remove flag carrier name)
UpdateWorldState(NETHERSTORM_FLAG_STATE_HORDE, BG_EY_FLAG_STATE_WAIT_RESPAWN);
UpdateWorldState(NETHERSTORM_FLAG_STATE_ALLIANCE, BG_EY_FLAG_STATE_WAIT_RESPAWN);
- if (Source->GetTeam() == ALLIANCE)
+ if (player->GetTeam() == ALLIANCE)
SendMessageToAll(LANG_BG_EY_DROPPED_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, NULL);
else
SendMessageToAll(LANG_BG_EY_DROPPED_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, NULL);
}
-void BattlegroundEY::EventPlayerClickedOnFlag(Player* Source, GameObject* target_obj)
+void BattlegroundEY::EventPlayerClickedOnFlag(Player* player, GameObject* target_obj)
{
- if (GetStatus() != STATUS_IN_PROGRESS || IsFlagPickedup() || !Source->IsWithinDistInMap(target_obj, 10))
+ if (GetStatus() != STATUS_IN_PROGRESS || IsFlagPickedup() || !player->IsWithinDistInMap(target_obj, 10))
return;
- if (Source->GetTeam() == ALLIANCE)
+ if (player->GetTeam() == ALLIANCE)
{
UpdateWorldState(NETHERSTORM_FLAG_STATE_ALLIANCE, BG_EY_FLAG_STATE_ON_PLAYER);
PlaySoundToAll(BG_EY_SOUND_FLAG_PICKED_UP_ALLIANCE);
@@ -648,18 +648,18 @@ void BattlegroundEY::EventPlayerClickedOnFlag(Player* Source, GameObject* target
m_FlagState = BG_EY_FLAG_STATE_ON_PLAYER;
SpawnBGObject(BG_EY_OBJECT_FLAG_NETHERSTORM, RESPAWN_ONE_DAY);
- SetFlagPicker(Source->GetGUID());
+ SetFlagPicker(player->GetGUID());
//get flag aura on player
- Source->CastSpell(Source, BG_EY_NETHERSTORM_FLAG_SPELL, true);
- Source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
+ player->CastSpell(player, BG_EY_NETHERSTORM_FLAG_SPELL, true);
+ player->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
- if (Source->GetTeam() == ALLIANCE)
- PSendMessageToAll(LANG_BG_EY_HAS_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, NULL, Source->GetName().c_str());
+ if (player->GetTeam() == ALLIANCE)
+ PSendMessageToAll(LANG_BG_EY_HAS_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_ALLIANCE, NULL, player->GetName().c_str());
else
- PSendMessageToAll(LANG_BG_EY_HAS_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, NULL, Source->GetName().c_str());
+ PSendMessageToAll(LANG_BG_EY_HAS_TAKEN_FLAG, CHAT_MSG_BG_SYSTEM_HORDE, NULL, player->GetName().c_str());
}
-void BattlegroundEY::EventTeamLostPoint(Player* Source, uint32 Point)
+void BattlegroundEY::EventTeamLostPoint(Player* player, uint32 Point)
{
if (GetStatus() != STATUS_IN_PROGRESS)
return;
@@ -695,9 +695,9 @@ void BattlegroundEY::EventTeamLostPoint(Player* Source, uint32 Point)
m_PointState[Point] = EY_POINT_NO_OWNER;
if (Team == ALLIANCE)
- SendMessageToAll(m_LosingPointTypes[Point].MessageIdAlliance, CHAT_MSG_BG_SYSTEM_ALLIANCE, Source);
+ SendMessageToAll(m_LosingPointTypes[Point].MessageIdAlliance, CHAT_MSG_BG_SYSTEM_ALLIANCE, player);
else
- SendMessageToAll(m_LosingPointTypes[Point].MessageIdHorde, CHAT_MSG_BG_SYSTEM_HORDE, Source);
+ SendMessageToAll(m_LosingPointTypes[Point].MessageIdHorde, CHAT_MSG_BG_SYSTEM_HORDE, player);
UpdatePointsIcons(Team, Point);
UpdatePointsCount(Team);
@@ -707,12 +707,12 @@ void BattlegroundEY::EventTeamLostPoint(Player* Source, uint32 Point)
DelCreature(Point + 6);//NULL checks are in DelCreature! 0-5 spirit guides
}
-void BattlegroundEY::EventTeamCapturedPoint(Player* Source, uint32 Point)
+void BattlegroundEY::EventTeamCapturedPoint(Player* player, uint32 Point)
{
if (GetStatus() != STATUS_IN_PROGRESS)
return;
- uint32 Team = Source->GetTeam();
+ uint32 Team = player->GetTeam();
SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType, RESPAWN_ONE_DAY);
SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType + 1, RESPAWN_ONE_DAY);
@@ -739,9 +739,9 @@ void BattlegroundEY::EventTeamCapturedPoint(Player* Source, uint32 Point)
m_PointState[Point] = EY_POINT_UNDER_CONTROL;
if (Team == ALLIANCE)
- SendMessageToAll(m_CapturingPointTypes[Point].MessageIdAlliance, CHAT_MSG_BG_SYSTEM_ALLIANCE, Source);
+ SendMessageToAll(m_CapturingPointTypes[Point].MessageIdAlliance, CHAT_MSG_BG_SYSTEM_ALLIANCE, player);
else
- SendMessageToAll(m_CapturingPointTypes[Point].MessageIdHorde, CHAT_MSG_BG_SYSTEM_HORDE, Source);
+ SendMessageToAll(m_CapturingPointTypes[Point].MessageIdHorde, CHAT_MSG_BG_SYSTEM_HORDE, player);
if (BgCreatures[Point])
DelCreature(Point);
@@ -774,18 +774,18 @@ void BattlegroundEY::EventTeamCapturedPoint(Player* Source, uint32 Point)
}
}
-void BattlegroundEY::EventPlayerCapturedFlag(Player* Source, uint32 BgObjectType)
+void BattlegroundEY::EventPlayerCapturedFlag(Player* player, uint32 BgObjectType)
{
- if (GetStatus() != STATUS_IN_PROGRESS || GetFlagPickerGUID() != Source->GetGUID())
+ if (GetStatus() != STATUS_IN_PROGRESS || GetFlagPickerGUID() != player->GetGUID())
return;
SetFlagPicker(0);
m_FlagState = BG_EY_FLAG_STATE_WAIT_RESPAWN;
- Source->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);
+ player->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);
- Source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
+ player->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
- if (Source->GetTeam() == ALLIANCE)
+ if (player->GetTeam() == ALLIANCE)
PlaySoundToAll(BG_EY_SOUND_FLAG_CAPTURED_ALLIANCE);
else
PlaySoundToAll(BG_EY_SOUND_FLAG_CAPTURED_HORDE);
@@ -796,26 +796,26 @@ void BattlegroundEY::EventPlayerCapturedFlag(Player* Source, uint32 BgObjectType
m_FlagCapturedBgObjectType = BgObjectType;
uint8 team_id = 0;
- if (Source->GetTeam() == ALLIANCE)
+ if (player->GetTeam() == ALLIANCE)
{
team_id = TEAM_ALLIANCE;
- SendMessageToAll(LANG_BG_EY_CAPTURED_FLAG_A, CHAT_MSG_BG_SYSTEM_ALLIANCE, Source);
+ SendMessageToAll(LANG_BG_EY_CAPTURED_FLAG_A, CHAT_MSG_BG_SYSTEM_ALLIANCE, player);
}
else
{
team_id = TEAM_HORDE;
- SendMessageToAll(LANG_BG_EY_CAPTURED_FLAG_H, CHAT_MSG_BG_SYSTEM_HORDE, Source);
+ SendMessageToAll(LANG_BG_EY_CAPTURED_FLAG_H, CHAT_MSG_BG_SYSTEM_HORDE, player);
}
if (m_TeamPointsCount[team_id] > 0)
- AddPoints(Source->GetTeam(), BG_EY_FlagPoints[m_TeamPointsCount[team_id] - 1]);
+ AddPoints(player->GetTeam(), BG_EY_FlagPoints[m_TeamPointsCount[team_id] - 1]);
- UpdatePlayerScore(Source, SCORE_FLAG_CAPTURES, 1);
+ UpdatePlayerScore(player, SCORE_FLAG_CAPTURES, 1);
}
-void BattlegroundEY::UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor)
+void BattlegroundEY::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)
{
- BattlegroundScoreMap::iterator itr = PlayerScores.find(Source->GetGUID());
+ BattlegroundScoreMap::iterator itr = PlayerScores.find(player->GetGUID());
if (itr == PlayerScores.end()) // player not found
return;
@@ -823,10 +823,10 @@ void BattlegroundEY::UpdatePlayerScore(Player* Source, uint32 type, uint32 value
{
case SCORE_FLAG_CAPTURES: // flags captured
((BattlegroundEYScore*)itr->second)->FlagCaptures += value;
- Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, EY_OBJECTIVE_CAPTURE_FLAG);
+ player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, EY_OBJECTIVE_CAPTURE_FLAG);
break;
default:
- Battleground::UpdatePlayerScore(Source, type, value, doAddHonor);
+ Battleground::UpdatePlayerScore(player, type, value, doAddHonor);
break;
}
}
@@ -934,7 +934,7 @@ WorldSafeLocsEntry const* BattlegroundEY::GetClosestGraveYard(Player* player)
return nearestEntry;
}
-bool BattlegroundEY::IsAllNodesConrolledByTeam(uint32 team) const
+bool BattlegroundEY::IsAllNodesControlledByTeam(uint32 team) const
{
uint32 count = 0;
for (int i = 0; i < EY_POINTS_MAX; ++i)
@@ -952,4 +952,4 @@ uint32 BattlegroundEY::GetPrematureWinner()
return HORDE;
return Battleground::GetPrematureWinner();
-} \ No newline at end of file
+}
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
index 72c6a42b5db..f03b458e7ff 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
@@ -24,6 +24,7 @@
enum BG_EY_Misc
{
+ BG_EY_EVENT_START_BATTLE = 13180, // Achievement: Flurry
BG_EY_FLAG_RESPAWN_TIME = (8*IN_MILLISECONDS),
BG_EY_FPOINTS_TICK_TIME = (2*IN_MILLISECONDS)
};
@@ -219,8 +220,6 @@ enum EYBattlegroundObjectTypes
#define BG_EY_NotEYWeekendHonorTicks 260
#define BG_EY_EYWeekendHonorTicks 160
-#define EY_EVENT_START_BATTLE 13180 // Achievement: Flurry
-
enum BG_EY_Score
{
BG_EY_WARNING_NEAR_VICTORY_SCORE = 1400,
@@ -368,7 +367,7 @@ class BattlegroundEY : public Battleground
void EventPlayerDroppedFlag(Player* Source);
/* achievement req. */
- bool IsAllNodesConrolledByTeam(uint32 team) const;
+ bool IsAllNodesControlledByTeam(uint32 team) const;
uint32 GetPrematureWinner();
private:
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
index d9708ac5d84..6fc68c62d1f 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
@@ -84,7 +84,7 @@ void BattlegroundIC::SendTransportInit(Player* player)
WorldPacket packet;
transData.BuildPacket(&packet);
- player->GetSession()->SendPacket(&packet);
+ player->SendDirectMessage(&packet);
}
void BattlegroundIC::DoAction(uint32 action, uint64 var)
@@ -290,19 +290,6 @@ void BattlegroundIC::StartingEventOpenDoors()
}
}
-bool BattlegroundIC::IsAllNodesConrolledByTeam(uint32 team) const
-{
- uint32 count = 0;
- ICNodeState controlledState = team == ALLIANCE ? NODE_STATE_CONTROLLED_A : NODE_STATE_CONTROLLED_H;
- for (int i = 0; i < NODE_TYPE_WORKSHOP; ++i)
- {
- if (nodePoint[i].nodeState == controlledState)
- ++count;
- }
-
- return count == NODE_TYPE_WORKSHOP;
-}
-
void BattlegroundIC::AddPlayer(Player* player)
{
Battleground::AddPlayer(player);
@@ -326,16 +313,32 @@ void BattlegroundIC::RemovePlayer(Player* player, uint64 /*guid*/, uint32 /*team
}
}
-void BattlegroundIC::HandleAreaTrigger(Player* /*Source*/, uint32 /*Trigger*/)
+void BattlegroundIC::HandleAreaTrigger(Player* player, uint32 trigger)
{
// this is wrong way to implement these things. On official it done by gameobject spell cast.
if (GetStatus() != STATUS_IN_PROGRESS)
return;
+
+ /// @hack: this spell should be cast by npc 22515 (World Trigger) and not by the player
+ if (trigger == 5555 && player->GetTeamId() == TEAM_HORDE)
+ {
+ if (GateStatus[BG_IC_A_FRONT] != BG_IC_GATE_DESTROYED
+ && GateStatus[BG_IC_A_WEST] != BG_IC_GATE_DESTROYED
+ && GateStatus[BG_IC_A_EAST] != BG_IC_GATE_DESTROYED)
+ player->CastSpell(player, SPELL_BACK_DOOR_JOB_ACHIEVEMENT, true);
+ }
+ else if (trigger == 5535 && player->GetTeamId() == TEAM_ALLIANCE)
+ {
+ if (GateStatus[BG_IC_H_FRONT] != BG_IC_GATE_DESTROYED
+ && GateStatus[BG_IC_H_WEST] != BG_IC_GATE_DESTROYED
+ && GateStatus[BG_IC_H_EAST] != BG_IC_GATE_DESTROYED)
+ player->CastSpell(player, SPELL_BACK_DOOR_JOB_ACHIEVEMENT, true);
+ }
}
-void BattlegroundIC::UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor)
+void BattlegroundIC::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)
{
- std::map<uint64, BattlegroundScore*>::iterator itr = PlayerScores.find(Source->GetGUID());
+ std::map<uint64, BattlegroundScore*>::iterator itr = PlayerScores.find(player->GetGUID());
if (itr == PlayerScores.end()) // player not found...
return;
@@ -349,7 +352,7 @@ void BattlegroundIC::UpdatePlayerScore(Player* Source, uint32 type, uint32 value
((BattlegroundICScore*)itr->second)->BasesDefended += value;
break;
default:
- Battleground::UpdatePlayerScore(Source, type, value, doAddHonor);
+ Battleground::UpdatePlayerScore(player, type, value, doAddHonor);
break;
}
}
@@ -872,8 +875,8 @@ WorldSafeLocsEntry const* BattlegroundIC::GetClosestGraveYard(Player* player)
// If so, select the closest node to place ghost on
if (!nodes.empty())
{
- float plr_x = player->GetPositionX();
- float plr_y = player->GetPositionY();
+ float player_x = player->GetPositionX();
+ float player_y = player->GetPositionY();
float mindist = 999999.0f;
for (uint8 i = 0; i < nodes.size(); ++i)
@@ -881,7 +884,7 @@ WorldSafeLocsEntry const* BattlegroundIC::GetClosestGraveYard(Player* player)
WorldSafeLocsEntry const*entry = sWorldSafeLocsStore.LookupEntry(BG_IC_GraveyardIds[nodes[i]]);
if (!entry)
continue;
- float dist = (entry->x - plr_x)*(entry->x - plr_x)+(entry->y - plr_y)*(entry->y - plr_y);
+ float dist = (entry->x - player_x)*(entry->x - player_x)+(entry->y - player_y)*(entry->y - player_y);
if (mindist > dist)
{
mindist = dist;
@@ -942,3 +945,35 @@ Transport* BattlegroundIC::CreateTransport(uint32 goEntry, uint32 period)
return t;
}
+
+bool BattlegroundIC::IsAllNodesControlledByTeam(uint32 team) const
+{
+ uint32 count = 0;
+ ICNodeState controlledState = team == ALLIANCE ? NODE_STATE_CONTROLLED_A : NODE_STATE_CONTROLLED_H;
+ for (int i = 0; i < NODE_TYPE_WORKSHOP; ++i)
+ {
+ if (nodePoint[i].nodeState == controlledState)
+ ++count;
+ }
+
+ return count == NODE_TYPE_WORKSHOP;
+}
+
+bool BattlegroundIC::IsSpellAllowed(uint32 spellId, Player const* player) const
+{
+ switch (spellId)
+ {
+ case SPELL_OIL_REFINERY:
+ case SPELL_QUARRY:
+ {
+ uint32 team = player->GetTeamId();
+ uint8 nodeType = spellId = SPELL_OIL_REFINERY ? NODE_TYPE_REFINERY : NODE_TYPE_QUARRY;
+ uint8 nodeState = team == TEAM_ALLIANCE ? NODE_STATE_CONTROLLED_A : NODE_STATE_CONTROLLED_H;
+ return GetNodeState(nodeType) == nodeState;
+ }
+ default:
+ break;
+ }
+
+ return true;
+} \ No newline at end of file
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h
index f25fbe297b3..34d03a5d92c 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h
@@ -661,6 +661,7 @@ enum Spells
SPELL_PARACHUTE = 66656,
SPELL_SLOW_FALL = 12438,
SPELL_DESTROYED_VEHICLE_ACHIEVEMENT = 68357,
+ SPELL_BACK_DOOR_JOB_ACHIEVEMENT = 68502,
SPELL_DRIVING_CREDIT_DEMOLISHER = 68365,
SPELL_DRIVING_CREDIT_GLAIVE = 68363,
SPELL_DRIVING_CREDIT_SIEGE = 68364,
@@ -867,7 +868,7 @@ class BattlegroundIC : public Battleground
void PostUpdateImpl(uint32 diff);
void RemovePlayer(Player* player, uint64 guid, uint32 team);
- void HandleAreaTrigger(Player* Source, uint32 Trigger);
+ void HandleAreaTrigger(Player* player, uint32 trigger);
bool SetupBattleground();
void SpawnLeader(uint32 teamid);
void HandleKillUnit(Creature* unit, Player* killer);
@@ -881,7 +882,7 @@ class BattlegroundIC : public Battleground
WorldSafeLocsEntry const* GetClosestGraveYard(Player* player);
/* Scorekeeping */
- void UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor = true);
+ void UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true);
void FillInitialWorldStates(WorldPacket& data);
@@ -891,7 +892,9 @@ class BattlegroundIC : public Battleground
uint32 GetNodeState(uint8 nodeType) const { return (uint8)nodePoint[nodeType].nodeState; }
- bool IsAllNodesConrolledByTeam(uint32 team) const; // overwrited
+ bool IsAllNodesControlledByTeam(uint32 team) const;
+
+ bool IsSpellAllowed(uint32 spellId, Player const* player) const;
private:
uint32 closeFortressDoorsTimer;
bool doorsClosed;
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
index 0ca5b933317..d13fc6d697b 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
@@ -56,8 +56,8 @@ void BattlegroundSA::Reset()
GateStatus[i] = BG_SA_GATE_OK;
ShipsStarted = false;
gateDestroyed = false;
- _notEvenAScratch[TEAM_ALLIANCE] = true;
- _notEvenAScratch[TEAM_HORDE] = true;
+ _allVehiclesAlive[TEAM_ALLIANCE] = true;
+ _allVehiclesAlive[TEAM_HORDE] = true;
Status = BG_SA_WARMUP;
}
@@ -274,7 +274,7 @@ void BattlegroundSA::StartShips()
WorldPacket pkt;
GetBGObject(i)->BuildValuesUpdateBlockForPlayer(&data, p);
data.BuildPacket(&pkt);
- p->GetSession()->SendPacket(&pkt);
+ p->SendDirectMessage(&pkt);
}
}
}
@@ -566,7 +566,7 @@ void BattlegroundSA::HandleKillUnit(Creature* creature, Player* killer)
if (creature->GetEntry() == NPC_DEMOLISHER_SA)
{
UpdatePlayerScore(killer, SCORE_DESTROYED_DEMOLISHER, 1);
- _notEvenAScratch[Attackers] = false;
+ _allVehiclesAlive[Attackers] = false;
}
}
@@ -947,7 +947,7 @@ void BattlegroundSA::SendTransportInit(Player* player)
GetBGObject(BG_SA_BOAT_TWO)->BuildCreateUpdateBlockForPlayer(&transData, player);
WorldPacket packet;
transData.BuildPacket(&packet);
- player->GetSession()->SendPacket(&packet);
+ player->SendDirectMessage(&packet);
}
}
@@ -962,6 +962,20 @@ void BattlegroundSA::SendTransportsRemove(Player* player)
GetBGObject(BG_SA_BOAT_TWO)->BuildOutOfRangeUpdateBlock(&transData);
WorldPacket packet;
transData.BuildPacket(&packet);
- player->GetSession()->SendPacket(&packet);
+ player->SendDirectMessage(&packet);
}
}
+
+bool BattlegroundSA::CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* source, Unit const* target, uint32 miscValue)
+{
+ switch (criteriaId)
+ {
+ case BG_CRITERIA_CHECK_NOT_EVEN_A_SCRATCH:
+ return _allVehiclesAlive[GetTeamIndexByTeamId(source->GetTeam())];
+ case BG_CRITERIA_CHECK_DEFENSE_OF_THE_ANCIENTS:
+ if (source->GetTeamId() != Attackers && !gateDestroyed)
+ return true;
+ }
+
+ return Battleground::CheckAchievementCriteriaMeet(criteriaId, source, target, miscValue);
+}
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h
index aa3106d237f..c50721c4591 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h
@@ -543,7 +543,7 @@ class BattlegroundSA : public Battleground
bool gateDestroyed;
// Achievement: Not Even a Scratch
- bool notEvenAScratch(uint32 team) const { return _notEvenAScratch[GetTeamIndexByTeamId(team)]; }
+ bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0);
/// Id of attacker team
TeamId Attackers;
@@ -627,6 +627,6 @@ class BattlegroundSA : public Battleground
std::map<uint32/*id*/, uint32/*timer*/> DemoliserRespawnList;
// Achievement: Not Even a Scratch
- bool _notEvenAScratch[BG_TEAMS_COUNT];
+ bool _allVehiclesAlive[BG_TEAMS_COUNT];
};
#endif
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
index 03027b8500f..419a4eff84c 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
@@ -274,15 +274,15 @@ void BattlegroundWS::RespawnFlagAfterDrop(uint32 team)
_bothFlagsKept = false;
}
-void BattlegroundWS::EventPlayerCapturedFlag(Player* Source)
+void BattlegroundWS::EventPlayerCapturedFlag(Player* player)
{
if (GetStatus() != STATUS_IN_PROGRESS)
return;
uint32 winner = 0;
- Source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
- if (Source->GetTeam() == ALLIANCE)
+ player->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
+ if (player->GetTeam() == ALLIANCE)
{
if (!IsHordeFlagPickedup())
return;
@@ -290,11 +290,12 @@ void BattlegroundWS::EventPlayerCapturedFlag(Player* Source)
// horde flag in base (but not respawned yet)
_flagState[TEAM_HORDE] = BG_WS_FLAG_STATE_WAIT_RESPAWN;
// Drop Horde Flag from Player
- Source->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG);
+ player->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG);
if (_flagDebuffState == 1)
- Source->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);
- if (_flagDebuffState == 2)
- Source->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);
+ player->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);
+ else if (_flagDebuffState == 2)
+ player->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);
+
if (GetTeamScore(TEAM_ALLIANCE) < BG_WS_MAX_TEAM_SCORE)
AddPoint(ALLIANCE, 1);
PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_ALLIANCE);
@@ -308,34 +309,35 @@ void BattlegroundWS::EventPlayerCapturedFlag(Player* Source)
// alliance flag in base (but not respawned yet)
_flagState[TEAM_ALLIANCE] = BG_WS_FLAG_STATE_WAIT_RESPAWN;
// Drop Alliance Flag from Player
- Source->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG);
+ player->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG);
if (_flagDebuffState == 1)
- Source->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);
- if (_flagDebuffState == 2)
- Source->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);
+ player->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);
+ else if (_flagDebuffState == 2)
+ player->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);
+
if (GetTeamScore(TEAM_HORDE) < BG_WS_MAX_TEAM_SCORE)
AddPoint(HORDE, 1);
PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_HORDE);
RewardReputationToTeam(889, m_ReputationCapture, HORDE);
}
//for flag capture is reward 2 honorable kills
- RewardHonorToTeam(GetBonusHonorFromKill(2), Source->GetTeam());
+ RewardHonorToTeam(GetBonusHonorFromKill(2), player->GetTeam());
SpawnBGObject(BG_WS_OBJECT_H_FLAG, BG_WS_FLAG_RESPAWN_TIME);
SpawnBGObject(BG_WS_OBJECT_A_FLAG, BG_WS_FLAG_RESPAWN_TIME);
- if (Source->GetTeam() == ALLIANCE)
- SendMessageToAll(LANG_BG_WS_CAPTURED_HF, CHAT_MSG_BG_SYSTEM_ALLIANCE, Source);
+ if (player->GetTeam() == ALLIANCE)
+ SendMessageToAll(LANG_BG_WS_CAPTURED_HF, CHAT_MSG_BG_SYSTEM_ALLIANCE, player);
else
- SendMessageToAll(LANG_BG_WS_CAPTURED_AF, CHAT_MSG_BG_SYSTEM_HORDE, Source);
+ SendMessageToAll(LANG_BG_WS_CAPTURED_AF, CHAT_MSG_BG_SYSTEM_HORDE, player);
- UpdateFlagState(Source->GetTeam(), 1); // flag state none
- UpdateTeamScore(Source->GetTeamId());
+ UpdateFlagState(player->GetTeam(), 1); // flag state none
+ UpdateTeamScore(player->GetTeamId());
// only flag capture should be updated
- UpdatePlayerScore(Source, SCORE_FLAG_CAPTURES, 1); // +1 flag captures
+ UpdatePlayerScore(player, SCORE_FLAG_CAPTURES, 1); // +1 flag captures
// update last flag capture to be used if teamscore is equal
- SetLastFlagCapture(Source->GetTeam());
+ SetLastFlagCapture(player->GetTeam());
if (GetTeamScore(TEAM_ALLIANCE) == BG_WS_MAX_TEAM_SCORE)
winner = ALLIANCE;
@@ -356,34 +358,36 @@ void BattlegroundWS::EventPlayerCapturedFlag(Player* Source)
}
else
{
- _flagsTimer[GetTeamIndexByTeamId(Source->GetTeam()) ? 0 : 1] = BG_WS_FLAG_RESPAWN_TIME;
+ _flagsTimer[GetTeamIndexByTeamId(player->GetTeam()) ? 0 : 1] = BG_WS_FLAG_RESPAWN_TIME;
}
}
-void BattlegroundWS::EventPlayerDroppedFlag(Player* Source)
+void BattlegroundWS::EventPlayerDroppedFlag(Player* player)
{
if (GetStatus() != STATUS_IN_PROGRESS)
{
// if not running, do not cast things at the dropper player (prevent spawning the "dropped" flag), neither send unnecessary messages
// just take off the aura
- if (Source->GetTeam() == ALLIANCE)
+ if (player->GetTeam() == ALLIANCE)
{
if (!IsHordeFlagPickedup())
return;
- if (GetFlagPickerGUID(TEAM_HORDE) == Source->GetGUID())
+
+ if (GetFlagPickerGUID(TEAM_HORDE) == player->GetGUID())
{
SetHordeFlagPicker(0);
- Source->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG);
+ player->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG);
}
}
else
{
if (!IsAllianceFlagPickedup())
return;
- if (GetFlagPickerGUID(TEAM_ALLIANCE) == Source->GetGUID())
+
+ if (GetFlagPickerGUID(TEAM_ALLIANCE) == player->GetGUID())
{
SetAllianceFlagPicker(0);
- Source->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG);
+ player->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG);
}
}
return;
@@ -391,20 +395,20 @@ void BattlegroundWS::EventPlayerDroppedFlag(Player* Source)
bool set = false;
- if (Source->GetTeam() == ALLIANCE)
+ if (player->GetTeam() == ALLIANCE)
{
if (!IsHordeFlagPickedup())
return;
- if (GetFlagPickerGUID(TEAM_HORDE) == Source->GetGUID())
+ if (GetFlagPickerGUID(TEAM_HORDE) == player->GetGUID())
{
SetHordeFlagPicker(0);
- Source->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG);
+ player->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG);
if (_flagDebuffState == 1)
- Source->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);
- if (_flagDebuffState == 2)
- Source->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);
+ player->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);
+ else if (_flagDebuffState == 2)
+ player->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);
_flagState[TEAM_HORDE] = BG_WS_FLAG_STATE_ON_GROUND;
- Source->CastSpell(Source, BG_WS_SPELL_WARSONG_FLAG_DROPPED, true);
+ player->CastSpell(player, BG_WS_SPELL_WARSONG_FLAG_DROPPED, true);
set = true;
}
}
@@ -412,41 +416,41 @@ void BattlegroundWS::EventPlayerDroppedFlag(Player* Source)
{
if (!IsAllianceFlagPickedup())
return;
- if (GetFlagPickerGUID(TEAM_ALLIANCE) == Source->GetGUID())
+ if (GetFlagPickerGUID(TEAM_ALLIANCE) == player->GetGUID())
{
SetAllianceFlagPicker(0);
- Source->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG);
+ player->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG);
if (_flagDebuffState == 1)
- Source->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);
- if (_flagDebuffState == 2)
- Source->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);
+ player->RemoveAurasDueToSpell(WS_SPELL_FOCUSED_ASSAULT);
+ else if (_flagDebuffState == 2)
+ player->RemoveAurasDueToSpell(WS_SPELL_BRUTAL_ASSAULT);
_flagState[TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_GROUND;
- Source->CastSpell(Source, BG_WS_SPELL_SILVERWING_FLAG_DROPPED, true);
+ player->CastSpell(player, BG_WS_SPELL_SILVERWING_FLAG_DROPPED, true);
set = true;
}
}
if (set)
{
- Source->CastSpell(Source, SPELL_RECENTLY_DROPPED_FLAG, true);
- UpdateFlagState(Source->GetTeam(), 1);
+ player->CastSpell(player, SPELL_RECENTLY_DROPPED_FLAG, true);
+ UpdateFlagState(player->GetTeam(), 1);
- if (Source->GetTeam() == ALLIANCE)
+ if (player->GetTeam() == ALLIANCE)
{
- SendMessageToAll(LANG_BG_WS_DROPPED_HF, CHAT_MSG_BG_SYSTEM_HORDE, Source);
+ SendMessageToAll(LANG_BG_WS_DROPPED_HF, CHAT_MSG_BG_SYSTEM_HORDE, player);
UpdateWorldState(BG_WS_FLAG_UNK_HORDE, uint32(-1));
}
else
{
- SendMessageToAll(LANG_BG_WS_DROPPED_AF, CHAT_MSG_BG_SYSTEM_ALLIANCE, Source);
+ SendMessageToAll(LANG_BG_WS_DROPPED_AF, CHAT_MSG_BG_SYSTEM_ALLIANCE, player);
UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, uint32(-1));
}
- _flagsDropTimer[GetTeamIndexByTeamId(Source->GetTeam()) ? 0 : 1] = BG_WS_FLAG_DROP_TIME;
+ _flagsDropTimer[GetTeamIndexByTeamId(player->GetTeam()) ? 0 : 1] = BG_WS_FLAG_DROP_TIME;
}
}
-void BattlegroundWS::EventPlayerClickedOnFlag(Player* Source, GameObject* target_obj)
+void BattlegroundWS::EventPlayerClickedOnFlag(Player* player, GameObject* target_obj)
{
if (GetStatus() != STATUS_IN_PROGRESS)
return;
@@ -455,48 +459,48 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* Source, GameObject* target
ChatMsg type = CHAT_MSG_BG_SYSTEM_NEUTRAL;
//alliance flag picked up from base
- if (Source->GetTeam() == HORDE && GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_BASE
+ if (player->GetTeam() == HORDE && GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_BASE
&& BgObjects[BG_WS_OBJECT_A_FLAG] == target_obj->GetGUID())
{
message_id = LANG_BG_WS_PICKEDUP_AF;
type = CHAT_MSG_BG_SYSTEM_HORDE;
PlaySoundToAll(BG_WS_SOUND_ALLIANCE_FLAG_PICKED_UP);
SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_ONE_DAY);
- SetAllianceFlagPicker(Source->GetGUID());
+ SetAllianceFlagPicker(player->GetGUID());
_flagState[TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_PLAYER;
//update world state to show correct flag carrier
UpdateFlagState(HORDE, BG_WS_FLAG_STATE_ON_PLAYER);
UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 1);
- Source->CastSpell(Source, BG_WS_SPELL_SILVERWING_FLAG, true);
- Source->StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_SILVERWING_FLAG_PICKED);
+ player->CastSpell(player, BG_WS_SPELL_SILVERWING_FLAG, true);
+ player->StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_SILVERWING_FLAG_PICKED);
if (_flagState[1] == BG_WS_FLAG_STATE_ON_PLAYER)
_bothFlagsKept = true;
}
//horde flag picked up from base
- if (Source->GetTeam() == ALLIANCE && GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_BASE
+ if (player->GetTeam() == ALLIANCE && GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_BASE
&& BgObjects[BG_WS_OBJECT_H_FLAG] == target_obj->GetGUID())
{
message_id = LANG_BG_WS_PICKEDUP_HF;
type = CHAT_MSG_BG_SYSTEM_ALLIANCE;
PlaySoundToAll(BG_WS_SOUND_HORDE_FLAG_PICKED_UP);
SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_ONE_DAY);
- SetHordeFlagPicker(Source->GetGUID());
+ SetHordeFlagPicker(player->GetGUID());
_flagState[TEAM_HORDE] = BG_WS_FLAG_STATE_ON_PLAYER;
//update world state to show correct flag carrier
UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_ON_PLAYER);
UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 1);
- Source->CastSpell(Source, BG_WS_SPELL_WARSONG_FLAG, true);
- Source->StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_WARSONG_FLAG_PICKED);
+ player->CastSpell(player, BG_WS_SPELL_WARSONG_FLAG, true);
+ player->StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_WARSONG_FLAG_PICKED);
if (_flagState[0] == BG_WS_FLAG_STATE_ON_PLAYER)
_bothFlagsKept = true;
}
//Alliance flag on ground(not in base) (returned or picked up again from ground!)
- if (GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_GROUND && Source->IsWithinDistInMap(target_obj, 10)
+ if (GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_GROUND && player->IsWithinDistInMap(target_obj, 10)
&& target_obj->GetGOInfo()->entry == BG_OBJECT_A_FLAG_GROUND_WS_ENTRY)
{
- if (Source->GetTeam() == ALLIANCE)
+ if (player->GetTeam() == ALLIANCE)
{
message_id = LANG_BG_WS_RETURNED_AF;
type = CHAT_MSG_BG_SYSTEM_ALLIANCE;
@@ -504,7 +508,7 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* Source, GameObject* target
RespawnFlag(ALLIANCE, false);
SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_IMMEDIATELY);
PlaySoundToAll(BG_WS_SOUND_FLAG_RETURNED);
- UpdatePlayerScore(Source, SCORE_FLAG_RETURNS, 1);
+ UpdatePlayerScore(player, SCORE_FLAG_RETURNS, 1);
_bothFlagsKept = false;
}
else
@@ -513,14 +517,14 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* Source, GameObject* target
type = CHAT_MSG_BG_SYSTEM_HORDE;
PlaySoundToAll(BG_WS_SOUND_ALLIANCE_FLAG_PICKED_UP);
SpawnBGObject(BG_WS_OBJECT_A_FLAG, RESPAWN_ONE_DAY);
- SetAllianceFlagPicker(Source->GetGUID());
- Source->CastSpell(Source, BG_WS_SPELL_SILVERWING_FLAG, true);
+ SetAllianceFlagPicker(player->GetGUID());
+ player->CastSpell(player, BG_WS_SPELL_SILVERWING_FLAG, true);
_flagState[TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_PLAYER;
UpdateFlagState(HORDE, BG_WS_FLAG_STATE_ON_PLAYER);
if (_flagDebuffState == 1)
- Source->CastSpell(Source, WS_SPELL_FOCUSED_ASSAULT, true);
- if (_flagDebuffState == 2)
- Source->CastSpell(Source, WS_SPELL_BRUTAL_ASSAULT, true);
+ player->CastSpell(player, WS_SPELL_FOCUSED_ASSAULT, true);
+ else if (_flagDebuffState == 2)
+ player->CastSpell(player, WS_SPELL_BRUTAL_ASSAULT, true);
UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 1);
}
//called in HandleGameObjectUseOpcode:
@@ -528,10 +532,10 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* Source, GameObject* target
}
//Horde flag on ground(not in base) (returned or picked up again)
- if (GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_GROUND && Source->IsWithinDistInMap(target_obj, 10)
+ if (GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_GROUND && player->IsWithinDistInMap(target_obj, 10)
&& target_obj->GetGOInfo()->entry == BG_OBJECT_H_FLAG_GROUND_WS_ENTRY)
{
- if (Source->GetTeam() == HORDE)
+ if (player->GetTeam() == HORDE)
{
message_id = LANG_BG_WS_RETURNED_HF;
type = CHAT_MSG_BG_SYSTEM_HORDE;
@@ -539,7 +543,7 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* Source, GameObject* target
RespawnFlag(HORDE, false);
SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_IMMEDIATELY);
PlaySoundToAll(BG_WS_SOUND_FLAG_RETURNED);
- UpdatePlayerScore(Source, SCORE_FLAG_RETURNS, 1);
+ UpdatePlayerScore(player, SCORE_FLAG_RETURNS, 1);
_bothFlagsKept = false;
}
else
@@ -548,14 +552,14 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* Source, GameObject* target
type = CHAT_MSG_BG_SYSTEM_ALLIANCE;
PlaySoundToAll(BG_WS_SOUND_HORDE_FLAG_PICKED_UP);
SpawnBGObject(BG_WS_OBJECT_H_FLAG, RESPAWN_ONE_DAY);
- SetHordeFlagPicker(Source->GetGUID());
- Source->CastSpell(Source, BG_WS_SPELL_WARSONG_FLAG, true);
+ SetHordeFlagPicker(player->GetGUID());
+ player->CastSpell(player, BG_WS_SPELL_WARSONG_FLAG, true);
_flagState[TEAM_HORDE] = BG_WS_FLAG_STATE_ON_PLAYER;
UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_ON_PLAYER);
if (_flagDebuffState == 1)
- Source->CastSpell(Source, WS_SPELL_FOCUSED_ASSAULT, true);
- if (_flagDebuffState == 2)
- Source->CastSpell(Source, WS_SPELL_BRUTAL_ASSAULT, true);
+ player->CastSpell(player, WS_SPELL_FOCUSED_ASSAULT, true);
+ else if (_flagDebuffState == 2)
+ player->CastSpell(player, WS_SPELL_BRUTAL_ASSAULT, true);
UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 1);
}
//called in HandleGameObjectUseOpcode:
@@ -565,8 +569,8 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* Source, GameObject* target
if (!message_id)
return;
- SendMessageToAll(message_id, type, Source);
- Source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
+ SendMessageToAll(message_id, type, player);
+ player->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
}
void BattlegroundWS::RemovePlayer(Player* player, uint64 guid, uint32 /*team*/)
@@ -660,7 +664,7 @@ void BattlegroundWS::HandleAreaTrigger(Player* player, uint32 trigger)
}
//if (buff_guid)
- // HandleTriggerBuff(buff_guid, Source);
+ // HandleTriggerBuff(buff_guid, player);
}
bool BattlegroundWS::SetupBattleground()
@@ -773,9 +777,9 @@ void BattlegroundWS::HandleKillPlayer(Player* player, Player* killer)
Battleground::HandleKillPlayer(player, killer);
}
-void BattlegroundWS::UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor)
+void BattlegroundWS::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)
{
- BattlegroundScoreMap::iterator itr = PlayerScores.find(Source->GetGUID());
+ BattlegroundScoreMap::iterator itr = PlayerScores.find(player->GetGUID());
if (itr == PlayerScores.end()) // player not found
return;
@@ -783,14 +787,14 @@ void BattlegroundWS::UpdatePlayerScore(Player* Source, uint32 type, uint32 value
{
case SCORE_FLAG_CAPTURES: // flags captured
((BattlegroundWGScore*)itr->second)->FlagCaptures += value;
- Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_CAPTURE_FLAG);
+ player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_CAPTURE_FLAG);
break;
case SCORE_FLAG_RETURNS: // flags returned
((BattlegroundWGScore*)itr->second)->FlagReturns += value;
- Source->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_RETURN_FLAG);
+ player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_RETURN_FLAG);
break;
default:
- Battleground::UpdatePlayerScore(Source, type, value, doAddHonor);
+ Battleground::UpdatePlayerScore(player, type, value, doAddHonor);
break;
}
}
@@ -867,3 +871,16 @@ uint32 BattlegroundWS::GetPrematureWinner()
return Battleground::GetPrematureWinner();
}
+
+bool BattlegroundWS::CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* player, Unit const* target, uint32 miscValue)
+{
+ switch (criteriaId)
+ {
+ case BG_CRITERIA_CHECK_SAVE_THE_DAY:
+ if (GetFlagState(player->GetTeam()) == BG_WS_FLAG_STATE_ON_BASE)
+ return true;
+ break;
+ }
+
+ return Battleground::CheckAchievementCriteriaMeet(criteriaId, player, target, miscValue);
+}
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h
index 3501999963f..4b95fcf6afd 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h
@@ -182,12 +182,12 @@ class BattlegroundWS : public Battleground
uint8 GetFlagState(uint32 team) { return _flagState[GetTeamIndexByTeamId(team)]; }
/* Battleground Events */
- void EventPlayerDroppedFlag(Player* Source);
- void EventPlayerClickedOnFlag(Player* Source, GameObject* target_obj);
- void EventPlayerCapturedFlag(Player* Source);
+ void EventPlayerDroppedFlag(Player* player);
+ void EventPlayerClickedOnFlag(Player* player, GameObject* target_obj);
+ void EventPlayerCapturedFlag(Player* player);
void RemovePlayer(Player* player, uint64 guid, uint32 team);
- void HandleAreaTrigger(Player* Source, uint32 Trigger);
+ void HandleAreaTrigger(Player* player, uint32 trigger);
void HandleKillPlayer(Player* player, Player* killer);
bool SetupBattleground();
void Reset();
@@ -197,7 +197,7 @@ class BattlegroundWS : public Battleground
void UpdateFlagState(uint32 team, uint32 value);
void SetLastFlagCapture(uint32 team) { _lastFlagCaptureTeam = team; }
void UpdateTeamScore(uint32 team);
- void UpdatePlayerScore(Player* Source, uint32 type, uint32 value, bool doAddHonor = true);
+ void UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true);
void SetDroppedFlagGUID(uint64 guid, int32 team = -1)
{
if (team == TEAM_ALLIANCE || team == TEAM_HORDE)
@@ -213,6 +213,10 @@ class BattlegroundWS : public Battleground
void RemovePoint(uint32 TeamID, uint32 Points = 1) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] -= Points; }
uint32 GetPrematureWinner();
+
+ /* Achievements*/
+ bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0);
+
private:
uint64 m_FlagKeepers[2]; // 0 - alliance, 1 - horde
uint64 m_DroppedFlagGUID[2];
diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h
index 8ef085d2d3c..07eab29e53a 100644
--- a/src/server/game/Conditions/ConditionMgr.h
+++ b/src/server/game/Conditions/ConditionMgr.h
@@ -160,7 +160,7 @@ enum InstanceInfo
INSTANCE_INFO_BOSS_STATE
};
-enum
+enum MaxConditionTargets
{
MAX_CONDITION_TARGETS = 3
};
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index ebf174fdd8a..9579165d712 100644
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -447,7 +447,7 @@ void LFGMgr::InitializeLockedDungeons(Player* player, uint8 level /* = 0 */)
void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const std::string& comment)
{
if (!player || !player->GetSession() || dungeons.empty())
- return;
+ return;
Group* grp = player->GetGroup();
uint64 guid = player->GetGUID();
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 0915d19cdfa..906c1f281bc 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -17,7 +17,7 @@
*/
#include "GameObjectAI.h"
-#include "BattlegroundAV.h"
+#include "Battleground.h"
#include "CellImpl.h"
#include "CreatureAISelector.h"
#include "DynamicTree.h"
@@ -324,7 +324,7 @@ void GameObject::Update(uint32 diff)
WorldPacket packet;
BuildValuesUpdateBlockForPlayer(&udata, caster->ToPlayer());
udata.BuildPacket(&packet);
- caster->ToPlayer()->GetSession()->SendPacket(&packet);
+ caster->ToPlayer()->SendDirectMessage(&packet);
SendCustomAnim(GetGoAnimProgress());
}
@@ -373,7 +373,7 @@ void GameObject::Update(uint32 diff)
caster->ToPlayer()->RemoveGameObject(this, false);
WorldPacket data(SMSG_FISH_ESCAPED, 0);
- caster->ToPlayer()->GetSession()->SendPacket(&data);
+ caster->ToPlayer()->SendDirectMessage(&data);
}
// can be delete
m_lootState = GO_JUST_DEACTIVATED;
@@ -872,7 +872,9 @@ bool GameObject::IsDynTransport() const
bool GameObject::IsDestructibleBuilding() const
{
GameObjectTemplate const* gInfo = GetGOInfo();
- if (!gInfo) return false;
+ if (!gInfo)
+ return false;
+
return gInfo->type == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING;
}
@@ -948,12 +950,8 @@ bool GameObject::ActivateToQuest(Player* target) const
{
if (LootTemplates_Gameobject.HaveQuestLootForPlayer(GetGOInfo()->GetLootId(), target))
{
- /// @todo fix this hack
- //look for battlegroundAV for some objects which are only activated after mine gots captured by own team
- if (GetEntry() == BG_AV_OBJECTID_MINE_N || GetEntry() == BG_AV_OBJECTID_MINE_S)
- if (Battleground* bg = target->GetBattleground())
- if (bg->GetTypeID(true) == BATTLEGROUND_AV && !(((BattlegroundAV*)bg)->PlayerCanDoMineQuest(GetEntry(), target->GetTeam())))
- return false;
+ if (Battleground const* bg = target->GetBattleground())
+ return bg->CanActivateGO(GetEntry(), target->GetTeam());
return true;
}
break;
@@ -1242,7 +1240,7 @@ void GameObject::Use(Unit* user)
{
WorldPacket data(SMSG_GAMEOBJECT_PAGETEXT, 8);
data << GetGUID();
- player->GetSession()->SendPacket(&data);
+ player->SendDirectMessage(&data);
}
else if (info->goober.gossipID)
{
@@ -1384,7 +1382,7 @@ void GameObject::Use(Unit* user)
SetLootState(GO_JUST_DEACTIVATED);
WorldPacket data(SMSG_FISH_NOT_HOOKED, 0);
- player->GetSession()->SendPacket(&data);
+ player->SendDirectMessage(&data);
break;
}
}
@@ -1647,7 +1645,7 @@ void GameObject::Use(Unit* user)
player->TeleportTo(GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation(), TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET);
WorldPacket data(SMSG_ENABLE_BARBER_SHOP, 0);
- player->GetSession()->SendPacket(&data);
+ player->SendDirectMessage(&data);
player->SetStandState(UNIT_STAND_STATE_SIT_LOW_CHAIR+info->barberChair.chairheight);
return;
@@ -1843,7 +1841,7 @@ void GameObject::ModifyHealth(int32 change, Unit* attackerOrHealer /*= NULL*/, u
data << uint32(-change); // change < 0 triggers SPELL_BUILDING_HEAL combat log event
// change >= 0 triggers SPELL_BUILDING_DAMAGE event
data << uint32(spellId);
- player->GetSession()->SendPacket(&data);
+ player->SendDirectMessage(&data);
}
GameObjectDestructibleState newState = GetDestructibleState();
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index d87e1e8fbbc..ed4341dea8a 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -1278,7 +1278,7 @@ void Item::ItemContainerSaveLootToDB()
stmt_items->setBool(6, _li->is_counted);
stmt_items->setBool(7, _li->is_underthreshold);
stmt_items->setBool(8, _li->needs_quest);
- stmt_items->setUInt32(9, _li->randomPropertyId);
+ stmt_items->setInt32(9, _li->randomPropertyId);
stmt_items->setUInt32(10, _li->randomSuffix);
trans->Append(stmt_items);
}
@@ -1339,7 +1339,7 @@ bool Item::ItemContainerLoadLootFromDB()
loot_item.canSave = true;
loot_item.is_underthreshold = fields[6].GetBool();
loot_item.needs_quest = fields[7].GetBool();
- loot_item.randomPropertyId = fields[8].GetUInt32();
+ loot_item.randomPropertyId = fields[8].GetInt32();
loot_item.randomSuffix = fields[9].GetUInt32();
// Copy the extra loot conditions from the item in the loot template
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 8f1669910e7..ed08e5f55e7 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -25,7 +25,6 @@
#include "BattlefieldMgr.h"
#include "BattlefieldWG.h"
#include "Battleground.h"
-#include "BattlegroundAV.h"
#include "BattlegroundMgr.h"
#include "CellImpl.h"
#include "Channel.h"
@@ -8770,16 +8769,12 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
if (go->getLootState() == GO_READY)
{
uint32 lootid = go->GetGOInfo()->GetLootId();
-
- /// @todo fix this big hack
- if ((go->GetEntry() == BG_AV_OBJECTID_MINE_N || go->GetEntry() == BG_AV_OBJECTID_MINE_S))
- if (Battleground* bg = GetBattleground())
- if (bg->GetTypeID(true) == BATTLEGROUND_AV)
- if (!(((BattlegroundAV*)bg)->PlayerCanDoMineQuest(go->GetEntry(), GetTeam())))
- {
- SendLootRelease(guid);
- return;
- }
+ if (Battleground* bg = GetBattleground())
+ if (!bg->CanActivateGO(go->GetEntry(), GetTeam()))
+ {
+ SendLootRelease(guid);
+ return;
+ }
if (lootid)
{
@@ -16173,7 +16168,7 @@ void Player::KilledMonster(CreatureTemplate const* cInfo, uint64 guid)
KilledMonsterCredit(cInfo->KillCredit[i], 0);
}
-void Player::KilledMonsterCredit(uint32 entry, uint64 guid)
+void Player::KilledMonsterCredit(uint32 entry, uint64 guid /*= 0*/)
{
uint16 addkillcount = 1;
uint32 real_entry = entry;
@@ -22678,6 +22673,11 @@ void Player::ApplyEquipCooldown(Item* pItem)
if (spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
continue;
+ // Don't replace longer cooldowns by equip cooldown if we have any.
+ SpellCooldowns::iterator itr = m_spellCooldowns.find(spellData.SpellId);
+ if (itr != m_spellCooldowns.end() && itr->second.itemid == pItem->GetEntry() && itr->second.end > time(NULL) + 30)
+ continue;
+
AddSpellCooldown(spellData.SpellId, pItem->GetEntry(), time(NULL) + 30);
WorldPacket data(SMSG_ITEM_COOLDOWN, 12);
@@ -26261,6 +26261,31 @@ float Player::GetCollisionHeight(bool mounted) const
}
}
+std::string Player::GetMapAreaAndZoneString()
+{
+ uint32 areaId = GetAreaId();
+ std::string areaName = "Unknown";
+ std::string zoneName = "Unknown";
+ if (AreaTableEntry const* area = GetAreaEntryByAreaID(areaId))
+ {
+ int locale = GetSession()->GetSessionDbcLocale();
+ areaName = area->area_name[locale];
+ if (AreaTableEntry const* zone = GetAreaEntryByAreaID(area->zone))
+ zoneName = zone->area_name[locale];
+ }
+
+ std::ostringstream str;
+ str << "Map: " << GetMapId() << " (" << (FindMap() ? FindMap()->GetMapName() : "Unknown") << ") Area: " << areaId << " (" << areaName.c_str() << ") Zone: " << zoneName.c_str();
+ return str.str();
+}
+
+std::string Player::GetCoordsMapAreaAndZoneString()
+{
+ std::ostringstream str;
+ str << Position::ToString() << " " << GetMapAreaAndZoneString();
+ return str.str();
+}
+
Guild* Player::GetGuild()
{
uint32 guildId = GetGuildId();
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 7500755a101..c26d2d80336 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1413,7 +1413,7 @@ class Player : public Unit, public GridObject<Player>
void ItemAddedQuestCheck(uint32 entry, uint32 count);
void ItemRemovedQuestCheck(uint32 entry, uint32 count);
void KilledMonster(CreatureTemplate const* cInfo, uint64 guid);
- void KilledMonsterCredit(uint32 entry, uint64 guid);
+ void KilledMonsterCredit(uint32 entry, uint64 guid = 0);
void KilledPlayerCredit();
void CastedCreatureOrGO(uint32 entry, uint64 guid, uint32 spell_id);
void TalkedToCreature(uint32 entry, uint64 guid);
@@ -2291,6 +2291,9 @@ class Player : public Unit, public GridObject<Player>
//! Return collision height sent to client
float GetCollisionHeight(bool mounted) const;
+ std::string GetMapAreaAndZoneString();
+ std::string GetCoordsMapAreaAndZoneString();
+
protected:
// Gamemaster whisper whitelist
WhisperListContainer WhisperList;
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 8a1eb78250b..56f4e7142a2 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -628,7 +628,8 @@ enum UnitFlags
UNIT_FLAG_UNK_28 = 0x10000000,
UNIT_FLAG_UNK_29 = 0x20000000, // used in Feing Death spell
UNIT_FLAG_SHEATHE = 0x40000000,
- UNIT_FLAG_UNK_31 = 0x80000000
+ UNIT_FLAG_UNK_31 = 0x80000000,
+ MAX_UNIT_FLAGS = 33
};
// Value masks for UNIT_FIELD_FLAGS_2
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 33003de4e6d..88a8664e8a4 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -7212,59 +7212,59 @@ void ObjectMgr::LoadQuestRelationsHelper(QuestRelations& map, std::string const&
TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded %u quest relations from %s in %u ms", count, table.c_str(), GetMSTimeDiffToNow(oldMSTime));
}
-void ObjectMgr::LoadGameobjectQuestRelations()
+void ObjectMgr::LoadGameobjectQuestStarters()
{
- LoadQuestRelationsHelper(_goQuestRelations, "gameobject_questrelation", true, true);
+ LoadQuestRelationsHelper(_goQuestRelations, "gameobject_queststarter", true, true);
for (QuestRelations::iterator itr = _goQuestRelations.begin(); itr != _goQuestRelations.end(); ++itr)
{
GameObjectTemplate const* goInfo = GetGameObjectTemplate(itr->first);
if (!goInfo)
- TC_LOG_ERROR(LOG_FILTER_SQL, "Table `gameobject_questrelation` have data for not existed gameobject entry (%u) and existed quest %u", itr->first, itr->second);
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Table `gameobject_queststarter` have data for not existed gameobject entry (%u) and existed quest %u", itr->first, itr->second);
else if (goInfo->type != GAMEOBJECT_TYPE_QUESTGIVER)
- TC_LOG_ERROR(LOG_FILTER_SQL, "Table `gameobject_questrelation` have data gameobject entry (%u) for quest %u, but GO is not GAMEOBJECT_TYPE_QUESTGIVER", itr->first, itr->second);
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Table `gameobject_queststarter` have data gameobject entry (%u) for quest %u, but GO is not GAMEOBJECT_TYPE_QUESTGIVER", itr->first, itr->second);
}
}
-void ObjectMgr::LoadGameobjectInvolvedRelations()
+void ObjectMgr::LoadGameobjectQuestEnders()
{
- LoadQuestRelationsHelper(_goQuestInvolvedRelations, "gameobject_involvedrelation", false, true);
+ LoadQuestRelationsHelper(_goQuestInvolvedRelations, "gameobject_questender", false, true);
for (QuestRelations::iterator itr = _goQuestInvolvedRelations.begin(); itr != _goQuestInvolvedRelations.end(); ++itr)
{
GameObjectTemplate const* goInfo = GetGameObjectTemplate(itr->first);
if (!goInfo)
- TC_LOG_ERROR(LOG_FILTER_SQL, "Table `gameobject_involvedrelation` have data for not existed gameobject entry (%u) and existed quest %u", itr->first, itr->second);
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Table `gameobject_questender` have data for not existed gameobject entry (%u) and existed quest %u", itr->first, itr->second);
else if (goInfo->type != GAMEOBJECT_TYPE_QUESTGIVER)
- TC_LOG_ERROR(LOG_FILTER_SQL, "Table `gameobject_involvedrelation` have data gameobject entry (%u) for quest %u, but GO is not GAMEOBJECT_TYPE_QUESTGIVER", itr->first, itr->second);
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Table `gameobject_questender` have data gameobject entry (%u) for quest %u, but GO is not GAMEOBJECT_TYPE_QUESTGIVER", itr->first, itr->second);
}
}
-void ObjectMgr::LoadCreatureQuestRelations()
+void ObjectMgr::LoadCreatureQuestStarters()
{
- LoadQuestRelationsHelper(_creatureQuestRelations, "creature_questrelation", true, false);
+ LoadQuestRelationsHelper(_creatureQuestRelations, "creature_queststarter", true, false);
for (QuestRelations::iterator itr = _creatureQuestRelations.begin(); itr != _creatureQuestRelations.end(); ++itr)
{
CreatureTemplate const* cInfo = GetCreatureTemplate(itr->first);
if (!cInfo)
- TC_LOG_ERROR(LOG_FILTER_SQL, "Table `creature_questrelation` have data for not existed creature entry (%u) and existed quest %u", itr->first, itr->second);
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Table `creature_queststarter` have data for not existed creature entry (%u) and existed quest %u", itr->first, itr->second);
else if (!(cInfo->npcflag & UNIT_NPC_FLAG_QUESTGIVER))
- TC_LOG_ERROR(LOG_FILTER_SQL, "Table `creature_questrelation` has creature entry (%u) for quest %u, but npcflag does not include UNIT_NPC_FLAG_QUESTGIVER", itr->first, itr->second);
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Table `creature_queststarter` has creature entry (%u) for quest %u, but npcflag does not include UNIT_NPC_FLAG_QUESTGIVER", itr->first, itr->second);
}
}
-void ObjectMgr::LoadCreatureInvolvedRelations()
+void ObjectMgr::LoadCreatureQuestEnders()
{
- LoadQuestRelationsHelper(_creatureQuestInvolvedRelations, "creature_involvedrelation", false, false);
+ LoadQuestRelationsHelper(_creatureQuestInvolvedRelations, "creature_questender", false, false);
for (QuestRelations::iterator itr = _creatureQuestInvolvedRelations.begin(); itr != _creatureQuestInvolvedRelations.end(); ++itr)
{
CreatureTemplate const* cInfo = GetCreatureTemplate(itr->first);
if (!cInfo)
- TC_LOG_ERROR(LOG_FILTER_SQL, "Table `creature_involvedrelation` have data for not existed creature entry (%u) and existed quest %u", itr->first, itr->second);
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Table `creature_questender` have data for not existed creature entry (%u) and existed quest %u", itr->first, itr->second);
else if (!(cInfo->npcflag & UNIT_NPC_FLAG_QUESTGIVER))
- TC_LOG_ERROR(LOG_FILTER_SQL, "Table `creature_involvedrelation` has creature entry (%u) for quest %u, but npcflag does not include UNIT_NPC_FLAG_QUESTGIVER", itr->first, itr->second);
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Table `creature_questender` has creature entry (%u) for quest %u, but npcflag does not include UNIT_NPC_FLAG_QUESTGIVER", itr->first, itr->second);
}
}
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index ddabc56fbb6..aad699fe9c1 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -851,21 +851,21 @@ class ObjectMgr
}
void LoadQuests();
- void LoadQuestRelations()
+ void LoadQuestStartersAndEnders()
{
TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading GO Start Quest Data...");
- LoadGameobjectQuestRelations();
+ LoadGameobjectQuestStarters();
TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading GO End Quest Data...");
- LoadGameobjectInvolvedRelations();
+ LoadGameobjectQuestEnders();
TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading Creature Start Quest Data...");
- LoadCreatureQuestRelations();
+ LoadCreatureQuestStarters();
TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading Creature End Quest Data...");
- LoadCreatureInvolvedRelations();
+ LoadCreatureQuestEnders();
}
- void LoadGameobjectQuestRelations();
- void LoadGameobjectInvolvedRelations();
- void LoadCreatureQuestRelations();
- void LoadCreatureInvolvedRelations();
+ void LoadGameobjectQuestStarters();
+ void LoadGameobjectQuestEnders();
+ void LoadCreatureQuestStarters();
+ void LoadCreatureQuestEnders();
QuestRelations* GetGOQuestRelationMap()
{
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index 6cd999bc496..e51d87c7733 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -29,7 +29,6 @@
#include "ObjectAccessor.h"
#include "Group.h"
#include "Battleground.h"
-#include "BattlegroundAV.h"
#include "ScriptMgr.h"
#include "GameObjectAI.h"
@@ -510,6 +509,10 @@ void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recvData)
TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUESTGIVER_COMPLETE_QUEST npc = %u, quest = %u", uint32(GUID_LOPART(guid)), questId);
+ Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
+ if (!quest)
+ return;
+
Object* object = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT);
if (!object || !object->hasInvolvedQuest(questId))
return;
@@ -518,38 +521,33 @@ void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recvData)
if (!_player->CanInteractWithQuestGiver(object))
return;
- if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
+ if (!_player->CanSeeStartQuest(quest) && _player->GetQuestStatus(questId) == QUEST_STATUS_NONE)
{
- if (!_player->CanSeeStartQuest(quest) && _player->GetQuestStatus(questId) == QUEST_STATUS_NONE)
- {
- TC_LOG_ERROR(LOG_FILTER_NETWORKIO, "Possible hacking attempt: Player %s [guid: %u] tried to complete quest [entry: %u] without being in possession of the quest!",
- _player->GetName().c_str(), _player->GetGUIDLow(), questId);
- return;
- }
- /// @todo need a virtual function
- if (_player->InBattleground())
- if (Battleground* bg = _player->GetBattleground())
- if (bg->GetTypeID() == BATTLEGROUND_AV)
- ((BattlegroundAV*)bg)->HandleQuestComplete(questId, _player);
+ TC_LOG_ERROR(LOG_FILTER_NETWORKIO, "Possible hacking attempt: Player %s [guid: %u] tried to complete quest [entry: %u] without being in possession of the quest!",
+ _player->GetName().c_str(), _player->GetGUIDLow(), questId);
+ return;
+ }
- if (_player->GetQuestStatus(questId) != QUEST_STATUS_COMPLETE)
- {
- if (quest->IsRepeatable())
- _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, _player->CanCompleteRepeatableQuest(quest), false);
- else
- _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, _player->CanRewardQuest(quest, false), false);
- }
- else
- {
- if (quest->GetReqItemsCount()) // some items required
- _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, _player->CanRewardQuest(quest, false), false);
- else // no items required
- _player->PlayerTalkClass->SendQuestGiverOfferReward(quest, guid, true);
- }
+ if (Battleground* bg = _player->GetBattleground())
+ bg->HandleQuestComplete(questId, _player);
- if (Creature* creature = object->ToCreature())
- sScriptMgr->OnQuestComplete(_player, creature, quest);
+ if (_player->GetQuestStatus(questId) != QUEST_STATUS_COMPLETE)
+ {
+ if (quest->IsRepeatable())
+ _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, _player->CanCompleteRepeatableQuest(quest), false);
+ else
+ _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, _player->CanRewardQuest(quest, false), false);
}
+ else
+ {
+ if (quest->GetReqItemsCount()) // some items required
+ _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, _player->CanRewardQuest(quest, false), false);
+ else // no items required
+ _player->PlayerTalkClass->SendQuestGiverOfferReward(quest, guid, true);
+ }
+
+ if (Creature* creature = object->ToCreature())
+ sScriptMgr->OnQuestComplete(_player, creature, quest);
}
void WorldSession::HandleQuestgiverQuestAutoLaunch(WorldPacket& /*recvPacket*/)
@@ -565,66 +563,70 @@ void WorldSession::HandlePushQuestToParty(WorldPacket& recvPacket)
if (!_player->CanShareQuest(questId))
return;
- TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_PUSHQUESTTOPARTY quest = %u", questId);
+ TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_PUSHQUESTTOPARTY questId = %u", questId);
- if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
+ Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
+ if (!quest)
+ return;
+
+ Player * const sender = GetPlayer();
+
+ Group* group = sender->GetGroup();
+ if (!group)
+ return;
+
+ for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
{
- if (Group* group = _player->GetGroup())
- {
- for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
- {
- Player* player = itr->GetSource();
+ Player* receiver = itr->GetSource();
- if (!player || player == _player) // skip self
- continue;
+ if (!receiver || receiver == sender)
+ continue;
- if (!player->SatisfyQuestStatus(quest, false))
- {
- _player->SendPushToPartyResponse(player, QUEST_PARTY_MSG_HAVE_QUEST);
- continue;
- }
+ if (!receiver->SatisfyQuestStatus(quest, false))
+ {
+ sender->SendPushToPartyResponse(receiver, QUEST_PARTY_MSG_HAVE_QUEST);
+ continue;
+ }
- if (player->GetQuestStatus(questId) == QUEST_STATUS_COMPLETE)
- {
- _player->SendPushToPartyResponse(player, QUEST_PARTY_MSG_FINISH_QUEST);
- continue;
- }
+ if (receiver->GetQuestStatus(questId) == QUEST_STATUS_COMPLETE)
+ {
+ sender->SendPushToPartyResponse(receiver, QUEST_PARTY_MSG_FINISH_QUEST);
+ continue;
+ }
- if (!player->CanTakeQuest(quest, false))
- {
- _player->SendPushToPartyResponse(player, QUEST_PARTY_MSG_CANT_TAKE_QUEST);
- continue;
- }
+ if (!receiver->CanTakeQuest(quest, false))
+ {
+ sender->SendPushToPartyResponse(receiver, QUEST_PARTY_MSG_CANT_TAKE_QUEST);
+ continue;
+ }
- if (!player->SatisfyQuestLog(false))
- {
- _player->SendPushToPartyResponse(player, QUEST_PARTY_MSG_LOG_FULL);
- continue;
- }
+ if (!receiver->SatisfyQuestLog(false))
+ {
+ sender->SendPushToPartyResponse(receiver, QUEST_PARTY_MSG_LOG_FULL);
+ continue;
+ }
- if (player->GetDivider() != 0)
- {
- _player->SendPushToPartyResponse(player, QUEST_PARTY_MSG_BUSY);
- continue;
- }
+ if (receiver->GetDivider() != 0)
+ {
+ sender->SendPushToPartyResponse(receiver, QUEST_PARTY_MSG_BUSY);
+ continue;
+ }
- _player->SendPushToPartyResponse(player, QUEST_PARTY_MSG_SHARING_QUEST);
+ sender->SendPushToPartyResponse(receiver, QUEST_PARTY_MSG_SHARING_QUEST);
- if (quest->IsAutoAccept() && player->CanAddQuest(quest, true) && player->CanTakeQuest(quest, true))
- {
- player->AddQuest(quest, _player);
- if (player->CanCompleteQuest(questId))
- player->CompleteQuest(questId);
- }
+ if (quest->IsAutoAccept() && receiver->CanAddQuest(quest, true) && receiver->CanTakeQuest(quest, true))
+ {
+ receiver->AddQuest(quest, sender);
+ if (receiver->CanCompleteQuest(questId))
+ receiver->CompleteQuest(questId);
+ }
- if ((quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly()) || quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE))
- player->PlayerTalkClass->SendQuestGiverRequestItems(quest, _player->GetGUID(), player->CanCompleteRepeatableQuest(quest), true);
- else
- {
- player->SetDivider(_player->GetGUID());
- player->PlayerTalkClass->SendQuestGiverQuestDetails(quest, _player->GetGUID(), true);
- }
- }
+ if ((quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly()) || quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE))
+ receiver->PlayerTalkClass->SendQuestGiverRequestItems(quest, sender->GetGUID(), receiver->CanCompleteRepeatableQuest(quest), true);
+ else
+ {
+ receiver->SetDivider(sender->GetGUID());
+ receiver->PlayerTalkClass->SendQuestGiverQuestDetails(quest, sender->GetGUID(), true);
}
}
}
@@ -646,7 +648,7 @@ void WorldSession::HandleQuestPushResult(WorldPacket& recvPacket)
WorldPacket data(MSG_QUEST_PUSH_RESULT, 8 + 4 + 1);
data << uint64(_player->GetGUID());
data << uint8(msg); // valid values: 0-8
- player->GetSession()->SendPacket(&data);
+ player->SendDirectMessage(&data);
_player->SetDivider(0);
}
}
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 11ed92b9d5b..5ce4c05abb6 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -820,6 +820,8 @@ void Map::MoveAllCreaturesInMoveList()
{
// update pos
c->Relocate(c->_newPosition);
+ if (c->IsVehicle())
+ c->GetVehicleKit()->RelocatePassengers();
//CreatureRelocationNotify(c, new_cell, new_cell.cellCoord());
c->UpdateObjectVisibility(false);
}
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index 0da63a61b43..772d5bcfb75 100644
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -1083,7 +1083,9 @@ enum TrinityStrings
LANG_COMMAND_NO_OUTDOOR_PVP_FORUND = 5034,
LANG_CALL_FOR_HELP = 5035,
LANG_NPCINFO_EQUIPMENT = 5036,
- // Room for more Trinity strings 5037-9999
+ LANG_NPCINFO_MECHANIC_IMMUNE = 5037,
+ LANG_NPCINFO_UNIT_FIELD_FLAGS = 5038,
+ // Room for more Trinity strings 5039-9999
// Level requirement notifications
LANG_SAY_REQ = 6604,
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 4d5245cffb1..e561d37ed36 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -1233,7 +1233,8 @@ enum Mechanics
MECHANIC_DISCOVERY = 28,
MECHANIC_IMMUNE_SHIELD = 29, // Divine (Blessing) Shield/Protection and Ice Block
MECHANIC_SAPPED = 30,
- MECHANIC_ENRAGED = 31
+ MECHANIC_ENRAGED = 31,
+ MAX_MECHANIC = 32
};
// Used for spell 42292 Immune Movement Impairment and Loss of Control (0x49967ca6)
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index c67a0aec4be..8e2fc2953c9 100644
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -127,6 +127,7 @@ void AddSC_boss_gyth();
void AddSC_boss_rend_blackhand();
void AddSC_boss_gizrul_the_slavener();
void AddSC_boss_urok_doomhowl();
+void AddSC_boss_lord_valthalak();
void AddSC_instance_blackrock_spire();
void AddSC_boss_razorgore(); //Blackwing lair
void AddSC_boss_vaelastrasz();
@@ -534,6 +535,7 @@ void AddSC_boss_nexusprince_shaffar(); //Auchindoun Mana Tombs
void AddSC_boss_pandemonius();
void AddSC_boss_darkweaver_syth(); //Auchindoun Sekketh Halls
void AddSC_boss_talon_king_ikiss();
+void AddSC_boss_anzu();
void AddSC_instance_sethekk_halls();
void AddSC_instance_shadow_labyrinth(); //Auchindoun Shadow Labyrinth
void AddSC_boss_ambassador_hellmaw();
@@ -771,6 +773,7 @@ void AddEasternKingdomsScripts()
AddSC_boss_rend_blackhand();
AddSC_boss_gizrul_the_slavener();
AddSC_boss_urok_doomhowl();
+ AddSC_boss_lord_valthalak();
AddSC_instance_blackrock_spire();
AddSC_boss_razorgore(); //Blackwing lair
AddSC_boss_vaelastrasz();
@@ -1025,6 +1028,7 @@ void AddOutlandScripts()
AddSC_boss_pandemonius();
AddSC_boss_darkweaver_syth(); //Auchindoun Sekketh Halls
AddSC_boss_talon_king_ikiss();
+ AddSC_boss_anzu();
AddSC_instance_sethekk_halls();
AddSC_instance_shadow_labyrinth(); //Auchindoun Shadow Labyrinth
AddSC_boss_ambassador_hellmaw();
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index e054c91ccc9..80d326e2c7a 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -45,8 +45,6 @@
#include "CreatureAI.h"
#include "BattlegroundMgr.h"
#include "Battleground.h"
-#include "BattlegroundEY.h"
-#include "BattlegroundWS.h"
#include "OutdoorPvPMgr.h"
#include "Language.h"
#include "SocialMgr.h"
@@ -1338,7 +1336,7 @@ void Spell::EffectPowerDrain(SpellEffIndex effIndex)
float gainMultiplier = 0.0f;
- // Don`t restore from self drain
+ // Don't restore from self drain
if (m_caster != unitTarget)
{
gainMultiplier = m_spellInfo->Effects[effIndex].CalcValueMultiplier(m_originalCaster, this);
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 42d408ebbad..63827c11107 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -29,7 +29,6 @@
#include "BattlegroundMgr.h"
#include "CreatureAI.h"
#include "MapManager.h"
-#include "BattlegroundIC.h"
#include "BattlefieldWG.h"
#include "BattlefieldMgr.h"
#include "Player.h"
@@ -358,7 +357,7 @@ bool SpellMgr::IsSpellValid(SpellInfo const* spellInfo, Player* player, bool msg
if (!spellInfo)
return false;
- bool need_check_reagents = false;
+ bool needCheckReagents = false;
// check effects
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
@@ -401,7 +400,7 @@ bool SpellMgr::IsSpellValid(SpellInfo const* spellInfo, Player* player, bool msg
return false;
}
- need_check_reagents = true;
+ needCheckReagents = true;
break;
}
case SPELL_EFFECT_LEARN_SPELL:
@@ -423,7 +422,7 @@ bool SpellMgr::IsSpellValid(SpellInfo const* spellInfo, Player* player, bool msg
}
}
- if (need_check_reagents)
+ if (needCheckReagents)
{
for (uint8 j = 0; j < MAX_SPELL_REAGENTS; ++j)
{
@@ -447,7 +446,7 @@ bool SpellMgr::IsSpellValid(SpellInfo const* spellInfo, Player* player, bool msg
uint32 SpellMgr::GetSpellDifficultyId(uint32 spellId) const
{
SpellDifficultySearcherMap::const_iterator i = mSpellDifficultySearcherMap.find(spellId);
- return i == mSpellDifficultySearcherMap.end() ? 0 : (*i).second;
+ return i == mSpellDifficultySearcherMap.end() ? 0 : i->second;
}
void SpellMgr::SetSpellDifficultyId(uint32 spellId, uint32 id)
@@ -1102,7 +1101,13 @@ bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32
if (!player || (auraSpell > 0 && !player->HasAura(auraSpell)) || (auraSpell < 0 && player->HasAura(-auraSpell)))
return false;
- // Extra conditions -- leaving the possibility add extra conditions...
+ if (player)
+ {
+ if (Battleground* bg = player->GetBattleground())
+ return bg->IsSpellAllowed(spellId, player);
+ }
+
+ // Extra conditions
switch (spellId)
{
case 58600: // No fly Zone - Dalaran
@@ -1127,41 +1132,26 @@ bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32
return false;
break;
}
- case 68719: // Oil Refinery - Isle of Conquest.
- case 68720: // Quarry - Isle of Conquest.
- {
- if (!player || player->GetBattlegroundTypeId() != BATTLEGROUND_IC || !player->GetBattleground())
- return false;
-
- uint8 nodeType = spellId == 68719 ? NODE_TYPE_REFINERY : NODE_TYPE_QUARRY;
- uint8 nodeState = player->GetTeamId() == TEAM_ALLIANCE ? NODE_STATE_CONTROLLED_A : NODE_STATE_CONTROLLED_H;
-
- BattlegroundIC* pIC = static_cast<BattlegroundIC*>(player->GetBattleground());
- if (pIC->GetNodeState(nodeType) == nodeState)
- return true;
-
- return false;
- }
case 56618: // Horde Controls Factory Phase Shift
case 56617: // Alliance Controls Factory Phase Shift
- {
- if (!player)
- return false;
+ {
+ if (!player)
+ return false;
- Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId());
+ Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId());
- if (!bf || bf->GetTypeId() != BATTLEFIELD_WG)
- return false;
+ if (!bf || bf->GetTypeId() != BATTLEFIELD_WG)
+ return false;
- // team that controls the workshop in the specified area
- uint32 team = bf->GetData(newArea);
+ // team that controls the workshop in the specified area
+ uint32 team = bf->GetData(newArea);
- if (team == TEAM_HORDE)
- return spellId == 56618;
- else if (team == TEAM_ALLIANCE)
- return spellId == 56617;
- }
+ if (team == TEAM_HORDE)
+ return spellId == 56618;
+ else if (team == TEAM_ALLIANCE)
+ return spellId == 56617;
break;
+ }
case 57940: // Essence of Wintergrasp - Northrend
case 58045: // Essence of Wintergrasp - Wintergrasp
{
@@ -1356,6 +1346,7 @@ void SpellMgr::LoadSpellRanks()
mSpellInfoMap[addedSpell]->ChainEntry = &mSpellChains[addedSpell];
prevRank = addedSpell;
++itr;
+
if (itr == rankChain.end())
{
mSpellChains[addedSpell].next = NULL;
@@ -1616,7 +1607,7 @@ void SpellMgr::LoadSpellTargetPositions()
SpellInfo const* spellInfo = GetSpellInfo(Spell_ID);
if (!spellInfo)
{
- TC_LOG_ERROR(LOG_FILTER_SQL, "Spell (ID:%u) listed in `spell_target_position` does not exist.", Spell_ID);
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Spell (Id: %u) listed in `spell_target_position` does not exist.", Spell_ID);
continue;
}
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 159d315e808..410fbee9931 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1460,8 +1460,8 @@ void World::SetInitialWorldSettings()
TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading Quest POI");
sObjectMgr->LoadQuestPOI();
- TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading Quests Relations...");
- sObjectMgr->LoadQuestRelations(); // must be after quest load
+ TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading Quests Starters and Enders...");
+ sObjectMgr->LoadQuestStartersAndEnders(); // must be after quest load
TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Loading Objects Pooling Data...");
sPoolMgr->LoadFromDB();
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index 939075690c9..f708acc3dee 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -41,7 +41,7 @@ struct NpcFlagText
#define NPCFLAG_COUNT 24
-const NpcFlagText npcFlagTexts[NPCFLAG_COUNT] =
+NpcFlagText const npcFlagTexts[NPCFLAG_COUNT] =
{
{ UNIT_NPC_FLAG_AUCTIONEER, LANG_NPCINFO_AUCTIONEER },
{ UNIT_NPC_FLAG_BANKER, LANG_NPCINFO_BANKER },
@@ -69,6 +69,91 @@ const NpcFlagText npcFlagTexts[NPCFLAG_COUNT] =
{ UNIT_NPC_FLAG_VENDOR_REAGENT, LANG_NPCINFO_VENDOR_REAGENT }
};
+struct MechanicImmune
+{
+ uint32 flag;
+ char const* text;
+};
+
+MechanicImmune const mechanicImmunes[MAX_MECHANIC] =
+{
+ { MECHANIC_NONE , "MECHANIC_NONE" },
+ { MECHANIC_CHARM , "MECHANIC_CHARM" },
+ { MECHANIC_DISORIENTED , "MECHANIC_DISORIENTED" },
+ { MECHANIC_DISARM , "MECHANIC_DISARM" },
+ { MECHANIC_DISTRACT , "MECHANIC_DISTRACT" },
+ { MECHANIC_FEAR , "MECHANIC_FEAR" },
+ { MECHANIC_GRIP , "MECHANIC_GRIP" },
+ { MECHANIC_ROOT , "MECHANIC_ROOT" },
+ { MECHANIC_SLOW_ATTACK , "MECHANIC_SLOW_ATTACK" },
+ { MECHANIC_SILENCE , "MECHANIC_SILENCE" },
+ { MECHANIC_SLEEP , "MECHANIC_SLEEP" },
+ { MECHANIC_SNARE , "MECHANIC_SNARE" },
+ { MECHANIC_STUN , "MECHANIC_STUN" },
+ { MECHANIC_FREEZE , "MECHANIC_FREEZE" },
+ { MECHANIC_KNOCKOUT , "MECHANIC_KNOCKOUT" },
+ { MECHANIC_BLEED , "MECHANIC_BLEED" },
+ { MECHANIC_BANDAGE , "MECHANIC_BANDAGE" },
+ { MECHANIC_POLYMORPH , "MECHANIC_POLYMORPH" },
+ { MECHANIC_BANISH , "MECHANIC_BANISH" },
+ { MECHANIC_SHIELD , "MECHANIC_SHIELD" },
+ { MECHANIC_SHACKLE , "MECHANIC_SHACKLE" },
+ { MECHANIC_MOUNT , "MECHANIC_MOUNT" },
+ { MECHANIC_INFECTED , "MECHANIC_INFECTED" },
+ { MECHANIC_TURN , "MECHANIC_TURN" },
+ { MECHANIC_HORROR , "MECHANIC_HORROR" },
+ { MECHANIC_INVULNERABILITY , "MECHANIC_INVULNERABILITY" },
+ { MECHANIC_INTERRUPT , "MECHANIC_INTERRUPT" },
+ { MECHANIC_DAZE , "MECHANIC_DAZE" },
+ { MECHANIC_DISCOVERY , "MECHANIC_DISCOVERY" },
+ { MECHANIC_IMMUNE_SHIELD , "MECHANIC_IMMUNE_SHIELD" },
+ { MECHANIC_SAPPED , "MECHANIC_SAPPED" },
+ { MECHANIC_ENRAGED , "MECHANIC_ENRAGED" }
+};
+
+
+struct UnitFlag
+{
+ uint32 flag;
+ char const* text;
+};
+
+UnitFlag const unitFlags[MAX_UNIT_FLAGS] =
+{
+ { UNIT_FLAG_SERVER_CONTROLLED , "UNIT_FLAG_SERVER_CONTROLLED" },
+ { UNIT_FLAG_NON_ATTACKABLE , "UNIT_FLAG_NON_ATTACKABLE" },
+ { UNIT_FLAG_DISABLE_MOVE , "UNIT_FLAG_DISABLE_MOVE" },
+ { UNIT_FLAG_PVP_ATTACKABLE , "UNIT_FLAG_PVP_ATTACKABLE" },
+ { UNIT_FLAG_RENAME , "UNIT_FLAG_RENAME" },
+ { UNIT_FLAG_PREPARATION , "UNIT_FLAG_PREPARATION" },
+ { UNIT_FLAG_UNK_6 , "UNIT_FLAG_UNK_6" },
+ { UNIT_FLAG_NOT_ATTACKABLE_1 , "UNIT_FLAG_NOT_ATTACKABLE_1" },
+ { UNIT_FLAG_IMMUNE_TO_PC , "UNIT_FLAG_IMMUNE_TO_PC" },
+ { UNIT_FLAG_IMMUNE_TO_NPC , "UNIT_FLAG_IMMUNE_TO_NPC" },
+ { UNIT_FLAG_LOOTING , "UNIT_FLAG_LOOTING" },
+ { UNIT_FLAG_PET_IN_COMBAT , "UNIT_FLAG_PET_IN_COMBAT" },
+ { UNIT_FLAG_PVP , "UNIT_FLAG_PVP" },
+ { UNIT_FLAG_SILENCED , "UNIT_FLAG_SILENCED" },
+ { UNIT_FLAG_UNK_14 , "UNIT_FLAG_UNK_14" },
+ { UNIT_FLAG_UNK_15 , "UNIT_FLAG_UNK_15" },
+ { UNIT_FLAG_UNK_16 , "UNIT_FLAG_UNK_16" },
+ { UNIT_FLAG_PACIFIED , "UNIT_FLAG_PACIFIED" },
+ { UNIT_FLAG_STUNNED , "UNIT_FLAG_STUNNED" },
+ { UNIT_FLAG_IN_COMBAT , "UNIT_FLAG_IN_COMBAT" },
+ { UNIT_FLAG_TAXI_FLIGHT , "UNIT_FLAG_TAXI_FLIGHT" },
+ { UNIT_FLAG_DISARMED , "UNIT_FLAG_DISARMED" },
+ { UNIT_FLAG_CONFUSED , "UNIT_FLAG_CONFUSED" },
+ { UNIT_FLAG_FLEEING , "UNIT_FLAG_FLEEING" },
+ { UNIT_FLAG_PLAYER_CONTROLLED , "UNIT_FLAG_PLAYER_CONTROLLED" },
+ { UNIT_FLAG_NOT_SELECTABLE , "UNIT_FLAG_NOT_SELECTABLE" },
+ { UNIT_FLAG_SKINNABLE , "UNIT_FLAG_SKINNABLE" },
+ { UNIT_FLAG_MOUNT , "UNIT_FLAG_MOUNT" },
+ { UNIT_FLAG_UNK_28 , "UNIT_FLAG_UNK_28" },
+ { UNIT_FLAG_UNK_29 , "UNIT_FLAG_UNK_29" },
+ { UNIT_FLAG_SHEATHE , "UNIT_FLAG_SHEATHE" },
+ { UNIT_FLAG_UNK_31 , "UNIT_FLAG_UNK_31" }
+};
+
class npc_commandscript : public CommandScript
{
public:
@@ -630,12 +715,14 @@ public:
return false;
}
+ CreatureTemplate const* cInfo = target->GetCreatureTemplate();
+
uint32 faction = target->getFaction();
uint32 npcflags = target->GetUInt32Value(UNIT_NPC_FLAGS);
+ uint32 mechanicImmuneMask = cInfo->MechanicImmuneMask;
uint32 displayid = target->GetDisplayId();
uint32 nativeid = target->GetNativeDisplayId();
uint32 Entry = target->GetEntry();
- CreatureTemplate const* cInfo = target->GetCreatureTemplate();
int64 curRespawnDelay = target->GetRespawnTimeEx()-time(NULL);
if (curRespawnDelay < 0)
@@ -647,7 +734,13 @@ public:
handler->PSendSysMessage(LANG_NPCINFO_LEVEL, target->getLevel());
handler->PSendSysMessage(LANG_NPCINFO_EQUIPMENT, target->GetCurrentEquipmentId(), target->GetOriginalEquipmentId());
handler->PSendSysMessage(LANG_NPCINFO_HEALTH, target->GetCreateHealth(), target->GetMaxHealth(), target->GetHealth());
- handler->PSendSysMessage(LANG_NPCINFO_FLAGS, target->GetUInt32Value(UNIT_FIELD_FLAGS), target->GetUInt32Value(UNIT_FIELD_FLAGS_2), target->GetUInt32Value(UNIT_DYNAMIC_FLAGS), target->getFaction());
+
+ handler->PSendSysMessage(LANG_NPCINFO_UNIT_FIELD_FLAGS, target->GetUInt32Value(UNIT_FIELD_FLAGS));
+ for (uint8 i = 0; i < MAX_UNIT_FLAGS; ++i)
+ if (target->GetUInt32Value(UNIT_FIELD_FLAGS) & unitFlags[i].flag)
+ handler->PSendSysMessage(unitFlags[i].text, unitFlags[i].flag);
+
+ handler->PSendSysMessage(LANG_NPCINFO_FLAGS, target->GetUInt32Value(UNIT_FIELD_FLAGS_2), target->GetUInt32Value(UNIT_DYNAMIC_FLAGS), target->getFaction());
handler->PSendSysMessage(LANG_COMMAND_RAWPAWNTIMES, defRespawnDelayStr.c_str(), curRespawnDelayStr.c_str());
handler->PSendSysMessage(LANG_NPCINFO_LOOT, cInfo->lootid, cInfo->pickpocketLootId, cInfo->SkinLootId);
handler->PSendSysMessage(LANG_NPCINFO_DUNGEON_ID, target->GetInstanceId());
@@ -660,6 +753,11 @@ public:
if (npcflags & npcFlagTexts[i].flag)
handler->PSendSysMessage(npcFlagTexts[i].text, npcFlagTexts[i].flag);
+ handler->PSendSysMessage(LANG_NPCINFO_MECHANIC_IMMUNE, mechanicImmuneMask);
+ for (uint8 i = 0; i < MAX_MECHANIC; ++i)
+ if ((mechanicImmuneMask << 1) & mechanicImmunes[i].flag)
+ handler->PSendSysMessage(mechanicImmunes[i].text, mechanicImmunes[i].flag);
+
return true;
}
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index 5351f3edda0..829152b7fa7 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -82,11 +82,11 @@ public:
{ "creature_text", SEC_ADMINISTRATOR, true, &HandleReloadCreatureText, "", NULL },
{ "creature_ai_scripts", SEC_ADMINISTRATOR, true, &HandleReloadEventAIScriptsCommand, "", NULL },
{ "creature_ai_texts", SEC_ADMINISTRATOR, true, &HandleReloadEventAITextsCommand, "", NULL },
- { "creature_involvedrelation", SEC_ADMINISTRATOR, true, &HandleReloadCreatureQuestInvRelationsCommand, "", NULL },
+ { "creature_questender", SEC_ADMINISTRATOR, true, &HandleReloadCreatureQuestEnderCommand, "", NULL },
{ "creature_linked_respawn", SEC_GAMEMASTER, true, &HandleReloadLinkedRespawnCommand, "", NULL },
{ "creature_loot_template", SEC_ADMINISTRATOR, true, &HandleReloadLootTemplatesCreatureCommand, "", NULL },
{ "creature_onkill_reputation", SEC_ADMINISTRATOR, true, &HandleReloadOnKillReputationCommand, "", NULL },
- { "creature_questrelation", SEC_ADMINISTRATOR, true, &HandleReloadCreatureQuestRelationsCommand, "", NULL },
+ { "creature_queststarter", SEC_ADMINISTRATOR, true, &HandleReloadCreatureQuestStarterCommand, "", NULL },
{ "creature_summon_groups", SEC_ADMINISTRATOR, true, &HandleReloadCreatureSummonGroupsCommand, "", NULL },
{ "creature_template", SEC_ADMINISTRATOR, true, &HandleReloadCreatureTemplateCommand, "", NULL },
//{ "db_script_string", SEC_ADMINISTRATOR, true, &HandleReloadDbScriptStringCommand, "", NULL },
@@ -96,9 +96,9 @@ public:
{ "fishing_loot_template", SEC_ADMINISTRATOR, true, &HandleReloadLootTemplatesFishingCommand, "", NULL },
{ "game_graveyard_zone", SEC_ADMINISTRATOR, true, &HandleReloadGameGraveyardZoneCommand, "", NULL },
{ "game_tele", SEC_ADMINISTRATOR, true, &HandleReloadGameTeleCommand, "", NULL },
- { "gameobject_involvedrelation", SEC_ADMINISTRATOR, true, &HandleReloadGOQuestInvRelationsCommand, "", NULL },
+ { "gameobject_questender", SEC_ADMINISTRATOR, true, &HandleReloadGOQuestEnderCommand, "", NULL },
{ "gameobject_loot_template", SEC_ADMINISTRATOR, true, &HandleReloadLootTemplatesGameobjectCommand, "", NULL },
- { "gameobject_questrelation", SEC_ADMINISTRATOR, true, &HandleReloadGOQuestRelationsCommand, "", NULL },
+ { "gameobject_queststarter", SEC_ADMINISTRATOR, true, &HandleReloadGOQuestStarterCommand, "", NULL },
{ "gm_tickets", SEC_ADMINISTRATOR, true, &HandleReloadGMTicketsCommand, "", NULL },
{ "gossip_menu", SEC_ADMINISTRATOR, true, &HandleReloadGossipMenuCommand, "", NULL },
{ "gossip_menu_option", SEC_ADMINISTRATOR, true, &HandleReloadGossipMenuOptionCommand, "", NULL },
@@ -249,8 +249,8 @@ public:
HandleReloadQuestTemplateCommand(handler, "a");
TC_LOG_INFO(LOG_FILTER_GENERAL, "Re-Loading Quests Relations...");
- sObjectMgr->LoadQuestRelations();
- handler->SendGlobalGMSysMessage("DB tables `*_questrelation` and `*_involvedrelation` reloaded.");
+ sObjectMgr->LoadQuestStartersAndEnders();
+ handler->SendGlobalGMSysMessage("DB tables `*_queststarter` and `*_questender` reloaded.");
return true;
}
@@ -532,11 +532,11 @@ public:
return true;
}
- static bool HandleReloadCreatureQuestRelationsCommand(ChatHandler* handler, const char* /*args*/)
+ static bool HandleReloadCreatureQuestStarterCommand(ChatHandler* handler, const char* /*args*/)
{
- TC_LOG_INFO(LOG_FILTER_GENERAL, "Loading Quests Relations... (`creature_questrelation`)");
- sObjectMgr->LoadCreatureQuestRelations();
- handler->SendGlobalGMSysMessage("DB table `creature_questrelation` (creature quest givers) reloaded.");
+ TC_LOG_INFO(LOG_FILTER_GENERAL, "Loading Quests Relations... (`creature_queststarter`)");
+ sObjectMgr->LoadCreatureQuestStarters();
+ handler->SendGlobalGMSysMessage("DB table `creature_queststarter` reloaded.");
return true;
}
@@ -548,11 +548,11 @@ public:
return true;
}
- static bool HandleReloadCreatureQuestInvRelationsCommand(ChatHandler* handler, const char* /*args*/)
+ static bool HandleReloadCreatureQuestEnderCommand(ChatHandler* handler, const char* /*args*/)
{
- TC_LOG_INFO(LOG_FILTER_GENERAL, "Loading Quests Relations... (`creature_involvedrelation`)");
- sObjectMgr->LoadCreatureInvolvedRelations();
- handler->SendGlobalGMSysMessage("DB table `creature_involvedrelation` (creature quest takers) reloaded.");
+ TC_LOG_INFO(LOG_FILTER_GENERAL, "Loading Quests Relations... (`creature_questender`)");
+ sObjectMgr->LoadCreatureQuestEnders();
+ handler->SendGlobalGMSysMessage("DB table `creature_questender` reloaded.");
return true;
}
@@ -574,19 +574,19 @@ public:
return true;
}
- static bool HandleReloadGOQuestRelationsCommand(ChatHandler* handler, const char* /*args*/)
+ static bool HandleReloadGOQuestStarterCommand(ChatHandler* handler, const char* /*args*/)
{
- TC_LOG_INFO(LOG_FILTER_GENERAL, "Loading Quests Relations... (`gameobject_questrelation`)");
- sObjectMgr->LoadGameobjectQuestRelations();
- handler->SendGlobalGMSysMessage("DB table `gameobject_questrelation` (gameobject quest givers) reloaded.");
+ TC_LOG_INFO(LOG_FILTER_GENERAL, "Loading Quests Relations... (`gameobject_queststarter`)");
+ sObjectMgr->LoadGameobjectQuestStarters();
+ handler->SendGlobalGMSysMessage("DB table `gameobject_queststarter` reloaded.");
return true;
}
- static bool HandleReloadGOQuestInvRelationsCommand(ChatHandler* handler, const char* /*args*/)
+ static bool HandleReloadGOQuestEnderCommand(ChatHandler* handler, const char* /*args*/)
{
- TC_LOG_INFO(LOG_FILTER_GENERAL, "Loading Quests Relations... (`gameobject_involvedrelation`)");
- sObjectMgr->LoadGameobjectInvolvedRelations();
- handler->SendGlobalGMSysMessage("DB table `gameobject_involvedrelation` (gameobject quest takers) reloaded.");
+ TC_LOG_INFO(LOG_FILTER_GENERAL, "Loading Quests Relations... (`gameobject_questender`)");
+ sObjectMgr->LoadGameobjectQuestEnders();
+ handler->SendGlobalGMSysMessage("DB table `gameobject_questender` reloaded.");
return true;
}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp
index e9a6b15dcf8..e9a6b15dcf8 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h
index b279012bbf7..b279012bbf7 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_ambassador_flamelash.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp
index 3a4f734429c..3a4f734429c 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_ambassador_flamelash.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_anubshiah.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp
index 63a94ca616a..63a94ca616a 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_anubshiah.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp
index 25f93a2b6b7..25f93a2b6b7 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_general_angerforge.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_general_angerforge.cpp
index 80bfa651301..80bfa651301 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_general_angerforge.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_general_angerforge.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_gorosh_the_dervish.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp
index d79c4d191b6..d79c4d191b6 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_gorosh_the_dervish.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_grizzle.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp
index 504fca44c4c..504fca44c4c 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_grizzle.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_high_interrogator_gerstahn.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp
index 7a98cc321dc..7a98cc321dc 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_high_interrogator_gerstahn.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_magmus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp
index 998e7b17897..998e7b17897 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_magmus.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_moira_bronzebeard.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp
index 9021649a61e..9021649a61e 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_moira_bronzebeard.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_tomb_of_seven.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp
index 55e6862bda7..55e6862bda7 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_tomb_of_seven.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/instance_blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp
index b9ff40f8285..b9ff40f8285 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/instance_blackrock_depths.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h
index 5c34a30912a..e2295521a5b 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h
@@ -18,7 +18,7 @@
#ifndef DEF_BLACKROCK_SPIRE_H
#define DEF_BLACKROCK_SPIRE_H
-uint32 const EncounterCount = 22;
+uint32 const EncounterCount = 23;
#define BRSScriptName "instance_blackrock_spire"
@@ -38,15 +38,16 @@ enum DataTypes
DATA_GYTH = 11,
DATA_THE_BEAST = 12,
DATA_GENERAL_DRAKKISATH = 13,
+ DATA_LORD_VALTHALAK = 14,
// Extra
- DATA_DRAGONSPIRE_ROOM = 14,
- DATA_HALL_RUNE_1 = 15,
- DATA_HALL_RUNE_2 = 16,
- DATA_HALL_RUNE_3 = 17,
- DATA_HALL_RUNE_4 = 18,
- DATA_HALL_RUNE_5 = 19,
- DATA_HALL_RUNE_6 = 20,
- DATA_HALL_RUNE_7 = 21
+ DATA_DRAGONSPIRE_ROOM = 15,
+ DATA_HALL_RUNE_1 = 16,
+ DATA_HALL_RUNE_2 = 17,
+ DATA_HALL_RUNE_3 = 18,
+ DATA_HALL_RUNE_4 = 19,
+ DATA_HALL_RUNE_5 = 20,
+ DATA_HALL_RUNE_6 = 21,
+ DATA_HALL_RUNE_7 = 22
};
enum CreaturesIds
@@ -75,6 +76,7 @@ enum CreaturesIds
enum AdditionalData
{
SPELL_SUMMON_ROOKERY_WHELP = 15745,
+ EVENT_UROK_DOOMHOWL = 4845,
EVENT_PYROGUARD_EMBERSEER = 4884,
AREATRIGGER = 1,
AREATRIGGER_DRAGONSPIRE_HALL = 2046,
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_drakkisath.cpp
index 59581204b05..59581204b05 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_drakkisath.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gizrul_the_slavener.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gizrul_the_slavener.cpp
index f1bd81f2e6a..f1bd81f2e6a 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gizrul_the_slavener.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gizrul_the_slavener.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp
index dbc3056b1ff..dbc3056b1ff 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_halycon.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp
index 630d6ff2a0d..630d6ff2a0d 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_halycon.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_highlord_omokk.cpp
index 54ed5d44e34..54ed5d44e34 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_highlord_omokk.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp
new file mode 100644
index 00000000000..b54c8f11f34
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "blackrock_spire.h"
+
+enum Spells
+{
+ SPELL_FRENZY = 8269,
+ SPELL_SUMMON_SPECTRAL_ASSASSIN = 27249,
+ SPELL_SHADOW_BOLT_VOLLEY = 27382,
+ SPELL_SHADOW_WRATH = 27286
+};
+
+enum Says
+{
+ EMOTE_FRENZY = 0
+};
+
+enum Events
+{
+ EVENT_SUMMON_SPECTRAL_ASSASSIN = 1,
+ EVENT_SHADOW_BOLT_VOLLEY = 2,
+ EVENT_SHADOW_WRATH = 3
+};
+
+class boss_lord_valthalak : public CreatureScript
+{
+public:
+ boss_lord_valthalak() : CreatureScript("boss_lord_valthalak") { }
+
+ struct boss_lord_valthalakAI : public BossAI
+ {
+ boss_lord_valthalakAI(Creature* creature) : BossAI(creature, DATA_LORD_VALTHALAK) {}
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ frenzy40 = false;
+ frenzy15 = false;
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN, urand(6000,8000));
+ events.ScheduleEvent(EVENT_SHADOW_WRATH, urand(9000,18000));
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ if (instance)
+ instance->SetData(DATA_LORD_VALTHALAK, DONE);
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SUMMON_SPECTRAL_ASSASSIN:
+ DoCast(me, SPELL_SUMMON_SPECTRAL_ASSASSIN);
+ events.ScheduleEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN, urand(30000,35000));
+ break;
+ case EVENT_SHADOW_BOLT_VOLLEY:
+ DoCastVictim(SPELL_SHADOW_BOLT_VOLLEY);
+ events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, urand(4000,6000));
+ break;
+ case EVENT_SHADOW_WRATH:
+ DoCastVictim(SPELL_SHADOW_WRATH);
+ events.ScheduleEvent(EVENT_SHADOW_WRATH, urand(19000,24000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (!frenzy40)
+ {
+ if (HealthBelowPct(40))
+ {
+ DoCast(me, SPELL_FRENZY);
+ events.CancelEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN);
+ frenzy40 = true;
+ }
+ }
+
+ if (!frenzy15)
+ {
+ if (HealthBelowPct(15))
+ {
+ DoCast(me, SPELL_FRENZY);
+ events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, urand(7000,14000));
+ frenzy15 = true;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ private:
+ bool frenzy40;
+ bool frenzy15;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_lord_valthalakAI(creature);
+ }
+};
+
+void AddSC_boss_lord_valthalak()
+{
+ new boss_lord_valthalak();
+}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_mother_smolderweb.cpp
index 608cb75bbb2..608cb75bbb2 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_mother_smolderweb.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_overlord_wyrmthalak.cpp
index 2b68b640720..2b68b640720 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_overlord_wyrmthalak.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp
index b84be2feb17..57c3dfac7ff 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp
@@ -227,7 +227,7 @@ public:
{
creatureList->Respawn();
}
- creatureList->AI()->SetData(1, 2);
+ creatureList->AI()->SetData(1, 1);
}
me->AddAura(SPELL_ENCAGED_EMBERSEER, me);
instance->SetBossState(DATA_PYROGAURD_EMBERSEER, NOT_STARTED);
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_quartermaster_zigris.cpp
index a20822839e6..a20822839e6 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_quartermaster_zigris.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp
index 275b3802764..275b3802764 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp
index 1936e5e72d0..1936e5e72d0 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_the_beast.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp
index c4abaac158c..c4abaac158c 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_the_beast.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_urok_doomhowl.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_urok_doomhowl.cpp
index afee357aad5..afee357aad5 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_urok_doomhowl.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_urok_doomhowl.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp
index e3423fd02b6..e3423fd02b6 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
index f07e426c808..f0d252a5c5e 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
@@ -33,7 +33,13 @@ uint32 const DragonspireMobs[3] = { NPC_BLACKHAND_DREADWEAVER, NPC_BLACKHAND_SUM
enum EventIds
{
EVENT_DARGONSPIRE_ROOM_STORE = 1,
- EVENT_DARGONSPIRE_ROOM_CHECK = 2
+ EVENT_DARGONSPIRE_ROOM_CHECK = 2,
+ EVENT_UROK_DOOMHOWL_SPAWNS_1 = 3,
+ EVENT_UROK_DOOMHOWL_SPAWNS_2 = 4,
+ EVENT_UROK_DOOMHOWL_SPAWNS_3 = 5,
+ EVENT_UROK_DOOMHOWL_SPAWNS_4 = 6,
+ EVENT_UROK_DOOMHOWL_SPAWNS_5 = 7,
+ EVENT_UROK_DOOMHOWL_SPAWN_IN = 8
};
class instance_blackrock_spire : public InstanceMapScript
@@ -275,6 +281,12 @@ public:
Emberseer->AI()->SetData(1, 1);
}
break;
+ case EVENT_UROK_DOOMHOWL:
+ if (GetBossState(NPC_UROK_DOOMHOWL) == NOT_STARTED)
+ {
+
+ }
+ break;
default:
break;
}
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/blackwing_lair.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h
index acdbf0cd483..acdbf0cd483 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/blackwing_lair.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp
index c9dc3d8f134..c9dc3d8f134 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_chromaggus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp
index 05effabe557..05effabe557 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_chromaggus.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_ebonroc.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp
index 0d79f3faeee..0d79f3faeee 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_ebonroc.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_firemaw.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp
index 369e4e02f5a..369e4e02f5a 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_firemaw.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp
index 060bfeb60b3..060bfeb60b3 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp
index d49cca2045f..d49cca2045f 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp
index be2aeb9e223..be2aeb9e223 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_razorgore.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_vaelastrasz.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp
index c595f3acaff..c595f3acaff 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_vaelastrasz.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/instance_blackwing_lair.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp
index d904e0a89f8..d904e0a89f8 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/instance_blackwing_lair.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_baron_geddon.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp
index e9ac15147f9..e9ac15147f9 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_baron_geddon.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_garr.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp
index 5eabc11618b..5eabc11618b 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_garr.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_gehennas.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp
index 15079953a34..15079953a34 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_gehennas.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_golemagg.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp
index 0fdb88923b3..0fdb88923b3 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_golemagg.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_lucifron.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp
index 31f4e40552f..31f4e40552f 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_lucifron.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_magmadar.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp
index 7d40b9630ae..7d40b9630ae 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_magmadar.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp
index 1001516d42e..1001516d42e 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_ragnaros.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp
index d03f756f366..d03f756f366 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_ragnaros.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_shazzrah.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp
index 7c1d1af7d29..7c1d1af7d29 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_shazzrah.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp
index 681f4f72bc6..681f4f72bc6 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/instance_molten_core.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp
index 04e652b7f80..04e652b7f80 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/instance_molten_core.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/molten_core.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h
index 407e3ee5204..407e3ee5204 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/molten_core.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h
diff --git a/src/server/scripts/EasternKingdoms/CMakeLists.txt b/src/server/scripts/EasternKingdoms/CMakeLists.txt
index 41d6179b169..53d37d83610 100644
--- a/src/server/scripts/EasternKingdoms/CMakeLists.txt
+++ b/src/server/scripts/EasternKingdoms/CMakeLists.txt
@@ -17,6 +17,58 @@ set(scripts_STAT_SRCS
EasternKingdoms/AlteracValley/boss_drekthar.cpp
EasternKingdoms/AlteracValley/boss_vanndar.cpp
EasternKingdoms/AlteracValley/alterac_valley.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_general_angerforge.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h
+ EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp
+ EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp
+ EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp
+ EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp
+ EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp
+ EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp
+ EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp
+ EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp
+ EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp
+ EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp
+ EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h
+ EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_drakkisath.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_mother_smolderweb.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_quartermaster_zigris.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_overlord_wyrmthalak.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_highlord_omokk.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gizrul_the_slavener.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_urok_doomhowl.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp
+ EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h
+ EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
+ EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp
+ EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp
+ EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp
+ EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp
+ EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp
+ EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp
+ EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp
+ EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h
+ EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp
+ EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp
+ EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp
+ EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp
EasternKingdoms/Scholomance/boss_the_ravenian.cpp
EasternKingdoms/Scholomance/boss_instructor_malicia.cpp
EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp
@@ -55,37 +107,12 @@ set(scripts_STAT_SRCS
EasternKingdoms/Gnomeregan/gnomeregan.cpp
EasternKingdoms/Gnomeregan/gnomeregan.h
EasternKingdoms/zone_redridge_mountains.cpp
- EasternKingdoms/BlackrockDepths/boss_high_interrogator_gerstahn.cpp
- EasternKingdoms/BlackrockDepths/boss_gorosh_the_dervish.cpp
- EasternKingdoms/BlackrockDepths/blackrock_depths.cpp
- EasternKingdoms/BlackrockDepths/boss_anubshiah.cpp
- EasternKingdoms/BlackrockDepths/boss_tomb_of_seven.cpp
- EasternKingdoms/BlackrockDepths/boss_general_angerforge.cpp
- EasternKingdoms/BlackrockDepths/boss_grizzle.cpp
- EasternKingdoms/BlackrockDepths/boss_ambassador_flamelash.cpp
- EasternKingdoms/BlackrockDepths/instance_blackrock_depths.cpp
- EasternKingdoms/BlackrockDepths/boss_moira_bronzebeard.cpp
- EasternKingdoms/BlackrockDepths/blackrock_depths.h
- EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp
- EasternKingdoms/BlackrockDepths/boss_magmus.cpp
EasternKingdoms/zone_ironforge.cpp
EasternKingdoms/ScarletEnclave/chapter2.cpp
EasternKingdoms/ScarletEnclave/chapter5.cpp
EasternKingdoms/ScarletEnclave/chapter1.cpp
EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp
EasternKingdoms/zone_eastern_plaguelands.cpp
- EasternKingdoms/MoltenCore/boss_gehennas.cpp
- EasternKingdoms/MoltenCore/boss_lucifron.cpp
- EasternKingdoms/MoltenCore/boss_golemagg.cpp
- EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp
- EasternKingdoms/MoltenCore/boss_baron_geddon.cpp
- EasternKingdoms/MoltenCore/boss_ragnaros.cpp
- EasternKingdoms/MoltenCore/boss_garr.cpp
- EasternKingdoms/MoltenCore/molten_core.h
- EasternKingdoms/MoltenCore/instance_molten_core.cpp
- EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp
- EasternKingdoms/MoltenCore/boss_magmadar.cpp
- EasternKingdoms/MoltenCore/boss_shazzrah.cpp
EasternKingdoms/Stratholme/boss_baroness_anastari.cpp
EasternKingdoms/Stratholme/boss_nerubenkan.cpp
EasternKingdoms/Stratholme/instance_stratholme.cpp
@@ -117,22 +144,6 @@ set(scripts_STAT_SRCS
EasternKingdoms/Uldaman/instance_uldaman.cpp
EasternKingdoms/Uldaman/boss_archaedas.cpp
EasternKingdoms/zone_swamp_of_sorrows.cpp
- EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp
- EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp
- EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp
- EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp
- EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp
- EasternKingdoms/BlackrockSpire/boss_halycon.cpp
- EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp
- EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp
- EasternKingdoms/BlackrockSpire/boss_gyth.cpp
- EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp
- EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp
- EasternKingdoms/BlackrockSpire/boss_the_beast.cpp
- EasternKingdoms/BlackrockSpire/boss_gizrul_the_slavener.cpp
- EasternKingdoms/BlackrockSpire/boss_urok_doomhowl.cpp
- EasternKingdoms/BlackrockSpire/blackrock_spire.h
- EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp
EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
EasternKingdoms/SunwellPlateau/sunwell_plateau.h
@@ -167,16 +178,6 @@ set(scripts_STAT_SRCS
EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp
EasternKingdoms/ShadowfangKeep/shadowfang_keep.h
EasternKingdoms/zone_burning_steppes.cpp
- EasternKingdoms/BlackwingLair/boss_chromaggus.cpp
- EasternKingdoms/BlackwingLair/boss_razorgore.cpp
- EasternKingdoms/BlackwingLair/boss_firemaw.cpp
- EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp
- EasternKingdoms/BlackwingLair/boss_ebonroc.cpp
- EasternKingdoms/BlackwingLair/instance_blackwing_lair.cpp
- EasternKingdoms/BlackwingLair/boss_vaelastrasz.cpp
- EasternKingdoms/BlackwingLair/boss_nefarian.cpp
- EasternKingdoms/BlackwingLair/boss_flamegor.cpp
- EasternKingdoms/BlackwingLair/blackwing_lair.h
EasternKingdoms/zone_blasted_lands.cpp
EasternKingdoms/zone_stormwind_city.cpp
EasternKingdoms/ZulAman/boss_halazzi.cpp
diff --git a/src/server/scripts/Examples/example_spell.cpp b/src/server/scripts/Examples/example_spell.cpp
index 30206ec555c..8e22c4b66c8 100644
--- a/src/server/scripts/Examples/example_spell.cpp
+++ b/src/server/scripts/Examples/example_spell.cpp
@@ -50,7 +50,7 @@ class spell_ex_5581 : public SpellScriptLoader
// function called on server startup
// checks if script has data required for it to work
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
// check if spellid 70522 exists in dbc, we will trigger it later
if (!sSpellMgr->GetSpellInfo(SPELL_TRIGGERED))
@@ -208,7 +208,7 @@ class spell_ex_66244 : public SpellScriptLoader
PrepareAuraScript(spell_ex_66244AuraScript);
// function called on server startup
// checks if script has data required for it to work
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
// check if spellid exists in dbc, we will trigger it later
if (!sSpellMgr->GetSpellInfo(SPELL_TRIGGERED))
diff --git a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp
index f59dbb785a8..c8d83a54e1e 100644
--- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp
+++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp
@@ -400,12 +400,12 @@ public:
## go_shallow_grave
######*/
-enum
+enum ShallowGrave
{
- ZOMBIE = 7286,
- DEAD_HERO = 7276,
- ZOMBIE_CHANCE = 65,
- DEAD_HERO_CHANCE = 10
+ NPC_ZOMBIE = 7286,
+ NPC_DEAD_HERO = 7276,
+ CHANCE_ZOMBIE = 65,
+ CHANCE_DEAD_HERO = 10
};
class go_shallow_grave : public GameObjectScript
@@ -419,11 +419,11 @@ public:
if (go->GetUseCount() == 0)
{
uint32 randomchance = urand(0, 100);
- if (randomchance < ZOMBIE_CHANCE)
- go->SummonCreature(ZOMBIE, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
+ if (randomchance < CHANCE_ZOMBIE)
+ go->SummonCreature(NPC_ZOMBIE, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
else
- if ((randomchance - ZOMBIE_CHANCE) < DEAD_HERO_CHANCE)
- go->SummonCreature(DEAD_HERO, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
+ if ((randomchance - CHANCE_ZOMBIE) < CHANCE_DEAD_HERO)
+ go->SummonCreature(NPC_DEAD_HERO, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
}
go->AddUse();
return false;
diff --git a/src/server/scripts/Kalimdor/zone_durotar.cpp b/src/server/scripts/Kalimdor/zone_durotar.cpp
index 63309c0502d..1eec2c826ea 100644
--- a/src/server/scripts/Kalimdor/zone_durotar.cpp
+++ b/src/server/scripts/Kalimdor/zone_durotar.cpp
@@ -448,7 +448,8 @@ class spell_mount_check : public SpellScriptLoader
class spell_mount_check_AuraScript : public AuraScript
{
PrepareAuraScript(spell_mount_check_AuraScript)
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_MOUNTING_CHECK))
return false;
@@ -495,7 +496,8 @@ class spell_voljin_war_drums : public SpellScriptLoader
class spell_voljin_war_drums_SpellScript : public SpellScript
{
PrepareSpellScript(spell_voljin_war_drums_SpellScript)
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_MOTIVATE_1))
return false;
@@ -552,7 +554,7 @@ class spell_voodoo : public SpellScriptLoader
{
PrepareSpellScript(spell_voodoo_SpellScript)
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_BREW) || !sSpellMgr->GetSpellInfo(SPELL_GHOSTLY) ||
!sSpellMgr->GetSpellInfo(SPELL_HEX1) || !sSpellMgr->GetSpellInfo(SPELL_HEX2) ||
diff --git a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
index b9d3c6f1cc6..33cce095abf 100644
--- a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
+++ b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
@@ -612,7 +612,7 @@ class spell_ooze_zap : public SpellScriptLoader
{
PrepareSpellScript(spell_ooze_zap_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_OOZE_ZAP))
return false;
@@ -659,7 +659,7 @@ class spell_ooze_zap_channel_end : public SpellScriptLoader
{
PrepareSpellScript(spell_ooze_zap_channel_end_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_OOZE_ZAP_CHANNEL_END))
return false;
@@ -695,7 +695,7 @@ class spell_energize_aoe : public SpellScriptLoader
{
PrepareSpellScript(spell_energize_aoe_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_ENERGIZED))
return false;
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
index 7771451894e..05e758f5cf9 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
@@ -52,7 +52,7 @@ enum Yells
SAY_INTRO = 5
};
-enum
+enum Misc
{
ACHIEV_TIMED_START_EVENT = 20381,
};
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp
index 3dc537b4c23..ce0f8e4778c 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp
@@ -2312,7 +2312,7 @@ class spell_toc_bloodlust : public SpellScriptLoader
{
PrepareSpellScript(spell_toc_bloodlust_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(AURA_SATED))
return false;
@@ -2353,7 +2353,7 @@ class spell_toc_heroism : public SpellScriptLoader
{
PrepareSpellScript(spell_toc_heroism_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(AURA_EXHAUSTION))
return false;
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
index b590b963c34..fdf39519409 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
@@ -99,7 +99,7 @@ static _Messages _GossipMessage[]=
{MSG_ANUBARAK, GOSSIP_ACTION_INFO_DEF + 6, true, BOSS_ANUBARAK}
};
-enum
+enum Messages
{
NUM_MESSAGES = 6
};
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h
index 0d64655db77..17e4f2869c6 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h
@@ -5,7 +5,7 @@
#ifndef DEF_CRUSADER_H
#define DEF_CRUSADER_H
-enum
+enum DataTypes
{
BOSS_BEASTS = 0,
BOSS_JARAXXUS = 1,
@@ -28,12 +28,18 @@ enum
INCREASE = 501,
DECREASE = 502,
+};
+enum SpellIds
+{
SPELL_WILFRED_PORTAL = 68424,
SPELL_JARAXXUS_CHAINS = 67924,
SPELL_CORPSE_TELEPORT = 69016,
SPELL_DESTROY_FLOOR_KNOCKUP = 68193,
+};
+enum MiscData
+{
DESPAWN_TIME = 300000,
DISPLAYID_DESTROYED_FLOOR = 9060
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
index 785038137d9..0160359f0f2 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
@@ -20,21 +20,14 @@
#include "ScriptedCreature.h"
#include "drak_tharon_keep.h"
-enum Misc
-{
- ACTION_RESET_CRYSTALS,
- ACTION_ACTIVATE_CRYSTAL,
- ACTION_DEACTIVATE,
- EVENT_ATTACK,
- EVENT_SUMMON_MINIONS,
- DATA_NOVOS_ACHIEV
-};
-
-enum Creatures
+enum Yells
{
- NPC_FETID_TROLL_CORPSE = 27598,
- NPC_RISEN_SHADOWCASTER = 27600,
- NPC_HULKING_CORPSE = 27597
+ SAY_AGGRO = 0,
+ SAY_KILL = 1,
+ SAY_DEATH = 2,
+ SAY_SUMMONING_ADDS = 3, // unused
+ SAY_ARCANE_FIELD = 4,
+ EMOTE_SUMMONING_ADDS = 5 // unused
};
enum Spells
@@ -46,6 +39,7 @@ enum Spells
SPELL_SUMMON_FETID_TROLL_CORPSE = 49103,
SPELL_SUMMON_HULKING_CORPSE = 49104,
SPELL_SUMMON_CRYSTAL_HANDLER = 49179,
+ SPELL_SUMMON_COPY_OF_MINIONS = 59933,
SPELL_ARCANE_BLAST = 49198,
SPELL_BLIZZARD = 49034,
@@ -54,6 +48,16 @@ enum Spells
SPELL_SUMMON_MINIONS = 59910
};
+enum Misc
+{
+ ACTION_RESET_CRYSTALS,
+ ACTION_ACTIVATE_CRYSTAL,
+ ACTION_DEACTIVATE,
+ EVENT_ATTACK,
+ EVENT_SUMMON_MINIONS,
+ DATA_NOVOS_ACHIEV
+};
+
struct SummonerInfo
{
uint32 data, spell, timer;
@@ -92,6 +96,7 @@ public:
void EnterCombat(Unit* /* victim */) OVERRIDE
{
_EnterCombat();
+ Talk(SAY_AGGRO);
SetCrystalsStatus(true);
SetSummonerStatus(true);
@@ -107,6 +112,18 @@ public:
DoStartNoMovement(target);
}
+ void KilledUnit(Unit* who) OVERRIDE
+ {
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_KILL);
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
void UpdateAI(uint32 diff) OVERRIDE
{
if (!UpdateVictim() || _bubbled)
@@ -210,9 +227,6 @@ public:
void SetCrystalStatus(GameObject* crystal, bool active)
{
- if (!crystal)
- return;
-
crystal->SetGoState(active ? GO_STATE_ACTIVE : GO_STATE_READY);
if (Creature* crystalChannelTarget = crystal->FindNearestCreature(NPC_CRYSTAL_CHANNEL_TARGET, 5.0f))
{
@@ -236,6 +250,7 @@ public:
if (++_crystalHandlerCount >= 4)
{
+ Talk(SAY_ARCANE_FIELD);
SetSummonerStatus(false);
SetBubbled(false);
events.ScheduleEvent(EVENT_ATTACK, 3000);
@@ -332,42 +347,44 @@ public:
}
};
-enum SummonMinions
+class spell_novos_summon_minions : public SpellScriptLoader
{
- SPELL_COPY_OF_SUMMON_MINIONS = 59933
-};
+ public:
+ spell_novos_summon_minions() : SpellScriptLoader("spell_novos_summon_minions") { }
-class spell_summon_minions : public SpellScriptLoader
-{
-public:
- spell_summon_minions() : SpellScriptLoader("spell_summon_minions") { }
+ class spell_novos_summon_minions_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_novos_summon_minions_SpellScript);
- class spell_summon_minions_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_summon_minions_SpellScript);
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_COPY_OF_MINIONS))
+ return false;
+ return true;
+ }
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell((Unit*)NULL, SPELL_COPY_OF_SUMMON_MINIONS, true);
- GetCaster()->CastSpell((Unit*)NULL, SPELL_COPY_OF_SUMMON_MINIONS, true);
- }
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ for (uint8 i = 0; i < 2; ++i)
+ GetCaster()->CastSpell((Unit*)NULL, SPELL_SUMMON_COPY_OF_MINIONS, true);
+ }
- void Register() OVERRIDE
+ void Register() OVERRIDE
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_novos_summon_minions_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
{
- OnEffectHitTarget += SpellEffectFn(spell_summon_minions_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ return new spell_novos_summon_minions_SpellScript();
}
- };
-
- SpellScript* GetSpellScript() const OVERRIDE
- {
- return new spell_summon_minions_SpellScript();
- }
};
void AddSC_boss_novos()
{
new boss_novos();
new npc_crystal_channel_target();
- new spell_summon_minions();
+ new spell_novos_summon_minions();
new achievement_oh_novos();
}
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
index d126340ef51..d0cec8a4f43 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
@@ -15,186 +15,313 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/*
- * Comment: @todo spawn troll waves
- */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
-#include "SpellAuras.h"
+#include "SpellScript.h"
+#include "SpellAuraEffects.h"
#include "drak_tharon_keep.h"
enum Spells
{
- SPELL_INFECTED_WOUND = 49637,
- SPELL_CRUSH = 49639,
- SPELL_CORPSE_EXPLODE = 49555,
- SPELL_CONSUME = 49380,
- SPELL_CONSUME_AURA = 49381,
- // Heroic spells
- H_SPELL_CORPSE_EXPLODE = 59807,
- H_SPELL_CONSUME = 59803,
- H_SPELL_CONSUME_AURA = 59805,
+ SPELL_INFECTED_WOUND = 49637,
+ SPELL_CRUSH = 49639,
+ SPELL_CORPSE_EXPLODE = 49555,
+ SPELL_CORPSE_EXPLODE_DAMAGE = 49618,
+ SPELL_CONSUME = 49380,
+ SPELL_CONSUME_BUFF = 49381,
+ SPELL_CONSUME_BUFF_H = 59805,
+
+ SPELL_SUMMON_INVADER_A = 49456,
+ SPELL_SUMMON_INVADER_B = 49457,
+ SPELL_SUMMON_INVADER_C = 49458, // can't find any sniffs
+
+ SPELL_INVADER_TAUNT = 49405
};
+#define SPELL_CONSUME_BUFF_HELPER DUNGEON_MODE<uint32>(SPELL_CONSUME_BUFF, SPELL_CONSUME_BUFF_H)
+
enum Yells
{
- SAY_AGGRO = 0,
- SAY_KILL = 1,
- SAY_CONSUME = 2,
- SAY_EXPLODE = 3,
- SAY_DEATH = 4
+ SAY_AGGRO = 0,
+ SAY_KILL = 1,
+ SAY_CONSUME = 2,
+ SAY_EXPLODE = 3,
+ SAY_DEATH = 4
};
-enum Creatures
+enum Misc
{
- NPC_DRAKKARI_INVADER_1 = 27753,
- NPC_DRAKKARI_INVADER_2 = 27709
+ DATA_CONSUMPTION_JUNCTION = 1,
+ POINT_LANDING = 1
};
-enum Misc
+enum Events
{
- DATA_CONSUMPTION_JUNCTION = 1
+ EVENT_CONSUME = 1,
+ EVENT_CRUSH,
+ EVENT_INFECTED_WOUND,
+ EVENT_CORPSE_EXPLODE,
+ EVENT_SPAWN
};
-Position AddSpawnPoint = { -260.493011f, -622.968018f, 26.605301f, 3.036870f };
+Position const Landing = { -263.0534f, -660.8658f, 26.50903f, 0.0f };
class boss_trollgore : public CreatureScript
{
-public:
- boss_trollgore() : CreatureScript("boss_trollgore") { }
+ public:
+ boss_trollgore() : CreatureScript("boss_trollgore") { }
- struct boss_trollgoreAI : public ScriptedAI
- {
- boss_trollgoreAI(Creature* creature) : ScriptedAI(creature), lSummons(me)
+ struct boss_trollgoreAI : public BossAI
{
- instance = creature->GetInstanceScript();
- }
+ boss_trollgoreAI(Creature* creature) : BossAI(creature, DATA_TROLLGORE) { }
- uint32 uiConsumeTimer;
- uint32 uiAuraCountTimer;
- uint32 uiCrushTimer;
- uint32 uiInfectedWoundTimer;
- uint32 uiExplodeCorpseTimer;
- uint32 uiSpawnTimer;
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ _consumptionJunction = true;
+ }
- bool consumptionJunction;
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ Talk(SAY_AGGRO);
+
+ events.ScheduleEvent(EVENT_CONSUME, 15000);
+ events.ScheduleEvent(EVENT_CRUSH, urand(1000, 5000));
+ events.ScheduleEvent(EVENT_INFECTED_WOUND, urand(10000, 60000));
+ events.ScheduleEvent(EVENT_CORPSE_EXPLODE, 3000);
+ events.ScheduleEvent(EVENT_SPAWN, urand(30000, 40000));
+ }
- SummonList lSummons;
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_CONSUME:
+ Talk(SAY_CONSUME);
+ DoCastAOE(SPELL_CONSUME);
+ events.ScheduleEvent(EVENT_CONSUME, 15000);
+ break;
+ case EVENT_CRUSH:
+ DoCastVictim(SPELL_CRUSH);
+ events.ScheduleEvent(EVENT_CRUSH, urand(10000, 15000));
+ break;
+ case EVENT_INFECTED_WOUND:
+ DoCastVictim(SPELL_INFECTED_WOUND);
+ events.ScheduleEvent(EVENT_INFECTED_WOUND, urand(25000, 35000));
+ break;
+ case EVENT_CORPSE_EXPLODE:
+ Talk(SAY_EXPLODE);
+ DoCastAOE(SPELL_CORPSE_EXPLODE);
+ events.ScheduleEvent(EVENT_CORPSE_EXPLODE, urand(15000, 19000));
+ break;
+ case EVENT_SPAWN:
+ for (uint8 i = 0; i < 3; ++i)
+ if (Creature* trigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_TROLLGORE_INVADER_SUMMONER_1 + i)))
+ trigger->CastSpell(trigger, RAND(SPELL_SUMMON_INVADER_A, SPELL_SUMMON_INVADER_B, SPELL_SUMMON_INVADER_C), true, NULL, NULL, me->GetGUID());
+
+ events.ScheduleEvent(EVENT_SPAWN, urand(30000, 40000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (_consumptionJunction)
+ {
+ Aura* ConsumeAura = me->GetAura(SPELL_CONSUME_BUFF_HELPER);
+ if (ConsumeAura && ConsumeAura->GetStackAmount() > 9)
+ _consumptionJunction = false;
+ }
+
+ DoMeleeAttackIfReady();
+ }
- InstanceScript* instance;
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
- void Reset() OVERRIDE
- {
- uiConsumeTimer = 15*IN_MILLISECONDS;
- uiAuraCountTimer = 15500;
- uiCrushTimer = urand(1*IN_MILLISECONDS, 5*IN_MILLISECONDS);
- uiInfectedWoundTimer = urand(10*IN_MILLISECONDS, 60*IN_MILLISECONDS);
- uiExplodeCorpseTimer = 3*IN_MILLISECONDS;
- uiSpawnTimer = urand(30*IN_MILLISECONDS, 40*IN_MILLISECONDS);
+ uint32 GetData(uint32 type) const OVERRIDE
+ {
+ if (type == DATA_CONSUMPTION_JUNCTION)
+ return _consumptionJunction ? 1 : 0;
- consumptionJunction = true;
+ return 0;
+ }
- lSummons.DespawnAll();
+ void KilledUnit(Unit* victim) OVERRIDE
+ {
+ if (victim->GetTypeId() != TYPEID_PLAYER)
+ return;
- me->RemoveAura(DUNGEON_MODE(SPELL_CONSUME_AURA, H_SPELL_CONSUME_AURA));
+ Talk(SAY_KILL);
+ }
- instance->SetData(DATA_TROLLGORE, NOT_STARTED);
+ void JustSummoned(Creature* summon) OVERRIDE
+ {
+ summon->GetMotionMaster()->MovePoint(POINT_LANDING, Landing);
+ summons.Summon(summon);
+ }
+
+ private:
+ bool _consumptionJunction;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetDrakTharonKeepAI<boss_trollgoreAI>(creature);
}
+};
- void EnterCombat(Unit* /*who*/) OVERRIDE
+class npc_drakkari_invader : public CreatureScript
+{
+ public:
+ npc_drakkari_invader() : CreatureScript("npc_drakkari_invader") { }
+
+ struct npc_drakkari_invaderAI : public ScriptedAI
{
- Talk(SAY_AGGRO);
- instance->SetBossState(DATA_TROLLGORE, IN_PROGRESS);
+ npc_drakkari_invaderAI(Creature* creature) : ScriptedAI(creature) { }
+
+ void MovementInform(uint32 type, uint32 pointId) OVERRIDE
+ {
+ if (type == POINT_MOTION_TYPE && pointId == POINT_LANDING)
+ {
+ me->Dismount();
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
+ DoCastAOE(SPELL_INVADER_TAUNT);
+ }
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetDrakTharonKeepAI<npc_drakkari_invaderAI>(creature);
}
+};
- void UpdateAI(uint32 diff) OVERRIDE
+// 49380, 59803 - Consume
+class spell_trollgore_consume : public SpellScriptLoader
+{
+ public:
+ spell_trollgore_consume() : SpellScriptLoader("spell_trollgore_consume") { }
+
+ class spell_trollgore_consume_SpellScript : public SpellScript
{
- //Return since we have no target
- if (!UpdateVictim())
- return;
+ PrepareSpellScript(spell_trollgore_consume_SpellScript);
- if (uiSpawnTimer <= diff)
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
- uint32 spawnNumber = urand(2, DUNGEON_MODE(3, 5));
- for (uint8 i = 0; i < spawnNumber; ++i)
- DoSummon(RAND(NPC_DRAKKARI_INVADER_1, NPC_DRAKKARI_INVADER_2), AddSpawnPoint, 0, TEMPSUMMON_DEAD_DESPAWN);
- uiSpawnTimer = urand(30*IN_MILLISECONDS, 40*IN_MILLISECONDS);
- } else uiSpawnTimer -= diff;
+ if (!sSpellMgr->GetSpellInfo(SPELL_CONSUME_BUFF))
+ return false;
+ return true;
+ }
- if (uiConsumeTimer <= diff)
+ void HandleConsume(SpellEffIndex /*effIndex*/)
{
- Talk(SAY_CONSUME);
- DoCast(SPELL_CONSUME);
- uiConsumeTimer = 15*IN_MILLISECONDS;
- } else uiConsumeTimer -= diff;
+ if (Unit* target = GetHitUnit())
+ target->CastSpell(GetCaster(), SPELL_CONSUME_BUFF, true);
+ }
- if (consumptionJunction)
+ void Register() OVERRIDE
{
- Aura* ConsumeAura = me->GetAura(DUNGEON_MODE(SPELL_CONSUME_AURA, H_SPELL_CONSUME_AURA));
- if (ConsumeAura && ConsumeAura->GetStackAmount() > 9)
- consumptionJunction = false;
+ OnEffectHitTarget += SpellEffectFn(spell_trollgore_consume_SpellScript::HandleConsume, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
}
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_trollgore_consume_SpellScript();
+ }
+};
- if (uiCrushTimer <= diff)
+// 49555, 59807 - Corpse Explode
+class spell_trollgore_corpse_explode : public SpellScriptLoader
+{
+ public:
+ spell_trollgore_corpse_explode() : SpellScriptLoader("spell_trollgore_corpse_explode") { }
+
+ class spell_trollgore_corpse_explode_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_trollgore_corpse_explode_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
- DoCastVictim(SPELL_CRUSH);
- uiCrushTimer = urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS);
- } else uiCrushTimer -= diff;
+ if (!sSpellMgr->GetSpellInfo(SPELL_CORPSE_EXPLODE_DAMAGE))
+ return false;
+ return true;
+ }
- if (uiInfectedWoundTimer <= diff)
+ void PeriodicTick(AuraEffect const* aurEff)
{
- DoCastVictim(SPELL_INFECTED_WOUND);
- uiInfectedWoundTimer = urand(25*IN_MILLISECONDS, 35*IN_MILLISECONDS);
- } else uiInfectedWoundTimer -= diff;
+ if (aurEff->GetTickNumber() == 2)
+ if (Unit* caster = GetCaster())
+ caster->CastSpell(GetTarget(), SPELL_CORPSE_EXPLODE_DAMAGE, true, NULL, aurEff);
+ }
- if (uiExplodeCorpseTimer <= diff)
+ void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
- DoCast(SPELL_CORPSE_EXPLODE);
- Talk(SAY_EXPLODE);
- uiExplodeCorpseTimer = urand(15*IN_MILLISECONDS, 19*IN_MILLISECONDS);
- } else uiExplodeCorpseTimer -= diff;
+ if (Creature* target = GetTarget()->ToCreature())
+ target->DespawnOrUnsummon();
+ }
- DoMeleeAttackIfReady();
- }
+ void Register() OVERRIDE
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_trollgore_corpse_explode_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_trollgore_corpse_explode_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
- void JustDied(Unit* /*killer*/) OVERRIDE
+ AuraScript* GetAuraScript() const OVERRIDE
{
- Talk(SAY_DEATH);
-
- lSummons.DespawnAll();
-
- instance->SetBossState(DATA_TROLLGORE, DONE);
+ return new spell_trollgore_corpse_explode_AuraScript();
}
+};
- uint32 GetData(uint32 type) const OVERRIDE
+// 49405 - Invader Taunt Trigger
+class spell_trollgore_invader_taunt : public SpellScriptLoader
+{
+ public:
+ spell_trollgore_invader_taunt() : SpellScriptLoader("spell_trollgore_invader_taunt") { }
+
+ class spell_trollgore_invader_taunt_SpellScript : public SpellScript
{
- if (type == DATA_CONSUMPTION_JUNCTION)
- return consumptionJunction ? 1 : 0;
+ PrepareSpellScript(spell_trollgore_invader_taunt_SpellScript);
- return 0;
- }
+ bool Validate(SpellInfo const* spellInfo) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].CalcValue()))
+ return false;
+ return true;
+ }
- void KilledUnit(Unit* victim) OVERRIDE
- {
- if (victim->GetTypeId() != TYPEID_PLAYER)
- return;
+ void HandleTaunt(SpellEffIndex /*effIndex*/)
+ {
+ if (Unit* target = GetHitUnit())
+ target->CastSpell(GetCaster(), uint32(GetEffectValue()), true);
+ }
- Talk(SAY_KILL);
- }
+ void Register() OVERRIDE
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_trollgore_invader_taunt_SpellScript::HandleTaunt, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
- void JustSummoned(Creature* summon) OVERRIDE
+ SpellScript* GetSpellScript() const OVERRIDE
{
- lSummons.Summon(summon);
- if (summon->AI())
- summon->AI()->AttackStart(me);
+ return new spell_trollgore_invader_taunt_SpellScript();
}
- };
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return GetDrakTharonKeepAI<boss_trollgoreAI>(creature);
- }
};
class achievement_consumption_junction : public AchievementCriteriaScript
@@ -220,5 +347,9 @@ class achievement_consumption_junction : public AchievementCriteriaScript
void AddSC_boss_trollgore()
{
new boss_trollgore();
+ new npc_drakkari_invader();
+ new spell_trollgore_consume();
+ new spell_trollgore_corpse_explode();
+ new spell_trollgore_invader_taunt();
new achievement_consumption_junction();
}
diff --git a/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
index cc0fb9a0090..072a5f2f534 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
+++ b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
@@ -36,6 +36,10 @@ enum DataTypes
// Additional data
//DATA_KING_DRED_ACHIEV,
+ DATA_TROLLGORE_INVADER_SUMMONER_1,
+ DATA_TROLLGORE_INVADER_SUMMONER_2,
+ DATA_TROLLGORE_INVADER_SUMMONER_3,
+
DATA_NOVOS_CRYSTAL_1,
DATA_NOVOS_CRYSTAL_2,
DATA_NOVOS_CRYSTAL_3,
@@ -55,13 +59,23 @@ enum CreatureIds
NPC_KING_DRED = 27483,
NPC_THARON_JA = 26632,
+ // Trollgore
+ NPC_DRAKKARI_INVADER_A = 27709,
+ NPC_DRAKKARI_INVADER_B = 27753,
+ NPC_DRAKKARI_INVADER_C = 27754,
+
// Novos
NPC_CRYSTAL_CHANNEL_TARGET = 26712,
NPC_CRYSTAL_HANDLER = 26627,
+ NPC_HULKING_CORPSE = 27597,
+ NPC_FETID_TROLL_CORPSE = 27598,
+ NPC_RISEN_SHADOWCASTER = 27600,
// King Dred
NPC_DRAKKARI_GUTRIPPER = 26641,
- NPC_DRAKKARI_SCYTHECLAW = 26628
+ NPC_DRAKKARI_SCYTHECLAW = 26628,
+
+ NPC_WORLD_TRIGGER = 22515
};
enum GameObjectIds
diff --git a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
index 99a4ce77623..e2ed883ad08 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
@@ -36,11 +36,12 @@ class instance_drak_tharon_keep : public InstanceMapScript
KingDredGUID = 0;
TharonJaGUID = 0;
+ memset(TrollgoreInvaderSummonerGuids, 0, 4 * sizeof(uint64));
memset(NovosCrystalGUIDs, 0, 4 * sizeof(uint64));
memset(NovosSummonerGUIDs, 0, 4 * sizeof(uint64));
}
- void OnCreatureCreate(Creature* creature)
+ void OnCreatureCreate(Creature* creature) OVERRIDE
{
switch (creature->GetEntry())
{
@@ -56,6 +57,9 @@ class instance_drak_tharon_keep : public InstanceMapScript
case NPC_THARON_JA:
TharonJaGUID = creature->GetGUID();
break;
+ case NPC_WORLD_TRIGGER:
+ InitializeTrollgoreInvaderSummoner(creature);
+ break;
case NPC_CRYSTAL_CHANNEL_TARGET:
InitializeNovosSummoner(creature);
break;
@@ -64,31 +68,43 @@ class instance_drak_tharon_keep : public InstanceMapScript
}
}
- void OnGameObjectCreate(GameObject* go)
+ void OnGameObjectCreate(GameObject* go) OVERRIDE
{
switch (go->GetEntry())
{
case GO_NOVOS_CRYSTAL_1:
NovosCrystalGUIDs[0] = go->GetGUID();
- go->SetGoState(GO_STATE_READY);
break;
case GO_NOVOS_CRYSTAL_2:
NovosCrystalGUIDs[1] = go->GetGUID();
- go->SetGoState(GO_STATE_READY);
break;
case GO_NOVOS_CRYSTAL_3:
NovosCrystalGUIDs[2] = go->GetGUID();
- go->SetGoState(GO_STATE_READY);
break;
case GO_NOVOS_CRYSTAL_4:
NovosCrystalGUIDs[3] = go->GetGUID();
- go->SetGoState(GO_STATE_READY);
break;
default:
break;
}
}
+ void InitializeTrollgoreInvaderSummoner(Creature* creature)
+ {
+ float y = creature->GetPositionY();
+ float z = creature->GetPositionZ();
+
+ if (z < 50.0f)
+ return;
+
+ if (y < -650.0f && y > -660.0f)
+ TrollgoreInvaderSummonerGuids[0] = creature->GetGUID();
+ else if (y < -660.0f && y > -670.0f)
+ TrollgoreInvaderSummonerGuids[1] = creature->GetGUID();
+ else if (y < -675.0f && y > -685.0f)
+ TrollgoreInvaderSummonerGuids[2] = creature->GetGUID();
+ }
+
void InitializeNovosSummoner(Creature* creature)
{
float x = creature->GetPositionX();
@@ -117,6 +133,10 @@ class instance_drak_tharon_keep : public InstanceMapScript
return KingDredGUID;
case DATA_THARON_JA:
return TharonJaGUID;
+ case DATA_TROLLGORE_INVADER_SUMMONER_1:
+ case DATA_TROLLGORE_INVADER_SUMMONER_2:
+ case DATA_TROLLGORE_INVADER_SUMMONER_3:
+ return TrollgoreInvaderSummonerGuids[type - DATA_TROLLGORE_INVADER_SUMMONER_1];
case DATA_NOVOS_CRYSTAL_1:
case DATA_NOVOS_CRYSTAL_2:
case DATA_NOVOS_CRYSTAL_3:
@@ -132,14 +152,14 @@ class instance_drak_tharon_keep : public InstanceMapScript
return 0;
}
- void OnUnitDeath(Unit* unit)
+ void OnUnitDeath(Unit* unit) OVERRIDE
{
if (unit->GetEntry() == NPC_CRYSTAL_HANDLER)
if (Creature* novos = instance->GetCreature(NovosGUID))
novos->AI()->DoAction(ACTION_CRYSTAL_HANDLER_DIED);
}
- std::string GetSaveData()
+ std::string GetSaveData() OVERRIDE
{
OUT_SAVE_INST_DATA;
@@ -150,7 +170,7 @@ class instance_drak_tharon_keep : public InstanceMapScript
return saveStream.str();
}
- void Load(char const* str)
+ void Load(char const* str) OVERRIDE
{
if (!str)
{
@@ -188,6 +208,7 @@ class instance_drak_tharon_keep : public InstanceMapScript
uint64 KingDredGUID;
uint64 TharonJaGUID;
+ uint64 TrollgoreInvaderSummonerGuids[3];
uint64 NovosCrystalGUIDs[4];
uint64 NovosSummonerGUIDs[4];
};
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
index e291ee0de70..6408417e902 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
@@ -36,6 +36,17 @@ enum Text
SAY_JAINA_INTRO_11 = 10,
SAY_JAINA_INTRO_END = 11,
+ SAY_JAINA_ESCAPE_1 = 0,
+ SAY_JAINA_ESCAPE_2 = 1,
+ SAY_JAINA_ESCAPE_3 = 2,
+ SAY_JAINA_ESCAPE_4 = 3,
+ SAY_JAINA_ESCAPE_5 = 4,
+ SAY_JAINA_ESCAPE_6 = 5,
+ SAY_JAINA_ESCAPE_7 = 6,
+ SAY_JAINA_ESCAPE_8 = 7,
+ SAY_JAINA_ESCAPE_9 = 8,
+ SAY_JAINA_ESCAPE_10 = 9,
+
SAY_SYLVANAS_INTRO_1 = 0,
SAY_SYLVANAS_INTRO_2 = 1,
SAY_SYLVANAS_INTRO_3 = 2,
@@ -46,6 +57,16 @@ enum Text
SAY_SYLVANAS_INTRO_8 = 7,
SAY_SYLVANAS_INTRO_END = 8,
+ SAY_SYLVANAS_ESCAPE_1 = 0,
+ SAY_SYLVANAS_ESCAPE_2 = 1,
+ SAY_SYLVANAS_ESCAPE_3 = 2,
+ SAY_SYLVANAS_ESCAPE_4 = 3,
+ SAY_SYLVANAS_ESCAPE_5 = 4,
+ SAY_SYLVANAS_ESCAPE_6 = 5,
+ SAY_SYLVANAS_ESCAPE_7 = 6,
+ SAY_SYLVANAS_ESCAPE_8 = 7,
+ SAY_SYLVANAS_ESCAPE_9 = 8,
+
SAY_UTHER_INTRO_A2_1 = 0,
SAY_UTHER_INTRO_A2_2 = 1,
SAY_UTHER_INTRO_A2_3 = 2,
@@ -69,6 +90,18 @@ enum Text
SAY_LK_JAINA_INTRO_END = 3,
SAY_LK_SYLVANAS_INTRO_END = 4,
+ SAY_LK_ESCAPE_1 = 0,
+ SAY_LK_ESCAPE_2 = 1,
+ SAY_LK_ESCAPE_3 = 2,
+ SAY_LK_ESCAPE_4 = 3,
+ SAY_LK_ESCAPE_5 = 4,
+ SAY_LK_ESCAPE_6 = 5,
+ SAY_LK_ESCAPE_7 = 6,
+ SAY_LK_ESCAPE_8 = 7,
+ SAY_LK_ESCAPE_9 = 8,
+ SAY_LK_ESCAPE_10 = 9,
+ SAY_LK_ESCAPE_11 = 10,
+
SAY_FALRIC_INTRO_1 = 5,
SAY_FALRIC_INTRO_2 = 6,
@@ -132,6 +165,35 @@ enum Events
EVENT_INTRO_END,
+ EVENT_ESCAPE,
+ EVENT_ESCAPE_1,
+ EVENT_ESCAPE_2,
+ EVENT_ESCAPE_3,
+ EVENT_ESCAPE_4,
+ EVENT_ESCAPE_5,
+ EVENT_ESCAPE_6,
+ EVENT_ESCAPE_7,
+ EVENT_ESCAPE_8,
+ EVENT_ESCAPE_9,
+ EVENT_ESCAPE_10,
+ EVENT_ESCAPE_11,
+ EVENT_ESCAPE_12,
+ EVENT_ESCAPE_13,
+ EVENT_ESCAPE_14,
+ EVENT_ESCAPE_15,
+ EVENT_ESCAPE_16,
+ EVENT_ESCAPE_17,
+ EVENT_ESCAPE_18,
+ EVENT_ESCAPE_19,
+ EVENT_ESCAPE_20,
+ EVENT_ESCAPE_21,
+ EVENT_ESCAPE_22,
+ EVENT_ESCAPE_23,
+ EVENT_ESCAPE_24,
+ EVENT_ESCAPE_25,
+ EVENT_ESCAPE_26,
+ EVENT_ESCAPE_27,
+
EVENT_OPEN_FROSTWORN_DOOR,
EVENT_CLOSE_FROSTWORN_DOOR,
};
@@ -156,21 +218,79 @@ enum Spells
SPELL_FROSTMOURNE_DESPAWN = 72726,
SPELL_FROSTMOURNE_VISUAL = 73220,
SPELL_FROSTMOURNE_SOUNDS = 70667,
+ SPELL_JAINA_ICEBARRIER = 69787, // Jaina Ice Barrier
+ SPELL_JAINA_ICEPRISON = 69708, // Jaina Ice Prison
+ SPELL_SYLVANAS_CLOAKOFDARKNESS = 70188, // Sylvanas Cloak of Darkness
+ SPELL_SYLVANAS_DARKBINDING = 70194, // Sylvanas Dark Binding
+ SPELL_REMORSELESS_WINTER = 69780, // Lich King Remorseless Winter
+ SPELL_SOUL_REAPER = 69409, // Lich King Soul Reaper
+ SPELL_FURY_OF_FROSTMOURNE = 70063, // Lich King Fury of FrostMourne
+ SPELL_JAINA_DESTROY_ICE_WALL = 69784, // Jaina
+ SPELL_SYLVANAS_DESTROY_ICE_WALL = 70225, // Sylvanas
+ SPELL_SYLVANAS_JUMP = 68339, // Sylvanas Jump
+ SPELL_RAISE_DEAD = 69818,
+ SPELL_HARVEST_SOUL = 70070,
+ SPELL_SUMMON_RISE_WITCH_DOCTOR = 69836,
+ SPELL_SUMMON_LUMBERING_ABOMINATION = 69835,
+ SPELL_SUMMON_ICE_WALL = 69768, // Visual effect and icewall summoning
+
+ //Raging gnoul
+ SPELL_EMERGE_VISUAL = 50142,
+ SPELL_GHOUL_JUMP = 70150,
+
+ //Witch Doctor
+ SPELL_COURSE_OF_DOOM = 70144,
+ SPELL_SHADOW_BOLT_VOLLEY = 70145,
+ SPELL_SHADOW_BOLT = 70080,
+
+ //Lumbering Abomination
+ SPELL_ABON_STRIKE = 40505,
+ SPELL_VOMIT_SPRAY = 70176,
};
-const Position HallsofReflectionLocs[]=
+const Position HallsofReflectionLocs[] =
{
{5283.234863f, 1990.946777f, 707.695679f, 0.929097f}, // 2 Loralen Follows
{5408.031250f, 2102.918213f, 707.695251f, 0.792756f}, // 9 Sylvanas Follows
{5401.866699f, 2110.837402f, 707.695251f, 0.800610f}, // 10 Loralen follows
};
-const Position IntroPos = {5265.89f, 1952.98f, 707.6978f, 0.0f}; // Jaina/Sylvanas Intro Start Position
-const Position MoveThronePos = {5306.952148f, 1998.499023f, 709.341431f, 1.277278f}; // Jaina/Sylvanas walks to throne
-const Position UtherSpawnPos = {5308.310059f, 2003.857178f, 709.341431f, 4.650315f};
-const Position LichKingSpawnPos = {5362.917480f, 2062.307129f, 707.695374f, 3.945812f};
-const Position LichKingMoveThronePos = {5312.080566f, 2009.172119f, 709.341431f, 3.973301f}; // Lich King walks to throne
-const Position LichKingMoveAwayPos = {5400.069824f, 2102.7131689f, 707.69525f, 0.843803f}; // Lich King walks away
+const Position NpcJainaOrSylvanasEscapeRoute[] =
+{
+ {5601.217285f, 2207.652832f, 731.541931f, 5.223304f}, // leave the throne room
+ {5607.224375f, 2173.913330f, 731.126038f, 2.608723f}, // adjust route
+ {5583.427246f, 2138.784180f, 731.150391f, 4.260901f}, // stop for talking
+ {5560.281738f, 2104.025635f, 731.410889f, 4.058383f}, // attack the first icewall
+ {5510.990723f, 2000.772217f, 734.716064f, 3.973213f}, // attack the second icewall
+ {5452.641113f, 1905.762329f, 746.530579f, 4.118834f}, // attack the third icewall
+ {5338.126953f, 1768.429810f, 767.237244f, 3.855189f}, // attack the fourth icewall
+ {5257.712402f, 1669.379395f, 784.300110f, 0.908373f}, // face the Lich king
+ {5261.191895f, 1681.901611f, 784.285278f, 4.410465f}, // final position
+};
+
+const Position IceWalls[] =
+{
+ {5547.833f, 2083.701f,731.4332f,4.24115f}, // first icewall
+ {5503.213f, 1969.547f,737.0245f,4.293779f},// second icewall
+ {5439.976f, 1879.005f,752.7048f,4.207591f},// third icewall
+ {5318.289f, 1749.184f,771.9423f,4.054276f},// fourth icewall
+};
+
+const Position IntroPos = {5265.89f, 1952.98f, 707.6978f, 0.0f}; // Jaina/Sylvanas Intro Start Position
+const Position MoveThronePos = {5306.952148f, 1998.499023f, 709.341431f, 1.277278f}; // Jaina/Sylvanas walks to throne
+const Position UtherSpawnPos = {5308.310059f, 2003.857178f, 709.341431f, 4.650315f};
+const Position LichKingSpawnPos = {5362.917480f, 2062.307129f, 707.695374f, 3.945812f};
+const Position LichKingMoveThronePos = {5312.080566f, 2009.172119f, 709.341431f, 3.973301f}; // Lich King walks to throne
+const Position LichKingMoveAwayPos = {5400.069824f, 2102.7131689f, 707.69525f, 0.843803f}; // Lich King walks away
+const Position LichKingSpawnPos2 = {5552.733398f, 2262.718506f, 733.011047f, 4.009696f}; // Lich King Spawn Position 2
+const Position LichKingFirstSummon = {5600.076172f, 2192.270996f, 731.750488f, 4.330935f}; // Lich King First summons
+const Position JainaShadowThroneDoor = {5577.243f, 2235.852f, 733.0128f, 2.209562f}; // Jaina Spawn Position 2
+const Position SylvanasShadowThroneDoor = {5577.243f, 2235.852f, 733.0128f, 2.209562f}; // Sylvanas Spawn Position 2
+const Position FalricStartPos = {5283.878906f, 2030.459595f, 709.319641f, 5.506670f}; // Falric start position
+const Position MarwynStartPos = {5334.979980f, 1982.399536f, 709.320129f, 2.347014f}; // Marwyn start position
+const Position LichKingFinalPos = {5283.742188f, 1706.335693f, 783.293518f, 4.138510f}; // Lich King Final Pos
+const Position ChestPos = {5246.187500f, 1649.079468f, 784.301758f, 0.901268f}; // Chest position
+const Position FinalPortalPos = {5270.634277f ,1639.101196f, 784.303040f, 1.682743f}; // Final portal position
class npc_jaina_or_sylvanas_hor : public CreatureScript
{
@@ -182,14 +302,14 @@ class npc_jaina_or_sylvanas_hor : public CreatureScript
{
npc_jaina_or_sylvanas_horAI(Creature* creature) : ScriptedAI(creature)
{
- instance = me->GetInstanceScript();
+ _instance = me->GetInstanceScript();
}
- InstanceScript* instance;
- uint64 utherGUID;
- uint64 lichkingGUID;
+ InstanceScript* _instance;
+ uint64 _utherGUID;
+ uint64 _lichkingGUID;
- EventMap events;
+ EventMap _events;
void sGossipSelect(Player* player, uint32 /*sender*/, uint32 action) OVERRIDE
{
@@ -198,12 +318,12 @@ class npc_jaina_or_sylvanas_hor : public CreatureScript
{
case 0:
player->CLOSE_GOSSIP_MENU();
- events.ScheduleEvent(EVENT_START_INTRO, 1000);
+ _events.ScheduleEvent(EVENT_START_INTRO, 1000);
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER);
break;
case 1:
player->CLOSE_GOSSIP_MENU();
- events.ScheduleEvent(EVENT_SKIP_INTRO, 1000);
+ _events.ScheduleEvent(EVENT_SKIP_INTRO, 1000);
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER);
break;
}
@@ -211,36 +331,36 @@ class npc_jaina_or_sylvanas_hor : public CreatureScript
void Reset() OVERRIDE
{
- events.Reset();
+ _events.Reset();
- utherGUID = 0;
- lichkingGUID = 0;
+ _utherGUID = 0;
+ _lichkingGUID = 0;
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER);
me->SetStandState(UNIT_STAND_STATE_STAND);
- events.ScheduleEvent(EVENT_WALK_INTRO1, 3000);
+ _events.ScheduleEvent(EVENT_WALK_INTRO1, 3000);
}
void UpdateAI(uint32 diff) OVERRIDE
{
- events.Update(diff);
- switch (events.ExecuteEvent())
+ _events.Update(diff);
+ switch (_events.ExecuteEvent())
{
case EVENT_WALK_INTRO1:
me->GetMotionMaster()->MovePoint(0, IntroPos);
- if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
{
Talk(SAY_JAINA_INTRO_1);
- events.ScheduleEvent(EVENT_WALK_INTRO2, 7000);
+ _events.ScheduleEvent(EVENT_WALK_INTRO2, 7000);
}
else
{
Talk(SAY_SYLVANAS_INTRO_1);
- events.ScheduleEvent(EVENT_WALK_INTRO2, 9000);
+ _events.ScheduleEvent(EVENT_WALK_INTRO2, 9000);
}
break;
case EVENT_WALK_INTRO2:
- if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
Talk(SAY_JAINA_INTRO_2);
else
Talk(SAY_SYLVANAS_INTRO_2);
@@ -249,182 +369,182 @@ class npc_jaina_or_sylvanas_hor : public CreatureScript
case EVENT_START_INTRO:
me->GetMotionMaster()->MovePoint(0, MoveThronePos);
// Begining of intro is differents between fActions as the speech sequence and timers are differents.
- if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- events.ScheduleEvent(EVENT_INTRO_A2_1, 0);
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ _events.ScheduleEvent(EVENT_INTRO_A2_1, 0);
else
- events.ScheduleEvent(EVENT_INTRO_H2_1, 0);
+ _events.ScheduleEvent(EVENT_INTRO_H2_1, 0);
break;
// A2 Intro Events
case EVENT_INTRO_A2_1:
Talk(SAY_JAINA_INTRO_3);
- events.ScheduleEvent(EVENT_INTRO_A2_2, 7000);
+ _events.ScheduleEvent(EVENT_INTRO_A2_2, 7000);
break;
case EVENT_INTRO_A2_2:
Talk(SAY_JAINA_INTRO_4);
- events.ScheduleEvent(EVENT_INTRO_A2_3, 10000);
+ _events.ScheduleEvent(EVENT_INTRO_A2_3, 10000);
break;
case EVENT_INTRO_A2_3:
me->CastSpell(me, SPELL_CAST_VISUAL, false);
me->CastSpell(me, SPELL_FROSTMOURNE_SOUNDS, true);
- instance->HandleGameObject(instance->GetData64(DATA_FROSTMOURNE), true);
- events.ScheduleEvent(EVENT_INTRO_A2_4, 10000);
+ _instance->HandleGameObject(_instance->GetData64(DATA_FROSTMOURNE), true);
+ _events.ScheduleEvent(EVENT_INTRO_A2_4, 10000);
break;
case EVENT_INTRO_A2_4:
if (Creature* uther = me->SummonCreature(NPC_UTHER, UtherSpawnPos, TEMPSUMMON_MANUAL_DESPAWN))
{
uther->GetMotionMaster()->MoveIdle();
- utherGUID = uther->GetGUID();
+ _utherGUID = uther->GetGUID();
}
- events.ScheduleEvent(EVENT_INTRO_A2_5, 2000);
+ _events.ScheduleEvent(EVENT_INTRO_A2_5, 2000);
break;
case EVENT_INTRO_A2_5:
- if (Creature* uther = me->GetCreature(*me, utherGUID))
+ if (Creature* uther = me->GetCreature(*me, _utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_A2_1);
- events.ScheduleEvent(EVENT_INTRO_A2_6, 3000);
+ _events.ScheduleEvent(EVENT_INTRO_A2_6, 3000);
break;
case EVENT_INTRO_A2_6:
Talk(SAY_JAINA_INTRO_5);
- events.ScheduleEvent(EVENT_INTRO_A2_7, 7000);
+ _events.ScheduleEvent(EVENT_INTRO_A2_7, 7000);
break;
case EVENT_INTRO_A2_7:
- if (Creature* uther = me->GetCreature(*me, utherGUID))
+ if (Creature* uther = me->GetCreature(*me, _utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_A2_2);
- events.ScheduleEvent(EVENT_INTRO_A2_8, 7000);
+ _events.ScheduleEvent(EVENT_INTRO_A2_8, 7000);
break;
case EVENT_INTRO_A2_8:
Talk(SAY_JAINA_INTRO_6);
- events.ScheduleEvent(EVENT_INTRO_A2_9, 1200);
+ _events.ScheduleEvent(EVENT_INTRO_A2_9, 1200);
break;
case EVENT_INTRO_A2_9:
- if (Creature* uther = me->GetCreature(*me, utherGUID))
+ if (Creature* uther = me->GetCreature(*me, _utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_A2_3);
- events.ScheduleEvent(EVENT_INTRO_A2_10, 11000);
+ _events.ScheduleEvent(EVENT_INTRO_A2_10, 11000);
break;
case EVENT_INTRO_A2_10:
Talk(SAY_JAINA_INTRO_7);
- events.ScheduleEvent(EVENT_INTRO_A2_11, 6000);
+ _events.ScheduleEvent(EVENT_INTRO_A2_11, 6000);
break;
case EVENT_INTRO_A2_11:
- if (Creature* uther = me->GetCreature(*me, utherGUID))
+ if (Creature* uther = me->GetCreature(*me, _utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_A2_4);
- events.ScheduleEvent(EVENT_INTRO_A2_12, 12000);
+ _events.ScheduleEvent(EVENT_INTRO_A2_12, 12000);
break;
case EVENT_INTRO_A2_12:
Talk(SAY_JAINA_INTRO_8);
- events.ScheduleEvent(EVENT_INTRO_A2_13, 6000);
+ _events.ScheduleEvent(EVENT_INTRO_A2_13, 6000);
break;
case EVENT_INTRO_A2_13:
- if (Creature* uther = me->GetCreature(*me, utherGUID))
+ if (Creature* uther = me->GetCreature(*me, _utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_A2_5);
- events.ScheduleEvent(EVENT_INTRO_A2_14, 13000);
+ _events.ScheduleEvent(EVENT_INTRO_A2_14, 13000);
break;
case EVENT_INTRO_A2_14:
Talk(SAY_JAINA_INTRO_9);
- events.ScheduleEvent(EVENT_INTRO_A2_15, 12000);
+ _events.ScheduleEvent(EVENT_INTRO_A2_15, 12000);
break;
case EVENT_INTRO_A2_15:
- if (Creature* uther = me->GetCreature(*me, utherGUID))
+ if (Creature* uther = me->GetCreature(*me, _utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_A2_6);
- events.ScheduleEvent(EVENT_INTRO_A2_16, 25000);
+ _events.ScheduleEvent(EVENT_INTRO_A2_16, 25000);
break;
case EVENT_INTRO_A2_16:
- if (Creature* uther = me->GetCreature(*me, utherGUID))
+ if (Creature* uther = me->GetCreature(*me, _utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_A2_7);
- events.ScheduleEvent(EVENT_INTRO_A2_17, 6000);
+ _events.ScheduleEvent(EVENT_INTRO_A2_17, 6000);
break;
case EVENT_INTRO_A2_17:
Talk(SAY_JAINA_INTRO_10);
- events.ScheduleEvent(EVENT_INTRO_A2_18, 5000);
+ _events.ScheduleEvent(EVENT_INTRO_A2_18, 5000);
break;
case EVENT_INTRO_A2_18:
- if (Creature* uther = me->GetCreature(*me, utherGUID))
+ if (Creature* uther = me->GetCreature(*me, _utherGUID))
{
uther->HandleEmoteCommand(EMOTE_ONESHOT_NO);
uther->AI()->Talk(SAY_UTHER_INTRO_A2_8);
}
- events.ScheduleEvent(EVENT_INTRO_A2_19, 12000);
+ _events.ScheduleEvent(EVENT_INTRO_A2_19, 12000);
break;
case EVENT_INTRO_A2_19:
Talk(SAY_JAINA_INTRO_11);
- events.ScheduleEvent(EVENT_INTRO_LK_1, 3000);
+ _events.ScheduleEvent(EVENT_INTRO_LK_1, 3000);
break;
// H2 Intro Events
case EVENT_INTRO_H2_1:
Talk(SAY_SYLVANAS_INTRO_1);
- events.ScheduleEvent(EVENT_INTRO_H2_2, 8000);
+ _events.ScheduleEvent(EVENT_INTRO_H2_2, 8000);
break;
case EVENT_INTRO_H2_2:
Talk(SAY_SYLVANAS_INTRO_2);
- events.ScheduleEvent(EVENT_INTRO_H2_3, 6000);
+ _events.ScheduleEvent(EVENT_INTRO_H2_3, 6000);
break;
case EVENT_INTRO_H2_3:
Talk(SAY_SYLVANAS_INTRO_3);
me->CastSpell(me, SPELL_CAST_VISUAL, false);
me->CastSpell(me, SPELL_FROSTMOURNE_SOUNDS, true);
- instance->HandleGameObject(instance->GetData64(DATA_FROSTMOURNE), true);
- events.ScheduleEvent(EVENT_INTRO_H2_4, 6000);
+ _instance->HandleGameObject(_instance->GetData64(DATA_FROSTMOURNE), true);
+ _events.ScheduleEvent(EVENT_INTRO_H2_4, 6000);
break;
case EVENT_INTRO_H2_4:
// spawn UTHER during speach 2
if (Creature* uther = me->SummonCreature(NPC_UTHER, UtherSpawnPos, TEMPSUMMON_MANUAL_DESPAWN))
{
uther->GetMotionMaster()->MoveIdle();
- utherGUID = uther->GetGUID();
+ _utherGUID = uther->GetGUID();
}
- events.ScheduleEvent(EVENT_INTRO_H2_5, 2000);
+ _events.ScheduleEvent(EVENT_INTRO_H2_5, 2000);
break;
case EVENT_INTRO_H2_5:
- if (Creature* uther = me->GetCreature(*me, utherGUID))
+ if (Creature* uther = me->GetCreature(*me, _utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_H2_1);
- events.ScheduleEvent(EVENT_INTRO_H2_6, 11000);
+ _events.ScheduleEvent(EVENT_INTRO_H2_6, 11000);
break;
case EVENT_INTRO_H2_6:
Talk(SAY_SYLVANAS_INTRO_4);
- events.ScheduleEvent(EVENT_INTRO_H2_7, 3000);
+ _events.ScheduleEvent(EVENT_INTRO_H2_7, 3000);
break;
case EVENT_INTRO_H2_7:
- if (Creature* uther = me->GetCreature(*me, utherGUID))
+ if (Creature* uther = me->GetCreature(*me, _utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_H2_2);
- events.ScheduleEvent(EVENT_INTRO_H2_8, 6000);
+ _events.ScheduleEvent(EVENT_INTRO_H2_8, 6000);
break;
case EVENT_INTRO_H2_8:
Talk(SAY_SYLVANAS_INTRO_5);
- events.ScheduleEvent(EVENT_INTRO_H2_9, 5000);
+ _events.ScheduleEvent(EVENT_INTRO_H2_9, 5000);
break;
case EVENT_INTRO_H2_9:
- if (Creature* uther = me->GetCreature(*me, utherGUID))
+ if (Creature* uther = me->GetCreature(*me, _utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_H2_3);
- events.ScheduleEvent(EVENT_INTRO_H2_10, 19000);
+ _events.ScheduleEvent(EVENT_INTRO_H2_10, 19000);
break;
case EVENT_INTRO_H2_10:
Talk(SAY_SYLVANAS_INTRO_6);
- events.ScheduleEvent(EVENT_INTRO_H2_11, 1500);
+ _events.ScheduleEvent(EVENT_INTRO_H2_11, 1500);
break;
case EVENT_INTRO_H2_11:
- if (Creature* uther = me->GetCreature(*me, utherGUID))
+ if (Creature* uther = me->GetCreature(*me, _utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_H2_4);
- events.ScheduleEvent(EVENT_INTRO_H2_12, 19500);
+ _events.ScheduleEvent(EVENT_INTRO_H2_12, 19500);
break;
case EVENT_INTRO_H2_12:
Talk(SAY_SYLVANAS_INTRO_7);
- events.ScheduleEvent(EVENT_INTRO_H2_13, 2000);
+ _events.ScheduleEvent(EVENT_INTRO_H2_13, 2000);
break;
case EVENT_INTRO_H2_13:
- if (Creature* uther = me->GetCreature(*me, utherGUID))
+ if (Creature* uther = me->GetCreature(*me, _utherGUID))
{
uther->HandleEmoteCommand(EMOTE_ONESHOT_NO);
uther->AI()->Talk(SAY_UTHER_INTRO_H2_5);
}
- events.ScheduleEvent(EVENT_INTRO_H2_14, 12000);
+ _events.ScheduleEvent(EVENT_INTRO_H2_14, 12000);
break;
case EVENT_INTRO_H2_14:
- if (Creature* uther = me->GetCreature(*me, utherGUID))
+ if (Creature* uther = me->GetCreature(*me, _utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_H2_6);
- events.ScheduleEvent(EVENT_INTRO_H2_15, 8000);
+ _events.ScheduleEvent(EVENT_INTRO_H2_15, 8000);
break;
case EVENT_INTRO_H2_15:
Talk(SAY_SYLVANAS_INTRO_8);
- events.ScheduleEvent(EVENT_INTRO_LK_1, 2000);
+ _events.ScheduleEvent(EVENT_INTRO_LK_1, 2000);
break;
// Remaining Intro Events common for both faction
case EVENT_INTRO_LK_1:
@@ -433,121 +553,126 @@ class npc_jaina_or_sylvanas_hor : public CreatureScript
{
lichking->SetWalk(true);
lichking->GetMotionMaster()->MovePoint(0, LichKingMoveThronePos);
- //lichking->SetReactState(REACT_PASSIVE);
- lichkingGUID = lichking->GetGUID();
- events.ScheduleEvent(EVENT_OPEN_FROSTWORN_DOOR, 0);
- events.ScheduleEvent(EVENT_CLOSE_FROSTWORN_DOOR, 4000);
+ _lichkingGUID = lichking->GetGUID();
+ _events.ScheduleEvent(EVENT_OPEN_FROSTWORN_DOOR, 0);
+ _events.ScheduleEvent(EVENT_CLOSE_FROSTWORN_DOOR, 4000);
}
- if (Creature* uther = me->GetCreature(*me, utherGUID))
+ if (Creature* uther = me->GetCreature(*me, _utherGUID))
{
uther->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_COWER);
- if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
uther->AI()->Talk(SAY_UTHER_INTRO_A2_9);
else
uther->AI()->Talk(SAY_UTHER_INTRO_H2_7);
}
- events.ScheduleEvent(EVENT_INTRO_LK_2, 10000);
+ _events.ScheduleEvent(EVENT_INTRO_LK_2, 10000);
break;
case EVENT_INTRO_LK_2:
- if (Creature* lichking = me->GetCreature(*me, lichkingGUID))
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
lichking->AI()->Talk(SAY_LK_INTRO_1);
- events.ScheduleEvent(EVENT_INTRO_LK_3, 1000);
+ _events.ScheduleEvent(EVENT_INTRO_LK_3, 1000);
break;
case EVENT_INTRO_LK_3:
// The Lich King banishes Uther to the abyss.
- if (Creature* uther = me->GetCreature(*me, utherGUID))
+ if (Creature* uther = me->GetCreature(*me, _utherGUID))
{
uther->CastSpell(uther, SPELL_UTHER_DESPAWN, true);
uther->DespawnOrUnsummon(5000);
- utherGUID = 0;
+ _utherGUID = 0;
}
- events.ScheduleEvent(EVENT_INTRO_LK_4, 9000);
+ _events.ScheduleEvent(EVENT_INTRO_LK_4, 9000);
break;
case EVENT_INTRO_LK_4:
// He steps forward and removes the runeblade from the heap of skulls.
- if (Creature* lichking = me->GetCreature(*me, lichkingGUID))
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
{
- if (GameObject* frostmourne = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_FROSTMOURNE)))
+ if (GameObject* frostmourne = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_FROSTMOURNE)))
frostmourne->SetPhaseMask(2, true);
lichking->CastSpell(lichking, SPELL_TAKE_FROSTMOURNE, true);
lichking->CastSpell(lichking, SPELL_FROSTMOURNE_VISUAL, true);
}
- events.ScheduleEvent(EVENT_INTRO_LK_5, 8000);
+ _events.ScheduleEvent(EVENT_INTRO_LK_5, 8000);
break;
case EVENT_INTRO_LK_5:
- if (Creature* lichking = me->GetCreature(*me, lichkingGUID))
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
lichking->AI()->Talk(SAY_LK_INTRO_2);
- events.ScheduleEvent(EVENT_INTRO_LK_6, 8000);
+ _events.ScheduleEvent(EVENT_INTRO_LK_6, 10000);
break;
case EVENT_INTRO_LK_6:
// summon Falric and Marwyn. then go back to the door
- if (Creature* falric = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_FALRIC_EVENT)))
+ if (Creature* falric = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FALRIC_EVENT)))
{
falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true);
falric->SetVisible(true);
}
- if (Creature* marwyn = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MARWYN_EVENT)))
+ if (Creature* marwyn = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MARWYN_EVENT)))
{
marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true);
marwyn->SetVisible(true);
}
- if (Creature* lichking = me->GetCreature(*me, lichkingGUID))
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
{
lichking->AI()->Talk(SAY_LK_INTRO_3);
lichking->SetWalk(true);
lichking->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos);
}
- events.ScheduleEvent(EVENT_INTRO_LK_7, 10000);
- events.ScheduleEvent(EVENT_OPEN_FROSTWORN_DOOR, 5000);
+ _events.ScheduleEvent(EVENT_INTRO_LK_7, 10000);
+ _events.ScheduleEvent(EVENT_OPEN_FROSTWORN_DOOR, 5000);
break;
case EVENT_INTRO_LK_7:
- if (Creature* marwyn = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MARWYN_EVENT)))
+ if (Creature* marwyn = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MARWYN_EVENT)))
+ {
marwyn->AI()->Talk(SAY_MARWYN_INTRO_1);
- events.ScheduleEvent(EVENT_INTRO_LK_8, 1000);
+ marwyn->SetWalk(true);
+ marwyn->GetMotionMaster()->MovePoint(0, MarwynStartPos);
+ }
+ _events.ScheduleEvent(EVENT_INTRO_LK_8, 1000);
break;
case EVENT_INTRO_LK_8:
- if (Creature* falric = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_FALRIC_EVENT)))
+ if (Creature* falric = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FALRIC_EVENT)))
+ {
falric->AI()->Talk(SAY_FALRIC_INTRO_1);
- events.ScheduleEvent(EVENT_INTRO_LK_9, 5000);
+ falric->SetWalk(true);
+ falric->GetMotionMaster()->MovePoint(0, FalricStartPos);
+ }
+ _events.ScheduleEvent(EVENT_INTRO_LK_9, 5000);
break;
case EVENT_INTRO_LK_9:
- if (Creature* falric = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_FALRIC_EVENT)))
+ if (Creature* falric = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FALRIC_EVENT)))
falric->AI()->Talk(SAY_FALRIC_INTRO_2);
- events.ScheduleEvent(EVENT_INTRO_LK_10, 7000);
+ _instance->ProcessEvent(0, EVENT_SPAWN_WAVES);
+ _events.ScheduleEvent(EVENT_INTRO_LK_10, 4000);
break;
case EVENT_INTRO_LK_10:
- if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
Talk(SAY_JAINA_INTRO_END);
else
Talk(SAY_SYLVANAS_INTRO_END);
me->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos);
/// @todo Loralen/Koreln shall run also
- events.ScheduleEvent(EVENT_INTRO_LK_11, 5000);
+ _events.ScheduleEvent(EVENT_INTRO_LK_11, 5000);
break;
case EVENT_INTRO_LK_11:
- if (Creature* lichking = me->GetCreature(*me, lichkingGUID))
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
{
- if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
lichking->AI()->Talk(SAY_LK_JAINA_INTRO_END);
else
lichking->AI()->Talk(SAY_LK_SYLVANAS_INTRO_END);
}
- events.ScheduleEvent(EVENT_INTRO_END, 5000);
+ _events.ScheduleEvent(EVENT_INTRO_END, 5000);
break;
case EVENT_INTRO_END:
- if (instance)
- {
- instance->SetData(DATA_INTRO_EVENT, DONE);
- instance->ProcessEvent(0, EVENT_SPAWN_WAVES);
- }
+ if (_instance)
+ _instance->SetData(DATA_INTRO_EVENT, DONE);
// Loralen or Koreln disappearAndDie()
- if (Creature* lichking = me->GetCreature(*me, lichkingGUID))
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
{
lichking->DespawnOrUnsummon(5000);
- lichkingGUID = 0;
+ _lichkingGUID = 0;
}
me->DespawnOrUnsummon(10000);
- events.ScheduleEvent(EVENT_CLOSE_FROSTWORN_DOOR, 7000);
+ _events.ScheduleEvent(EVENT_CLOSE_FROSTWORN_DOOR, 7000);
break;
case EVENT_SKIP_INTRO:
me->GetMotionMaster()->MovePoint(0, MoveThronePos);
@@ -557,19 +682,19 @@ class npc_jaina_or_sylvanas_hor : public CreatureScript
lichking->SetWalk(true);
lichking->GetMotionMaster()->MovePoint(0, LichKingMoveThronePos);
lichking->SetReactState(REACT_PASSIVE);
- lichkingGUID = lichking->GetGUID();
- events.ScheduleEvent(EVENT_OPEN_FROSTWORN_DOOR, 0);
- events.ScheduleEvent(EVENT_CLOSE_FROSTWORN_DOOR, 4000);
+ _lichkingGUID = lichking->GetGUID();
+ _events.ScheduleEvent(EVENT_OPEN_FROSTWORN_DOOR, 0);
+ _events.ScheduleEvent(EVENT_CLOSE_FROSTWORN_DOOR, 4000);
}
- events.ScheduleEvent(EVENT_INTRO_LK_4, 15000);
+ _events.ScheduleEvent(EVENT_INTRO_LK_4, 15000);
break;
case EVENT_OPEN_FROSTWORN_DOOR:
- if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_FROSTWORN_DOOR)))
- instance->HandleGameObject(0 ,true, gate);
+ if (GameObject* gate = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_FROSTWORN_DOOR)))
+ _instance->HandleGameObject(0, true, gate);
break;
case EVENT_CLOSE_FROSTWORN_DOOR:
- if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_FROSTWORN_DOOR)))
- instance->HandleGameObject(0 ,false, gate);
+ if (GameObject* gate = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_FROSTWORN_DOOR)))
+ _instance->HandleGameObject(0, false, gate);
break;
}
}
@@ -581,6 +706,432 @@ class npc_jaina_or_sylvanas_hor : public CreatureScript
}
};
+class npc_jaina_or_sylvanas_escape_hor : public CreatureScript
+{
+ public:
+ npc_jaina_or_sylvanas_escape_hor() : CreatureScript("npc_jaina_or_sylvanas_escape_hor") { }
+
+ // AI of Part2
+ struct npc_jaina_or_sylvanas_escape_horAI : public ScriptedAI
+ {
+ npc_jaina_or_sylvanas_escape_horAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = me->GetInstanceScript();
+ }
+
+ InstanceScript* _instance;
+ uint64 _lichkingGUID;
+ uint64 _walltargetGUID; // dummy
+ uint64 _icewallGUID; // object
+ uint32 _icewall; // icewall number
+ uint32 _isattackingwall; //sylvannas attacking icewall
+
+ EventMap _events;
+
+
+ void Reset() OVERRIDE
+ {
+ _events.Reset();
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ lichking->DespawnOrUnsummon(1);
+ _lichkingGUID = 0;
+ _walltargetGUID = 0;
+ _icewallGUID = 0;
+ _icewall = 0;
+ _isattackingwall = false;
+ _events.ScheduleEvent(EVENT_ESCAPE, 0);
+ }
+
+ void JustDied(Unit* /*Killer*/) OVERRIDE
+ {
+ if (_instance)
+ _instance->SetData(DATA_ESCAPE_EVENT, FAIL);
+ }
+
+ void DoAction(int32 actionID) OVERRIDE
+ {
+ switch (actionID)
+ {
+ case ACTION_START_ESCAPING: // called by InstanceScript when we need to start the escaping event
+ _events.ScheduleEvent(EVENT_ESCAPE_1, 1000);
+ break;
+ case ACTION_WALL_BROKEN:
+ _icewall++;
+ if (_icewall != 4)
+ _events.ScheduleEvent(EVENT_ESCAPE_17,3000);
+ else
+ _events.ScheduleEvent(EVENT_ESCAPE_23,3000);
+ _isattackingwall = false;
+ break;
+ }
+ }
+
+ void sGossipSelect(Player* player, uint32 /*sender*/, uint32 action) OVERRIDE
+ {
+ player->PlayerTalkClass->ClearMenus();
+ switch (action)
+ {
+ case 0:
+ player->CLOSE_GOSSIP_MENU();
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER);
+ _events.ScheduleEvent(EVENT_ESCAPE_7, 0);
+ break;
+ }
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ _events.Update(diff);
+
+ while (uint32 event = _events.ExecuteEvent())
+ {
+ switch (event)
+ {
+ case EVENT_ESCAPE:
+ if (Creature* lichking = me->SummonCreature(NPC_LICH_KING_PART2, LichKingSpawnPos2, TEMPSUMMON_MANUAL_DESPAWN))
+ {
+ me->Attack(lichking,true);
+ lichking->Attack(me,true);
+ me->SetReactState(REACT_PASSIVE);
+ lichking->SetReactState(REACT_PASSIVE);
+ _lichkingGUID = lichking->GetGUID();
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ me->AI()->DoCast(me, SPELL_JAINA_ICEBARRIER);
+ else
+ me->AI()->DoCast(me, SPELL_SYLVANAS_CLOAKOFDARKNESS);
+ }
+ me->SetHealth(252000);
+ break;
+ case EVENT_ESCAPE_1:
+ _instance->SetData(DATA_ESCAPE_EVENT, IN_PROGRESS);
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ {
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ lichking->AI()->Talk(SAY_LK_ESCAPE_1);
+ else
+ lichking->AI()->Talk(SAY_LK_ESCAPE_2);
+ _events.ScheduleEvent(EVENT_ESCAPE_2, 8000);
+ }
+ break;
+ case EVENT_ESCAPE_2:
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ me->AI()->DoCast(me,SPELL_CAST_VISUAL,true);
+ else
+ me->AI()->DoCast(me,SPELL_SYLVANAS_JUMP,true);
+ _events.ScheduleEvent(EVENT_ESCAPE_3, 1000);
+ break;
+ case EVENT_ESCAPE_3:
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ {
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ lichking->AI()->DoCast(lichking, SPELL_JAINA_ICEPRISON, true);
+ else
+ lichking->AI()->DoCast(lichking, SPELL_SYLVANAS_DARKBINDING, true);
+ }
+ _events.ScheduleEvent(EVENT_ESCAPE_4, 2000);
+ break;
+ case EVENT_ESCAPE_4:
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ me->AI()->Talk(SAY_JAINA_ESCAPE_1);
+ else
+ me->AI()->Talk(SAY_SYLVANAS_ESCAPE_1);
+ _events.ScheduleEvent(EVENT_ESCAPE_5, 2000);
+ break;
+ case EVENT_ESCAPE_5:
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ lichking->CombatStop();
+ me->GetMotionMaster()->MovePoint(0, JainaShadowThroneDoor);
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ me->RemoveAurasDueToSpell(SPELL_JAINA_ICEBARRIER);
+ else
+ me->RemoveAurasDueToSpell(SPELL_SYLVANAS_CLOAKOFDARKNESS);
+ _events.ScheduleEvent(EVENT_ESCAPE_6, 5000);
+ break;
+ case EVENT_ESCAPE_6:
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER);
+ break;
+ case EVENT_ESCAPE_7:
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ {
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ lichking->RemoveAurasDueToSpell(SPELL_JAINA_ICEPRISON);
+ else
+ lichking->RemoveAurasDueToSpell(SPELL_SYLVANAS_DARKBINDING);
+ }
+ _events.ScheduleEvent(EVENT_ESCAPE_8, 1000);
+ break;
+ case EVENT_ESCAPE_8:
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ lichking->HandleEmoteCommand(TEXT_EMOTE_ROAR);
+ me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[0]);
+ _events.ScheduleEvent(EVENT_ESCAPE_9, 3000);
+ break;
+ case EVENT_ESCAPE_9:
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ lichking->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[0]);
+ _events.ScheduleEvent(EVENT_ESCAPE_10, 1000);
+ break;
+ case EVENT_ESCAPE_10:
+ me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[1]);
+ _events.ScheduleEvent(EVENT_ESCAPE_11, 5000);
+ break;
+ case EVENT_ESCAPE_11:
+ me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[2]);
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ lichking->GetMotionMaster()->MovePoint(0, LichKingFirstSummon);
+ _events.ScheduleEvent(EVENT_ESCAPE_12, 6000);
+ break;
+ case EVENT_ESCAPE_12:
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ {
+ lichking->AI()->Talk(SAY_LK_ESCAPE_3);
+ lichking->AI()->DoCast(me, SPELL_RAISE_DEAD);
+ lichking->Attack(me,true);
+ }
+ _events.ScheduleEvent(EVENT_ESCAPE_13, 4000);
+ break;
+ case EVENT_ESCAPE_13:
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ {
+ lichking->AI()->DoCast(lichking, SPELL_REMORSELESS_WINTER, true);
+ lichking->AI()->DoCast(lichking, SPELL_SUMMON_RISE_WITCH_DOCTOR);
+ lichking->GetMotionMaster()->MoveIdle();
+ lichking->GetMotionMaster()->MoveChase(me);
+ }
+ if (Creature* walltarget = me->SummonCreature(NPC_ICE_WALL,IceWalls[0].GetPositionX(), IceWalls[0].GetPositionY(), IceWalls[0].GetPositionZ(), IceWalls[0].GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN, 720000))
+ {
+ _walltargetGUID = walltarget->GetGUID();
+ walltarget->AI()->DoCast(walltarget, SPELL_SUMMON_ICE_WALL);
+ walltarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
+ me->Attack(walltarget,false);
+ }
+ me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[3]);
+ _events.ScheduleEvent(EVENT_ESCAPE_14, 8000);
+ break;
+ case EVENT_ESCAPE_14:
+ if (Creature* walltarget = me->GetCreature(*me, _walltargetGUID))
+ {
+ if (GameObject* icewall = walltarget->FindNearestGameObject(GO_ICE_WALL, 50.00f))
+ {
+ _icewallGUID = icewall->GetGUID();
+ icewall->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ _instance->HandleGameObject(0, false, icewall);
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ me->AI()->Talk(SAY_JAINA_ESCAPE_2);
+ else
+ me->AI()->Talk(SAY_SYLVANAS_ESCAPE_2);
+ }
+ }
+ _events.ScheduleEvent(EVENT_ESCAPE_15, 1000);
+ break;
+ case EVENT_ESCAPE_15:
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ {
+ lichking->GetMotionMaster()->MoveIdle();
+ lichking->GetMotionMaster()->MoveChase(me);
+ lichking->SetReactState(REACT_PASSIVE);
+ }
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ me->AI()->DoCast(me, SPELL_JAINA_DESTROY_ICE_WALL, false);
+ else
+ {
+ _isattackingwall = true;
+ me->AI()->DoCast(me, SPELL_SYLVANAS_DESTROY_ICE_WALL, false);
+ _events.ScheduleEvent(EVENT_ESCAPE_16, 1000);
+ }
+ break;
+ case EVENT_ESCAPE_16:
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
+ {
+ me->AI()->DoCast(me, SPELL_SYLVANAS_DESTROY_ICE_WALL, false);
+ if (_isattackingwall)
+ _events.ScheduleEvent(EVENT_ESCAPE_16, 1000);
+ }
+ break;
+ case EVENT_ESCAPE_17:// ICEWALL BROKEN
+ me->GetMotionMaster()->MoveIdle();
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ {
+ lichking->StopMoving();
+ lichking->AI()->Talk(SAY_LK_ESCAPE_3);
+ lichking->AI()->DoCast(me, SPELL_RAISE_DEAD);
+ }
+ if (Creature* walltarget = me->GetCreature(*me, _walltargetGUID))
+ walltarget->DespawnOrUnsummon(0);
+ if (GameObject* icewall = ObjectAccessor::GetGameObject(*me, _icewallGUID))
+ {
+ _instance->HandleGameObject(0 ,true, icewall);
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ me->RemoveAurasDueToSpell(SPELL_JAINA_DESTROY_ICE_WALL);
+ else
+ me->RemoveAurasDueToSpell(SPELL_SYLVANAS_DESTROY_ICE_WALL);
+ }
+ if (_icewall && _icewall < 4)
+ me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[_icewall + 3]);
+ _events.ScheduleEvent(EVENT_ESCAPE_18, 2000);
+ break;
+ case EVENT_ESCAPE_18:
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ {
+ lichking->GetMotionMaster()->MoveIdle();
+ lichking->GetMotionMaster()->MoveChase(me);
+ }
+ _events.ScheduleEvent(EVENT_ESCAPE_19, 6000);
+ break;
+ case EVENT_ESCAPE_19:
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ {
+ if (_icewall && _icewall < 4)
+ lichking->AI()->DoCast(lichking, SPELL_SUMMON_RISE_WITCH_DOCTOR);
+ lichking->GetMotionMaster()->MoveIdle();
+ lichking->GetMotionMaster()->MoveChase(me);
+ lichking->SetReactState(REACT_PASSIVE);
+ lichking->Attack(me,true);
+ }
+ if (Creature* walltarget = me->SummonCreature(NPC_ICE_WALL, IceWalls[_icewall].GetPositionX(), IceWalls[_icewall].GetPositionY(), IceWalls[_icewall].GetPositionZ(), IceWalls[_icewall].GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN, 720000))
+ {
+ _walltargetGUID = walltarget->GetGUID();
+ walltarget->AI()->DoCast(walltarget, SPELL_SUMMON_ICE_WALL);
+ walltarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
+ me->Attack(walltarget,false);
+ }
+ _events.ScheduleEvent(EVENT_ESCAPE_20, 3000);
+ break;
+ case EVENT_ESCAPE_20:
+ if (Creature* walltarget = me->GetCreature(*me, _walltargetGUID))
+ {
+ if (GameObject* icewall = walltarget->FindNearestGameObject(GO_ICE_WALL, 50.00f))
+ {
+ _icewallGUID = icewall->GetGUID();
+ _instance->HandleGameObject(0, false, icewall);
+ icewall->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ {
+ if (_icewall == 1)
+ me->AI()->Talk(SAY_JAINA_ESCAPE_3);
+ else if (_icewall == 2)
+ me->AI()->Talk(SAY_JAINA_ESCAPE_4);
+ else if (_icewall == 3)
+ me->AI()->Talk(SAY_JAINA_ESCAPE_5);
+ }
+ else if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ {
+ if (_icewall == 1)
+ me->AI()->Talk(SAY_SYLVANAS_ESCAPE_3);
+ else if (_icewall == 2)
+ me->AI()->Talk(SAY_SYLVANAS_ESCAPE_4);
+ else if (_icewall == 3)
+ me->AI()->Talk(SAY_SYLVANAS_ESCAPE_5);
+ }
+ }
+ }
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ {
+ if (_icewall && _icewall < 3)
+ lichking->AI()->DoCast(lichking, SPELL_SUMMON_RISE_WITCH_DOCTOR);
+ else
+ lichking->AI()->DoCast(lichking, SPELL_SUMMON_LUMBERING_ABOMINATION);
+ }
+ if (_icewall == 3)
+ _events.ScheduleEvent(EVENT_ESCAPE_21, 16000); // last wall, really far
+ else
+ _events.ScheduleEvent(EVENT_ESCAPE_21, 9000);
+ break;
+ case EVENT_ESCAPE_21:
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ me->AI()->DoCast(me, SPELL_JAINA_DESTROY_ICE_WALL, false);
+ else
+ {
+ me->AI()->DoCast(me, SPELL_SYLVANAS_DESTROY_ICE_WALL, false);
+ _isattackingwall = true;
+ _events.ScheduleEvent(EVENT_ESCAPE_22, 1000);
+ }
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ {
+ if (_icewall == 1)
+ lichking->AI()->DoCast(lichking, SPELL_SUMMON_LUMBERING_ABOMINATION);
+ else if (_icewall > 1 && _icewall < 4)
+ lichking->AI()->DoCast(lichking, SPELL_SUMMON_RISE_WITCH_DOCTOR);
+ }
+ break;
+ case EVENT_ESCAPE_22:
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ {
+ if (_icewall >= 2 && _icewall < 4)
+ lichking->AI()->DoCast(lichking, SPELL_SUMMON_LUMBERING_ABOMINATION);
+ }
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
+ {
+ me->AI()->DoCast(me, SPELL_SYLVANAS_DESTROY_ICE_WALL, false);
+ if (_isattackingwall)
+ _events.ScheduleEvent(EVENT_ESCAPE_22, 1000);
+ }
+ break;
+
+ case EVENT_ESCAPE_23:// FINAL PART
+ if (Creature* walltarget = me->GetCreature(*me, _walltargetGUID))
+ walltarget->DespawnOrUnsummon(0);
+ if (GameObject* icewall = ObjectAccessor::GetGameObject(*me, _icewallGUID))
+ {
+ _instance->HandleGameObject(0 ,true, icewall);
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ {
+ me->RemoveAurasDueToSpell(SPELL_JAINA_DESTROY_ICE_WALL);
+ me->AI()->Talk(SAY_JAINA_ESCAPE_6);
+ }
+ else
+ {
+ me->RemoveAurasDueToSpell(SPELL_SYLVANAS_DESTROY_ICE_WALL);
+ me->AI()->Talk(SAY_SYLVANAS_ESCAPE_6);
+ }
+ }
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ {
+ lichking->GetMotionMaster()->MovePoint(0, LichKingFinalPos);
+ lichking->AI()->Talk(SAY_LK_ESCAPE_11);
+ }
+ me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[8]);
+ _events.ScheduleEvent(EVENT_ESCAPE_24, 10000);
+ break;
+ case EVENT_ESCAPE_24:
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ me->AI()->Talk(SAY_JAINA_ESCAPE_8);
+ else
+ me->AI()->Talk(SAY_SYLVANAS_ESCAPE_8);
+ _events.ScheduleEvent(EVENT_ESCAPE_25, 5000);
+ break;
+ case EVENT_ESCAPE_25:
+ if (GameObject* cave = _instance->instance->GetGameObject(_instance->GetData64(DATA_CAVE_IN)))
+ cave->SetGoState(GO_STATE_READY);
+ _events.ScheduleEvent(EVENT_ESCAPE_26, 4000);
+ break;
+ case EVENT_ESCAPE_26:
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ me->AI()->Talk(SAY_JAINA_ESCAPE_10);
+ else
+ me->AI()->Talk(SAY_SYLVANAS_ESCAPE_9);
+ _events.ScheduleEvent(EVENT_ESCAPE_27, 4000);
+ break;
+ case EVENT_ESCAPE_27:
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ me->SummonGameObject(GO_CAPTAIN_CHEST_1, ChestPos.GetPositionX(), ChestPos.GetPositionY(), ChestPos.GetPositionZ(), ChestPos.GetOrientation(), 0, 0, 0, 0, 720000);
+ else
+ me->SummonGameObject(GO_CAPTAIN_CHEST_3, ChestPos.GetPositionX(), ChestPos.GetPositionY(), ChestPos.GetPositionZ(), ChestPos.GetOrientation(), 0, 0, 0, 0, 720000);
+ me->SummonGameObject(GO_PORTAL, FinalPortalPos.GetPositionX(), FinalPortalPos.GetPositionY(), FinalPortalPos.GetPositionZ(), FinalPortalPos.GetOrientation(), 0, 0, 0, 0, 720000);
+ if (Creature* lichking = me->GetCreature(*me, _lichkingGUID))
+ lichking->DespawnOrUnsummon(1);
+ break;
+ }
+ }
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_jaina_or_sylvanas_escape_horAI(creature);
+ }
+};
+
enum TrashSpells
{
// Ghostly Priest
@@ -655,20 +1206,20 @@ enum TrashEvents
struct npc_gauntlet_trash : public ScriptedAI
{
npc_gauntlet_trash(Creature* creature) : ScriptedAI(creature),
- instance(creature->GetInstanceScript())
+ _instance(creature->GetInstanceScript())
{
}
void Reset() OVERRIDE
{
me->CastSpell(me, SPELL_WELL_OF_SOULS, true);
- events.Reset();
+ _events.Reset();
}
void EnterEvadeMode() OVERRIDE
{
- if (instance->GetData(DATA_WAVE_COUNT) != NOT_STARTED)
- instance->SetData(DATA_WAVE_COUNT, NOT_STARTED);
+ if (_instance->GetData(DATA_WAVE_COUNT) != NOT_STARTED)
+ _instance->SetData(DATA_WAVE_COUNT, NOT_STARTED);
}
void SetData(uint32 type, uint32 value) OVERRIDE
@@ -688,8 +1239,8 @@ struct npc_gauntlet_trash : public ScriptedAI
}
protected:
- EventMap events;
- InstanceScript* instance;
+ EventMap _events;
+ InstanceScript* _instance;
uint32 InternalWaveId;
};
@@ -706,10 +1257,10 @@ public:
void EnterCombat(Unit* /*who*/) OVERRIDE
{
- events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 8000); /// @todo adjust timers
- events.ScheduleEvent(EVENT_CIRCLE_OF_DESTRUCTION, 12000);
- events.ScheduleEvent(EVENT_COWER_IN_FEAR, 10000);
- events.ScheduleEvent(EVENT_DARK_MENDING, 20000);
+ _events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 8000); /// @todo adjust timers
+ _events.ScheduleEvent(EVENT_CIRCLE_OF_DESTRUCTION, 12000);
+ _events.ScheduleEvent(EVENT_COWER_IN_FEAR, 10000);
+ _events.ScheduleEvent(EVENT_DARK_MENDING, 20000);
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -717,39 +1268,39 @@ public:
if (!UpdateVictim())
return;
- events.Update(diff);
+ _events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
- switch (events.ExecuteEvent())
+ switch (_events.ExecuteEvent())
{
case EVENT_SHADOW_WORD_PAIN:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(target, SPELL_SHADOW_WORD_PAIN);
- events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 8000);
+ _events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 8000);
break;
case EVENT_CIRCLE_OF_DESTRUCTION:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(target, SPELL_CIRCLE_OF_DESTRUCTION);
- events.ScheduleEvent(EVENT_CIRCLE_OF_DESTRUCTION, 12000);
+ _events.ScheduleEvent(EVENT_CIRCLE_OF_DESTRUCTION, 12000);
break;
case EVENT_COWER_IN_FEAR:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(target, SPELL_COWER_IN_FEAR);
- events.ScheduleEvent(EVENT_COWER_IN_FEAR, 10000);
+ _events.ScheduleEvent(EVENT_COWER_IN_FEAR, 10000);
break;
case EVENT_DARK_MENDING:
// find an ally with missing HP
if (Unit* target = DoSelectLowestHpFriendly(40, DUNGEON_MODE(30000, 50000)))
{
DoCast(target, SPELL_DARK_MENDING);
- events.ScheduleEvent(EVENT_DARK_MENDING, 20000);
+ _events.ScheduleEvent(EVENT_DARK_MENDING, 20000);
}
else
{
// no friendly unit with missing hp. re-check in just 5 sec.
- events.ScheduleEvent(EVENT_DARK_MENDING, 5000);
+ _events.ScheduleEvent(EVENT_DARK_MENDING, 5000);
}
break;
}
@@ -777,11 +1328,11 @@ public:
void EnterCombat(Unit* /*who*/) OVERRIDE
{
- events.ScheduleEvent(EVENT_FIREBALL, 3000); /// @todo adjust timers
- events.ScheduleEvent(EVENT_FLAMESTRIKE, 6000);
- events.ScheduleEvent(EVENT_FROSTBOLT, 9000);
- events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 12000);
- events.ScheduleEvent(EVENT_HALLUCINATION, 40000);
+ _events.ScheduleEvent(EVENT_FIREBALL, 3000); /// @todo adjust timers
+ _events.ScheduleEvent(EVENT_FLAMESTRIKE, 6000);
+ _events.ScheduleEvent(EVENT_FROSTBOLT, 9000);
+ _events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 12000);
+ _events.ScheduleEvent(EVENT_HALLUCINATION, 40000);
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -789,31 +1340,31 @@ public:
if (!UpdateVictim())
return;
- events.Update(diff);
+ _events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
- switch (events.ExecuteEvent())
+ switch (_events.ExecuteEvent())
{
case EVENT_FIREBALL:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(target, SPELL_FIREBALL);
- events.ScheduleEvent(EVENT_FIREBALL, 15000);
+ _events.ScheduleEvent(EVENT_FIREBALL, 15000);
break;
case EVENT_FLAMESTRIKE:
DoCast(SPELL_FLAMESTRIKE);
- events.ScheduleEvent(EVENT_FLAMESTRIKE, 15000);
+ _events.ScheduleEvent(EVENT_FLAMESTRIKE, 15000);
break;
case EVENT_FROSTBOLT:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(target, SPELL_FROSTBOLT);
- events.ScheduleEvent(EVENT_FROSTBOLT, 15000);
+ _events.ScheduleEvent(EVENT_FROSTBOLT, 15000);
break;
case EVENT_CHAINS_OF_ICE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(target, SPELL_CHAINS_OF_ICE);
- events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 15000);
+ _events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 15000);
break;
case EVENT_HALLUCINATION:
DoCast(SPELL_HALLUCINATION);
@@ -864,10 +1415,10 @@ public:
void EnterCombat(Unit* /*who*/) OVERRIDE
{
- events.ScheduleEvent(EVENT_SHADOW_STEP, 8000); /// @todo adjust timers
- events.ScheduleEvent(EVENT_DEADLY_POISON, 5000);
- events.ScheduleEvent(EVENT_ENVENOMED_DAGGER_THROW, 10000);
- events.ScheduleEvent(EVENT_KIDNEY_SHOT, 12000);
+ _events.ScheduleEvent(EVENT_SHADOW_STEP, 8000); /// @todo adjust timers
+ _events.ScheduleEvent(EVENT_DEADLY_POISON, 5000);
+ _events.ScheduleEvent(EVENT_ENVENOMED_DAGGER_THROW, 10000);
+ _events.ScheduleEvent(EVENT_KIDNEY_SHOT, 12000);
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -875,29 +1426,29 @@ public:
if (!UpdateVictim())
return;
- events.Update(diff);
+ _events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
- switch (events.ExecuteEvent())
+ switch (_events.ExecuteEvent())
{
case EVENT_SHADOW_STEP:
DoCast(SPELL_SHADOW_STEP);
- events.ScheduleEvent(EVENT_SHADOW_STEP, 8000);
+ _events.ScheduleEvent(EVENT_SHADOW_STEP, 8000);
break;
case EVENT_DEADLY_POISON:
DoCastVictim(SPELL_DEADLY_POISON);
- events.ScheduleEvent(EVENT_DEADLY_POISON, 10000);
+ _events.ScheduleEvent(EVENT_DEADLY_POISON, 10000);
break;
case EVENT_ENVENOMED_DAGGER_THROW:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(target, SPELL_ENVENOMED_DAGGER_THROW);
- events.ScheduleEvent(EVENT_ENVENOMED_DAGGER_THROW, 10000);
+ _events.ScheduleEvent(EVENT_ENVENOMED_DAGGER_THROW, 10000);
break;
case EVENT_KIDNEY_SHOT:
DoCastVictim(SPELL_KIDNEY_SHOT);
- events.ScheduleEvent(EVENT_KIDNEY_SHOT, 10000);
+ _events.ScheduleEvent(EVENT_KIDNEY_SHOT, 10000);
break;
}
@@ -924,9 +1475,9 @@ public:
void EnterCombat(Unit* /*who*/) OVERRIDE
{
- events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000); /// @todo adjust timers
- events.ScheduleEvent(EVENT_SHIELD_BASH, 10000);
- events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000);
+ _events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000); /// @todo adjust timers
+ _events.ScheduleEvent(EVENT_SHIELD_BASH, 10000);
+ _events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000);
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -934,24 +1485,24 @@ public:
if (!UpdateVictim())
return;
- events.Update(diff);
+ _events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
- switch (events.ExecuteEvent())
+ switch (_events.ExecuteEvent())
{
case EVENT_SPECTRAL_STRIKE:
DoCastVictim(SPELL_SPECTRAL_STRIKE);
- events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000);
+ _events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000);
break;
case EVENT_SHIELD_BASH:
DoCastVictim(SPELL_SHIELD_BASH);
- events.ScheduleEvent(EVENT_SHIELD_BASH, 5000);
+ _events.ScheduleEvent(EVENT_SHIELD_BASH, 5000);
break;
case EVENT_TORTURED_ENRAGE:
DoCast(SPELL_TORTURED_ENRAGE);
- events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000);
+ _events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000);
break;
}
@@ -978,10 +1529,10 @@ public:
void EnterCombat(Unit* /*who*/) OVERRIDE
{
- events.ScheduleEvent(EVENT_SHOOT, 2000); /// @todo adjust timers
- events.ScheduleEvent(EVENT_CURSED_ARROW, 10000);
- events.ScheduleEvent(EVENT_FROST_TRAP, 1000);
- events.ScheduleEvent(EVENT_ICE_SHOT, 15000);
+ _events.ScheduleEvent(EVENT_SHOOT, 1); /// @todo adjust timers
+ _events.ScheduleEvent(EVENT_CURSED_ARROW, 7000);
+ _events.ScheduleEvent(EVENT_FROST_TRAP, 10000);
+ _events.ScheduleEvent(EVENT_ICE_SHOT, 15000);
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -989,34 +1540,33 @@ public:
if (!UpdateVictim())
return;
- events.Update(diff);
+ _events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
- switch (events.ExecuteEvent())
+ switch (_events.ExecuteEvent())
{
case EVENT_SHOOT:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(target, SPELL_SHOOT);
- events.ScheduleEvent(EVENT_SHOOT, 2000);
+ _events.ScheduleEvent(EVENT_SHOOT, 2000);
break;
case EVENT_CURSED_ARROW:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(target, SPELL_CURSED_ARROW);
- events.ScheduleEvent(EVENT_CURSED_ARROW, 10000);
+ _events.ScheduleEvent(EVENT_CURSED_ARROW, 10000);
break;
case EVENT_FROST_TRAP:
DoCast(SPELL_FROST_TRAP);
- events.ScheduleEvent(EVENT_FROST_TRAP, 30000);
+ _events.ScheduleEvent(EVENT_FROST_TRAP, 30000);
break;
case EVENT_ICE_SHOT:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(target, SPELL_ICE_SHOT);
- events.ScheduleEvent(EVENT_ICE_SHOT, 15000);
+ _events.ScheduleEvent(EVENT_ICE_SHOT, 15000);
break;
}
-
DoMeleeAttackIfReady();
}
};
@@ -1031,9 +1581,9 @@ public:
enum GeneralEvents
{
//General
- EVENT_SHIELD = 0,
- EVENT_SPIKE = 1,
- EVENT_CLONE = 2,
+ EVENT_SHIELD = 1,
+ EVENT_SPIKE = 2,
+ EVENT_CLONE = 3,
SAY_AGGRO = 0,
SAY_DEATH = 1,
@@ -1044,7 +1594,7 @@ enum GeneralEvents
SPELL_CLONE_MODEL = 45204,
// Reflection
- EVENT_BALEFUL_STRIKE = 0,
+ EVENT_BALEFUL_STRIKE = 1,
SPELL_BALEFUL_STRIKE = 69933, // 70400 on hc
SPELL_SPIRIT_BURST = 69900, // 73046 on hc
@@ -1059,33 +1609,32 @@ public:
{
npc_frostworn_generalAI(Creature* creature) : ScriptedAI(creature)
{
- instance = me->GetInstanceScript();
+ _instance = me->GetInstanceScript();
Reset();
}
- InstanceScript* instance;
-
- EventMap events;
+ InstanceScript* _instance;
+ EventMap _events;
void Reset() OVERRIDE
{
- events.Reset();
- instance->SetData(DATA_FROSWORN_EVENT, NOT_STARTED);
+ _events.Reset();
+ _instance->SetData(DATA_FROSWORN_EVENT, NOT_STARTED);
}
void JustDied(Unit* /*killer*/) OVERRIDE
{
Talk(SAY_DEATH);
- instance->SetData(DATA_FROSWORN_EVENT, DONE);
+ _instance->SetData(DATA_FROSWORN_EVENT, DONE);
}
void EnterCombat(Unit* /*victim*/) OVERRIDE
{
Talk(SAY_AGGRO);
- events.ScheduleEvent(EVENT_SHIELD, 5000);
- events.ScheduleEvent(EVENT_SPIKE, 14000);
- events.ScheduleEvent(EVENT_CLONE, 22000);
- instance->SetData(DATA_FROSWORN_EVENT, IN_PROGRESS);
+ _events.ScheduleEvent(EVENT_SHIELD, 5000);
+ _events.ScheduleEvent(EVENT_SPIKE, 14000);
+ _events.ScheduleEvent(EVENT_CLONE, 22000);
+ _instance->SetData(DATA_FROSWORN_EVENT, IN_PROGRESS);
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -1093,29 +1642,31 @@ public:
if (!UpdateVictim())
return;
- events.Update(diff);
+ _events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
- switch (events.ExecuteEvent())
+ while (uint32 event = _events.ExecuteEvent())
{
- case EVENT_SHIELD:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_SHIELD_THROWN);
- events.ScheduleEvent(EVENT_SHIELD, urand(8000, 12000));
- break;
- case EVENT_SPIKE:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_SPIKE);
- events.ScheduleEvent(EVENT_SPIKE, urand(15000, 20000));
- break;
- case EVENT_CLONE:
- SummonClones();
- events.ScheduleEvent(EVENT_CLONE, 60000);
- break;
+ switch (event)
+ {
+ case EVENT_SHIELD:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_SHIELD_THROWN);
+ _events.ScheduleEvent(EVENT_SHIELD, urand(8000, 12000));
+ break;
+ case EVENT_SPIKE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_SPIKE);
+ _events.ScheduleEvent(EVENT_SPIKE, urand(15000, 20000));
+ break;
+ case EVENT_CLONE:
+ SummonClones();
+ _events.ScheduleEvent(EVENT_CLONE, 60000);
+ break;
+ }
}
-
DoMeleeAttackIfReady();
}
@@ -1133,7 +1684,6 @@ public:
reflection->setFaction(me->getFaction());
reflection->AI()->AttackStart(temp);
}
-
}
};
@@ -1155,16 +1705,16 @@ public:
Reset();
}
- EventMap events;
+ EventMap _events;
void Reset() OVERRIDE
{
- events.Reset();
+ _events.Reset();
}
void EnterCombat(Unit* /*victim*/) OVERRIDE
{
- events.ScheduleEvent(EVENT_BALEFUL_STRIKE, 3000);
+ _events.ScheduleEvent(EVENT_BALEFUL_STRIKE, 3000);
}
void JustDied(Unit* killer) OVERRIDE
@@ -1177,17 +1727,17 @@ public:
if (!UpdateVictim())
return;
- events.Update(diff);
+ _events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
- switch (events.ExecuteEvent())
+ switch (_events.ExecuteEvent())
{
case EVENT_BALEFUL_STRIKE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_BALEFUL_STRIKE);
- events.ScheduleEvent(EVENT_BALEFUL_STRIKE, urand(3000, 8000));
+ _events.ScheduleEvent(EVENT_BALEFUL_STRIKE, urand(3000, 8000));
}
DoMeleeAttackIfReady();
@@ -1207,15 +1757,13 @@ public:
bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) OVERRIDE
{
- InstanceScript* instance = player->GetInstanceScript();
+ InstanceScript* _instance = player->GetInstanceScript();
if (player->IsGameMaster())
return true;
- if (instance->GetData(DATA_INTRO_EVENT) == NOT_STARTED)
- {
- instance->SetData(DATA_INTRO_EVENT, IN_PROGRESS);
- }
+ if (_instance->GetData(DATA_INTRO_EVENT) == NOT_STARTED)
+ _instance->SetData(DATA_INTRO_EVENT, IN_PROGRESS);
return true;
}
@@ -1228,24 +1776,24 @@ public:
bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) OVERRIDE
{
- InstanceScript* instance = player->GetInstanceScript();
+ InstanceScript* _instance = player->GetInstanceScript();
if (player->IsGameMaster())
return true;
- if (instance->GetData(DATA_WAVE_COUNT))
+ if (_instance->GetData(DATA_WAVE_COUNT))
return true;
- if (instance->GetData(DATA_INTRO_EVENT) == DONE && instance->GetBossState(DATA_MARWYN_EVENT) != DONE)
+ if (_instance->GetData(DATA_INTRO_EVENT) == DONE && _instance->GetBossState(DATA_MARWYN_EVENT) != DONE)
{
- instance->ProcessEvent(0, EVENT_SPAWN_WAVES);
+ _instance->ProcessEvent(0, EVENT_SPAWN_WAVES);
- if (Creature* falric = player->GetCreature(*player, instance->GetData64(DATA_FALRIC_EVENT)))
+ if (Creature* falric = player->GetCreature(*player, _instance->GetData64(DATA_FALRIC_EVENT)))
{
falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true);
falric->SetVisible(true);
}
- if (Creature* marwyn = player->GetCreature(*player, instance->GetData64(DATA_MARWYN_EVENT)))
+ if (Creature* marwyn = player->GetCreature(*player, _instance->GetData64(DATA_MARWYN_EVENT)))
{
marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true);
marwyn->SetVisible(true);
@@ -1255,17 +1803,349 @@ public:
}
};
+class at_shadow_throne : public AreaTriggerScript
+{
+public:
+ at_shadow_throne() : AreaTriggerScript("at_shadow_throne") { }
+
+ bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/) OVERRIDE
+ {
+ InstanceScript* _instance = player->GetInstanceScript();
+
+ if (player->IsGameMaster())
+ return true;
+
+ if (_instance->GetData(DATA_ESCAPE_EVENT) == NOT_STARTED)
+ _instance->SetData(DATA_ESCAPE_EVENT, IN_PROGRESS);
+
+ return true;
+ }
+};
+
+class npc_raging_ghoul : public CreatureScript
+{
+public:
+ npc_raging_ghoul() : CreatureScript("npc_raging_ghoul") { }
+
+ struct npc_raging_ghoulAI : public ScriptedAI
+ {
+ npc_raging_ghoulAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = me->GetInstanceScript();
+ }
+
+ InstanceScript* _instance;
+ uint32 _emergeTimer;
+ bool _doEmerge;
+ bool _doJump;
+ uint64 _leaderGUID;
+
+ void Reset() OVERRIDE
+ {
+ _emergeTimer = 4000;
+ _doEmerge = false;
+ _doJump = false;
+ if (_instance && _instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS)
+ _instance->SetData(DATA_SUMMONS, 1);
+
+ }
+
+ void IsSummonedBy(Unit*) OVERRIDE
+ {
+ DoCast(me, SPELL_EMERGE_VISUAL);
+ DoZoneInCombat(me, 100.00f);
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ if (_instance)
+ _instance->SetData(DATA_SUMMONS, 0);
+ }
+
+ void AttackStart(Unit* who) OVERRIDE
+ {
+ if (!who)
+ return;
+
+ if (!_doEmerge)
+ return;
+
+ ScriptedAI::AttackStart(who);
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!_instance)
+ return;
+
+ if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS)
+ {
+ _leaderGUID = _instance->GetData64(DATA_ESCAPE_LEADER);
+ Creature* leader = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ESCAPE_LEADER));
+
+ if (_doEmerge != true)
+ {
+ if (_emergeTimer < diff)
+ {
+ _doEmerge = true;
+ if (leader)
+ {
+ DoResetThreat();
+ me->GetMotionMaster()->MoveIdle();
+ me->GetMotionMaster()->MoveChase(leader);
+ }
+ }
+ else
+ _emergeTimer -= diff;
+ }
+
+ if (me->Attack(leader,true))/*(Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150.0f))*/
+ {
+ if (!_doJump && me->IsWithinDistInMap(leader, 30.0f) && !me->IsWithinDistInMap(leader, 5.0f))
+ {
+ _doJump = true;
+ DoCast(leader, SPELL_GHOUL_JUMP);
+ }
+ }
+ }
+ else if (_instance->GetData(DATA_ESCAPE_EVENT) == FAIL || _instance->GetData(DATA_ESCAPE_EVENT) == NOT_STARTED)
+ me->DespawnOrUnsummon();
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_raging_ghoulAI(creature);
+ }
+};
+
+class npc_risen_witch_doctor : public CreatureScript
+{
+public:
+ npc_risen_witch_doctor() : CreatureScript("npc_risen_witch_doctor") { }
+
+ struct npc_risen_witch_doctorAI : public ScriptedAI
+ {
+ npc_risen_witch_doctorAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = me->GetInstanceScript();
+ }
+
+ InstanceScript* _instance;
+ uint32 _emergeTimer;
+ bool _doEmerge;
+ uint64 _leaderGUID;
+ uint32 _boltTimer;
+ uint32 _boltVolleyTimer;
+ uint32 _curseTimer;
+
+ void Reset() OVERRIDE
+ {
+ _emergeTimer = 5000;
+ _boltTimer = 6000;
+ _boltVolleyTimer = 15000;
+ _curseTimer = 7000;
+ _doEmerge = false;
+ if (_instance)
+ if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS)
+ _instance->SetData(DATA_SUMMONS, 1);
+ }
+
+ void IsSummonedBy(Unit*) OVERRIDE
+ {
+ DoCast(me, SPELL_EMERGE_VISUAL);
+ DoZoneInCombat(me, 100.00f);
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ if (_instance)
+ _instance->SetData(DATA_SUMMONS, 0);
+
+ }
+
+ void AttackStart(Unit* who) OVERRIDE
+ {
+ if (!who)
+ return;
+
+ if (_doEmerge == false)
+ return;
+
+ ScriptedAI::AttackStart(who);
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!_instance)
+ return;
+
+ if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS)
+ {
+ if (_doEmerge != true)
+ {
+ if (_emergeTimer < diff)
+ {
+ _doEmerge = true;
+ _leaderGUID = _instance->GetData64(DATA_ESCAPE_LEADER);
+
+ if (Creature* leader = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ESCAPE_LEADER)))
+ {
+ DoResetThreat();
+ me->GetMotionMaster()->MoveIdle();
+ me->GetMotionMaster()->MoveChase(leader);
+ }
+ }
+ else
+ _emergeTimer -= diff;
+ }
+
+ if (_curseTimer < diff)
+ {
+ if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM))
+ DoCast(target, SPELL_COURSE_OF_DOOM);
+ _curseTimer = urand(10000, 15000);
+ }
+ else
+ _curseTimer -= diff;
+
+ if (_boltTimer < diff)
+ {
+ if (Unit *target = SelectTarget(SELECT_TARGET_TOPAGGRO))
+ DoCast(target, SPELL_SHADOW_BOLT);
+ _boltTimer = urand(2000, 3000);
+ }
+ else
+ _boltTimer -= diff;
+
+ if (_boltVolleyTimer < diff)
+ {
+ if (Unit *target = SelectTarget(SELECT_TARGET_TOPAGGRO))
+ DoCast(target, SPELL_SHADOW_BOLT_VOLLEY);
+ _boltVolleyTimer = urand(15000, 22000);
+ }
+ else
+ _boltVolleyTimer -= diff;
+ }
+ else if (_instance->GetData(DATA_ESCAPE_EVENT) == FAIL || _instance->GetData(DATA_ESCAPE_EVENT) == NOT_STARTED)
+ me->DespawnOrUnsummon();
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_risen_witch_doctorAI(creature);
+ }
+};
+
+
+class npc_lumbering_abomination : public CreatureScript
+{
+public:
+ npc_lumbering_abomination() : CreatureScript("npc_lumbering_abomination") { }
+
+ struct npc_lumbering_abominationAI : public ScriptedAI
+ {
+ npc_lumbering_abominationAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = me->GetInstanceScript();
+ }
+
+ InstanceScript* _instance;
+ uint64 _leaderGUID;
+ bool _doWalk;
+ uint32 _strikeTimer;
+ uint32 _vomitTimer;
+
+ void Reset() OVERRIDE
+ {
+ _doWalk = false;
+ _vomitTimer = 15000;
+ _strikeTimer = 6000;
+ if (_instance)
+ if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS)
+ _instance->SetData(DATA_SUMMONS, 1);
+ }
+
+ void IsSummonedBy(Unit*) OVERRIDE
+ {
+ DoCast(me, SPELL_EMERGE_VISUAL);
+ DoZoneInCombat(me, 100.00f);
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!_instance)
+ return;
+
+ if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS)
+ {
+ if (_doWalk != true)
+ {
+ _doWalk = true;
+ _leaderGUID = _instance->GetData64(DATA_ESCAPE_LEADER);
+ if (Creature* leader = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ESCAPE_LEADER)))
+ {
+ DoResetThreat();
+ me->GetMotionMaster()->MoveIdle();
+ me->GetMotionMaster()->MoveChase(leader);
+ }
+ }
+ if (_strikeTimer < diff)
+ {
+ if (Unit *target = SelectTarget(SELECT_TARGET_TOPAGGRO))
+ DoCast(target, SPELL_ABON_STRIKE);
+ _strikeTimer = urand(7000, 9000);
+ }
+ else
+ _strikeTimer -= diff;
+
+ if (_vomitTimer < diff)
+ {
+ if (Unit *target = SelectTarget(SELECT_TARGET_TOPAGGRO))
+ DoCast(target, SPELL_VOMIT_SPRAY);
+ _vomitTimer = urand(15000, 20000);
+ }
+ else
+ _vomitTimer -= diff;
+ }
+ else if (_instance->GetData(DATA_ESCAPE_EVENT) == FAIL || _instance->GetData(DATA_ESCAPE_EVENT) == NOT_STARTED)
+ me->DespawnOrUnsummon();
+ DoMeleeAttackIfReady();
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ if (_instance)
+ _instance->SetData(DATA_SUMMONS, 0);
+ }
+
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_lumbering_abominationAI(creature);
+ }
+};
+
void AddSC_halls_of_reflection()
{
+ new at_hor_intro_start();
+ new at_hor_waves_restarter();
+ new at_shadow_throne();
new npc_jaina_or_sylvanas_hor();
+ new npc_jaina_or_sylvanas_escape_hor();
new npc_ghostly_priest();
new npc_phantom_mage();
new npc_phantom_hallucination();
new npc_shadowy_mercenary();
new npc_spectral_footman();
new npc_tortured_rifleman();
- new at_hor_intro_start();
- new at_hor_waves_restarter();
+ new npc_raging_ghoul();
+ new npc_risen_witch_doctor();
+ new npc_lumbering_abomination();
new npc_frostworn_general();
new npc_spiritual_reflection();
}
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
index c5fe115978f..3223ecf66a5 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
@@ -39,6 +39,11 @@ enum Data
DATA_TEAM_IN_INSTANCE = 6,
DATA_FROSTMOURNE = 7,
DATA_FROSTWORN_DOOR = 8,
+ DATA_ESCAPE_EVENT = 9,
+ DATA_ESCAPE_LEADER = 10,
+ DATA_SUMMONS = 11,
+ DATA_ICEWALL = 12,
+ DATA_CAVE_IN = 13
};
enum Creatures
@@ -67,6 +72,10 @@ enum Creatures
NPC_BARTLETT = 37182, // High Captain Justin Bartlett
NPC_KORM = 37833, // Sky-Reaver Korm Blackscar
NPC_ICE_WALL = 37014, // Ice Wall Target
+
+ NPC_RAGING_GNOUL = 36940,
+ NPC_RISEN_WITCH_DOCTOR = 36941,
+ NPC_ABON = 37069
};
enum GameObjects
@@ -102,6 +111,8 @@ enum HorWorldStates
enum Actions
{
ACTION_ENTER_COMBAT,
+ ACTION_START_ESCAPING,
+ ACTION_WALL_BROKEN
};
enum TrashGeneralSpells
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
index 115127b8c2f..a026a6636d4 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
@@ -24,7 +24,9 @@
Position const JainaSpawnPos = {5236.659f, 1929.894f, 707.7781f, 0.8726646f}; // Jaina Spawn Position
Position const SylvanasSpawnPos = {5236.667f, 1929.906f, 707.7781f, 0.8377581f}; // Sylvanas Spawn Position
-Position const GeneralSpawnPos = {5415.538f, 2117.842f, 707.7781f, 3.944444f}; // Frostsworn General
+Position const GeneralSpawnPos = {5415.538f, 2117.842f, 707.7781f, 3.944444f}; // Frostsworn General
+Position const JainaSpawnPos2 = {5549.011f, 2257.041f, 733.0120f, 1.153993f}; // Jaina Spawn Position 2
+Position const SylvanasSpawnPos2 = {5549.011f, 2257.041f, 733.0120f, 1.153993f}; // Sylvanas Spawn Position 2
Position const SpawnPos[] =
{
@@ -73,7 +75,7 @@ public:
{
instance_halls_of_reflection_InstanceMapScript(Map* map) : InstanceScript(map) {}
- void Initialize()
+ void Initialize() OVERRIDE
{
SetBossNumber(MAX_ENCOUNTER);
events.Reset();
@@ -87,17 +89,19 @@ public:
_arthasDoorGUID = 0;
_teamInInstance = 0;
_waveCount = 0;
+ _mobsaticewall = 0;
_introEvent = NOT_STARTED;
_frostwornGeneral = NOT_STARTED;
+ _escapeevent = NOT_STARTED;
}
- void OnPlayerEnter(Player* player)
+ void OnPlayerEnter(Player* player) OVERRIDE
{
if (!_teamInInstance)
_teamInInstance = player->GetTeam();
}
- void OnCreatureCreate(Creature* creature)
+ void OnCreatureCreate(Creature* creature) OVERRIDE
{
Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
@@ -122,10 +126,14 @@ public:
if (Creature* general = instance->GetCreature(_frostwornGeneralGUID))
general->SetPhaseMask(1, true);
break;
+ case NPC_JAINA_PART2:
+ case NPC_SYLVANAS_PART2:
+ _jainaOrSylvanasPart2GUID = creature->GetGUID();
+ break;
}
}
- void OnCreatureRemove(Creature* creature)
+ void OnCreatureRemove(Creature* creature) OVERRIDE
{
switch (creature->GetEntry())
{
@@ -142,7 +150,7 @@ public:
}
}
- void OnGameObjectCreate(GameObject* go)
+ void OnGameObjectCreate(GameObject* go) OVERRIDE
{
switch (go->GetEntry())
{
@@ -174,16 +182,20 @@ public:
else
HandleGameObject(0, false, go);
break;
+ case GO_CAVE:
+ _caveGUID = go->GetGUID();
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ break;
}
}
- void FillInitialWorldStates(WorldPacket& data)
+ void FillInitialWorldStates(WorldPacket& data) OVERRIDE
{
data << uint32(WORLD_STATE_HOR_WAVES_ENABLED) << uint32(0);
data << uint32(WORLD_STATE_HOR_WAVE_COUNT) << uint32(0);
}
- bool SetBossState(uint32 type, EncounterState state)
+ bool SetBossState(uint32 type, EncounterState state) OVERRIDE
{
if (!InstanceScript::SetBossState(type, state))
return false;
@@ -202,12 +214,12 @@ public:
{
HandleGameObject(_entranceDoorGUID, true);
HandleGameObject(_frostwornDoorGUID, true);
+ DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 0);
if (Creature* general = instance->GetCreature(_frostwornGeneralGUID))
general->SetPhaseMask(1, true);
}
break;
case DATA_LICHKING_EVENT:
- break;
default:
break;
}
@@ -240,11 +252,45 @@ public:
if (data == DONE)
{
HandleGameObject(_arthasDoorGUID, true);
- // spawn Jaina part 2
- // spawn LK part 2
+ if (_teamInInstance == ALLIANCE)
+ instance->SummonCreature(NPC_JAINA_PART2, JainaSpawnPos2);
+ else
+ instance->SummonCreature(NPC_SYLVANAS_PART2, SylvanasSpawnPos2);
}
_frostwornGeneral = data;
break;
+ case DATA_ESCAPE_EVENT:
+ if (data == IN_PROGRESS)
+ {
+ if (!_escapeevent)
+ if (Creature* jaina_or_sylvanas = instance->GetCreature(_jainaOrSylvanasPart2GUID))
+ jaina_or_sylvanas->AI()->DoAction(ACTION_START_ESCAPING);
+ }
+ else if (data == NOT_STARTED)
+ {
+ if (Creature* jaina_or_sylvanas = instance->GetCreature(_jainaOrSylvanasPart2GUID))
+ jaina_or_sylvanas->DespawnOrUnsummon(1);
+ if (_teamInInstance == ALLIANCE)
+ instance->SummonCreature(NPC_JAINA_PART2, JainaSpawnPos2);
+ else
+ instance->SummonCreature(NPC_SYLVANAS_PART2, SylvanasSpawnPos2);
+ SetData(DATA_ESCAPE_EVENT,IN_PROGRESS);
+ }
+ _escapeevent = data;
+ break;
+ case DATA_SUMMONS:
+ if (data == 0)
+ {
+ _mobsaticewall--;
+ if (_mobsaticewall == 0)
+ {
+ if (Creature* jaina_or_sylvanas = instance->GetCreature(_jainaOrSylvanasPart2GUID))
+ jaina_or_sylvanas->AI()->DoAction(ACTION_WALL_BROKEN);
+ }
+ }
+ else if (data == 1)
+ _mobsaticewall++;
+ break;
}
SaveToDB();
@@ -252,7 +298,7 @@ public:
// wave scheduling,checked when wave npcs die
- void OnUnitDeath(Unit* unit)
+ void OnUnitDeath(Unit* unit) OVERRIDE
{
Creature* creature = unit->ToCreature();
if (!creature)
@@ -274,20 +320,19 @@ public:
if (!npc || !npc->IsAlive())
++deadNpcs;
}
-
// because the current npc returns IsAlive when OnUnitDeath happens
// we check if the number of dead npcs is equal to the list-1
if (deadNpcs == waveGuidList[waveId].size() - 1)
{
++_waveCount;
- events.ScheduleEvent(EVENT_NEXT_WAVE, 10000);
+ events.ScheduleEvent(EVENT_NEXT_WAVE, 3000);
}
break;
}
}
}
- void Update(uint32 diff)
+ void Update(uint32 diff) OVERRIDE
{
if (!instance->HavePlayers())
return;
@@ -302,7 +347,7 @@ public:
}
}
- void ProcessEvent(WorldObject* /*go*/, uint32 eventId)
+ void ProcessEvent(WorldObject* /*go*/, uint32 eventId) OVERRIDE
{
switch (eventId)
{
@@ -348,7 +393,7 @@ public:
}
}
}
- events.ScheduleEvent(EVENT_NEXT_WAVE, 10000);
+ events.ScheduleEvent(EVENT_NEXT_WAVE, 5000);
break;
case EVENT_ADD_WAVE:
DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 1);
@@ -364,7 +409,7 @@ public:
{
temp->CastSpell(temp, SPELL_SPIRIT_ACTIVATE, true);
temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC|UNIT_FLAG_NOT_SELECTABLE);
- temp->AI()->DoZoneInCombat();
+ temp->AI()->DoZoneInCombat(temp, 100.00f);
}
}
}
@@ -374,13 +419,12 @@ public:
if (GetBossState(DATA_FALRIC_EVENT + bossIndex) != DONE)
{
if (Creature* boss = instance->GetCreature(bossIndex ? _marwynGUID : _falricGUID))
- if (boss->AI())
- boss->AI()->DoAction(ACTION_ENTER_COMBAT);
+ boss->AI()->DoAction(ACTION_ENTER_COMBAT);
}
else if (_waveCount != 10)
{
++_waveCount;
- events.ScheduleEvent(EVENT_NEXT_WAVE, 10000);
+ events.ScheduleEvent(EVENT_NEXT_WAVE, 5000);
}
}
break;
@@ -395,14 +439,12 @@ public:
falric->SetVisible(false);
if (Creature* marwyn = instance->GetCreature(_marwynGUID))
marwyn->SetVisible(false);
-
//despawn wave npcs
for (uint8 i = 0; i < 8; ++i)
{
for (std::set<uint64>::const_iterator itr = waveGuidList[i].begin(); itr != waveGuidList[i].end(); ++itr)
if (Creature* creature = instance->GetCreature(*itr))
creature->DespawnOrUnsummon(1);
-
waveGuidList[i].clear();
}
break;
@@ -421,6 +463,10 @@ public:
return _introEvent;
case DATA_FROSWORN_EVENT:
return _frostwornGeneral;
+ case DATA_ESCAPE_EVENT:
+ return _escapeevent;
+ case DATA_SUMMONS:
+ return _mobsaticewall;
default:
break;
}
@@ -442,6 +488,10 @@ public:
return _frostwornDoorGUID;
case DATA_FROSTMOURNE:
return _frostmourneGUID;
+ case DATA_ESCAPE_LEADER:
+ return _jainaOrSylvanasPart2GUID;
+ case DATA_CAVE_IN:
+ return _caveGUID;
default:
break;
}
@@ -449,18 +499,18 @@ public:
return 0;
}
- std::string GetSaveData()
+ std::string GetSaveData() OVERRIDE
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
- saveStream << "H R " << GetBossSaveData() << _introEvent << ' ' << _frostwornGeneral;
+ saveStream << "H R " << GetBossSaveData() << _introEvent << ' ' << _frostwornGeneral << _escapeevent;
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
- void Load(char const* in)
+ void Load(char const* in) OVERRIDE
{
if (!in)
{
@@ -499,6 +549,12 @@ public:
SetData(DATA_FROSWORN_EVENT, DONE);
else
SetData(DATA_FROSWORN_EVENT, NOT_STARTED);
+
+ loadStream >> temp;
+ if (temp == DONE)
+ SetData(DATA_ESCAPE_EVENT, DONE);
+ else
+ SetData(DATA_ESCAPE_EVENT, NOT_STARTED);
}
else
OUT_LOAD_INST_DATA_FAIL;
@@ -510,6 +566,8 @@ public:
uint64 _falricGUID;
uint64 _marwynGUID;
uint64 _jainaOrSylvanasPart1GUID;
+ uint64 _jainaOrSylvanasPart2GUID;
+ uint64 _lichkingPart1GUID;
uint64 _frostwornGeneralGUID;
uint64 _frostmourneGUID;
@@ -517,11 +575,14 @@ public:
uint64 _frostwornDoorGUID;
uint64 _arthasDoorGUID;
uint64 _escapeDoorGUID;
+ uint64 _caveGUID;
uint32 _teamInInstance;
uint32 _waveCount;
uint32 _introEvent;
uint32 _frostwornGeneral;
+ uint32 _escapeevent;
+ uint32 _mobsaticewall;
EventMap events;
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
index 45e0855bb4f..928ffd14dea 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
@@ -19,24 +19,21 @@
#include "ScriptedCreature.h"
#include "naxxramas.h"
-enum Anubrekhan
+enum Says
{
SAY_AGGRO = 0,
SAY_GREET = 1,
- SAY_SLAY = 2,
-
- NPC_CRYPT_GUARD = 16573
+ SAY_SLAY = 2
};
-const Position GuardSummonPos = {3333.72f, -3476.30f, 287.1f, 6.2801f};
+Position const GuardSummonPos = {3333.72f, -3476.30f, 287.1f, 6.2801f};
enum Events
{
- EVENT_NONE,
- EVENT_IMPALE,
+ EVENT_IMPALE = 1,
EVENT_LOCUST,
EVENT_SPAWN_GUARDIAN_NORMAL,
- EVENT_BERSERK,
+ EVENT_BERSERK
};
enum Spells
@@ -47,12 +44,12 @@ enum Spells
SPELL_LOCUST_SWARM_25 = 54021,
SPELL_SUMMON_CORPSE_SCARABS_PLR = 29105, // This spawns 5 corpse scarabs on top of player
SPELL_SUMMON_CORPSE_SCARABS_MOB = 28864, // This spawns 10 corpse scarabs on top of dead guards
- SPELL_BERSERK = 27680,
+ SPELL_BERSERK = 27680
};
-enum
+enum Misc
{
- ACHIEV_TIMED_START_EVENT = 9891,
+ ACHIEV_TIMED_START_EVENT = 9891
};
class boss_anubrekhan : public CreatureScript
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
index 935d29ff783..bf3e7706f4d 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
@@ -25,7 +25,7 @@ enum Spells
H_SPELL_HATEFUL_STRIKE = 59192,
SPELL_FRENZY = 28131,
SPELL_BERSERK = 26662,
- SPELL_SLIME_BOLT = 32309,
+ SPELL_SLIME_BOLT = 32309
};
enum Yells
@@ -45,9 +45,9 @@ enum Events
EVENT_SLIME
};
-enum
+enum Misc
{
- ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT = 10286,
+ ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT = 10286
};
class boss_patchwerk : public CreatureScript
diff --git a/src/server/scripts/Northrend/Naxxramas/naxxramas.h b/src/server/scripts/Northrend/Naxxramas/naxxramas.h
index 10b26e278bb..a71d573bf20 100644
--- a/src/server/scripts/Northrend/Naxxramas/naxxramas.h
+++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.h
@@ -84,6 +84,7 @@ enum CreaturesIds
NPC_STALAGG = 15929,
NPC_SAPPHIRON = 15989,
NPC_KEL_THUZAD = 15990,
+ NPC_CRYPT_GUARD = 16573,
NPC_NAXXRAMAS_FOLLOWER = 16505,
NPC_FOLLOWER_WORSHIPPER = 16506,
NPC_DK_UNDERSTUDY = 16803
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
index e6969d1f519..fd15cd19b37 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
@@ -535,13 +535,13 @@ class spell_oculus_touch_the_nightmare : public SpellScriptLoader
SetHitDamage(int32(GetCaster()->CountPctFromMaxHealth(30)));
}
- void Register()
+ void Register() OVERRIDE
{
OnEffectHitTarget += SpellEffectFn(spell_oculus_touch_the_nightmare_SpellScript::HandleDamageCalc, EFFECT_2, SPELL_EFFECT_SCHOOL_DAMAGE);
}
};
- SpellScript* GetSpellScript() const
+ SpellScript* GetSpellScript() const OVERRIDE
{
return new spell_oculus_touch_the_nightmare_SpellScript();
}
@@ -564,14 +564,14 @@ class spell_oculus_dream_funnel: public SpellScriptLoader
canBeRecalculated = false;
}
- void Register()
+ void Register() OVERRIDE
{
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_oculus_dream_funnel_AuraScript::HandleEffectCalcAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL);
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_oculus_dream_funnel_AuraScript::HandleEffectCalcAmount, EFFECT_2, SPELL_AURA_PERIODIC_DAMAGE);
}
};
- AuraScript* GetAuraScript() const
+ AuraScript* GetAuraScript() const OVERRIDE
{
return new spell_oculus_dream_funnel_AuraScript();
}
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
index d8578b31abb..45c35741c3c 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
@@ -432,11 +432,10 @@ class spell_ignis_slag_pot : public SpellScriptLoader
{
PrepareAuraScript(spell_ignis_slag_pot_AuraScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
- if (!sSpellMgr->GetSpellInfo(SPELL_SLAG_POT_DAMAGE))
- return false;
- if (!sSpellMgr->GetSpellInfo(SPELL_SLAG_IMBUED))
+ if (!sSpellMgr->GetSpellInfo(SPELL_SLAG_POT_DAMAGE)
+ || !sSpellMgr->GetSpellInfo(SPELL_SLAG_IMBUED))
return false;
return true;
}
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
index 9c086d8bd81..fa28695ff62 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
@@ -163,6 +163,7 @@ enum TickingTimeBomb
{
SPELL_TICKING_TIME_BOMB_EXPLODE = 59687
};
+
class spell_ticking_time_bomb : public SpellScriptLoader
{
public:
@@ -172,9 +173,11 @@ class spell_ticking_time_bomb : public SpellScriptLoader
{
PrepareAuraScript(spell_ticking_time_bomb_AuraScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
- return (bool) sSpellMgr->GetSpellInfo(SPELL_TICKING_TIME_BOMB_EXPLODE);
+ if (!sSpellMgr->GetSpellInfo(SPELL_TICKING_TIME_BOMB_EXPLODE))
+ return false;
+ return true;
}
void HandleOnEffectRemove(AuraEffect const* /* aurEff */, AuraEffectHandleModes /* mode */)
@@ -210,9 +213,11 @@ class spell_fixate : public SpellScriptLoader
{
PrepareSpellScript(spell_fixate_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
- return (bool) sSpellMgr->GetSpellInfo(SPELL_FIXATE_TRIGGER);
+ if (!sSpellMgr->GetSpellInfo(SPELL_FIXATE_TRIGGER))
+ return false;
+ return true;
}
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp
index 60ae487daa7..5e9a19685bc 100644
--- a/src/server/scripts/Northrend/zone_zuldrak.cpp
+++ b/src/server/scripts/Northrend/zone_zuldrak.cpp
@@ -1609,7 +1609,7 @@ class spell_random_ingredient_aura : public SpellScriptLoader
{
PrepareAuraScript(spell_random_ingredient_aura_AuraScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_RANDOM_INGREDIENT_EASY) || !sSpellMgr->GetSpellInfo(SPELL_RANDOM_INGREDIENT_MEDIUM) || !sSpellMgr->GetSpellInfo(SPELL_RANDOM_INGREDIENT_HARD))
return false;
@@ -1656,7 +1656,7 @@ class spell_random_ingredient : public SpellScriptLoader
{
PrepareSpellScript(spell_random_ingredient_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_FETCH_KNOTROOT) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_PICKLED_EAGLE_EGG) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_SPECKLED_GUANO) ||
!sSpellMgr->GetSpellInfo(SPELL_FETCH_WITHERED_BATWING) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_SEASONED_SLIDER_CIDER) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_PULVERIZED_GARGOYLE_TEETH) ||
@@ -1720,7 +1720,7 @@ class spell_pot_check : public SpellScriptLoader
{
PrepareSpellScript(spell_pot_check_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_FETCH_KNOTROOT) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_PICKLED_EAGLE_EGG) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_SPECKLED_GUANO) ||
!sSpellMgr->GetSpellInfo(SPELL_FETCH_WITHERED_BATWING) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_SEASONED_SLIDER_CIDER) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_PULVERIZED_GARGOYLE_TEETH) ||
diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp
index 6c0d653f213..83c0cbf04d5 100644
--- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp
@@ -365,9 +365,65 @@ public:
};
+enum Yor
+{
+ SPELL_DOUBLE_BREATH = 38361,
+ EVENT_DOUBLE_BREATH = 1
+};
+
+class npc_yor : public CreatureScript
+{
+public:
+ npc_yor() : CreatureScript("npc_yor") { }
+
+ struct npc_yorAI : public ScriptedAI
+ {
+ npc_yorAI(Creature* creature) : ScriptedAI(creature) {}
+
+ void Reset() OVERRIDE {}
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ events.ScheduleEvent(EVENT_DOUBLE_BREATH, urand(6000,9000));
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_DOUBLE_BREATH:
+ if (me->IsWithinDist(me->GetVictim(), ATTACK_DISTANCE))
+ DoCastVictim(SPELL_DOUBLE_BREATH);
+ events.ScheduleEvent(EVENT_DOUBLE_BREATH, urand(6000,9000));
+ break;
+ default:
+ break;
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ EventMap events;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_yorAI(creature);
+ }
+};
+
void AddSC_boss_nexusprince_shaffar()
{
new boss_nexusprince_shaffar();
new npc_ethereal_beacon();
new npc_ethereal_apprentice();
+ new npc_yor();
}
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp
new file mode 100644
index 00000000000..707f6c34a90
--- /dev/null
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+Name: Boss_Anzu
+%Complete: 80%
+Comment:
+Category: Auchindoun, Sethekk Halls
+*/
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "sethekk_halls.h"
+
+enum Says
+{
+ SAY_SUMMON_BROOD = 0,
+ SAY_SPELL_BOMB = 1
+};
+
+enum Spells
+{
+ SPELL_PARALYZING_SCREECH = 40184,
+ SPELL_SPELL_BOMB = 40303,
+ SPELL_CYCLONE_OF_FEATHERS = 40321,
+ SPELL_BANISH_SELF = 42354,
+ SPELL_FLESH_RIP = 40199
+};
+
+enum Events
+{
+ EVENT_PARALYZING_SCREECH = 1,
+ EVENT_SPELL_BOMB = 2,
+ EVENT_CYCLONE_OF_FEATHERS = 3,
+ EVENT_SUMMON = 4
+};
+
+Position const PosSummonBrood[7] =
+{
+ { -118.1717f, 284.5299f, 121.2287f, 2.775074f },
+ { -98.15528f, 293.4469f, 109.2385f, 0.174533f },
+ { -99.70160f, 270.1699f, 98.27389f, 6.178465f },
+ { -69.25543f, 303.0768f, 97.84479f, 5.532694f },
+ { -87.59662f, 263.5181f, 92.70478f, 1.658063f },
+ { -73.54323f, 276.6267f, 94.25807f, 2.802979f },
+ { -81.70527f, 280.8776f, 44.58830f, 0.526849f },
+};
+
+class boss_anzu : public CreatureScript
+{
+public:
+ boss_anzu() : CreatureScript("boss_anzu") { }
+
+ struct boss_anzuAI : public BossAI
+ {
+ boss_anzuAI(Creature* creature) : BossAI(creature, DATA_ANZU) { }
+
+ void Reset() OVERRIDE
+ {
+ summon66 = false;
+ summon33 = false;
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ events.ScheduleEvent(EVENT_PARALYZING_SCREECH, 14000);
+ events.ScheduleEvent(EVENT_CYCLONE_OF_FEATHERS, 5000);
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ if (instance)
+ instance->SetData(DATA_ANZU, DONE);
+ }
+
+ void KilledUnit(Unit* /*victim*/) OVERRIDE {}
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_PARALYZING_SCREECH:
+ DoCastVictim(SPELL_PARALYZING_SCREECH);
+ events.ScheduleEvent(EVENT_PARALYZING_SCREECH, 26000);
+ break;
+
+ case EVENT_CYCLONE_OF_FEATHERS:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_CYCLONE_OF_FEATHERS);
+ events.ScheduleEvent(EVENT_CYCLONE_OF_FEATHERS, 21000);
+ break;
+ case EVENT_SUMMON:
+ // TODO: Add pathing for Brood of Anzu
+ me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000);
+ me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[1], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000);
+ me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[2], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000);
+ me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[3], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000);
+ me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[4], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000);
+ me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[5], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000);
+ me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[6], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46000);
+ DoCast(me, SPELL_BANISH_SELF);
+ events.ScheduleEvent(EVENT_SPELL_BOMB, 12000);
+ break;
+ case EVENT_SPELL_BOMB:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ {
+ if (target->getPowerType() == POWER_MANA)
+ {
+ DoCast(target, SPELL_SPELL_BOMB);
+ Talk(SAY_SPELL_BOMB, target->GetGUID());
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (HealthBelowPct(66) && !summon66)
+ {
+ summon66 = true;
+ Talk(SAY_SUMMON_BROOD);
+ events.ScheduleEvent(EVENT_SUMMON, 3000);
+ }
+
+ if (HealthBelowPct(33) && !summon33)
+ {
+ summon33 = true;
+ Talk(SAY_SUMMON_BROOD);
+ events.ScheduleEvent(EVENT_SUMMON, 3000);
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ bool summon66;
+ bool summon33;
+
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_anzuAI(creature);
+ }
+};
+
+void AddSC_boss_anzu()
+{
+ new boss_anzu();
+}
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp
index 7a486876b3f..782db325496 100644
--- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp
@@ -25,14 +25,18 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "sethekk_halls.h"
-enum DarkweaverSyth
+enum Says
{
SAY_SUMMON = 0,
SAY_AGGRO = 1,
SAY_SLAY = 2,
- SAY_DEATH = 3,
+ SAY_DEATH = 3
+};
+enum Spells
+{
SPELL_FROST_SHOCK = 21401, //37865
SPELL_FLAME_SHOCK = 34354,
SPELL_SHADOW_SHOCK = 30138,
@@ -51,40 +55,26 @@ enum DarkweaverSyth
SPELL_SHADOW_BUFFET = 33529
};
+enum Events
+{
+ EVENT_FLAME_SHOCK = 1,
+ EVENT_ARCANE_SHOCK = 2,
+ EVENT_FROST_SHOCK = 3,
+ EVENT_SHADOW_SHOCK = 4,
+ EVENT_CHAIN_LIGHTNING = 5
+};
+
class boss_darkweaver_syth : public CreatureScript
{
public:
boss_darkweaver_syth() : CreatureScript("boss_darkweaver_syth") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_darkweaver_sythAI(creature);
- }
-
- struct boss_darkweaver_sythAI : public ScriptedAI
+ struct boss_darkweaver_sythAI : public BossAI
{
- boss_darkweaver_sythAI(Creature* creature) : ScriptedAI(creature)
- {
- }
-
- uint32 flameshock_timer;
- uint32 arcaneshock_timer;
- uint32 frostshock_timer;
- uint32 shadowshock_timer;
- uint32 chainlightning_timer;
-
- bool summon90;
- bool summon50;
- bool summon10;
+ boss_darkweaver_sythAI(Creature* creature) : BossAI(creature, DATA_DARKWEAVER_SYTH) { }
void Reset() OVERRIDE
{
- flameshock_timer = 2000;
- arcaneshock_timer = 4000;
- frostshock_timer = 6000;
- shadowshock_timer = 8000;
- chainlightning_timer = 15000;
-
summon90 = false;
summon50 = false;
summon10 = false;
@@ -92,12 +82,21 @@ public:
void EnterCombat(Unit* /*who*/) OVERRIDE
{
+ events.ScheduleEvent(EVENT_FLAME_SHOCK, 2000);
+ events.ScheduleEvent(EVENT_ARCANE_SHOCK, 4000);
+ events.ScheduleEvent(EVENT_FROST_SHOCK, 6000);
+ events.ScheduleEvent(EVENT_SHADOW_SHOCK, 8000);
+ events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 15000);
+
Talk(SAY_AGGRO);
}
void JustDied(Unit* /*killer*/) OVERRIDE
{
Talk(SAY_DEATH);
+
+ if (instance)
+ instance->SetData(DATA_DARKWEAVER_SYTH, DONE);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
@@ -132,6 +131,42 @@ public:
if (!UpdateVictim())
return;
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_FLAME_SHOCK:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_FLAME_SHOCK);
+ events.ScheduleEvent(EVENT_FLAME_SHOCK, urand(10000, 15000));
+ break;
+ case EVENT_ARCANE_SHOCK:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_ARCANE_SHOCK);
+ events.ScheduleEvent(EVENT_ARCANE_SHOCK, urand(10000, 15000));
+ break;
+ case EVENT_FROST_SHOCK:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_FROST_SHOCK);
+ events.ScheduleEvent(EVENT_FROST_SHOCK, urand(10000, 15000));
+ break;
+ case EVENT_SHADOW_SHOCK:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_SHADOW_SHOCK);
+ events.ScheduleEvent(EVENT_SHADOW_SHOCK, urand(10000, 15000));
+ break;
+ case EVENT_CHAIN_LIGHTNING:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_CHAIN_LIGHTNING);
+ events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 25000);
+ break;
+ default:
+ break;
+ }
+ }
+
if (HealthBelowPct(90) && !summon90)
{
SythSummoning();
@@ -150,50 +185,19 @@ public:
summon10 = true;
}
- if (flameshock_timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_FLAME_SHOCK);
-
- flameshock_timer = urand(10000, 15000);
- } else flameshock_timer -= diff;
-
- if (arcaneshock_timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_ARCANE_SHOCK);
-
- arcaneshock_timer = urand(10000, 15000);
- } else arcaneshock_timer -= diff;
-
- if (frostshock_timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_FROST_SHOCK);
-
- frostshock_timer = urand(10000, 15000);
- } else frostshock_timer -= diff;
-
- if (shadowshock_timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_SHADOW_SHOCK);
-
- shadowshock_timer = urand(10000, 15000);
- } else shadowshock_timer -= diff;
-
- if (chainlightning_timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_CHAIN_LIGHTNING);
-
- chainlightning_timer = 25000;
- } else chainlightning_timer -= diff;
-
DoMeleeAttackIfReady();
}
+
+ private:
+ bool summon90;
+ bool summon50;
+ bool summon10;
};
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_darkweaver_sythAI(creature);
+ }
};
/* ELEMENTALS */
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp
index 4123da48ba6..9d3aa623011 100644
--- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp
@@ -27,14 +27,17 @@ EndScriptData */
#include "ScriptedCreature.h"
#include "sethekk_halls.h"
-enum TailonkingIkiss
+enum Says
{
SAY_INTRO = 0,
SAY_AGGRO = 1,
SAY_SLAY = 2,
SAY_DEATH = 3,
- EMOTE_ARCANE_EXP = 4,
+ EMOTE_ARCANE_EXP = 4
+};
+enum Spells
+{
SPELL_BLINK = 38194,
SPELL_BLINK_TELEPORT = 38203,
SPELL_MANA_SHIELD = 38151,
@@ -53,28 +56,9 @@ class boss_talon_king_ikiss : public CreatureScript
public:
boss_talon_king_ikiss() : CreatureScript("boss_talon_king_ikiss") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ struct boss_talon_king_ikissAI : public BossAI
{
- return new boss_talon_king_ikissAI(creature);
- }
-
- struct boss_talon_king_ikissAI : public ScriptedAI
- {
- boss_talon_king_ikissAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
-
- uint32 ArcaneVolley_Timer;
- uint32 Sheep_Timer;
- uint32 Blink_Timer;
- uint32 Slow_Timer;
-
- bool ManaShield;
- bool Blink;
- bool Intro;
+ boss_talon_king_ikissAI(Creature* creature) : BossAI(creature, DATA_TALON_KING_IKISS) { }
void Reset() OVERRIDE
{
@@ -120,7 +104,7 @@ public:
Talk(SAY_DEATH);
if (instance)
- instance->SetData(DATA_IKISSDOOREVENT, DONE);
+ instance->SetData(DATA_TALON_KING_IKISS, DONE);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
@@ -204,8 +188,22 @@ public:
if (!Blink)
DoMeleeAttackIfReady();
}
+
+ private:
+ uint32 ArcaneVolley_Timer;
+ uint32 Sheep_Timer;
+ uint32 Blink_Timer;
+ uint32 Slow_Timer;
+
+ bool ManaShield;
+ bool Blink;
+ bool Intro;
};
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_talon_king_ikissAI(creature);
+ }
};
void AddSC_boss_talon_king_ikiss()
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
index d44789f4c39..67f4dc1423a 100644
--- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
@@ -27,16 +27,6 @@ EndScriptData */
#include "InstanceScript.h"
#include "sethekk_halls.h"
-enum Creatures
-{
- NPC_ANZU = 23035
-};
-
-enum GameObjects
-{
- GO_IKISS_DOOR = 177203
-};
-
class instance_sethekk_halls : public InstanceMapScript
{
public:
@@ -49,49 +39,102 @@ public:
struct instance_sethekk_halls_InstanceMapScript : public InstanceScript
{
- instance_sethekk_halls_InstanceMapScript(Map* map) : InstanceScript(map) {}
-
- uint32 AnzuEncounter;
- uint64 m_uiIkissDoorGUID;
+ instance_sethekk_halls_InstanceMapScript(Map* map) : InstanceScript(map)
+ {
+ SetBossNumber(EncounterCount);
+ }
void Initialize()
{
- AnzuEncounter = NOT_STARTED;
- m_uiIkissDoorGUID = 0;
+ SetBossState(DATA_ANZU, NOT_STARTED);
+ iIkissDoorGUID = 0;
}
void OnCreatureCreate(Creature* creature)
{
if (creature->GetEntry() == NPC_ANZU)
{
- if (AnzuEncounter >= IN_PROGRESS)
+ if (GetBossState(DATA_ANZU) == DONE)
creature->DisappearAndDie();
else
- AnzuEncounter = IN_PROGRESS;
+ SetBossState(DATA_ANZU, IN_PROGRESS);
}
}
void OnGameObjectCreate(GameObject* go)
{
if (go->GetEntry() == GO_IKISS_DOOR)
- m_uiIkissDoorGUID = go->GetGUID();
+ iIkissDoorGUID = go->GetGUID();
}
- void SetData(uint32 type, uint32 data) OVERRIDE
+ bool SetBossState(uint32 type, EncounterState state)
{
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
switch (type)
{
- case DATA_IKISSDOOREVENT:
- if (data == DONE)
- DoUseDoorOrButton(m_uiIkissDoorGUID, DAY*IN_MILLISECONDS);
+ case DATA_DARKWEAVER_SYTH:
+ break;
+ case DATA_TALON_KING_IKISS:
+ if (state == DONE)
+ DoUseDoorOrButton(iIkissDoorGUID, DAY*IN_MILLISECONDS);
+ break;
+ case DATA_ANZU:
break;
- case TYPE_ANZU_ENCOUNTER:
- AnzuEncounter = data;
+ default:
break;
}
+
+ return true;
}
- };
+ std::string GetSaveData()
+ {
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << "S H " << GetBossSaveData();
+
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
+
+ void Load(const char* str)
+ {
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
+
+ OUT_LOAD_INST_DATA(str);
+
+ char dataHead1, dataHead2;
+
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
+
+ if (dataHead1 == 'S' && dataHead2 == 'H')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
+
+ protected:
+ uint64 iIkissDoorGUID;
+ };
};
void AddSC_instance_sethekk_halls()
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h b/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h
index 15ffda4ada9..86789e9982f 100644
--- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -19,10 +18,24 @@
#ifndef DEF_SETHEKK_HALLS_H
#define DEF_SETHEKK_HALLS_H
+uint32 const EncounterCount = 3;
+
enum DataTypes
{
- DATA_IKISSDOOREVENT = 1,
- TYPE_ANZU_ENCOUNTER = 2,
+ DATA_DARKWEAVER_SYTH = 0,
+ DATA_TALON_KING_IKISS = 1,
+ DATA_ANZU = 2
+};
+
+enum CreatureIds
+{
+ NPC_ANZU = 23035,
+ NPC_BROOD_OF_ANZU = 23132
};
-#endif
+enum GameObjectIds
+{
+ GO_IKISS_DOOR = 177203
+};
+
+#endif
diff --git a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp
index 3d7a143d59e..290641437f3 100644
--- a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp
+++ b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp
@@ -903,7 +903,7 @@ public:
{
PrepareAuraScript(spell_boss_lady_malande_shield_AuraScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
return sSpellMgr->GetSpellInfo(SPELL_REFLECTIVE_SHIELD_T);
}
diff --git a/src/server/scripts/Outland/CMakeLists.txt b/src/server/scripts/Outland/CMakeLists.txt
index f038af07634..d7b863da0db 100644
--- a/src/server/scripts/Outland/CMakeLists.txt
+++ b/src/server/scripts/Outland/CMakeLists.txt
@@ -76,6 +76,7 @@ set(scripts_STAT_SRCS
Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp
Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp
Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp
+ Outland/Auchindoun/SethekkHalls/boss_anzu.cpp
Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
Outland/Auchindoun/SethekkHalls/sethekk_halls.h
Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp
index 597cccda102..3c8627c7058 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp
@@ -519,7 +519,7 @@ class spell_astromancer_wrath_of_the_astromancer : public SpellScriptLoader
{
PrepareAuraScript(spell_astromancer_wrath_of_the_astromancer_AuraScript);
- bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_WRATH_OF_THE_ASTROMANCER_DOT))
return false;
diff --git a/src/server/scripts/Outland/zone_netherstorm.cpp b/src/server/scripts/Outland/zone_netherstorm.cpp
index 7c419243c20..7e99275adbd 100644
--- a/src/server/scripts/Outland/zone_netherstorm.cpp
+++ b/src/server/scripts/Outland/zone_netherstorm.cpp
@@ -936,10 +936,10 @@ public:
## npc_maxx_a_million
######*/
-enum
+enum MaxxAMillion
{
- QUEST_MARK_V_IS_ALIVE = 10191,
- GO_DRAENEI_MACHINE = 183771
+ QUEST_MARK_V_IS_ALIVE = 10191,
+ GO_DRAENEI_MACHINE = 183771
};
class npc_maxx_a_million_escort : public CreatureScript
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 2e6594714c9..98ed2c8b331 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -619,7 +619,7 @@ class spell_gen_cannibalize : public SpellScriptLoader
{
PrepareSpellScript(spell_gen_cannibalize_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_CANNIBALIZE_TRIGGERED))
return false;
@@ -672,7 +672,7 @@ class spell_gen_chaos_blast : public SpellScriptLoader
{
PrepareSpellScript(spell_gen_chaos_blast_SpellScript)
- bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_CHAOS_BLAST))
return false;
@@ -779,7 +779,7 @@ class spell_gen_clone_weapon_aura : public SpellScriptLoader
uint32 prevItem;
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_AURA) ||
!sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_2_AURA) ||
@@ -1021,9 +1021,10 @@ class spell_gen_dalaran_disguise : public SpellScriptLoader
class spell_gen_dalaran_disguise_SpellScript : public SpellScript
{
PrepareSpellScript(spell_gen_dalaran_disguise_SpellScript);
- bool Validate(SpellInfo const* spellEntry) OVERRIDE
+
+ bool Validate(SpellInfo const* spellInfo) OVERRIDE
{
- switch (spellEntry->Id)
+ switch (spellInfo->Id)
{
case SPELL_SUNREAVER_DISGUISE_TRIGGER:
if (!sSpellMgr->GetSpellInfo(SPELL_SUNREAVER_DISGUISE_FEMALE) ||
@@ -1093,7 +1094,7 @@ class spell_gen_damage_reduction_aura : public SpellScriptLoader
{
PrepareAuraScript(spell_gen_damage_reduction_AuraScript);
- bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_DAMAGE_REDUCTION_AURA))
return false;
@@ -1148,7 +1149,7 @@ class spell_gen_defend : public SpellScriptLoader
{
PrepareAuraScript(spell_gen_defend_AuraScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_1))
return false;
@@ -1270,7 +1271,7 @@ class spell_gen_divine_storm_cd_reset : public SpellScriptLoader
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_DIVINE_STORM))
return false;
@@ -1348,7 +1349,7 @@ class spell_gen_dummy_trigger : public SpellScriptLoader
{
PrepareSpellScript(spell_gen_dummy_trigger_SpellScript);
- bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_PERSISTANT_SHIELD_TRIGGERED) ||
!sSpellMgr->GetSpellInfo(SPELL_PERSISTANT_SHIELD))
@@ -1441,7 +1442,7 @@ class spell_gen_elune_candle : public SpellScriptLoader
class spell_gen_elune_candle_SpellScript : public SpellScript
{
PrepareSpellScript(spell_gen_elune_candle_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_HEAD) ||
!sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_CHEST) ||
@@ -1508,7 +1509,7 @@ class spell_gen_gadgetzan_transporter_backfire : public SpellScriptLoader
{
PrepareSpellScript(spell_gen_gadgetzan_transporter_backfire_SpellScript)
- bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_MALFUNCTION_POLYMORPH) ||
!sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_EVIL_TWIN) ||
@@ -1609,7 +1610,7 @@ class spell_gen_gnomish_transporter : public SpellScriptLoader
{
PrepareSpellScript(spell_gen_gnomish_transporter_SpellScript)
- bool Validate(SpellInfo const* /*SpellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_SUCCESS) ||
!sSpellMgr->GetSpellInfo(SPELL_TRANSPORTER_FAILURE))
@@ -3204,7 +3205,7 @@ class spell_gen_summon_tournament_mount : public SpellScriptLoader
{
PrepareSpellScript(spell_gen_summon_tournament_mount_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_LANCE_EQUIPPED))
return false;
@@ -3253,7 +3254,7 @@ class spell_gen_tournament_duel : public SpellScriptLoader
{
PrepareSpellScript(spell_gen_tournament_duel_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_ON_TOURNAMENT_MOUNT) ||
!sSpellMgr->GetSpellInfo(SPELL_MOUNTED_DUEL))
@@ -3345,7 +3346,7 @@ class spell_pvp_trinket_wotf_shared_cd : public SpellScriptLoader
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER) ||
!sSpellMgr->GetSpellInfo(SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER_WOTF))
diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp
index 09be427d330..9f7386ab7e6 100644
--- a/src/server/scripts/Spells/spell_item.cpp
+++ b/src/server/scripts/Spells/spell_item.cpp
@@ -47,7 +47,7 @@ class spell_item_trigger_spell : public SpellScriptLoader
public:
spell_item_trigger_spell_SpellScript(uint32 triggeredSpellId) : SpellScript(), _triggeredSpellId(triggeredSpellId) { }
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(_triggeredSpellId))
return false;
@@ -322,7 +322,7 @@ class spell_item_deviate_fish : public SpellScriptLoader
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
for (uint32 spellId = SPELL_SLEEPY; spellId <= SPELL_HEALTHY_SPIRIT; ++spellId)
if (!sSpellMgr->GetSpellInfo(spellId))
@@ -367,7 +367,7 @@ class spell_item_flask_of_the_north : public SpellScriptLoader
{
PrepareSpellScript(spell_item_flask_of_the_north_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_FLASK_OF_THE_NORTH_SP) || !sSpellMgr->GetSpellInfo(SPELL_FLASK_OF_THE_NORTH_AP) || !sSpellMgr->GetSpellInfo(SPELL_FLASK_OF_THE_NORTH_STR))
return false;
@@ -436,7 +436,7 @@ class spell_item_gnomish_death_ray : public SpellScriptLoader
{
PrepareSpellScript(spell_item_gnomish_death_ray_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_GNOMISH_DEATH_RAY_SELF) || !sSpellMgr->GetSpellInfo(SPELL_GNOMISH_DEATH_RAY_TARGET))
return false;
@@ -492,7 +492,7 @@ class spell_item_make_a_wish : public SpellScriptLoader
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_MR_PINCHYS_BLESSING) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_MIGHTY_MR_PINCHY) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_FURIOUS_MR_PINCHY) || !sSpellMgr->GetSpellInfo(SPELL_TINY_MAGICAL_CRAWDAD) || !sSpellMgr->GetSpellInfo(SPELL_MR_PINCHYS_GIFT))
return false;
@@ -646,7 +646,7 @@ class spell_item_net_o_matic : public SpellScriptLoader
{
PrepareSpellScript(spell_item_net_o_matic_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_NET_O_MATIC_TRIGGERED1) || !sSpellMgr->GetSpellInfo(SPELL_NET_O_MATIC_TRIGGERED2) || !sSpellMgr->GetSpellInfo(SPELL_NET_O_MATIC_TRIGGERED3))
return false;
@@ -703,7 +703,7 @@ class spell_item_noggenfogger_elixir : public SpellScriptLoader
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED1) || !sSpellMgr->GetSpellInfo(SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED2) || !sSpellMgr->GetSpellInfo(SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED3))
return false;
@@ -788,7 +788,7 @@ class spell_item_savory_deviate_delight : public SpellScriptLoader
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
for (uint32 spellId = SPELL_FLIP_OUT_MALE; spellId <= SPELL_YAAARRRR_FEMALE; ++spellId)
if (!sSpellMgr->GetSpellInfo(spellId))
@@ -1112,7 +1112,7 @@ class spell_item_six_demon_bag : public SpellScriptLoader
{
PrepareSpellScript(spell_item_six_demon_bag_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_FROSTBOLT) || !sSpellMgr->GetSpellInfo(SPELL_POLYMORPH) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_FELHOUND_MINION) || !sSpellMgr->GetSpellInfo(SPELL_FIREBALL) || !sSpellMgr->GetSpellInfo(SPELL_CHAIN_LIGHTNING) || !sSpellMgr->GetSpellInfo(SPELL_ENVELOPING_WINDS))
return false;
@@ -1213,7 +1213,7 @@ class spell_item_underbelly_elixir : public SpellScriptLoader
{
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_UNDERBELLY_ELIXIR_TRIGGERED1) || !sSpellMgr->GetSpellInfo(SPELL_UNDERBELLY_ELIXIR_TRIGGERED2) || !sSpellMgr->GetSpellInfo(SPELL_UNDERBELLY_ELIXIR_TRIGGERED3))
return false;
@@ -1491,7 +1491,7 @@ class spell_item_vanquished_clutches : public SpellScriptLoader
{
PrepareSpellScript(spell_item_vanquished_clutches_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/) OVERRIDE
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
{
if (!sSpellMgr->GetSpellInfo(SPELL_CRUSHER) || !sSpellMgr->GetSpellInfo(SPELL_CONSTRICTOR) || !sSpellMgr->GetSpellInfo(SPELL_CORRUPTOR))
return false;
diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp
index d87278cefc0..fcf87e9bfac 100644
--- a/src/server/scripts/Spells/spell_quest.cpp
+++ b/src/server/scripts/Spells/spell_quest.cpp
@@ -1785,6 +1785,96 @@ class spell_q12847_summon_soul_moveto_bunny : public SpellScriptLoader
}
};
+enum BearFlankMaster
+{
+ SPELL_BEAR_FLANK_MASTER = 56565,
+ SPELL_CREATE_BEAR_FLANK = 56566,
+ SPELL_BEAR_FLANK_FAIL = 56569
+};
+
+class spell_q13011_bear_flank_master : public SpellScriptLoader
+{
+ public:
+ spell_q13011_bear_flank_master() : SpellScriptLoader("spell_q13011_bear_flank_master") { }
+
+ class spell_q13011_bear_flank_master_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_q13011_bear_flank_master_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_BEAR_FLANK_MASTER) || !sSpellMgr->GetSpellInfo(SPELL_CREATE_BEAR_FLANK))
+ return false;
+ return true;
+ }
+
+ bool Load() OVERRIDE
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ bool failed = RAND(0, 1); // 50% chance
+ Creature* creature = GetCaster()->ToCreature();
+ if (Player* player = GetHitPlayer())
+ {
+ if (failed)
+ {
+ player->CastSpell(creature, SPELL_BEAR_FLANK_FAIL);
+ creature->AI()->Talk(0, player->GetGUID());
+ }
+ else
+ player->CastSpell(player, SPELL_CREATE_BEAR_FLANK);
+ }
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_q13011_bear_flank_master_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_q13011_bear_flank_master_SpellScript();
+ }
+};
+
+class spell_q13086_cannons_target : public SpellScriptLoader
+{
+ public:
+ spell_q13086_cannons_target() : SpellScriptLoader("spell_q13086_cannons_target") { }
+
+ class spell_q13086_cannons_target_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_q13086_cannons_target_SpellScript);
+
+ bool Validate(SpellInfo const* spellInfo) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].CalcValue()))
+ return false;
+ return true;
+ }
+
+ void HandleEffectDummy(SpellEffIndex /*effIndex*/)
+ {
+ if (WorldLocation const* pos = GetExplTargetDest())
+ GetCaster()->CastSpell(pos->GetPositionX(), pos->GetPositionY(), pos->GetPositionZ(), GetEffectValue(), true);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectHit += SpellEffectFn(spell_q13086_cannons_target_SpellScript::HandleEffectDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_q13086_cannons_target_SpellScript();
+ }
+};
+
void AddSC_quest_spell_scripts()
{
new spell_q55_sacred_cleansing();
@@ -1829,4 +1919,6 @@ void AddSC_quest_spell_scripts()
new spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy();
new spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon();
new spell_q12847_summon_soul_moveto_bunny();
+ new spell_q13011_bear_flank_master();
+ new spell_q13086_cannons_target();
}
diff --git a/src/server/scripts/World/achievement_scripts.cpp b/src/server/scripts/World/achievement_scripts.cpp
index 774c4e63071..94e448bd9bc 100644
--- a/src/server/scripts/World/achievement_scripts.cpp
+++ b/src/server/scripts/World/achievement_scripts.cpp
@@ -16,12 +16,8 @@
*/
#include "ScriptMgr.h"
-
-#include "BattlegroundAB.h"
-#include "BattlegroundWS.h"
-#include "BattlegroundIC.h"
#include "BattlegroundSA.h"
-#include "BattlegroundAV.h"
+#include "BattlegroundIC.h"
#include "Vehicle.h"
#include "Player.h"
#include "Creature.h"
@@ -31,19 +27,12 @@ class achievement_resilient_victory : public AchievementCriteriaScript
public:
achievement_resilient_victory() : AchievementCriteriaScript("achievement_resilient_victory") { }
- bool OnCheck(Player* source, Unit* /*target*/) OVERRIDE
+ bool OnCheck(Player* source, Unit* target) OVERRIDE
{
- Battleground* bg = source->GetBattleground();
- if (!bg)
- return false;
-
- if (bg->GetTypeID(true) != BATTLEGROUND_AB)
- return false;
-
- if (!static_cast<BattlegroundAB*>(bg)->IsTeamScores500Disadvantage(source->GetTeam()))
- return false;
+ if (Battleground* bg = source->GetBattleground())
+ return bg->CheckAchievementCriteriaMeet(BG_CRITERIA_CHECK_RESILIENT_VICTORY, source, target);
- return true;
+ return false;
}
};
@@ -54,14 +43,10 @@ class achievement_bg_control_all_nodes : public AchievementCriteriaScript
bool OnCheck(Player* source, Unit* /*target*/) OVERRIDE
{
- Battleground* bg = source->GetBattleground();
- if (!bg)
- return false;
-
- if (!bg->IsAllNodesConrolledByTeam(source->GetTeam()))
- return false;
+ if (Battleground* bg = source->GetBattleground())
+ return bg->IsAllNodesControlledByTeam(source->GetTeam());
- return true;
+ return false;
}
};
@@ -72,21 +57,9 @@ class achievement_save_the_day : public AchievementCriteriaScript
bool OnCheck(Player* source, Unit* target) OVERRIDE
{
- if (!target)
- return false;
-
- if (Player const* player = target->ToPlayer())
- {
- Battleground* bg = source->GetBattleground();
- if (!bg)
- return false;
+ if (Battleground* bg = source->GetBattleground())
+ return bg->CheckAchievementCriteriaMeet(BG_CRITERIA_CHECK_SAVE_THE_DAY, source, target);
- if (bg->GetTypeID(true) != BATTLEGROUND_WS)
- return false;
-
- if (static_cast<BattlegroundWS*>(bg)->GetFlagState(player->GetTeam()) == BG_WS_FLAG_STATE_ON_BASE)
- return true;
- }
return false;
}
};
@@ -200,17 +173,10 @@ class achievement_everything_counts : public AchievementCriteriaScript
public:
achievement_everything_counts() : AchievementCriteriaScript("achievement_everything_counts") { }
- bool OnCheck(Player* source, Unit* /*target*/) OVERRIDE
+ bool OnCheck(Player* source, Unit* target) OVERRIDE
{
- Battleground* bg = source->GetBattleground();
- if (!bg)
- return false;
-
- if (bg->GetTypeID(true) != BATTLEGROUND_AV)
- return false;
-
- if (static_cast<BattlegroundAV*>(bg)->IsBothMinesControlledByTeam(source->GetTeam()))
- return true;
+ if (Battleground* bg = source->GetBattleground())
+ return bg->CheckAchievementCriteriaMeet(BG_CRITERIA_CHECK_EVERYTHING_COUNTS, source, target);
return false;
}
@@ -221,17 +187,10 @@ class achievement_bg_av_perfection : public AchievementCriteriaScript
public:
achievement_bg_av_perfection() : AchievementCriteriaScript("achievement_bg_av_perfection") { }
- bool OnCheck(Player* source, Unit* /*target*/) OVERRIDE
+ bool OnCheck(Player* source, Unit* target) OVERRIDE
{
- Battleground* bg = source->GetBattleground();
- if (!bg)
- return false;
-
- if (bg->GetTypeID(true) != BATTLEGROUND_AV)
- return false;
-
- if (static_cast<BattlegroundAV*>(bg)->IsAllTowersControlledAndCaptainAlive(source->GetTeam()))
- return true;
+ if (Battleground* bg = source->GetBattleground())
+ return bg->CheckAchievementCriteriaMeet(BG_CRITERIA_CHECK_AV_PERFECTION, source, target);
return false;
}
@@ -240,24 +199,12 @@ class achievement_bg_av_perfection : public AchievementCriteriaScript
class achievement_bg_sa_defense_of_ancients : public AchievementCriteriaScript
{
public:
- achievement_bg_sa_defense_of_ancients() : AchievementCriteriaScript("achievement_bg_sa_defense_of_ancients")
- {
- }
+ achievement_bg_sa_defense_of_ancients() : AchievementCriteriaScript("achievement_bg_sa_defense_of_ancients") { }
- bool OnCheck(Player* player, Unit* /*target*/) OVERRIDE
+ bool OnCheck(Player* source, Unit* target) OVERRIDE
{
- if (!player)
- return false;
-
- Battleground* battleground = player->GetBattleground();
- if (!battleground)
- return false;
-
- if (player->GetTeamId() == static_cast<BattlegroundSA*>(battleground)->Attackers)
- return false;
-
- if (!static_cast<BattlegroundSA*>(battleground)->gateDestroyed)
- return true;
+ if (Battleground* bg = source->GetBattleground())
+ return bg->CheckAchievementCriteriaMeet(BG_CRITERIA_CHECK_DEFENSE_OF_THE_ANCIENTS, source, target);
return false;
}
@@ -299,17 +246,10 @@ class achievement_not_even_a_scratch : public AchievementCriteriaScript
public:
achievement_not_even_a_scratch() : AchievementCriteriaScript("achievement_not_even_a_scratch") { }
- bool OnCheck(Player* source, Unit* /*target*/) OVERRIDE
+ bool OnCheck(Player* source, Unit* target) OVERRIDE
{
- if (!source)
- return false;
-
- Battleground* battleground = source->GetBattleground();
- if (!battleground)
- return false;
-
- if (static_cast<BattlegroundSA*>(battleground)->notEvenAScratch(source->GetTeam()))
- return true;
+ if (Battleground* bg = source->GetBattleground())
+ return bg->CheckAchievementCriteriaMeet(BG_CRITERIA_CHECK_NOT_EVEN_A_SCRATCH, source, target);
return false;
}
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index 77bfb2956e8..f3d86c47b21 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -273,7 +273,7 @@ public:
## npc_lunaclaw_spirit
######*/
-enum
+enum LunaclawSpirit
{
QUEST_BODY_HEART_A = 6001,
QUEST_BODY_HEART_H = 6002,
diff --git a/src/server/shared/DataStores/DBCFileLoader.h b/src/server/shared/DataStores/DBCFileLoader.h
index 1756b635635..8605e6a7633 100644
--- a/src/server/shared/DataStores/DBCFileLoader.h
+++ b/src/server/shared/DataStores/DBCFileLoader.h
@@ -22,7 +22,7 @@
#include "Utilities/ByteConverter.h"
#include <cassert>
-enum
+enum DbcFieldFormat
{
FT_NA='x', //not used or unknown, 4 byte size
FT_NA_BYTE='X', //not used or unknown, byte