aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Outland/TempestKeep
diff options
context:
space:
mode:
authorclick <none@none>2010-06-07 00:54:06 +0200
committerclick <none@none>2010-06-07 00:54:06 +0200
commitdc510c9a143de1977daedea0aefb9589c01adde2 (patch)
tree6691fda7c0985077aeb6ff3a93e829447dddd736 /src/server/scripts/Outland/TempestKeep
parentded01bb23c3af75482d206f6ec52eec87009b238 (diff)
Some more consistency-renaming of script-zones
--HG-- branch : trunk rename : src/server/scripts/EasternKingdoms/alterac_valley/alterac_valley.cpp => src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp rename : src/server/scripts/EasternKingdoms/alterac_valley/boss_balinda.cpp => src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp rename : src/server/scripts/EasternKingdoms/alterac_valley/boss_drekthar.cpp => src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp rename : src/server/scripts/EasternKingdoms/alterac_valley/boss_galvangar.cpp => src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp rename : src/server/scripts/EasternKingdoms/alterac_valley/boss_vanndar.cpp => src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp rename : src/server/scripts/EasternKingdoms/blackrock_depths/blackrock_depths.cpp => src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp rename : src/server/scripts/EasternKingdoms/blackrock_depths/blackrock_depths.h => src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.h rename : src/server/scripts/EasternKingdoms/blackrock_depths/boss_ambassador_flamelash.cpp => src/server/scripts/EasternKingdoms/BlackrockDepths/boss_ambassador_flamelash.cpp rename : src/server/scripts/EasternKingdoms/blackrock_depths/boss_anubshiah.cpp => src/server/scripts/EasternKingdoms/BlackrockDepths/boss_anubshiah.cpp rename : src/server/scripts/EasternKingdoms/blackrock_depths/boss_emperor_dagran_thaurissan.cpp => src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp rename : src/server/scripts/EasternKingdoms/blackrock_depths/boss_general_angerforge.cpp => src/server/scripts/EasternKingdoms/BlackrockDepths/boss_general_angerforge.cpp rename : src/server/scripts/EasternKingdoms/blackrock_depths/boss_gorosh_the_dervish.cpp => src/server/scripts/EasternKingdoms/BlackrockDepths/boss_gorosh_the_dervish.cpp rename : src/server/scripts/EasternKingdoms/blackrock_depths/boss_grizzle.cpp => src/server/scripts/EasternKingdoms/BlackrockDepths/boss_grizzle.cpp rename : src/server/scripts/EasternKingdoms/blackrock_depths/boss_high_interrogator_gerstahn.cpp => src/server/scripts/EasternKingdoms/BlackrockDepths/boss_high_interrogator_gerstahn.cpp rename : src/server/scripts/EasternKingdoms/blackrock_depths/boss_magmus.cpp => src/server/scripts/EasternKingdoms/BlackrockDepths/boss_magmus.cpp rename : src/server/scripts/EasternKingdoms/blackrock_depths/boss_moira_bronzebeard.cpp => src/server/scripts/EasternKingdoms/BlackrockDepths/boss_moira_bronzebeard.cpp rename : src/server/scripts/EasternKingdoms/blackrock_depths/boss_tomb_of_seven.cpp => src/server/scripts/EasternKingdoms/BlackrockDepths/boss_tomb_of_seven.cpp rename : src/server/scripts/EasternKingdoms/blackrock_depths/instance_blackrock_depths.cpp => src/server/scripts/EasternKingdoms/BlackrockDepths/instance_blackrock_depths.cpp rename : src/server/scripts/EasternKingdoms/blackrock_spire/blackrock_spire.cpp => src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.cpp rename : src/server/scripts/EasternKingdoms/blackrock_spire/blackrock_spire.h => src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h rename : src/server/scripts/EasternKingdoms/blackrock_spire/boss_drakkisath.cpp => src/server/scripts/EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp rename : src/server/scripts/EasternKingdoms/blackrock_spire/boss_gyth.cpp => src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp rename : src/server/scripts/EasternKingdoms/blackrock_spire/boss_halycon.cpp => src/server/scripts/EasternKingdoms/BlackrockSpire/boss_halycon.cpp rename : src/server/scripts/EasternKingdoms/blackrock_spire/boss_highlord_omokk.cpp => src/server/scripts/EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp rename : src/server/scripts/EasternKingdoms/blackrock_spire/boss_mother_smolderweb.cpp => src/server/scripts/EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp rename : src/server/scripts/EasternKingdoms/blackrock_spire/boss_overlord_wyrmthalak.cpp => src/server/scripts/EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp rename : src/server/scripts/EasternKingdoms/blackrock_spire/boss_pyroguard_emberseer.cpp => src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp rename : src/server/scripts/EasternKingdoms/blackrock_spire/boss_quartermaster_zigris.cpp => src/server/scripts/EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp rename : src/server/scripts/EasternKingdoms/blackrock_spire/boss_rend_blackhand.cpp => src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp rename : src/server/scripts/EasternKingdoms/blackrock_spire/boss_shadow_hunter_voshgajin.cpp => src/server/scripts/EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp rename : src/server/scripts/EasternKingdoms/blackrock_spire/boss_the_beast.cpp => src/server/scripts/EasternKingdoms/BlackrockSpire/boss_the_beast.cpp rename : src/server/scripts/EasternKingdoms/blackrock_spire/boss_warmaster_voone.cpp => src/server/scripts/EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp rename : src/server/scripts/EasternKingdoms/blackrock_spire/instance_blackrock_spire.cpp => src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp rename : src/server/scripts/EasternKingdoms/blackwing_lair/boss_broodlord_lashlayer.cpp => src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp rename : src/server/scripts/EasternKingdoms/blackwing_lair/boss_chromaggus.cpp => src/server/scripts/EasternKingdoms/BlackwingLair/boss_chromaggus.cpp rename : src/server/scripts/EasternKingdoms/blackwing_lair/boss_ebonroc.cpp => src/server/scripts/EasternKingdoms/BlackwingLair/boss_ebonroc.cpp rename : src/server/scripts/EasternKingdoms/blackwing_lair/boss_firemaw.cpp => src/server/scripts/EasternKingdoms/BlackwingLair/boss_firemaw.cpp rename : src/server/scripts/EasternKingdoms/blackwing_lair/boss_flamegor.cpp => src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp rename : src/server/scripts/EasternKingdoms/blackwing_lair/boss_nefarian.cpp => src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp rename : src/server/scripts/EasternKingdoms/blackwing_lair/boss_razorgore.cpp => src/server/scripts/EasternKingdoms/BlackwingLair/boss_razorgore.cpp rename : src/server/scripts/EasternKingdoms/blackwing_lair/boss_vaelastrasz.cpp => src/server/scripts/EasternKingdoms/BlackwingLair/boss_vaelastrasz.cpp rename : src/server/scripts/EasternKingdoms/blackwing_lair/boss_victor_nefarius.cpp => src/server/scripts/EasternKingdoms/BlackwingLair/boss_victor_nefarius.cpp rename : src/server/scripts/EasternKingdoms/blackwing_lair/instance_blackwing_lair.cpp => src/server/scripts/EasternKingdoms/BlackwingLair/instance_blackwing_lair.cpp rename : src/server/scripts/EasternKingdoms/deadmines/boss_mr_smite.cpp => src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp rename : src/server/scripts/EasternKingdoms/deadmines/deadmines.cpp => src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp rename : src/server/scripts/EasternKingdoms/deadmines/deadmines.h => src/server/scripts/EasternKingdoms/Deadmines/deadmines.h rename : src/server/scripts/EasternKingdoms/deadmines/instance_deadmines.cpp => src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp rename : src/server/scripts/EasternKingdoms/gnomeregan/gnomeregan.cpp => src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp rename : src/server/scripts/EasternKingdoms/gnomeregan/gnomeregan.h => src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.h rename : src/server/scripts/EasternKingdoms/gnomeregan/instance_gnomeregan.cpp => src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp rename : src/server/scripts/EasternKingdoms/karazhan/boss_curator.cpp => src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp rename : src/server/scripts/EasternKingdoms/karazhan/boss_maiden_of_virtue.cpp => src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp rename : src/server/scripts/EasternKingdoms/karazhan/boss_midnight.cpp => src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp rename : src/server/scripts/EasternKingdoms/karazhan/boss_moroes.cpp => src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp rename : src/server/scripts/EasternKingdoms/karazhan/boss_netherspite.cpp => src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp rename : src/server/scripts/EasternKingdoms/karazhan/boss_nightbane.cpp => src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp rename : src/server/scripts/EasternKingdoms/karazhan/boss_prince_malchezaar.cpp => src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp rename : src/server/scripts/EasternKingdoms/karazhan/boss_shade_of_aran.cpp => src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp rename : src/server/scripts/EasternKingdoms/karazhan/boss_terestian_illhoof.cpp => src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp rename : src/server/scripts/EasternKingdoms/karazhan/bosses_opera.cpp => src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp rename : src/server/scripts/EasternKingdoms/karazhan/instance_karazhan.cpp => src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp rename : src/server/scripts/EasternKingdoms/karazhan/karazhan.cpp => src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp rename : src/server/scripts/EasternKingdoms/karazhan/karazhan.h => src/server/scripts/EasternKingdoms/Karazhan/karazhan.h rename : src/server/scripts/EasternKingdoms/magisters_terrace/boss_felblood_kaelthas.cpp => src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp rename : src/server/scripts/EasternKingdoms/magisters_terrace/boss_priestess_delrissa.cpp => src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp rename : src/server/scripts/EasternKingdoms/magisters_terrace/boss_selin_fireheart.cpp => src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp rename : src/server/scripts/EasternKingdoms/magisters_terrace/boss_vexallus.cpp => src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp rename : src/server/scripts/EasternKingdoms/magisters_terrace/instance_magisters_terrace.cpp => src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp rename : src/server/scripts/EasternKingdoms/magisters_terrace/magisters_terrace.cpp => src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp rename : src/server/scripts/EasternKingdoms/magisters_terrace/magisters_terrace.h => src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h rename : src/server/scripts/EasternKingdoms/molten_core/boss_baron_geddon.cpp => src/server/scripts/EasternKingdoms/MoltenCore/boss_baron_geddon.cpp rename : src/server/scripts/EasternKingdoms/molten_core/boss_garr.cpp => src/server/scripts/EasternKingdoms/MoltenCore/boss_garr.cpp rename : src/server/scripts/EasternKingdoms/molten_core/boss_gehennas.cpp => src/server/scripts/EasternKingdoms/MoltenCore/boss_gehennas.cpp rename : src/server/scripts/EasternKingdoms/molten_core/boss_golemagg.cpp => src/server/scripts/EasternKingdoms/MoltenCore/boss_golemagg.cpp rename : src/server/scripts/EasternKingdoms/molten_core/boss_lucifron.cpp => src/server/scripts/EasternKingdoms/MoltenCore/boss_lucifron.cpp rename : src/server/scripts/EasternKingdoms/molten_core/boss_magmadar.cpp => src/server/scripts/EasternKingdoms/MoltenCore/boss_magmadar.cpp rename : src/server/scripts/EasternKingdoms/molten_core/boss_majordomo_executus.cpp => src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp rename : src/server/scripts/EasternKingdoms/molten_core/boss_ragnaros.cpp => src/server/scripts/EasternKingdoms/MoltenCore/boss_ragnaros.cpp rename : src/server/scripts/EasternKingdoms/molten_core/boss_shazzrah.cpp => src/server/scripts/EasternKingdoms/MoltenCore/boss_shazzrah.cpp rename : src/server/scripts/EasternKingdoms/molten_core/boss_sulfuron_harbinger.cpp => src/server/scripts/EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp rename : src/server/scripts/EasternKingdoms/molten_core/instance_molten_core.cpp => src/server/scripts/EasternKingdoms/MoltenCore/instance_molten_core.cpp rename : src/server/scripts/EasternKingdoms/molten_core/molten_core.cpp => src/server/scripts/EasternKingdoms/MoltenCore/molten_core.cpp rename : src/server/scripts/EasternKingdoms/molten_core/molten_core.h => src/server/scripts/EasternKingdoms/MoltenCore/molten_core.h rename : src/server/scripts/EasternKingdoms/scarlet_enclave/chapter1.cpp => src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp rename : src/server/scripts/EasternKingdoms/scarlet_enclave/chapter2.cpp => src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp rename : src/server/scripts/EasternKingdoms/scarlet_enclave/chapter5.cpp => src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp rename : src/server/scripts/EasternKingdoms/scarlet_enclave/the_scarlet_enclave.cpp => src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp rename : src/server/scripts/EasternKingdoms/scarlet_monastery/boss_arcanist_doan.cpp => src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp rename : src/server/scripts/EasternKingdoms/scarlet_monastery/boss_azshir_the_sleepless.cpp => src/server/scripts/EasternKingdoms/ScarletMonastery/boss_azshir_the_sleepless.cpp rename : src/server/scripts/EasternKingdoms/scarlet_monastery/boss_bloodmage_thalnos.cpp => src/server/scripts/EasternKingdoms/ScarletMonastery/boss_bloodmage_thalnos.cpp rename : src/server/scripts/EasternKingdoms/scarlet_monastery/boss_headless_horseman.cpp => src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp rename : src/server/scripts/EasternKingdoms/scarlet_monastery/boss_herod.cpp => src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp rename : src/server/scripts/EasternKingdoms/scarlet_monastery/boss_high_inquisitor_fairbanks.cpp => src/server/scripts/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp rename : src/server/scripts/EasternKingdoms/scarlet_monastery/boss_houndmaster_loksey.cpp => src/server/scripts/EasternKingdoms/ScarletMonastery/boss_houndmaster_loksey.cpp rename : src/server/scripts/EasternKingdoms/scarlet_monastery/boss_interrogator_vishas.cpp => src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp rename : src/server/scripts/EasternKingdoms/scarlet_monastery/boss_mograine_and_whitemane.cpp => src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp rename : src/server/scripts/EasternKingdoms/scarlet_monastery/boss_scorn.cpp => src/server/scripts/EasternKingdoms/ScarletMonastery/boss_scorn.cpp rename : src/server/scripts/EasternKingdoms/scarlet_monastery/instance_scarlet_monastery.cpp => src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp rename : src/server/scripts/EasternKingdoms/scarlet_monastery/scarlet_monastery.h => src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h rename : src/server/scripts/EasternKingdoms/scholomance/boss_darkmaster_gandling.cpp => src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp rename : src/server/scripts/EasternKingdoms/scholomance/boss_death_knight_darkreaver.cpp => src/server/scripts/EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp rename : src/server/scripts/EasternKingdoms/scholomance/boss_doctor_theolen_krastinov.cpp => src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp rename : src/server/scripts/EasternKingdoms/scholomance/boss_illucia_barov.cpp => src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp rename : src/server/scripts/EasternKingdoms/scholomance/boss_instructor_malicia.cpp => src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp rename : src/server/scripts/EasternKingdoms/scholomance/boss_jandice_barov.cpp => src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp rename : src/server/scripts/EasternKingdoms/scholomance/boss_kormok.cpp => src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp rename : src/server/scripts/EasternKingdoms/scholomance/boss_lord_alexei_barov.cpp => src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp rename : src/server/scripts/EasternKingdoms/scholomance/boss_lorekeeper_polkelt.cpp => src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp rename : src/server/scripts/EasternKingdoms/scholomance/boss_ras_frostwhisper.cpp => src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp rename : src/server/scripts/EasternKingdoms/scholomance/boss_the_ravenian.cpp => src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp rename : src/server/scripts/EasternKingdoms/scholomance/boss_vectus.cpp => src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp rename : src/server/scripts/EasternKingdoms/scholomance/instance_scholomance.cpp => src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp rename : src/server/scripts/EasternKingdoms/scholomance/scholomance.h => src/server/scripts/EasternKingdoms/Scholomance/scholomance.h rename : src/server/scripts/EasternKingdoms/shadowfang_keep/instance_shadowfang_keep.cpp => src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp rename : src/server/scripts/EasternKingdoms/shadowfang_keep/shadowfang_keep.cpp => src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp rename : src/server/scripts/EasternKingdoms/shadowfang_keep/shadowfang_keep.h => src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h rename : src/server/scripts/EasternKingdoms/stratholme/boss_baron_rivendare.cpp => src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp rename : src/server/scripts/EasternKingdoms/stratholme/boss_baroness_anastari.cpp => src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp rename : src/server/scripts/EasternKingdoms/stratholme/boss_cannon_master_willey.cpp => src/server/scripts/EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp rename : src/server/scripts/EasternKingdoms/stratholme/boss_dathrohan_balnazzar.cpp => src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp rename : src/server/scripts/EasternKingdoms/stratholme/boss_magistrate_barthilas.cpp => src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp rename : src/server/scripts/EasternKingdoms/stratholme/boss_maleki_the_pallid.cpp => src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp rename : src/server/scripts/EasternKingdoms/stratholme/boss_nerubenkan.cpp => src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp rename : src/server/scripts/EasternKingdoms/stratholme/boss_order_of_silver_hand.cpp => src/server/scripts/EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp rename : src/server/scripts/EasternKingdoms/stratholme/boss_postmaster_malown.cpp => src/server/scripts/EasternKingdoms/Stratholme/boss_postmaster_malown.cpp rename : src/server/scripts/EasternKingdoms/stratholme/boss_ramstein_the_gorger.cpp => src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp rename : src/server/scripts/EasternKingdoms/stratholme/boss_timmy_the_cruel.cpp => src/server/scripts/EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp rename : src/server/scripts/EasternKingdoms/stratholme/instance_stratholme.cpp => src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp rename : src/server/scripts/EasternKingdoms/stratholme/stratholme.cpp => src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp rename : src/server/scripts/EasternKingdoms/stratholme/stratholme.h => src/server/scripts/EasternKingdoms/Stratholme/stratholme.h rename : src/server/scripts/EasternKingdoms/sunken_temple/instance_sunken_temple.cpp => src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp rename : src/server/scripts/EasternKingdoms/sunken_temple/sunken_temple.cpp => src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp rename : src/server/scripts/EasternKingdoms/sunken_temple/sunken_temple.h => src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h rename : src/server/scripts/EasternKingdoms/sunwell_plateau/boss_brutallus.cpp => src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp rename : src/server/scripts/EasternKingdoms/sunwell_plateau/boss_eredar_twins.cpp => src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp rename : src/server/scripts/EasternKingdoms/sunwell_plateau/boss_felmyst.cpp => src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp rename : src/server/scripts/EasternKingdoms/sunwell_plateau/boss_kalecgos.cpp => src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp rename : src/server/scripts/EasternKingdoms/sunwell_plateau/boss_kiljaeden.cpp => src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp rename : src/server/scripts/EasternKingdoms/sunwell_plateau/boss_muru.cpp => src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp rename : src/server/scripts/EasternKingdoms/sunwell_plateau/instance_sunwell_plateau.cpp => src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp rename : src/server/scripts/EasternKingdoms/sunwell_plateau/sunwell_plateau.cpp => src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.cpp rename : src/server/scripts/EasternKingdoms/sunwell_plateau/sunwell_plateau.h => src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h rename : src/server/scripts/EasternKingdoms/uldaman/boss_archaedas.cpp => src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp rename : src/server/scripts/EasternKingdoms/uldaman/boss_ironaya.cpp => src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp rename : src/server/scripts/EasternKingdoms/uldaman/instance_uldaman.cpp => src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp rename : src/server/scripts/EasternKingdoms/uldaman/uldaman.cpp => src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp rename : src/server/scripts/EasternKingdoms/zulaman/boss_akilzon.cpp => src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp rename : src/server/scripts/EasternKingdoms/zulaman/boss_halazzi.cpp => src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp rename : src/server/scripts/EasternKingdoms/zulaman/boss_hexlord.cpp => src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp rename : src/server/scripts/EasternKingdoms/zulaman/boss_janalai.cpp => src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp rename : src/server/scripts/EasternKingdoms/zulaman/boss_nalorakk.cpp => src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp rename : src/server/scripts/EasternKingdoms/zulaman/boss_zuljin.cpp => src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp rename : src/server/scripts/EasternKingdoms/zulaman/instance_zulaman.cpp => src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp rename : src/server/scripts/EasternKingdoms/zulaman/zulaman.cpp => src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp rename : src/server/scripts/EasternKingdoms/zulaman/zulaman.h => src/server/scripts/EasternKingdoms/ZulAman/zulaman.h rename : src/server/scripts/EasternKingdoms/zulgurub/boss_arlokk.cpp => src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp rename : src/server/scripts/EasternKingdoms/zulgurub/boss_gahzranka.cpp => src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp rename : src/server/scripts/EasternKingdoms/zulgurub/boss_grilek.cpp => src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp rename : src/server/scripts/EasternKingdoms/zulgurub/boss_hakkar.cpp => src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp rename : src/server/scripts/EasternKingdoms/zulgurub/boss_hazzarah.cpp => src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp rename : src/server/scripts/EasternKingdoms/zulgurub/boss_jeklik.cpp => src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp rename : src/server/scripts/EasternKingdoms/zulgurub/boss_jindo.cpp => src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp rename : src/server/scripts/EasternKingdoms/zulgurub/boss_mandokir.cpp => src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp rename : src/server/scripts/EasternKingdoms/zulgurub/boss_marli.cpp => src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp rename : src/server/scripts/EasternKingdoms/zulgurub/boss_renataki.cpp => src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp rename : src/server/scripts/EasternKingdoms/zulgurub/boss_thekal.cpp => src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp rename : src/server/scripts/EasternKingdoms/zulgurub/boss_venoxis.cpp => src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp rename : src/server/scripts/EasternKingdoms/zulgurub/boss_wushoolay.cpp => src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp rename : src/server/scripts/EasternKingdoms/zulgurub/instance_zulgurub.cpp => src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp rename : src/server/scripts/EasternKingdoms/zulgurub/zulgurub.h => src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h rename : src/server/scripts/Kalimdor/blackfathom_depths/blackfathom_deeps.cpp => src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp rename : src/server/scripts/Kalimdor/blackfathom_depths/blackfathom_deeps.h => src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h rename : src/server/scripts/Kalimdor/blackfathom_depths/boss_aku_mai.cpp => src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp rename : src/server/scripts/Kalimdor/blackfathom_depths/boss_gelihast.cpp => src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp rename : src/server/scripts/Kalimdor/blackfathom_depths/boss_kelris.cpp => src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp rename : src/server/scripts/Kalimdor/blackfathom_depths/instance_blackfathom_deeps.cpp => src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/culling_of_stratholme/boss_epoch.cpp => src/server/scripts/Kalimdor/CavernsOfTime/culling_of_stratholme/boss_epoch.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/culling_of_stratholme/boss_infinite.cpp => src/server/scripts/Kalimdor/CavernsOfTime/culling_of_stratholme/boss_infinite.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/culling_of_stratholme/boss_mal_ganis.cpp => src/server/scripts/Kalimdor/CavernsOfTime/culling_of_stratholme/boss_mal_ganis.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/culling_of_stratholme/boss_meathook.cpp => src/server/scripts/Kalimdor/CavernsOfTime/culling_of_stratholme/boss_meathook.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/culling_of_stratholme/boss_salramm.cpp => src/server/scripts/Kalimdor/CavernsOfTime/culling_of_stratholme/boss_salramm.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/culling_of_stratholme/culling_of_stratholme.cpp => src/server/scripts/Kalimdor/CavernsOfTime/culling_of_stratholme/culling_of_stratholme.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/culling_of_stratholme/culling_of_stratholme.h => src/server/scripts/Kalimdor/CavernsOfTime/culling_of_stratholme/culling_of_stratholme.h rename : src/server/scripts/Kalimdor/caverns_of_time/culling_of_stratholme/instance_culling_of_stratholme.cpp => src/server/scripts/Kalimdor/CavernsOfTime/culling_of_stratholme/instance_culling_of_stratholme.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/dark_portal/boss_aeonus.cpp => src/server/scripts/Kalimdor/CavernsOfTime/dark_portal/boss_aeonus.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/dark_portal/boss_chrono_lord_deja.cpp => src/server/scripts/Kalimdor/CavernsOfTime/dark_portal/boss_chrono_lord_deja.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/dark_portal/boss_temporus.cpp => src/server/scripts/Kalimdor/CavernsOfTime/dark_portal/boss_temporus.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/dark_portal/dark_portal.cpp => src/server/scripts/Kalimdor/CavernsOfTime/dark_portal/dark_portal.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/dark_portal/dark_portal.h => src/server/scripts/Kalimdor/CavernsOfTime/dark_portal/dark_portal.h rename : src/server/scripts/Kalimdor/caverns_of_time/dark_portal/instance_dark_portal.cpp => src/server/scripts/Kalimdor/CavernsOfTime/dark_portal/instance_dark_portal.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/hyjal/boss_anetheron.cpp => src/server/scripts/Kalimdor/CavernsOfTime/hyjal/boss_anetheron.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/hyjal/boss_archimonde.cpp => src/server/scripts/Kalimdor/CavernsOfTime/hyjal/boss_archimonde.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/hyjal/boss_azgalor.cpp => src/server/scripts/Kalimdor/CavernsOfTime/hyjal/boss_azgalor.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/hyjal/boss_kazrogal.cpp => src/server/scripts/Kalimdor/CavernsOfTime/hyjal/boss_kazrogal.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/hyjal/boss_rage_winterchill.cpp => src/server/scripts/Kalimdor/CavernsOfTime/hyjal/boss_rage_winterchill.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/hyjal/hyjal.cpp => src/server/scripts/Kalimdor/CavernsOfTime/hyjal/hyjal.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/hyjal/hyjal.h => src/server/scripts/Kalimdor/CavernsOfTime/hyjal/hyjal.h rename : src/server/scripts/Kalimdor/caverns_of_time/hyjal/hyjalAI.cpp => src/server/scripts/Kalimdor/CavernsOfTime/hyjal/hyjalAI.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/hyjal/hyjalAI.h => src/server/scripts/Kalimdor/CavernsOfTime/hyjal/hyjalAI.h rename : src/server/scripts/Kalimdor/caverns_of_time/hyjal/hyjal_trash.cpp => src/server/scripts/Kalimdor/CavernsOfTime/hyjal/hyjal_trash.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/hyjal/hyjal_trash.h => src/server/scripts/Kalimdor/CavernsOfTime/hyjal/hyjal_trash.h rename : src/server/scripts/Kalimdor/caverns_of_time/hyjal/instance_hyjal.cpp => src/server/scripts/Kalimdor/CavernsOfTime/hyjal/instance_hyjal.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/old_hillsbrad/boss_captain_skarloc.cpp => src/server/scripts/Kalimdor/CavernsOfTime/old_hillsbrad/boss_captain_skarloc.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/old_hillsbrad/boss_epoch_hunter.cpp => src/server/scripts/Kalimdor/CavernsOfTime/old_hillsbrad/boss_epoch_hunter.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/old_hillsbrad/boss_leutenant_drake.cpp => src/server/scripts/Kalimdor/CavernsOfTime/old_hillsbrad/boss_leutenant_drake.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/old_hillsbrad/instance_old_hillsbrad.cpp => src/server/scripts/Kalimdor/CavernsOfTime/old_hillsbrad/instance_old_hillsbrad.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp => src/server/scripts/Kalimdor/CavernsOfTime/old_hillsbrad/old_hillsbrad.cpp rename : src/server/scripts/Kalimdor/caverns_of_time/old_hillsbrad/old_hillsbrad.h => src/server/scripts/Kalimdor/CavernsOfTime/old_hillsbrad/old_hillsbrad.h rename : src/server/scripts/Kalimdor/maraudon/boss_celebras_the_cursed.cpp => src/server/scripts/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp rename : src/server/scripts/Kalimdor/maraudon/boss_landslide.cpp => src/server/scripts/Kalimdor/Maraudon/boss_landslide.cpp rename : src/server/scripts/Kalimdor/maraudon/boss_noxxion.cpp => src/server/scripts/Kalimdor/Maraudon/boss_noxxion.cpp rename : src/server/scripts/Kalimdor/maraudon/boss_princess_theradras.cpp => src/server/scripts/Kalimdor/Maraudon/boss_princess_theradras.cpp rename : src/server/scripts/Kalimdor/onyxias_lair/boss_onyxia.cpp => src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp rename : src/server/scripts/Kalimdor/onyxias_lair/instance_onyxias_lair.cpp => src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp rename : src/server/scripts/Kalimdor/onyxias_lair/onyxias_lair.h => src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h rename : src/server/scripts/Kalimdor/razorfen_downs/boss_amnennar_the_coldbringer.cpp => src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp rename : src/server/scripts/Kalimdor/razorfen_downs/instance_razorfen_downs.cpp => src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp rename : src/server/scripts/Kalimdor/razorfen_downs/razorfen_downs.cpp => src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp rename : src/server/scripts/Kalimdor/razorfen_downs/razorfen_downs.h => src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h rename : src/server/scripts/Kalimdor/razorfen_kraul/instance_razorfen_kraul.cpp => src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp rename : src/server/scripts/Kalimdor/razorfen_kraul/razorfen_kraul.cpp => src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp rename : src/server/scripts/Kalimdor/razorfen_kraul/razorfen_kraul.h => src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.h rename : src/server/scripts/Kalimdor/ruins_of_ahnqiraj/boss_ayamiss.cpp => src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp rename : src/server/scripts/Kalimdor/ruins_of_ahnqiraj/boss_buru.cpp => src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp rename : src/server/scripts/Kalimdor/ruins_of_ahnqiraj/boss_kurinnaxx.cpp => src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp rename : src/server/scripts/Kalimdor/ruins_of_ahnqiraj/boss_moam.cpp => src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp rename : src/server/scripts/Kalimdor/ruins_of_ahnqiraj/boss_ossirian.cpp => src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp rename : src/server/scripts/Kalimdor/ruins_of_ahnqiraj/boss_rajaxx.cpp => src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp rename : src/server/scripts/Kalimdor/ruins_of_ahnqiraj/instance_ruins_of_ahnqiraj.cpp => src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp rename : src/server/scripts/Kalimdor/ruins_of_ahnqiraj/ruins_of_ahnqiraj.h => src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h rename : src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_bug_trio.cpp => src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp rename : src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_cthun.cpp => src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp rename : src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_fankriss.cpp => src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp rename : src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_huhuran.cpp => src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp rename : src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_ouro.cpp => src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp rename : src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_sartura.cpp => src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp rename : src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_skeram.cpp => src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp rename : src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_twinemperors.cpp => src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp rename : src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_viscidus.cpp => src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp rename : src/server/scripts/Kalimdor/temple_of_ahnqiraj/instance_temple_of_ahnqiraj.cpp => src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp rename : src/server/scripts/Kalimdor/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp => src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp rename : src/server/scripts/Kalimdor/temple_of_ahnqiraj/temple_of_ahnqiraj.h => src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h rename : src/server/scripts/Kalimdor/wailing_caverns/instance_wailing_caverns.cpp => src/server/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp rename : src/server/scripts/Kalimdor/wailing_caverns/wailing_caverns.cpp => src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp rename : src/server/scripts/Kalimdor/wailing_caverns/wailing_caverns.h => src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.h rename : src/server/scripts/Kalimdor/zulfarrak/instance_zulfarrak.cpp => src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp rename : src/server/scripts/Kalimdor/zulfarrak/zulfarrak.cpp => src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp rename : src/server/scripts/Northrend/azjol_nerub/ahnkahet/ahnkahet.h => src/server/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h rename : src/server/scripts/Northrend/azjol_nerub/ahnkahet/boss_amanitar.cpp => src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_amanitar.cpp rename : src/server/scripts/Northrend/azjol_nerub/ahnkahet/boss_elder_nadox.cpp => src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_elder_nadox.cpp rename : src/server/scripts/Northrend/azjol_nerub/ahnkahet/boss_herald_volazj.cpp => src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp rename : src/server/scripts/Northrend/azjol_nerub/ahnkahet/boss_jedoga_shadowseeker.cpp => src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp rename : src/server/scripts/Northrend/azjol_nerub/ahnkahet/boss_prince_taldaram.cpp => src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp rename : src/server/scripts/Northrend/azjol_nerub/ahnkahet/instance_ahnkahet.cpp => src/server/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp rename : src/server/scripts/Northrend/azjol_nerub/azjol_nerub/azjol_nerub.h => src/server/scripts/Northrend/AzjolNerub/azjol_nerub/azjol_nerub.h rename : src/server/scripts/Northrend/azjol_nerub/azjol_nerub/boss_anubarak.cpp => src/server/scripts/Northrend/AzjolNerub/azjol_nerub/boss_anubarak.cpp rename : src/server/scripts/Northrend/azjol_nerub/azjol_nerub/boss_hadronox.cpp => src/server/scripts/Northrend/AzjolNerub/azjol_nerub/boss_hadronox.cpp rename : src/server/scripts/Northrend/azjol_nerub/azjol_nerub/boss_krikthir_the_gatewatcher.cpp => src/server/scripts/Northrend/AzjolNerub/azjol_nerub/boss_krikthir_the_gatewatcher.cpp rename : src/server/scripts/Northrend/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp => src/server/scripts/Northrend/AzjolNerub/azjol_nerub/instance_azjol_nerub.cpp rename : src/server/scripts/Northrend/crusaders_coliseum/trial_of_the_champion/boss_argent_challenge.cpp => src/server/scripts/Northrend/CrusadersColiseum/trial_of_the_champion/boss_argent_challenge.cpp rename : src/server/scripts/Northrend/crusaders_coliseum/trial_of_the_champion/boss_black_knight.cpp => src/server/scripts/Northrend/CrusadersColiseum/trial_of_the_champion/boss_black_knight.cpp rename : src/server/scripts/Northrend/crusaders_coliseum/trial_of_the_champion/boss_grand_champions.cpp => src/server/scripts/Northrend/CrusadersColiseum/trial_of_the_champion/boss_grand_champions.cpp rename : src/server/scripts/Northrend/crusaders_coliseum/trial_of_the_champion/instance_trial_of_the_champion.cpp => src/server/scripts/Northrend/CrusadersColiseum/trial_of_the_champion/instance_trial_of_the_champion.cpp rename : src/server/scripts/Northrend/crusaders_coliseum/trial_of_the_champion/trial_of_the_champion.cpp => src/server/scripts/Northrend/CrusadersColiseum/trial_of_the_champion/trial_of_the_champion.cpp rename : src/server/scripts/Northrend/crusaders_coliseum/trial_of_the_champion/trial_of_the_champion.h => src/server/scripts/Northrend/CrusadersColiseum/trial_of_the_champion/trial_of_the_champion.h rename : src/server/scripts/Northrend/draktharon_keep/boss_dred.cpp => src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp rename : src/server/scripts/Northrend/draktharon_keep/boss_novos.cpp => src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp rename : src/server/scripts/Northrend/draktharon_keep/boss_tharon_ja.cpp => src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp rename : src/server/scripts/Northrend/draktharon_keep/boss_trollgore.cpp => src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp rename : src/server/scripts/Northrend/draktharon_keep/drak_tharon_keep.h => src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h rename : src/server/scripts/Northrend/draktharon_keep/instance_drak_tharon_keep.cpp => src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp rename : src/server/scripts/Northrend/frozen_halls/forge_of_souls/boss_bronjahm.cpp => src/server/scripts/Northrend/FrozenHalls/forge_of_souls/boss_bronjahm.cpp rename : src/server/scripts/Northrend/frozen_halls/forge_of_souls/boss_devourer_of_souls.cpp => src/server/scripts/Northrend/FrozenHalls/forge_of_souls/boss_devourer_of_souls.cpp rename : src/server/scripts/Northrend/frozen_halls/forge_of_souls/forge_of_souls.cpp => src/server/scripts/Northrend/FrozenHalls/forge_of_souls/forge_of_souls.cpp rename : src/server/scripts/Northrend/frozen_halls/forge_of_souls/forge_of_souls.h => src/server/scripts/Northrend/FrozenHalls/forge_of_souls/forge_of_souls.h rename : src/server/scripts/Northrend/frozen_halls/forge_of_souls/instance_forge_of_souls.cpp => src/server/scripts/Northrend/FrozenHalls/forge_of_souls/instance_forge_of_souls.cpp rename : src/server/scripts/Northrend/frozen_halls/halls_of_reflection/boss_falric.cpp => src/server/scripts/Northrend/FrozenHalls/halls_of_reflection/boss_falric.cpp rename : src/server/scripts/Northrend/frozen_halls/halls_of_reflection/boss_marwyn.cpp => src/server/scripts/Northrend/FrozenHalls/halls_of_reflection/boss_marwyn.cpp rename : src/server/scripts/Northrend/frozen_halls/halls_of_reflection/halls_of_reflection.cpp => src/server/scripts/Northrend/FrozenHalls/halls_of_reflection/halls_of_reflection.cpp rename : src/server/scripts/Northrend/frozen_halls/halls_of_reflection/halls_of_reflection.h => src/server/scripts/Northrend/FrozenHalls/halls_of_reflection/halls_of_reflection.h rename : src/server/scripts/Northrend/frozen_halls/halls_of_reflection/instance_halls_of_reflection.cpp => src/server/scripts/Northrend/FrozenHalls/halls_of_reflection/instance_halls_of_reflection.cpp rename : src/server/scripts/Northrend/frozen_halls/pit_of_saron/boss_forgemaster_garfrost.cpp => src/server/scripts/Northrend/FrozenHalls/pit_of_saron/boss_forgemaster_garfrost.cpp rename : src/server/scripts/Northrend/frozen_halls/pit_of_saron/boss_krickandick.cpp => src/server/scripts/Northrend/FrozenHalls/pit_of_saron/boss_krickandick.cpp rename : src/server/scripts/Northrend/frozen_halls/pit_of_saron/boss_scourgelord_tyrannus.cpp => src/server/scripts/Northrend/FrozenHalls/pit_of_saron/boss_scourgelord_tyrannus.cpp rename : src/server/scripts/Northrend/frozen_halls/pit_of_saron/instance_pit_of_saron.cpp => src/server/scripts/Northrend/FrozenHalls/pit_of_saron/instance_pit_of_saron.cpp rename : src/server/scripts/Northrend/frozen_halls/pit_of_saron/pit_of_saron.cpp => src/server/scripts/Northrend/FrozenHalls/pit_of_saron/pit_of_saron.cpp rename : src/server/scripts/Northrend/frozen_halls/pit_of_saron/pit_of_saron.h => src/server/scripts/Northrend/FrozenHalls/pit_of_saron/pit_of_saron.h rename : src/server/scripts/Northrend/gundrak/boss_drakkari_colossus.cpp => src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp rename : src/server/scripts/Northrend/gundrak/boss_eck.cpp => src/server/scripts/Northrend/Gundrak/boss_eck.cpp rename : src/server/scripts/Northrend/gundrak/boss_gal_darah.cpp => src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp rename : src/server/scripts/Northrend/gundrak/boss_moorabi.cpp => src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp rename : src/server/scripts/Northrend/gundrak/boss_slad_ran.cpp => src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp rename : src/server/scripts/Northrend/gundrak/gundrak.h => src/server/scripts/Northrend/Gundrak/gundrak.h rename : src/server/scripts/Northrend/gundrak/instance_gundrak.cpp => src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp rename : src/server/scripts/Northrend/naxxramas/boss_anubrekhan.cpp => src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp rename : src/server/scripts/Northrend/naxxramas/boss_faerlina.cpp => src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp rename : src/server/scripts/Northrend/naxxramas/boss_four_horsemen.cpp => src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp rename : src/server/scripts/Northrend/naxxramas/boss_gluth.cpp => src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp rename : src/server/scripts/Northrend/naxxramas/boss_gothik.cpp => src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp rename : src/server/scripts/Northrend/naxxramas/boss_grobbulus.cpp => src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp rename : src/server/scripts/Northrend/naxxramas/boss_heigan.cpp => src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp rename : src/server/scripts/Northrend/naxxramas/boss_highlord_mograine.cpp => src/server/scripts/Northrend/Naxxramas/boss_highlord_mograine.cpp rename : src/server/scripts/Northrend/naxxramas/boss_kelthuzad.cpp => src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp rename : src/server/scripts/Northrend/naxxramas/boss_loatheb.cpp => src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp rename : src/server/scripts/Northrend/naxxramas/boss_maexxna.cpp => src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp rename : src/server/scripts/Northrend/naxxramas/boss_noth.cpp => src/server/scripts/Northrend/Naxxramas/boss_noth.cpp rename : src/server/scripts/Northrend/naxxramas/boss_patchwerk.cpp => src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp rename : src/server/scripts/Northrend/naxxramas/boss_razuvious.cpp => src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp rename : src/server/scripts/Northrend/naxxramas/boss_sapphiron.cpp => src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp rename : src/server/scripts/Northrend/naxxramas/boss_thaddius.cpp => src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp rename : src/server/scripts/Northrend/naxxramas/instance_naxxramas.cpp => src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp rename : src/server/scripts/Northrend/naxxramas/naxxramas.h => src/server/scripts/Northrend/Naxxramas/naxxramas.h rename : src/server/scripts/Northrend/obsidian_sanctum/boss_sartharion.cpp => src/server/scripts/Northrend/ObsidianSanctum/boss_sartharion.cpp rename : src/server/scripts/Northrend/obsidian_sanctum/instance_obsidian_sanctum.cpp => src/server/scripts/Northrend/ObsidianSanctum/instance_obsidian_sanctum.cpp rename : src/server/scripts/Northrend/obsidian_sanctum/obsidian_sanctum.h => src/server/scripts/Northrend/ObsidianSanctum/obsidian_sanctum.h rename : src/server/scripts/Northrend/nexus/eye_of_eternity/boss_malygos.cpp => src/server/scripts/Northrend/TheNexus/eye_of_eternity/boss_malygos.cpp rename : src/server/scripts/Northrend/nexus/eye_of_eternity/eye_of_eternity.h => src/server/scripts/Northrend/TheNexus/eye_of_eternity/eye_of_eternity.h rename : src/server/scripts/Northrend/nexus/eye_of_eternity/instance_eye_of_eternity.cpp => src/server/scripts/Northrend/TheNexus/eye_of_eternity/instance_eye_of_eternity.cpp rename : src/server/scripts/Northrend/nexus/nexus/boss_anomalus.cpp => src/server/scripts/Northrend/TheNexus/nexus/boss_anomalus.cpp rename : src/server/scripts/Northrend/nexus/nexus/boss_keristrasza.cpp => src/server/scripts/Northrend/TheNexus/nexus/boss_keristrasza.cpp rename : src/server/scripts/Northrend/nexus/nexus/boss_magus_telestra.cpp => src/server/scripts/Northrend/TheNexus/nexus/boss_magus_telestra.cpp rename : src/server/scripts/Northrend/nexus/nexus/boss_ormorok.cpp => src/server/scripts/Northrend/TheNexus/nexus/boss_ormorok.cpp rename : src/server/scripts/Northrend/nexus/nexus/commander_kolurg.cpp => src/server/scripts/Northrend/TheNexus/nexus/commander_kolurg.cpp rename : src/server/scripts/Northrend/nexus/nexus/commander_stoutbeard.cpp => src/server/scripts/Northrend/TheNexus/nexus/commander_stoutbeard.cpp rename : src/server/scripts/Northrend/nexus/nexus/instance_nexus.cpp => src/server/scripts/Northrend/TheNexus/nexus/instance_nexus.cpp rename : src/server/scripts/Northrend/nexus/nexus/nexus.h => src/server/scripts/Northrend/TheNexus/nexus/nexus.h rename : src/server/scripts/Northrend/nexus/oculus/boss_drakos.cpp => src/server/scripts/Northrend/TheNexus/oculus/boss_drakos.cpp rename : src/server/scripts/Northrend/nexus/oculus/boss_eregos.cpp => src/server/scripts/Northrend/TheNexus/oculus/boss_eregos.cpp rename : src/server/scripts/Northrend/nexus/oculus/boss_urom.cpp => src/server/scripts/Northrend/TheNexus/oculus/boss_urom.cpp rename : src/server/scripts/Northrend/nexus/oculus/boss_varos.cpp => src/server/scripts/Northrend/TheNexus/oculus/boss_varos.cpp rename : src/server/scripts/Northrend/nexus/oculus/instance_oculus.cpp => src/server/scripts/Northrend/TheNexus/oculus/instance_oculus.cpp rename : src/server/scripts/Northrend/nexus/oculus/oculus.cpp => src/server/scripts/Northrend/TheNexus/oculus/oculus.cpp rename : src/server/scripts/Northrend/nexus/oculus/oculus.h => src/server/scripts/Northrend/TheNexus/oculus/oculus.h rename : src/server/scripts/Northrend/ulduar/halls_of_lightning/boss_bjarngrim.cpp => src/server/scripts/Northrend/Ulduar/halls_of_lightning/boss_bjarngrim.cpp rename : src/server/scripts/Northrend/ulduar/halls_of_lightning/boss_ionar.cpp => src/server/scripts/Northrend/Ulduar/halls_of_lightning/boss_ionar.cpp rename : src/server/scripts/Northrend/ulduar/halls_of_lightning/boss_loken.cpp => src/server/scripts/Northrend/Ulduar/halls_of_lightning/boss_loken.cpp rename : src/server/scripts/Northrend/ulduar/halls_of_lightning/boss_volkhan.cpp => src/server/scripts/Northrend/Ulduar/halls_of_lightning/boss_volkhan.cpp rename : src/server/scripts/Northrend/ulduar/halls_of_lightning/halls_of_lightning.h => src/server/scripts/Northrend/Ulduar/halls_of_lightning/halls_of_lightning.h rename : src/server/scripts/Northrend/ulduar/halls_of_lightning/instance_halls_of_lightning.cpp => src/server/scripts/Northrend/Ulduar/halls_of_lightning/instance_halls_of_lightning.cpp rename : src/server/scripts/Northrend/ulduar/halls_of_stone/boss_krystallus.cpp => src/server/scripts/Northrend/Ulduar/halls_of_stone/boss_krystallus.cpp rename : src/server/scripts/Northrend/ulduar/halls_of_stone/boss_maiden_of_grief.cpp => src/server/scripts/Northrend/Ulduar/halls_of_stone/boss_maiden_of_grief.cpp rename : src/server/scripts/Northrend/ulduar/halls_of_stone/boss_sjonnir.cpp => src/server/scripts/Northrend/Ulduar/halls_of_stone/boss_sjonnir.cpp rename : src/server/scripts/Northrend/ulduar/halls_of_stone/halls_of_stone.cpp => src/server/scripts/Northrend/Ulduar/halls_of_stone/halls_of_stone.cpp rename : src/server/scripts/Northrend/ulduar/halls_of_stone/halls_of_stone.h => src/server/scripts/Northrend/Ulduar/halls_of_stone/halls_of_stone.h rename : src/server/scripts/Northrend/ulduar/halls_of_stone/instance_halls_of_stone.cpp => src/server/scripts/Northrend/Ulduar/halls_of_stone/instance_halls_of_stone.cpp rename : src/server/scripts/Northrend/ulduar/ulduar/boss_algalon.cpp => src/server/scripts/Northrend/Ulduar/ulduar/boss_algalon.cpp rename : src/server/scripts/Northrend/ulduar/ulduar/boss_assembly_of_iron.cpp => src/server/scripts/Northrend/Ulduar/ulduar/boss_assembly_of_iron.cpp rename : src/server/scripts/Northrend/ulduar/ulduar/boss_auriaya.cpp => src/server/scripts/Northrend/Ulduar/ulduar/boss_auriaya.cpp rename : src/server/scripts/Northrend/ulduar/ulduar/boss_flame_leviathan.cpp => src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp rename : src/server/scripts/Northrend/ulduar/ulduar/boss_freya.cpp => src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp rename : src/server/scripts/Northrend/ulduar/ulduar/boss_general_vezax.cpp => src/server/scripts/Northrend/Ulduar/ulduar/boss_general_vezax.cpp rename : src/server/scripts/Northrend/ulduar/ulduar/boss_hodir.cpp => src/server/scripts/Northrend/Ulduar/ulduar/boss_hodir.cpp rename : src/server/scripts/Northrend/ulduar/ulduar/boss_ignis.cpp => src/server/scripts/Northrend/Ulduar/ulduar/boss_ignis.cpp rename : src/server/scripts/Northrend/ulduar/ulduar/boss_kologarn.cpp => src/server/scripts/Northrend/Ulduar/ulduar/boss_kologarn.cpp rename : src/server/scripts/Northrend/ulduar/ulduar/boss_mimiron.cpp => src/server/scripts/Northrend/Ulduar/ulduar/boss_mimiron.cpp rename : src/server/scripts/Northrend/ulduar/ulduar/boss_razorscale.cpp => src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp rename : src/server/scripts/Northrend/ulduar/ulduar/boss_thorim.cpp => src/server/scripts/Northrend/Ulduar/ulduar/boss_thorim.cpp rename : src/server/scripts/Northrend/ulduar/ulduar/boss_xt002.cpp => src/server/scripts/Northrend/Ulduar/ulduar/boss_xt002.cpp rename : src/server/scripts/Northrend/ulduar/ulduar/boss_yoggsaron.cpp => src/server/scripts/Northrend/Ulduar/ulduar/boss_yoggsaron.cpp rename : src/server/scripts/Northrend/ulduar/ulduar/instance_ulduar.cpp => src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp rename : src/server/scripts/Northrend/ulduar/ulduar/ulduar.h => src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h rename : src/server/scripts/Northrend/ulduar/ulduar/ulduar_teleporter.cpp => src/server/scripts/Northrend/Ulduar/ulduar/ulduar_teleporter.cpp rename : src/server/scripts/Northrend/utgarde_keep/utgarde_keep/boss_ingvar_the_plunderer.cpp => src/server/scripts/Northrend/UtgardeKeep/utgarde_keep/boss_ingvar_the_plunderer.cpp rename : src/server/scripts/Northrend/utgarde_keep/utgarde_keep/boss_keleseth.cpp => src/server/scripts/Northrend/UtgardeKeep/utgarde_keep/boss_keleseth.cpp rename : src/server/scripts/Northrend/utgarde_keep/utgarde_keep/boss_skarvald_dalronn.cpp => src/server/scripts/Northrend/UtgardeKeep/utgarde_keep/boss_skarvald_dalronn.cpp rename : src/server/scripts/Northrend/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp => src/server/scripts/Northrend/UtgardeKeep/utgarde_keep/instance_utgarde_keep.cpp rename : src/server/scripts/Northrend/utgarde_keep/utgarde_keep/utgarde_keep.cpp => src/server/scripts/Northrend/UtgardeKeep/utgarde_keep/utgarde_keep.cpp rename : src/server/scripts/Northrend/utgarde_keep/utgarde_keep/utgarde_keep.h => src/server/scripts/Northrend/UtgardeKeep/utgarde_keep/utgarde_keep.h rename : src/server/scripts/Northrend/utgarde_keep/utgarde_pinnacle/boss_palehoof.cpp => src/server/scripts/Northrend/UtgardeKeep/utgarde_pinnacle/boss_palehoof.cpp rename : src/server/scripts/Northrend/utgarde_keep/utgarde_pinnacle/boss_skadi.cpp => src/server/scripts/Northrend/UtgardeKeep/utgarde_pinnacle/boss_skadi.cpp rename : src/server/scripts/Northrend/utgarde_keep/utgarde_pinnacle/boss_svala.cpp => src/server/scripts/Northrend/UtgardeKeep/utgarde_pinnacle/boss_svala.cpp rename : src/server/scripts/Northrend/utgarde_keep/utgarde_pinnacle/boss_ymiron.cpp => src/server/scripts/Northrend/UtgardeKeep/utgarde_pinnacle/boss_ymiron.cpp rename : src/server/scripts/Northrend/utgarde_keep/utgarde_pinnacle/instance_pinnacle.cpp => src/server/scripts/Northrend/UtgardeKeep/utgarde_pinnacle/instance_pinnacle.cpp rename : src/server/scripts/Northrend/utgarde_keep/utgarde_pinnacle/utgarde_pinnacle.h => src/server/scripts/Northrend/UtgardeKeep/utgarde_pinnacle/utgarde_pinnacle.h rename : src/server/scripts/Northrend/vault_of_archavon/boss_archavon.cpp => src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp rename : src/server/scripts/Northrend/vault_of_archavon/boss_emalon.cpp => src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp rename : src/server/scripts/Northrend/vault_of_archavon/boss_koralon.cpp => src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp rename : src/server/scripts/Northrend/vault_of_archavon/boss_toravon.cpp => src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp rename : src/server/scripts/Northrend/vault_of_archavon/instance_vault_of_archavon.cpp => src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp rename : src/server/scripts/Northrend/vault_of_archavon/vault_of_archavon.h => src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h rename : src/server/scripts/Northrend/violet_hold/boss_cyanigosa.cpp => src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp rename : src/server/scripts/Northrend/violet_hold/boss_erekem.cpp => src/server/scripts/Northrend/VioletHold/boss_erekem.cpp rename : src/server/scripts/Northrend/violet_hold/boss_ichoron.cpp => src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp rename : src/server/scripts/Northrend/violet_hold/boss_lavanthor.cpp => src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp rename : src/server/scripts/Northrend/violet_hold/boss_moragg.cpp => src/server/scripts/Northrend/VioletHold/boss_moragg.cpp rename : src/server/scripts/Northrend/violet_hold/boss_xevozz.cpp => src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp rename : src/server/scripts/Northrend/violet_hold/boss_zuramat.cpp => src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp rename : src/server/scripts/Northrend/violet_hold/instance_violet_hold.cpp => src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp rename : src/server/scripts/Northrend/violet_hold/violet_hold.cpp => src/server/scripts/Northrend/VioletHold/violet_hold.cpp rename : src/server/scripts/Northrend/violet_hold/violet_hold.h => src/server/scripts/Northrend/VioletHold/violet_hold.h rename : src/server/scripts/Outland/auchindoun/auchenai_crypts/boss_exarch_maladaar.cpp => src/server/scripts/Outland/Auchindoun/auchenai_crypts/boss_exarch_maladaar.cpp rename : src/server/scripts/Outland/auchindoun/auchenai_crypts/boss_shirrak_the_dead_watcher.cpp => src/server/scripts/Outland/Auchindoun/auchenai_crypts/boss_shirrak_the_dead_watcher.cpp rename : src/server/scripts/Outland/auchindoun/mana_tombs/boss_nexusprince_shaffar.cpp => src/server/scripts/Outland/Auchindoun/mana_tombs/boss_nexusprince_shaffar.cpp rename : src/server/scripts/Outland/auchindoun/mana_tombs/boss_pandemonius.cpp => src/server/scripts/Outland/Auchindoun/mana_tombs/boss_pandemonius.cpp rename : src/server/scripts/Outland/auchindoun/sethekk_halls/boss_darkweaver_syth.cpp => src/server/scripts/Outland/Auchindoun/sethekk_halls/boss_darkweaver_syth.cpp rename : src/server/scripts/Outland/auchindoun/sethekk_halls/boss_tailonking_ikiss.cpp => src/server/scripts/Outland/Auchindoun/sethekk_halls/boss_tailonking_ikiss.cpp rename : src/server/scripts/Outland/auchindoun/sethekk_halls/instance_sethekk_halls.cpp => src/server/scripts/Outland/Auchindoun/sethekk_halls/instance_sethekk_halls.cpp rename : src/server/scripts/Outland/auchindoun/sethekk_halls/sethekk_halls.h => src/server/scripts/Outland/Auchindoun/sethekk_halls/sethekk_halls.h rename : src/server/scripts/Outland/auchindoun/shadow_labyrinth/boss_ambassador_hellmaw.cpp => src/server/scripts/Outland/Auchindoun/shadow_labyrinth/boss_ambassador_hellmaw.cpp rename : src/server/scripts/Outland/auchindoun/shadow_labyrinth/boss_blackheart_the_inciter.cpp => src/server/scripts/Outland/Auchindoun/shadow_labyrinth/boss_blackheart_the_inciter.cpp rename : src/server/scripts/Outland/auchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp => src/server/scripts/Outland/Auchindoun/shadow_labyrinth/boss_grandmaster_vorpil.cpp rename : src/server/scripts/Outland/auchindoun/shadow_labyrinth/boss_murmur.cpp => src/server/scripts/Outland/Auchindoun/shadow_labyrinth/boss_murmur.cpp rename : src/server/scripts/Outland/auchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp => src/server/scripts/Outland/Auchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp rename : src/server/scripts/Outland/auchindoun/shadow_labyrinth/shadow_labyrinth.h => src/server/scripts/Outland/Auchindoun/shadow_labyrinth/shadow_labyrinth.h rename : src/server/scripts/Outland/black_temple/black_temple.cpp => src/server/scripts/Outland/BlackTemple/black_temple.cpp rename : src/server/scripts/Outland/black_temple/black_temple.h => src/server/scripts/Outland/BlackTemple/black_temple.h rename : src/server/scripts/Outland/black_temple/boss_bloodboil.cpp => src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp rename : src/server/scripts/Outland/black_temple/boss_illidan.cpp => src/server/scripts/Outland/BlackTemple/boss_illidan.cpp rename : src/server/scripts/Outland/black_temple/boss_mother_shahraz.cpp => src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp rename : src/server/scripts/Outland/black_temple/boss_reliquary_of_souls.cpp => src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp rename : src/server/scripts/Outland/black_temple/boss_shade_of_akama.cpp => src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp rename : src/server/scripts/Outland/black_temple/boss_supremus.cpp => src/server/scripts/Outland/BlackTemple/boss_supremus.cpp rename : src/server/scripts/Outland/black_temple/boss_teron_gorefiend.cpp => src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp rename : src/server/scripts/Outland/black_temple/boss_warlord_najentus.cpp => src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp rename : src/server/scripts/Outland/black_temple/illidari_council.cpp => src/server/scripts/Outland/BlackTemple/illidari_council.cpp rename : src/server/scripts/Outland/black_temple/instance_black_temple.cpp => src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp rename : src/server/scripts/Outland/coilfang_resevoir/serpent_shrine/boss_fathomlord_karathress.cpp => src/server/scripts/Outland/CoilfangReservoir/serpent_shrine/boss_fathomlord_karathress.cpp rename : src/server/scripts/Outland/coilfang_resevoir/serpent_shrine/boss_hydross_the_unstable.cpp => src/server/scripts/Outland/CoilfangReservoir/serpent_shrine/boss_hydross_the_unstable.cpp rename : src/server/scripts/Outland/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp => src/server/scripts/Outland/CoilfangReservoir/serpent_shrine/boss_lady_vashj.cpp rename : src/server/scripts/Outland/coilfang_resevoir/serpent_shrine/boss_leotheras_the_blind.cpp => src/server/scripts/Outland/CoilfangReservoir/serpent_shrine/boss_leotheras_the_blind.cpp rename : src/server/scripts/Outland/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp => src/server/scripts/Outland/CoilfangReservoir/serpent_shrine/boss_lurker_below.cpp rename : src/server/scripts/Outland/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp => src/server/scripts/Outland/CoilfangReservoir/serpent_shrine/boss_morogrim_tidewalker.cpp rename : src/server/scripts/Outland/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp => src/server/scripts/Outland/CoilfangReservoir/serpent_shrine/instance_serpent_shrine.cpp rename : src/server/scripts/Outland/coilfang_resevoir/serpent_shrine/serpent_shrine.h => src/server/scripts/Outland/CoilfangReservoir/serpent_shrine/serpent_shrine.h rename : src/server/scripts/Outland/coilfang_resevoir/steam_vault/boss_hydromancer_thespia.cpp => src/server/scripts/Outland/CoilfangReservoir/steam_vault/boss_hydromancer_thespia.cpp rename : src/server/scripts/Outland/coilfang_resevoir/steam_vault/boss_mekgineer_steamrigger.cpp => src/server/scripts/Outland/CoilfangReservoir/steam_vault/boss_mekgineer_steamrigger.cpp rename : src/server/scripts/Outland/coilfang_resevoir/steam_vault/boss_warlord_kalithresh.cpp => src/server/scripts/Outland/CoilfangReservoir/steam_vault/boss_warlord_kalithresh.cpp rename : src/server/scripts/Outland/coilfang_resevoir/steam_vault/instance_steam_vault.cpp => src/server/scripts/Outland/CoilfangReservoir/steam_vault/instance_steam_vault.cpp rename : src/server/scripts/Outland/coilfang_resevoir/steam_vault/steam_vault.h => src/server/scripts/Outland/CoilfangReservoir/steam_vault/steam_vault.h rename : src/server/scripts/Outland/coilfang_resevoir/underbog/boss_hungarfen.cpp => src/server/scripts/Outland/CoilfangReservoir/underbog/boss_hungarfen.cpp rename : src/server/scripts/Outland/coilfang_resevoir/underbog/boss_the_black_stalker.cpp => src/server/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp rename : src/server/scripts/Outland/gruuls_lair/boss_gruul.cpp => src/server/scripts/Outland/GruulsLair/boss_gruul.cpp rename : src/server/scripts/Outland/gruuls_lair/boss_high_king_maulgar.cpp => src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp rename : src/server/scripts/Outland/gruuls_lair/gruuls_lair.h => src/server/scripts/Outland/GruulsLair/gruuls_lair.h rename : src/server/scripts/Outland/gruuls_lair/instance_gruuls_lair.cpp => src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp rename : src/server/scripts/Outland/hellfire_citadel/blood_furnace/blood_furnace.h => src/server/scripts/Outland/HellfireCitadel/blood_furnace/blood_furnace.h rename : src/server/scripts/Outland/hellfire_citadel/blood_furnace/boss_broggok.cpp => src/server/scripts/Outland/HellfireCitadel/blood_furnace/boss_broggok.cpp rename : src/server/scripts/Outland/hellfire_citadel/blood_furnace/boss_kelidan_the_breaker.cpp => src/server/scripts/Outland/HellfireCitadel/blood_furnace/boss_kelidan_the_breaker.cpp rename : src/server/scripts/Outland/hellfire_citadel/blood_furnace/boss_the_maker.cpp => src/server/scripts/Outland/HellfireCitadel/blood_furnace/boss_the_maker.cpp rename : src/server/scripts/Outland/hellfire_citadel/blood_furnace/instance_blood_furnace.cpp => src/server/scripts/Outland/HellfireCitadel/blood_furnace/instance_blood_furnace.cpp rename : src/server/scripts/Outland/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp => src/server/scripts/Outland/HellfireCitadel/hellfire_ramparts/boss_omor_the_unscarred.cpp rename : src/server/scripts/Outland/hellfire_citadel/hellfire_ramparts/boss_vazruden_the_herald.cpp => src/server/scripts/Outland/HellfireCitadel/hellfire_ramparts/boss_vazruden_the_herald.cpp rename : src/server/scripts/Outland/hellfire_citadel/hellfire_ramparts/boss_watchkeeper_gargolmar.cpp => src/server/scripts/Outland/HellfireCitadel/hellfire_ramparts/boss_watchkeeper_gargolmar.cpp rename : src/server/scripts/Outland/hellfire_citadel/hellfire_ramparts/hellfire_ramparts.h => src/server/scripts/Outland/HellfireCitadel/hellfire_ramparts/hellfire_ramparts.h rename : src/server/scripts/Outland/hellfire_citadel/hellfire_ramparts/instance_hellfire_ramparts.cpp => src/server/scripts/Outland/HellfireCitadel/hellfire_ramparts/instance_hellfire_ramparts.cpp rename : src/server/scripts/Outland/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp => src/server/scripts/Outland/HellfireCitadel/magtheridons_lair/boss_magtheridon.cpp rename : src/server/scripts/Outland/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp => src/server/scripts/Outland/HellfireCitadel/magtheridons_lair/instance_magtheridons_lair.cpp rename : src/server/scripts/Outland/hellfire_citadel/magtheridons_lair/magtheridons_lair.h => src/server/scripts/Outland/HellfireCitadel/magtheridons_lair/magtheridons_lair.h rename : src/server/scripts/Outland/hellfire_citadel/shattered_halls/boss_nethekurse.cpp => src/server/scripts/Outland/HellfireCitadel/shattered_halls/boss_nethekurse.cpp rename : src/server/scripts/Outland/hellfire_citadel/shattered_halls/boss_warbringer_omrogg.cpp => src/server/scripts/Outland/HellfireCitadel/shattered_halls/boss_warbringer_omrogg.cpp rename : src/server/scripts/Outland/hellfire_citadel/shattered_halls/boss_warchief_kargath_bladefist.cpp => src/server/scripts/Outland/HellfireCitadel/shattered_halls/boss_warchief_kargath_bladefist.cpp rename : src/server/scripts/Outland/hellfire_citadel/shattered_halls/instance_shattered_halls.cpp => src/server/scripts/Outland/HellfireCitadel/shattered_halls/instance_shattered_halls.cpp rename : src/server/scripts/Outland/hellfire_citadel/shattered_halls/shattered_halls.h => src/server/scripts/Outland/HellfireCitadel/shattered_halls/shattered_halls.h rename : src/server/scripts/Outland/tempest_keep/arcatraz/arcatraz.cpp => src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp rename : src/server/scripts/Outland/tempest_keep/arcatraz/arcatraz.h => src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h rename : src/server/scripts/Outland/tempest_keep/arcatraz/boss_harbinger_skyriss.cpp => src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp rename : src/server/scripts/Outland/tempest_keep/arcatraz/instance_arcatraz.cpp => src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp rename : src/server/scripts/Outland/tempest_keep/botanica/boss_high_botanist_freywinn.cpp => src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp rename : src/server/scripts/Outland/tempest_keep/botanica/boss_laj.cpp => src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp rename : src/server/scripts/Outland/tempest_keep/botanica/boss_warp_splinter.cpp => src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp rename : src/server/scripts/Outland/tempest_keep/the_eye/boss_alar.cpp => src/server/scripts/Outland/TempestKeep/the_eye/boss_alar.cpp rename : src/server/scripts/Outland/tempest_keep/the_eye/boss_astromancer.cpp => src/server/scripts/Outland/TempestKeep/the_eye/boss_astromancer.cpp rename : src/server/scripts/Outland/tempest_keep/the_eye/boss_kaelthas.cpp => src/server/scripts/Outland/TempestKeep/the_eye/boss_kaelthas.cpp rename : src/server/scripts/Outland/tempest_keep/the_eye/boss_void_reaver.cpp => src/server/scripts/Outland/TempestKeep/the_eye/boss_void_reaver.cpp rename : src/server/scripts/Outland/tempest_keep/the_eye/instance_the_eye.cpp => src/server/scripts/Outland/TempestKeep/the_eye/instance_the_eye.cpp rename : src/server/scripts/Outland/tempest_keep/the_eye/the_eye.cpp => src/server/scripts/Outland/TempestKeep/the_eye/the_eye.cpp rename : src/server/scripts/Outland/tempest_keep/the_eye/the_eye.h => src/server/scripts/Outland/TempestKeep/the_eye/the_eye.h rename : src/server/scripts/Outland/tempest_keep/the_mechanar/boss_gatewatcher_gyrokill.cpp => src/server/scripts/Outland/TempestKeep/the_mechanar/boss_gatewatcher_gyrokill.cpp rename : src/server/scripts/Outland/tempest_keep/the_mechanar/boss_gatewatcher_ironhand.cpp => src/server/scripts/Outland/TempestKeep/the_mechanar/boss_gatewatcher_ironhand.cpp rename : src/server/scripts/Outland/tempest_keep/the_mechanar/boss_nethermancer_sepethrea.cpp => src/server/scripts/Outland/TempestKeep/the_mechanar/boss_nethermancer_sepethrea.cpp rename : src/server/scripts/Outland/tempest_keep/the_mechanar/boss_pathaleon_the_calculator.cpp => src/server/scripts/Outland/TempestKeep/the_mechanar/boss_pathaleon_the_calculator.cpp rename : src/server/scripts/Outland/tempest_keep/the_mechanar/instance_mechanar.cpp => src/server/scripts/Outland/TempestKeep/the_mechanar/instance_mechanar.cpp rename : src/server/scripts/Outland/tempest_keep/the_mechanar/mechanar.h => src/server/scripts/Outland/TempestKeep/the_mechanar/mechanar.h
Diffstat (limited to 'src/server/scripts/Outland/TempestKeep')
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp520
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h21
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp293
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp240
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp191
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp205
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp216
-rw-r--r--src/server/scripts/Outland/TempestKeep/the_eye/boss_alar.cpp523
-rw-r--r--src/server/scripts/Outland/TempestKeep/the_eye/boss_astromancer.cpp466
-rw-r--r--src/server/scripts/Outland/TempestKeep/the_eye/boss_kaelthas.cpp1498
-rw-r--r--src/server/scripts/Outland/TempestKeep/the_eye/boss_void_reaver.cpp179
-rw-r--r--src/server/scripts/Outland/TempestKeep/the_eye/instance_the_eye.cpp176
-rw-r--r--src/server/scripts/Outland/TempestKeep/the_eye/the_eye.cpp98
-rw-r--r--src/server/scripts/Outland/TempestKeep/the_eye/the_eye.h20
-rw-r--r--src/server/scripts/Outland/TempestKeep/the_mechanar/boss_gatewatcher_gyrokill.cpp39
-rw-r--r--src/server/scripts/Outland/TempestKeep/the_mechanar/boss_gatewatcher_ironhand.cpp130
-rw-r--r--src/server/scripts/Outland/TempestKeep/the_mechanar/boss_nethermancer_sepethrea.cpp245
-rw-r--r--src/server/scripts/Outland/TempestKeep/the_mechanar/boss_pathaleon_the_calculator.cpp246
-rw-r--r--src/server/scripts/Outland/TempestKeep/the_mechanar/instance_mechanar.cpp86
-rw-r--r--src/server/scripts/Outland/TempestKeep/the_mechanar/mechanar.h6
20 files changed, 5398 insertions, 0 deletions
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
new file mode 100644
index 00000000000..69dbc877d89
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
@@ -0,0 +1,520 @@
+/* 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 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Arcatraz
+SD%Complete: 60
+SDComment: Warden Mellichar, event controller for Skyriss event. Millhouse Manastorm. TODO: make better combatAI for Millhouse.
+SDCategory: Tempest Keep, The Arcatraz
+EndScriptData */
+
+/* ContentData
+npc_millhouse_manastorm
+npc_warden_mellichar
+mob_zerekethvoidzone
+EndContentData */
+
+#include "ScriptedPch.h"
+#include "arcatraz.h"
+
+/*#####
+# npc_millhouse_manastorm
+#####*/
+
+#define SAY_INTRO_1 -1552010
+#define SAY_INTRO_2 -1552011
+#define SAY_WATER -1552012
+#define SAY_BUFFS -1552013
+#define SAY_DRINK -1552014
+#define SAY_READY -1552015
+#define SAY_KILL_1 -1552016
+#define SAY_KILL_2 -1552017
+#define SAY_PYRO -1552018
+#define SAY_ICEBLOCK -1552019
+#define SAY_LOWHP -1552020
+#define SAY_DEATH -1552021
+#define SAY_COMPLETE -1552022
+
+#define SPELL_CONJURE_WATER 36879
+#define SPELL_ARCANE_INTELLECT 36880
+#define SPELL_ICE_ARMOR 36881
+
+#define SPELL_ARCANE_MISSILES 33833
+#define SPELL_CONE_OF_COLD 12611
+#define SPELL_FIRE_BLAST 13341
+#define SPELL_FIREBALL 14034
+#define SPELL_FROSTBOLT 15497
+#define SPELL_PYROBLAST 33975
+
+struct npc_millhouse_manastormAI : public ScriptedAI
+{
+ npc_millhouse_manastormAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = c->GetInstanceData();
+ }
+
+ ScriptedInstance* pInstance;
+
+ uint32 EventProgress_Timer;
+ uint32 Phase;
+ bool Init;
+ bool LowHp;
+
+ uint32 Pyroblast_Timer;
+ uint32 Fireball_Timer;
+
+ void Reset()
+ {
+ EventProgress_Timer = 2000;
+ LowHp = false;
+ Init = false;
+ Phase = 1;
+
+ Pyroblast_Timer = 1000;
+ Fireball_Timer = 2500;
+
+ if (pInstance)
+ {
+ if (pInstance->GetData(TYPE_WARDEN_2) == DONE)
+ Init = true;
+
+ if (pInstance->GetData(TYPE_HARBINGERSKYRISS) == DONE)
+ {
+ DoScriptText(SAY_COMPLETE, me);
+ }
+ }
+ }
+
+ void AttackStart(Unit* pWho)
+ {
+ if (me->Attack(pWho, true))
+ {
+ me->AddThreat(pWho, 0.0f);
+ me->SetInCombatWith(pWho);
+ pWho->SetInCombatWith(me);
+
+ me->GetMotionMaster()->MoveChase(pWho, 25.0f);
+ }
+ }
+
+ void EnterCombat(Unit * /*who*/)
+ {
+ }
+
+ void KilledUnit(Unit * /*victim*/)
+ {
+ DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2), me);
+ }
+
+ void JustDied(Unit * /*victim*/)
+ {
+ DoScriptText(SAY_DEATH, me);
+
+ /*for questId 10886 (heroic mode only)
+ if (pInstance && pInstance->GetData(TYPE_HARBINGERSKYRISS) != DONE)
+ ->FailQuest();*/
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!Init)
+ {
+ if (EventProgress_Timer <= diff)
+ {
+ if (Phase < 8)
+ {
+ switch(Phase)
+ {
+ case 1:
+ DoScriptText(SAY_INTRO_1, me);
+ EventProgress_Timer = 18000;
+ break;
+ case 2:
+ DoScriptText(SAY_INTRO_2, me);
+ EventProgress_Timer = 18000;
+ break;
+ case 3:
+ DoScriptText(SAY_WATER, me);
+ DoCast(me, SPELL_CONJURE_WATER);
+ EventProgress_Timer = 7000;
+ break;
+ case 4:
+ DoScriptText(SAY_BUFFS, me);
+ DoCast(me, SPELL_ICE_ARMOR);
+ EventProgress_Timer = 7000;
+ break;
+ case 5:
+ DoScriptText(SAY_DRINK, me);
+ DoCast(me, SPELL_ARCANE_INTELLECT);
+ EventProgress_Timer = 7000;
+ break;
+ case 6:
+ DoScriptText(SAY_READY, me);
+ EventProgress_Timer = 6000;
+ break;
+ case 7:
+ if (pInstance)
+ pInstance->SetData(TYPE_WARDEN_2,DONE);
+ Init = true;
+ break;
+ }
+ ++Phase;
+ }
+ } else EventProgress_Timer -= diff;
+ }
+
+ if (!UpdateVictim())
+ return;
+
+ if (!LowHp && ((me->GetHealth()*100 / me->GetMaxHealth()) < 20))
+ {
+ DoScriptText(SAY_LOWHP, me);
+ LowHp = true;
+ }
+
+ if (Pyroblast_Timer <= diff)
+ {
+ if (me->IsNonMeleeSpellCasted(false))
+ return;
+
+ DoScriptText(SAY_PYRO, me);
+
+ DoCast(me->getVictim(), SPELL_PYROBLAST);
+ Pyroblast_Timer = 40000;
+ } else Pyroblast_Timer -=diff;
+
+ if (Fireball_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_FIREBALL);
+ Fireball_Timer = 4000;
+ } else Fireball_Timer -=diff;
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+CreatureAI* GetAI_npc_millhouse_manastorm(Creature* pCreature)
+{
+ return new npc_millhouse_manastormAI (pCreature);
+}
+
+/*#####
+# npc_warden_mellichar
+#####*/
+
+#define YELL_INTRO1 -1552023
+#define YELL_INTRO2 -1552024
+#define YELL_RELEASE1 -1552025
+#define YELL_RELEASE2A -1552026
+#define YELL_RELEASE2B -1552027
+#define YELL_RELEASE3 -1552028
+#define YELL_RELEASE4 -1552029
+#define YELL_WELCOME -1552030
+
+//phase 2(acid mobs)
+#define ENTRY_TRICKSTER 20905
+#define ENTRY_PH_HUNTER 20906
+//phase 3
+#define ENTRY_MILLHOUSE 20977
+//phase 4(acid mobs)
+#define ENTRY_AKKIRIS 20908
+#define ENTRY_SULFURON 20909
+//phase 5(acid mobs)
+#define ENTRY_TW_DRAK 20910
+#define ENTRY_BL_DRAK 20911
+//phase 6
+#define ENTRY_SKYRISS 20912
+
+//TARGET_SCRIPT
+#define SPELL_TARGET_ALPHA 36856
+#define SPELL_TARGET_BETA 36854
+#define SPELL_TARGET_DELTA 36857
+#define SPELL_TARGET_GAMMA 36858
+#define SPELL_TARGET_OMEGA 36852
+#define SPELL_BUBBLE_VISUAL 36849
+
+struct npc_warden_mellicharAI : public ScriptedAI
+{
+ npc_warden_mellicharAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = c->GetInstanceData();
+ }
+
+ ScriptedInstance* pInstance;
+
+ bool IsRunning;
+ bool CanSpawn;
+
+ uint32 EventProgress_Timer;
+ uint32 Phase;
+
+ void Reset()
+ {
+ IsRunning = false;
+ CanSpawn = false;
+
+ EventProgress_Timer = 22000;
+ Phase = 1;
+
+ me->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE);
+ DoCast(me, SPELL_TARGET_OMEGA);
+
+ if (pInstance)
+ pInstance->SetData(TYPE_HARBINGERSKYRISS,NOT_STARTED);
+ }
+
+ void AttackStart(Unit* /*who*/) {}
+
+ void MoveInLineOfSight(Unit *who)
+ {
+ if (IsRunning)
+ return;
+
+ if (!me->getVictim() && who->isTargetableForAttack() && (me->IsHostileTo(who)) && who->isInAccessiblePlaceFor(me))
+ {
+ if (!me->canFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
+ return;
+ if (who->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ float attackRadius = me->GetAttackDistance(who)/10;
+ if (me->IsWithinDistInMap(who, attackRadius) && me->IsWithinLOSInMap(who))
+ EnterCombat(who);
+ }
+ }
+
+ void EnterCombat(Unit * /*who*/)
+ {
+ DoScriptText(YELL_INTRO1, me);
+ DoCast(me, SPELL_BUBBLE_VISUAL);
+
+ if (pInstance)
+ {
+ pInstance->SetData(TYPE_HARBINGERSKYRISS,IN_PROGRESS);
+ pInstance->HandleGameObject(pInstance->GetData64(DATA_SPHERE_SHIELD), false);
+ IsRunning = true;
+ }
+ }
+
+ bool CanProgress()
+ {
+ if (pInstance)
+ {
+ if (Phase == 7 && pInstance->GetData(TYPE_WARDEN_4) == DONE)
+ return true;
+ if (Phase == 6 && pInstance->GetData(TYPE_WARDEN_3) == DONE)
+ return true;
+ if (Phase == 5 && pInstance->GetData(TYPE_WARDEN_2) == DONE)
+ return true;
+ if (Phase == 4)
+ return true;
+ if (Phase == 3 && pInstance->GetData(TYPE_WARDEN_1) == DONE)
+ return true;
+ if (Phase == 2 && pInstance->GetData(TYPE_HARBINGERSKYRISS) == IN_PROGRESS)
+ return true;
+ if (Phase == 1 && pInstance->GetData(TYPE_HARBINGERSKYRISS) == IN_PROGRESS)
+ return true;
+ return false;
+ }
+ return false;
+ }
+
+ void DoPrepareForPhase()
+ {
+ if (pInstance)
+ {
+ me->InterruptNonMeleeSpells(true);
+ me->RemoveAurasByType(SPELL_AURA_DUMMY);
+
+ switch(Phase)
+ {
+ case 2:
+ DoCast(me, SPELL_TARGET_ALPHA);
+ pInstance->SetData(TYPE_WARDEN_1,IN_PROGRESS);
+ pInstance->HandleGameObject(pInstance->GetData64(DATA_SPHERE_SHIELD), false);
+ break;
+ case 3:
+ DoCast(me, SPELL_TARGET_BETA);
+ pInstance->SetData(TYPE_WARDEN_2,IN_PROGRESS);
+ break;
+ case 5:
+ DoCast(me, SPELL_TARGET_DELTA);
+ pInstance->SetData(TYPE_WARDEN_3,IN_PROGRESS);
+ break;
+ case 6:
+ DoCast(me, SPELL_TARGET_GAMMA);
+ pInstance->SetData(TYPE_WARDEN_4,IN_PROGRESS);
+ break;
+ case 7:
+ pInstance->SetData(TYPE_WARDEN_5,IN_PROGRESS);
+ break;
+ }
+ CanSpawn = true;
+ }
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!IsRunning)
+ return;
+
+ if (EventProgress_Timer <= diff)
+ {
+ if (pInstance)
+ {
+ if (pInstance->GetData(TYPE_HARBINGERSKYRISS) == FAIL)
+ {
+ Reset();
+ return;
+ }
+ }
+
+ if (CanSpawn)
+ {
+ //continue beam omega pod, unless we are about to summon skyriss
+ if (Phase != 7)
+ DoCast(me, SPELL_TARGET_OMEGA);
+
+ switch(Phase)
+ {
+ case 2:
+ switch (urand(0,1))
+ {
+ case 0: me->SummonCreature(ENTRY_TRICKSTER,478.326,-148.505,42.56,3.19,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,600000); break;
+ case 1: me->SummonCreature(ENTRY_PH_HUNTER,478.326,-148.505,42.56,3.19,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,600000); break;
+ }
+ break;
+ case 3:
+ me->SummonCreature(ENTRY_MILLHOUSE,413.292,-148.378,42.56,6.27,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,600000);
+ break;
+ case 4:
+ DoScriptText(YELL_RELEASE2B, me);
+ break;
+ case 5:
+ switch (urand(0,1))
+ {
+ case 0: me->SummonCreature(ENTRY_AKKIRIS,420.179,-174.396,42.58,0.02,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,600000); break;
+ case 1: me->SummonCreature(ENTRY_SULFURON,420.179,-174.396,42.58,0.02,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,600000); break;
+ }
+ break;
+ case 6:
+ switch (urand(0,1))
+ {
+ case 0: me->SummonCreature(ENTRY_TW_DRAK,471.795,-174.58,42.58,3.06,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,600000); break;
+ case 1: me->SummonCreature(ENTRY_BL_DRAK,471.795,-174.58,42.58,3.06,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,600000); break;
+ }
+ break;
+ case 7:
+ me->SummonCreature(ENTRY_SKYRISS,445.763,-191.639,44.64,1.60,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,600000);
+ DoScriptText(YELL_WELCOME, me);
+ break;
+ }
+ CanSpawn = false;
+ ++Phase;
+ }
+ if (CanProgress())
+ {
+ switch(Phase)
+ {
+ case 1:
+ DoScriptText(YELL_INTRO2, me);
+ EventProgress_Timer = 10000;
+ ++Phase;
+ break;
+ case 2:
+ DoScriptText(YELL_RELEASE1, me);
+ DoPrepareForPhase();
+ EventProgress_Timer = 7000;
+ break;
+ case 3:
+ DoScriptText(YELL_RELEASE2A, me);
+ DoPrepareForPhase();
+ EventProgress_Timer = 10000;
+ break;
+ case 4:
+ DoPrepareForPhase();
+ EventProgress_Timer = 15000;
+ break;
+ case 5:
+ DoScriptText(YELL_RELEASE3, me);
+ DoPrepareForPhase();
+ EventProgress_Timer = 15000;
+ break;
+ case 6:
+ DoScriptText(YELL_RELEASE4, me);
+ DoPrepareForPhase();
+ EventProgress_Timer = 15000;
+ break;
+ case 7:
+ DoPrepareForPhase();
+ EventProgress_Timer = 15000;
+ break;
+ }
+ }
+ } else EventProgress_Timer -= diff;
+ }
+};
+CreatureAI* GetAI_npc_warden_mellichar(Creature* pCreature)
+{
+ return new npc_warden_mellicharAI (pCreature);
+}
+
+/*#####
+# mob_zerekethvoidzone (this script probably not needed in future -> `creature_template_addon`.`auras`='36120 0')
+#####*/
+
+#define SPELL_VOID_ZONE_DAMAGE 36120
+
+struct mob_zerekethvoidzoneAI : public ScriptedAI
+{
+ mob_zerekethvoidzoneAI(Creature *c) : ScriptedAI(c) {}
+
+ void Reset()
+ {
+ me->SetUInt32Value(UNIT_NPC_FLAGS,0);
+ me->setFaction(16);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+
+ DoCast(me, SPELL_VOID_ZONE_DAMAGE);
+ }
+
+ void EnterCombat(Unit* /*who*/) {}
+};
+CreatureAI* GetAI_mob_zerekethvoidzoneAI(Creature* pCreature)
+{
+ return new mob_zerekethvoidzoneAI (pCreature);
+}
+
+void AddSC_arcatraz()
+{
+ Script *newscript;
+
+ newscript = new Script;
+ newscript->Name = "npc_millhouse_manastorm";
+ newscript->GetAI = &GetAI_npc_millhouse_manastorm;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "npc_warden_mellichar";
+ newscript->GetAI = &GetAI_npc_warden_mellichar;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "mob_zerekethvoidzone";
+ newscript->GetAI = &GetAI_mob_zerekethvoidzoneAI;
+ newscript->RegisterSelf();
+}
+
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h
new file mode 100644
index 00000000000..3f8dee8bbd0
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h
@@ -0,0 +1,21 @@
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ * This program is free software licensed under GPL version 2
+ * Please see the included DOCS/LICENSE.TXT for more information */
+
+#ifndef DEF_ARCATRAZ_H
+#define DEF_ARCATRAZ_H
+
+#define TYPE_ZEREKETH 1
+#define TYPE_DALLIAH 2
+#define TYPE_SOCCOTHRATES 3
+#define TYPE_HARBINGERSKYRISS 4
+#define TYPE_WARDEN_1 5
+#define TYPE_WARDEN_2 6
+#define TYPE_WARDEN_3 7
+#define TYPE_WARDEN_4 8
+#define TYPE_WARDEN_5 9
+#define DATA_MELLICHAR 10
+#define TYPE_SHIELD_OPEN 11
+#define DATA_SPHERE_SHIELD 12
+#endif
+
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
new file mode 100644
index 00000000000..6576974f3ff
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
@@ -0,0 +1,293 @@
+/* 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 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Boss_Harbinger_Skyriss
+SD%Complete: 45
+SDComment: CombatAI not fully implemented. Timers will need adjustments. Need more docs on how event fully work. Reset all event and force start over if fail at one point?
+SDCategory: Tempest Keep, The Arcatraz
+EndScriptData */
+
+/* ContentData
+boss_harbinger_skyriss
+boss_harbinger_skyriss_illusion
+EndContentData */
+
+#include "ScriptedPch.h"
+#include "arcatraz.h"
+
+#define SAY_INTRO -1552000
+#define SAY_AGGRO -1552001
+#define SAY_KILL_1 -1552002
+#define SAY_KILL_2 -1552003
+#define SAY_MIND_1 -1552004
+#define SAY_MIND_2 -1552005
+#define SAY_FEAR_1 -1552006
+#define SAY_FEAR_2 -1552007
+#define SAY_IMAGE -1552008
+#define SAY_DEATH -1552009
+
+#define SPELL_FEAR 39415
+
+#define SPELL_MIND_REND 36924
+#define H_SPELL_MIND_REND 39017
+
+#define SPELL_DOMINATION 37162
+#define H_SPELL_DOMINATION 39019
+
+#define H_SPELL_MANA_BURN 39020
+
+#define SPELL_66_ILLUSION 36931 //entry 21466
+#define SPELL_33_ILLUSION 36932 //entry 21467
+
+struct boss_harbinger_skyrissAI : public ScriptedAI
+{
+ boss_harbinger_skyrissAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = c->GetInstanceData();
+ Intro = false;
+ }
+
+ ScriptedInstance *pInstance;
+
+ bool Intro;
+ bool IsImage33;
+ bool IsImage66;
+
+ uint32 Intro_Phase;
+ uint32 Intro_Timer;
+ uint32 MindRend_Timer;
+ uint32 Fear_Timer;
+ uint32 Domination_Timer;
+ uint32 ManaBurn_Timer;
+
+ void Reset()
+ {
+ if (!Intro)
+ me->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_OOC_NOT_ATTACKABLE);
+
+ IsImage33 = false;
+ IsImage66 = false;
+
+ Intro_Phase = 1;
+ Intro_Timer = 5000;
+ MindRend_Timer = 3000;
+ Fear_Timer = 15000;
+ Domination_Timer = 30000;
+ ManaBurn_Timer = 25000;
+ }
+
+ void MoveInLineOfSight(Unit *who)
+ {
+ if (!Intro)
+ {
+ return;
+ }
+ ScriptedAI::MoveInLineOfSight(who);
+ }
+
+ void EnterCombat(Unit * /*who*/) {}
+
+ void JustDied(Unit* /*Killer*/)
+ {
+ DoScriptText(SAY_DEATH, me);
+ if (pInstance)
+ pInstance->SetData(TYPE_HARBINGERSKYRISS,DONE);
+ }
+
+ void JustSummoned(Creature *summon)
+ {
+ if (!summon)
+ return;
+ if (IsImage66)
+ summon->SetHealth((summon->GetMaxHealth()*33)/100);
+ else
+ summon->SetHealth((summon->GetMaxHealth()*66)/100);
+ if (me->getVictim())
+ if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ summon->AI()->AttackStart(pTarget);
+ }
+
+ void KilledUnit(Unit* victim)
+ {
+ //won't yell killing pet/other unit
+ if (victim->GetEntry() == 21436)
+ return;
+
+ DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2), me);
+ }
+
+ void DoSplit(uint32 val)
+ {
+ if (me->IsNonMeleeSpellCasted(false))
+ me->InterruptNonMeleeSpells(false);
+
+ DoScriptText(SAY_IMAGE, me);
+
+ if (val == 66)
+ DoCast(me, SPELL_66_ILLUSION);
+ else
+ DoCast(me, SPELL_33_ILLUSION);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!Intro)
+ {
+ if (!pInstance)
+ return;
+
+ if (Intro_Timer <= diff)
+ {
+ switch(Intro_Phase)
+ {
+ case 1:
+ DoScriptText(SAY_INTRO, me);
+ pInstance->HandleGameObject(pInstance->GetData64(DATA_SPHERE_SHIELD), true);
+ ++Intro_Phase;
+ Intro_Timer = 25000;
+ break;
+ case 2:
+ DoScriptText(SAY_AGGRO, me);
+ if (Unit *mellic = Unit::GetUnit(*me,pInstance->GetData64(DATA_MELLICHAR)))
+ {
+ //should have a better way to do this. possibly spell exist.
+ mellic->setDeathState(JUST_DIED);
+ mellic->SetHealth(0);
+ pInstance->SetData(TYPE_SHIELD_OPEN,IN_PROGRESS);
+ }
+ ++Intro_Phase;
+ Intro_Timer = 3000;
+ break;
+ case 3:
+ me->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_OOC_NOT_ATTACKABLE);
+ Intro = true;
+ break;
+ }
+ } else Intro_Timer -=diff;
+ }
+
+ if (!UpdateVictim())
+ return;
+
+ if (!IsImage66 && ((me->GetHealth()*100) / me->GetMaxHealth() <= 66))
+ {
+ DoSplit(66);
+ IsImage66 = true;
+ }
+ if (!IsImage33 && ((me->GetHealth()*100) / me->GetMaxHealth() <= 33))
+ {
+ DoSplit(33);
+ IsImage33 = true;
+ }
+
+ if (MindRend_Timer <= diff)
+ {
+ if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,1))
+ DoCast(pTarget, SPELL_MIND_REND);
+ else
+ DoCast(me->getVictim(), SPELL_MIND_REND);
+
+ MindRend_Timer = 8000;
+ } else MindRend_Timer -=diff;
+
+ if (Fear_Timer <= diff)
+ {
+ if (me->IsNonMeleeSpellCasted(false))
+ return;
+
+ DoScriptText(RAND(SAY_FEAR_1,SAY_FEAR_2), me);
+
+ if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,1))
+ DoCast(pTarget, SPELL_FEAR);
+ else
+ DoCast(me->getVictim(), SPELL_FEAR);
+
+ Fear_Timer = 25000;
+ } else Fear_Timer -=diff;
+
+ if (Domination_Timer <= diff)
+ {
+ if (me->IsNonMeleeSpellCasted(false))
+ return;
+
+ DoScriptText(RAND(SAY_MIND_1,SAY_MIND_2), me);
+
+ if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,1))
+ DoCast(pTarget, SPELL_DOMINATION);
+ else
+ DoCast(me->getVictim(), SPELL_DOMINATION);
+
+ Domination_Timer = 16000+rand()%16000;
+ } else Domination_Timer -=diff;
+
+ if (IsHeroic())
+ {
+ if (ManaBurn_Timer <= diff)
+ {
+ if (me->IsNonMeleeSpellCasted(false))
+ return;
+
+ if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,1))
+ DoCast(pTarget, H_SPELL_MANA_BURN);
+
+ ManaBurn_Timer = 16000+rand()%16000;
+ } else ManaBurn_Timer -=diff;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+CreatureAI* GetAI_boss_harbinger_skyriss(Creature* pCreature)
+{
+ return new boss_harbinger_skyrissAI (pCreature);
+}
+
+#define SPELL_MIND_REND_IMAGE 36929
+#define H_SPELL_MIND_REND_IMAGE 39021
+
+struct boss_harbinger_skyriss_illusionAI : public ScriptedAI
+{
+ boss_harbinger_skyriss_illusionAI(Creature *c) : ScriptedAI(c)
+ {
+ }
+
+ void Reset() { }
+
+ void EnterCombat(Unit * /*who*/) { }
+};
+
+CreatureAI* GetAI_boss_harbinger_skyriss_illusion(Creature* pCreature)
+{
+ return new boss_harbinger_skyriss_illusionAI (pCreature);
+}
+
+void AddSC_boss_harbinger_skyriss()
+{
+ Script *newscript;
+
+ newscript = new Script;
+ newscript->Name = "boss_harbinger_skyriss";
+ newscript->GetAI = &GetAI_boss_harbinger_skyriss;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "boss_harbinger_skyriss_illusion";
+ newscript->GetAI = &GetAI_boss_harbinger_skyriss_illusion;
+ newscript->RegisterSelf();
+}
+
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
new file mode 100644
index 00000000000..d16975e2af6
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
@@ -0,0 +1,240 @@
+/* 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 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Instance_Arcatraz
+SD%Complete: 80
+SDComment: Mainly Harbringer Skyriss event
+SDCategory: Tempest Keep, The Arcatraz
+EndScriptData */
+
+#include "ScriptedPch.h"
+#include "arcatraz.h"
+
+#define MAX_ENCOUNTER 9
+
+#define CONTAINMENT_CORE_SECURITY_FIELD_ALPHA 184318 //door opened when Wrath-Scryer Soccothrates dies
+#define CONTAINMENT_CORE_SECURITY_FIELD_BETA 184319 //door opened when Dalliah the Doomsayer dies
+#define POD_ALPHA 183961 //pod first boss wave
+#define POD_BETA 183963 //pod second boss wave
+#define POD_DELTA 183964 //pod third boss wave
+#define POD_GAMMA 183962 //pod fourth boss wave
+#define POD_OMEGA 183965 //pod fifth boss wave
+#define WARDENS_SHIELD 184802 // warden shield
+#define SEAL_SPHERE 184802 //shield 'protecting' mellichar
+
+#define MELLICHAR 20904 //skyriss will kill this unit
+
+/* Arcatraz encounters:
+1 - Zereketh the Unbound event
+2 - Dalliah the Doomsayer event
+3 - Wrath-Scryer Soccothrates event
+4 - Harbinger Skyriss event, 5 sub-events
+*/
+
+struct instance_arcatraz : public ScriptedInstance
+{
+ instance_arcatraz(Map* pMap) : ScriptedInstance(pMap) {Initialize();};
+
+ uint32 m_auiEncounter[MAX_ENCOUNTER];
+
+ uint64 Containment_Core_Security_Field_AlphaGUID;
+ uint64 Containment_Core_Security_Field_BetaGUID;
+ uint64 Pod_AlphaGUID;
+ uint64 Pod_GammaGUID;
+ uint64 Pod_BetaGUID;
+ uint64 Pod_DeltaGUID;
+ uint64 Pod_OmegaGUID;
+ uint64 Wardens_ShieldGUID;
+ uint64 GoSphereGUID;
+ uint64 MellicharGUID;
+
+ void Initialize()
+ {
+ memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
+
+ Containment_Core_Security_Field_AlphaGUID = 0;
+ Containment_Core_Security_Field_BetaGUID = 0;
+ Pod_AlphaGUID = 0;
+ Pod_GammaGUID = 0;
+ Pod_BetaGUID = 0;
+ Pod_DeltaGUID = 0;
+ Pod_OmegaGUID = 0;
+ Wardens_ShieldGUID = 0;
+ GoSphereGUID = 0;
+ MellicharGUID = 0;
+ }
+
+ bool IsEncounterInProgress() const
+ {
+ for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+ if (m_auiEncounter[i] == IN_PROGRESS) return true;
+
+ return false;
+ }
+
+ void OnGameObjectCreate(GameObject* pGo, bool /*add*/)
+ {
+ switch(pGo->GetEntry())
+ {
+ case CONTAINMENT_CORE_SECURITY_FIELD_ALPHA: Containment_Core_Security_Field_AlphaGUID = pGo->GetGUID(); break;
+ case CONTAINMENT_CORE_SECURITY_FIELD_BETA: Containment_Core_Security_Field_BetaGUID = pGo->GetGUID(); break;
+ case POD_ALPHA: Pod_AlphaGUID = pGo->GetGUID(); break;
+ case POD_GAMMA: Pod_GammaGUID = pGo->GetGUID(); break;
+ case POD_BETA: Pod_BetaGUID = pGo->GetGUID(); break;
+ case POD_DELTA: Pod_DeltaGUID = pGo->GetGUID(); break;
+ case POD_OMEGA: Pod_OmegaGUID = pGo->GetGUID(); break;
+ case SEAL_SPHERE: GoSphereGUID = pGo->GetGUID(); break;
+ //case WARDENS_SHIELD: Wardens_ShieldGUID = pGo->GetGUID(); break;
+ }
+ }
+
+ void OnCreatureCreate(Creature* pCreature, bool /*add*/)
+ {
+ if (pCreature->GetEntry() == MELLICHAR)
+ MellicharGUID = pCreature->GetGUID();
+ }
+
+ void SetData(uint32 type, uint32 data)
+ {
+ switch(type)
+ {
+ case TYPE_ZEREKETH:
+ m_auiEncounter[0] = data;
+ break;
+
+ case TYPE_DALLIAH:
+ if (data == DONE)
+ {
+ if (GameObject *pGo = instance->GetGameObject(Containment_Core_Security_Field_BetaGUID))
+ pGo->UseDoorOrButton();
+ }
+ m_auiEncounter[1] = data;
+ break;
+
+ case TYPE_SOCCOTHRATES:
+ if (data == DONE)
+ {
+ if (GameObject *pGo = instance->GetGameObject(Containment_Core_Security_Field_AlphaGUID))
+ pGo->UseDoorOrButton();
+ }
+ m_auiEncounter[2] = data;
+ break;
+
+ case TYPE_HARBINGERSKYRISS:
+ if (data == NOT_STARTED || data == FAIL)
+ {
+ m_auiEncounter[4] = NOT_STARTED;
+ m_auiEncounter[5] = NOT_STARTED;
+ m_auiEncounter[6] = NOT_STARTED;
+ m_auiEncounter[7] = NOT_STARTED;
+ m_auiEncounter[8] = NOT_STARTED;
+ }
+ m_auiEncounter[3] = data;
+ break;
+
+ case TYPE_WARDEN_1:
+ if (data == IN_PROGRESS)
+ if (GameObject *pGo = instance->GetGameObject(Pod_AlphaGUID))
+ pGo->UseDoorOrButton();
+ m_auiEncounter[4] = data;
+ break;
+
+ case TYPE_WARDEN_2:
+ if (data == IN_PROGRESS)
+ {
+ if (GameObject *pGo = instance->GetGameObject(Pod_BetaGUID))
+ pGo->UseDoorOrButton();
+ }
+ m_auiEncounter[5] = data;
+ break;
+
+ case TYPE_WARDEN_3:
+ if (data == IN_PROGRESS)
+ {
+ if (GameObject *pGo = instance->GetGameObject(Pod_DeltaGUID))
+ pGo->UseDoorOrButton();
+ }
+ m_auiEncounter[6] = data;
+ break;
+
+ case TYPE_WARDEN_4:
+ if (data == IN_PROGRESS)
+ {
+ if (GameObject *pGo = instance->GetGameObject(Pod_GammaGUID))
+ pGo->UseDoorOrButton();
+ }
+ m_auiEncounter[7] = data;
+ break;
+
+ case TYPE_WARDEN_5:
+ if (data == IN_PROGRESS)
+ {
+ if (GameObject *pGo = instance->GetGameObject(Pod_OmegaGUID))
+ pGo->UseDoorOrButton();
+ }
+ m_auiEncounter[8] = data;
+ break;
+
+ case TYPE_SHIELD_OPEN:
+ if (data == IN_PROGRESS)
+ {
+ if (GameObject *pGo = instance->GetGameObject(Wardens_ShieldGUID))
+ pGo->UseDoorOrButton();
+ }
+ break;
+ }
+ }
+
+ uint32 GetData(uint32 type)
+ {
+ switch(type)
+ {
+ case TYPE_HARBINGERSKYRISS: return m_auiEncounter[3];
+ case TYPE_WARDEN_1: return m_auiEncounter[4];
+ case TYPE_WARDEN_2: return m_auiEncounter[5];
+ case TYPE_WARDEN_3: return m_auiEncounter[6];
+ case TYPE_WARDEN_4: return m_auiEncounter[7];
+ case TYPE_WARDEN_5: return m_auiEncounter[8];
+ }
+ return 0;
+ }
+
+ uint64 GetData64(uint32 data)
+ {
+ switch(data)
+ {
+ case DATA_MELLICHAR: return MellicharGUID;
+ case DATA_SPHERE_SHIELD: return GoSphereGUID;
+ }
+ return 0;
+ }
+};
+
+InstanceData* GetInstanceData_instance_arcatraz(Map* pMap)
+{
+ return new instance_arcatraz(pMap);
+}
+
+void AddSC_instance_arcatraz()
+{
+ Script *newscript;
+ newscript = new Script;
+ newscript->Name = "instance_arcatraz";
+ newscript->GetInstanceData = &GetInstanceData_instance_arcatraz;
+ newscript->RegisterSelf();
+}
+
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
new file mode 100644
index 00000000000..1a077036298
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
@@ -0,0 +1,191 @@
+/* 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 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Boss_High_Botanist_Freywinn
+SD%Complete: 90
+SDComment: some strange visual related to tree form(if aura lost before normal duration end). possible make summon&transform -process smoother(transform after delay)
+SDCategory: Tempest Keep, The Botanica
+EndScriptData */
+
+#include "ScriptedPch.h"
+
+#define SAY_AGGRO -1553000
+#define SAY_KILL_1 -1553001
+#define SAY_KILL_2 -1553002
+#define SAY_TREE_1 -1553003
+#define SAY_TREE_2 -1553004
+#define SAY_DEATH -1553005
+
+#define SPELL_TRANQUILITY 34550
+#define SPELL_TREE_FORM 34551
+
+#define SPELL_SUMMON_FRAYER 34557
+#define ENTRY_FRAYER 19953
+
+#define SPELL_PLANT_WHITE 34759
+#define SPELL_PLANT_GREEN 34761
+#define SPELL_PLANT_BLUE 34762
+#define SPELL_PLANT_RED 34763
+
+struct boss_high_botanist_freywinnAI : public ScriptedAI
+{
+ boss_high_botanist_freywinnAI(Creature *c) : ScriptedAI(c) {}
+
+ std::list<uint64> Adds_List;
+
+ uint32 SummonSeedling_Timer;
+ uint32 TreeForm_Timer;
+ uint32 MoveCheck_Timer;
+ uint32 DeadAddsCount;
+ bool MoveFree;
+
+ void Reset()
+ {
+ Adds_List.clear();
+
+ SummonSeedling_Timer = 6000;
+ TreeForm_Timer = 30000;
+ MoveCheck_Timer = 1000;
+ DeadAddsCount = 0;
+ MoveFree = true;
+ }
+
+ void EnterCombat(Unit * /*who*/)
+ {
+ DoScriptText(SAY_AGGRO, me);
+ }
+
+ void JustSummoned(Creature *summoned)
+ {
+ if (summoned->GetEntry() == ENTRY_FRAYER)
+ Adds_List.push_back(summoned->GetGUID());
+ }
+
+ void DoSummonSeedling()
+ {
+ switch(rand()%4)
+ {
+ case 0: DoCast(me, SPELL_PLANT_WHITE); break;
+ case 1: DoCast(me, SPELL_PLANT_GREEN); break;
+ case 2: DoCast(me, SPELL_PLANT_BLUE); break;
+ case 3: DoCast(me, SPELL_PLANT_RED); break;
+ }
+ }
+
+ void KilledUnit(Unit* /*victim*/)
+ {
+ DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2), me);
+ }
+
+ void JustDied(Unit* /*Killer*/)
+ {
+ DoScriptText(SAY_DEATH, me);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (TreeForm_Timer <= diff)
+ {
+ DoScriptText(RAND(SAY_TREE_1,SAY_TREE_2), me);
+
+ if (me->IsNonMeleeSpellCasted(false))
+ me->InterruptNonMeleeSpells(true);
+
+ me->RemoveAllAuras();
+
+ DoCast(me, SPELL_SUMMON_FRAYER, true);
+ DoCast(me, SPELL_TRANQUILITY, true);
+ DoCast(me, SPELL_TREE_FORM, true);
+
+ me->GetMotionMaster()->MoveIdle();
+ MoveFree = false;
+
+ TreeForm_Timer = 75000;
+ } else TreeForm_Timer -= diff;
+
+ if (!MoveFree)
+ {
+ if (MoveCheck_Timer <= diff)
+ {
+ if (!Adds_List.empty())
+ {
+ for (std::list<uint64>::iterator itr = Adds_List.begin(); itr != Adds_List.end(); ++itr)
+ {
+ if (Unit *temp = Unit::GetUnit(*me,*itr))
+ {
+ if (!temp->isAlive())
+ {
+ Adds_List.erase(itr);
+ ++DeadAddsCount;
+ break;
+ }
+ }
+ }
+ }
+
+ if (DeadAddsCount < 3 && TreeForm_Timer-30000 <= diff)
+ DeadAddsCount = 3;
+
+ if (DeadAddsCount >= 3)
+ {
+ Adds_List.clear();
+ DeadAddsCount = 0;
+
+ me->InterruptNonMeleeSpells(true);
+ me->RemoveAllAuras();
+ me->GetMotionMaster()->MoveChase(me->getVictim());
+ MoveFree = true;
+ }
+ MoveCheck_Timer = 500;
+ }
+ else MoveCheck_Timer -= diff;
+
+ return;
+ }
+
+ /*if (me->HasAura(SPELL_TREE_FORM,0) || me->HasAura(SPELL_TRANQUILITY,0))
+ return;*/
+
+ //one random seedling every 5 secs, but not in tree form
+ if (SummonSeedling_Timer <= diff)
+ {
+ DoSummonSeedling();
+ SummonSeedling_Timer = 6000;
+ } else SummonSeedling_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+CreatureAI* GetAI_boss_high_botanist_freywinn(Creature* pCreature)
+{
+ return new boss_high_botanist_freywinnAI (pCreature);
+}
+
+void AddSC_boss_high_botanist_freywinn()
+{
+ Script *newscript;
+
+ newscript = new Script;
+ newscript->Name = "boss_high_botanist_freywinn";
+ newscript->GetAI = &GetAI_boss_high_botanist_freywinn;
+ newscript->RegisterSelf();
+}
+
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp
new file mode 100644
index 00000000000..cbf21c2f992
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp
@@ -0,0 +1,205 @@
+/* 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 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Boss_Laj
+SD%Complete: 90
+SDComment: Immunities are wrong, must be adjusted to use resistance from creature_templates. Most spells require database support.
+SDCategory: Tempest Keep, The Botanica
+EndScriptData */
+
+#include "ScriptedPch.h"
+
+#define EMOTE_SUMMON -1553006
+
+#define SPELL_ALLERGIC_REACTION 34697
+#define SPELL_TELEPORT_SELF 34673
+
+#define SPELL_SUMMON_LASHER_1 34681
+#define SPELL_SUMMON_FLAYER_1 34682
+#define SPELL_SUMMON_LASHER_2 34684
+#define SPELL_SUMMON_FLAYER_2 34685
+#define SPELL_SUMMON_LASHER_3 34686
+#define SPELL_SUMMON_FLAYER_4 34687
+#define SPELL_SUMMON_LASHER_4 34688
+#define SPELL_SUMMON_FLAYER_3 34690
+
+#define MODEL_DEFAULT 13109
+#define MODEL_ARCANE 14213
+#define MODEL_FIRE 13110
+#define MODEL_FROST 14112
+#define MODEL_NATURE 14214
+
+struct boss_lajAI : public ScriptedAI
+{
+ boss_lajAI(Creature *c) : ScriptedAI(c) {}
+
+ bool CanSummon;
+ uint32 Teleport_Timer;
+ uint32 Summon_Timer;
+ uint32 Transform_Timer;
+ uint32 Allergic_Timer;
+
+ void Reset()
+ {
+ me->SetDisplayId(MODEL_DEFAULT);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, true);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
+
+ CanSummon = false;
+ Teleport_Timer = 20000;
+ Summon_Timer = 2500;
+ Transform_Timer = 30000;
+ Allergic_Timer = 5000;
+ }
+
+ void DoTransform()
+ {
+ switch(rand()%5)
+ {
+ case 0:
+ me->SetDisplayId(MODEL_DEFAULT);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, true);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
+ break;
+ case 1:
+ me->SetDisplayId(MODEL_ARCANE);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, true);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
+ break;
+ case 2:
+ me->SetDisplayId(MODEL_FIRE);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
+ break;
+ case 3:
+ me->SetDisplayId(MODEL_FROST);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, false);
+ break;
+ case 4:
+ me->SetDisplayId(MODEL_NATURE);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_SHADOW, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_ARCANE, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, false);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
+ break;
+ }
+ }
+
+ void DoSummons()
+ {
+ switch(rand()%4)
+ {
+ case 0:
+ DoCast(me, SPELL_SUMMON_LASHER_1, true);
+ DoCast(me, SPELL_SUMMON_FLAYER_1, true);
+ break;
+ case 1:
+ DoCast(me, SPELL_SUMMON_LASHER_2, true);
+ DoCast(me, SPELL_SUMMON_FLAYER_2, true);
+ break;
+ case 2:
+ DoCast(me, SPELL_SUMMON_LASHER_3, true);
+ DoCast(me, SPELL_SUMMON_FLAYER_3, true);
+ break;
+ case 3:
+ DoCast(me, SPELL_SUMMON_LASHER_4, true);
+ DoCast(me, SPELL_SUMMON_FLAYER_4, true);
+ break;
+ }
+ CanSummon = false;
+ }
+
+ void EnterCombat(Unit * /*who*/)
+ {
+ }
+
+ void JustSummoned(Creature *summon)
+ {
+ if (summon && me->getVictim())
+ summon->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0));
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (CanSummon)
+ {
+ if (Summon_Timer <= diff)
+ {
+ DoScriptText(EMOTE_SUMMON, me);
+ DoSummons();
+ Summon_Timer = 2500;
+ } else Summon_Timer -= diff;
+ }
+
+ if (Allergic_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_ALLERGIC_REACTION);
+ Allergic_Timer = 25000+rand()%15000;
+ } else Allergic_Timer -= diff;
+
+ if (Teleport_Timer <= diff)
+ {
+ DoCast(me, SPELL_TELEPORT_SELF);
+ Teleport_Timer = 30000+rand()%10000;
+ CanSummon = true;
+ } else Teleport_Timer -= diff;
+
+ if (Transform_Timer <= diff)
+ {
+ DoTransform();
+ Transform_Timer = 25000+rand()%15000;
+ } else Transform_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+CreatureAI* GetAI_boss_laj(Creature* pCreature)
+{
+ return new boss_lajAI (pCreature);
+}
+
+void AddSC_boss_laj()
+{
+ Script *newscript;
+
+ newscript = new Script;
+ newscript->Name = "boss_laj";
+ newscript->GetAI = &GetAI_boss_laj;
+ newscript->RegisterSelf();
+}
+
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp
new file mode 100644
index 00000000000..48eb03c16d3
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp
@@ -0,0 +1,216 @@
+/* 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 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, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+/* ScriptData
+SDName: Boss_Warp_Splinter
+SD%Complete: 80
+SDComment: Includes Sapling (need some better control with these).
+SDCategory: Tempest Keep, The Botanica
+EndScriptData */
+
+#include "ScriptedPch.h"
+
+/*#####
+# mob_treant (Sapling)
+#####*/
+
+#define SPELL_HEAL_FATHER 6262
+
+struct mob_treantAI : public ScriptedAI
+{
+ mob_treantAI (Creature *c) : ScriptedAI(c)
+ {
+ WarpGuid = 0;
+ }
+
+ uint64 WarpGuid;
+ uint32 check_Timer;
+
+ void Reset()
+ {
+ check_Timer = 0;
+ }
+
+ void EnterCombat(Unit * /*who*/) {}
+
+ void MoveInLineOfSight(Unit* /*who*/) {}
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim())
+ {
+ if (WarpGuid && check_Timer <= diff)
+ {
+ if (Unit *Warp = Unit::GetUnit(*me, WarpGuid))
+ {
+ if (me->IsWithinMeleeRange(Warp,2.5f))
+ {
+ int32 CurrentHP_Treant = (int32)me->GetHealth();
+ Warp->CastCustomSpell(Warp,SPELL_HEAL_FATHER,&CurrentHP_Treant, 0, 0, true,0 ,0, me->GetGUID());
+ me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ return;
+ }
+ me->GetMotionMaster()->MoveFollow(Warp,0,0);
+ }
+ check_Timer = 1000;
+ } else check_Timer -= diff;
+ return;
+ }
+
+ if (me->getVictim()->GetGUID() != WarpGuid)
+ DoMeleeAttackIfReady();
+ }
+};
+
+/*#####
+# boss_warp_splinter
+#####*/
+
+#define SAY_AGGRO -1553007
+#define SAY_SLAY_1 -1553008
+#define SAY_SLAY_2 -1553009
+#define SAY_SUMMON_1 -1553010
+#define SAY_SUMMON_2 -1553011
+#define SAY_DEATH -1553012
+
+#define WAR_STOMP 34716
+#define SUMMON_TREANTS 34727 // DBC: 34727, 34731, 34733, 34734, 34736, 34739, 34741 (with Ancestral Life spell 34742) // won't work (guardian summon)
+#define ARCANE_VOLLEY DUNGEON_MODE(36705, 39133)
+
+#define CREATURE_TREANT 19949
+
+#define TREANT_SPAWN_DIST 50 //50 yards from Warp Splinter's spawn point
+
+float treant_pos[6][3] =
+{
+ {24.301233, 427.221100, -27.060635},
+ {16.795492, 359.678802, -27.355425},
+ {53.493484, 345.381470, -26.196192},
+ {61.867096, 439.362732, -25.921030},
+ {109.861877, 423.201630, -27.356019},
+ {106.780159, 355.582581, -27.593357}
+};
+
+struct boss_warp_splinterAI : public ScriptedAI
+{
+ boss_warp_splinterAI(Creature *c) : ScriptedAI(c)
+ {
+ Treant_Spawn_Pos_X = c->GetPositionX();
+ Treant_Spawn_Pos_Y = c->GetPositionY();
+ }
+
+ uint32 War_Stomp_Timer;
+ uint32 Summon_Treants_Timer;
+ uint32 Arcane_Volley_Timer;
+
+ float Treant_Spawn_Pos_X;
+ float Treant_Spawn_Pos_Y;
+
+ void Reset()
+ {
+ War_Stomp_Timer = 25000 + rand()%15000;
+ Summon_Treants_Timer = 45000;
+ Arcane_Volley_Timer = 8000 + rand()%12000;
+
+ me->SetSpeed(MOVE_RUN, 0.7f, true);
+ }
+
+ void EnterCombat(Unit * /*who*/)
+ {
+ DoScriptText(SAY_AGGRO, me);
+ }
+
+ void KilledUnit(Unit* /*victim*/)
+ {
+ DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
+ }
+
+ void JustDied(Unit* /*Killer*/)
+ {
+ DoScriptText(SAY_DEATH, me);
+ }
+
+ void SummonTreants()
+ {
+ for (uint8 i = 0; i < 6; ++i)
+ {
+ float angle = (M_PI / 3) * i;
+
+ float X = Treant_Spawn_Pos_X + TREANT_SPAWN_DIST * cos(angle);
+ float Y = Treant_Spawn_Pos_Y + TREANT_SPAWN_DIST * sin(angle);
+ float O = - me->GetAngle(X,Y);
+
+ if (Creature *pTreant = me->SummonCreature(CREATURE_TREANT,treant_pos[i][0],treant_pos[i][1],treant_pos[i][2],O,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,25000))
+ CAST_AI(mob_treantAI, pTreant->AI())->WarpGuid = me->GetGUID();
+ }
+ DoScriptText(RAND(SAY_SUMMON_1,SAY_SUMMON_2), me);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ //Check for War Stomp
+ if (War_Stomp_Timer <= diff)
+ {
+ DoCast(me->getVictim(), WAR_STOMP);
+ War_Stomp_Timer = 25000 + rand()%15000;
+ } else War_Stomp_Timer -= diff;
+
+ //Check for Arcane Volley
+ if (Arcane_Volley_Timer <= diff)
+ {
+ DoCast(me->getVictim(), ARCANE_VOLLEY);
+ Arcane_Volley_Timer = 20000 + rand()%15000;
+ } else Arcane_Volley_Timer -= diff;
+
+ //Check for Summon Treants
+ if (Summon_Treants_Timer <= diff)
+ {
+ SummonTreants();
+ Summon_Treants_Timer = 45000;
+ } else Summon_Treants_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+CreatureAI* GetAI_boss_warp_splinter(Creature* pCreature)
+{
+ return new boss_warp_splinterAI (pCreature);
+}
+
+CreatureAI* GetAI_mob_treant(Creature* pCreature)
+{
+ return new mob_treantAI (pCreature);
+}
+
+void AddSC_boss_warp_splinter()
+{
+ Script *newscript;
+
+ newscript = new Script;
+ newscript->Name = "boss_warp_splinter";
+ newscript->GetAI = &GetAI_boss_warp_splinter;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "mob_warp_splinter_treant";
+ newscript->GetAI = &GetAI_mob_treant;
+ newscript->RegisterSelf();
+}
+
diff --git a/src/server/scripts/Outland/TempestKeep/the_eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/the_eye/boss_alar.cpp
new file mode 100644
index 00000000000..af5f1bd95c1
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/the_eye/boss_alar.cpp
@@ -0,0 +1,523 @@
+/* Copyright(C) 2006 - 2008 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 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, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+/* ScriptData
+SDName: boss_alar
+SD%Complete: 95
+SDComment:
+SDCategory: Tempest Keep, The Eye
+EndScriptData */
+
+#include "ScriptedPch.h"
+#include "the_eye.h"
+
+#define SPELL_FLAME_BUFFET 34121 // Flame Buffet - every 1,5 secs in phase 1 if there is no victim in melee range and after Dive Bomb in phase 2 with same conditions
+#define SPELL_FLAME_QUILLS 34229 // Randomly after changing position in phase after watching tonns of movies, set probability 20%
+#define SPELL_REBIRTH 34342 // Rebirth - beginning of second phase(after loose all health in phase 1)
+#define SPELL_REBIRTH_2 35369 // Rebirth(another, without healing to full HP) - after Dive Bomb in phase 2
+#define SPELL_MELT_ARMOR 35410 // Melt Armor - every 60 sec in phase 2
+#define SPELL_CHARGE 35412 // Charge - 30 sec cooldown
+#define SPELL_DIVE_BOMB_VISUAL 35367 // Bosskillers says 30 sec cooldown, wowwiki says 30 sec colldown, DBM and BigWigs addons says ~47 sec
+#define SPELL_DIVE_BOMB 35181 // after watching tonns of movies, set cooldown to 40+rand()%5.
+#define SPELL_BERSERK 45078 // 10 minutes after phase 2 starts(id is wrong, but proper id is unknown)
+
+#define CREATURE_EMBER_OF_ALAR 19551 // Al'ar summons one Ember of Al'ar every position change in phase 1 and two after Dive Bomb. Also in phase 2 when Ember of Al'ar dies, boss loose 3% health.
+#define SPELL_EMBER_BLAST 34133 // When Ember of Al'ar dies, it casts Ember Blast
+
+#define CREATURE_FLAME_PATCH_ALAR 20602 // Flame Patch - every 30 sec in phase 2
+#define SPELL_FLAME_PATCH 35380 //
+
+static float waypoint[6][3] =
+{
+ {340.15, 58.65, 17.71},
+ {388.09, 31.54, 20.18},
+ {388.18, -32.85, 20.18},
+ {340.29, -60.19, 17.72},
+ {332, 0.01, 39}, // better not use the same xy coord
+ {331, 0.01, -2.39}
+};
+
+enum WaitEventType
+{
+ WE_NONE = 0,
+ WE_DUMMY = 1,
+ WE_PLATFORM = 2,
+ WE_QUILL = 3,
+ WE_DIE = 4,
+ WE_REVIVE = 5,
+ WE_CHARGE = 6,
+ WE_METEOR = 7,
+ WE_DIVE = 8,
+ WE_LAND = 9,
+ WE_SUMMON = 10
+};
+
+struct boss_alarAI : public ScriptedAI
+{
+ boss_alarAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance =c->GetInstanceData();
+ DefaultMoveSpeedRate = c->GetSpeedRate(MOVE_RUN);
+ }
+
+ ScriptedInstance *pInstance;
+
+ WaitEventType WaitEvent;
+ uint32 WaitTimer;
+
+ bool AfterMoving;
+
+ uint32 Platforms_Move_Timer;
+ uint32 DiveBomb_Timer;
+ uint32 MeltArmor_Timer;
+ uint32 Charge_Timer;
+ uint32 FlamePatch_Timer;
+ uint32 Berserk_Timer;
+
+ float DefaultMoveSpeedRate;
+
+ bool Phase1;
+ bool ForceMove;
+ uint32 ForceTimer;
+
+ int8 cur_wp;
+
+ void Reset()
+ {
+ if (pInstance)
+ pInstance->SetData(DATA_ALAREVENT, NOT_STARTED);
+
+ Berserk_Timer = 1200000;
+ Platforms_Move_Timer = 0;
+
+ Phase1 = true;
+ WaitEvent = WE_NONE;
+ WaitTimer = 0;
+ AfterMoving = false;
+ ForceMove = false;
+ ForceTimer = 5000;
+
+ cur_wp = 4;
+
+ me->SetDisplayId(me->GetNativeDisplayId());
+ me->SetSpeed(MOVE_RUN, DefaultMoveSpeedRate);
+ //me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10);
+ //me->SetFloatValue(UNIT_FIELD_COMBATREACH, 10);
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true);
+ me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ me->setActive(false);
+ }
+
+ void EnterCombat(Unit * /*who*/)
+ {
+ if (pInstance)
+ pInstance->SetData(DATA_ALAREVENT, IN_PROGRESS);
+
+ me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); // after enterevademode will be set walk movement
+ DoZoneInCombat();
+ me->setActive(true);
+ }
+
+ void JustDied(Unit * /*victim*/)
+ {
+ if (pInstance)
+ pInstance->SetData(DATA_ALAREVENT, DONE);
+ }
+
+ void JustSummoned(Creature *summon)
+ {
+ if (summon->GetEntry() == CREATURE_EMBER_OF_ALAR)
+ if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ summon->AI()->AttackStart(pTarget);
+ }
+
+ void MoveInLineOfSight(Unit * /*who*/) {}
+
+ void AttackStart(Unit* who)
+ {
+ if (Phase1)
+ AttackStartNoMove(who);
+ else
+ ScriptedAI::AttackStart(who);
+ }
+
+ void DamageTaken(Unit* /*pKiller*/, uint32 &damage)
+ {
+ if (damage >= me->GetHealth() && Phase1)
+ {
+ damage = 0;
+ if (!WaitEvent)
+ {
+ WaitEvent = WE_DIE;
+ WaitTimer = 0;
+ me->SetHealth(0);
+ me->InterruptNonMeleeSpells(true);
+ me->RemoveAllAuras();
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ me->AttackStop();
+ me->SetUInt64Value(UNIT_FIELD_TARGET, 0);
+ me->SetSpeed(MOVE_RUN, 5.0f);
+ me->GetMotionMaster()->Clear();
+ me->GetMotionMaster()->MovePoint(0, waypoint[5][0], waypoint[5][1], waypoint[5][2]);
+ }
+ }
+ }
+
+ void SpellHit(Unit*, const SpellEntry *spell)
+ {
+ if (spell->Id == SPELL_DIVE_BOMB_VISUAL)
+ {
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true);
+ me->SetDisplayId(11686);
+ //me->SendUpdateObjectToAllExcept(NULL);
+ }
+ }
+
+ void MovementInform(uint32 type, uint32 /*id*/)
+ {
+ if (type == POINT_MOTION_TYPE)
+ {
+ WaitTimer = 1;
+ AfterMoving = true;
+ ForceMove = false;
+ }
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!me->isInCombat()) // sometimes isincombat but !incombat, faction bug?
+ return;
+
+ if (Berserk_Timer <= diff)
+ {
+ DoCast(me, SPELL_BERSERK, true);
+ Berserk_Timer = 60000;
+ } else Berserk_Timer -= diff;
+
+ if (ForceMove)
+ {
+ if (ForceTimer <= diff)
+ {
+ me->GetMotionMaster()->MovePoint(0, waypoint[cur_wp][0], waypoint[cur_wp][1], waypoint[cur_wp][2]);
+ ForceTimer = 5000;
+ } else ForceTimer -= diff;
+
+ }
+ if (WaitEvent)
+ {
+ if (WaitTimer)
+ {
+ if (WaitTimer <= diff)
+ {
+ if (AfterMoving)
+ {
+ me->GetMotionMaster()->MoveIdle();
+ AfterMoving = false;
+ }
+
+ switch(WaitEvent)
+ {
+ case WE_PLATFORM:
+ Platforms_Move_Timer = 30000+rand()%5000;
+ break;
+ case WE_QUILL:
+ DoCast(me, SPELL_FLAME_QUILLS, true);
+ Platforms_Move_Timer = 1;
+ WaitTimer = 10000;
+ WaitEvent = WE_DUMMY;
+ return;
+ case WE_DIE:
+ ForceMove = false;
+ me->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
+ WaitTimer = 5000;
+ WaitEvent = WE_REVIVE;
+ return;
+ case WE_REVIVE:
+ me->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_STAND);
+ me->SetHealth(me->GetMaxHealth());
+ me->SetSpeed(MOVE_RUN, DefaultMoveSpeedRate);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ DoZoneInCombat();
+ DoCast(me, SPELL_REBIRTH, true);
+ MeltArmor_Timer = 60000;
+ Charge_Timer = 7000;
+ DiveBomb_Timer = 40000+rand()%5000;
+ FlamePatch_Timer = 30000;
+ Phase1 = false;
+ break;
+ case WE_METEOR:
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, false);
+ DoCast(me, SPELL_DIVE_BOMB_VISUAL, false);
+ WaitEvent = WE_DIVE;
+ WaitTimer = 4000;
+ return;
+ case WE_DIVE:
+ if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ {
+ me->RemoveAurasDueToSpell(SPELL_DIVE_BOMB_VISUAL);
+ DoCast(pTarget, SPELL_DIVE_BOMB, true);
+ float dist = 3.0f;
+ if (me->IsWithinDist3d(pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 5.0f))
+ dist = 5.0f;
+ WaitTimer = 1000 + floor(dist / 80 * 1000.0f);
+ me->GetMap()->CreatureRelocation(me, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(),0.0f);
+ me->StopMoving();
+ WaitEvent = WE_LAND;
+ }
+ else
+ {
+ EnterEvadeMode();
+ return;
+ }
+ case WE_LAND:
+ WaitEvent = WE_SUMMON;
+ WaitTimer = 2000;
+ return;
+ case WE_SUMMON:
+ for (uint8 i = 0; i < 2; ++i)
+ DoSpawnCreature(CREATURE_EMBER_OF_ALAR, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
+ me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetDisplayId(me->GetNativeDisplayId());
+ DoCast(me, SPELL_REBIRTH_2, true);
+ break;
+ case WE_DUMMY:
+ default:
+ break;
+ }
+
+ WaitEvent = WE_NONE;
+ WaitTimer = 0;
+ } else WaitTimer -= diff;
+ }
+ return;
+ }
+
+ if (Phase1)
+ {
+ if (me->getThreatManager().getThreatList().empty())
+ {
+ EnterEvadeMode();
+ return;
+ }
+
+ if (Platforms_Move_Timer <= diff)
+ {
+ if (cur_wp == 4)
+ {
+ cur_wp = 0;
+ WaitEvent = WE_PLATFORM;
+ }
+ else
+ {
+ if (urand(0,4)) // next platform
+ {
+ DoSpawnCreature(CREATURE_EMBER_OF_ALAR, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
+ if (cur_wp == 3)
+ cur_wp = 0;
+ else
+ ++cur_wp;
+ WaitEvent = WE_PLATFORM;
+ }
+ else // flame quill
+ {
+ cur_wp = 4;
+ WaitEvent = WE_QUILL;
+ }
+ }
+ ForceMove = true;
+ ForceTimer = 5000;
+ me->GetMotionMaster()->MovePoint(0, waypoint[cur_wp][0], waypoint[cur_wp][1], waypoint[cur_wp][2]);
+ WaitTimer = 0;
+ return;
+ } else Platforms_Move_Timer -= diff;
+ }
+ else
+ {
+ if (Charge_Timer <= diff)
+ {
+ Unit *pTarget= SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true);
+ if (pTarget)
+ DoCast(pTarget, SPELL_CHARGE);
+ Charge_Timer = 30000;
+ } else Charge_Timer -= diff;
+
+ if (MeltArmor_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_MELT_ARMOR);
+ MeltArmor_Timer = 60000;
+ } else MeltArmor_Timer -= diff;
+
+ if (DiveBomb_Timer <= diff)
+ {
+ me->AttackStop();
+ me->GetMotionMaster()->MovePoint(6, waypoint[4][0], waypoint[4][1], waypoint[4][2]);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 50);
+ WaitEvent = WE_METEOR;
+ WaitTimer = 0;
+ DiveBomb_Timer = 40000+rand()%5000;
+ return;
+ } else DiveBomb_Timer -= diff;
+
+ if (FlamePatch_Timer <= diff)
+ {
+ if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ {
+ Creature* Summoned = me->SummonCreature(CREATURE_FLAME_PATCH_ALAR, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 120000);
+ if (Summoned)
+ {
+ Summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ Summoned->SetFloatValue(OBJECT_FIELD_SCALE_X, Summoned->GetFloatValue(OBJECT_FIELD_SCALE_X)*2.5f);
+ Summoned->SetDisplayId(11686);
+ Summoned->setFaction(me->getFaction());
+ Summoned->SetLevel(me->getLevel());
+ Summoned->CastSpell(Summoned, SPELL_FLAME_PATCH, false);
+ }
+ }
+ FlamePatch_Timer = 30000;
+ } else FlamePatch_Timer -= diff;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ void DoMeleeAttackIfReady()
+ {
+ if (me->isAttackReady() && !me->IsNonMeleeSpellCasted(false))
+ {
+ if (me->IsWithinMeleeRange(me->getVictim()))
+ {
+ me->AttackerStateUpdate(me->getVictim());
+ me->resetAttackTimer();
+ }
+ else
+ {
+ Unit *pTarget = NULL;
+ pTarget = me->SelectNearestTargetInAttackDistance(5);
+ if (pTarget)
+ me->AI()->AttackStart(pTarget);
+ else
+ {
+ DoCast(me, SPELL_FLAME_BUFFET, true);
+ me->setAttackTimer(BASE_ATTACK, 1500);
+ }
+ }
+ }
+ }
+};
+
+CreatureAI* GetAI_boss_alar(Creature* pCreature)
+{
+ return new boss_alarAI(pCreature);
+}
+
+struct mob_ember_of_alarAI : public ScriptedAI
+{
+ mob_ember_of_alarAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = c->GetInstanceData();
+ c->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
+ c->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true);
+ }
+
+ ScriptedInstance *pInstance;
+ bool toDie;
+
+ void Reset() {toDie = false;}
+ void EnterCombat(Unit * /*who*/) {DoZoneInCombat();}
+ void EnterEvadeMode() {me->setDeathState(JUST_DIED);}
+
+ void DamageTaken(Unit* pKiller, uint32 &damage)
+ {
+ if (damage >= me->GetHealth() && pKiller != me && !toDie)
+ {
+ damage = 0;
+ DoCast(me, SPELL_EMBER_BLAST, true);
+ me->SetDisplayId(11686);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ if (pInstance && pInstance->GetData(DATA_ALAREVENT) == 2)
+ {
+ if (Unit* Alar = Unit::GetUnit((*me), pInstance->GetData64(DATA_ALAR)))
+ {
+ int AlarHealth = Alar->GetHealth() - Alar->GetMaxHealth()*0.03;
+ if (AlarHealth > 0)
+ Alar->SetHealth(AlarHealth);
+ else
+ Alar->SetHealth(1);
+ }
+ }
+ toDie = true;
+ }
+ }
+
+ void UpdateAI(const uint32 /*diff*/)
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (toDie)
+ {
+ me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ //me->SetVisibility(VISIBILITY_OFF);
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+};
+
+CreatureAI* GetAI_mob_ember_of_alar(Creature* pCreature)
+{
+ return new mob_ember_of_alarAI(pCreature);
+}
+
+struct mob_flame_patch_alarAI : public ScriptedAI
+{
+ mob_flame_patch_alarAI(Creature *c) : ScriptedAI(c) {}
+ void Reset() {}
+ void EnterCombat(Unit * /*who*/) {}
+ void AttackStart(Unit* /*who*/) {}
+ void MoveInLineOfSight(Unit* /*who*/) {}
+ void UpdateAI(const uint32 /*diff*/) {}
+};
+
+CreatureAI* GetAI_mob_flame_patch_alar(Creature* pCreature)
+{
+ return new mob_flame_patch_alarAI(pCreature);
+}
+
+void AddSC_boss_alar()
+{
+ Script *newscript;
+
+ newscript = new Script;
+ newscript->Name = "boss_alar";
+ newscript->GetAI = &GetAI_boss_alar;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "mob_ember_of_alar";
+ newscript->GetAI = &GetAI_mob_ember_of_alar;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "mob_flame_patch_alar";
+ newscript->GetAI = &GetAI_mob_flame_patch_alar;
+ newscript->RegisterSelf();
+}
+
diff --git a/src/server/scripts/Outland/TempestKeep/the_eye/boss_astromancer.cpp b/src/server/scripts/Outland/TempestKeep/the_eye/boss_astromancer.cpp
new file mode 100644
index 00000000000..e9e217a5c62
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/the_eye/boss_astromancer.cpp
@@ -0,0 +1,466 @@
+/* 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 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Boss_Astromancer
+SD%Complete: 80
+SDComment:
+SDCategory: Tempest Keep, The Eye
+EndScriptData */
+
+#include "ScriptedPch.h"
+#include "the_eye.h"
+
+enum eEnums
+{
+ SAY_AGGRO = -1550007,
+ SAY_SUMMON1 = -1550008,
+ SAY_SUMMON2 = -1550009,
+ SAY_KILL1 = -1550010,
+ SAY_KILL2 = -1550011,
+ SAY_KILL3 = -1550012,
+ SAY_DEATH = -1550013,
+ SAY_VOIDA = -1550014,
+ SAY_VOIDB = -1550015,
+
+ SPELL_ARCANE_MISSILES = 33031,
+ SPELL_WRATH_OF_THE_ASTROMANCER = 42783,
+ SPELL_BLINDING_LIGHT = 33009,
+ SPELL_FEAR = 34322,
+ SPELL_VOID_BOLT = 39329,
+
+ SPELL_SPOTLIGHT = 25824,
+ NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT = 18928,
+
+ NPC_SOLARIUM_AGENT = 18925,
+ NPC_SOLARIUM_PRIEST = 18806,
+
+ MODEL_HUMAN = 18239,
+ MODEL_VOIDWALKER = 18988,
+
+ SPELL_SOLARIUM_GREAT_HEAL = 33387,
+ SPELL_SOLARIUM_HOLY_SMITE = 25054,
+ SPELL_SOLARIUM_ARCANE_TORRENT = 33390,
+
+ WV_ARMOR = 31000
+};
+
+const float CENTER_X = 432.909f;
+const float CENTER_Y = -373.424f;
+const float CENTER_Z = 17.9608f;
+const float CENTER_O = 1.06421f;
+const float SMALL_PORTAL_RADIUS = 12.6f;
+const float LARGE_PORTAL_RADIUS = 26.0f;
+const float PORTAL_Z = 17.005f;
+
+ // x, y, z, o
+static float SolarianPos[4] = {432.909, -373.424, 17.9608, 1.06421};
+
+struct boss_high_astromancer_solarianAI : public ScriptedAI
+{
+ boss_high_astromancer_solarianAI(Creature *c) : ScriptedAI(c), Summons(me)
+ {
+ pInstance = c->GetInstanceData();
+
+ defaultarmor = c->GetArmor();
+ defaultsize = c->GetFloatValue(OBJECT_FIELD_SCALE_X);
+ }
+
+ ScriptedInstance *pInstance;
+ SummonList Summons;
+
+ uint8 Phase;
+
+ uint32 ArcaneMissiles_Timer;
+ uint32 m_uiWrathOfTheAstromancer_Timer;
+ uint32 BlindingLight_Timer;
+ uint32 Fear_Timer;
+ uint32 VoidBolt_Timer;
+ uint32 Phase1_Timer;
+ uint32 Phase2_Timer;
+ uint32 Phase3_Timer;
+ uint32 AppearDelay_Timer;
+ uint32 defaultarmor;
+ uint32 Wrath_Timer;
+
+ float defaultsize;
+ float Portals[3][3];
+
+ bool AppearDelay;
+ bool BlindingLight;
+
+ void Reset()
+ {
+ ArcaneMissiles_Timer = 2000;
+ m_uiWrathOfTheAstromancer_Timer = 15000;
+ BlindingLight_Timer = 41000;
+ Fear_Timer = 20000;
+ VoidBolt_Timer = 10000;
+ Phase1_Timer = 50000;
+ Phase2_Timer = 10000;
+ Phase3_Timer = 15000;
+ AppearDelay_Timer = 2000;
+ BlindingLight = false;
+ AppearDelay = false;
+ Wrath_Timer = 20000+rand()%5000;//twice in phase one
+ Phase = 1;
+ Wrath_Timer = 20000+rand()%5000;//twice in phase one
+
+ if (pInstance)
+ pInstance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, NOT_STARTED);
+
+ me->SetArmor(defaultarmor);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetVisibility(VISIBILITY_ON);
+ me->SetFloatValue(OBJECT_FIELD_SCALE_X, defaultsize);
+ me->SetDisplayId(MODEL_HUMAN);
+
+ Summons.DespawnAll();
+ }
+
+ void KilledUnit(Unit * /*victim*/)
+ {
+ DoScriptText(RAND(SAY_KILL1,SAY_KILL2,SAY_KILL3), me);
+ }
+
+ void JustDied(Unit * /*victim*/)
+ {
+ me->SetFloatValue(OBJECT_FIELD_SCALE_X, defaultsize);
+ me->SetDisplayId(MODEL_HUMAN);
+ DoScriptText(SAY_DEATH, me);
+
+ if (pInstance)
+ pInstance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, DONE);
+ }
+
+ void EnterCombat(Unit * /*who*/)
+ {
+ DoScriptText(SAY_AGGRO, me);
+ DoZoneInCombat();
+
+ if (pInstance)
+ pInstance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, IN_PROGRESS);
+ }
+
+ void SummonMinion(uint32 entry, float x, float y, float z)
+ {
+ Creature* Summoned = me->SummonCreature(entry, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
+ if (Summoned)
+ {
+ if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ Summoned->AI()->AttackStart(pTarget);
+
+ Summons.Summon(Summoned);
+ }
+ }
+
+ float Portal_X(float radius)
+ {
+ if (urand(0,1))
+ radius = -radius;
+
+ return radius * (float)(rand()%100)/100.0f + CENTER_X;
+ }
+
+ float Portal_Y(float x, float radius)
+ {
+ float z = RAND(1, -1);
+
+ return (z*sqrt(radius*radius - (x - CENTER_X)*(x - CENTER_X)) + CENTER_Y);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (AppearDelay)
+ {
+ me->StopMoving();
+ me->AttackStop();
+ if (AppearDelay_Timer <= diff)
+ {
+ AppearDelay = false;
+ if (Phase == 2)
+ {
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetVisibility(VISIBILITY_OFF);
+ }
+ AppearDelay_Timer = 2000;
+ } else AppearDelay_Timer -= diff;
+ }
+
+ if (Phase == 1)
+ {
+ if (BlindingLight_Timer <= diff)
+ {
+ BlindingLight = true;
+ BlindingLight_Timer = 45000;
+ } else BlindingLight_Timer -= diff;
+
+ if (Wrath_Timer <= diff)
+ {
+ me->InterruptNonMeleeSpells(false);
+ if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
+ DoCast(pTarget, SPELL_WRATH_OF_THE_ASTROMANCER, true);
+ Wrath_Timer = 20000+rand()%5000;
+ } else Wrath_Timer -= diff;
+
+ if (ArcaneMissiles_Timer <= diff)
+ {
+ if (BlindingLight)
+ {
+ DoCast(me->getVictim(), SPELL_BLINDING_LIGHT);
+ BlindingLight = false;
+ }else{
+ Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0);
+
+ if (!me->HasInArc(2.5f, pTarget))
+ pTarget = me->getVictim();
+
+ if (pTarget)
+ DoCast(pTarget, SPELL_ARCANE_MISSILES);
+ }
+ ArcaneMissiles_Timer = 3000;
+ } else ArcaneMissiles_Timer -= diff;
+
+ if (m_uiWrathOfTheAstromancer_Timer <= diff)
+ {
+ me->InterruptNonMeleeSpells(false);
+
+ //Target the tank ?
+ if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1))
+ if (pTarget->GetTypeId() == TYPEID_PLAYER)
+ {
+ DoCast(pTarget, SPELL_WRATH_OF_THE_ASTROMANCER);
+ m_uiWrathOfTheAstromancer_Timer = 25000;
+ }
+ else
+ m_uiWrathOfTheAstromancer_Timer = 1000;
+ } else m_uiWrathOfTheAstromancer_Timer -= diff;
+
+ //Phase1_Timer
+ if (Phase1_Timer <= diff)
+ {
+ Phase = 2;
+ Phase1_Timer = 50000;
+ //After these 50 seconds she portals to the middle of the room and disappears, leaving 3 light portals behind.
+ me->GetMotionMaster()->Clear();
+ me->GetMap()->CreatureRelocation(me, CENTER_X, CENTER_Y, CENTER_Z, CENTER_O);
+ for (uint8 i=0; i <= 2; ++i)
+ {
+ if (!i)
+ {
+ Portals[i][0] = Portal_X(SMALL_PORTAL_RADIUS);
+ Portals[i][1] = Portal_Y(Portals[i][0], SMALL_PORTAL_RADIUS);
+ Portals[i][2] = CENTER_Z;
+ }
+ else
+ {
+ Portals[i][0] = Portal_X(LARGE_PORTAL_RADIUS);
+ Portals[i][1] = Portal_Y(Portals[i][0], LARGE_PORTAL_RADIUS);
+ Portals[i][2] = PORTAL_Z;
+ }
+ }
+ if ((abs(Portals[2][0] - Portals[1][0]) < 7) && (abs(Portals[2][1] - Portals[1][1]) < 7))
+ {
+ int i=1;
+ if (abs(CENTER_X + 26.0f - Portals[2][0]) < 7)
+ i = -1;
+ Portals[2][0] = Portals[2][0]+7*i;
+ Portals[2][1] = Portal_Y(Portals[2][0], LARGE_PORTAL_RADIUS);
+ }
+ for (int i=0; i <= 2; ++i)
+ {
+ if (Creature* Summoned = me->SummonCreature(NPC_ASTROMANCER_SOLARIAN_SPOTLIGHT, Portals[i][0], Portals[i][1], Portals[i][2], CENTER_O, TEMPSUMMON_TIMED_DESPAWN, Phase2_Timer+Phase3_Timer+AppearDelay_Timer+1700))
+ {
+ Summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ Summoned->CastSpell(Summoned, SPELL_SPOTLIGHT, false);
+ }
+ }
+ AppearDelay = true;
+ } else Phase1_Timer-=diff;
+ }
+ else if (Phase == 2)
+ {
+ //10 seconds after Solarian disappears, 12 mobs spawn out of the three portals.
+ me->AttackStop();
+ me->StopMoving();
+ if (Phase2_Timer <= diff)
+ {
+ Phase = 3;
+ for (int i=0; i <= 2; ++i)
+ for (int j=1; j <= 4; j++)
+ SummonMinion(NPC_SOLARIUM_AGENT, Portals[i][0], Portals[i][1], Portals[i][2]);
+
+ DoScriptText(SAY_SUMMON1, me);
+ Phase2_Timer = 10000;
+ } else Phase2_Timer -= diff;
+ }
+ else if (Phase == 3)
+ {
+ me->AttackStop();
+ me->StopMoving();
+
+ //Check Phase3_Timer
+ if (Phase3_Timer <= diff)
+ {
+ Phase = 1;
+
+ //15 seconds later Solarian reappears out of one of the 3 portals. Simultaneously, 2 healers appear in the two other portals.
+ int i = rand()%3;
+ me->GetMotionMaster()->Clear();
+ me->GetMap()->CreatureRelocation(me, Portals[i][0], Portals[i][1], Portals[i][2], CENTER_O);
+
+ for (int j=0; j <= 2; j++)
+ if (j != i)
+ SummonMinion(NPC_SOLARIUM_PRIEST, Portals[j][0], Portals[j][1], Portals[j][2]);
+
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetVisibility(VISIBILITY_ON);
+
+ DoScriptText(SAY_SUMMON2, me);
+ AppearDelay = true;
+ Phase3_Timer = 15000;
+ } else Phase3_Timer -= diff;
+ }
+ else if (Phase == 4)
+ {
+ //Fear_Timer
+ if (Fear_Timer <= diff)
+ {
+ DoCast(me, SPELL_FEAR);
+ Fear_Timer = 20000;
+ } else Fear_Timer -= diff;
+
+ //VoidBolt_Timer
+ if (VoidBolt_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_VOID_BOLT);
+ VoidBolt_Timer = 10000;
+ } else VoidBolt_Timer -= diff;
+ }
+
+ //When Solarian reaches 20% she will transform into a huge void walker.
+ if (Phase != 4 && ((me->GetHealth()*100 / me->GetMaxHealth())<20))
+ {
+ Phase = 4;
+
+ //To make sure she wont be invisible or not selecatble
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetVisibility(VISIBILITY_ON);
+ DoScriptText(SAY_VOIDA, me);
+ DoScriptText(SAY_VOIDB, me);
+ me->SetArmor(WV_ARMOR);
+ me->SetDisplayId(MODEL_VOIDWALKER);
+ me->SetFloatValue(OBJECT_FIELD_SCALE_X, defaultsize*2.5f);
+ }
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+struct mob_solarium_priestAI : public ScriptedAI
+{
+ mob_solarium_priestAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = c->GetInstanceData();
+ }
+
+ ScriptedInstance *pInstance;
+
+ uint32 healTimer;
+ uint32 holysmiteTimer;
+ uint32 aoesilenceTimer;
+
+ void Reset()
+ {
+ healTimer = 9000;
+ holysmiteTimer = 1;
+ aoesilenceTimer = 15000;
+ }
+
+ void EnterCombat(Unit * /*who*/)
+ {
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (healTimer <= diff)
+ {
+ Unit *pTarget = NULL;
+
+ switch (urand(0,1))
+ {
+ case 0:
+ if (pInstance)
+ pTarget = Unit::GetUnit((*me), pInstance->GetData64(DATA_ASTROMANCER));
+ break;
+ case 1:
+ pTarget = me;
+ break;
+ }
+
+ if (pTarget)
+ {
+ DoCast(pTarget, SPELL_SOLARIUM_GREAT_HEAL);
+ healTimer = 9000;
+ }
+ } else healTimer -= diff;
+
+ if (holysmiteTimer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_SOLARIUM_HOLY_SMITE);
+ holysmiteTimer = 4000;
+ } else holysmiteTimer -= diff;
+
+ if (aoesilenceTimer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_SOLARIUM_ARCANE_TORRENT);
+ aoesilenceTimer = 13000;
+ } else aoesilenceTimer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+CreatureAI* GetAI_mob_solarium_priest(Creature* pCreature)
+{
+ return new mob_solarium_priestAI (pCreature);
+}
+
+CreatureAI* GetAI_boss_high_astromancer_solarian(Creature* pCreature)
+{
+ return new boss_high_astromancer_solarianAI (pCreature);
+}
+
+void AddSC_boss_high_astromancer_solarian()
+{
+ Script *newscript;
+ newscript = new Script;
+ newscript->Name = "boss_high_astromancer_solarian";
+ newscript->GetAI = &GetAI_boss_high_astromancer_solarian;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "mob_solarium_priest";
+ newscript->GetAI = &GetAI_mob_solarium_priest;
+ newscript->RegisterSelf();
+}
+
diff --git a/src/server/scripts/Outland/TempestKeep/the_eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/the_eye/boss_kaelthas.cpp
new file mode 100644
index 00000000000..05681fb7539
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/the_eye/boss_kaelthas.cpp
@@ -0,0 +1,1498 @@
+/* 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 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Boss_Kaelthas
+SD%Complete: 60
+SDComment: SQL, weapon scripts, mind control, need correct spells(interruptible/uninterruptible), phoenix spawn location & animation, phoenix behaviour & spawn during gravity lapse
+SDCategory: Tempest Keep, The Eye
+EndScriptData */
+
+#include "ScriptedPch.h"
+#include "the_eye.h"
+#include "WorldPacket.h"
+
+enum eEnums
+{
+ //kael'thas Speech
+ SAY_INTRO = -1550016,
+ SAY_INTRO_CAPERNIAN = -1550017,
+ SAY_INTRO_TELONICUS = -1550018,
+ SAY_INTRO_THALADRED = -1550019,
+ SAY_INTRO_SANGUINAR = -1550020,
+ SAY_PHASE2_WEAPON = -1550021,
+ SAY_PHASE3_ADVANCE = -1550022,
+ SAY_PHASE4_INTRO2 = -1550023,
+ SAY_PHASE5_NUTS = -1550024,
+ SAY_SLAY1 = -1550025,
+ SAY_SLAY2 = -1550026,
+ SAY_SLAY3 = -1550027,
+ SAY_MINDCONTROL1 = -1550028,
+ SAY_MINDCONTROL2 = -1550029,
+ SAY_GRAVITYLAPSE1 = -1550030,
+ SAY_GRAVITYLAPSE2 = -1550031,
+ SAY_SUMMON_PHOENIX1 = -1550032,
+ SAY_SUMMON_PHOENIX2 = -1550033,
+ SAY_DEATH = -1550034,
+
+ //Thaladred the Darkener speech
+ SAY_THALADRED_AGGRO = -1550035,
+ SAY_THALADRED_DEATH = -1550036,
+ EMOTE_THALADRED_GAZE = -1550037,
+
+ //Lord Sanguinar speech
+ SAY_SANGUINAR_AGGRO = -1550038,
+ SAY_SANGUINAR_DEATH = -1550039,
+
+ //Grand Astromancer Capernian speech
+ SAY_CAPERNIAN_AGGRO = -1550040,
+ SAY_CAPERNIAN_DEATH = -1550041,
+
+ //Master Engineer Telonicus speech
+ SAY_TELONICUS_AGGRO = -1550042,
+ SAY_TELONICUS_DEATH = -1550043,
+
+ //Phase 2 spells
+ SPELL_SUMMON_WEAPONS = 36976,
+ SPELL_SUMMON_WEAPONA = 36958,
+ SPELL_SUMMON_WEAPONB = 36959,
+ SPELL_SUMMON_WEAPONC = 36960,
+ SPELL_SUMMON_WEAPOND = 36961,
+ SPELL_SUMMON_WEAPONE = 36962,
+ SPELL_SUMMON_WEAPONF = 36963,
+ SPELL_SUMMON_WEAPONG = 36964,
+ SPELL_RES_VISUAL = 24171,
+
+ //Phase 4 spells
+ SPELL_FIREBALL = 22088, //wrong but works with CastCustomSpell
+ SPELL_PYROBLAST = 36819,
+ SPELL_FLAME_STRIKE = 36735,
+ SPELL_FLAME_STRIKE_VIS = 36730,
+ SPELL_FLAME_STRIKE_DMG = 36731,
+ SPELL_ARCANE_DISRUPTION = 36834,
+ SPELL_SHOCK_BARRIER = 36815,
+ SPELL_PHOENIX_ANIMATION = 36723,
+ SPELL_MIND_CONTROL = 32830,
+
+ //Phase 5 spells
+ SPELL_EXPLODE = 36092,
+ SPELL_FULLPOWER = 36187,
+ SPELL_KNOCKBACK = 11027,
+ SPELL_GRAVITY_LAPSE = 34480,
+ SPELL_GRAVITY_LAPSE_AURA = 39432,
+ SPELL_NETHER_BEAM = 35873,
+
+ //Thaladred the Darkener spells
+ SPELL_PSYCHIC_BLOW = 10689,
+ SPELL_SILENCE = 30225,
+ //Lord Sanguinar spells
+ SPELL_BELLOWING_ROAR = 40636,
+ //Grand Astromancer Capernian spells
+
+ SPELL_CAPERNIAN_FIREBALL = 36971,
+ SPELL_CONFLAGRATION = 37018,
+ SPELL_ARCANE_EXPLOSION = 36970,
+ //Master Engineer Telonicus spells
+ SPELL_BOMB = 37036,
+ SPELL_REMOTE_TOY = 37027,
+ //Nether Vapor spell
+ SPELL_NETHER_VAPOR = 35859,
+ //Phoenix spell
+ SPELL_BURN = 36720,
+ SPELL_EMBER_BLAST = 34341,
+ SPELL_REBIRTH = 41587,
+
+ //Creature IDs
+ NPC_PHOENIX = 21362,
+ NPC_PHOENIX_EGG = 21364,
+
+ //Phoenix egg and phoenix model
+ MODEL_ID_PHOENIX = 19682,
+ MODEL_ID_PHOENIX_EGG = 20245,
+
+ MAX_ADVISORS = 4
+};
+
+uint32 m_auiSpellSummonWeapon[]=
+{
+ SPELL_SUMMON_WEAPONA, SPELL_SUMMON_WEAPONB, SPELL_SUMMON_WEAPONC, SPELL_SUMMON_WEAPOND,
+ SPELL_SUMMON_WEAPONE, SPELL_SUMMON_WEAPONF, SPELL_SUMMON_WEAPONG
+};
+
+const float CAPERNIAN_DISTANCE = 20.0f; //she casts away from the target
+const float KAEL_VISIBLE_RANGE = 50.0f;
+
+const float afGravityPos[3] = {795.0f, 0.0f, 70.0f};
+
+#define TIME_PHASE_2_3 120000
+#define TIME_PHASE_3_4 180000
+
+//Base AI for Advisors
+struct advisorbase_ai : public ScriptedAI
+{
+ advisorbase_ai(Creature* pCreature) : ScriptedAI(pCreature)
+ {
+ m_pInstance = pCreature->GetInstanceData();
+ m_bDoubled_Health = false;
+ }
+
+ ScriptedInstance* m_pInstance;
+ bool FakeDeath;
+ bool m_bDoubled_Health;
+ uint32 DelayRes_Timer;
+ uint64 DelayRes_Target;
+
+ void Reset()
+ {
+ if (m_bDoubled_Health)
+ {
+ me->SetMaxHealth(me->GetMaxHealth() / 2);
+ m_bDoubled_Health = false;
+ }
+
+ FakeDeath = false;
+ DelayRes_Timer = 0;
+ DelayRes_Target = 0;
+
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+
+ //reset encounter
+ if (m_pInstance && (m_pInstance->GetData(DATA_KAELTHASEVENT) == 1 || m_pInstance->GetData(DATA_KAELTHASEVENT) == 3))
+ if (Creature *Kaelthas = Unit::GetCreature((*me), m_pInstance->GetData64(DATA_KAELTHAS)))
+ Kaelthas->AI()->EnterEvadeMode();
+ }
+
+ void MoveInLineOfSight(Unit *who)
+ {
+ if (!who || FakeDeath || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
+ return;
+
+ ScriptedAI::MoveInLineOfSight(who);
+ }
+
+ void AttackStart(Unit* who)
+ {
+ if (!who || FakeDeath || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
+ return;
+
+ ScriptedAI::AttackStart(who);
+ }
+
+ void Revive(Unit* /*Target*/)
+ {
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ // double health for phase 3
+ me->SetMaxHealth(me->GetMaxHealth() * 2);
+ m_bDoubled_Health = true;
+ me->SetHealth(me->GetMaxHealth());
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+
+ DoCast(me, SPELL_RES_VISUAL, false);
+ DelayRes_Timer = 2000;
+ }
+
+ void DamageTaken(Unit* pKiller, uint32 &damage)
+ {
+ if (damage < me->GetHealth())
+ return;
+
+ //Prevent glitch if in fake death
+ if (FakeDeath && m_pInstance && m_pInstance->GetData(DATA_KAELTHASEVENT) != 0)
+ {
+ damage = 0;
+ return;
+ }
+
+ //Don't really die in phase 1 & 3, only die after that
+ if (m_pInstance && m_pInstance->GetData(DATA_KAELTHASEVENT) != 0)
+ {
+ //prevent death
+ damage = 0;
+ FakeDeath = true;
+
+ me->InterruptNonMeleeSpells(false);
+ me->SetHealth(0);
+ me->StopMoving();
+ me->ClearComboPointHolders();
+ me->RemoveAllAurasOnDeath();
+ me->ModifyAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, false);
+ me->ModifyAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, false);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->ClearAllReactives();
+ me->SetUInt64Value(UNIT_FIELD_TARGET,0);
+ me->GetMotionMaster()->Clear();
+ me->GetMotionMaster()->MoveIdle();
+ me->SetStandState(UNIT_STAND_STATE_DEAD);
+ JustDied(pKiller);
+ }
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (DelayRes_Timer)
+ {
+ if (DelayRes_Timer <= diff)
+ {
+ DelayRes_Timer = 0;
+ FakeDeath = false;
+
+ Unit* Target = Unit::GetUnit((*me), DelayRes_Target);
+ if (!Target)
+ Target = me->getVictim();
+
+ DoResetThreat();
+ AttackStart(Target);
+ me->GetMotionMaster()->Clear();
+ me->GetMotionMaster()->MoveChase(Target);
+ me->AddThreat(Target, 0.0f);
+ } else DelayRes_Timer -= diff;
+ }
+ }
+
+};
+
+//Kael'thas AI
+struct boss_kaelthasAI : public ScriptedAI
+{
+ boss_kaelthasAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
+ {
+ m_pInstance = pCreature->GetInstanceData();
+ memset(&m_auiAdvisorGuid, 0, sizeof(m_auiAdvisorGuid));
+ }
+
+ ScriptedInstance* m_pInstance;
+
+ uint32 Fireball_Timer;
+ uint32 ArcaneDisruption_Timer;
+ uint32 Phoenix_Timer;
+ uint32 ShockBarrier_Timer;
+ uint32 GravityLapse_Timer;
+ uint32 GravityLapse_Phase;
+ uint32 NetherBeam_Timer;
+ uint32 NetherVapor_Timer;
+ uint32 FlameStrike_Timer;
+ uint32 MindControl_Timer;
+ uint32 Phase;
+ uint32 PhaseSubphase; //generic
+ uint32 Phase_Timer; //generic timer
+ uint32 PyrosCasted;
+
+ bool InGravityLapse;
+ bool IsCastingFireball;
+ bool ChainPyros;
+
+ SummonList summons;
+
+ uint64 m_auiAdvisorGuid[MAX_ADVISORS];
+
+ void Reset()
+ {
+ Fireball_Timer = 5000+rand()%10000;
+ ArcaneDisruption_Timer = 45000;
+ MindControl_Timer = 40000;
+ Phoenix_Timer = 50000;
+ ShockBarrier_Timer = 60000;
+ FlameStrike_Timer = 30000;
+ GravityLapse_Timer = 20000;
+ GravityLapse_Phase = 0;
+ NetherBeam_Timer = 8000;
+ NetherVapor_Timer = 10000;
+ PyrosCasted = 0;
+ Phase = 0;
+ InGravityLapse = false;
+ IsCastingFireball = false;
+ ChainPyros = false;
+
+ if (me->isInCombat())
+ PrepareAdvisors();
+
+ summons.DespawnAll();
+
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+
+ if (m_pInstance)
+ m_pInstance->SetData(DATA_KAELTHASEVENT, 0);
+ }
+
+ void PrepareAdvisors()
+ {
+ for (uint8 i = 0; i < MAX_ADVISORS; ++i)
+ {
+ if (Creature *pCreature = Unit::GetCreature((*me), m_auiAdvisorGuid[i]))
+ {
+ pCreature->Respawn();
+ pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ pCreature->setFaction(me->getFaction());
+ pCreature->AI()->EnterEvadeMode();
+ }
+ }
+ }
+
+ void StartEvent()
+ {
+ if (!m_pInstance)
+ return;
+
+ m_auiAdvisorGuid[0] = m_pInstance->GetData64(DATA_THALADREDTHEDARKENER);
+ m_auiAdvisorGuid[1] = m_pInstance->GetData64(DATA_LORDSANGUINAR);
+ m_auiAdvisorGuid[2] = m_pInstance->GetData64(DATA_GRANDASTROMANCERCAPERNIAN);
+ m_auiAdvisorGuid[3] = m_pInstance->GetData64(DATA_MASTERENGINEERTELONICUS);
+
+ if (!m_auiAdvisorGuid[0] || !m_auiAdvisorGuid[1] || !m_auiAdvisorGuid[2] || !m_auiAdvisorGuid[3])
+ {
+ error_log("TSCR: Kael'Thas One or more advisors missing, Skipping Phases 1-3");
+
+ DoScriptText(SAY_PHASE4_INTRO2, me);
+
+ Phase = 4;
+
+ m_pInstance->SetData(DATA_KAELTHASEVENT, 4);
+
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+
+ if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ AttackStart(pTarget);
+
+ }
+ else
+ {
+ PrepareAdvisors();
+
+ DoScriptText(SAY_INTRO, me);
+
+ m_pInstance->SetData(DATA_KAELTHASEVENT, 1);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+
+ PhaseSubphase = 0;
+ Phase_Timer = 23000;
+ Phase = 1;
+ }
+ }
+
+ void MoveInLineOfSight(Unit *who)
+ {
+ if (!me->hasUnitState(UNIT_STAT_STUNNED) && who->isTargetableForAttack() &&
+ me->IsHostileTo(who) && who->isInAccessiblePlaceFor(me))
+ {
+ if (!me->canFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
+ return;
+
+ float attackRadius = me->GetAttackDistance(who);
+ if (me->IsWithinDistInMap(who, attackRadius) && me->IsWithinLOSInMap(who))
+ {
+ if (!me->getVictim() && Phase >= 4)
+ {
+ who->RemoveAurasDueToSpell(SPELL_AURA_MOD_STEALTH);
+ AttackStart(who);
+ }
+ else if (me->GetMap()->IsDungeon())
+ {
+ if (m_pInstance && !m_pInstance->GetData(DATA_KAELTHASEVENT) && !Phase)
+ StartEvent();
+
+ who->SetInCombatWith(me);
+ me->AddThreat(who, 0.0f);
+ }
+ }
+ }
+ }
+
+ void Aggro(Unit * /*who*/)
+ {
+ if (m_pInstance && !m_pInstance->GetData(DATA_KAELTHASEVENT) && !Phase)
+ StartEvent();
+ }
+
+ void KilledUnit()
+ {
+ DoScriptText(RAND(SAY_SLAY1,SAY_SLAY2,SAY_SLAY3), me);
+ }
+
+ void JustSummoned(Creature* pSummoned)
+ {
+ // if not phoenix, then it's one of the 7 weapons
+ if (pSummoned->GetEntry() != NPC_PHOENIX)
+ {
+ if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ pSummoned->AI()->AttackStart(pTarget);
+
+ summons.Summon(pSummoned);
+ }
+ }
+
+ void SummonedCreatureDespawn(Creature *summon) {summons.Despawn(summon);}
+
+ void JustDied(Unit* /*Killer*/)
+ {
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+
+ DoScriptText(SAY_DEATH, me);
+
+ summons.DespawnAll();
+
+ if (m_pInstance)
+ m_pInstance->SetData(DATA_KAELTHASEVENT, 0);
+
+ for (uint8 i = 0; i < MAX_ADVISORS; ++i)
+ {
+ if (Unit* pAdvisor = Unit::GetUnit((*me), m_auiAdvisorGuid[i]))
+ pAdvisor->Kill(pAdvisor);
+ }
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ //Phase 1
+ switch (Phase)
+ {
+ case 1:
+ {
+ Unit *pTarget = NULL;
+ Creature* Advisor = NULL;
+
+ //Subphase switch
+ switch(PhaseSubphase)
+ {
+ //Subphase 1 - Start
+ case 0:
+ if (Phase_Timer <= diff)
+ {
+ DoScriptText(SAY_INTRO_THALADRED, me);
+
+ //start advisor within 7 seconds
+ Phase_Timer = 7000;
+ ++PhaseSubphase;
+ } else Phase_Timer -= diff;
+ break;
+
+ //Subphase 1 - Unlock advisor
+ case 1:
+ if (Phase_Timer <= diff)
+ {
+ Advisor = (Unit::GetCreature((*me), m_auiAdvisorGuid[0]));
+
+ if (Advisor)
+ {
+ Advisor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ Advisor->setFaction(me->getFaction());
+
+ pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0);
+ if (pTarget)
+ Advisor->AI()->AttackStart(pTarget);
+ }
+
+ ++PhaseSubphase;
+ } else Phase_Timer -= diff;
+ break;
+
+ //Subphase 2 - Start
+ case 2:
+ Advisor = (Unit::GetCreature((*me), m_auiAdvisorGuid[0]));
+
+ if (Advisor && (Advisor->getStandState() == UNIT_STAND_STATE_DEAD))
+ {
+ DoScriptText(SAY_INTRO_SANGUINAR, me);
+
+ //start advisor within 12.5 seconds
+ Phase_Timer = 12500;
+ ++PhaseSubphase;
+ }
+ break;
+
+ //Subphase 2 - Unlock advisor
+ case 3:
+ if (Phase_Timer <= diff)
+ {
+ Advisor = (Unit::GetCreature((*me), m_auiAdvisorGuid[1]));
+
+ if (Advisor)
+ {
+ Advisor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ Advisor->setFaction(me->getFaction());
+
+ pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0);
+ if (pTarget)
+ Advisor->AI()->AttackStart(pTarget);
+ }
+
+ ++PhaseSubphase;
+ } else Phase_Timer -= diff;
+ break;
+
+ //Subphase 3 - Start
+ case 4:
+ Advisor = (Unit::GetCreature((*me), m_auiAdvisorGuid[1]));
+
+ if (Advisor && (Advisor->getStandState() == UNIT_STAND_STATE_DEAD))
+ {
+ DoScriptText(SAY_INTRO_CAPERNIAN, me);
+
+ //start advisor within 7 seconds
+ Phase_Timer = 7000;
+ ++PhaseSubphase;
+ }
+ break;
+
+ //Subphase 3 - Unlock advisor
+ case 5:
+ if (Phase_Timer <= diff)
+ {
+ Advisor = (Unit::GetCreature((*me), m_auiAdvisorGuid[2]));
+
+ if (Advisor)
+ {
+ Advisor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ Advisor->setFaction(me->getFaction());
+
+ pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0);
+ if (pTarget)
+ Advisor->AI()->AttackStart(pTarget);
+ }
+
+ ++PhaseSubphase;
+ } else Phase_Timer -= diff;
+ break;
+
+ //Subphase 4 - Start
+ case 6:
+ Advisor = (Unit::GetCreature((*me), m_auiAdvisorGuid[2]));
+
+ if (Advisor && (Advisor->getStandState() == UNIT_STAND_STATE_DEAD))
+ {
+ DoScriptText(SAY_INTRO_TELONICUS, me);
+
+ //start advisor within 8.4 seconds
+ Phase_Timer = 8400;
+ ++PhaseSubphase;
+ }
+ break;
+
+ //Subphase 4 - Unlock advisor
+ case 7:
+ if (Phase_Timer <= diff)
+ {
+ Advisor = (Unit::GetCreature((*me), m_auiAdvisorGuid[3]));
+
+ if (Advisor)
+ {
+ Advisor->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ Advisor->setFaction(me->getFaction());
+
+ pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0);
+ if (pTarget)
+ Advisor->AI()->AttackStart(pTarget);
+ }
+
+ Phase_Timer = 3000;
+ ++PhaseSubphase;
+ } else Phase_Timer -= diff;
+ break;
+
+ //End of phase 1
+ case 8:
+ Advisor = (Unit::GetCreature((*me), m_auiAdvisorGuid[3]));
+
+ if (Advisor && (Advisor->getStandState() == UNIT_STAND_STATE_DEAD))
+ {
+ Phase = 2;
+ if (m_pInstance)
+ m_pInstance->SetData(DATA_KAELTHASEVENT, 2);
+
+ DoScriptText(SAY_PHASE2_WEAPON, me);
+
+ PhaseSubphase = 0;
+ Phase_Timer = 3500;
+ DoCast(me, SPELL_SUMMON_WEAPONS);
+ }
+ break;
+ }
+ }
+ break;
+
+ case 2:
+ {
+ if (PhaseSubphase == 0)
+ {
+ if (Phase_Timer <= diff)
+ {
+ PhaseSubphase = 1;
+ } else Phase_Timer -= diff;
+ }
+
+ //Spawn weapons
+ if (PhaseSubphase == 1)
+ {
+ DoCast(me, SPELL_SUMMON_WEAPONS, false);
+
+ uint8 uiMaxWeapon = sizeof(m_auiSpellSummonWeapon)/sizeof(uint32);
+
+ for (uint32 i = 0; i < uiMaxWeapon; ++i)
+ DoCast(me, m_auiSpellSummonWeapon[i], true);
+
+ PhaseSubphase = 2;
+ Phase_Timer = TIME_PHASE_2_3;
+ }
+
+ if (PhaseSubphase == 2)
+ {
+ if (Phase_Timer <= diff)
+ {
+ DoScriptText(SAY_PHASE3_ADVANCE, me);
+ if (m_pInstance)
+ m_pInstance->SetData(DATA_KAELTHASEVENT, 3);
+ Phase = 3;
+ PhaseSubphase = 0;
+ } else Phase_Timer -= diff;
+ }
+ }
+ break;
+
+ case 3:
+ {
+ if (PhaseSubphase == 0)
+ {
+ //Respawn advisors
+ Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0);
+
+ Creature *Advisor;
+ for (uint8 i = 0; i < MAX_ADVISORS; ++i)
+ {
+ Advisor = Unit::GetCreature((*me), m_auiAdvisorGuid[i]);
+
+ if (!Advisor)
+ error_log("SD2: Kael'Thas Advisor %u does not exist. Possibly despawned? Incorrectly Killed?", i);
+ else
+ CAST_AI(advisorbase_ai, Advisor->AI())->Revive(pTarget);
+ }
+
+ PhaseSubphase = 1;
+ Phase_Timer = TIME_PHASE_3_4;
+ }
+
+ if (Phase_Timer <= diff)
+ {
+ DoScriptText(SAY_PHASE4_INTRO2, me);
+ Phase = 4;
+
+ if (m_pInstance)
+ m_pInstance->SetData(DATA_KAELTHASEVENT, 4);
+
+ // Sometimes people can collect Aggro in Phase 1-3. Reset threat before releasing Kael.
+ DoResetThreat();
+
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+
+ if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ AttackStart(pTarget);
+
+ Phase_Timer = 30000;
+ } else Phase_Timer -= diff;
+ }
+ break;
+
+ case 4:
+ case 5:
+ case 6:
+ {
+ //Return since we have no target
+ if (!UpdateVictim())
+ return;
+
+ //Fireball_Timer
+ if (!InGravityLapse && !ChainPyros && Phase != 5)
+ {
+ if (Fireball_Timer <= diff)
+ {
+ if (!IsCastingFireball)
+ {
+ if (!me->IsNonMeleeSpellCasted(false))
+ {
+ //interruptable
+ me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false);
+ int32 dmg = 20000+rand()%5000;
+ me->CastCustomSpell(me->getVictim(), SPELL_FIREBALL, &dmg, 0, 0, false);
+ IsCastingFireball = true;
+ Fireball_Timer = 2500;
+ }
+ }
+ else
+ {
+ //apply resistance
+ me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true);
+ IsCastingFireball = false;
+ Fireball_Timer = 5000+rand()%10000;
+ }
+ } else Fireball_Timer -= diff;
+
+ //ArcaneDisruption_Timer
+ if (ArcaneDisruption_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_ARCANE_DISRUPTION, true);
+ ArcaneDisruption_Timer = 60000;
+ } else ArcaneDisruption_Timer -= diff;
+
+ if (FlameStrike_Timer <= diff)
+ {
+ if (Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ DoCast(pUnit, SPELL_FLAME_STRIKE);
+
+ FlameStrike_Timer = 30000;
+ } else FlameStrike_Timer -= diff;
+
+ if (MindControl_Timer <= diff)
+ {
+ if (me->getThreatManager().getThreatList().size() >= 2)
+ for (uint32 i = 0; i < 3; ++i)
+ {
+ debug_log("SD2: Kael'Thas mind control not supported.");
+ //DoCast(pUnit, SPELL_MIND_CONTROL);
+ }
+
+ MindControl_Timer = 60000;
+ } else MindControl_Timer -= diff;
+ }
+
+ //Phoenix_Timer
+ if (Phoenix_Timer <= diff)
+ {
+ DoCast(me, SPELL_PHOENIX_ANIMATION);
+ DoScriptText(RAND(SAY_SUMMON_PHOENIX1,SAY_SUMMON_PHOENIX2), me);
+
+ Phoenix_Timer = 60000;
+ } else Phoenix_Timer -= diff;
+
+ //Phase 4 specific spells
+ if (Phase == 4)
+ {
+ if (me->GetHealth()*100 / me->GetMaxHealth() < 50)
+ {
+ if (m_pInstance)
+ m_pInstance->SetData(DATA_KAELTHASEVENT, 4);
+ Phase = 5;
+ Phase_Timer = 10000;
+
+ DoScriptText(SAY_PHASE5_NUTS, me);
+
+ me->StopMoving();
+ me->GetMotionMaster()->Clear();
+ me->GetMotionMaster()->MoveIdle();
+ me->GetMap()->CreatureRelocation(me, afGravityPos[0], afGravityPos[1], afGravityPos[2], 0);
+ me->SendMonsterMove(afGravityPos[0], afGravityPos[1], afGravityPos[2], 0, 0, 0);
+
+ me->InterruptNonMeleeSpells(false);
+ DoCast(me, SPELL_FULLPOWER);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ }
+
+ //ShockBarrier_Timer
+ if (ShockBarrier_Timer <= diff)
+ {
+ DoCast(me, SPELL_SHOCK_BARRIER);
+ ChainPyros = true;
+ PyrosCasted = 0;
+ ShockBarrier_Timer = 60000;
+ } else ShockBarrier_Timer -= diff;
+
+ //Chain Pyros (3 of them max)
+ if (ChainPyros && !me->IsNonMeleeSpellCasted(false))
+ {
+ if (PyrosCasted < 3)
+ {
+ DoCast(me->getVictim(), SPELL_PYROBLAST);
+ ++PyrosCasted;
+ }
+ else
+ {
+ ChainPyros = false;
+ Fireball_Timer = 2500;
+ ArcaneDisruption_Timer = 60000;
+ }
+ }
+ }
+
+ if (Phase == 5)
+ {
+ if (Phase_Timer <= diff)
+ {
+ me->InterruptNonMeleeSpells(false);
+ me->RemoveAurasDueToSpell(SPELL_FULLPOWER);
+
+ DoCast(me, SPELL_EXPLODE);
+
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ Phase = 6;
+ AttackStart(me->getVictim());
+ } else Phase_Timer -= diff;
+ }
+
+ //Phase 5
+ if (Phase == 6)
+ {
+
+ //GravityLapse_Timer
+ if (GravityLapse_Timer <= diff)
+ {
+ std::list<HostileReference*>::const_iterator i = me->getThreatManager().getThreatList().begin();
+ switch (GravityLapse_Phase)
+ {
+ case 0:
+ me->StopMoving();
+ me->GetMotionMaster()->Clear();
+ me->GetMotionMaster()->MoveIdle();
+ me->GetMap()->CreatureRelocation(me, afGravityPos[0], afGravityPos[1], afGravityPos[2], 0);
+ me->SendMonsterMove(afGravityPos[0], afGravityPos[1], afGravityPos[2], 0, MOVEMENTFLAG_NONE, 0);
+
+ // 1) Kael'thas will portal the whole raid right into his body
+ for (i = me->getThreatManager().getThreatList().begin(); i!= me->getThreatManager().getThreatList().end(); ++i)
+ {
+ Unit* pUnit = Unit::GetUnit((*me), (*i)->getUnitGuid());
+ if (pUnit && (pUnit->GetTypeId() == TYPEID_PLAYER))
+ {
+ //Use work around packet to prevent player from being dropped from combat
+ DoTeleportPlayer(pUnit, afGravityPos[0], afGravityPos[1], afGravityPos[2], pUnit->GetOrientation());
+ }
+ }
+
+ GravityLapse_Timer = 500;
+ ++GravityLapse_Phase;
+ InGravityLapse = true;
+ ShockBarrier_Timer = 1000;
+ NetherBeam_Timer = 5000;
+ break;
+
+ case 1:
+ DoScriptText(RAND(SAY_GRAVITYLAPSE1,SAY_GRAVITYLAPSE2), me);
+
+ // 2) At that point he will put a Gravity Lapse debuff on everyone
+ for (i = me->getThreatManager().getThreatList().begin(); i != me->getThreatManager().getThreatList().end(); ++i)
+ {
+ if (Unit* pUnit = Unit::GetUnit((*me), (*i)->getUnitGuid()))
+ {
+ DoCast(pUnit, SPELL_KNOCKBACK, true);
+ //Gravity lapse - needs an exception in Spell system to work
+
+ pUnit->CastSpell(pUnit, SPELL_GRAVITY_LAPSE, true, 0, 0, me->GetGUID());
+ pUnit->CastSpell(pUnit, SPELL_GRAVITY_LAPSE_AURA, true, 0, 0, me->GetGUID());
+
+ //Using packet workaround
+ WorldPacket data(12);
+ data.SetOpcode(SMSG_MOVE_SET_CAN_FLY);
+ data.append(pUnit->GetPackGUID());
+ data << uint32(0);
+ pUnit->SendMessageToSet(&data, true);
+ }
+ }
+ GravityLapse_Timer = 10000;
+ ++GravityLapse_Phase;
+ break;
+
+ case 2:
+ //Cast nether vapor aura on self
+ me->InterruptNonMeleeSpells(false);
+ DoCast(me, SPELL_NETHER_VAPOR);
+
+ GravityLapse_Timer = 20000;
+ ++GravityLapse_Phase;
+ break;
+
+ case 3:
+ //Remove flight
+ for (i = me->getThreatManager().getThreatList().begin(); i!= me->getThreatManager().getThreatList().end(); ++i)
+ {
+ if (Unit* pUnit = Unit::GetUnit((*me), (*i)->getUnitGuid()))
+ {
+ //Using packet workaround
+ WorldPacket data(12);
+ data.SetOpcode(SMSG_MOVE_UNSET_CAN_FLY);
+ data.append(pUnit->GetPackGUID());
+ data << uint32(0);
+ pUnit->SendMessageToSet(&data, true);
+ }
+ }
+
+ me->RemoveAurasDueToSpell(SPELL_NETHER_VAPOR);
+ InGravityLapse = false;
+ GravityLapse_Timer = 60000;
+ GravityLapse_Phase = 0;
+ AttackStart(me->getVictim());
+ break;
+ }
+ } else GravityLapse_Timer -= diff;
+
+ if (InGravityLapse)
+ {
+ //ShockBarrier_Timer
+ if (ShockBarrier_Timer <= diff)
+ {
+ DoCast(me, SPELL_SHOCK_BARRIER);
+ ShockBarrier_Timer = 20000;
+ } else ShockBarrier_Timer -= diff;
+
+ //NetherBeam_Timer
+ if (NetherBeam_Timer <= diff)
+ {
+ if (Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ DoCast(pUnit, SPELL_NETHER_BEAM);
+
+ NetherBeam_Timer = 4000;
+ } else NetherBeam_Timer -= diff;
+ }
+ }
+
+ if (!InGravityLapse)
+ DoMeleeAttackIfReady();
+ }
+ }
+ }
+};
+
+//Thaladred the Darkener AI
+struct boss_thaladred_the_darkenerAI : public advisorbase_ai
+{
+ boss_thaladred_the_darkenerAI(Creature* pCreature) : advisorbase_ai(pCreature) {}
+
+ uint32 Gaze_Timer;
+ uint32 Silence_Timer;
+ uint32 PsychicBlow_Timer;
+
+ void Reset()
+ {
+ Gaze_Timer = 100;
+ Silence_Timer = 20000;
+ PsychicBlow_Timer = 10000;
+
+ advisorbase_ai::Reset();
+ }
+
+ void Aggro(Unit *who)
+ {
+ if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
+ return;
+
+ if (!who || FakeDeath)
+ return;
+
+ DoScriptText(SAY_THALADRED_AGGRO, me);
+ me->AddThreat(who, 5000000.0f);
+ }
+
+ void JustDied(Unit* /*pKiller*/)
+ {
+ if (m_pInstance && m_pInstance->GetData(DATA_KAELTHASEVENT) == 3)
+ DoScriptText(SAY_THALADRED_DEATH, me);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ advisorbase_ai::UpdateAI(diff);
+
+ //Faking death, don't do anything
+ if (FakeDeath)
+ return;
+
+ //Return since we have no target
+ if (!UpdateVictim())
+ return;
+
+ //Gaze_Timer
+ if (Gaze_Timer <= diff)
+ {
+ if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ {
+ DoResetThreat();
+ me->AddThreat(pTarget, 5000000.0f);
+ DoScriptText(EMOTE_THALADRED_GAZE, me, pTarget);
+ Gaze_Timer = 8500;
+ }
+ } else Gaze_Timer -= diff;
+
+ //Silence_Timer
+ if (Silence_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_SILENCE);
+ Silence_Timer = 20000;
+ } else Silence_Timer -= diff;
+
+ //PsychicBlow_Timer
+ if (PsychicBlow_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_PSYCHIC_BLOW);
+ PsychicBlow_Timer = 20000+rand()%5000;
+ } else PsychicBlow_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+//Lord Sanguinar AI
+struct boss_lord_sanguinarAI : public advisorbase_ai
+{
+ boss_lord_sanguinarAI(Creature* pCreature) : advisorbase_ai(pCreature) {}
+
+ uint32 Fear_Timer;
+
+ void Reset()
+ {
+ Fear_Timer = 20000;
+ advisorbase_ai::Reset();
+ }
+
+ void Aggro(Unit *who)
+ {
+ if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
+ return;
+
+ if (!who || FakeDeath)
+ return;
+
+ DoScriptText(SAY_SANGUINAR_AGGRO, me);
+ }
+
+ void JustDied(Unit* /*Killer*/)
+ {
+ if (m_pInstance && m_pInstance->GetData(DATA_KAELTHASEVENT) == 3)
+ DoScriptText(SAY_SANGUINAR_DEATH, me);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ advisorbase_ai::UpdateAI(diff);
+
+ //Faking death, don't do anything
+ if (FakeDeath)
+ return;
+
+ //Return since we have no target
+ if (!UpdateVictim())
+ return;
+
+ //Fear_Timer
+ if (Fear_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_BELLOWING_ROAR);
+ Fear_Timer = 25000+rand()%10000; //approximately every 30 seconds
+ } else Fear_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+//Grand Astromancer Capernian AI
+struct boss_grand_astromancer_capernianAI : public advisorbase_ai
+{
+ boss_grand_astromancer_capernianAI(Creature* pCreature) : advisorbase_ai(pCreature) {}
+
+ uint32 Fireball_Timer;
+ uint32 Conflagration_Timer;
+ uint32 ArcaneExplosion_Timer;
+ uint32 Yell_Timer;
+ bool Yell;
+
+ void Reset()
+ {
+ Fireball_Timer = 2000;
+ Conflagration_Timer = 20000;
+ ArcaneExplosion_Timer = 5000;
+ Yell_Timer = 2000;
+ Yell = false;
+
+ advisorbase_ai::Reset();
+ }
+
+ void JustDied(Unit* /*pKiller*/)
+ {
+ if (m_pInstance && m_pInstance->GetData(DATA_KAELTHASEVENT) == 3)
+ DoScriptText(SAY_CAPERNIAN_DEATH, me);
+ }
+
+ void AttackStart(Unit* who)
+ {
+ if (!who || FakeDeath || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
+ return;
+
+ if (me->Attack(who, true))
+ {
+ me->AddThreat(who, 0.0f);
+ me->SetInCombatWith(who);
+ who->SetInCombatWith(me);
+
+ me->GetMotionMaster()->MoveChase(who, CAPERNIAN_DISTANCE);
+ }
+ }
+
+ void Aggro(Unit *who)
+ {
+ if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
+ return;
+
+ if (!who || FakeDeath)
+ return;
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ advisorbase_ai::UpdateAI(diff);
+
+ //Faking Death, don't do anything
+ if (FakeDeath)
+ return;
+
+ //Return since we have no target
+ if (!UpdateVictim())
+ return;
+
+ //Yell_Timer
+ if (!Yell)
+ {
+ if (Yell_Timer <= diff)
+ {
+ DoScriptText(SAY_CAPERNIAN_AGGRO, me);
+ Yell = true;
+ } else Yell_Timer -= diff;
+ }
+
+ //Fireball_Timer
+ if (Fireball_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_CAPERNIAN_FIREBALL);
+ Fireball_Timer = 4000;
+ } else Fireball_Timer -= diff;
+
+ //Conflagration_Timer
+ if (Conflagration_Timer <= diff)
+ {
+ Unit *pTarget = NULL;
+ pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0);
+
+ if (pTarget && me->IsWithinDistInMap(pTarget, 30))
+ DoCast(pTarget, SPELL_CONFLAGRATION);
+ else
+ DoCast(me->getVictim(), SPELL_CONFLAGRATION);
+
+ Conflagration_Timer = 10000+rand()%5000;
+ } else Conflagration_Timer -= diff;
+
+ //ArcaneExplosion_Timer
+ if (ArcaneExplosion_Timer <= diff)
+ {
+ bool InMeleeRange = false;
+ Unit *pTarget = NULL;
+ std::list<HostileReference*>& m_threatlist = me->getThreatManager().getThreatList();
+ for (std::list<HostileReference*>::const_iterator i = m_threatlist.begin(); i!= m_threatlist.end(); ++i)
+ {
+ Unit* pUnit = Unit::GetUnit((*me), (*i)->getUnitGuid());
+ //if in melee range
+ if (pUnit && pUnit->IsWithinDistInMap(me, 5))
+ {
+ InMeleeRange = true;
+ pTarget = pUnit;
+ break;
+ }
+ }
+
+ if (InMeleeRange)
+ DoCast(pTarget, SPELL_ARCANE_EXPLOSION);
+
+ ArcaneExplosion_Timer = 4000+rand()%2000;
+ } else ArcaneExplosion_Timer -= diff;
+
+ //Do NOT deal any melee damage.
+ }
+};
+
+//Master Engineer Telonicus AI
+struct boss_master_engineer_telonicusAI : public advisorbase_ai
+{
+ boss_master_engineer_telonicusAI(Creature* pCreature) : advisorbase_ai(pCreature) {}
+
+ uint32 Bomb_Timer;
+ uint32 RemoteToy_Timer;
+
+ void Reset()
+ {
+ Bomb_Timer = 10000;
+ RemoteToy_Timer = 5000;
+
+ advisorbase_ai::Reset();
+ }
+
+ void JustDied(Unit* /*pKiller*/)
+ {
+ if (m_pInstance && m_pInstance->GetData(DATA_KAELTHASEVENT) == 3)
+ DoScriptText(SAY_TELONICUS_DEATH, me);
+ }
+
+ void Aggro(Unit *who)
+ {
+ if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
+ return;
+
+ if (!who || FakeDeath)
+ return;
+
+ DoScriptText(SAY_TELONICUS_AGGRO, me);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ advisorbase_ai::UpdateAI(diff);
+
+ //Faking Death, do nothing
+ if (FakeDeath)
+ return;
+
+ //Return since we have no target
+ if (!UpdateVictim())
+ return;
+
+ //Bomb_Timer
+ if (Bomb_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_BOMB);
+ Bomb_Timer = 25000;
+ } else Bomb_Timer -= diff;
+
+ //RemoteToy_Timer
+ if (RemoteToy_Timer <= diff)
+ {
+ if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+ DoCast(pTarget, SPELL_REMOTE_TOY);
+
+ RemoteToy_Timer = 10000+rand()%5000;
+ } else RemoteToy_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+//Flame Strike AI
+struct mob_kael_flamestrikeAI : public Scripted_NoMovementAI
+{
+ mob_kael_flamestrikeAI(Creature* pCreature) : Scripted_NoMovementAI(pCreature) {}
+
+ uint32 Timer;
+ bool Casting;
+ bool KillSelf;
+
+ void Reset()
+ {
+ Timer = 5000;
+ Casting = false;
+ KillSelf = false;
+
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->setFaction(14);
+ }
+
+ void MoveInLineOfSight(Unit * /*who*/) {}
+
+ void EnterCombat(Unit * /*who*/) {}
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!Casting)
+ {
+ DoCast(me, SPELL_FLAME_STRIKE_VIS);
+ Casting = true;
+ }
+
+ //Timer
+ if (Timer <= diff)
+ {
+ if (!KillSelf)
+ {
+ me->InterruptNonMeleeSpells(false);
+ DoCast(me, SPELL_FLAME_STRIKE_DMG);
+ } else me->Kill(me);
+
+ KillSelf = true;
+ Timer = 1000;
+ } else Timer -= diff;
+ }
+};
+
+//Phoenix AI
+struct mob_phoenix_tkAI : public ScriptedAI
+{
+ mob_phoenix_tkAI(Creature* pCreature) : ScriptedAI(pCreature) {}
+
+ uint32 Cycle_Timer;
+
+ void Reset()
+ {
+ Cycle_Timer = 2000;
+ DoCast(me, SPELL_BURN, true);
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ //is this spell in use anylonger?
+ //DoCast(me, SPELL_EMBER_BLAST, true);
+ me->SummonCreature(NPC_PHOENIX_EGG,me->GetPositionX(),me->GetPositionY(),me->GetPositionZ(),me->GetOrientation(),TEMPSUMMON_TIMED_DESPAWN,16000);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (Cycle_Timer <= diff)
+ {
+ //spell Burn should possible do this, but it doesn't, so do this for now.
+ uint32 dmg = urand(4500,5500);
+ if (me->GetHealth() > dmg)
+ me->SetHealth(uint32(me->GetHealth()-dmg));
+ Cycle_Timer = 2000;
+ } else Cycle_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+//Phoenix Egg AI
+struct mob_phoenix_egg_tkAI : public ScriptedAI
+{
+ mob_phoenix_egg_tkAI(Creature* pCreature) : ScriptedAI(pCreature) {}
+
+ uint32 Rebirth_Timer;
+
+ void Reset()
+ {
+ Rebirth_Timer = 15000;
+ }
+
+ //ignore any
+ void MoveInLineOfSight(Unit* /*who*/) {}
+
+ void AttackStart(Unit* who)
+ {
+ if (me->Attack(who, false))
+ {
+ me->SetInCombatWith(who);
+ who->SetInCombatWith(me);
+
+ DoStartNoMovement(who);
+ }
+ }
+
+ void JustSummoned(Creature* summoned)
+ {
+ summoned->AddThreat(me->getVictim(), 0.0f);
+ summoned->CastSpell(summoned,SPELL_REBIRTH,false);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!Rebirth_Timer)
+ return;
+
+ if (Rebirth_Timer <= diff)
+ {
+ me->SummonCreature(NPC_PHOENIX,me->GetPositionX(),me->GetPositionY(),me->GetPositionZ(),me->GetOrientation(),TEMPSUMMON_CORPSE_DESPAWN,5000);
+ Rebirth_Timer = 0;
+ } else Rebirth_Timer -= diff;
+ }
+};
+
+CreatureAI* GetAI_boss_kaelthas(Creature* pCreature)
+{
+ return new boss_kaelthasAI(pCreature);
+}
+
+CreatureAI* GetAI_boss_thaladred_the_darkener(Creature* pCreature)
+{
+ return new boss_thaladred_the_darkenerAI(pCreature);
+}
+
+CreatureAI* GetAI_boss_lord_sanguinar(Creature* pCreature)
+{
+ return new boss_lord_sanguinarAI(pCreature);
+}
+
+CreatureAI* GetAI_boss_grand_astromancer_capernian(Creature* pCreature)
+{
+ return new boss_grand_astromancer_capernianAI(pCreature);
+}
+
+CreatureAI* GetAI_boss_master_engineer_telonicus(Creature* pCreature)
+{
+ return new boss_master_engineer_telonicusAI(pCreature);
+}
+
+CreatureAI* GetAI_mob_kael_flamestrike(Creature* pCreature)
+{
+ return new mob_kael_flamestrikeAI(pCreature);
+}
+
+CreatureAI* GetAI_mob_phoenix_tk(Creature* pCreature)
+{
+ return new mob_phoenix_tkAI(pCreature);
+}
+
+CreatureAI* GetAI_mob_phoenix_egg_tk(Creature* pCreature)
+{
+ return new mob_phoenix_egg_tkAI(pCreature);
+}
+
+void AddSC_boss_kaelthas()
+{
+ Script *newscript;
+ newscript = new Script;
+ newscript->Name = "boss_kaelthas";
+ newscript->GetAI = &GetAI_boss_kaelthas;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "boss_thaladred_the_darkener";
+ newscript->GetAI = &GetAI_boss_thaladred_the_darkener;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "boss_lord_sanguinar";
+ newscript->GetAI = &GetAI_boss_lord_sanguinar;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "boss_grand_astromancer_capernian";
+ newscript->GetAI = &GetAI_boss_grand_astromancer_capernian;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "boss_master_engineer_telonicus";
+ newscript->GetAI = &GetAI_boss_master_engineer_telonicus;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "mob_kael_flamestrike";
+ newscript->GetAI = &GetAI_mob_kael_flamestrike;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "mob_phoenix_tk";
+ newscript->GetAI = &GetAI_mob_phoenix_tk;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "mob_phoenix_egg_tk";
+ newscript->GetAI = &GetAI_mob_phoenix_egg_tk;
+ newscript->RegisterSelf();
+}
diff --git a/src/server/scripts/Outland/TempestKeep/the_eye/boss_void_reaver.cpp b/src/server/scripts/Outland/TempestKeep/the_eye/boss_void_reaver.cpp
new file mode 100644
index 00000000000..e1b60b20948
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/the_eye/boss_void_reaver.cpp
@@ -0,0 +1,179 @@
+/* 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 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Boss_Void_Reaver
+SD%Complete: 90
+SDComment: Should reset if raid are out of room.
+SDCategory: Tempest Keep, The Eye
+EndScriptData */
+
+#include "ScriptedPch.h"
+#include "the_eye.h"
+
+enum eEnums
+{
+ SAY_AGGRO = -1550000,
+ SAY_SLAY1 = -1550001,
+ SAY_SLAY2 = -1550002,
+ SAY_SLAY3 = -1550003,
+ SAY_DEATH = -1550004,
+ SAY_POUNDING1 = -1550005,
+ SAY_POUNDING2 = -1550006,
+
+ SPELL_POUNDING = 34162,
+ SPELL_ARCANE_ORB = 34172,
+ SPELL_KNOCK_AWAY = 25778,
+ SPELL_BERSERK = 27680
+};
+
+struct boss_void_reaverAI : public ScriptedAI
+{
+ boss_void_reaverAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = c->GetInstanceData();
+ }
+
+ ScriptedInstance* pInstance;
+
+ uint32 Pounding_Timer;
+ uint32 ArcaneOrb_Timer;
+ uint32 KnockAway_Timer;
+ uint32 Berserk_Timer;
+
+ bool Enraged;
+
+ void Reset()
+ {
+ Pounding_Timer = 15000;
+ ArcaneOrb_Timer = 3000;
+ KnockAway_Timer = 30000;
+ Berserk_Timer = 600000;
+
+ Enraged = false;
+
+ if (pInstance && me->isAlive())
+ pInstance->SetData(DATA_VOIDREAVEREVENT, NOT_STARTED);
+ }
+
+ void KilledUnit(Unit * /*victim*/)
+ {
+ DoScriptText(RAND(SAY_SLAY1,SAY_SLAY2,SAY_SLAY3), me);
+ }
+
+ void JustDied(Unit * /*victim*/)
+ {
+ DoScriptText(SAY_DEATH, me);
+ DoZoneInCombat();
+
+ if (pInstance)
+ pInstance->SetData(DATA_VOIDREAVEREVENT, DONE);
+ }
+
+ void EnterCombat(Unit * /*who*/)
+ {
+ DoScriptText(SAY_AGGRO, me);
+
+ if (pInstance)
+ pInstance->SetData(DATA_VOIDREAVEREVENT, IN_PROGRESS);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ // Pounding
+ if (Pounding_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_POUNDING);
+
+ DoScriptText(RAND(SAY_POUNDING1,SAY_POUNDING2), me);
+ Pounding_Timer = 15000; //cast time(3000) + cooldown time(12000)
+ } else Pounding_Timer -= diff;
+
+ // Arcane Orb
+ if (ArcaneOrb_Timer <= diff)
+ {
+ Unit *pTarget = NULL;
+ std::list<HostileReference *> t_list = me->getThreatManager().getThreatList();
+ std::vector<Unit *> target_list;
+ for (std::list<HostileReference *>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
+ {
+ pTarget = Unit::GetUnit(*me, (*itr)->getUnitGuid());
+ if (!pTarget)
+ continue;
+
+ // exclude pets & totems
+ if (pTarget->GetTypeId() != TYPEID_PLAYER)
+ continue;
+
+ //18 yard radius minimum
+ if (pTarget && pTarget->GetTypeId() == TYPEID_PLAYER && pTarget->isAlive() && !pTarget->IsWithinDist(me, 18, false))
+ target_list.push_back(pTarget);
+ pTarget = NULL;
+ }
+
+ if (target_list.size())
+ pTarget = *(target_list.begin()+rand()%target_list.size());
+ else
+ pTarget = me->getVictim();
+
+ if (pTarget)
+ me->CastSpell(pTarget->GetPositionX(),pTarget->GetPositionY(),pTarget->GetPositionZ(), SPELL_ARCANE_ORB, false, NULL, NULL, NULL, pTarget);
+
+ ArcaneOrb_Timer = 3000;
+ } else ArcaneOrb_Timer -= diff;
+
+ // Single Target knock back, reduces aggro
+ if (KnockAway_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_KNOCK_AWAY);
+
+ //Drop 25% aggro
+ if (DoGetThreat(me->getVictim()))
+ DoModifyThreatPercent(me->getVictim(),-25);
+
+ KnockAway_Timer = 30000;
+ } else KnockAway_Timer -= diff;
+
+ //Berserk
+ if (Berserk_Timer < diff && !Enraged)
+ {
+ DoCast(me, SPELL_BERSERK);
+ Enraged = true;
+ } else Berserk_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+
+ EnterEvadeIfOutOfCombatArea(diff);
+ }
+};
+
+CreatureAI* GetAI_boss_void_reaver(Creature* pCreature)
+{
+ return new boss_void_reaverAI (pCreature);
+}
+
+void AddSC_boss_void_reaver()
+{
+ Script *newscript;
+ newscript = new Script;
+ newscript->Name = "boss_void_reaver";
+ newscript->GetAI = &GetAI_boss_void_reaver;
+ newscript->RegisterSelf();
+}
+
diff --git a/src/server/scripts/Outland/TempestKeep/the_eye/instance_the_eye.cpp b/src/server/scripts/Outland/TempestKeep/the_eye/instance_the_eye.cpp
new file mode 100644
index 00000000000..59c72071238
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/the_eye/instance_the_eye.cpp
@@ -0,0 +1,176 @@
+/* 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 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Instance_The_Eye
+SD%Complete: 100
+SDComment:
+SDCategory: Tempest Keep, The Eye
+EndScriptData */
+
+#include "ScriptedPch.h"
+#include "the_eye.h"
+
+#define MAX_ENCOUNTER 5
+
+/* The Eye encounters:
+0 - Kael'thas event
+1 - Al' ar event
+2 - Solarian Event
+3 - Void Reaver event
+*/
+
+struct instance_the_eye : public ScriptedInstance
+{
+ instance_the_eye(Map* pMap) : ScriptedInstance(pMap) {Initialize();};
+
+ uint64 ThaladredTheDarkener;
+ uint64 LordSanguinar;
+ uint64 GrandAstromancerCapernian;
+ uint64 MasterEngineerTelonicus;
+ uint64 Kaelthas;
+ uint64 Astromancer;
+ uint64 Alar;
+
+ uint8 KaelthasEventPhase;
+ uint8 AlarEventPhase;
+
+ uint32 m_auiEncounter[MAX_ENCOUNTER];
+
+ void Initialize()
+ {
+ memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
+
+ ThaladredTheDarkener = 0;
+ LordSanguinar = 0;
+ GrandAstromancerCapernian = 0;
+ MasterEngineerTelonicus = 0;
+ Kaelthas = 0;
+ Astromancer = 0;
+ Alar = 0;
+
+ KaelthasEventPhase = 0;
+ AlarEventPhase = 0;
+ }
+
+ bool IsEncounterInProgress() const
+ {
+ for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+ if (m_auiEncounter[i] == IN_PROGRESS) return true;
+
+ return false;
+ }
+
+ void OnCreatureCreate(Creature* pCreature, bool /*add*/)
+ {
+ switch(pCreature->GetEntry())
+ {
+ case 20064: ThaladredTheDarkener = pCreature->GetGUID(); break;
+ case 20063: MasterEngineerTelonicus = pCreature->GetGUID(); break;
+ case 20062: GrandAstromancerCapernian = pCreature->GetGUID(); break;
+ case 20060: LordSanguinar = pCreature->GetGUID(); break;
+ case 19622: Kaelthas = pCreature->GetGUID(); break;
+ case 18805: Astromancer = pCreature->GetGUID(); break;
+ case 19514: Alar = pCreature->GetGUID(); break;
+ }
+ }
+
+ uint64 GetData64(uint32 identifier)
+ {
+ switch(identifier)
+ {
+ case DATA_THALADREDTHEDARKENER: return ThaladredTheDarkener;
+ case DATA_LORDSANGUINAR: return LordSanguinar;
+ case DATA_GRANDASTROMANCERCAPERNIAN: return GrandAstromancerCapernian;
+ case DATA_MASTERENGINEERTELONICUS: return MasterEngineerTelonicus;
+ case DATA_KAELTHAS: return Kaelthas;
+ case DATA_ASTROMANCER: return Astromancer;
+ case DATA_ALAR: return Alar;
+ }
+ return 0;
+ }
+
+ void SetData(uint32 type, uint32 data)
+ {
+ switch(type)
+ {
+ case DATA_ALAREVENT: AlarEventPhase = data; m_auiEncounter[0] = data; break;
+ case DATA_HIGHASTROMANCERSOLARIANEVENT: m_auiEncounter[1] = data; break;
+ case DATA_VOIDREAVEREVENT: m_auiEncounter[2] = data; break;
+ case DATA_KAELTHASEVENT: KaelthasEventPhase = data; m_auiEncounter[3] = data; break;
+ }
+ if (data == DONE)
+ SaveToDB();
+ }
+
+ uint32 GetData(uint32 type)
+ {
+ switch(type)
+ {
+ case DATA_ALAREVENT: return AlarEventPhase;
+ case DATA_HIGHASTROMANCERSOLARIANEVENT: return m_auiEncounter[1];
+ case DATA_VOIDREAVEREVENT: return m_auiEncounter[2];
+ case DATA_KAELTHASEVENT: return KaelthasEventPhase;
+ }
+ return 0;
+ }
+
+ std::string GetSaveData()
+ {
+ OUT_SAVE_INST_DATA;
+ std::ostringstream stream;
+ stream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3];
+ char* out = new char[stream.str().length() + 1];
+ strcpy(out, stream.str().c_str());
+ if (out)
+ {
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return out;
+ }
+ return NULL;
+ }
+
+ void Load(const char* in)
+ {
+ if (!in)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
+ OUT_LOAD_INST_DATA(in);
+ std::istringstream stream(in);
+ stream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3];
+ for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+ if (m_auiEncounter[i] == IN_PROGRESS) // Do not load an encounter as "In Progress" - reset it instead.
+ m_auiEncounter[i] = NOT_STARTED;
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
+};
+
+InstanceData* GetInstanceData_instance_the_eye(Map* pMap)
+{
+ return new instance_the_eye(pMap);
+}
+
+void AddSC_instance_the_eye()
+{
+ Script *newscript;
+ newscript = new Script;
+ newscript->Name = "instance_the_eye";
+ newscript->GetInstanceData = &GetInstanceData_instance_the_eye;
+ newscript->RegisterSelf();
+}
+
diff --git a/src/server/scripts/Outland/TempestKeep/the_eye/the_eye.cpp b/src/server/scripts/Outland/TempestKeep/the_eye/the_eye.cpp
new file mode 100644
index 00000000000..97021fdc031
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/the_eye/the_eye.cpp
@@ -0,0 +1,98 @@
+/* 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 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: The_Eye
+SD%Complete: 100
+SDComment:
+SDCategory: Tempest Keep, The Eye
+EndScriptData */
+
+/* ContentData
+mob_crystalcore_devastator
+EndContentData */
+
+#include "ScriptedPch.h"
+#include "the_eye.h"
+
+#define SPELL_COUNTERCHARGE 35035
+#define SPELL_KNOCKAWAY 22893
+
+struct mob_crystalcore_devastatorAI : public ScriptedAI
+{
+ mob_crystalcore_devastatorAI(Creature *c) : ScriptedAI(c) {}
+
+ uint32 Knockaway_Timer;
+ uint32 Countercharge_Timer;
+
+ void Reset()
+ {
+ Countercharge_Timer = 9000;
+ Knockaway_Timer = 25000;
+ }
+
+ void EnterCombat(Unit * /*who*/)
+ {
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ //Check if we have a current target
+ //Knockaway_Timer
+ if (Knockaway_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_KNOCKAWAY, true);
+
+ // current aggro target is knocked away pick new target
+ Unit* pTarget = SelectUnit(SELECT_TARGET_TOPAGGRO, 0);
+
+ if (!pTarget || pTarget == me->getVictim())
+ pTarget = SelectUnit(SELECT_TARGET_TOPAGGRO, 1);
+
+ if (pTarget)
+ me->TauntApply(pTarget);
+
+ Knockaway_Timer = 23000;
+ } else Knockaway_Timer -= diff;
+
+ //Countercharge_Timer
+ if (Countercharge_Timer <= diff)
+ {
+ DoCast(me, SPELL_COUNTERCHARGE);
+ Countercharge_Timer = 45000;
+ } else Countercharge_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+CreatureAI* GetAI_mob_crystalcore_devastator(Creature* pCreature)
+{
+ return new mob_crystalcore_devastatorAI (pCreature);
+}
+
+void AddSC_the_eye()
+{
+ Script *newscript;
+ newscript = new Script;
+ newscript->Name = "mob_crystalcore_devastator";
+ newscript->GetAI = &GetAI_mob_crystalcore_devastator;
+ newscript->RegisterSelf();
+}
+
diff --git a/src/server/scripts/Outland/TempestKeep/the_eye/the_eye.h b/src/server/scripts/Outland/TempestKeep/the_eye/the_eye.h
new file mode 100644
index 00000000000..d0d3ea09061
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/the_eye/the_eye.h
@@ -0,0 +1,20 @@
+/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
+ * This program is free software licensed under GPL version 2
+ * Please see the included DOCS/LICENSE.TXT for more information */
+
+#ifndef DEF_THE_EYE_H
+#define DEF_THE_EYE_H
+
+#define DATA_ALAREVENT 1
+#define DATA_ASTROMANCER 2
+#define DATA_GRANDASTROMANCERCAPERNIAN 3
+#define DATA_HIGHASTROMANCERSOLARIANEVENT 4
+#define DATA_KAELTHAS 5
+#define DATA_KAELTHASEVENT 6
+#define DATA_LORDSANGUINAR 7
+#define DATA_MASTERENGINEERTELONICUS 8
+#define DATA_THALADREDTHEDARKENER 10
+#define DATA_VOIDREAVEREVENT 11
+#define DATA_ALAR 12
+#endif
+
diff --git a/src/server/scripts/Outland/TempestKeep/the_mechanar/boss_gatewatcher_gyrokill.cpp b/src/server/scripts/Outland/TempestKeep/the_mechanar/boss_gatewatcher_gyrokill.cpp
new file mode 100644
index 00000000000..b9c365eda65
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/the_mechanar/boss_gatewatcher_gyrokill.cpp
@@ -0,0 +1,39 @@
+/* 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 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Boss_Gatewatcher_Gyrokill
+SD%Complete: 0
+SDComment: Place Holder
+SDCategory: Tempest Keep, The Mechanar
+EndScriptData */
+
+#include "ScriptedPch.h"
+
+//not used
+#define SAY_AGGRO -1554000
+#define SAY_SAW_ATTACK1 -1554001
+#define SAY_SAW_ATTACK2 -1554002
+#define SAY_SLAY1 -1554003
+#define SAY_SLAY2 -1554004
+#define SAY_DEATH -1554005
+
+#define SPELL_STREAM_OF_MACHINE_FLUID 35311
+#define SPELL_SAW_BLADE 35318
+#define H_SPELL_SAW_BLADE 39192
+#define SPELL_SHADOW_POWER 35322
+#define H_SPELL_SHADOW_POWER 39193
+
diff --git a/src/server/scripts/Outland/TempestKeep/the_mechanar/boss_gatewatcher_ironhand.cpp b/src/server/scripts/Outland/TempestKeep/the_mechanar/boss_gatewatcher_ironhand.cpp
new file mode 100644
index 00000000000..50c3a6171ce
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/the_mechanar/boss_gatewatcher_ironhand.cpp
@@ -0,0 +1,130 @@
+/* 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 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, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+/* ScriptData
+SDName: Boss_Gatewatcher_Ironhand
+SD%Complete: 75
+SDComment:
+SDCategory: Tempest Keep, The Mechanar
+EndScriptData */
+
+#include "ScriptedPch.h"
+
+#define SAY_AGGRO_1 -1554006
+#define SAY_HAMMER_1 -1554007
+#define SAY_HAMMER_2 -1554008
+#define SAY_SLAY_1 -1554009
+#define SAY_SLAY_2 -1554010
+#define SAY_DEATH_1 -1554011
+#define EMOTE_HAMMER -1554012
+
+// Spells to be casted
+#define SPELL_SHADOW_POWER 35322
+#define H_SPELL_SHADOW_POWER 39193
+#define SPELL_HAMMER_PUNCH 35326
+#define SPELL_JACKHAMMER 35327
+#define H_SPELL_JACKHAMMER 39194
+#define SPELL_STREAM_OF_MACHINE_FLUID 35311
+
+// Gatewatcher Iron-Hand AI
+struct boss_gatewatcher_iron_handAI : public ScriptedAI
+{
+ boss_gatewatcher_iron_handAI(Creature *c) : ScriptedAI(c)
+ {
+ }
+
+ uint32 Shadow_Power_Timer;
+ uint32 Jackhammer_Timer;
+ uint32 Stream_of_Machine_Fluid_Timer;
+
+ void Reset()
+ {
+ Shadow_Power_Timer = 25000;
+ Jackhammer_Timer = 45000;
+ Stream_of_Machine_Fluid_Timer = 55000;
+
+ }
+ void EnterCombat(Unit * /*who*/)
+ {
+ DoScriptText(SAY_AGGRO_1, me);
+ }
+
+ void KilledUnit(Unit* /*victim*/)
+ {
+ if (rand()%2)
+ return;
+
+ DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
+ }
+
+ void JustDied(Unit* /*Killer*/)
+ {
+ DoScriptText(SAY_DEATH_1, me);
+ //TODO: Add door check/open code
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ //Return since we have no target
+ if (!UpdateVictim())
+ return;
+
+ //Shadow Power
+ if (Shadow_Power_Timer <= diff)
+ {
+ DoCast(me, SPELL_SHADOW_POWER);
+ Shadow_Power_Timer = 20000 + rand()%8000;
+ } else Shadow_Power_Timer -= diff;
+
+ //Jack Hammer
+ if (Jackhammer_Timer <= diff)
+ {
+ //TODO: expect cast this about 5 times in a row (?), announce it by emote only once
+ DoScriptText(EMOTE_HAMMER, me);
+ DoCast(me->getVictim(), SPELL_JACKHAMMER);
+
+ //chance to yell, but not same time as emote (after spell in fact casted)
+ if (rand()%2)
+ return;
+
+ DoScriptText(RAND(SAY_HAMMER_1,SAY_HAMMER_2), me);
+ Jackhammer_Timer = 30000;
+ } else Jackhammer_Timer -= diff;
+
+ //Stream of Machine Fluid
+ if (Stream_of_Machine_Fluid_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_STREAM_OF_MACHINE_FLUID);
+ Stream_of_Machine_Fluid_Timer = 35000 + rand()%15000;
+ } else Stream_of_Machine_Fluid_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+};
+CreatureAI* GetAI_boss_gatewatcher_iron_hand(Creature* pCreature)
+{
+ return new boss_gatewatcher_iron_handAI (pCreature);
+}
+
+void AddSC_boss_gatewatcher_iron_hand()
+{
+ Script *newscript;
+ newscript = new Script;
+ newscript->Name = "boss_gatewatcher_iron_hand";
+ newscript->GetAI = &GetAI_boss_gatewatcher_iron_hand;
+ newscript->RegisterSelf();
+}
+
diff --git a/src/server/scripts/Outland/TempestKeep/the_mechanar/boss_nethermancer_sepethrea.cpp b/src/server/scripts/Outland/TempestKeep/the_mechanar/boss_nethermancer_sepethrea.cpp
new file mode 100644
index 00000000000..ededec0196d
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/the_mechanar/boss_nethermancer_sepethrea.cpp
@@ -0,0 +1,245 @@
+/* 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 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, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+/* ScriptData
+SDName: Boss_Nethermancer_Sepethrea
+SD%Complete: 90
+SDComment: Need adjustments to initial summons
+SDCategory: Tempest Keep, The Mechanar
+EndScriptData */
+
+#include "ScriptedPch.h"
+#include "mechanar.h"
+
+#define SAY_AGGRO -1554013
+#define SAY_SUMMON -1554014
+#define SAY_DRAGONS_BREATH_1 -1554015
+#define SAY_DRAGONS_BREATH_2 -1554016
+#define SAY_SLAY1 -1554017
+#define SAY_SLAY2 -1554018
+#define SAY_DEATH -1554019
+
+#define SPELL_SUMMON_RAGIN_FLAMES 35275
+#define H_SPELL_SUMMON_RAGIN_FLAMES 39084
+
+#define SPELL_FROST_ATTACK 35263
+#define SPELL_ARCANE_BLAST 35314
+#define SPELL_DRAGONS_BREATH 35250
+#define SPELL_KNOCKBACK 37317
+#define SPELL_SOLARBURN 35267
+
+struct boss_nethermancer_sepethreaAI : public ScriptedAI
+{
+ boss_nethermancer_sepethreaAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = c->GetInstanceData();
+ }
+
+ ScriptedInstance *pInstance;
+
+ uint32 frost_attack_Timer;
+ uint32 arcane_blast_Timer;
+ uint32 dragons_breath_Timer;
+ uint32 knockback_Timer;
+ uint32 solarburn_Timer;
+
+ void Reset()
+ {
+ frost_attack_Timer = 7000 + rand()%3000;
+ arcane_blast_Timer = 12000 + rand()%6000;
+ dragons_breath_Timer = 18000 + rand()%4000;
+ knockback_Timer = 22000 + rand()%6000;
+ solarburn_Timer = 30000;
+
+ if (pInstance)
+ pInstance->SetData(DATA_NETHERMANCER_EVENT, NOT_STARTED);
+ }
+
+ void EnterCombat(Unit* who)
+ {
+ if (pInstance)
+ pInstance->SetData(DATA_NETHERMANCER_EVENT, IN_PROGRESS);
+
+ DoScriptText(SAY_AGGRO, me);
+ DoCast(who, SPELL_SUMMON_RAGIN_FLAMES);
+ DoScriptText(SAY_SUMMON, me);
+ }
+
+ void KilledUnit(Unit* /*victim*/)
+ {
+ DoScriptText(RAND(SAY_SLAY1,SAY_SLAY2), me);
+ }
+
+ void JustDied(Unit* /*Killer*/)
+ {
+ DoScriptText(SAY_DEATH, me);
+
+ if (pInstance)
+ pInstance->SetData(DATA_NETHERMANCER_EVENT, DONE);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ //Return since we have no target
+ if (!UpdateVictim())
+ return;
+
+ //Frost Attack
+ if (frost_attack_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_FROST_ATTACK);
+ frost_attack_Timer = 7000 + rand()%3000;
+ } else frost_attack_Timer -= diff;
+
+ //Arcane Blast
+ if (arcane_blast_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_ARCANE_BLAST);
+ arcane_blast_Timer = 15000;
+ } else arcane_blast_Timer -= diff;
+
+ //Dragons Breath
+ if (dragons_breath_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_DRAGONS_BREATH);
+ {
+ if (rand()%2)
+ return;
+
+ DoScriptText(RAND(SAY_DRAGONS_BREATH_1,SAY_DRAGONS_BREATH_2), me);
+ }
+ dragons_breath_Timer = 12000 + rand()%10000;
+ } else dragons_breath_Timer -= diff;
+
+ //Knockback
+ if (knockback_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_KNOCKBACK);
+ knockback_Timer = 15000 + rand()%10000;
+ } else knockback_Timer -= diff;
+
+ //Solarburn
+ if (solarburn_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_SOLARBURN);
+ solarburn_Timer = 30000;
+ } else solarburn_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+CreatureAI* GetAI_boss_nethermancer_sepethrea(Creature* pCreature)
+{
+ return new boss_nethermancer_sepethreaAI (pCreature);
+}
+
+#define SPELL_INFERNO 35268
+#define H_SPELL_INFERNO 39346
+#define SPELL_FIRE_TAIL 35278
+
+struct mob_ragin_flamesAI : public ScriptedAI
+{
+ mob_ragin_flamesAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = c->GetInstanceData();
+ }
+
+ ScriptedInstance *pInstance;
+
+ uint32 inferno_Timer;
+ uint32 flame_timer;
+ uint32 Check_Timer;
+
+ bool onlyonce;
+
+ void Reset()
+ {
+ inferno_Timer = 10000;
+ flame_timer = 500;
+ Check_Timer = 2000;
+ onlyonce = false;
+ me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);
+ me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true);
+ me->SetSpeed(MOVE_RUN, DUNGEON_MODE(0.5f, 0.7f));
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ //Check_Timer
+ if (Check_Timer <= diff)
+ {
+ if (pInstance)
+ {
+ if (pInstance->GetData(DATA_NETHERMANCER_EVENT) != IN_PROGRESS)
+ {
+ //remove
+ me->setDeathState(JUST_DIED);
+ me->RemoveCorpse();
+ }
+ }
+ Check_Timer = 1000;
+ } else Check_Timer -= diff;
+
+ if (!UpdateVictim())
+ return;
+
+ if (!onlyonce)
+ {
+ if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
+ me->GetMotionMaster()->MoveChase(pTarget);
+ onlyonce = true;
+ }
+
+ if (inferno_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_INFERNO);
+ me->TauntApply(me->getVictim());
+ inferno_Timer = 10000;
+ } else inferno_Timer -= diff;
+
+ if (flame_timer <= diff)
+ {
+ DoCast(me, SPELL_FIRE_TAIL);
+ flame_timer = 500;
+ } else flame_timer -=diff;
+
+ DoMeleeAttackIfReady();
+ }
+
+};
+CreatureAI* GetAI_mob_ragin_flames(Creature* pCreature)
+{
+ return new mob_ragin_flamesAI (pCreature);
+}
+void AddSC_boss_nethermancer_sepethrea()
+{
+ Script *newscript;
+ newscript = new Script;
+ newscript->Name = "boss_nethermancer_sepethrea";
+ newscript->GetAI = &GetAI_boss_nethermancer_sepethrea;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "mob_ragin_flames";
+ newscript->GetAI = &GetAI_mob_ragin_flames;
+ newscript->RegisterSelf();
+}
+
diff --git a/src/server/scripts/Outland/TempestKeep/the_mechanar/boss_pathaleon_the_calculator.cpp b/src/server/scripts/Outland/TempestKeep/the_mechanar/boss_pathaleon_the_calculator.cpp
new file mode 100644
index 00000000000..c0c06704db7
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/the_mechanar/boss_pathaleon_the_calculator.cpp
@@ -0,0 +1,246 @@
+/* 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 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, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+/* ScriptData
+SDName: Boss Pathaleon the Calculator
+SD%Complete: 50
+SDComment: Event missing. Script for himself 99% blizzlike.
+SDCategory: Tempest Keep, The Mechanar
+EndScriptData */
+
+#include "ScriptedPch.h"
+
+#define SAY_AGGRO -1554020
+#define SAY_DOMINATION_1 -1554021
+#define SAY_DOMINATION_2 -1554022
+#define SAY_SUMMON -1554023
+#define SAY_ENRAGE -1554024
+#define SAY_SLAY_1 -1554025
+#define SAY_SLAY_2 -1554026
+#define SAY_DEATH -1554027
+
+// Spells to be casted
+#define SPELL_MANA_TAP 36021
+#define SPELL_ARCANE_TORRENT 36022
+#define SPELL_DOMINATION 35280
+#define H_SPELL_ARCANE_EXPLOSION 15453
+#define SPELL_FRENZY 36992
+
+#define SPELL_SUMMON_NETHER_WRAITH_1 35285 //Spells work, but not implemented
+#define SPELL_SUMMON_NETHER_WRAITH_2 35286
+#define SPELL_SUMMON_NETHER_WRAITH_3 35287
+#define SPELL_SUMMON_NETHER_WRAITH_4 35288
+
+// Add Spells
+#define SPELL_DETONATION 35058
+#define SPELL_ARCANE_MISSILES 35034
+
+struct boss_pathaleon_the_calculatorAI : public ScriptedAI
+{
+ boss_pathaleon_the_calculatorAI(Creature *c) : ScriptedAI(c), summons(me)
+ {
+ }
+
+ uint32 Summon_Timer;
+ SummonList summons;
+ uint32 ManaTap_Timer;
+ uint32 ArcaneTorrent_Timer;
+ uint32 Domination_Timer;
+ uint32 ArcaneExplosion_Timer;
+
+ bool Enraged;
+
+ uint32 Counter;
+
+ void Reset()
+ {
+ Summon_Timer = 30000;
+ ManaTap_Timer = 12000 + rand()%8000;
+ ArcaneTorrent_Timer = 16000 + rand()%9000;
+ Domination_Timer = 25000 + rand()%15000;
+ ArcaneExplosion_Timer = 8000 + rand()%5000;
+
+ Enraged = false;
+
+ Counter = 0;
+ summons.DespawnAll();
+ }
+ void EnterCombat(Unit * /*who*/)
+ {
+ DoScriptText(SAY_AGGRO, me);
+ }
+
+ void KilledUnit(Unit* /*victim*/)
+ {
+ DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
+ }
+
+ void JustDied(Unit* /*Killer*/)
+ {
+ DoScriptText(SAY_DEATH, me);
+
+ summons.DespawnAll();
+ }
+
+ void JustSummoned(Creature *summon) {summons.Summon(summon);}
+ void SummonedCreatureDespawn(Creature *summon) {summons.Despawn(summon);}
+
+ void UpdateAI(const uint32 diff)
+ {
+ //Return since we have no target
+ if (!UpdateVictim())
+ return;
+
+ if (Summon_Timer <= diff)
+ {
+ for (uint8 i = 0; i < 3; ++i)
+ {
+ Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
+ Creature* Wraith = me->SummonCreature(21062,me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
+ if (pTarget && Wraith)
+ Wraith->AI()->AttackStart(pTarget);
+ }
+ DoScriptText(SAY_SUMMON, me);
+ Summon_Timer = 30000 + rand()%15000;
+ } else Summon_Timer -= diff;
+
+ if (ManaTap_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_MANA_TAP);
+ ManaTap_Timer = 14000 + rand()%8000;
+ } else ManaTap_Timer -= diff;
+
+ if (ArcaneTorrent_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_ARCANE_TORRENT);
+ ArcaneTorrent_Timer = 12000 + rand()%6000;
+ } else ArcaneTorrent_Timer -= diff;
+
+ if (Domination_Timer <= diff)
+ {
+ if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,1))
+ {
+ DoScriptText(RAND(SAY_DOMINATION_1,SAY_DOMINATION_2), me);
+
+ DoCast(pTarget, SPELL_DOMINATION);
+ }
+ Domination_Timer = 25000 + rand()%5000;
+ } else Domination_Timer -= diff;
+
+ //Only casting if Heroic Mode is used
+ if (IsHeroic())
+ {
+ if (ArcaneExplosion_Timer <= diff)
+ {
+ DoCast(me->getVictim(), H_SPELL_ARCANE_EXPLOSION);
+ ArcaneExplosion_Timer = 10000 + rand()%4000;
+ } else ArcaneExplosion_Timer -= diff;
+ }
+
+ if (!Enraged && me->GetHealth()*100 / me->GetMaxHealth() < 21)
+ {
+ DoCast(me, SPELL_FRENZY);
+ DoScriptText(SAY_ENRAGE, me);
+ Enraged = true;
+
+ }
+
+ DoMeleeAttackIfReady();
+ }
+};
+CreatureAI* GetAI_boss_pathaleon_the_calculator(Creature* pCreature)
+{
+ return new boss_pathaleon_the_calculatorAI (pCreature);
+}
+
+struct mob_nether_wraithAI : public ScriptedAI
+{
+ mob_nether_wraithAI(Creature *c) : ScriptedAI(c) {}
+
+ uint32 ArcaneMissiles_Timer;
+ uint32 Detonation_Timer;
+ uint32 Die_Timer;
+ bool Detonation;
+
+ void Reset()
+ {
+ ArcaneMissiles_Timer = 1000 + rand()%3000;
+ Detonation_Timer = 20000;
+ Die_Timer = 2200;
+ Detonation = false;
+
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (ArcaneMissiles_Timer <= diff)
+ {
+ if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,1))
+ DoCast(pTarget, SPELL_ARCANE_MISSILES);
+ else
+ DoCast(me->getVictim(), SPELL_ARCANE_MISSILES);
+
+ ArcaneMissiles_Timer = 5000 + rand()%5000;
+ } else ArcaneMissiles_Timer -=diff;
+
+ if (!Detonation)
+ {
+ if (Detonation_Timer <= diff)
+ {
+ DoCast(me, SPELL_DETONATION);
+ Detonation = true;
+ } else Detonation_Timer -= diff;
+ }
+
+ if (Detonation)
+ {
+ if (Die_Timer <= diff)
+ {
+ me->setDeathState(JUST_DIED);
+ me->RemoveCorpse();
+ } else Die_Timer -= diff;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+};
+CreatureAI* GetAI_mob_nether_wraith(Creature* pCreature)
+{
+ return new mob_nether_wraithAI (pCreature);
+}
+
+void AddSC_boss_pathaleon_the_calculator()
+{
+ Script *newscript;
+ newscript = new Script;
+ newscript->Name = "boss_pathaleon_the_calculator";
+ newscript->GetAI = &GetAI_boss_pathaleon_the_calculator;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "mob_nether_wraith";
+ newscript->GetAI = &GetAI_mob_nether_wraith;
+ newscript->RegisterSelf();
+}
+
diff --git a/src/server/scripts/Outland/TempestKeep/the_mechanar/instance_mechanar.cpp b/src/server/scripts/Outland/TempestKeep/the_mechanar/instance_mechanar.cpp
new file mode 100644
index 00000000000..c70da24ea3f
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/the_mechanar/instance_mechanar.cpp
@@ -0,0 +1,86 @@
+/* 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 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* ScriptData
+SDName: Instance_Mechanar
+SD%Complete: 100
+SDComment:
+SDCategory: Mechanar
+EndScriptData */
+
+#include "ScriptedPch.h"
+#include "mechanar.h"
+
+#define MAX_ENCOUNTER 1
+
+struct instance_mechanar : public ScriptedInstance
+{
+ instance_mechanar(Map* pMap) : ScriptedInstance(pMap) {Initialize();};
+
+ uint32 m_auiEncounter[MAX_ENCOUNTER];
+
+ void Initialize()
+ {
+ memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
+ }
+
+ bool IsEncounterInProgress() const
+ {
+ for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+ if (m_auiEncounter[i] == IN_PROGRESS)
+ return true;
+
+ return false;
+ }
+
+ uint32 GetData(uint32 type)
+ {
+ switch(type)
+ {
+ case DATA_NETHERMANCER_EVENT: return m_auiEncounter[0];
+ }
+
+ return false;
+ }
+
+ uint64 GetData64 (uint32 /*identifier*/)
+ {
+ return 0;
+ }
+
+ void SetData(uint32 type, uint32 data)
+ {
+ switch(type)
+ {
+ case DATA_NETHERMANCER_EVENT: m_auiEncounter[0] = data; break;
+ }
+ }
+};
+
+InstanceData* GetInstanceData_instance_mechanar(Map* pMap)
+{
+ return new instance_mechanar(pMap);
+}
+
+void AddSC_instance_mechanar()
+{
+ Script *newscript;
+ newscript = new Script;
+ newscript->Name = "instance_mechanar";
+ newscript->GetInstanceData = &GetInstanceData_instance_mechanar;
+ newscript->RegisterSelf();
+}
+
diff --git a/src/server/scripts/Outland/TempestKeep/the_mechanar/mechanar.h b/src/server/scripts/Outland/TempestKeep/the_mechanar/mechanar.h
new file mode 100644
index 00000000000..d1b53eebf53
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/the_mechanar/mechanar.h
@@ -0,0 +1,6 @@
+#ifndef DEF_MECHANAR_H
+#define DEF_MECHANAR_H
+
+#define DATA_NETHERMANCER_EVENT 1
+#endif
+