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
This commit is contained in:
@@ -0,0 +1,185 @@
|
||||
/* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "naxxramas.h"
|
||||
|
||||
#define SAY_GREET RAND(-1533000,-1533004,-1533005,-1533006,-1533007)
|
||||
#define SAY_AGGRO RAND(-1533001,-1533002,-1533003)
|
||||
#define SAY_SLAY -1533008
|
||||
|
||||
#define MOB_CRYPT_GUARD 16573
|
||||
|
||||
const Position GuardSummonPos = {3333.72, -3476.30, 287.1, 6.2801};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_NONE,
|
||||
EVENT_IMPALE,
|
||||
EVENT_LOCUST,
|
||||
EVENT_SPAWN_GUARDIAN_NORMAL,
|
||||
EVENT_BERSERK,
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_IMPALE_10 = 28783,
|
||||
SPELL_IMPALE_25 = 56090,
|
||||
SPELL_LOCUST_SWARM_10 = 28785,
|
||||
SPELL_LOCUST_SWARM_25 = 54021,
|
||||
SPELL_SUMMON_CORPSE_SCARABS_PLR = 29105, // This spawns 5 corpse scarabs on top of player
|
||||
SPELL_SUMMON_CORPSE_SCARABS_MOB = 28864, // This spawns 10 corpse scarabs on top of dead guards
|
||||
SPELL_BERSERK = 27680,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
ACHIEV_TIMED_START_EVENT = 9891,
|
||||
};
|
||||
|
||||
struct boss_anubrekhanAI : public BossAI
|
||||
{
|
||||
boss_anubrekhanAI(Creature *c) : BossAI(c, BOSS_ANUBREKHAN) {}
|
||||
|
||||
bool hasTaunted;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
|
||||
hasTaunted = false;
|
||||
|
||||
if (getDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)
|
||||
{
|
||||
Position pos;
|
||||
|
||||
// respawn guard using home position,
|
||||
// otherwise, after a wipe, they respawn where boss was at wipe moment.
|
||||
pos = me->GetHomePosition();
|
||||
pos.m_positionY -= 10.0f;
|
||||
me->SummonCreature(MOB_CRYPT_GUARD, pos, TEMPSUMMON_CORPSE_DESPAWN);
|
||||
|
||||
pos = me->GetHomePosition();
|
||||
pos.m_positionY += 10.0f;
|
||||
me->SummonCreature(MOB_CRYPT_GUARD, pos, TEMPSUMMON_CORPSE_DESPAWN);
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
//Force the player to spawn corpse scarabs via spell, TODO: Check percent chance for scarabs, 20% at the moment
|
||||
if (!(rand()%5))
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
victim->CastSpell(victim, SPELL_SUMMON_CORPSE_SCARABS_PLR, true, NULL, NULL, me->GetGUID());
|
||||
|
||||
DoScriptText(SAY_SLAY, me);
|
||||
}
|
||||
|
||||
void JustDied(Unit *)
|
||||
{
|
||||
_JustDied();
|
||||
|
||||
// start achievement timer (kill Maexna within 20 min)
|
||||
if (instance)
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
}
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
DoScriptText(SAY_AGGRO, me);
|
||||
events.ScheduleEvent(EVENT_IMPALE, 10000 + rand()%10000);
|
||||
events.ScheduleEvent(EVENT_LOCUST, 90000);
|
||||
events.ScheduleEvent(EVENT_BERSERK, 600000);
|
||||
|
||||
if (getDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL)
|
||||
events.ScheduleEvent(EVENT_SPAWN_GUARDIAN_NORMAL, urand(15000,20000));
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit *who)
|
||||
{
|
||||
if (!hasTaunted && me->IsWithinDistInMap(who, 60.0f) && who->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
DoScriptText(SAY_GREET, me);
|
||||
hasTaunted = true;
|
||||
}
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void SummonedCreatureDespawn(Creature *summon)
|
||||
{
|
||||
BossAI::SummonedCreatureDespawn(summon);
|
||||
|
||||
// check if it is an actual killed guard
|
||||
if (!me->isAlive() || summon->isAlive() || summon->GetEntry() != MOB_CRYPT_GUARD)
|
||||
return;
|
||||
|
||||
summon->CastSpell(summon, SPELL_SUMMON_CORPSE_SCARABS_MOB, true, NULL, NULL, me->GetGUID());
|
||||
}
|
||||
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim() || !CheckInRoom())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_IMPALE:
|
||||
//Cast Impale on a random target
|
||||
//Do NOT cast it when we are afflicted by locust swarm
|
||||
if (!me->HasAura(RAID_MODE(SPELL_LOCUST_SWARM_10,SPELL_LOCUST_SWARM_25)))
|
||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
||||
DoCast(pTarget, RAID_MODE(SPELL_IMPALE_10,SPELL_IMPALE_25));
|
||||
events.ScheduleEvent(EVENT_IMPALE, urand(10000,20000));
|
||||
break;
|
||||
case EVENT_LOCUST:
|
||||
// TODO : Add Text
|
||||
DoCast(me, RAID_MODE(SPELL_LOCUST_SWARM_10,SPELL_LOCUST_SWARM_25));
|
||||
DoSummon(MOB_CRYPT_GUARD, GuardSummonPos, 0, TEMPSUMMON_CORPSE_DESPAWN);
|
||||
events.ScheduleEvent(EVENT_LOCUST, 90000);
|
||||
break;
|
||||
case EVENT_SPAWN_GUARDIAN_NORMAL:
|
||||
// TODO : Add Text
|
||||
DoSummon(MOB_CRYPT_GUARD, GuardSummonPos, 0, TEMPSUMMON_CORPSE_DESPAWN);
|
||||
break;
|
||||
case EVENT_BERSERK:
|
||||
DoCast(me, SPELL_BERSERK, true);
|
||||
events.ScheduleEvent(EVENT_BERSERK, 600000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_anubrekhan(Creature* pCreature)
|
||||
{
|
||||
return new boss_anubrekhanAI (pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_anubrekhan()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_anubrekhan";
|
||||
newscript->GetAI = &GetAI_boss_anubrekhan;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
@@ -0,0 +1,218 @@
|
||||
/*
|
||||
* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "naxxramas.h"
|
||||
|
||||
enum Yells
|
||||
{
|
||||
SAY_GREET = -1533009,
|
||||
SAY_AGGRO_1 = -1533010,
|
||||
SAY_AGGRO_2 = -1533011,
|
||||
SAY_AGGRO_3 = -1533012,
|
||||
SAY_AGGRO_4 = -1533013,
|
||||
SAY_SLAY_1 = -1533014,
|
||||
SAY_SLAY_2 = -1533015,
|
||||
SAY_DEATH = -1533016
|
||||
};
|
||||
//#define SOUND_RANDOM_AGGRO 8955 //soundId containing the 4 aggro sounds, we not using this
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_POISON_BOLT_VOLLEY = 28796,
|
||||
H_SPELL_POISON_BOLT_VOLLEY = 54098,
|
||||
SPELL_RAIN_OF_FIRE = 28794,
|
||||
H_SPELL_RAIN_OF_FIRE = 54099,
|
||||
SPELL_FRENZY = 28798,
|
||||
H_SPELL_FRENZY = 54100,
|
||||
SPELL_WIDOWS_EMBRACE = 28732,
|
||||
H_SPELL_WIDOWS_EMBRACE = 54097
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_NONE,
|
||||
EVENT_POISON,
|
||||
EVENT_FIRE,
|
||||
EVENT_FRENZY
|
||||
};
|
||||
|
||||
enum Achievements
|
||||
{
|
||||
ACHIEVEMENT_MOMMA_SAID_KNOCK_YOU_OUT_10 = 1997,
|
||||
ACHIEVEMENT_MOMMA_SAID_KNOCK_YOU_OUT_25 = 2140
|
||||
};
|
||||
|
||||
struct boss_faerlinaAI : public BossAI
|
||||
{
|
||||
boss_faerlinaAI(Creature *c) : BossAI(c, BOSS_FAERLINA), greet(false) {}
|
||||
|
||||
bool greet;
|
||||
bool doDelayFrenzy;
|
||||
bool bAchievement;
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
DoScriptText(RAND(SAY_AGGRO_1,SAY_AGGRO_2,SAY_AGGRO_3,SAY_AGGRO_4), me);
|
||||
events.ScheduleEvent(EVENT_POISON, urand(10000,15000));
|
||||
events.ScheduleEvent(EVENT_FIRE, urand(6000,18000));
|
||||
events.ScheduleEvent(EVENT_FRENZY, urand(60000,80000));
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
doDelayFrenzy = false;
|
||||
bAchievement = true;
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit *who)
|
||||
{
|
||||
if (!greet && who->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
DoScriptText(SAY_GREET, me);
|
||||
greet = true;
|
||||
}
|
||||
BossAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (!(rand()%3))
|
||||
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
DoScriptText(SAY_DEATH, me);
|
||||
|
||||
if (instance && bAchievement)
|
||||
instance->DoCompleteAchievement(RAID_MODE(ACHIEVEMENT_MOMMA_SAID_KNOCK_YOU_OUT_10,ACHIEVEMENT_MOMMA_SAID_KNOCK_YOU_OUT_25));
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (doDelayFrenzy && !me->HasAura(RAID_MODE(SPELL_WIDOWS_EMBRACE, H_SPELL_WIDOWS_EMBRACE)))
|
||||
{
|
||||
doDelayFrenzy = false;
|
||||
DoCast(me, RAID_MODE(SPELL_FRENZY, H_SPELL_FRENZY), true);
|
||||
}
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->hasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_POISON:
|
||||
if (!me->HasAura(RAID_MODE(SPELL_WIDOWS_EMBRACE,H_SPELL_WIDOWS_EMBRACE)))
|
||||
DoCastAOE(RAID_MODE(SPELL_POISON_BOLT_VOLLEY,H_SPELL_POISON_BOLT_VOLLEY));
|
||||
events.ScheduleEvent(EVENT_POISON, urand(8000,15000));
|
||||
break;
|
||||
case EVENT_FIRE:
|
||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
||||
DoCast(pTarget, RAID_MODE(SPELL_RAIN_OF_FIRE, H_SPELL_RAIN_OF_FIRE));
|
||||
events.ScheduleEvent(EVENT_FIRE, urand(6000,18000));
|
||||
break;
|
||||
case EVENT_FRENZY:
|
||||
// TODO : Add Text
|
||||
if (!me->HasAura(RAID_MODE(SPELL_WIDOWS_EMBRACE,H_SPELL_WIDOWS_EMBRACE)))
|
||||
DoCast(me, RAID_MODE(SPELL_FRENZY, H_SPELL_FRENZY));
|
||||
else
|
||||
doDelayFrenzy = true;
|
||||
|
||||
events.ScheduleEvent(EVENT_FRENZY, urand(60000,80000));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void SpellHit(Unit* caster, const SpellEntry *spell)
|
||||
{
|
||||
if (spell->Id == SPELL_WIDOWS_EMBRACE || spell->Id == H_SPELL_WIDOWS_EMBRACE)
|
||||
{
|
||||
// TODO : Add Text
|
||||
bAchievement = false;
|
||||
doDelayFrenzy = true;
|
||||
me->Kill(caster);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_faerlina(Creature* pCreature)
|
||||
{
|
||||
return new boss_faerlinaAI (pCreature);
|
||||
}
|
||||
|
||||
struct mob_faerlina_addAI : public ScriptedAI
|
||||
{
|
||||
mob_faerlina_addAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
pInstance = pCreature->GetInstanceData();
|
||||
}
|
||||
|
||||
ScriptedInstance *pInstance;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
if (getDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL) {
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, SPELL_EFFECT_BIND, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, true);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit * /*killer*/)
|
||||
{
|
||||
if (pInstance && getDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL)
|
||||
{
|
||||
if (Creature *pFaerlina = pInstance->instance->GetCreature(pInstance->GetData64(DATA_FAERLINA)))
|
||||
DoCast(pFaerlina, SPELL_WIDOWS_EMBRACE);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_mob_faerlina_add(Creature* pCreature)
|
||||
{
|
||||
return new mob_faerlina_addAI (pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_faerlina()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_faerlina";
|
||||
newscript->GetAI = &GetAI_boss_faerlina;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "mob_faerlina_add";
|
||||
newscript->GetAI = &GetAI_mob_faerlina_add;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,397 @@
|
||||
/* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "naxxramas.h"
|
||||
|
||||
enum Horsemen
|
||||
{
|
||||
HORSEMEN_THANE,
|
||||
HORSEMEN_LADY,
|
||||
HORSEMEN_BARON,
|
||||
HORSEMEN_SIR,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_NONE,
|
||||
EVENT_MARK,
|
||||
EVENT_CAST,
|
||||
EVENT_BERSERK,
|
||||
};
|
||||
|
||||
const Position WaypointPositions[12] =
|
||||
{
|
||||
// Thane waypoints
|
||||
{2542.3, -2984.1, 241.49, 5.362},
|
||||
{2547.6, -2999.4, 241.34, 5.049},
|
||||
{2542.9, -3015.0, 241.35, 4.654},
|
||||
// Lady waypoints
|
||||
{2498.3, -2961.8, 241.28, 3.267},
|
||||
{2487.7, -2959.2, 241.28, 2.890},
|
||||
{2469.4, -2947.6, 241.28, 2.576},
|
||||
// Baron waypoints
|
||||
{2553.8, -2968.4, 241.33, 5.757},
|
||||
{2564.3, -2972.5, 241.33, 5.890},
|
||||
{2583.9, -2971.67, 241.35, 0.008},
|
||||
// Sir waypoints
|
||||
{2534.5, -2921.7, 241.53, 1.363},
|
||||
{2523.5, -2902.8, 241.28, 2.095},
|
||||
{2517.8, -2896.6, 241.28, 2.315},
|
||||
};
|
||||
|
||||
const uint32 MOB_HORSEMEN[] = {16064, 16065, 30549, 16063};
|
||||
const uint32 SPELL_MARK[] = {28832, 28833, 28834, 28835};
|
||||
#define SPELL_PRIMARY(i) RAID_MODE(SPELL_PRIMARY_N[i],SPELL_PRIMARY_H[i])
|
||||
const uint32 SPELL_PRIMARY_N[] = {28884, 28863, 28882, 28883};
|
||||
const uint32 SPELL_PRIMARY_H[] = {57467, 57463, 57369, 57466};
|
||||
#define SPELL_SECONDARY(i) RAID_MODE(SPELL_SECONDARY_N[i],SPELL_SECONDARY_H[i])
|
||||
const uint32 SPELL_SECONDARY_N[]= {0, 57374, 0, 57376};
|
||||
const uint32 SPELL_SECONDARY_H[]= {0, 57464, 0, 57465};
|
||||
const uint32 SPELL_PUNISH[] = {0, 57381, 0, 57377};
|
||||
#define SPELL_BERSERK 26662
|
||||
|
||||
// used by 16063,16064,16065,30549, but signed for 16063
|
||||
const int32 SAY_AGGRO[] = {-1533051, -1533044, -1533065, -1533058};
|
||||
const int32 SAY_TAUNT[3][4] ={ {-1533052, -1533045, -1533071, -1533059},
|
||||
{-1533053, -1533046, -1533072, -1533060},
|
||||
{-1533054, -1533047, -1533073, -1533061},};
|
||||
const int32 SAY_SPECIAL[] = {-1533055, -1533048, -1533070, -1533062};
|
||||
const int32 SAY_SLAY[] = {-1533056, -1533049, -1533068, -1533063};
|
||||
const int32 SAY_DEATH[] = {-1533057, -1533050, -1533074, -1533064};
|
||||
|
||||
#define SAY_BARON_AGGRO RAND(-1533065,-1533066,-1533067)
|
||||
#define SAY_BARON_SLAY RAND(-1533068,-1533069)
|
||||
|
||||
struct boss_four_horsemenAI : public BossAI
|
||||
{
|
||||
boss_four_horsemenAI(Creature *c) : BossAI(c, BOSS_HORSEMEN)
|
||||
{
|
||||
id = Horsemen(0);
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
if (me->GetEntry() == MOB_HORSEMEN[i])
|
||||
id = Horsemen(i);
|
||||
caster = (id == HORSEMEN_LADY || id == HORSEMEN_SIR);
|
||||
}
|
||||
|
||||
Horsemen id;
|
||||
uint64 uiEventStarterGUID;
|
||||
uint8 nextWP;
|
||||
uint32 punishTimer;
|
||||
bool caster;
|
||||
bool nextMovementStarted;
|
||||
bool movementCompleted;
|
||||
bool movementStarted;
|
||||
bool encounterActionAttack;
|
||||
bool encounterActionReset;
|
||||
bool doDelayPunish;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
if (!encounterActionReset)
|
||||
DoEncounterAction(NULL, false, true, false);
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_HORSEMEN0 + id, NOT_STARTED);
|
||||
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
uiEventStarterGUID = 0;
|
||||
nextWP = 0;
|
||||
punishTimer = 2000;
|
||||
nextMovementStarted = false;
|
||||
movementCompleted = false;
|
||||
movementStarted = false;
|
||||
encounterActionAttack = false;
|
||||
encounterActionReset = false;
|
||||
doDelayPunish = false;
|
||||
_Reset();
|
||||
}
|
||||
|
||||
bool DoEncounterAction(Unit *who, bool attack, bool reset, bool checkAllDead)
|
||||
{
|
||||
if (!instance)
|
||||
return false;
|
||||
|
||||
Creature *Thane = CAST_CRE(Unit::GetUnit(*me, instance->GetData64(DATA_THANE)));
|
||||
Creature *Lady = CAST_CRE(Unit::GetUnit(*me, instance->GetData64(DATA_LADY)));
|
||||
Creature *Baron = CAST_CRE(Unit::GetUnit(*me, instance->GetData64(DATA_BARON)));
|
||||
Creature *Sir = CAST_CRE(Unit::GetUnit(*me, instance->GetData64(DATA_SIR)));
|
||||
|
||||
if (Thane && Lady && Baron && Sir)
|
||||
{
|
||||
if (attack && who)
|
||||
{
|
||||
CAST_AI(boss_four_horsemenAI, Thane->AI())->encounterActionAttack = true;
|
||||
CAST_AI(boss_four_horsemenAI, Lady->AI())->encounterActionAttack = true;
|
||||
CAST_AI(boss_four_horsemenAI, Baron->AI())->encounterActionAttack = true;
|
||||
CAST_AI(boss_four_horsemenAI, Sir->AI())->encounterActionAttack = true;
|
||||
|
||||
CAST_AI(boss_four_horsemenAI, Thane->AI())->AttackStart(who);
|
||||
CAST_AI(boss_four_horsemenAI, Lady->AI())->AttackStart(who);
|
||||
CAST_AI(boss_four_horsemenAI, Baron->AI())->AttackStart(who);
|
||||
CAST_AI(boss_four_horsemenAI, Sir->AI())->AttackStart(who);
|
||||
}
|
||||
|
||||
if (reset)
|
||||
{
|
||||
if (instance->GetBossState(BOSS_HORSEMEN) != NOT_STARTED)
|
||||
{
|
||||
if (!Thane->isAlive())
|
||||
Thane->Respawn();
|
||||
|
||||
if (!Lady->isAlive())
|
||||
Lady->Respawn();
|
||||
|
||||
if (!Baron->isAlive())
|
||||
Baron->Respawn();
|
||||
|
||||
if (!Sir->isAlive())
|
||||
Sir->Respawn();
|
||||
|
||||
CAST_AI(boss_four_horsemenAI, Thane->AI())->encounterActionReset = true;
|
||||
CAST_AI(boss_four_horsemenAI, Lady->AI())->encounterActionReset = true;
|
||||
CAST_AI(boss_four_horsemenAI, Baron->AI())->encounterActionReset = true;
|
||||
CAST_AI(boss_four_horsemenAI, Sir->AI())->encounterActionReset = true;
|
||||
|
||||
CAST_AI(boss_four_horsemenAI, Thane->AI())->EnterEvadeMode();
|
||||
CAST_AI(boss_four_horsemenAI, Lady->AI())->EnterEvadeMode();
|
||||
CAST_AI(boss_four_horsemenAI, Baron->AI())->EnterEvadeMode();
|
||||
CAST_AI(boss_four_horsemenAI, Sir->AI())->EnterEvadeMode();
|
||||
}
|
||||
}
|
||||
|
||||
if (checkAllDead)
|
||||
return !Thane->isAlive() && !Lady->isAlive() && !Baron->isAlive() && !Sir->isAlive();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void BeginFourHorsemenMovement()
|
||||
{
|
||||
movementStarted = true;
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
|
||||
me->SetSpeed(MOVE_RUN, me->GetSpeedRate(MOVE_RUN), true);
|
||||
|
||||
switch(id)
|
||||
{
|
||||
case HORSEMEN_THANE:
|
||||
me->GetMotionMaster()->MovePoint(0, WaypointPositions[0]);
|
||||
break;
|
||||
case HORSEMEN_LADY:
|
||||
me->GetMotionMaster()->MovePoint(3, WaypointPositions[3]);
|
||||
break;
|
||||
case HORSEMEN_BARON:
|
||||
me->GetMotionMaster()->MovePoint(6, WaypointPositions[6]);
|
||||
break;
|
||||
case HORSEMEN_SIR:
|
||||
me->GetMotionMaster()->MovePoint(9, WaypointPositions[9]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type != POINT_MOTION_TYPE)
|
||||
return;
|
||||
|
||||
if (id == 2 || id == 5 || id == 8 || id == 11)
|
||||
{
|
||||
movementCompleted = true;
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
|
||||
Unit *eventStarter = Unit::GetUnit(*me, uiEventStarterGUID);
|
||||
|
||||
if (eventStarter && me->canAttack(eventStarter))
|
||||
AttackStart(eventStarter);
|
||||
else if (!UpdateVictim())
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
|
||||
if (caster)
|
||||
{
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
nextMovementStarted = false;
|
||||
nextWP = id + 1;
|
||||
}
|
||||
|
||||
// switch to "who" if nearer than current target.
|
||||
void SelectNearestTarget(Unit *who)
|
||||
{
|
||||
if (me->getVictim() && me->GetDistanceOrder(who, me->getVictim()) && me->canAttack(who))
|
||||
{
|
||||
me->getThreatManager().modifyThreatPercent(me->getVictim(), -100);
|
||||
me->AddThreat(who, 1000000.0f);
|
||||
}
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit *who)
|
||||
{
|
||||
BossAI::MoveInLineOfSight(who);
|
||||
if (caster)
|
||||
SelectNearestTarget(who);
|
||||
}
|
||||
|
||||
void AttackStart(Unit *who)
|
||||
{
|
||||
if (!movementCompleted && !movementStarted)
|
||||
{
|
||||
uiEventStarterGUID = who->GetGUID();
|
||||
BeginFourHorsemenMovement();
|
||||
|
||||
if (!encounterActionAttack)
|
||||
DoEncounterAction(who, true, false, false);
|
||||
}
|
||||
else if (movementCompleted && movementStarted)
|
||||
{
|
||||
if (caster)
|
||||
me->Attack(who, false);
|
||||
else
|
||||
BossAI::AttackStart(who);
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (!(rand()%5))
|
||||
{
|
||||
if (id == HORSEMEN_BARON)
|
||||
DoScriptText(SAY_BARON_SLAY, me);
|
||||
else
|
||||
DoScriptText(SAY_SLAY[id], me);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_HORSEMEN0 + id, DONE);
|
||||
|
||||
if (instance && DoEncounterAction(NULL, false, false, true))
|
||||
{
|
||||
instance->SetBossState(BOSS_HORSEMEN, DONE);
|
||||
instance->SaveToDB();
|
||||
|
||||
// Achievements related to the 4-horsemen are given through spell 59450 which does not exist.
|
||||
// There is thus no way it can be given by casting the spell on the players.
|
||||
instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 59450);
|
||||
}
|
||||
|
||||
DoScriptText(SAY_DEATH[id], me);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
|
||||
if (id == HORSEMEN_BARON)
|
||||
DoScriptText(SAY_BARON_AGGRO, me);
|
||||
else
|
||||
DoScriptText(SAY_AGGRO[id], me);
|
||||
|
||||
events.ScheduleEvent(EVENT_MARK, 15000);
|
||||
events.ScheduleEvent(EVENT_CAST, 20000+rand()%5000);
|
||||
events.ScheduleEvent(EVENT_BERSERK, 15*100*1000);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (nextWP && movementStarted && !movementCompleted && !nextMovementStarted)
|
||||
{
|
||||
nextMovementStarted = true;
|
||||
me->GetMotionMaster()->MovePoint(nextWP, WaypointPositions[nextWP]);
|
||||
}
|
||||
|
||||
if (!UpdateVictim() || !CheckInRoom() || !movementCompleted)
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->hasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_MARK:
|
||||
if (!(rand()%5))
|
||||
DoScriptText(SAY_SPECIAL[id], me);
|
||||
DoCastAOE(SPELL_MARK[id]);
|
||||
events.ScheduleEvent(EVENT_MARK, 15000);
|
||||
break;
|
||||
case EVENT_CAST:
|
||||
if (!(rand()%5))
|
||||
DoScriptText(SAY_TAUNT[rand()%3][id], me);
|
||||
|
||||
if (caster)
|
||||
{
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f))
|
||||
DoCast(pTarget, SPELL_PRIMARY(id));
|
||||
}
|
||||
else
|
||||
DoCast(me->getVictim(), SPELL_PRIMARY(id));
|
||||
|
||||
events.ScheduleEvent(EVENT_CAST, 15000);
|
||||
break;
|
||||
case EVENT_BERSERK:
|
||||
DoScriptText(SAY_SPECIAL[id], me);
|
||||
DoCast(me, EVENT_BERSERK);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (punishTimer <= diff)
|
||||
{
|
||||
if (doDelayPunish)
|
||||
{
|
||||
DoCastAOE(SPELL_PUNISH[id], true);
|
||||
doDelayPunish = false;
|
||||
}
|
||||
punishTimer = 2000;
|
||||
} else punishTimer -= diff;
|
||||
|
||||
if (!caster)
|
||||
DoMeleeAttackIfReady();
|
||||
else if ((!DoSpellAttackIfReady(SPELL_SECONDARY(id)) || !me->IsWithinLOSInMap(me->getVictim())) && movementCompleted && !doDelayPunish)
|
||||
doDelayPunish = true;
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_four_horsemen(Creature* pCreature)
|
||||
{
|
||||
return new boss_four_horsemenAI (pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_four_horsemen()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_four_horsemen";
|
||||
newscript->GetAI = &GetAI_four_horsemen;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
/* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "naxxramas.h"
|
||||
|
||||
#define SPELL_MORTAL_WOUND 25646
|
||||
#define SPELL_ENRAGE RAID_MODE(28371,54427)
|
||||
#define SPELL_DECIMATE RAID_MODE(28374,54426)
|
||||
#define SPELL_BERSERK 26662
|
||||
#define SPELL_INFECTED_WOUND 29306
|
||||
|
||||
#define MOB_ZOMBIE 16360
|
||||
|
||||
const Position PosSummon[3] =
|
||||
{
|
||||
{3267.9, -3172.1, 297.42, 0.94},
|
||||
{3253.2, -3132.3, 297.42, 0},
|
||||
{3308.3, -3185.8, 297.42, 1.58},
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_NONE,
|
||||
EVENT_WOUND,
|
||||
EVENT_ENRAGE,
|
||||
EVENT_DECIMATE,
|
||||
EVENT_BERSERK,
|
||||
EVENT_SUMMON,
|
||||
};
|
||||
|
||||
#define EMOTE_NEARBY " spots a nearby zombie to devour!"
|
||||
|
||||
struct boss_gluthAI : public BossAI
|
||||
{
|
||||
boss_gluthAI(Creature *c) : BossAI(c, BOSS_GLUTH)
|
||||
{
|
||||
// Do not let Gluth be affected by zombies' debuff
|
||||
me->ApplySpellImmune(0, IMMUNITY_ID, SPELL_INFECTED_WOUND, true);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit *who)
|
||||
{
|
||||
if (who->GetEntry() == MOB_ZOMBIE && me->IsWithinDistInMap(who, 7))
|
||||
{
|
||||
SetGazeOn(who);
|
||||
// TODO: use a script text
|
||||
me->MonsterTextEmote(EMOTE_NEARBY, 0, true);
|
||||
}
|
||||
else
|
||||
BossAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_WOUND, 10000);
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 15000);
|
||||
events.ScheduleEvent(EVENT_DECIMATE, 105000);
|
||||
events.ScheduleEvent(EVENT_BERSERK, 8*60000);
|
||||
events.ScheduleEvent(EVENT_SUMMON, 15000);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature *summon)
|
||||
{
|
||||
if (summon->GetEntry() == MOB_ZOMBIE)
|
||||
summon->AI()->AttackStart(me);
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictimWithGaze() || !CheckInRoom())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_WOUND:
|
||||
DoCast(me->getVictim(), SPELL_MORTAL_WOUND);
|
||||
events.ScheduleEvent(EVENT_WOUND, 10000);
|
||||
break;
|
||||
case EVENT_ENRAGE:
|
||||
// TODO : Add missing text
|
||||
DoCast(me, SPELL_ENRAGE);
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 15000);
|
||||
break;
|
||||
case EVENT_DECIMATE:
|
||||
// TODO : Add missing text
|
||||
DoCastAOE(SPELL_DECIMATE);
|
||||
events.ScheduleEvent(EVENT_DECIMATE, 105000);
|
||||
break;
|
||||
case EVENT_BERSERK:
|
||||
DoCast(me, SPELL_BERSERK);
|
||||
events.ScheduleEvent(EVENT_BERSERK, 5*60000);
|
||||
break;
|
||||
case EVENT_SUMMON:
|
||||
for (uint32 i = 0; i < RAID_MODE(1,2); ++i)
|
||||
DoSummon(MOB_ZOMBIE, PosSummon[rand()%3]);
|
||||
events.ScheduleEvent(EVENT_SUMMON, 10000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (me->getVictim() && me->getVictim()->GetEntry() == MOB_ZOMBIE)
|
||||
{
|
||||
if (me->IsWithinMeleeRange(me->getVictim()))
|
||||
{
|
||||
me->Kill(me->getVictim());
|
||||
me->ModifyHealth(me->GetMaxHealth() * 0.05f);
|
||||
}
|
||||
}
|
||||
else
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_gluth(Creature* pCreature)
|
||||
{
|
||||
return new boss_gluthAI (pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_gluth()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_gluth";
|
||||
newscript->GetAI = &GetAI_boss_gluth;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,582 @@
|
||||
/* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "naxxramas.h"
|
||||
|
||||
enum Yells
|
||||
{
|
||||
SAY_SPEECH = -1533040,
|
||||
SAY_KILL = -1533041,
|
||||
SAY_DEATH = -1533042,
|
||||
SAY_TELEPORT = -1533043
|
||||
};
|
||||
//Gothik
|
||||
enum Spells
|
||||
{
|
||||
SPELL_HARVEST_SOUL = 28679,
|
||||
SPELL_SHADOW_BOLT = 29317,
|
||||
H_SPELL_SHADOW_BOLT = 56405,
|
||||
SPELL_INFORM_LIVE_TRAINEE = 27892,
|
||||
SPELL_INFORM_LIVE_KNIGHT = 27928,
|
||||
SPELL_INFORM_LIVE_RIDER = 27935,
|
||||
SPELL_INFORM_DEAD_TRAINEE = 27915,
|
||||
SPELL_INFORM_DEAD_KNIGHT = 27931,
|
||||
SPELL_INFORM_DEAD_RIDER = 27937
|
||||
};
|
||||
enum Creatures
|
||||
{
|
||||
MOB_LIVE_TRAINEE = 16124,
|
||||
MOB_LIVE_KNIGHT = 16125,
|
||||
MOB_LIVE_RIDER = 16126,
|
||||
MOB_DEAD_TRAINEE = 16127,
|
||||
MOB_DEAD_KNIGHT = 16148,
|
||||
MOB_DEAD_RIDER = 16150,
|
||||
MOB_DEAD_HORSE = 16149
|
||||
};
|
||||
|
||||
struct Waves { uint32 entry, time, mode; };
|
||||
// wave setups are not the same in heroic and normal difficulty,
|
||||
// mode is 0 only normal, 1 both and 2 only heroic
|
||||
// but this is handled in DoGothikSummon function
|
||||
const Waves waves[] =
|
||||
{
|
||||
{MOB_LIVE_TRAINEE, 20000, 1},
|
||||
{MOB_LIVE_TRAINEE, 20000, 1},
|
||||
{MOB_LIVE_TRAINEE, 10000, 1},
|
||||
{MOB_LIVE_KNIGHT, 10000, 1},
|
||||
{MOB_LIVE_TRAINEE, 15000, 1},
|
||||
{MOB_LIVE_KNIGHT, 5000, 1},
|
||||
{MOB_LIVE_TRAINEE, 20000, 1},
|
||||
{MOB_LIVE_TRAINEE, 0, 1},
|
||||
{MOB_LIVE_KNIGHT, 10000, 1},
|
||||
{MOB_LIVE_TRAINEE, 10000, 2},
|
||||
{MOB_LIVE_RIDER, 10000, 0},
|
||||
{MOB_LIVE_RIDER, 5000, 2},
|
||||
{MOB_LIVE_TRAINEE, 5000, 0},
|
||||
{MOB_LIVE_TRAINEE, 15000, 2},
|
||||
{MOB_LIVE_KNIGHT, 15000, 0},
|
||||
{MOB_LIVE_TRAINEE, 0, 0},
|
||||
{MOB_LIVE_RIDER, 10000, 1},
|
||||
{MOB_LIVE_KNIGHT, 10000, 1},
|
||||
{MOB_LIVE_TRAINEE, 10000, 0},
|
||||
{MOB_LIVE_RIDER, 10000, 2},
|
||||
{MOB_LIVE_TRAINEE, 0, 2},
|
||||
{MOB_LIVE_RIDER, 5000, 1},
|
||||
{MOB_LIVE_TRAINEE, 0, 2},
|
||||
{MOB_LIVE_KNIGHT, 5000, 1},
|
||||
{MOB_LIVE_RIDER, 0, 2},
|
||||
{MOB_LIVE_TRAINEE, 20000, 1},
|
||||
{MOB_LIVE_RIDER, 0, 1},
|
||||
{MOB_LIVE_KNIGHT, 0, 1},
|
||||
{MOB_LIVE_TRAINEE, 25000, 2},
|
||||
{MOB_LIVE_TRAINEE, 15000, 0},
|
||||
{MOB_LIVE_TRAINEE, 25000, 0},
|
||||
{0, 0, 1},
|
||||
};
|
||||
|
||||
#define POS_Y_GATE -3360.78f
|
||||
#define POS_Y_WEST -3285.0f
|
||||
#define POS_Y_EAST -3434.0f
|
||||
#define POS_X_NORTH 2750.49f
|
||||
#define POS_X_SOUTH 2633.84f
|
||||
|
||||
#define IN_LIVE_SIDE(who) (who->GetPositionY() < POS_Y_GATE)
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_NONE,
|
||||
EVENT_SUMMON,
|
||||
EVENT_HARVEST,
|
||||
EVENT_BOLT,
|
||||
EVENT_TELEPORT
|
||||
};
|
||||
enum Pos
|
||||
{
|
||||
POS_LIVE = 6,
|
||||
POS_DEAD = 5
|
||||
};
|
||||
|
||||
const Position PosSummonLive[POS_LIVE] =
|
||||
{
|
||||
{2669.7, -3428.76, 268.56, 1.6},
|
||||
{2692.1, -3428.76, 268.56, 1.6},
|
||||
{2714.4, -3428.76, 268.56, 1.6},
|
||||
{2669.7, -3431.67, 268.56, 1.6},
|
||||
{2692.1, -3431.67, 268.56, 1.6},
|
||||
{2714.4, -3431.67, 268.56, 1.6},
|
||||
};
|
||||
|
||||
const Position PosSummonDead[POS_DEAD] =
|
||||
{
|
||||
{2725.1, -3310.0, 268.85, 3.4},
|
||||
{2699.3, -3322.8, 268.60, 3.3},
|
||||
{2733.1, -3348.5, 268.84, 3.1},
|
||||
{2682.8, -3304.2, 268.85, 3.9},
|
||||
{2664.8, -3340.7, 268.23, 3.7},
|
||||
};
|
||||
|
||||
const float PosGroundLiveSide[4] = {2691.2, -3387.0, 267.68, 1.52};
|
||||
const float PosGroundDeadSide[4] = {2693.5, -3334.6, 267.68, 4.67};
|
||||
const float PosPlatform[4] = {2640.5, -3360.6, 285.26, 0};
|
||||
|
||||
// Predicate function to check that the r efzr unit is NOT on the same side as the source.
|
||||
struct NotOnSameSide : public std::unary_function<Unit *, bool> {
|
||||
bool m_inLiveSide;
|
||||
NotOnSameSide(Unit *pSource) : m_inLiveSide(IN_LIVE_SIDE(pSource)) {}
|
||||
bool operator() (const Unit *pTarget) {
|
||||
return (m_inLiveSide != IN_LIVE_SIDE(pTarget));
|
||||
}
|
||||
};
|
||||
|
||||
struct boss_gothikAI : public BossAI
|
||||
{
|
||||
boss_gothikAI(Creature *c) : BossAI(c, BOSS_GOTHIK) {}
|
||||
|
||||
uint32 waveCount;
|
||||
typedef std::vector<Creature*> TriggerVct;
|
||||
TriggerVct liveTrigger, deadTrigger;
|
||||
bool mergedSides;
|
||||
bool phaseTwo;
|
||||
bool thirtyPercentReached;
|
||||
|
||||
std::vector<uint64> LiveTriggerGUID;
|
||||
std::vector<uint64> DeadTriggerGUID;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
LiveTriggerGUID.clear();
|
||||
DeadTriggerGUID.clear();
|
||||
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
if (instance)
|
||||
instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE);
|
||||
_Reset();
|
||||
mergedSides = false;
|
||||
phaseTwo = false;
|
||||
thirtyPercentReached = false;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
for (uint32 i = 0; i < POS_LIVE; ++i)
|
||||
if (Creature *trigger = DoSummon(WORLD_TRIGGER, PosSummonLive[i]))
|
||||
LiveTriggerGUID.push_back(trigger->GetGUID());
|
||||
for (uint32 i = 0; i < POS_DEAD; ++i)
|
||||
if (Creature *trigger = DoSummon(WORLD_TRIGGER, PosSummonDead[i]))
|
||||
DeadTriggerGUID.push_back(trigger->GetGUID());
|
||||
|
||||
if (LiveTriggerGUID.size() < POS_LIVE || DeadTriggerGUID.size() < POS_DEAD)
|
||||
{
|
||||
error_log("Script Gothik: cannot summon triggers!");
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
|
||||
_EnterCombat();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE);
|
||||
waveCount = 0;
|
||||
events.ScheduleEvent(EVENT_SUMMON, 30000);
|
||||
DoTeleportTo(PosPlatform);
|
||||
DoScriptText(SAY_SPEECH, me);
|
||||
if (instance)
|
||||
instance->SetData(DATA_GOTHIK_GATE, GO_STATE_READY);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature *summon)
|
||||
{
|
||||
if (summon->GetEntry() == WORLD_TRIGGER)
|
||||
summon->setActive(true);
|
||||
else if (!mergedSides)
|
||||
{
|
||||
summon->AI()->DoAction(me->HasReactState(REACT_PASSIVE) ? 1 : 0);
|
||||
summon->AI()->EnterEvadeMode();
|
||||
}
|
||||
else
|
||||
{
|
||||
summon->AI()->DoAction(0);
|
||||
summon->AI()->DoZoneInCombat();
|
||||
}
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void SummonedCreatureDespawn(Creature *summon)
|
||||
{
|
||||
summons.Despawn(summon);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (!(rand()%5))
|
||||
DoScriptText(SAY_KILL, me);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
{
|
||||
LiveTriggerGUID.clear();
|
||||
DeadTriggerGUID.clear();
|
||||
_JustDied();
|
||||
DoScriptText(SAY_DEATH, me);
|
||||
if (instance)
|
||||
instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
void DoGothikSummon(uint32 entry)
|
||||
{
|
||||
if (getDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)
|
||||
{
|
||||
switch(entry)
|
||||
{
|
||||
case MOB_LIVE_TRAINEE:
|
||||
{
|
||||
if (Creature *LiveTrigger0 = Unit::GetCreature(*me, LiveTriggerGUID[0]))
|
||||
DoSummon(MOB_LIVE_TRAINEE, LiveTrigger0, 1);
|
||||
if (Creature *LiveTrigger1 = Unit::GetCreature(*me, LiveTriggerGUID[1]))
|
||||
DoSummon(MOB_LIVE_TRAINEE, LiveTrigger1, 1);
|
||||
if (Creature *LiveTrigger2 = Unit::GetCreature(*me, LiveTriggerGUID[2]))
|
||||
DoSummon(MOB_LIVE_TRAINEE, LiveTrigger2, 1);
|
||||
break;
|
||||
}
|
||||
case MOB_LIVE_KNIGHT:
|
||||
{
|
||||
if (Creature *LiveTrigger3 = Unit::GetCreature(*me, LiveTriggerGUID[3]))
|
||||
DoSummon(MOB_LIVE_KNIGHT, LiveTrigger3, 1);
|
||||
if (Creature *LiveTrigger5 = Unit::GetCreature(*me, LiveTriggerGUID[5]))
|
||||
DoSummon(MOB_LIVE_KNIGHT, LiveTrigger5, 1);
|
||||
break;
|
||||
}
|
||||
case MOB_LIVE_RIDER:
|
||||
{
|
||||
if (Creature *LiveTrigger4 = Unit::GetCreature(*me, LiveTriggerGUID[4]))
|
||||
DoSummon(MOB_LIVE_RIDER, LiveTrigger4, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(entry)
|
||||
{
|
||||
case MOB_LIVE_TRAINEE:
|
||||
{
|
||||
if (Creature *LiveTrigger0 = Unit::GetCreature(*me, LiveTriggerGUID[4]))
|
||||
DoSummon(MOB_LIVE_TRAINEE, LiveTrigger0, 1);
|
||||
if (Creature *LiveTrigger1 = Unit::GetCreature(*me, LiveTriggerGUID[4]))
|
||||
DoSummon(MOB_LIVE_TRAINEE, LiveTrigger1, 1);
|
||||
break;
|
||||
}
|
||||
case MOB_LIVE_KNIGHT:
|
||||
{
|
||||
if (Creature *LiveTrigger5 = Unit::GetCreature(*me, LiveTriggerGUID[4]))
|
||||
DoSummon(MOB_LIVE_KNIGHT, LiveTrigger5, 1);
|
||||
break;
|
||||
}
|
||||
case MOB_LIVE_RIDER:
|
||||
{
|
||||
if (Creature *LiveTrigger4 = Unit::GetCreature(*me, LiveTriggerGUID[4]))
|
||||
DoSummon(MOB_LIVE_RIDER, LiveTrigger4, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CheckGroupSplitted()
|
||||
{
|
||||
bool checklife = false;
|
||||
bool checkdead = false;
|
||||
|
||||
Map* pMap = me->GetMap();
|
||||
if (pMap && pMap->IsDungeon())
|
||||
{
|
||||
Map::PlayerList const &PlayerList = pMap->GetPlayers();
|
||||
if (!PlayerList.isEmpty())
|
||||
{
|
||||
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
|
||||
{
|
||||
if (i->getSource() && i->getSource()->isAlive() &&
|
||||
i->getSource()->GetPositionX() <= POS_X_NORTH &&
|
||||
i->getSource()->GetPositionX() >= POS_X_SOUTH &&
|
||||
i->getSource()->GetPositionY() <= POS_Y_GATE &&
|
||||
i->getSource()->GetPositionY() >= POS_Y_EAST)
|
||||
{
|
||||
checklife = true;
|
||||
}
|
||||
else if (i->getSource() && i->getSource()->isAlive() &&
|
||||
i->getSource()->GetPositionX() <= POS_X_NORTH &&
|
||||
i->getSource()->GetPositionX() >= POS_X_SOUTH &&
|
||||
i->getSource()->GetPositionY() >= POS_Y_GATE &&
|
||||
i->getSource()->GetPositionY() <= POS_Y_WEST)
|
||||
{
|
||||
checkdead = true;
|
||||
}
|
||||
|
||||
if (checklife && checkdead)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void SpellHit(Unit * /*caster*/, const SpellEntry *spell)
|
||||
{
|
||||
uint32 spellId = 0;
|
||||
switch(spell->Id)
|
||||
{
|
||||
case SPELL_INFORM_LIVE_TRAINEE: spellId = SPELL_INFORM_DEAD_TRAINEE; break;
|
||||
case SPELL_INFORM_LIVE_KNIGHT: spellId = SPELL_INFORM_DEAD_KNIGHT; break;
|
||||
case SPELL_INFORM_LIVE_RIDER: spellId = SPELL_INFORM_DEAD_RIDER; break;
|
||||
}
|
||||
if (spellId && me->isInCombat())
|
||||
{
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_SPELLCAST);
|
||||
if (Creature *pRandomDeadTrigger = Unit::GetCreature(*me, DeadTriggerGUID[rand() % POS_DEAD]))
|
||||
me->CastSpell(pRandomDeadTrigger, spellId, true);
|
||||
}
|
||||
}
|
||||
|
||||
void SpellHitTarget(Unit *pTarget, const SpellEntry *spell)
|
||||
{
|
||||
if (!me->isInCombat())
|
||||
return;
|
||||
|
||||
switch(spell->Id)
|
||||
{
|
||||
case SPELL_INFORM_DEAD_TRAINEE:
|
||||
DoSummon(MOB_DEAD_TRAINEE, pTarget, 0);
|
||||
break;
|
||||
case SPELL_INFORM_DEAD_KNIGHT:
|
||||
DoSummon(MOB_DEAD_KNIGHT, pTarget, 0);
|
||||
break;
|
||||
case SPELL_INFORM_DEAD_RIDER:
|
||||
DoSummon(MOB_DEAD_RIDER, pTarget, 1.0f);
|
||||
DoSummon(MOB_DEAD_HORSE, pTarget, 1.0f);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateCombatState() || !CheckInRoom())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (!thirtyPercentReached && HealthBelowPct(30) && phaseTwo)
|
||||
{
|
||||
thirtyPercentReached = true;
|
||||
if (instance)
|
||||
instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
if (me->hasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_SUMMON:
|
||||
if (waves[waveCount].entry)
|
||||
{
|
||||
if ((waves[waveCount].mode == 2) && (getDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL))
|
||||
DoGothikSummon(waves[waveCount].entry);
|
||||
else if ((waves[waveCount].mode == 0) && (getDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL))
|
||||
DoGothikSummon(waves[waveCount].entry);
|
||||
else if (waves[waveCount].mode == 1)
|
||||
DoGothikSummon(waves[waveCount].entry);
|
||||
|
||||
// if group is not splitted, open gate and merge both sides at ~ 2 minutes (wave 11)
|
||||
if (waveCount == 11)
|
||||
{
|
||||
if (!CheckGroupSplitted())
|
||||
{
|
||||
if (instance)
|
||||
instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE);
|
||||
summons.DoAction(0, 0);
|
||||
summons.DoZoneInCombat();
|
||||
mergedSides = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (waves[waveCount].mode == 1)
|
||||
events.ScheduleEvent(EVENT_SUMMON,waves[waveCount].time);
|
||||
else if ((waves[waveCount].mode == 2) && (getDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL))
|
||||
events.ScheduleEvent(EVENT_SUMMON,waves[waveCount].time);
|
||||
else if ((waves[waveCount].mode == 0) && (getDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL))
|
||||
events.ScheduleEvent(EVENT_SUMMON,waves[waveCount].time);
|
||||
else
|
||||
events.ScheduleEvent(EVENT_SUMMON, 0);
|
||||
|
||||
++waveCount;
|
||||
}
|
||||
else
|
||||
{
|
||||
phaseTwo = true;
|
||||
DoScriptText(SAY_TELEPORT, me);
|
||||
DoTeleportTo(PosGroundLiveSide);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
||||
summons.DoAction(0, 0);
|
||||
summons.DoZoneInCombat();
|
||||
events.ScheduleEvent(EVENT_BOLT, 1000);
|
||||
events.ScheduleEvent(EVENT_HARVEST, urand(3000,15000));
|
||||
events.ScheduleEvent(EVENT_TELEPORT, 20000);
|
||||
}
|
||||
break;
|
||||
case EVENT_BOLT:
|
||||
DoCast(me->getVictim(), RAID_MODE(SPELL_SHADOW_BOLT, H_SPELL_SHADOW_BOLT));
|
||||
events.ScheduleEvent(EVENT_BOLT, 1000);
|
||||
break;
|
||||
case EVENT_HARVEST:
|
||||
DoCast(me->getVictim(), SPELL_HARVEST_SOUL, true);
|
||||
events.ScheduleEvent(EVENT_HARVEST, urand(20000,25000));
|
||||
break;
|
||||
case EVENT_TELEPORT:
|
||||
if (!thirtyPercentReached)
|
||||
{
|
||||
me->AttackStop();
|
||||
if (IN_LIVE_SIDE(me))
|
||||
{
|
||||
DoTeleportTo(PosGroundDeadSide);
|
||||
}
|
||||
else
|
||||
{
|
||||
DoTeleportTo(PosGroundLiveSide);
|
||||
}
|
||||
|
||||
me->getThreatManager().resetAggro(NotOnSameSide(me));
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_NEAREST, 0))
|
||||
{
|
||||
me->getThreatManager().addThreat(pTarget, 100.0f);
|
||||
AttackStart(pTarget);
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_TELEPORT, 20000);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
struct mob_gothik_minionAI : public CombatAI
|
||||
{
|
||||
mob_gothik_minionAI(Creature *c) : CombatAI(c)
|
||||
{
|
||||
liveSide = IN_LIVE_SIDE(me);
|
||||
}
|
||||
|
||||
bool liveSide;
|
||||
bool gateClose;
|
||||
|
||||
bool isOnSameSide(const Unit *pWho)
|
||||
{
|
||||
return (liveSide == IN_LIVE_SIDE(pWho));
|
||||
}
|
||||
|
||||
void DoAction(const int32 param)
|
||||
{
|
||||
gateClose = param;
|
||||
}
|
||||
|
||||
void DamageTaken(Unit *attacker, uint32 &damage)
|
||||
{
|
||||
if (gateClose && !isOnSameSide(attacker))
|
||||
damage = 0;
|
||||
}
|
||||
|
||||
void JustDied(Unit * /*killer*/)
|
||||
{
|
||||
if (me->isSummon())
|
||||
{
|
||||
if (Unit *owner = CAST_SUM(me)->GetSummoner())
|
||||
CombatAI::JustDied(owner);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
if (!gateClose)
|
||||
{
|
||||
CombatAI::EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_EnterEvadeMode())
|
||||
return;
|
||||
|
||||
Map* pMap = me->GetMap();
|
||||
if (pMap->IsDungeon())
|
||||
{
|
||||
Map::PlayerList const &PlayerList = pMap->GetPlayers();
|
||||
if (!PlayerList.isEmpty())
|
||||
{
|
||||
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
|
||||
{
|
||||
if (i->getSource() && i->getSource()->isAlive() && isOnSameSide(i->getSource()))
|
||||
{
|
||||
AttackStart(i->getSource());
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
Reset();
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (gateClose && (!isOnSameSide(me) || me->getVictim() && !isOnSameSide(me->getVictim())))
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
|
||||
CombatAI::UpdateAI(diff);
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_gothik(Creature* pCreature)
|
||||
{
|
||||
return new boss_gothikAI (pCreature);
|
||||
}
|
||||
|
||||
CreatureAI* GetAI_mob_gothik_minion(Creature* pCreature)
|
||||
{
|
||||
return new mob_gothik_minionAI (pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_gothik()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_gothik";
|
||||
newscript->GetAI = &GetAI_boss_gothik;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "mob_gothik_minion";
|
||||
newscript->GetAI = &GetAI_mob_gothik_minion;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
/* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "naxxramas.h"
|
||||
|
||||
#define SPELL_BOMBARD_SLIME 28280
|
||||
|
||||
#define SPELL_POISON_CLOUD 28240
|
||||
#define SPELL_MUTATING_INJECTION 28169
|
||||
#define SPELL_SLIME_SPRAY RAID_MODE(28157,54364)
|
||||
#define SPELL_BERSERK 26662
|
||||
#define SPELL_POISON_CLOUD_ADD 59116
|
||||
|
||||
#define EVENT_BERSERK 1
|
||||
#define EVENT_CLOUD 2
|
||||
#define EVENT_INJECT 3
|
||||
#define EVENT_SPRAY 4
|
||||
|
||||
#define MOB_FALLOUT_SLIME 16290
|
||||
|
||||
struct boss_grobbulusAI : public BossAI
|
||||
{
|
||||
boss_grobbulusAI(Creature *c) : BossAI(c, BOSS_GROBBULUS)
|
||||
{
|
||||
me->ApplySpellImmune(0, IMMUNITY_ID, SPELL_POISON_CLOUD_ADD, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_CLOUD, 15000);
|
||||
events.ScheduleEvent(EVENT_INJECT, 20000);
|
||||
events.ScheduleEvent(EVENT_SPRAY, 15000+rand()%15000); //not sure
|
||||
events.ScheduleEvent(EVENT_BERSERK, 12*60000);
|
||||
}
|
||||
|
||||
void SpellHitTarget(Unit *pTarget, const SpellEntry *spell)
|
||||
{
|
||||
if (spell->Id == uint32(SPELL_SLIME_SPRAY))
|
||||
{
|
||||
if (TempSummon *slime = me->SummonCreature(MOB_FALLOUT_SLIME, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0))
|
||||
DoZoneInCombat(slime);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_CLOUD:
|
||||
DoCastAOE(SPELL_POISON_CLOUD);
|
||||
events.ScheduleEvent(EVENT_CLOUD, 15000);
|
||||
return;
|
||||
case EVENT_BERSERK:
|
||||
DoCastAOE(SPELL_BERSERK);
|
||||
return;
|
||||
case EVENT_SPRAY:
|
||||
DoCastAOE(SPELL_SLIME_SPRAY);
|
||||
events.ScheduleEvent(EVENT_SPRAY, 15000+rand()%15000);
|
||||
return;
|
||||
case EVENT_INJECT:
|
||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1))
|
||||
if (!pTarget->HasAura(SPELL_MUTATING_INJECTION))
|
||||
DoCast(pTarget, SPELL_MUTATING_INJECTION);
|
||||
events.ScheduleEvent(EVENT_INJECT, 8000 + 12000 * ((float)me->GetHealth() / me->GetMaxHealth()));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
struct npc_grobbulus_poison_cloudAI : public Scripted_NoMovementAI
|
||||
{
|
||||
npc_grobbulus_poison_cloudAI(Creature* pCreature) : Scripted_NoMovementAI(pCreature)
|
||||
{
|
||||
Reset();
|
||||
}
|
||||
|
||||
uint32 Cloud_Timer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Cloud_Timer = 1000;
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (Cloud_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_POISON_CLOUD_ADD);
|
||||
Cloud_Timer = 10000;
|
||||
} else Cloud_Timer -= diff;
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_grobbulus(Creature* pCreature)
|
||||
{
|
||||
return new boss_grobbulusAI (pCreature);
|
||||
}
|
||||
|
||||
CreatureAI* GetAI_npc_grobbulus_poison_cloud(Creature* pCreature)
|
||||
{
|
||||
return new npc_grobbulus_poison_cloudAI(pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_grobbulus()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_grobbulus";
|
||||
newscript->GetAI = &GetAI_boss_grobbulus;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "npc_grobbulus_poison_cloud";
|
||||
newscript->GetAI = &GetAI_npc_grobbulus_poison_cloud;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
@@ -0,0 +1,149 @@
|
||||
/* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "naxxramas.h"
|
||||
|
||||
#define SAY_AGGRO RAND(-1533109,-1533110,-1533111)
|
||||
#define SAY_SLAY -1533112
|
||||
#define SAY_TAUNT RAND(-1533113,-1533114,-1533115,-1533116,-1533117)
|
||||
#define SAY_DEATH -1533118
|
||||
|
||||
#define SPELL_SPELL_DISRUPTION 29310
|
||||
#define SPELL_DECREPIT_FEVER RAID_MODE(29998,55011)
|
||||
#define SPELL_PLAGUE_CLOUD 29350
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_NONE,
|
||||
EVENT_DISRUPT,
|
||||
EVENT_FEVER,
|
||||
EVENT_ERUPT,
|
||||
EVENT_PHASE,
|
||||
};
|
||||
|
||||
enum Phases
|
||||
{
|
||||
PHASE_FIGHT = 1,
|
||||
PHASE_DANCE,
|
||||
};
|
||||
|
||||
struct boss_heiganAI : public BossAI
|
||||
{
|
||||
boss_heiganAI(Creature *c) : BossAI(c, BOSS_HEIGAN) {}
|
||||
|
||||
uint32 eruptSection;
|
||||
bool eruptDirection;
|
||||
Phases phase;
|
||||
|
||||
void KilledUnit(Unit* /*Victim*/)
|
||||
{
|
||||
if (!(rand()%5))
|
||||
DoScriptText(SAY_SLAY, me);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
DoScriptText(SAY_DEATH, me);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
DoScriptText(SAY_AGGRO, me);
|
||||
EnterPhase(PHASE_FIGHT);
|
||||
}
|
||||
|
||||
void EnterPhase(Phases newPhase)
|
||||
{
|
||||
phase = newPhase;
|
||||
events.Reset();
|
||||
eruptSection = 3;
|
||||
if (phase == PHASE_FIGHT)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_DISRUPT, urand(10000, 25000));
|
||||
events.ScheduleEvent(EVENT_FEVER, urand(15000, 20000));
|
||||
events.ScheduleEvent(EVENT_PHASE, 90000);
|
||||
events.ScheduleEvent(EVENT_ERUPT, 15000);
|
||||
}
|
||||
else
|
||||
{
|
||||
float x, y, z, o;
|
||||
me->GetHomePosition(x, y, z, o);
|
||||
me->NearTeleportTo(x, y, z, o);
|
||||
DoCastAOE(SPELL_PLAGUE_CLOUD);
|
||||
events.ScheduleEvent(EVENT_PHASE, 45000);
|
||||
events.ScheduleEvent(EVENT_ERUPT, 8000);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim() || !CheckInRoom())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_DISRUPT:
|
||||
DoCastAOE(SPELL_SPELL_DISRUPTION);
|
||||
events.ScheduleEvent(EVENT_DISRUPT, urand(5000, 10000));
|
||||
break;
|
||||
case EVENT_FEVER:
|
||||
DoCastAOE(SPELL_DECREPIT_FEVER);
|
||||
events.ScheduleEvent(EVENT_FEVER, urand(20000, 25000));
|
||||
break;
|
||||
case EVENT_PHASE:
|
||||
// TODO : Add missing texts for both phase switches
|
||||
EnterPhase(phase == PHASE_FIGHT ? PHASE_DANCE : PHASE_FIGHT);
|
||||
break;
|
||||
case EVENT_ERUPT:
|
||||
instance->SetData(DATA_HEIGAN_ERUPT, eruptSection);
|
||||
TeleportCheaters();
|
||||
|
||||
if (eruptSection == 0)
|
||||
eruptDirection = true;
|
||||
else if (eruptSection == 3)
|
||||
eruptDirection = false;
|
||||
|
||||
eruptDirection ? ++eruptSection : --eruptSection;
|
||||
|
||||
events.ScheduleEvent(EVENT_ERUPT, phase == PHASE_FIGHT ? 10000 : 3000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_heigan(Creature* pCreature)
|
||||
{
|
||||
return new boss_heiganAI (pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_heigan()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_heigan";
|
||||
newscript->GetAI = &GetAI_boss_heigan;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
@@ -0,0 +1,179 @@
|
||||
/* 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_Highlord_Mograine
|
||||
SD%Complete: 100
|
||||
SDComment: SCRIPT OBSOLETE
|
||||
SDCategory: Naxxramas
|
||||
EndScriptData */
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
//All horsemen
|
||||
#define SPELL_SHIELDWALL 29061
|
||||
#define SPELL_BESERK 26662
|
||||
|
||||
// highlord mograine
|
||||
#define SPELL_MARK_OF_MOGRAINE 28834
|
||||
#define SPELL_RIGHTEOUS_FIRE 28882 // Applied as a 25% chance on melee hit to proc. me->GetVictim()
|
||||
|
||||
#define SAY_TAUNT1 "Enough prattling. Let them come! We shall grind their bones to dust."
|
||||
#define SAY_TAUNT2 "Conserve your anger! Harness your rage! You will all have outlets for your frustration soon enough."
|
||||
#define SAY_TAUNT3 "Life is meaningless. It is in death that we are truly tested."
|
||||
#define SAY_AGGRO1 "You seek death?"
|
||||
#define SAY_AGGRO2 "None shall pass!"
|
||||
#define SAY_AGGRO3 "Be still!"
|
||||
#define SAY_SLAY1 "You will find no peace in death."
|
||||
#define SAY_SLAY2 "The master's will is done."
|
||||
#define SAY_SPECIAL "Bow to the might of the Highlord!"
|
||||
#define SAY_DEATH "I... am... released! Perhaps it's not too late to - noo! I need... more time..."
|
||||
|
||||
#define SOUND_TAUNT1 8842
|
||||
#define SOUND_TAUNT2 8843
|
||||
#define SOUND_TAUNT3 8844
|
||||
#define SOUND_AGGRO1 8835
|
||||
#define SOUND_AGGRO2 8836
|
||||
#define SOUND_AGGRO3 8837
|
||||
#define SOUND_SLAY1 8839
|
||||
#define SOUND_SLAY2 8840
|
||||
#define SOUND_SPECIAL 8841
|
||||
#define SOUND_DEATH 8838
|
||||
|
||||
#define SPIRIT_OF_MOGRAINE 16775
|
||||
|
||||
struct TRINITY_DLL_DECL boss_highlord_mograineAI : public ScriptedAI
|
||||
{
|
||||
boss_highlord_mograineAI(Creature *c) : ScriptedAI(c) {}
|
||||
|
||||
uint32 Mark_Timer;
|
||||
uint32 RighteousFire_Timer;
|
||||
bool ShieldWall1;
|
||||
bool ShieldWall2;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Mark_Timer = 20000; // First Horsemen Mark is applied at 20 sec.
|
||||
RighteousFire_Timer = 2000; // applied approx 1 out of 4 attacks
|
||||
ShieldWall1 = true;
|
||||
ShieldWall2 = true;
|
||||
}
|
||||
|
||||
void InitialYell()
|
||||
{
|
||||
if (!me->isInCombat())
|
||||
{
|
||||
switch(rand()%3)
|
||||
{
|
||||
case 0:
|
||||
DoYell(SAY_AGGRO1,LANG_UNIVERSAL,NULL);
|
||||
DoPlaySoundToSet(me,SOUND_AGGRO1);
|
||||
break;
|
||||
case 1:
|
||||
DoYell(SAY_AGGRO2,LANG_UNIVERSAL,NULL);
|
||||
DoPlaySoundToSet(me,SOUND_AGGRO2);
|
||||
break;
|
||||
case 2:
|
||||
DoYell(SAY_AGGRO3,LANG_UNIVERSAL,NULL);
|
||||
DoPlaySoundToSet(me,SOUND_AGGRO3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit()
|
||||
{
|
||||
switch(rand()%2)
|
||||
{
|
||||
case 0:
|
||||
DoYell(SAY_SLAY1,LANG_UNIVERSAL,NULL);
|
||||
DoPlaySoundToSet(me,SOUND_SLAY1);
|
||||
break;
|
||||
case 1:
|
||||
DoYell(SAY_SLAY2,LANG_UNIVERSAL,NULL);
|
||||
DoPlaySoundToSet(me,SOUND_SLAY2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* Killer)
|
||||
{
|
||||
DoYell(SAY_DEATH,LANG_UNIVERSAL,NULL);
|
||||
DoPlaySoundToSet(me, SOUND_DEATH);
|
||||
}
|
||||
|
||||
void Aggro(Unit *who)
|
||||
{
|
||||
InitialYell();
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
// Mark of Mograine
|
||||
if (Mark_Timer < diff)
|
||||
{
|
||||
DoCast(me->getVictim(),SPELL_MARK_OF_MOGRAINE);
|
||||
Mark_Timer = 12000;
|
||||
}else Mark_Timer -= diff;
|
||||
|
||||
// Shield Wall - All 4 horsemen will shield wall at 50% hp and 20% hp for 20 seconds
|
||||
if (ShieldWall1 && (me->GetHealth()*100 / me->GetMaxHealth()) < 50)
|
||||
{
|
||||
if (ShieldWall1)
|
||||
{
|
||||
DoCast(me,SPELL_SHIELDWALL);
|
||||
ShieldWall1 = false;
|
||||
}
|
||||
}
|
||||
if (ShieldWall2 && (me->GetHealth()*100 / me->GetMaxHealth()) < 20)
|
||||
{
|
||||
if (ShieldWall2)
|
||||
{
|
||||
DoCast(me,SPELL_SHIELDWALL);
|
||||
ShieldWall2 = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Righteous Fire
|
||||
if (RighteousFire_Timer < diff)
|
||||
{
|
||||
if (rand()%4 == 1) // 1/4
|
||||
{
|
||||
DoCast(me->getVictim(),SPELL_RIGHTEOUS_FIRE);
|
||||
}
|
||||
RighteousFire_Timer = 2000;
|
||||
}else RighteousFire_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
CreatureAI* GetAI_boss_highlord_mograine(Creature* pCreature)
|
||||
{
|
||||
return new boss_highlord_mograineAI (pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_highlord_mograine()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name="boss_highlord_mograine";
|
||||
newscript->GetAI = &GetAI_boss_highlord_mograine;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,706 @@
|
||||
/* 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_KelThuzad
|
||||
SD%Complete: 80%
|
||||
SDComment: VERIFY SCRIPT
|
||||
SDCategory: Naxxramas
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "naxxramas.h"
|
||||
|
||||
enum Yells
|
||||
{
|
||||
//when shappiron dies. dialog between kel and lich king (in this order)
|
||||
SAY_SAPP_DIALOG1 = -1533084, //not used
|
||||
SAY_SAPP_DIALOG2_LICH = -1533085, //not used
|
||||
SAY_SAPP_DIALOG3 = -1533086, //not used
|
||||
SAY_SAPP_DIALOG4_LICH = -1533087, //not used
|
||||
SAY_SAPP_DIALOG5 = -1533088, //not used
|
||||
SAY_CAT_DIED = -1533089, //when cat dies, not used
|
||||
//when each of the 4 wing bosses dies
|
||||
SAY_TAUNT1 = -1533090, //not used
|
||||
SAY_TAUNT2 = -1533091, //not used
|
||||
SAY_TAUNT3 = -1533092, //not used
|
||||
SAY_TAUNT4 = -1533093, //not used
|
||||
SAY_SUMMON_MINIONS = -1533105, //start of phase 1
|
||||
SAY_AGGRO_1 = -1533094, //start of phase 2
|
||||
SAY_AGGRO_2 = -1533095,
|
||||
SAY_AGGRO_3 = -1533096,
|
||||
SAY_SLAY_1 = -1533097,
|
||||
SAY_SLAY_2 = -1533098,
|
||||
SAY_DEATH = -1533099,
|
||||
SAY_CHAIN_1 = -1533100,
|
||||
SAY_CHAIN_2 = -1533101,
|
||||
SAY_FROST_BLAST = -1533102,
|
||||
SAY_SPECIAL_1 = -1533106,
|
||||
SAY_SPECIAL_2 = -1533107,
|
||||
SAY_SPECIAL_3 = -1533108,
|
||||
SAY_REQUEST_AID = -1533103, //start of phase 3
|
||||
SAY_ANSWER_REQUEST = -1533104 //lich king answer
|
||||
};
|
||||
enum Event
|
||||
{
|
||||
EVENT_NONE,
|
||||
EVENT_BOLT,
|
||||
EVENT_NOVA,
|
||||
EVENT_CHAIN,
|
||||
EVENT_CHAINED_SPELL,
|
||||
EVENT_DETONATE,
|
||||
EVENT_FISSURE,
|
||||
EVENT_BLAST,
|
||||
|
||||
EVENT_WASTE,
|
||||
EVENT_ABOMIN,
|
||||
EVENT_WEAVER,
|
||||
EVENT_ICECROWN,
|
||||
EVENT_TRIGGER,
|
||||
|
||||
EVENT_PHASE,
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_FROST_BOLT = 28478,
|
||||
H_SPELL_FROST_BOLT = 55802,
|
||||
SPELL_FROST_BOLT_AOE = 28479,
|
||||
H_SPELL_FROST_BOLT_AOE = 55807,
|
||||
SPELL_SHADOW_FISURE = 27810,
|
||||
SPELL_VOID_BLAST = 27812,
|
||||
SPELL_MANA_DETONATION = 27819,
|
||||
SPELL_FROST_BLAST = 27808,
|
||||
SPELL_CHAINS_OF_KELTHUZAD = 28410, //28408 script effect
|
||||
SPELL_KELTHUZAD_CHANNEL = 29423,
|
||||
SPELL_BERSERK = 28498,
|
||||
|
||||
//spells for chained
|
||||
//warlock
|
||||
SPELL_CURSE_OF_AGONY = 47864,
|
||||
SPELL_SHADOW_BOLT = 47809,
|
||||
//shaman
|
||||
SPELL_EARTH_SHOCK = 49231,
|
||||
SPELL_HEALING_WAVE = 49273,
|
||||
//mage
|
||||
SPELL_FROST_FIREBOLT = 47610,
|
||||
SPELL_ARCANE_MISSILES = 42846,
|
||||
//rogue
|
||||
SPELL_HEMORRHAGE = 48660,
|
||||
SPELL_MUTILATE = 48666,
|
||||
//paladin
|
||||
SPELL_HOLY_SHOCK = 48825,
|
||||
SPELL_HAMMER_OF_JUSTICE = 10308,
|
||||
//priest
|
||||
SPELL_VAMPIRIC_TOUCH = 48160,
|
||||
SPELL_RENEW = 48068,
|
||||
//hunter
|
||||
SPELL_MULTI_SHOT = 49048,
|
||||
SPELL_VOLLEY = 58434,
|
||||
//warrior
|
||||
SPELL_BLADESTORM = 46924,
|
||||
SPELL_CLEAVE = 47520,
|
||||
//druid
|
||||
SPELL_MOONFIRE = 48463,
|
||||
SPELL_LIFEBLOOM = 48451,
|
||||
//death knight
|
||||
SPELL_PLAGUE_STRIKE = 49921,
|
||||
SPELL_HOWLING_BLAST = 51411,
|
||||
};
|
||||
|
||||
enum Creatures
|
||||
{
|
||||
NPC_WASTE = 16427, // Soldiers of the Frozen Wastes
|
||||
NPC_ABOMINATION = 16428, // Unstoppable Abominations
|
||||
NPC_WEAVER = 16429, // Soul Weavers
|
||||
NPC_ICECROWN = 16441 // Guardians of Icecrown
|
||||
};
|
||||
|
||||
const Position Pos[12] =
|
||||
{
|
||||
{3783.272705, -5062.697266, 143.711203, 3.617599}, //LEFT_FAR
|
||||
{3730.291260, -5027.239258, 143.956909, 4.461900}, //LEFT_MIDDLE
|
||||
{3757.6, -5172.0, 143.7, 1.97}, //WINDOW_PORTAL05
|
||||
{3759.355225, -5174.128418, 143.802383, 2.170104}, //RIGHT_FAR
|
||||
{3700.724365, -5185.123047, 143.928024, 1.309310}, //RIGHT_MIDDLE
|
||||
{3700.86, -5181.29, 143.928024, 1.42}, //WINDOW_PORTAL04
|
||||
{3754.431396, -5080.727734, 142.036316, 3.736189}, //LEFT_FAR
|
||||
{3724.396484, -5061.330566, 142.032700, 4.564785}, //LEFT_MIDDLE
|
||||
{3732.02, -5028.53, 143.92, 4.49}, //WINDOW_PORTAL02
|
||||
{3687.571777, -5126.831055, 142.017807, 0.604023}, //RIGHT_FAR
|
||||
{3707.990733, -5151.450195, 142.032562, 1.376855}, //RIGHT_MIDDLE
|
||||
{3782.76, -5062.97, 143.79, 3.82}, //WINDOW_PORTAL03
|
||||
};
|
||||
|
||||
//creatures in corners
|
||||
//Unstoppable Abominations
|
||||
#define MAX_ABOMINATIONS 21
|
||||
const Position PosAbominations[MAX_ABOMINATIONS] =
|
||||
{
|
||||
{3755.52, -5155.22, 143.480, 2.0},
|
||||
{3744.35, -5164.03, 143.590, 2.00},
|
||||
{3749.28, -5159.04, 143.190, 2.0},
|
||||
{3774.47, -5076.28, 143.528, 2.15912},
|
||||
{3765.94, -5074.15, 143.186, 3.77233},
|
||||
{3763.15, -5063.36, 143.694, 3.77233},
|
||||
{3737.81, -5045.69, 143.709, 4.9033},
|
||||
{3728.13, -5045.01, 143.355, 1.45069},
|
||||
{3721.56, -5048.35, 143.542, 1.45069},
|
||||
{3689.55, -5049.66, 143.637, 5.2104},
|
||||
{3681.71, -5053.03, 143.242, 2.47957},
|
||||
{3677.64, -5061.44, 143.358, 2.47957},
|
||||
{3654.2, -5090.87, 143.469, 1.0313},
|
||||
{3650.39, -5097.45, 143.496, 2.5047},
|
||||
{3658.7, -5103.59, 143.607, 3.3278},
|
||||
{3659.02, -5133.97, 143.624, 3.84538},
|
||||
{3666.33, -5139.34, 143.183, 3.84538},
|
||||
{3669.74, -5149.63, 143.678, 0.528643},
|
||||
{3695.53, -5169.53, 143.671, 2.11908},
|
||||
{3701.98, -5166.51, 143.395, 1.24257},
|
||||
{3709.62, -5169.15, 143.576, 5.97695},
|
||||
};
|
||||
|
||||
//Soldiers of the Frozen Wastes
|
||||
#define MAX_WASTES 49
|
||||
const Position PosWastes[MAX_WASTES] =
|
||||
{
|
||||
{3754.41, -5147.24, 143.204, 2.0},
|
||||
{3754.68, -5156.17, 143.418, 2.0},
|
||||
{3757.91, -5160.12, 143.503, 2.0},
|
||||
{3752.67, -5164.6, 143.395, 2.0},
|
||||
{3745.42, -5164.47, 143.565, 2.74587},
|
||||
{3741.2, -5155.92, 143.17, 5.29134},
|
||||
{3746.57, -5148.82, 143.176, 5.07772},
|
||||
{3778.14, -5070.1, 143.568, 3.16208},
|
||||
{3775.09, -5078.97, 143.65, 2.81022},
|
||||
{3773.54, -5083.47, 143.758, 3.21549},
|
||||
{3765, -5078.29, 143.176, 4.36688},
|
||||
{3766.94, -5072.63, 143.184, 5.27951},
|
||||
{3762.68, -5064.94, 143.635, 3.95297},
|
||||
{3769.9, -5059.94, 143.74, 3.36549},
|
||||
{3736.33, -5042.18, 143.643, 5.9471},
|
||||
{3727.51, -5040.58, 143.502, 0.871859},
|
||||
{3719.89, -5049.64, 143.58, 4.75172},
|
||||
{3720.69, -5044.43, 143.662, 1.87245},
|
||||
{3725.69, -5048.99, 143.363, 2.48271},
|
||||
{3732.33, -5054.01, 143.44, 3.59405},
|
||||
{3738.09, -5051.06, 143.718, 4.70931},
|
||||
{3682.76, -5063.5, 143.175, 0.636238},
|
||||
{3686.7, -5060.58, 143.18, 0.636238},
|
||||
{3682.45, -5057.21, 143.184, 5.61252},
|
||||
{3677.57, -5053.34, 143.369, 1.52531},
|
||||
{3677.3, -5062.26, 143.369, 2.73482},
|
||||
{3691.21, -5053.02, 143.421, 5.93218},
|
||||
{3685.22, -5053.34, 143.314, 4.70303},
|
||||
{3652.11, -5088.47, 143.555, 0.793317},
|
||||
{3648.23, -5093.21, 143.311, 1.18837},
|
||||
{3648.14, -5100.11, 143.632, 2.12221},
|
||||
{3653.88, -5099.7, 143.558, 3.04348},
|
||||
{3661.23, -5100.33, 143.42, 4.08335},
|
||||
{3663.49, -5092.77, 143.346, 4.47134},
|
||||
{3661.85, -5087.99, 143.571, 1.0148},
|
||||
{3664.56, -5149.01, 143.532, 0.0762528},
|
||||
{3665.01, -5142.04, 143.201, 1.72009},
|
||||
{3671.15, -5142.92, 143.174, 4.81535},
|
||||
{3670.18, -5134.38, 143.177, 5.37534},
|
||||
{3664.33, -5131.69, 143.262, 5.39576},
|
||||
{3658.21, -5133.63, 143.662, 1.3863},
|
||||
{3659.7, -5144.49, 143.363, 2.32328},
|
||||
{3705.71, -5179.63, 143.746, 1.06743},
|
||||
{3696.77, -5177.45, 143.759, 5.36748},
|
||||
{3700.97, -5173.13, 143.52, 3.26575},
|
||||
{3708.53, -5172.19, 143.573, 3.26575},
|
||||
{3712.49, -5167.62, 143.657, 5.63295},
|
||||
{3704.89, -5161.84, 143.239, 5.63295},
|
||||
{3695.66, -5164.63, 143.674, 1.54416},
|
||||
};
|
||||
|
||||
//Soul Weavers
|
||||
#define MAX_WEAVERS 7
|
||||
const Position PosWeavers[MAX_WEAVERS] =
|
||||
{
|
||||
{3752.45, -5168.35, 143.562, 1.6094},
|
||||
{3772.2, -5070.04, 143.329, 1.93686},
|
||||
{3732.28, -5032.88, 143.771, 3.08355},
|
||||
{3689.05, -5055.7, 143.172, 6.09554},
|
||||
{3649.45, -5093.17, 143.299, 2.51805},
|
||||
{3659.7, -5144.49, 143.363, 4.08806},
|
||||
{3704.71, -5175.96, 143.597, 3.36549},
|
||||
};
|
||||
|
||||
// predicate function to select not charmed target
|
||||
struct NotCharmedTargetSelector : public std::unary_function<Unit *, bool> {
|
||||
NotCharmedTargetSelector() {}
|
||||
|
||||
bool operator() (const Unit *pTarget) {
|
||||
return (!pTarget->isCharmed());
|
||||
}
|
||||
};
|
||||
|
||||
struct boss_kelthuzadAI : public BossAI
|
||||
{
|
||||
boss_kelthuzadAI(Creature* c) : BossAI(c, BOSS_KELTHUZAD), spawns(c)
|
||||
{
|
||||
uiFaction = me->getFaction();
|
||||
}
|
||||
|
||||
uint32 Phase;
|
||||
uint32 uiGuardiansOfIcecrownTimer;
|
||||
uint32 uiFaction;
|
||||
|
||||
uint8 nGuardiansOfIcecrownCount;
|
||||
uint8 nAbomination;
|
||||
uint8 nWeaver;
|
||||
|
||||
std::map<uint64, float> chained;
|
||||
|
||||
uint64 PortalsGUID[4];
|
||||
uint64 KTTriggerGUID;
|
||||
|
||||
SummonList spawns; // adds spawn by the trigger. kept in separated list (i.e. not in summons)
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
|
||||
PortalsGUID[0] = PortalsGUID[1] = PortalsGUID[2] = PortalsGUID[3] = 0;
|
||||
KTTriggerGUID = 0;
|
||||
|
||||
me->setFaction(35);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE);
|
||||
std::map<uint64, float>::const_iterator itr;
|
||||
for (itr = chained.begin(); itr != chained.end(); ++itr)
|
||||
{
|
||||
if (Player* charmed = Unit::GetPlayer((*itr).first))
|
||||
charmed->SetFloatValue(OBJECT_FIELD_SCALE_X, (*itr).second);
|
||||
}
|
||||
|
||||
chained.clear();
|
||||
spawns.DespawnAll();
|
||||
|
||||
FindGameObjects();
|
||||
|
||||
if (GameObject *pKTTrigger = me->GetMap()->GetGameObject(KTTriggerGUID))
|
||||
{
|
||||
pKTTrigger->ResetDoorOrButton();
|
||||
pKTTrigger->SetPhaseMask(1, true);
|
||||
}
|
||||
|
||||
for (uint8 i = 0; i <= 3; ++i)
|
||||
{
|
||||
if (GameObject *pPortal = me->GetMap()->GetGameObject(PortalsGUID[i]))
|
||||
{
|
||||
if (!((pPortal->getLootState() == GO_READY) || (pPortal->getLootState() == GO_NOT_READY)))
|
||||
pPortal->ResetDoorOrButton();
|
||||
}
|
||||
}
|
||||
|
||||
nGuardiansOfIcecrownCount = 0;
|
||||
uiGuardiansOfIcecrownTimer = 5000; //5 seconds for summoning each Guardian of Icecrown in phase 3
|
||||
|
||||
Phase = 0;
|
||||
nAbomination = 0;
|
||||
nWeaver = 0;
|
||||
}
|
||||
|
||||
void KilledUnit()
|
||||
{
|
||||
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
DoScriptText(SAY_DEATH, me);
|
||||
|
||||
std::map<uint64, float>::const_iterator itr;
|
||||
for (itr = chained.begin(); itr != chained.end(); ++itr)
|
||||
{
|
||||
if (Player* pPlayer = Unit::GetPlayer((*itr).first))
|
||||
pPlayer->SetFloatValue(OBJECT_FIELD_SCALE_X, (*itr).second);
|
||||
}
|
||||
chained.clear();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
me->setFaction(uiFaction);
|
||||
|
||||
_EnterCombat();
|
||||
FindGameObjects();
|
||||
for (uint8 i = 0; i <= 3; ++i)
|
||||
{
|
||||
if (GameObject *pPortal = me->GetMap()->GetGameObject(PortalsGUID[i]))
|
||||
pPortal->ResetDoorOrButton();
|
||||
}
|
||||
DoCast(me, SPELL_KELTHUZAD_CHANNEL, false);
|
||||
DoScriptText(SAY_SUMMON_MINIONS, me);
|
||||
Phase = 1;
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetFloatValue(UNIT_FIELD_COMBATREACH, 4);
|
||||
me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 4);
|
||||
events.ScheduleEvent(EVENT_TRIGGER, 5000);
|
||||
events.ScheduleEvent(EVENT_WASTE, 15000);
|
||||
events.ScheduleEvent(EVENT_ABOMIN, 30000);
|
||||
events.ScheduleEvent(EVENT_WEAVER, 50000);
|
||||
events.ScheduleEvent(EVENT_PHASE, 228000);
|
||||
}
|
||||
|
||||
void FindGameObjects()
|
||||
{
|
||||
PortalsGUID[0] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL01) : 0;
|
||||
PortalsGUID[1] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL02) : 0;
|
||||
PortalsGUID[2] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL03) : 0;
|
||||
PortalsGUID[3] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL04) : 0;
|
||||
KTTriggerGUID = instance ? instance->GetData64(DATA_KELTHUZAD_TRIGGER) : 0;
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateCombatState())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (Phase == 1)
|
||||
{
|
||||
while (uint32 eventId = events.GetEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_WASTE:
|
||||
DoSummon(NPC_WASTE, Pos[RAND(0,3,6,9)]);
|
||||
events.RepeatEvent(urand(2000,5000));
|
||||
break;
|
||||
case EVENT_ABOMIN:
|
||||
if (nAbomination < 8)
|
||||
{
|
||||
DoSummon(NPC_ABOMINATION, Pos[RAND(1,4,7,10)]);
|
||||
nAbomination++;
|
||||
events.RepeatEvent(20000);
|
||||
}
|
||||
else
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_WEAVER:
|
||||
if (nWeaver < 8)
|
||||
{
|
||||
DoSummon(NPC_WEAVER, Pos[RAND(0,3,6,9)]);
|
||||
nWeaver++;
|
||||
events.RepeatEvent(25000);
|
||||
}
|
||||
else
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_TRIGGER:
|
||||
if (GameObject *pKTTrigger = me->GetMap()->GetGameObject(KTTriggerGUID))
|
||||
pKTTrigger->SetPhaseMask(2, true);
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_PHASE:
|
||||
events.Reset();
|
||||
DoScriptText(RAND(SAY_AGGRO_1,SAY_AGGRO_2,SAY_AGGRO_3), me);
|
||||
spawns.DespawnAll();
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->CastStop();
|
||||
|
||||
DoStartMovement(me->getVictim());
|
||||
events.ScheduleEvent(EVENT_BOLT, urand(5000,10000));
|
||||
events.ScheduleEvent(EVENT_NOVA, 15000);
|
||||
events.ScheduleEvent(EVENT_DETONATE, urand(30000,40000));
|
||||
events.ScheduleEvent(EVENT_FISSURE, urand(10000,30000));
|
||||
events.ScheduleEvent(EVENT_BLAST, urand(60000,120000));
|
||||
if (getDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)
|
||||
events.ScheduleEvent(EVENT_CHAIN, urand(30000,60000));
|
||||
Phase = 2;
|
||||
break;
|
||||
default:
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//start phase 3 when we are 45% health
|
||||
if (Phase != 3)
|
||||
{
|
||||
if (HealthBelowPct(45))
|
||||
{
|
||||
Phase = 3 ;
|
||||
DoScriptText(SAY_REQUEST_AID, me);
|
||||
//here Lich King should respond to KelThuzad but I don't know which Creature to make talk
|
||||
//so for now just make Kelthuzad says it.
|
||||
DoScriptText(SAY_ANSWER_REQUEST, me);
|
||||
|
||||
for (uint8 i = 0; i <= 3; ++i)
|
||||
{
|
||||
if (GameObject *pPortal = me->GetMap()->GetGameObject(PortalsGUID[i]))
|
||||
{
|
||||
if (pPortal->getLootState() == GO_READY)
|
||||
pPortal->UseDoorOrButton();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (nGuardiansOfIcecrownCount < RAID_MODE(2,4))
|
||||
{
|
||||
if (uiGuardiansOfIcecrownTimer <= diff)
|
||||
{
|
||||
// TODO : Add missing text
|
||||
if (Creature* pGuardian = DoSummon(NPC_ICECROWN, Pos[RAND(2,5,8,11)]))
|
||||
pGuardian->SetFloatValue(UNIT_FIELD_COMBATREACH, 2);
|
||||
++nGuardiansOfIcecrownCount;
|
||||
uiGuardiansOfIcecrownTimer = 5000;
|
||||
}
|
||||
else uiGuardiansOfIcecrownTimer -= diff;
|
||||
}
|
||||
|
||||
if (me->hasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
if (uint32 eventId = events.GetEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_BOLT:
|
||||
DoCastVictim(RAID_MODE(SPELL_FROST_BOLT,H_SPELL_FROST_BOLT));
|
||||
events.RepeatEvent(urand(5000,10000));
|
||||
break;
|
||||
case EVENT_NOVA:
|
||||
DoCastAOE(RAID_MODE(SPELL_FROST_BOLT_AOE,H_SPELL_FROST_BOLT_AOE));
|
||||
events.RepeatEvent(urand(15000,30000));
|
||||
break;
|
||||
case EVENT_CHAIN:
|
||||
{
|
||||
uint32 count = urand(1,3);
|
||||
for (uint8 i = 1; i <= count; i++)
|
||||
{
|
||||
Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 1, 200, true);
|
||||
if (pTarget && !pTarget->isCharmed() && (chained.find(pTarget->GetGUID()) == chained.end()))
|
||||
{
|
||||
DoCast(pTarget, SPELL_CHAINS_OF_KELTHUZAD);
|
||||
float scale = pTarget->GetFloatValue(OBJECT_FIELD_SCALE_X);
|
||||
chained.insert(std::make_pair(pTarget->GetGUID(), scale));
|
||||
pTarget->SetFloatValue(OBJECT_FIELD_SCALE_X, scale * 2);
|
||||
events.ScheduleEvent(EVENT_CHAINED_SPELL, 2000); //core has 2000ms to set unit flag charm
|
||||
}
|
||||
}
|
||||
if (!chained.empty())
|
||||
DoScriptText(RAND(SAY_CHAIN_1,SAY_CHAIN_2), me);
|
||||
events.RepeatEvent(urand(100000,180000));
|
||||
break;
|
||||
}
|
||||
case EVENT_CHAINED_SPELL:
|
||||
{
|
||||
std::map<uint64, float>::iterator itr;
|
||||
for (itr = chained.begin(); itr != chained.end();)
|
||||
{
|
||||
if (Unit* player = Unit::GetPlayer((*itr).first))
|
||||
{
|
||||
if (!player->isCharmed())
|
||||
{
|
||||
player->SetFloatValue(OBJECT_FIELD_SCALE_X, (*itr).second);
|
||||
std::map<uint64, float>::iterator next = itr;
|
||||
++next;
|
||||
chained.erase(itr);
|
||||
itr = next;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_TOPAGGRO, 0, NotCharmedTargetSelector()))
|
||||
{
|
||||
switch(player->getClass())
|
||||
{
|
||||
case CLASS_DRUID:
|
||||
if (urand(0,1))
|
||||
player->CastSpell(pTarget, SPELL_MOONFIRE, false);
|
||||
else
|
||||
player->CastSpell(me, SPELL_LIFEBLOOM, false);
|
||||
break;
|
||||
case CLASS_HUNTER:
|
||||
player->CastSpell(pTarget, RAND(SPELL_MULTI_SHOT, SPELL_VOLLEY), false);
|
||||
break;
|
||||
case CLASS_MAGE:
|
||||
player->CastSpell(pTarget, RAND(SPELL_FROST_FIREBOLT, SPELL_ARCANE_MISSILES), false);
|
||||
break;
|
||||
case CLASS_WARLOCK:
|
||||
player->CastSpell(pTarget, RAND(SPELL_CURSE_OF_AGONY, SPELL_SHADOW_BOLT), true);
|
||||
break;
|
||||
case CLASS_WARRIOR:
|
||||
player->CastSpell(pTarget, RAND(SPELL_BLADESTORM, SPELL_CLEAVE), false);
|
||||
break;
|
||||
case CLASS_PALADIN:
|
||||
if (urand(0,1))
|
||||
player->CastSpell(pTarget, SPELL_HAMMER_OF_JUSTICE, false);
|
||||
else
|
||||
player->CastSpell(me, SPELL_HOLY_SHOCK, false);
|
||||
break;
|
||||
case CLASS_PRIEST:
|
||||
if (urand(0,1))
|
||||
player->CastSpell(pTarget, SPELL_VAMPIRIC_TOUCH, false);
|
||||
else
|
||||
player->CastSpell(me, SPELL_RENEW, false);
|
||||
break;
|
||||
case CLASS_SHAMAN:
|
||||
if (urand(0,1))
|
||||
player->CastSpell(pTarget, SPELL_EARTH_SHOCK, false);
|
||||
else
|
||||
player->CastSpell(me, SPELL_HEALING_WAVE, false);
|
||||
break;
|
||||
case CLASS_ROGUE:
|
||||
player->CastSpell(pTarget, RAND(SPELL_HEMORRHAGE, SPELL_MUTILATE), false);
|
||||
break;
|
||||
case CLASS_DEATH_KNIGHT:
|
||||
if (urand(0,1))
|
||||
player->CastSpell(pTarget, SPELL_PLAGUE_STRIKE, true);
|
||||
else
|
||||
player->CastSpell(pTarget, SPELL_HOWLING_BLAST, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
++itr;
|
||||
}
|
||||
|
||||
if (chained.empty())
|
||||
events.PopEvent();
|
||||
else
|
||||
events.RepeatEvent(5000);
|
||||
|
||||
break;
|
||||
}
|
||||
case EVENT_DETONATE:
|
||||
{
|
||||
std::vector<Unit*> unitList;
|
||||
std::list<HostileReference*> *threatList = &me->getThreatManager().getThreatList();
|
||||
for (std::list<HostileReference*>::const_iterator itr = threatList->begin(); itr != threatList->end(); ++itr)
|
||||
{
|
||||
if ((*itr)->getTarget()->GetTypeId() == TYPEID_PLAYER
|
||||
&& (*itr)->getTarget()->getPowerType() == POWER_MANA
|
||||
&& (*itr)->getTarget()->GetPower(POWER_MANA))
|
||||
unitList.push_back((*itr)->getTarget());
|
||||
}
|
||||
|
||||
if (!unitList.empty())
|
||||
{
|
||||
std::vector<Unit*>::const_iterator itr = unitList.begin();
|
||||
advance(itr, rand()%unitList.size());
|
||||
DoCast(*itr, SPELL_MANA_DETONATION);
|
||||
DoScriptText(RAND(SAY_SPECIAL_1,SAY_SPECIAL_2,SAY_SPECIAL_3), me);
|
||||
}
|
||||
|
||||
events.RepeatEvent(urand(20000,50000));
|
||||
break;
|
||||
}
|
||||
case EVENT_FISSURE:
|
||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
|
||||
DoCast(pTarget, SPELL_SHADOW_FISURE);
|
||||
events.RepeatEvent(urand(10000,45000));
|
||||
break;
|
||||
case EVENT_BLAST:
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, RAID_MODE(1,0), 0, true))
|
||||
DoCast(pTarget, SPELL_FROST_BLAST);
|
||||
if (rand()%2)
|
||||
DoScriptText(SAY_FROST_BLAST, me);
|
||||
events.RepeatEvent(urand(30000,90000));
|
||||
break;
|
||||
default:
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_kelthuzadAI(Creature* pCreature)
|
||||
{
|
||||
return new boss_kelthuzadAI (pCreature);
|
||||
}
|
||||
|
||||
bool AreaTrigger_at_kelthuzad_center(Player* pPlayer, const AreaTriggerEntry * /*at*/)
|
||||
{
|
||||
if (pPlayer->isGameMaster())
|
||||
return false;
|
||||
|
||||
ScriptedInstance* pInstance = pPlayer->GetInstanceData();
|
||||
if (!pInstance || pInstance->IsEncounterInProgress() || pInstance->GetBossState(BOSS_KELTHUZAD) == DONE)
|
||||
return false;
|
||||
|
||||
Creature* pKelthuzad = CAST_CRE(Unit::GetUnit(*pPlayer, pInstance->GetData64(DATA_KELTHUZAD)));
|
||||
if (!pKelthuzad)
|
||||
return false;
|
||||
|
||||
boss_kelthuzadAI* pKelthuzadAI = CAST_AI(boss_kelthuzadAI, pKelthuzad->AI());
|
||||
if (!pKelthuzadAI)
|
||||
return false;
|
||||
|
||||
pKelthuzadAI->AttackStart(pPlayer);
|
||||
if (GameObject* trigger = pInstance->instance->GetGameObject(pInstance->GetData64(DATA_KELTHUZAD_TRIGGER)))
|
||||
{
|
||||
if (trigger->getLootState() == GO_READY)
|
||||
trigger->UseDoorOrButton();
|
||||
|
||||
// Note: summon must be done by trigger and not by KT.
|
||||
// Otherwise, they attack immediately as KT is in combat.
|
||||
for (uint8 i = 0; i <= MAX_ABOMINATIONS; ++i)
|
||||
{
|
||||
if (Creature* sum = trigger->SummonCreature(NPC_ABOMINATION, PosAbominations[i]))
|
||||
{
|
||||
pKelthuzadAI->spawns.Summon(sum);
|
||||
sum->GetMotionMaster()->MoveRandom(9.0f);
|
||||
sum->SetReactState(REACT_DEFENSIVE);
|
||||
}
|
||||
}
|
||||
for (uint8 i = 0; i <= MAX_WASTES; ++i)
|
||||
{
|
||||
if (Creature* sum = trigger->SummonCreature(NPC_WASTE, PosWastes[i]))
|
||||
{
|
||||
pKelthuzadAI->spawns.Summon(sum);
|
||||
sum->GetMotionMaster()->MoveRandom(5.0f);
|
||||
sum->SetReactState(REACT_DEFENSIVE);
|
||||
}
|
||||
}
|
||||
for (uint8 i = 0; i <= MAX_WEAVERS; ++i)
|
||||
{
|
||||
if (Creature* sum = trigger->SummonCreature(NPC_WEAVER, PosWeavers[i]))
|
||||
{
|
||||
pKelthuzadAI->spawns.Summon(sum);
|
||||
sum->GetMotionMaster()->MoveRandom(9.0f);
|
||||
sum->SetReactState(REACT_DEFENSIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void AddSC_boss_kelthuzad()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_kelthuzad";
|
||||
newscript->GetAI = &GetAI_boss_kelthuzadAI;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "at_kelthuzad_center";
|
||||
newscript->pAreaTrigger = &AreaTrigger_at_kelthuzad_center;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
/*
|
||||
* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "naxxramas.h"
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_NECROTIC_AURA = 55593,
|
||||
SPELL_SUMMON_SPORE = 29234,
|
||||
SPELL_DEATHBLOOM = 29865,
|
||||
H_SPELL_DEATHBLOOM = 55053,
|
||||
SPELL_INEVITABLE_DOOM = 29204,
|
||||
H_SPELL_INEVITABLE_DOOM = 55052
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_NONE,
|
||||
EVENT_AURA,
|
||||
EVENT_BLOOM,
|
||||
EVENT_DOOM,
|
||||
};
|
||||
|
||||
struct boss_loathebAI : public BossAI
|
||||
{
|
||||
boss_loathebAI(Creature *c) : BossAI(c, BOSS_LOATHEB) {}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_AURA, 10000);
|
||||
events.ScheduleEvent(EVENT_BLOOM, 5000);
|
||||
events.ScheduleEvent(EVENT_DOOM, 120000);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_AURA:
|
||||
DoCastAOE(SPELL_NECROTIC_AURA);
|
||||
events.ScheduleEvent(EVENT_AURA, 20000);
|
||||
break;
|
||||
case EVENT_BLOOM:
|
||||
// TODO : Add missing text
|
||||
DoCastAOE(SPELL_SUMMON_SPORE, true);
|
||||
DoCastAOE(RAID_MODE(SPELL_DEATHBLOOM,H_SPELL_DEATHBLOOM));
|
||||
events.ScheduleEvent(EVENT_BLOOM, 30000);
|
||||
break;
|
||||
case EVENT_DOOM:
|
||||
DoCastAOE(RAID_MODE(SPELL_INEVITABLE_DOOM,H_SPELL_INEVITABLE_DOOM));
|
||||
events.ScheduleEvent(EVENT_DOOM, events.GetTimer() < 5*60000 ? 30000 : 15000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_loatheb(Creature* pCreature)
|
||||
{
|
||||
return new boss_loathebAI (pCreature);
|
||||
}
|
||||
|
||||
enum SporeSpells
|
||||
{
|
||||
SPELL_FUNGAL_CREEP = 29232
|
||||
};
|
||||
|
||||
struct mob_loatheb_sporeAI : public ScriptedAI
|
||||
{
|
||||
mob_loatheb_sporeAI(Creature *c) : ScriptedAI(c) {}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
DoCast(killer, SPELL_FUNGAL_CREEP);
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_mob_loatheb_spore(Creature* pCreature)
|
||||
{
|
||||
return new mob_loatheb_sporeAI (pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_loatheb()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_loatheb";
|
||||
newscript->GetAI = &GetAI_boss_loatheb;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "mob_loatheb_spore";
|
||||
newscript->GetAI = &GetAI_mob_loatheb_spore;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
// Fungal Creep
|
||||
//GetAISpellInfo(29232)->condition = AICOND_DIE;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,186 @@
|
||||
/*
|
||||
* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "naxxramas.h"
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_WEB_WRAP = 28622,
|
||||
SPELL_WEB_SPRAY_10 = 29484,
|
||||
SPELL_WEB_SPRAY_25 = 54125,
|
||||
SPELL_POISON_SHOCK_10 = 28741,
|
||||
SPELL_POISON_SHOCK_25 = 54122,
|
||||
SPELL_NECROTIC_POISON_10 = 28776,
|
||||
SPELL_NECROTIC_POISON_25 = 54121,
|
||||
SPELL_FRENZY_10 = 54123,
|
||||
SPELL_FRENZY_25 = 54124,
|
||||
};
|
||||
|
||||
enum Creatures
|
||||
{
|
||||
MOB_WEB_WRAP = 16486,
|
||||
MOB_SPIDERLING = 17055,
|
||||
};
|
||||
|
||||
#define MAX_POS_WRAP 3
|
||||
const Position PosWrap[MAX_POS_WRAP] =
|
||||
{
|
||||
{3546.796, -3869.082, 296.450, 0.0},
|
||||
{3531.271, -3847.424, 299.450, 0.0},
|
||||
{3497.067, -3843.384, 302.384, 0.0},
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_NONE,
|
||||
EVENT_SPRAY,
|
||||
EVENT_SHOCK,
|
||||
EVENT_POISON,
|
||||
EVENT_WRAP,
|
||||
EVENT_SUMMON,
|
||||
EVENT_FRENZY,
|
||||
};
|
||||
|
||||
struct boss_maexxnaAI : public BossAI
|
||||
{
|
||||
boss_maexxnaAI(Creature *c) : BossAI(c, BOSS_MAEXXNA) {}
|
||||
|
||||
bool enraged;
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
enraged = false;
|
||||
events.ScheduleEvent(EVENT_WRAP, 20000);
|
||||
events.ScheduleEvent(EVENT_SPRAY, 40000);
|
||||
events.ScheduleEvent(EVENT_SHOCK, urand(5000,10000));
|
||||
events.ScheduleEvent(EVENT_POISON, urand(10000,15000));
|
||||
events.ScheduleEvent(EVENT_SUMMON, 30000);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim() || !CheckInRoom())
|
||||
return;
|
||||
|
||||
if (!enraged && HealthBelowPct(30))
|
||||
{
|
||||
enraged = true;
|
||||
events.ScheduleEvent(EVENT_FRENZY, 0); // will be cast immediately
|
||||
}
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_WRAP:
|
||||
// TODO : Add missing text
|
||||
for (uint8 i = 0; i < RAID_MODE(1,2); ++i)
|
||||
{
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 1, 0, true, -SPELL_WEB_WRAP))
|
||||
{
|
||||
pTarget->RemoveAura(RAID_MODE(SPELL_WEB_SPRAY_10,SPELL_WEB_SPRAY_25));
|
||||
uint8 pos = rand()%MAX_POS_WRAP;
|
||||
pTarget->GetMotionMaster()->MoveJump(PosWrap[pos].GetPositionX(), PosWrap[pos].GetPositionY(), PosWrap[pos].GetPositionZ(), 20, 20);
|
||||
if (Creature *wrap = DoSummon(MOB_WEB_WRAP, PosWrap[pos], 0, TEMPSUMMON_CORPSE_DESPAWN))
|
||||
wrap->AI()->SetGUID(pTarget->GetGUID());
|
||||
}
|
||||
}
|
||||
events.ScheduleEvent(EVENT_WRAP, 40000);
|
||||
break;
|
||||
case EVENT_SPRAY:
|
||||
DoCastAOE(RAID_MODE(SPELL_WEB_SPRAY_10,SPELL_WEB_SPRAY_25));
|
||||
events.ScheduleEvent(EVENT_SPRAY, 40000);
|
||||
break;
|
||||
case EVENT_SHOCK:
|
||||
DoCastAOE(RAID_MODE(SPELL_POISON_SHOCK_10,SPELL_POISON_SHOCK_25));
|
||||
events.ScheduleEvent(EVENT_SHOCK, urand(10000,20000));
|
||||
break;
|
||||
case EVENT_POISON:
|
||||
DoCast(me->getVictim(), RAID_MODE(SPELL_NECROTIC_POISON_10,SPELL_NECROTIC_POISON_25));
|
||||
events.ScheduleEvent(EVENT_POISON, urand(10000, 20000));
|
||||
break;
|
||||
case EVENT_FRENZY:
|
||||
DoCast(me, RAID_MODE(SPELL_FRENZY_10,SPELL_FRENZY_25), true);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 600000);
|
||||
break;
|
||||
case EVENT_SUMMON:
|
||||
// TODO : Add missing text
|
||||
uint8 amount = urand(8,10);
|
||||
for (uint8 i = 0; i < amount; ++i)
|
||||
DoSummon(MOB_SPIDERLING, me, 0, TEMPSUMMON_CORPSE_DESPAWN);
|
||||
events.ScheduleEvent(EVENT_SUMMON, 40000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
struct mob_webwrapAI : public NullCreatureAI
|
||||
{
|
||||
mob_webwrapAI(Creature *c) : NullCreatureAI(c), victimGUID(0) {}
|
||||
|
||||
uint64 victimGUID;
|
||||
|
||||
void SetGUID(const uint64 &guid, int32 /*param*/)
|
||||
{
|
||||
victimGUID = guid;
|
||||
if (me->m_spells[0] && victimGUID)
|
||||
if (Unit *victim = Unit::GetUnit(*me, victimGUID))
|
||||
victim->CastSpell(victim, me->m_spells[0], true, NULL, NULL, me->GetGUID());
|
||||
}
|
||||
|
||||
void JustDied(Unit * /*killer*/)
|
||||
{
|
||||
if (me->m_spells[0] && victimGUID)
|
||||
if (Unit *victim = Unit::GetUnit(*me, victimGUID))
|
||||
victim->RemoveAurasDueToSpell(me->m_spells[0], me->GetGUID());
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_maexxna(Creature* pCreature)
|
||||
{
|
||||
return new boss_maexxnaAI (pCreature);
|
||||
}
|
||||
|
||||
CreatureAI* GetAI_mob_webwrap(Creature* pCreature)
|
||||
{
|
||||
return new mob_webwrapAI (pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_maexxna()
|
||||
{
|
||||
Script *newscript;
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_maexxna";
|
||||
newscript->GetAI = &GetAI_boss_maexxna;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "mob_webwrap";
|
||||
newscript->GetAI = &GetAI_mob_webwrap;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,212 @@
|
||||
/* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "naxxramas.h"
|
||||
|
||||
#define SAY_AGGRO RAND(-1533075,-1533076,-1533077)
|
||||
#define SAY_SUMMON -1533078
|
||||
#define SAY_SLAY RAND(-1533079,-1533080)
|
||||
#define SAY_DEATH -1533081
|
||||
|
||||
#define SOUND_DEATH 8848
|
||||
|
||||
#define SPELL_CURSE_PLAGUEBRINGER RAID_MODE(29213,54835)
|
||||
#define SPELL_BLINK RAND(29208,29209,29210,29211)
|
||||
#define SPELL_CRIPPLE RAID_MODE(29212,54814)
|
||||
#define SPELL_TELEPORT 29216
|
||||
|
||||
#define MOB_WARRIOR 16984
|
||||
#define MOB_CHAMPION 16983
|
||||
#define MOB_GUARDIAN 16981
|
||||
|
||||
// Teleport position of Noth on his balcony
|
||||
#define TELE_X 2631.370
|
||||
#define TELE_Y -3529.680
|
||||
#define TELE_Z 274.040
|
||||
#define TELE_O 6.277
|
||||
|
||||
#define MAX_SUMMON_POS 5
|
||||
|
||||
const float SummonPos[MAX_SUMMON_POS][4] =
|
||||
{
|
||||
{2728.12, -3544.43, 261.91, 6.04},
|
||||
{2729.05, -3544.47, 261.91, 5.58},
|
||||
{2728.24, -3465.08, 264.20, 3.56},
|
||||
{2704.11, -3456.81, 265.53, 4.51},
|
||||
{2663.56, -3464.43, 262.66, 5.20},
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_NONE,
|
||||
EVENT_BERSERK,
|
||||
EVENT_CURSE,
|
||||
EVENT_BLINK,
|
||||
EVENT_WARRIOR,
|
||||
EVENT_BALCONY,
|
||||
EVENT_WAVE,
|
||||
EVENT_GROUND,
|
||||
};
|
||||
|
||||
struct boss_nothAI : public BossAI
|
||||
{
|
||||
boss_nothAI(Creature *c) : BossAI(c, BOSS_NOTH) {}
|
||||
|
||||
uint32 waveCount, balconyCount;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
DoScriptText(SAY_AGGRO, me);
|
||||
balconyCount = 0;
|
||||
EnterPhaseGround();
|
||||
}
|
||||
|
||||
void EnterPhaseGround()
|
||||
{
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
DoZoneInCombat();
|
||||
if (me->getThreatManager().isThreatListEmpty())
|
||||
EnterEvadeMode();
|
||||
else
|
||||
{
|
||||
events.ScheduleEvent(EVENT_BALCONY, 110000);
|
||||
events.ScheduleEvent(EVENT_CURSE, 10000+rand()%15000);
|
||||
events.ScheduleEvent(EVENT_WARRIOR, 30000);
|
||||
if (getDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)
|
||||
events.ScheduleEvent(EVENT_BLINK, 20000 + rand()%20000);
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (!(rand()%5))
|
||||
DoScriptText(SAY_SLAY, me);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature *summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
summon->setActive(true);
|
||||
summon->AI()->DoZoneInCombat();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
DoScriptText(SAY_DEATH, me);
|
||||
}
|
||||
|
||||
void SummonUndead(uint32 entry, uint32 num)
|
||||
{
|
||||
for (uint32 i = 0; i < num; ++i)
|
||||
{
|
||||
uint32 pos = rand()%MAX_SUMMON_POS;
|
||||
me->SummonCreature(entry, SummonPos[pos][0], SummonPos[pos][1], SummonPos[pos][2],
|
||||
SummonPos[pos][3], TEMPSUMMON_CORPSE_DESPAWN, 60000);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateCombatState() || !CheckInRoom())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_CURSE:
|
||||
DoCastAOE(SPELL_CURSE_PLAGUEBRINGER);
|
||||
events.ScheduleEvent(EVENT_CURSE, 50000 + rand()%10000);
|
||||
return;
|
||||
case EVENT_WARRIOR:
|
||||
DoScriptText(SAY_SUMMON, me);
|
||||
SummonUndead(MOB_WARRIOR, RAID_MODE(2,3));
|
||||
events.ScheduleEvent(EVENT_WARRIOR, 30000);
|
||||
return;
|
||||
case EVENT_BLINK:
|
||||
DoCastAOE(SPELL_CRIPPLE, true);
|
||||
DoCastAOE(SPELL_BLINK);
|
||||
DoResetThreat();
|
||||
events.ScheduleEvent(EVENT_BLINK, 40000);
|
||||
return;
|
||||
case EVENT_BALCONY:
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->AttackStop();
|
||||
me->RemoveAllAuras();
|
||||
me->NearTeleportTo(TELE_X, TELE_Y, TELE_Z, TELE_O);
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_WAVE, 2000 + rand()%3000);
|
||||
waveCount = 0;
|
||||
return;
|
||||
case EVENT_WAVE:
|
||||
DoScriptText(SAY_SUMMON, me);
|
||||
switch(balconyCount)
|
||||
{
|
||||
case 0: SummonUndead(MOB_CHAMPION, RAID_MODE(2,4)); break;
|
||||
case 1: SummonUndead(MOB_CHAMPION, RAID_MODE(1,2));
|
||||
SummonUndead(MOB_GUARDIAN, RAID_MODE(1,2)); break;
|
||||
case 2: SummonUndead(MOB_GUARDIAN, RAID_MODE(2,4)); break;
|
||||
default:SummonUndead(MOB_CHAMPION, RAID_MODE(5,10));
|
||||
SummonUndead(MOB_GUARDIAN, RAID_MODE(5,10));break;
|
||||
}
|
||||
++waveCount;
|
||||
events.ScheduleEvent(waveCount < 2 ? EVENT_WAVE : EVENT_GROUND, 30000 + rand()%15000);
|
||||
return;
|
||||
case EVENT_GROUND:
|
||||
{
|
||||
++balconyCount;
|
||||
float x, y, z, o;
|
||||
me->GetHomePosition(x, y, z, o);
|
||||
me->NearTeleportTo(x, y, z, o);
|
||||
events.ScheduleEvent(EVENT_BALCONY, 110000);
|
||||
EnterPhaseGround();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (me->HasReactState(REACT_AGGRESSIVE))
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_noth(Creature* pCreature)
|
||||
{
|
||||
return new boss_nothAI (pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_noth()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_noth";
|
||||
newscript->GetAI = &GetAI_boss_noth;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
@@ -0,0 +1,159 @@
|
||||
/* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "naxxramas.h"
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_HATEFUL_STRIKE = 41926,
|
||||
H_SPELL_HATEFUL_STRIKE = 59192,
|
||||
SPELL_FRENZY = 28131,
|
||||
SPELL_BERSERK = 26662,
|
||||
SPELL_SLIME_BOLT = 32309,
|
||||
};
|
||||
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO_1 = -1533017,
|
||||
SAY_AGGRO_2 = -1533018,
|
||||
SAY_SLAY = -1533019,
|
||||
SAY_DEATH = -1533020,
|
||||
EMOTE_BERSERK = -1533021,
|
||||
EMOTE_ENRAGE = -1533022,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_NONE,
|
||||
EVENT_BERSERK,
|
||||
EVENT_HATEFUL,
|
||||
EVENT_SLIME
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT = 10286,
|
||||
};
|
||||
|
||||
struct boss_patchwerkAI : public BossAI
|
||||
{
|
||||
boss_patchwerkAI(Creature *c) : BossAI(c, BOSS_PATCHWERK) {}
|
||||
|
||||
bool Enraged;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
|
||||
if (instance)
|
||||
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*Victim*/)
|
||||
{
|
||||
if (!(rand()%5))
|
||||
DoScriptText(SAY_SLAY, me);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
DoScriptText(SAY_DEATH, me);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
Enraged = false;
|
||||
DoScriptText(RAND(SAY_AGGRO_1,SAY_AGGRO_2), me);
|
||||
events.ScheduleEvent(EVENT_HATEFUL, 1200);
|
||||
events.ScheduleEvent(EVENT_BERSERK, 360000);
|
||||
|
||||
if (instance)
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_HATEFUL:
|
||||
{
|
||||
//Cast Hateful strike on the player with the highest
|
||||
//amount of HP within melee distance
|
||||
uint32 MostHP = 0;
|
||||
Unit* pMostHPTarget = NULL;
|
||||
std::list<HostileReference*>::const_iterator i = me->getThreatManager().getThreatList().begin();
|
||||
for (; i != me->getThreatManager().getThreatList().end(); ++i)
|
||||
{
|
||||
Unit *pTarget = (*i)->getTarget();
|
||||
if (pTarget->isAlive() && pTarget->GetHealth() > MostHP && me->IsWithinMeleeRange(pTarget))
|
||||
{
|
||||
MostHP = pTarget->GetHealth();
|
||||
pMostHPTarget = pTarget;
|
||||
}
|
||||
}
|
||||
|
||||
if (pMostHPTarget)
|
||||
DoCast(pMostHPTarget, RAID_MODE(SPELL_HATEFUL_STRIKE,H_SPELL_HATEFUL_STRIKE), true);
|
||||
|
||||
events.ScheduleEvent(EVENT_HATEFUL, 1200);
|
||||
break;
|
||||
}
|
||||
case EVENT_BERSERK:
|
||||
DoCast(me, SPELL_BERSERK, true);
|
||||
DoScriptText(EMOTE_BERSERK, me);
|
||||
events.ScheduleEvent(EVENT_SLIME, 2000);
|
||||
break;
|
||||
case EVENT_SLIME:
|
||||
DoCast(me->getVictim(), SPELL_SLIME_BOLT);
|
||||
events.ScheduleEvent(EVENT_SLIME, 2000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!Enraged && HealthBelowPct(5))
|
||||
{
|
||||
DoCast(me, SPELL_FRENZY, true);
|
||||
DoScriptText(EMOTE_ENRAGE, me);
|
||||
Enraged = true;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_patchwerk(Creature* pCreature)
|
||||
{
|
||||
return new boss_patchwerkAI (pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_patchwerk()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_patchwerk";
|
||||
newscript->GetAI = &GetAI_boss_patchwerk;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
@@ -0,0 +1,139 @@
|
||||
/*
|
||||
* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "naxxramas.h"
|
||||
|
||||
//Razuvious - NO TEXT sound only
|
||||
//8852 aggro01 - Hah hah, I'm just getting warmed up!
|
||||
//8853 aggro02 Stand and fight!
|
||||
//8854 aggro03 Show me what you've got!
|
||||
//8861 slay1 - You should've stayed home!
|
||||
//8863 slay2-
|
||||
//8858 cmmnd3 - You disappoint me, students!
|
||||
//8855 cmmnd1 - Do as I taught you!
|
||||
//8856 cmmnd2 - Show them no mercy!
|
||||
//8859 cmmnd4 - The time for practice is over! Show me what you've learned!
|
||||
//8861 Sweep the leg! Do you have a problem with that?
|
||||
//8860 death - An honorable... death...
|
||||
//8947 - Aggro Mixed? - ?
|
||||
|
||||
#define SOUND_AGGRO RAND(8852,8853,8854)
|
||||
#define SOUND_SLAY RAND(8861,8863)
|
||||
#define SOUND_COMMND RAND(8855,8856,8858,8859,8861)
|
||||
#define SOUND_DEATH 8860
|
||||
#define SOUND_AGGROMIX 8847
|
||||
|
||||
#define SPELL_UNBALANCING_STRIKE 26613
|
||||
#define SPELL_DISRUPTING_SHOUT RAID_MODE(29107,55543)
|
||||
#define SPELL_JAGGED_KNIFE 55550
|
||||
#define SPELL_HOPELESS 29125
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_NONE,
|
||||
EVENT_STRIKE,
|
||||
EVENT_SHOUT,
|
||||
EVENT_KNIFE,
|
||||
EVENT_COMMAND,
|
||||
};
|
||||
|
||||
struct boss_razuviousAI : public BossAI
|
||||
{
|
||||
boss_razuviousAI(Creature *c) : BossAI(c, BOSS_RAZUVIOUS) {}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (!(rand()%3))
|
||||
DoPlaySoundToSet(me, SOUND_SLAY);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* pDone_by, uint32& uiDamage)
|
||||
{
|
||||
// Damage done by the controlled Death Knight understudies should also count toward damage done by players
|
||||
if (pDone_by->GetTypeId() == TYPEID_UNIT && (pDone_by->GetEntry() == 16803 || pDone_by->GetEntry() == 29941))
|
||||
{
|
||||
me->LowerPlayerDamageReq(uiDamage);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
DoPlaySoundToSet(me, SOUND_DEATH);
|
||||
me->CastSpell(me, SPELL_HOPELESS, true); // TODO: this may affect other creatures
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
DoPlaySoundToSet(me, SOUND_AGGRO);
|
||||
events.ScheduleEvent(EVENT_STRIKE, 30000);
|
||||
events.ScheduleEvent(EVENT_SHOUT, 25000);
|
||||
events.ScheduleEvent(EVENT_COMMAND, 40000);
|
||||
events.ScheduleEvent(EVENT_KNIFE, 10000);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_STRIKE:
|
||||
DoCast(me->getVictim(), SPELL_UNBALANCING_STRIKE);
|
||||
events.ScheduleEvent(EVENT_STRIKE, 30000);
|
||||
return;
|
||||
case EVENT_SHOUT:
|
||||
DoCastAOE(SPELL_DISRUPTING_SHOUT);
|
||||
events.ScheduleEvent(EVENT_SHOUT, 25000);
|
||||
return;
|
||||
case EVENT_KNIFE:
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f))
|
||||
DoCast(pTarget, SPELL_JAGGED_KNIFE);
|
||||
events.ScheduleEvent(EVENT_KNIFE, 10000);
|
||||
return;
|
||||
case EVENT_COMMAND:
|
||||
DoPlaySoundToSet(me, SOUND_COMMND);
|
||||
events.ScheduleEvent(EVENT_COMMAND, 40000);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_razuvious(Creature* pCreature)
|
||||
{
|
||||
return new boss_razuviousAI (pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_razuvious()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_razuvious";
|
||||
newscript->GetAI = &GetAI_boss_razuvious;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
@@ -0,0 +1,403 @@
|
||||
/*
|
||||
* Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "naxxramas.h"
|
||||
|
||||
#define EMOTE_BREATH -1533082
|
||||
#define EMOTE_ENRAGE -1533083
|
||||
|
||||
#define SPELL_FROST_AURA RAID_MODE(28531,55799)
|
||||
#define SPELL_CLEAVE 19983
|
||||
#define SPELL_TAIL_SWEEP RAID_MODE(55697,55696)
|
||||
#define SPELL_SUMMON_BLIZZARD 28560
|
||||
#define SPELL_LIFE_DRAIN RAID_MODE(28542,55665)
|
||||
#define SPELL_ICEBOLT 28522
|
||||
#define SPELL_FROST_BREATH 29318
|
||||
#define SPELL_FROST_EXPLOSION 28524
|
||||
#define SPELL_FROST_MISSILE 30101
|
||||
#define SPELL_BERSERK 26662
|
||||
#define SPELL_DIES 29357
|
||||
|
||||
#define SPELL_CHILL RAID_MODE(28547,55699)
|
||||
|
||||
#define MOB_BLIZZARD 16474
|
||||
#define GO_ICEBLOCK 181247
|
||||
|
||||
#define ACHIEVEMENT_THE_HUNDRED_CLUB RAID_MODE(2146, 2147)
|
||||
#define MAX_FROST_RESISTANCE 100
|
||||
|
||||
enum Phases
|
||||
{
|
||||
PHASE_NULL = 0,
|
||||
PHASE_BIRTH,
|
||||
PHASE_GROUND,
|
||||
PHASE_FLIGHT,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_NONE,
|
||||
EVENT_BERSERK,
|
||||
EVENT_CLEAVE,
|
||||
EVENT_TAIL,
|
||||
EVENT_DRAIN,
|
||||
EVENT_BLIZZARD,
|
||||
EVENT_FLIGHT,
|
||||
EVENT_LIFTOFF,
|
||||
EVENT_ICEBOLT,
|
||||
EVENT_BREATH,
|
||||
EVENT_EXPLOSION,
|
||||
EVENT_LAND,
|
||||
EVENT_GROUND,
|
||||
EVENT_BIRTH,
|
||||
};
|
||||
|
||||
typedef std::map<uint64, uint64> IceBlockMap;
|
||||
|
||||
struct boss_sapphironAI : public BossAI
|
||||
{
|
||||
boss_sapphironAI(Creature* c) : BossAI(c, BOSS_SAPPHIRON)
|
||||
, phase(PHASE_NULL)
|
||||
{
|
||||
pMap = me->GetMap();
|
||||
}
|
||||
|
||||
Phases phase;
|
||||
uint32 iceboltCount;
|
||||
IceBlockMap iceblocks;
|
||||
|
||||
bool CanTheHundredClub; // needed for achievement: The Hundred Club(2146, 2147)
|
||||
uint32 CheckFrostResistTimer;
|
||||
Map* pMap;
|
||||
|
||||
void InitializeAI()
|
||||
{
|
||||
float x, y, z;
|
||||
me->GetPosition(x, y, z);
|
||||
me->SummonGameObject(GO_BIRTH, x, y, z, 0, 0, 0, 0, 0, 0);
|
||||
me->SetVisibility(VISIBILITY_OFF);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
|
||||
ScriptedAI::InitializeAI();
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_Reset();
|
||||
|
||||
if (phase == PHASE_FLIGHT)
|
||||
ClearIceBlock();
|
||||
|
||||
phase = PHASE_NULL;
|
||||
|
||||
CanTheHundredClub = true;
|
||||
CheckFrostResistTimer = 5000;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
|
||||
me->CastSpell(me, SPELL_FROST_AURA, true);
|
||||
|
||||
events.ScheduleEvent(EVENT_BERSERK, 15*60000);
|
||||
EnterPhaseGround();
|
||||
|
||||
CheckPlayersFrostResist();
|
||||
}
|
||||
|
||||
void SpellHitTarget(Unit *pTarget, const SpellEntry *spell)
|
||||
{
|
||||
if (spell->Id == SPELL_ICEBOLT)
|
||||
{
|
||||
IceBlockMap::iterator itr = iceblocks.find(pTarget->GetGUID());
|
||||
if (itr != iceblocks.end() && !itr->second)
|
||||
{
|
||||
if (GameObject *iceblock = me->SummonGameObject(GO_ICEBLOCK, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0, 0, 0, 0, 0, 25000))
|
||||
itr->second = iceblock->GetGUID();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*who*/)
|
||||
{
|
||||
_JustDied();
|
||||
me->CastSpell(me, SPELL_DIES, true);
|
||||
|
||||
CheckPlayersFrostResist();
|
||||
if (CanTheHundredClub)
|
||||
{
|
||||
AchievementEntry const *AchievTheHundredClub = GetAchievementStore()->LookupEntry(ACHIEVEMENT_THE_HUNDRED_CLUB);
|
||||
if (AchievTheHundredClub)
|
||||
{
|
||||
if (pMap && pMap->IsDungeon())
|
||||
{
|
||||
Map::PlayerList const &players = pMap->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
itr->getSource()->CompletedAchievement(AchievTheHundredClub);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MovementInform(uint32, uint32 id)
|
||||
{
|
||||
if (id == 1)
|
||||
events.ScheduleEvent(EVENT_LIFTOFF, 0);
|
||||
}
|
||||
|
||||
void DoAction(const int32 param)
|
||||
{
|
||||
if (param == DATA_SAPPHIRON_BIRTH)
|
||||
{
|
||||
phase = PHASE_BIRTH;
|
||||
events.ScheduleEvent(EVENT_BIRTH, 23000);
|
||||
}
|
||||
}
|
||||
|
||||
void CheckPlayersFrostResist()
|
||||
{
|
||||
if (CanTheHundredClub && pMap && pMap->IsDungeon())
|
||||
{
|
||||
Map::PlayerList const &players = pMap->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
{
|
||||
if (itr->getSource()->GetResistance(SPELL_SCHOOL_FROST) > MAX_FROST_RESISTANCE)
|
||||
{
|
||||
CanTheHundredClub = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void EnterPhaseGround()
|
||||
{
|
||||
phase = PHASE_GROUND;
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
events.SetPhase(PHASE_GROUND);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 5000+rand()%10000, 0, PHASE_GROUND);
|
||||
events.ScheduleEvent(EVENT_TAIL, 5000+rand()%10000, 0, PHASE_GROUND);
|
||||
events.ScheduleEvent(EVENT_DRAIN, 24000, 0, PHASE_GROUND);
|
||||
events.ScheduleEvent(EVENT_BLIZZARD, 5000+rand()%5000, 0, PHASE_GROUND);
|
||||
events.ScheduleEvent(EVENT_FLIGHT, 45000);
|
||||
}
|
||||
|
||||
void ClearIceBlock()
|
||||
{
|
||||
for (IceBlockMap::const_iterator itr = iceblocks.begin(); itr != iceblocks.end(); ++itr)
|
||||
{
|
||||
if (Player* pPlayer = Unit::GetPlayer(itr->first))
|
||||
pPlayer->RemoveAura(SPELL_ICEBOLT);
|
||||
if (GameObject* pGo = GameObject::GetGameObject(*me, itr->second))
|
||||
pGo->Delete();
|
||||
}
|
||||
iceblocks.clear();
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!phase)
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (phase != PHASE_BIRTH && !UpdateCombatState() || !CheckInRoom())
|
||||
return;
|
||||
|
||||
if (CanTheHundredClub)
|
||||
{
|
||||
if (CheckFrostResistTimer <= diff)
|
||||
{
|
||||
CheckPlayersFrostResist();
|
||||
CheckFrostResistTimer = (rand() % 5 + 5) * 1000;
|
||||
} else CheckFrostResistTimer -= diff;
|
||||
}
|
||||
|
||||
if (phase == PHASE_GROUND)
|
||||
{
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_BERSERK:
|
||||
DoScriptText(EMOTE_ENRAGE, me);
|
||||
DoCast(me, SPELL_BERSERK);
|
||||
return;
|
||||
case EVENT_CLEAVE:
|
||||
DoCast(me->getVictim(), SPELL_CLEAVE);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 5000+rand()%10000, 0, PHASE_GROUND);
|
||||
return;
|
||||
case EVENT_TAIL:
|
||||
DoCastAOE(SPELL_TAIL_SWEEP);
|
||||
events.ScheduleEvent(EVENT_TAIL, 5000+rand()%10000, 0, PHASE_GROUND);
|
||||
return;
|
||||
case EVENT_DRAIN:
|
||||
DoCastAOE(SPELL_LIFE_DRAIN);
|
||||
events.ScheduleEvent(EVENT_DRAIN, 24000, 0, PHASE_GROUND);
|
||||
return;
|
||||
case EVENT_BLIZZARD:
|
||||
{
|
||||
//DoCastAOE(SPELL_SUMMON_BLIZZARD);
|
||||
if (Creature *pSummon = DoSummon(MOB_BLIZZARD, me, 0.0f, urand(25000,30000), TEMPSUMMON_TIMED_DESPAWN))
|
||||
pSummon->GetMotionMaster()->MoveRandom(40);
|
||||
events.ScheduleEvent(EVENT_BLIZZARD, RAID_MODE(20000,7000), 0, PHASE_GROUND);
|
||||
break;
|
||||
}
|
||||
case EVENT_FLIGHT:
|
||||
phase = PHASE_FLIGHT;
|
||||
events.SetPhase(PHASE_FLIGHT);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->AttackStop();
|
||||
float x, y, z, o;
|
||||
me->GetHomePosition(x, y, z, o);
|
||||
me->GetMotionMaster()->MovePoint(1, x, y, z);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_LIFTOFF:
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
|
||||
me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
|
||||
me->SendMovementFlagUpdate();
|
||||
events.ScheduleEvent(EVENT_ICEBOLT, 1500);
|
||||
iceboltCount = RAID_MODE(2,3);
|
||||
return;
|
||||
case EVENT_ICEBOLT:
|
||||
{
|
||||
std::vector<Unit*> targets;
|
||||
std::list<HostileReference*>::const_iterator i = me->getThreatManager().getThreatList().begin();
|
||||
for (; i != me->getThreatManager().getThreatList().end(); ++i)
|
||||
if ((*i)->getTarget()->GetTypeId() == TYPEID_PLAYER && !(*i)->getTarget()->HasAura(SPELL_ICEBOLT))
|
||||
targets.push_back((*i)->getTarget());
|
||||
|
||||
if (targets.empty())
|
||||
iceboltCount = 0;
|
||||
else
|
||||
{
|
||||
std::vector<Unit*>::const_iterator itr = targets.begin();
|
||||
advance(itr, rand()%targets.size());
|
||||
iceblocks.insert(std::make_pair((*itr)->GetGUID(), 0));
|
||||
DoCast(*itr, SPELL_ICEBOLT);
|
||||
--iceboltCount;
|
||||
}
|
||||
|
||||
if (iceboltCount)
|
||||
events.ScheduleEvent(EVENT_ICEBOLT, 1000);
|
||||
else
|
||||
events.ScheduleEvent(EVENT_BREATH, 1000);
|
||||
return;
|
||||
}
|
||||
case EVENT_BREATH:
|
||||
{
|
||||
DoScriptText(EMOTE_BREATH, me);
|
||||
DoCastAOE(SPELL_FROST_MISSILE);
|
||||
events.ScheduleEvent(EVENT_EXPLOSION, 8000);
|
||||
return;
|
||||
}
|
||||
case EVENT_EXPLOSION:
|
||||
CastExplosion();
|
||||
ClearIceBlock();
|
||||
events.ScheduleEvent(EVENT_LAND, 3000);
|
||||
return;
|
||||
case EVENT_LAND:
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
|
||||
me->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
|
||||
me->SendMovementFlagUpdate();
|
||||
events.ScheduleEvent(EVENT_GROUND, 1500);
|
||||
return;
|
||||
case EVENT_GROUND:
|
||||
EnterPhaseGround();
|
||||
return;
|
||||
case EVENT_BIRTH:
|
||||
me->SetVisibility(VISIBILITY_ON);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
return;
|
||||
}
|
||||
}//if (uint32 eventId = events.ExecuteEvent())
|
||||
}//if (phase == PHASE_GROUND)
|
||||
}
|
||||
|
||||
void CastExplosion()
|
||||
{
|
||||
DoZoneInCombat(); // make sure everyone is in threatlist
|
||||
std::vector<Unit*> targets;
|
||||
std::list<HostileReference*>::const_iterator i = me->getThreatManager().getThreatList().begin();
|
||||
for (; i != me->getThreatManager().getThreatList().end(); ++i)
|
||||
{
|
||||
Unit *pTarget = (*i)->getTarget();
|
||||
if (pTarget->GetTypeId() != TYPEID_PLAYER)
|
||||
continue;
|
||||
|
||||
if (pTarget->HasAura(SPELL_ICEBOLT))
|
||||
{
|
||||
pTarget->ApplySpellImmune(0, IMMUNITY_ID, SPELL_FROST_EXPLOSION, true);
|
||||
targets.push_back(pTarget);
|
||||
continue;
|
||||
}
|
||||
|
||||
for (IceBlockMap::const_iterator itr = iceblocks.begin(); itr != iceblocks.end(); ++itr)
|
||||
{
|
||||
if (GameObject* pGo = GameObject::GetGameObject(*me, itr->second))
|
||||
{
|
||||
if (pGo->IsInBetween(me, pTarget, 2.0f)
|
||||
&& me->GetExactDist2d(pTarget->GetPositionX(), pTarget->GetPositionY()) - me->GetExactDist2d(pGo->GetPositionX(), pGo->GetPositionY()) < 5.0f)
|
||||
{
|
||||
pTarget->ApplySpellImmune(0, IMMUNITY_ID, SPELL_FROST_EXPLOSION, true);
|
||||
targets.push_back(pTarget);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
me->CastSpell(me, SPELL_FROST_EXPLOSION, true);
|
||||
|
||||
for (std::vector<Unit*>::const_iterator itr = targets.begin(); itr != targets.end(); ++itr)
|
||||
(*itr)->ApplySpellImmune(0, IMMUNITY_ID, SPELL_FROST_EXPLOSION, false);
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_sapphiron(Creature* pCreature)
|
||||
{
|
||||
return new boss_sapphironAI (pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_sapphiron()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_sapphiron";
|
||||
newscript->GetAI = &GetAI_boss_sapphiron;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
// Chill
|
||||
GetAISpellInfo(28547)->cooldown = 1000;
|
||||
GetAISpellInfo(55699)->cooldown = 1000;
|
||||
}
|
||||
@@ -0,0 +1,400 @@
|
||||
/*
|
||||
* Copyright (C) 2008 - 2010 Trinity <http://www.trinitycore.org/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "naxxramas.h"
|
||||
|
||||
//Stalagg
|
||||
enum StalaggYells
|
||||
{
|
||||
SAY_STAL_AGGRO = -1533023, //not used
|
||||
SAY_STAL_SLAY = -1533024, //not used
|
||||
SAY_STAL_DEATH = -1533025 //not used
|
||||
};
|
||||
|
||||
enum StalagSpells
|
||||
{
|
||||
SPELL_POWERSURGE = 28134,
|
||||
H_SPELL_POWERSURGE = 54529,
|
||||
SPELL_MAGNETIC_PULL = 28338,
|
||||
SPELL_STALAGG_TESLA = 28097
|
||||
};
|
||||
|
||||
//Feugen
|
||||
enum FeugenYells
|
||||
{
|
||||
SAY_FEUG_AGGRO = -1533026, //not used
|
||||
SAY_FEUG_SLAY = -1533027, //not used
|
||||
SAY_FEUG_DEATH = -1533028 //not used
|
||||
};
|
||||
|
||||
enum FeugenSpells
|
||||
{
|
||||
SPELL_STATICFIELD = 28135,
|
||||
H_SPELL_STATICFIELD = 54528,
|
||||
SPELL_FEUGEN_TESLA = 28109
|
||||
};
|
||||
|
||||
// Thaddius DoAction
|
||||
enum ThaddiusActions
|
||||
{
|
||||
ACTION_FEUGEN_RESET,
|
||||
ACTION_FEUGEN_DIED,
|
||||
ACTION_STALAGG_RESET,
|
||||
ACTION_STALAGG_DIED
|
||||
};
|
||||
|
||||
//generic
|
||||
#define C_TESLA_COIL 16218 //the coils (emotes "Tesla Coil overloads!")
|
||||
|
||||
//Thaddius
|
||||
enum ThaddiusYells
|
||||
{
|
||||
SAY_GREET = -1533029, //not used
|
||||
SAY_AGGRO_1 = -1533030,
|
||||
SAY_AGGRO_2 = -1533031,
|
||||
SAY_AGGRO_3 = -1533032,
|
||||
SAY_SLAY = -1533033,
|
||||
SAY_ELECT = -1533034, //not used
|
||||
SAY_DEATH = -1533035,
|
||||
SAY_SCREAM1 = -1533036, //not used
|
||||
SAY_SCREAM2 = -1533037, //not used
|
||||
SAY_SCREAM3 = -1533038, //not used
|
||||
SAY_SCREAM4 = -1533039 //not used
|
||||
};
|
||||
|
||||
enum ThaddiusSpells
|
||||
{
|
||||
SPELL_POLARITY_SHIFT = 28089,
|
||||
SPELL_BALL_LIGHTNING = 28299,
|
||||
SPELL_CHAIN_LIGHTNING = 28167,
|
||||
H_SPELL_CHAIN_LIGHTNING = 54531,
|
||||
SPELL_BERSERK = 27680
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_NONE,
|
||||
EVENT_SHIFT,
|
||||
EVENT_CHAIN,
|
||||
EVENT_BERSERK,
|
||||
};
|
||||
|
||||
struct boss_thaddiusAI : public BossAI
|
||||
{
|
||||
boss_thaddiusAI(Creature *c) : BossAI(c, BOSS_THADDIUS)
|
||||
{
|
||||
// init is a bit tricky because thaddius shall track the life of both adds, but not if there was a wipe
|
||||
// and, in particular, if there was a crash after both adds were killed (should not respawn)
|
||||
|
||||
// Moreover, the adds may not yet be spawn. So just track down the status if mob is spawn
|
||||
// and each mob will send its status at reset (meaning that it is alive)
|
||||
checkFeugenAlive = false;
|
||||
if (Creature *pFeugen = me->GetCreature(*me, instance->GetData64(DATA_FEUGEN)))
|
||||
checkFeugenAlive = pFeugen->isAlive();
|
||||
|
||||
checkStalaggAlive = false;
|
||||
if (Creature *pStalagg = me->GetCreature(*me, instance->GetData64(DATA_STALAGG)))
|
||||
checkStalaggAlive = pStalagg->isAlive();
|
||||
|
||||
if (!checkFeugenAlive && !checkStalaggAlive)
|
||||
{
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
}
|
||||
else
|
||||
{
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
}
|
||||
|
||||
bool checkStalaggAlive;
|
||||
bool checkFeugenAlive;
|
||||
uint32 uiAddsTimer;
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (!(rand()%5))
|
||||
DoScriptText(SAY_SLAY, me);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*Killer*/)
|
||||
{
|
||||
_JustDied();
|
||||
DoScriptText(SAY_DEATH, me);
|
||||
}
|
||||
|
||||
void DoAction(const int32 action)
|
||||
{
|
||||
switch(action)
|
||||
{
|
||||
case ACTION_FEUGEN_RESET:
|
||||
checkFeugenAlive = true;
|
||||
break;
|
||||
case ACTION_FEUGEN_DIED:
|
||||
checkFeugenAlive = false;
|
||||
break;
|
||||
case ACTION_STALAGG_RESET:
|
||||
checkStalaggAlive = true;
|
||||
break;
|
||||
case ACTION_STALAGG_DIED:
|
||||
checkStalaggAlive = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!checkFeugenAlive && !checkStalaggAlive)
|
||||
{
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED);
|
||||
// REACT_AGGRESSIVE only reset when he takes damage.
|
||||
DoZoneInCombat();
|
||||
}
|
||||
else
|
||||
{
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
DoScriptText(RAND(SAY_AGGRO_1,SAY_AGGRO_2,SAY_AGGRO_3), me);
|
||||
events.ScheduleEvent(EVENT_SHIFT, 30000);
|
||||
events.ScheduleEvent(EVENT_CHAIN, urand(10000,20000));
|
||||
events.ScheduleEvent(EVENT_BERSERK, 360000);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit * /*pDoneBy*/, uint32 & /*uiDamage*/)
|
||||
{
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (checkFeugenAlive && checkStalaggAlive)
|
||||
uiAddsTimer = 0;
|
||||
|
||||
if (checkStalaggAlive != checkFeugenAlive)
|
||||
{
|
||||
uiAddsTimer += diff;
|
||||
if (uiAddsTimer > 5000)
|
||||
{
|
||||
if (!checkStalaggAlive)
|
||||
{
|
||||
if (instance)
|
||||
if (Creature *pStalagg = me->GetCreature(*me, instance->GetData64(DATA_STALAGG)))
|
||||
pStalagg->Respawn();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (instance)
|
||||
if (Creature *pFeugen = me->GetCreature(*me, instance->GetData64(DATA_FEUGEN)))
|
||||
pFeugen->Respawn();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->hasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch(eventId)
|
||||
{
|
||||
case EVENT_SHIFT:
|
||||
DoCastAOE(SPELL_POLARITY_SHIFT);
|
||||
events.ScheduleEvent(EVENT_SHIFT, 30000);
|
||||
return;
|
||||
case EVENT_CHAIN:
|
||||
DoCast(me->getVictim(), RAID_MODE(SPELL_CHAIN_LIGHTNING, H_SPELL_CHAIN_LIGHTNING));
|
||||
events.ScheduleEvent(EVENT_CHAIN, urand(10000,20000));
|
||||
return;
|
||||
case EVENT_BERSERK:
|
||||
DoCast(me, SPELL_BERSERK);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (events.GetTimer() > 15000 && !me->IsWithinMeleeRange(me->getVictim()))
|
||||
DoCast(me->getVictim(), SPELL_BALL_LIGHTNING);
|
||||
else
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_thaddius(Creature* pCreature)
|
||||
{
|
||||
return new boss_thaddiusAI (pCreature);
|
||||
}
|
||||
|
||||
struct mob_stalaggAI : public ScriptedAI
|
||||
{
|
||||
mob_stalaggAI(Creature *c) : ScriptedAI(c)
|
||||
{
|
||||
pInstance = c->GetInstanceData();
|
||||
}
|
||||
|
||||
ScriptedInstance* pInstance;
|
||||
|
||||
uint32 powerSurgeTimer;
|
||||
uint32 magneticPullTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
if (pInstance)
|
||||
if (Creature *pThaddius = me->GetCreature(*me, pInstance->GetData64(DATA_THADDIUS)))
|
||||
if (pThaddius->AI())
|
||||
pThaddius->AI()->DoAction(ACTION_STALAGG_RESET);
|
||||
powerSurgeTimer = urand(20000,25000);
|
||||
magneticPullTimer = 20000;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*pWho*/)
|
||||
{
|
||||
DoCast(SPELL_STALAGG_TESLA);
|
||||
}
|
||||
|
||||
void JustDied(Unit * /*killer*/)
|
||||
{
|
||||
if (pInstance)
|
||||
if (Creature *pThaddius = me->GetCreature(*me, pInstance->GetData64(DATA_THADDIUS)))
|
||||
if (pThaddius->AI())
|
||||
pThaddius->AI()->DoAction(ACTION_STALAGG_DIED);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 uiDiff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (magneticPullTimer <= uiDiff)
|
||||
{
|
||||
if (Creature *pFeugen = me->GetCreature(*me, pInstance->GetData64(DATA_FEUGEN)))
|
||||
{
|
||||
Unit* pStalaggVictim = me->getVictim();
|
||||
Unit* pFeugenVictim = pFeugen->getVictim();
|
||||
|
||||
if (pFeugenVictim && pStalaggVictim)
|
||||
{
|
||||
// magnetic pull is not working. So just jump.
|
||||
|
||||
// reset aggro to be sure that feugen will not follow the jump
|
||||
pFeugen->getThreatManager().modifyThreatPercent(pFeugenVictim, -100);
|
||||
pFeugenVictim->JumpTo(me, 0.3f);
|
||||
|
||||
me->getThreatManager().modifyThreatPercent(pStalaggVictim, -100);
|
||||
pStalaggVictim->JumpTo(pFeugen, 0.3f);
|
||||
}
|
||||
}
|
||||
|
||||
magneticPullTimer = 20000;
|
||||
}
|
||||
else magneticPullTimer -= uiDiff;
|
||||
|
||||
if (powerSurgeTimer <= uiDiff)
|
||||
{
|
||||
DoCast(me, RAID_MODE(SPELL_POWERSURGE, H_SPELL_POWERSURGE));
|
||||
powerSurgeTimer = urand(15000,20000);
|
||||
} else powerSurgeTimer -= uiDiff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_mob_stalagg(Creature* pCreature)
|
||||
{
|
||||
return new mob_stalaggAI(pCreature);
|
||||
}
|
||||
|
||||
struct mob_feugenAI : public ScriptedAI
|
||||
{
|
||||
mob_feugenAI(Creature *c) : ScriptedAI(c)
|
||||
{
|
||||
pInstance = c->GetInstanceData();
|
||||
}
|
||||
|
||||
ScriptedInstance* pInstance;
|
||||
|
||||
uint32 staticFieldTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
if (pInstance)
|
||||
if (Creature *pThaddius = me->GetCreature(*me, pInstance->GetData64(DATA_THADDIUS)))
|
||||
if (pThaddius->AI())
|
||||
pThaddius->AI()->DoAction(ACTION_FEUGEN_RESET);
|
||||
staticFieldTimer = 5000;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*pWho*/)
|
||||
{
|
||||
DoCast(SPELL_FEUGEN_TESLA);
|
||||
}
|
||||
|
||||
void JustDied(Unit * /*killer*/)
|
||||
{
|
||||
if (pInstance)
|
||||
if (Creature *pThaddius = me->GetCreature(*me, pInstance->GetData64(DATA_THADDIUS)))
|
||||
if (pThaddius->AI())
|
||||
pThaddius->AI()->DoAction(ACTION_FEUGEN_DIED);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 uiDiff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (staticFieldTimer <= uiDiff)
|
||||
{
|
||||
DoCast(me, RAID_MODE(SPELL_STATICFIELD, H_SPELL_STATICFIELD));
|
||||
staticFieldTimer = 5000;
|
||||
} else staticFieldTimer -= uiDiff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_mob_feugen(Creature* pCreature)
|
||||
{
|
||||
return new mob_feugenAI(pCreature);
|
||||
}
|
||||
|
||||
void AddSC_boss_thaddius()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name = "boss_thaddius";
|
||||
newscript->GetAI = &GetAI_boss_thaddius;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "mob_stalagg";
|
||||
newscript->GetAI = &GetAI_mob_stalagg;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name = "mob_feugen";
|
||||
newscript->GetAI = &GetAI_mob_feugen;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
@@ -0,0 +1,324 @@
|
||||
/* Copyright (C) 2008 - 2010 Trinity <http://www.trinitycore.org/>
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "ScriptedPch.h"
|
||||
#include "naxxramas.h"
|
||||
|
||||
const DoorData doorData[] =
|
||||
{
|
||||
{181126, BOSS_ANUBREKHAN,DOOR_TYPE_ROOM, BOUNDARY_S},
|
||||
{181195, BOSS_ANUBREKHAN,DOOR_TYPE_PASSAGE, 0},
|
||||
{194022, BOSS_FAERLINA, DOOR_TYPE_PASSAGE, 0},
|
||||
{181209, BOSS_FAERLINA, DOOR_TYPE_PASSAGE, 0},
|
||||
{181209, BOSS_MAEXXNA, DOOR_TYPE_ROOM, BOUNDARY_SW},
|
||||
{181200, BOSS_NOTH, DOOR_TYPE_ROOM, BOUNDARY_N},
|
||||
{181201, BOSS_NOTH, DOOR_TYPE_PASSAGE, BOUNDARY_E},
|
||||
{181202, BOSS_NOTH, DOOR_TYPE_PASSAGE, 0},
|
||||
{181202, BOSS_HEIGAN, DOOR_TYPE_ROOM, BOUNDARY_N},
|
||||
{181203, BOSS_HEIGAN, DOOR_TYPE_PASSAGE, BOUNDARY_E},
|
||||
{181241, BOSS_HEIGAN, DOOR_TYPE_PASSAGE, 0},
|
||||
{181241, BOSS_LOATHEB, DOOR_TYPE_ROOM, BOUNDARY_W},
|
||||
{181123, BOSS_PATCHWERK, DOOR_TYPE_PASSAGE, 0},
|
||||
{181123, BOSS_GROBBULUS, DOOR_TYPE_ROOM, 0},
|
||||
{181120, BOSS_GLUTH, DOOR_TYPE_PASSAGE, BOUNDARY_NW},
|
||||
{181121, BOSS_GLUTH, DOOR_TYPE_PASSAGE, 0},
|
||||
{181121, BOSS_THADDIUS, DOOR_TYPE_ROOM, 0},
|
||||
{181124, BOSS_RAZUVIOUS, DOOR_TYPE_PASSAGE, 0},
|
||||
{181124, BOSS_GOTHIK, DOOR_TYPE_ROOM, BOUNDARY_N},
|
||||
{181125, BOSS_GOTHIK, DOOR_TYPE_PASSAGE, BOUNDARY_S},
|
||||
{181119, BOSS_GOTHIK, DOOR_TYPE_PASSAGE, 0},
|
||||
{181119, BOSS_HORSEMEN, DOOR_TYPE_ROOM, BOUNDARY_NE},
|
||||
{181225, BOSS_SAPPHIRON, DOOR_TYPE_PASSAGE, BOUNDARY_W},
|
||||
{181228, BOSS_KELTHUZAD, DOOR_TYPE_ROOM, BOUNDARY_S},
|
||||
{0, 0, DOOR_TYPE_ROOM, 0}, // EOF
|
||||
};
|
||||
|
||||
const MinionData minionData[] =
|
||||
{
|
||||
//{16573, BOSS_ANUBREKHAN}, there is no spawn point in db, so we do not add them here
|
||||
{16506, BOSS_FAERLINA},
|
||||
{16803, BOSS_RAZUVIOUS},
|
||||
{16063, BOSS_HORSEMEN},
|
||||
{16064, BOSS_HORSEMEN},
|
||||
{16065, BOSS_HORSEMEN},
|
||||
{30549, BOSS_HORSEMEN},
|
||||
{0, 0,}
|
||||
};
|
||||
|
||||
enum eEnums
|
||||
{
|
||||
GO_HORSEMEN_CHEST_HERO = 193426,
|
||||
GO_HORSEMEN_CHEST = 181366, //four horsemen event, DoRespawnGameObject() when event == DONE
|
||||
GO_GOTHIK_GATE = 181170,
|
||||
GO_KELTHUZAD_PORTAL01 = 181402,
|
||||
GO_KELTHUZAD_PORTAL02 = 181403,
|
||||
GO_KELTHUZAD_PORTAL03 = 181404,
|
||||
GO_KELTHUZAD_PORTAL04 = 181405,
|
||||
GO_KELTHUZAD_TRIGGER = 181444,
|
||||
|
||||
SPELL_ERUPTION = 29371
|
||||
};
|
||||
|
||||
const float HeiganPos[2] = {2796, -3707};
|
||||
const float HeiganEruptionSlope[3] =
|
||||
{
|
||||
(-3685 - HeiganPos[1]) /(2724 - HeiganPos[0]),
|
||||
(-3647 - HeiganPos[1]) /(2749 - HeiganPos[0]),
|
||||
(-3637 - HeiganPos[1]) /(2771 - HeiganPos[0]),
|
||||
};
|
||||
|
||||
// 0 H x
|
||||
// 1 ^
|
||||
// 2 |
|
||||
// 3 y<--o
|
||||
inline uint32 GetEruptionSection(float x, float y)
|
||||
{
|
||||
y -= HeiganPos[1];
|
||||
if (y < 1.0f)
|
||||
return 0;
|
||||
|
||||
x -= HeiganPos[0];
|
||||
if (x > -1.0f)
|
||||
return 3;
|
||||
|
||||
float slope = y/x;
|
||||
for (uint32 i = 0; i < 3; ++i)
|
||||
if (slope > HeiganEruptionSlope[i])
|
||||
return i;
|
||||
return 3;
|
||||
}
|
||||
|
||||
struct instance_naxxramas : public InstanceData
|
||||
{
|
||||
instance_naxxramas(Map* pMap) : InstanceData(pMap)
|
||||
{
|
||||
SetBossNumber(MAX_BOSS_NUMBER);
|
||||
LoadDoorData(doorData);
|
||||
LoadMinionData(minionData);
|
||||
}
|
||||
|
||||
std::set<uint64> HeiganEruptionGUID[4];
|
||||
uint64 GothikGateGUID;
|
||||
uint64 HorsemenChestGUID;
|
||||
uint64 SapphironGUID;
|
||||
uint64 uiFaerlina;
|
||||
uint64 uiThane;
|
||||
uint64 uiLady;
|
||||
uint64 uiBaron;
|
||||
uint64 uiSir;
|
||||
|
||||
uint64 uiThaddius;
|
||||
uint64 uiFeugen;
|
||||
uint64 uiStalagg;
|
||||
|
||||
uint64 uiKelthuzad;
|
||||
uint64 uiKelthuzadTrigger;
|
||||
uint64 uiPortals[4];
|
||||
|
||||
time_t minHorsemenDiedTime;
|
||||
time_t maxHorsemenDiedTime;
|
||||
|
||||
void OnCreatureCreate(Creature* pCreature, bool add)
|
||||
{
|
||||
switch(pCreature->GetEntry())
|
||||
{
|
||||
case 15989: SapphironGUID = add ? pCreature->GetGUID() : 0; return;
|
||||
case 15953: uiFaerlina = pCreature->GetGUID(); return;
|
||||
case 16064: uiThane = pCreature->GetGUID(); return;
|
||||
case 16065: uiLady = pCreature->GetGUID(); return;
|
||||
case 30549: uiBaron = pCreature->GetGUID(); return;
|
||||
case 16063: uiSir = pCreature->GetGUID(); return;
|
||||
case 15928: uiThaddius = pCreature->GetGUID(); return;
|
||||
case 15930: uiFeugen = pCreature->GetGUID(); return;
|
||||
case 15929: uiStalagg = pCreature->GetGUID(); return;
|
||||
case 15990: uiKelthuzad = pCreature->GetGUID(); return;
|
||||
}
|
||||
|
||||
AddMinion(pCreature, add);
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* pGo, bool add)
|
||||
{
|
||||
if (pGo->GetGOInfo()->displayId == 6785 || pGo->GetGOInfo()->displayId == 1287)
|
||||
{
|
||||
uint32 section = GetEruptionSection(pGo->GetPositionX(), pGo->GetPositionY());
|
||||
if (add)
|
||||
HeiganEruptionGUID[section].insert(pGo->GetGUID());
|
||||
else
|
||||
HeiganEruptionGUID[section].erase(pGo->GetGUID());
|
||||
return;
|
||||
}
|
||||
|
||||
switch(pGo->GetEntry())
|
||||
{
|
||||
case GO_BIRTH:
|
||||
if (!add && SapphironGUID)
|
||||
{
|
||||
if (Creature *pSapphiron = instance->GetCreature(SapphironGUID))
|
||||
pSapphiron->AI()->DoAction(DATA_SAPPHIRON_BIRTH);
|
||||
return;
|
||||
}
|
||||
case GO_GOTHIK_GATE: GothikGateGUID = add ? pGo->GetGUID() : 0; break;
|
||||
case GO_HORSEMEN_CHEST: HorsemenChestGUID = add ? pGo->GetGUID() : 0; break;
|
||||
case GO_HORSEMEN_CHEST_HERO: HorsemenChestGUID = add ? pGo->GetGUID() : 0; break;
|
||||
case GO_KELTHUZAD_PORTAL01: uiPortals[0] = pGo->GetGUID(); break;
|
||||
case GO_KELTHUZAD_PORTAL02: uiPortals[1] = pGo->GetGUID(); break;
|
||||
case GO_KELTHUZAD_PORTAL03: uiPortals[2] = pGo->GetGUID(); break;
|
||||
case GO_KELTHUZAD_PORTAL04: uiPortals[3] = pGo->GetGUID(); break;
|
||||
case GO_KELTHUZAD_TRIGGER: uiKelthuzadTrigger = pGo->GetGUID(); break;
|
||||
}
|
||||
|
||||
AddDoor(pGo, add);
|
||||
}
|
||||
|
||||
void SetData(uint32 id, uint32 value)
|
||||
{
|
||||
switch(id)
|
||||
{
|
||||
case DATA_HEIGAN_ERUPT:
|
||||
HeiganErupt(value);
|
||||
break;
|
||||
case DATA_GOTHIK_GATE:
|
||||
if (GameObject *pGothikGate = instance->GetGameObject(GothikGateGUID))
|
||||
pGothikGate->SetGoState(GOState(value));
|
||||
break;
|
||||
|
||||
case DATA_HORSEMEN0:
|
||||
case DATA_HORSEMEN1:
|
||||
case DATA_HORSEMEN2:
|
||||
case DATA_HORSEMEN3:
|
||||
if (value == NOT_STARTED)
|
||||
{
|
||||
minHorsemenDiedTime = 0;
|
||||
maxHorsemenDiedTime = 0;
|
||||
}
|
||||
else if (value == DONE)
|
||||
{
|
||||
time_t now = time(NULL);
|
||||
|
||||
if (minHorsemenDiedTime == 0)
|
||||
minHorsemenDiedTime = now;
|
||||
|
||||
maxHorsemenDiedTime = now;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 id)
|
||||
{
|
||||
switch(id)
|
||||
{
|
||||
case DATA_FAERLINA:
|
||||
return uiFaerlina;
|
||||
case DATA_THANE:
|
||||
return uiThane;
|
||||
case DATA_LADY:
|
||||
return uiLady;
|
||||
case DATA_BARON:
|
||||
return uiBaron;
|
||||
case DATA_SIR:
|
||||
return uiSir;
|
||||
case DATA_THADDIUS:
|
||||
return uiThaddius;
|
||||
case DATA_FEUGEN:
|
||||
return uiFeugen;
|
||||
case DATA_STALAGG:
|
||||
return uiStalagg;
|
||||
case DATA_KELTHUZAD:
|
||||
return uiKelthuzad;
|
||||
case DATA_KELTHUZAD_PORTAL01:
|
||||
return uiPortals[0];
|
||||
case DATA_KELTHUZAD_PORTAL02:
|
||||
return uiPortals[1];
|
||||
case DATA_KELTHUZAD_PORTAL03:
|
||||
return uiPortals[2];
|
||||
case DATA_KELTHUZAD_PORTAL04:
|
||||
return uiPortals[3];
|
||||
case DATA_KELTHUZAD_TRIGGER:
|
||||
return uiKelthuzadTrigger;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 id, EncounterState state)
|
||||
{
|
||||
if (!InstanceData::SetBossState(id, state))
|
||||
return false;
|
||||
|
||||
if (id == BOSS_HORSEMEN && state == DONE)
|
||||
{
|
||||
if (GameObject *pHorsemenChest = instance->GetGameObject(HorsemenChestGUID))
|
||||
pHorsemenChest->SetRespawnTime(pHorsemenChest->GetRespawnDelay());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void HeiganErupt(uint32 section)
|
||||
{
|
||||
for (uint32 i = 0; i < 4; ++i)
|
||||
{
|
||||
if (i == section)
|
||||
continue;
|
||||
|
||||
for (std::set<uint64>::const_iterator itr = HeiganEruptionGUID[i].begin(); itr != HeiganEruptionGUID[i].end(); ++itr)
|
||||
{
|
||||
if (GameObject *pHeiganEruption = instance->GetGameObject(*itr))
|
||||
{
|
||||
pHeiganEruption->SendCustomAnim();
|
||||
pHeiganEruption->CastSpell(NULL, SPELL_ERUPTION);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target = NULL*/, uint32 /*miscvalue1 = 0*/)
|
||||
{
|
||||
switch(criteria_id)
|
||||
{
|
||||
case 7600: // Criteria for achievement 2176: And They Would All Go Down Together 15sec of each other 10-man
|
||||
if (Difficulty(instance->GetSpawnMode()) == RAID_DIFFICULTY_10MAN_NORMAL && (maxHorsemenDiedTime - minHorsemenDiedTime) < 15)
|
||||
return true;
|
||||
return false;
|
||||
case 7601: // Criteria for achievement 2177: And They Would All Go Down Together 15sec of each other 25-man
|
||||
if (Difficulty(instance->GetSpawnMode()) == RAID_DIFFICULTY_25MAN_NORMAL && (maxHorsemenDiedTime - minHorsemenDiedTime) < 15)
|
||||
return true;
|
||||
return false;
|
||||
case 13233: // Criteria for achievement 2186: The Immortal (25-man)
|
||||
// TODO.
|
||||
break;
|
||||
case 13237: // Criteria for achievement 2187: The Undying (10-man)
|
||||
// TODO.
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
InstanceData* GetInstanceData_instance_naxxramas(Map* pMap)
|
||||
{
|
||||
return new instance_naxxramas(pMap);
|
||||
}
|
||||
|
||||
void AddSC_instance_naxxramas()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name = "instance_naxxramas";
|
||||
newscript->GetInstanceData = &GetInstanceData_instance_naxxramas;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright (C) 2008 - 2010 Trinity <http://www.trinitycore.org/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef DEF_NAXXRAMAS_H
|
||||
#define DEF_NAXXRAMAS_H
|
||||
|
||||
enum Encounter
|
||||
{
|
||||
BOSS_ANUBREKHAN,
|
||||
BOSS_FAERLINA,
|
||||
BOSS_MAEXXNA,
|
||||
BOSS_NOTH,
|
||||
BOSS_HEIGAN,
|
||||
BOSS_LOATHEB,
|
||||
BOSS_PATCHWERK,
|
||||
BOSS_GROBBULUS,
|
||||
BOSS_GLUTH,
|
||||
BOSS_THADDIUS,
|
||||
BOSS_RAZUVIOUS,
|
||||
BOSS_GOTHIK,
|
||||
BOSS_HORSEMEN,
|
||||
BOSS_SAPPHIRON,
|
||||
BOSS_KELTHUZAD,
|
||||
MAX_BOSS_NUMBER
|
||||
};
|
||||
|
||||
enum Data
|
||||
{
|
||||
DATA_HEIGAN_ERUPT,
|
||||
DATA_GOTHIK_GATE,
|
||||
DATA_SAPPHIRON_BIRTH,
|
||||
|
||||
DATA_HORSEMEN0,
|
||||
DATA_HORSEMEN1,
|
||||
DATA_HORSEMEN2,
|
||||
DATA_HORSEMEN3,
|
||||
};
|
||||
|
||||
enum Data64
|
||||
{
|
||||
DATA_FAERLINA,
|
||||
DATA_THANE,
|
||||
DATA_LADY,
|
||||
DATA_BARON,
|
||||
DATA_SIR,
|
||||
DATA_THADDIUS,
|
||||
DATA_FEUGEN,
|
||||
DATA_STALAGG,
|
||||
DATA_KELTHUZAD,
|
||||
DATA_KELTHUZAD_PORTAL01,
|
||||
DATA_KELTHUZAD_PORTAL02,
|
||||
DATA_KELTHUZAD_PORTAL03,
|
||||
DATA_KELTHUZAD_PORTAL04,
|
||||
DATA_KELTHUZAD_TRIGGER,
|
||||
};
|
||||
|
||||
#define GO_BIRTH 181356
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user