More case sensitive renames

--HG--
branch : trunk
rename : src/server/scripts/custom/custom_example.cpp => src/server/scripts/Custom/custom_example.cpp
rename : src/server/scripts/custom/custom_gossip_codebox.cpp => src/server/scripts/Custom/custom_gossip_codebox.cpp
rename : src/server/scripts/custom/npc_acherus_taxi.cpp => src/server/scripts/Custom/npc_acherus_taxi.cpp
rename : src/server/scripts/custom/npc_wyrmresttempel_taxi.cpp => src/server/scripts/Custom/npc_wyrmresttempel_taxi.cpp
rename : src/server/scripts/custom/on_events.cpp => src/server/scripts/Custom/on_events.cpp
rename : src/server/scripts/custom/test.cpp => src/server/scripts/Custom/test.cpp
rename : src/server/scripts/eastern_kingdoms/alterac_mountains.cpp => src/server/scripts/EasternKingdoms/alterac_mountains.cpp
rename : src/server/scripts/eastern_kingdoms/alterac_valley/alterac_valley.cpp => src/server/scripts/EasternKingdoms/alterac_valley/alterac_valley.cpp
rename : src/server/scripts/eastern_kingdoms/alterac_valley/boss_balinda.cpp => src/server/scripts/EasternKingdoms/alterac_valley/boss_balinda.cpp
rename : src/server/scripts/eastern_kingdoms/alterac_valley/boss_drekthar.cpp => src/server/scripts/EasternKingdoms/alterac_valley/boss_drekthar.cpp
rename : src/server/scripts/eastern_kingdoms/alterac_valley/boss_galvangar.cpp => src/server/scripts/EasternKingdoms/alterac_valley/boss_galvangar.cpp
rename : src/server/scripts/eastern_kingdoms/alterac_valley/boss_vanndar.cpp => src/server/scripts/EasternKingdoms/alterac_valley/boss_vanndar.cpp
rename : src/server/scripts/eastern_kingdoms/arathi_highlands.cpp => src/server/scripts/EasternKingdoms/arathi_highlands.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_depths/blackrock_depths.cpp => src/server/scripts/EasternKingdoms/blackrock_depths/blackrock_depths.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_depths/blackrock_depths.h => src/server/scripts/EasternKingdoms/blackrock_depths/blackrock_depths.h
rename : src/server/scripts/eastern_kingdoms/blackrock_depths/boss_ambassador_flamelash.cpp => src/server/scripts/EasternKingdoms/blackrock_depths/boss_ambassador_flamelash.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_depths/boss_anubshiah.cpp => src/server/scripts/EasternKingdoms/blackrock_depths/boss_anubshiah.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_depths/boss_emperor_dagran_thaurissan.cpp => src/server/scripts/EasternKingdoms/blackrock_depths/boss_emperor_dagran_thaurissan.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_depths/boss_general_angerforge.cpp => src/server/scripts/EasternKingdoms/blackrock_depths/boss_general_angerforge.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_depths/boss_gorosh_the_dervish.cpp => src/server/scripts/EasternKingdoms/blackrock_depths/boss_gorosh_the_dervish.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_depths/boss_grizzle.cpp => src/server/scripts/EasternKingdoms/blackrock_depths/boss_grizzle.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_depths/boss_high_interrogator_gerstahn.cpp => src/server/scripts/EasternKingdoms/blackrock_depths/boss_high_interrogator_gerstahn.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_depths/boss_magmus.cpp => src/server/scripts/EasternKingdoms/blackrock_depths/boss_magmus.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_depths/boss_moira_bronzebeard.cpp => src/server/scripts/EasternKingdoms/blackrock_depths/boss_moira_bronzebeard.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_depths/boss_tomb_of_seven.cpp => src/server/scripts/EasternKingdoms/blackrock_depths/boss_tomb_of_seven.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_depths/instance_blackrock_depths.cpp => src/server/scripts/EasternKingdoms/blackrock_depths/instance_blackrock_depths.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_spire/blackrock_spire.cpp => src/server/scripts/EasternKingdoms/blackrock_spire/blackrock_spire.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_spire/blackrock_spire.h => src/server/scripts/EasternKingdoms/blackrock_spire/blackrock_spire.h
rename : src/server/scripts/eastern_kingdoms/blackrock_spire/boss_drakkisath.cpp => src/server/scripts/EasternKingdoms/blackrock_spire/boss_drakkisath.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_spire/boss_gyth.cpp => src/server/scripts/EasternKingdoms/blackrock_spire/boss_gyth.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_spire/boss_halycon.cpp => src/server/scripts/EasternKingdoms/blackrock_spire/boss_halycon.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_spire/boss_highlord_omokk.cpp => src/server/scripts/EasternKingdoms/blackrock_spire/boss_highlord_omokk.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_spire/boss_mother_smolderweb.cpp => src/server/scripts/EasternKingdoms/blackrock_spire/boss_mother_smolderweb.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_spire/boss_overlord_wyrmthalak.cpp => src/server/scripts/EasternKingdoms/blackrock_spire/boss_overlord_wyrmthalak.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_spire/boss_pyroguard_emberseer.cpp => src/server/scripts/EasternKingdoms/blackrock_spire/boss_pyroguard_emberseer.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_spire/boss_quartermaster_zigris.cpp => src/server/scripts/EasternKingdoms/blackrock_spire/boss_quartermaster_zigris.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_spire/boss_rend_blackhand.cpp => src/server/scripts/EasternKingdoms/blackrock_spire/boss_rend_blackhand.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_spire/boss_shadow_hunter_voshgajin.cpp => src/server/scripts/EasternKingdoms/blackrock_spire/boss_shadow_hunter_voshgajin.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_spire/boss_the_beast.cpp => src/server/scripts/EasternKingdoms/blackrock_spire/boss_the_beast.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_spire/boss_warmaster_voone.cpp => src/server/scripts/EasternKingdoms/blackrock_spire/boss_warmaster_voone.cpp
rename : src/server/scripts/eastern_kingdoms/blackrock_spire/instance_blackrock_spire.cpp => src/server/scripts/EasternKingdoms/blackrock_spire/instance_blackrock_spire.cpp
rename : src/server/scripts/eastern_kingdoms/blackwing_lair/boss_broodlord_lashlayer.cpp => src/server/scripts/EasternKingdoms/blackwing_lair/boss_broodlord_lashlayer.cpp
rename : src/server/scripts/eastern_kingdoms/blackwing_lair/boss_chromaggus.cpp => src/server/scripts/EasternKingdoms/blackwing_lair/boss_chromaggus.cpp
rename : src/server/scripts/eastern_kingdoms/blackwing_lair/boss_ebonroc.cpp => src/server/scripts/EasternKingdoms/blackwing_lair/boss_ebonroc.cpp
rename : src/server/scripts/eastern_kingdoms/blackwing_lair/boss_firemaw.cpp => src/server/scripts/EasternKingdoms/blackwing_lair/boss_firemaw.cpp
rename : src/server/scripts/eastern_kingdoms/blackwing_lair/boss_flamegor.cpp => src/server/scripts/EasternKingdoms/blackwing_lair/boss_flamegor.cpp
rename : src/server/scripts/eastern_kingdoms/blackwing_lair/boss_nefarian.cpp => src/server/scripts/EasternKingdoms/blackwing_lair/boss_nefarian.cpp
rename : src/server/scripts/eastern_kingdoms/blackwing_lair/boss_razorgore.cpp => src/server/scripts/EasternKingdoms/blackwing_lair/boss_razorgore.cpp
rename : src/server/scripts/eastern_kingdoms/blackwing_lair/boss_vaelastrasz.cpp => src/server/scripts/EasternKingdoms/blackwing_lair/boss_vaelastrasz.cpp
rename : src/server/scripts/eastern_kingdoms/blackwing_lair/boss_victor_nefarius.cpp => src/server/scripts/EasternKingdoms/blackwing_lair/boss_victor_nefarius.cpp
rename : src/server/scripts/eastern_kingdoms/blackwing_lair/instance_blackwing_lair.cpp => src/server/scripts/EasternKingdoms/blackwing_lair/instance_blackwing_lair.cpp
rename : src/server/scripts/eastern_kingdoms/blasted_lands.cpp => src/server/scripts/EasternKingdoms/blasted_lands.cpp
rename : src/server/scripts/eastern_kingdoms/boss_kruul.cpp => src/server/scripts/EasternKingdoms/boss_kruul.cpp
rename : src/server/scripts/eastern_kingdoms/burning_steppes.cpp => src/server/scripts/EasternKingdoms/burning_steppes.cpp
rename : src/server/scripts/eastern_kingdoms/deadmines/boss_mr_smite.cpp => src/server/scripts/EasternKingdoms/deadmines/boss_mr_smite.cpp
rename : src/server/scripts/eastern_kingdoms/deadmines/deadmines.cpp => src/server/scripts/EasternKingdoms/deadmines/deadmines.cpp
rename : src/server/scripts/eastern_kingdoms/deadmines/deadmines.h => src/server/scripts/EasternKingdoms/deadmines/deadmines.h
rename : src/server/scripts/eastern_kingdoms/deadmines/instance_deadmines.cpp => src/server/scripts/EasternKingdoms/deadmines/instance_deadmines.cpp
rename : src/server/scripts/eastern_kingdoms/dun_morogh.cpp => src/server/scripts/EasternKingdoms/dun_morogh.cpp
rename : src/server/scripts/eastern_kingdoms/duskwood.cpp => src/server/scripts/EasternKingdoms/duskwood.cpp
rename : src/server/scripts/eastern_kingdoms/eastern_plaguelands.cpp => src/server/scripts/EasternKingdoms/eastern_plaguelands.cpp
rename : src/server/scripts/eastern_kingdoms/elwynn_forest.cpp => src/server/scripts/EasternKingdoms/elwynn_forest.cpp
rename : src/server/scripts/eastern_kingdoms/eversong_woods.cpp => src/server/scripts/EasternKingdoms/eversong_woods.cpp
rename : src/server/scripts/eastern_kingdoms/ghostlands.cpp => src/server/scripts/EasternKingdoms/ghostlands.cpp
rename : src/server/scripts/eastern_kingdoms/gnomeregan/gnomeregan.cpp => src/server/scripts/EasternKingdoms/gnomeregan/gnomeregan.cpp
rename : src/server/scripts/eastern_kingdoms/gnomeregan/gnomeregan.h => src/server/scripts/EasternKingdoms/gnomeregan/gnomeregan.h
rename : src/server/scripts/eastern_kingdoms/gnomeregan/instance_gnomeregan.cpp => src/server/scripts/EasternKingdoms/gnomeregan/instance_gnomeregan.cpp
rename : src/server/scripts/eastern_kingdoms/hinterlands.cpp => src/server/scripts/EasternKingdoms/hinterlands.cpp
rename : src/server/scripts/eastern_kingdoms/ironforge.cpp => src/server/scripts/EasternKingdoms/ironforge.cpp
rename : src/server/scripts/eastern_kingdoms/isle_of_queldanas.cpp => src/server/scripts/EasternKingdoms/isle_of_queldanas.cpp
rename : src/server/scripts/eastern_kingdoms/karazhan/boss_curator.cpp => src/server/scripts/EasternKingdoms/karazhan/boss_curator.cpp
rename : src/server/scripts/eastern_kingdoms/karazhan/boss_maiden_of_virtue.cpp => src/server/scripts/EasternKingdoms/karazhan/boss_maiden_of_virtue.cpp
rename : src/server/scripts/eastern_kingdoms/karazhan/boss_midnight.cpp => src/server/scripts/EasternKingdoms/karazhan/boss_midnight.cpp
rename : src/server/scripts/eastern_kingdoms/karazhan/boss_moroes.cpp => src/server/scripts/EasternKingdoms/karazhan/boss_moroes.cpp
rename : src/server/scripts/eastern_kingdoms/karazhan/boss_netherspite.cpp => src/server/scripts/EasternKingdoms/karazhan/boss_netherspite.cpp
rename : src/server/scripts/eastern_kingdoms/karazhan/boss_nightbane.cpp => src/server/scripts/EasternKingdoms/karazhan/boss_nightbane.cpp
rename : src/server/scripts/eastern_kingdoms/karazhan/boss_prince_malchezaar.cpp => src/server/scripts/EasternKingdoms/karazhan/boss_prince_malchezaar.cpp
rename : src/server/scripts/eastern_kingdoms/karazhan/boss_shade_of_aran.cpp => src/server/scripts/EasternKingdoms/karazhan/boss_shade_of_aran.cpp
rename : src/server/scripts/eastern_kingdoms/karazhan/boss_terestian_illhoof.cpp => src/server/scripts/EasternKingdoms/karazhan/boss_terestian_illhoof.cpp
rename : src/server/scripts/eastern_kingdoms/karazhan/bosses_opera.cpp => src/server/scripts/EasternKingdoms/karazhan/bosses_opera.cpp
rename : src/server/scripts/eastern_kingdoms/karazhan/instance_karazhan.cpp => src/server/scripts/EasternKingdoms/karazhan/instance_karazhan.cpp
rename : src/server/scripts/eastern_kingdoms/karazhan/karazhan.cpp => src/server/scripts/EasternKingdoms/karazhan/karazhan.cpp
rename : src/server/scripts/eastern_kingdoms/karazhan/karazhan.h => src/server/scripts/EasternKingdoms/karazhan/karazhan.h
rename : src/server/scripts/eastern_kingdoms/loch_modan.cpp => src/server/scripts/EasternKingdoms/loch_modan.cpp
rename : src/server/scripts/eastern_kingdoms/magisters_terrace/boss_felblood_kaelthas.cpp => src/server/scripts/EasternKingdoms/magisters_terrace/boss_felblood_kaelthas.cpp
rename : src/server/scripts/eastern_kingdoms/magisters_terrace/boss_priestess_delrissa.cpp => src/server/scripts/EasternKingdoms/magisters_terrace/boss_priestess_delrissa.cpp
rename : src/server/scripts/eastern_kingdoms/magisters_terrace/boss_selin_fireheart.cpp => src/server/scripts/EasternKingdoms/magisters_terrace/boss_selin_fireheart.cpp
rename : src/server/scripts/eastern_kingdoms/magisters_terrace/boss_vexallus.cpp => src/server/scripts/EasternKingdoms/magisters_terrace/boss_vexallus.cpp
rename : src/server/scripts/eastern_kingdoms/magisters_terrace/instance_magisters_terrace.cpp => src/server/scripts/EasternKingdoms/magisters_terrace/instance_magisters_terrace.cpp
rename : src/server/scripts/eastern_kingdoms/magisters_terrace/magisters_terrace.cpp => src/server/scripts/EasternKingdoms/magisters_terrace/magisters_terrace.cpp
rename : src/server/scripts/eastern_kingdoms/magisters_terrace/magisters_terrace.h => src/server/scripts/EasternKingdoms/magisters_terrace/magisters_terrace.h
rename : src/server/scripts/eastern_kingdoms/molten_core/boss_baron_geddon.cpp => src/server/scripts/EasternKingdoms/molten_core/boss_baron_geddon.cpp
rename : src/server/scripts/eastern_kingdoms/molten_core/boss_garr.cpp => src/server/scripts/EasternKingdoms/molten_core/boss_garr.cpp
rename : src/server/scripts/eastern_kingdoms/molten_core/boss_gehennas.cpp => src/server/scripts/EasternKingdoms/molten_core/boss_gehennas.cpp
rename : src/server/scripts/eastern_kingdoms/molten_core/boss_golemagg.cpp => src/server/scripts/EasternKingdoms/molten_core/boss_golemagg.cpp
rename : src/server/scripts/eastern_kingdoms/molten_core/boss_lucifron.cpp => src/server/scripts/EasternKingdoms/molten_core/boss_lucifron.cpp
rename : src/server/scripts/eastern_kingdoms/molten_core/boss_magmadar.cpp => src/server/scripts/EasternKingdoms/molten_core/boss_magmadar.cpp
rename : src/server/scripts/eastern_kingdoms/molten_core/boss_majordomo_executus.cpp => src/server/scripts/EasternKingdoms/molten_core/boss_majordomo_executus.cpp
rename : src/server/scripts/eastern_kingdoms/molten_core/boss_ragnaros.cpp => src/server/scripts/EasternKingdoms/molten_core/boss_ragnaros.cpp
rename : src/server/scripts/eastern_kingdoms/molten_core/boss_shazzrah.cpp => src/server/scripts/EasternKingdoms/molten_core/boss_shazzrah.cpp
rename : src/server/scripts/eastern_kingdoms/molten_core/boss_sulfuron_harbinger.cpp => src/server/scripts/EasternKingdoms/molten_core/boss_sulfuron_harbinger.cpp
rename : src/server/scripts/eastern_kingdoms/molten_core/instance_molten_core.cpp => src/server/scripts/EasternKingdoms/molten_core/instance_molten_core.cpp
rename : src/server/scripts/eastern_kingdoms/molten_core/molten_core.cpp => src/server/scripts/EasternKingdoms/molten_core/molten_core.cpp
rename : src/server/scripts/eastern_kingdoms/molten_core/molten_core.h => src/server/scripts/EasternKingdoms/molten_core/molten_core.h
rename : src/server/scripts/eastern_kingdoms/redridge_mountains.cpp => src/server/scripts/EasternKingdoms/redridge_mountains.cpp
rename : src/server/scripts/eastern_kingdoms/scarlet_enclave/chapter1.cpp => src/server/scripts/EasternKingdoms/scarlet_enclave/chapter1.cpp
rename : src/server/scripts/eastern_kingdoms/scarlet_enclave/chapter2.cpp => src/server/scripts/EasternKingdoms/scarlet_enclave/chapter2.cpp
rename : src/server/scripts/eastern_kingdoms/scarlet_enclave/chapter5.cpp => src/server/scripts/EasternKingdoms/scarlet_enclave/chapter5.cpp
rename : src/server/scripts/eastern_kingdoms/scarlet_enclave/the_scarlet_enclave.cpp => src/server/scripts/EasternKingdoms/scarlet_enclave/the_scarlet_enclave.cpp
rename : src/server/scripts/eastern_kingdoms/scarlet_monastery/boss_arcanist_doan.cpp => src/server/scripts/EasternKingdoms/scarlet_monastery/boss_arcanist_doan.cpp
rename : src/server/scripts/eastern_kingdoms/scarlet_monastery/boss_azshir_the_sleepless.cpp => src/server/scripts/EasternKingdoms/scarlet_monastery/boss_azshir_the_sleepless.cpp
rename : src/server/scripts/eastern_kingdoms/scarlet_monastery/boss_bloodmage_thalnos.cpp => src/server/scripts/EasternKingdoms/scarlet_monastery/boss_bloodmage_thalnos.cpp
rename : src/server/scripts/eastern_kingdoms/scarlet_monastery/boss_headless_horseman.cpp => src/server/scripts/EasternKingdoms/scarlet_monastery/boss_headless_horseman.cpp
rename : src/server/scripts/eastern_kingdoms/scarlet_monastery/boss_herod.cpp => src/server/scripts/EasternKingdoms/scarlet_monastery/boss_herod.cpp
rename : src/server/scripts/eastern_kingdoms/scarlet_monastery/boss_high_inquisitor_fairbanks.cpp => src/server/scripts/EasternKingdoms/scarlet_monastery/boss_high_inquisitor_fairbanks.cpp
rename : src/server/scripts/eastern_kingdoms/scarlet_monastery/boss_houndmaster_loksey.cpp => src/server/scripts/EasternKingdoms/scarlet_monastery/boss_houndmaster_loksey.cpp
rename : src/server/scripts/eastern_kingdoms/scarlet_monastery/boss_interrogator_vishas.cpp => src/server/scripts/EasternKingdoms/scarlet_monastery/boss_interrogator_vishas.cpp
rename : src/server/scripts/eastern_kingdoms/scarlet_monastery/boss_mograine_and_whitemane.cpp => src/server/scripts/EasternKingdoms/scarlet_monastery/boss_mograine_and_whitemane.cpp
rename : src/server/scripts/eastern_kingdoms/scarlet_monastery/boss_scorn.cpp => src/server/scripts/EasternKingdoms/scarlet_monastery/boss_scorn.cpp
rename : src/server/scripts/eastern_kingdoms/scarlet_monastery/instance_scarlet_monastery.cpp => src/server/scripts/EasternKingdoms/scarlet_monastery/instance_scarlet_monastery.cpp
rename : src/server/scripts/eastern_kingdoms/scarlet_monastery/scarlet_monastery.h => src/server/scripts/EasternKingdoms/scarlet_monastery/scarlet_monastery.h
rename : src/server/scripts/eastern_kingdoms/scholomance/boss_darkmaster_gandling.cpp => src/server/scripts/EasternKingdoms/scholomance/boss_darkmaster_gandling.cpp
rename : src/server/scripts/eastern_kingdoms/scholomance/boss_death_knight_darkreaver.cpp => src/server/scripts/EasternKingdoms/scholomance/boss_death_knight_darkreaver.cpp
rename : src/server/scripts/eastern_kingdoms/scholomance/boss_doctor_theolen_krastinov.cpp => src/server/scripts/EasternKingdoms/scholomance/boss_doctor_theolen_krastinov.cpp
rename : src/server/scripts/eastern_kingdoms/scholomance/boss_illucia_barov.cpp => src/server/scripts/EasternKingdoms/scholomance/boss_illucia_barov.cpp
rename : src/server/scripts/eastern_kingdoms/scholomance/boss_instructor_malicia.cpp => src/server/scripts/EasternKingdoms/scholomance/boss_instructor_malicia.cpp
rename : src/server/scripts/eastern_kingdoms/scholomance/boss_jandice_barov.cpp => src/server/scripts/EasternKingdoms/scholomance/boss_jandice_barov.cpp
rename : src/server/scripts/eastern_kingdoms/scholomance/boss_kormok.cpp => src/server/scripts/EasternKingdoms/scholomance/boss_kormok.cpp
rename : src/server/scripts/eastern_kingdoms/scholomance/boss_lord_alexei_barov.cpp => src/server/scripts/EasternKingdoms/scholomance/boss_lord_alexei_barov.cpp
rename : src/server/scripts/eastern_kingdoms/scholomance/boss_lorekeeper_polkelt.cpp => src/server/scripts/EasternKingdoms/scholomance/boss_lorekeeper_polkelt.cpp
rename : src/server/scripts/eastern_kingdoms/scholomance/boss_ras_frostwhisper.cpp => src/server/scripts/EasternKingdoms/scholomance/boss_ras_frostwhisper.cpp
rename : src/server/scripts/eastern_kingdoms/scholomance/boss_the_ravenian.cpp => src/server/scripts/EasternKingdoms/scholomance/boss_the_ravenian.cpp
rename : src/server/scripts/eastern_kingdoms/scholomance/boss_vectus.cpp => src/server/scripts/EasternKingdoms/scholomance/boss_vectus.cpp
rename : src/server/scripts/eastern_kingdoms/scholomance/instance_scholomance.cpp => src/server/scripts/EasternKingdoms/scholomance/instance_scholomance.cpp
rename : src/server/scripts/eastern_kingdoms/scholomance/scholomance.h => src/server/scripts/EasternKingdoms/scholomance/scholomance.h
rename : src/server/scripts/eastern_kingdoms/searing_gorge.cpp => src/server/scripts/EasternKingdoms/searing_gorge.cpp
rename : src/server/scripts/eastern_kingdoms/shadowfang_keep/instance_shadowfang_keep.cpp => src/server/scripts/EasternKingdoms/shadowfang_keep/instance_shadowfang_keep.cpp
rename : src/server/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.cpp => src/server/scripts/EasternKingdoms/shadowfang_keep/shadowfang_keep.cpp
rename : src/server/scripts/eastern_kingdoms/shadowfang_keep/shadowfang_keep.h => src/server/scripts/EasternKingdoms/shadowfang_keep/shadowfang_keep.h
rename : src/server/scripts/eastern_kingdoms/silvermoon_city.cpp => src/server/scripts/EasternKingdoms/silvermoon_city.cpp
rename : src/server/scripts/eastern_kingdoms/silverpine_forest.cpp => src/server/scripts/EasternKingdoms/silverpine_forest.cpp
rename : src/server/scripts/eastern_kingdoms/stormwind_city.cpp => src/server/scripts/EasternKingdoms/stormwind_city.cpp
rename : src/server/scripts/eastern_kingdoms/stranglethorn_vale.cpp => src/server/scripts/EasternKingdoms/stranglethorn_vale.cpp
rename : src/server/scripts/eastern_kingdoms/stratholme/boss_baron_rivendare.cpp => src/server/scripts/EasternKingdoms/stratholme/boss_baron_rivendare.cpp
rename : src/server/scripts/eastern_kingdoms/stratholme/boss_baroness_anastari.cpp => src/server/scripts/EasternKingdoms/stratholme/boss_baroness_anastari.cpp
rename : src/server/scripts/eastern_kingdoms/stratholme/boss_cannon_master_willey.cpp => src/server/scripts/EasternKingdoms/stratholme/boss_cannon_master_willey.cpp
rename : src/server/scripts/eastern_kingdoms/stratholme/boss_dathrohan_balnazzar.cpp => src/server/scripts/EasternKingdoms/stratholme/boss_dathrohan_balnazzar.cpp
rename : src/server/scripts/eastern_kingdoms/stratholme/boss_magistrate_barthilas.cpp => src/server/scripts/EasternKingdoms/stratholme/boss_magistrate_barthilas.cpp
rename : src/server/scripts/eastern_kingdoms/stratholme/boss_maleki_the_pallid.cpp => src/server/scripts/EasternKingdoms/stratholme/boss_maleki_the_pallid.cpp
rename : src/server/scripts/eastern_kingdoms/stratholme/boss_nerubenkan.cpp => src/server/scripts/EasternKingdoms/stratholme/boss_nerubenkan.cpp
rename : src/server/scripts/eastern_kingdoms/stratholme/boss_order_of_silver_hand.cpp => src/server/scripts/EasternKingdoms/stratholme/boss_order_of_silver_hand.cpp
rename : src/server/scripts/eastern_kingdoms/stratholme/boss_postmaster_malown.cpp => src/server/scripts/EasternKingdoms/stratholme/boss_postmaster_malown.cpp
rename : src/server/scripts/eastern_kingdoms/stratholme/boss_ramstein_the_gorger.cpp => src/server/scripts/EasternKingdoms/stratholme/boss_ramstein_the_gorger.cpp
rename : src/server/scripts/eastern_kingdoms/stratholme/boss_timmy_the_cruel.cpp => src/server/scripts/EasternKingdoms/stratholme/boss_timmy_the_cruel.cpp
rename : src/server/scripts/eastern_kingdoms/stratholme/instance_stratholme.cpp => src/server/scripts/EasternKingdoms/stratholme/instance_stratholme.cpp
rename : src/server/scripts/eastern_kingdoms/stratholme/stratholme.cpp => src/server/scripts/EasternKingdoms/stratholme/stratholme.cpp
rename : src/server/scripts/eastern_kingdoms/stratholme/stratholme.h => src/server/scripts/EasternKingdoms/stratholme/stratholme.h
rename : src/server/scripts/eastern_kingdoms/sunken_temple/instance_sunken_temple.cpp => src/server/scripts/EasternKingdoms/sunken_temple/instance_sunken_temple.cpp
rename : src/server/scripts/eastern_kingdoms/sunken_temple/sunken_temple.cpp => src/server/scripts/EasternKingdoms/sunken_temple/sunken_temple.cpp
rename : src/server/scripts/eastern_kingdoms/sunken_temple/sunken_temple.h => src/server/scripts/EasternKingdoms/sunken_temple/sunken_temple.h
rename : src/server/scripts/eastern_kingdoms/sunwell_plateau/boss_brutallus.cpp => src/server/scripts/EasternKingdoms/sunwell_plateau/boss_brutallus.cpp
rename : src/server/scripts/eastern_kingdoms/sunwell_plateau/boss_eredar_twins.cpp => src/server/scripts/EasternKingdoms/sunwell_plateau/boss_eredar_twins.cpp
rename : src/server/scripts/eastern_kingdoms/sunwell_plateau/boss_felmyst.cpp => src/server/scripts/EasternKingdoms/sunwell_plateau/boss_felmyst.cpp
rename : src/server/scripts/eastern_kingdoms/sunwell_plateau/boss_kalecgos.cpp => src/server/scripts/EasternKingdoms/sunwell_plateau/boss_kalecgos.cpp
rename : src/server/scripts/eastern_kingdoms/sunwell_plateau/boss_kiljaeden.cpp => src/server/scripts/EasternKingdoms/sunwell_plateau/boss_kiljaeden.cpp
rename : src/server/scripts/eastern_kingdoms/sunwell_plateau/boss_muru.cpp => src/server/scripts/EasternKingdoms/sunwell_plateau/boss_muru.cpp
rename : src/server/scripts/eastern_kingdoms/sunwell_plateau/instance_sunwell_plateau.cpp => src/server/scripts/EasternKingdoms/sunwell_plateau/instance_sunwell_plateau.cpp
rename : src/server/scripts/eastern_kingdoms/sunwell_plateau/sunwell_plateau.cpp => src/server/scripts/EasternKingdoms/sunwell_plateau/sunwell_plateau.cpp
rename : src/server/scripts/eastern_kingdoms/sunwell_plateau/sunwell_plateau.h => src/server/scripts/EasternKingdoms/sunwell_plateau/sunwell_plateau.h
rename : src/server/scripts/eastern_kingdoms/tirisfal_glades.cpp => src/server/scripts/EasternKingdoms/tirisfal_glades.cpp
rename : src/server/scripts/eastern_kingdoms/uldaman/boss_archaedas.cpp => src/server/scripts/EasternKingdoms/uldaman/boss_archaedas.cpp
rename : src/server/scripts/eastern_kingdoms/uldaman/boss_ironaya.cpp => src/server/scripts/EasternKingdoms/uldaman/boss_ironaya.cpp
rename : src/server/scripts/eastern_kingdoms/uldaman/instance_uldaman.cpp => src/server/scripts/EasternKingdoms/uldaman/instance_uldaman.cpp
rename : src/server/scripts/eastern_kingdoms/uldaman/uldaman.cpp => src/server/scripts/EasternKingdoms/uldaman/uldaman.cpp
rename : src/server/scripts/eastern_kingdoms/undercity.cpp => src/server/scripts/EasternKingdoms/undercity.cpp
rename : src/server/scripts/eastern_kingdoms/western_plaguelands.cpp => src/server/scripts/EasternKingdoms/western_plaguelands.cpp
rename : src/server/scripts/eastern_kingdoms/westfall.cpp => src/server/scripts/EasternKingdoms/westfall.cpp
rename : src/server/scripts/eastern_kingdoms/wetlands.cpp => src/server/scripts/EasternKingdoms/wetlands.cpp
rename : src/server/scripts/eastern_kingdoms/zulaman/boss_akilzon.cpp => src/server/scripts/EasternKingdoms/zulaman/boss_akilzon.cpp
rename : src/server/scripts/eastern_kingdoms/zulaman/boss_halazzi.cpp => src/server/scripts/EasternKingdoms/zulaman/boss_halazzi.cpp
rename : src/server/scripts/eastern_kingdoms/zulaman/boss_hexlord.cpp => src/server/scripts/EasternKingdoms/zulaman/boss_hexlord.cpp
rename : src/server/scripts/eastern_kingdoms/zulaman/boss_janalai.cpp => src/server/scripts/EasternKingdoms/zulaman/boss_janalai.cpp
rename : src/server/scripts/eastern_kingdoms/zulaman/boss_nalorakk.cpp => src/server/scripts/EasternKingdoms/zulaman/boss_nalorakk.cpp
rename : src/server/scripts/eastern_kingdoms/zulaman/boss_zuljin.cpp => src/server/scripts/EasternKingdoms/zulaman/boss_zuljin.cpp
rename : src/server/scripts/eastern_kingdoms/zulaman/instance_zulaman.cpp => src/server/scripts/EasternKingdoms/zulaman/instance_zulaman.cpp
rename : src/server/scripts/eastern_kingdoms/zulaman/zulaman.cpp => src/server/scripts/EasternKingdoms/zulaman/zulaman.cpp
rename : src/server/scripts/eastern_kingdoms/zulaman/zulaman.h => src/server/scripts/EasternKingdoms/zulaman/zulaman.h
rename : src/server/scripts/eastern_kingdoms/zulgurub/boss_arlokk.cpp => src/server/scripts/EasternKingdoms/zulgurub/boss_arlokk.cpp
rename : src/server/scripts/eastern_kingdoms/zulgurub/boss_gahzranka.cpp => src/server/scripts/EasternKingdoms/zulgurub/boss_gahzranka.cpp
rename : src/server/scripts/eastern_kingdoms/zulgurub/boss_grilek.cpp => src/server/scripts/EasternKingdoms/zulgurub/boss_grilek.cpp
rename : src/server/scripts/eastern_kingdoms/zulgurub/boss_hakkar.cpp => src/server/scripts/EasternKingdoms/zulgurub/boss_hakkar.cpp
rename : src/server/scripts/eastern_kingdoms/zulgurub/boss_hazzarah.cpp => src/server/scripts/EasternKingdoms/zulgurub/boss_hazzarah.cpp
rename : src/server/scripts/eastern_kingdoms/zulgurub/boss_jeklik.cpp => src/server/scripts/EasternKingdoms/zulgurub/boss_jeklik.cpp
rename : src/server/scripts/eastern_kingdoms/zulgurub/boss_jindo.cpp => src/server/scripts/EasternKingdoms/zulgurub/boss_jindo.cpp
rename : src/server/scripts/eastern_kingdoms/zulgurub/boss_mandokir.cpp => src/server/scripts/EasternKingdoms/zulgurub/boss_mandokir.cpp
rename : src/server/scripts/eastern_kingdoms/zulgurub/boss_marli.cpp => src/server/scripts/EasternKingdoms/zulgurub/boss_marli.cpp
rename : src/server/scripts/eastern_kingdoms/zulgurub/boss_renataki.cpp => src/server/scripts/EasternKingdoms/zulgurub/boss_renataki.cpp
rename : src/server/scripts/eastern_kingdoms/zulgurub/boss_thekal.cpp => src/server/scripts/EasternKingdoms/zulgurub/boss_thekal.cpp
rename : src/server/scripts/eastern_kingdoms/zulgurub/boss_venoxis.cpp => src/server/scripts/EasternKingdoms/zulgurub/boss_venoxis.cpp
rename : src/server/scripts/eastern_kingdoms/zulgurub/boss_wushoolay.cpp => src/server/scripts/EasternKingdoms/zulgurub/boss_wushoolay.cpp
rename : src/server/scripts/eastern_kingdoms/zulgurub/instance_zulgurub.cpp => src/server/scripts/EasternKingdoms/zulgurub/instance_zulgurub.cpp
rename : src/server/scripts/eastern_kingdoms/zulgurub/zulgurub.h => src/server/scripts/EasternKingdoms/zulgurub/zulgurub.h
rename : src/server/scripts/examples/example_creature.cpp => src/server/scripts/Examples/example_creature.cpp
rename : src/server/scripts/examples/example_escort.cpp => src/server/scripts/Examples/example_escort.cpp
rename : src/server/scripts/examples/example_gossip_codebox.cpp => src/server/scripts/Examples/example_gossip_codebox.cpp
rename : src/server/scripts/examples/example_misc.cpp => src/server/scripts/Examples/example_misc.cpp
rename : src/server/scripts/kalimdor/ashenvale.cpp => src/server/scripts/Kalimdor/ashenvale.cpp
rename : src/server/scripts/kalimdor/azshara.cpp => src/server/scripts/Kalimdor/azshara.cpp
rename : src/server/scripts/kalimdor/azuremyst_isle.cpp => src/server/scripts/Kalimdor/azuremyst_isle.cpp
rename : src/server/scripts/kalimdor/blackfathom_depths/blackfathom_deeps.cpp => src/server/scripts/Kalimdor/blackfathom_depths/blackfathom_deeps.cpp
rename : src/server/scripts/kalimdor/blackfathom_depths/blackfathom_deeps.h => src/server/scripts/Kalimdor/blackfathom_depths/blackfathom_deeps.h
rename : src/server/scripts/kalimdor/blackfathom_depths/boss_aku_mai.cpp => src/server/scripts/Kalimdor/blackfathom_depths/boss_aku_mai.cpp
rename : src/server/scripts/kalimdor/blackfathom_depths/boss_gelihast.cpp => src/server/scripts/Kalimdor/blackfathom_depths/boss_gelihast.cpp
rename : src/server/scripts/kalimdor/blackfathom_depths/boss_kelris.cpp => src/server/scripts/Kalimdor/blackfathom_depths/boss_kelris.cpp
rename : src/server/scripts/kalimdor/blackfathom_depths/instance_blackfathom_deeps.cpp => src/server/scripts/Kalimdor/blackfathom_depths/instance_blackfathom_deeps.cpp
rename : src/server/scripts/kalimdor/bloodmyst_isle.cpp => src/server/scripts/Kalimdor/bloodmyst_isle.cpp
rename : src/server/scripts/kalimdor/boss_azuregos.cpp => src/server/scripts/Kalimdor/boss_azuregos.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/culling_of_stratholme/boss_epoch.cpp => src/server/scripts/Kalimdor/caverns_of_time/culling_of_stratholme/boss_epoch.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/culling_of_stratholme/boss_infinite.cpp => src/server/scripts/Kalimdor/caverns_of_time/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/caverns_of_time/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/caverns_of_time/culling_of_stratholme/boss_meathook.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/culling_of_stratholme/boss_salramm.cpp => src/server/scripts/Kalimdor/caverns_of_time/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/caverns_of_time/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/caverns_of_time/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/caverns_of_time/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/caverns_of_time/dark_portal/boss_aeonus.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/dark_portal/boss_chrono_lord_deja.cpp => src/server/scripts/Kalimdor/caverns_of_time/dark_portal/boss_chrono_lord_deja.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/dark_portal/boss_temporus.cpp => src/server/scripts/Kalimdor/caverns_of_time/dark_portal/boss_temporus.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/dark_portal/dark_portal.cpp => src/server/scripts/Kalimdor/caverns_of_time/dark_portal/dark_portal.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/dark_portal/dark_portal.h => src/server/scripts/Kalimdor/caverns_of_time/dark_portal/dark_portal.h
rename : src/server/scripts/kalimdor/caverns_of_time/dark_portal/instance_dark_portal.cpp => src/server/scripts/Kalimdor/caverns_of_time/dark_portal/instance_dark_portal.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/hyjal/boss_anetheron.cpp => src/server/scripts/Kalimdor/caverns_of_time/hyjal/boss_anetheron.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/hyjal/boss_archimonde.cpp => src/server/scripts/Kalimdor/caverns_of_time/hyjal/boss_archimonde.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/hyjal/boss_azgalor.cpp => src/server/scripts/Kalimdor/caverns_of_time/hyjal/boss_azgalor.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/hyjal/boss_kazrogal.cpp => src/server/scripts/Kalimdor/caverns_of_time/hyjal/boss_kazrogal.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/hyjal/boss_rage_winterchill.cpp => src/server/scripts/Kalimdor/caverns_of_time/hyjal/boss_rage_winterchill.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/hyjal/hyjal.cpp => src/server/scripts/Kalimdor/caverns_of_time/hyjal/hyjal.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/hyjal/hyjal.h => src/server/scripts/Kalimdor/caverns_of_time/hyjal/hyjal.h
rename : src/server/scripts/kalimdor/caverns_of_time/hyjal/hyjalAI.cpp => src/server/scripts/Kalimdor/caverns_of_time/hyjal/hyjalAI.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/hyjal/hyjalAI.h => src/server/scripts/Kalimdor/caverns_of_time/hyjal/hyjalAI.h
rename : src/server/scripts/kalimdor/caverns_of_time/hyjal/hyjal_trash.cpp => src/server/scripts/Kalimdor/caverns_of_time/hyjal/hyjal_trash.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/hyjal/hyjal_trash.h => src/server/scripts/Kalimdor/caverns_of_time/hyjal/hyjal_trash.h
rename : src/server/scripts/kalimdor/caverns_of_time/hyjal/instance_hyjal.cpp => src/server/scripts/Kalimdor/caverns_of_time/hyjal/instance_hyjal.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/old_hillsbrad/boss_captain_skarloc.cpp => src/server/scripts/Kalimdor/caverns_of_time/old_hillsbrad/boss_captain_skarloc.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/old_hillsbrad/boss_epoch_hunter.cpp => src/server/scripts/Kalimdor/caverns_of_time/old_hillsbrad/boss_epoch_hunter.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/old_hillsbrad/boss_leutenant_drake.cpp => src/server/scripts/Kalimdor/caverns_of_time/old_hillsbrad/boss_leutenant_drake.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/old_hillsbrad/instance_old_hillsbrad.cpp => src/server/scripts/Kalimdor/caverns_of_time/old_hillsbrad/instance_old_hillsbrad.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp => src/server/scripts/Kalimdor/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp
rename : src/server/scripts/kalimdor/caverns_of_time/old_hillsbrad/old_hillsbrad.h => src/server/scripts/Kalimdor/caverns_of_time/old_hillsbrad/old_hillsbrad.h
rename : src/server/scripts/kalimdor/darkshore.cpp => src/server/scripts/Kalimdor/darkshore.cpp
rename : src/server/scripts/kalimdor/desolace.cpp => src/server/scripts/Kalimdor/desolace.cpp
rename : src/server/scripts/kalimdor/durotar.cpp => src/server/scripts/Kalimdor/durotar.cpp
rename : src/server/scripts/kalimdor/dustwallow_marsh.cpp => src/server/scripts/Kalimdor/dustwallow_marsh.cpp
rename : src/server/scripts/kalimdor/felwood.cpp => src/server/scripts/Kalimdor/felwood.cpp
rename : src/server/scripts/kalimdor/feralas.cpp => src/server/scripts/Kalimdor/feralas.cpp
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/moonglade.cpp => src/server/scripts/Kalimdor/moonglade.cpp
rename : src/server/scripts/kalimdor/mulgore.cpp => src/server/scripts/Kalimdor/mulgore.cpp
rename : src/server/scripts/kalimdor/onyxias_lair/boss_onyxia.cpp => src/server/scripts/Kalimdor/onyxias_lair/boss_onyxia.cpp
rename : src/server/scripts/kalimdor/onyxias_lair/instance_onyxias_lair.cpp => src/server/scripts/Kalimdor/onyxias_lair/instance_onyxias_lair.cpp
rename : src/server/scripts/kalimdor/onyxias_lair/onyxias_lair.h => src/server/scripts/Kalimdor/onyxias_lair/onyxias_lair.h
rename : src/server/scripts/kalimdor/orgrimmar.cpp => src/server/scripts/Kalimdor/orgrimmar.cpp
rename : src/server/scripts/kalimdor/razorfen_downs/boss_amnennar_the_coldbringer.cpp => src/server/scripts/Kalimdor/razorfen_downs/boss_amnennar_the_coldbringer.cpp
rename : src/server/scripts/kalimdor/razorfen_downs/instance_razorfen_downs.cpp => src/server/scripts/Kalimdor/razorfen_downs/instance_razorfen_downs.cpp
rename : src/server/scripts/kalimdor/razorfen_downs/razorfen_downs.cpp => src/server/scripts/Kalimdor/razorfen_downs/razorfen_downs.cpp
rename : src/server/scripts/kalimdor/razorfen_downs/razorfen_downs.h => src/server/scripts/Kalimdor/razorfen_downs/razorfen_downs.h
rename : src/server/scripts/kalimdor/razorfen_kraul/instance_razorfen_kraul.cpp => src/server/scripts/Kalimdor/razorfen_kraul/instance_razorfen_kraul.cpp
rename : src/server/scripts/kalimdor/razorfen_kraul/razorfen_kraul.cpp => src/server/scripts/Kalimdor/razorfen_kraul/razorfen_kraul.cpp
rename : src/server/scripts/kalimdor/razorfen_kraul/razorfen_kraul.h => src/server/scripts/Kalimdor/razorfen_kraul/razorfen_kraul.h
rename : src/server/scripts/kalimdor/ruins_of_ahnqiraj/boss_ayamiss.cpp => src/server/scripts/Kalimdor/ruins_of_ahnqiraj/boss_ayamiss.cpp
rename : src/server/scripts/kalimdor/ruins_of_ahnqiraj/boss_buru.cpp => src/server/scripts/Kalimdor/ruins_of_ahnqiraj/boss_buru.cpp
rename : src/server/scripts/kalimdor/ruins_of_ahnqiraj/boss_kurinnaxx.cpp => src/server/scripts/Kalimdor/ruins_of_ahnqiraj/boss_kurinnaxx.cpp
rename : src/server/scripts/kalimdor/ruins_of_ahnqiraj/boss_moam.cpp => src/server/scripts/Kalimdor/ruins_of_ahnqiraj/boss_moam.cpp
rename : src/server/scripts/kalimdor/ruins_of_ahnqiraj/boss_ossirian.cpp => src/server/scripts/Kalimdor/ruins_of_ahnqiraj/boss_ossirian.cpp
rename : src/server/scripts/kalimdor/ruins_of_ahnqiraj/boss_rajaxx.cpp => src/server/scripts/Kalimdor/ruins_of_ahnqiraj/boss_rajaxx.cpp
rename : src/server/scripts/kalimdor/ruins_of_ahnqiraj/instance_ruins_of_ahnqiraj.cpp => src/server/scripts/Kalimdor/ruins_of_ahnqiraj/instance_ruins_of_ahnqiraj.cpp
rename : src/server/scripts/kalimdor/ruins_of_ahnqiraj/ruins_of_ahnqiraj.h => src/server/scripts/Kalimdor/ruins_of_ahnqiraj/ruins_of_ahnqiraj.h
rename : src/server/scripts/kalimdor/silithus.cpp => src/server/scripts/Kalimdor/silithus.cpp
rename : src/server/scripts/kalimdor/stonetalon_mountains.cpp => src/server/scripts/Kalimdor/stonetalon_mountains.cpp
rename : src/server/scripts/kalimdor/tanaris.cpp => src/server/scripts/Kalimdor/tanaris.cpp
rename : src/server/scripts/kalimdor/teldrassil.cpp => src/server/scripts/Kalimdor/teldrassil.cpp
rename : src/server/scripts/kalimdor/temple_of_ahnqiraj/boss_bug_trio.cpp => src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_bug_trio.cpp
rename : src/server/scripts/kalimdor/temple_of_ahnqiraj/boss_cthun.cpp => src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_cthun.cpp
rename : src/server/scripts/kalimdor/temple_of_ahnqiraj/boss_fankriss.cpp => src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_fankriss.cpp
rename : src/server/scripts/kalimdor/temple_of_ahnqiraj/boss_huhuran.cpp => src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_huhuran.cpp
rename : src/server/scripts/kalimdor/temple_of_ahnqiraj/boss_ouro.cpp => src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_ouro.cpp
rename : src/server/scripts/kalimdor/temple_of_ahnqiraj/boss_sartura.cpp => src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_sartura.cpp
rename : src/server/scripts/kalimdor/temple_of_ahnqiraj/boss_skeram.cpp => src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_skeram.cpp
rename : src/server/scripts/kalimdor/temple_of_ahnqiraj/boss_twinemperors.cpp => src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_twinemperors.cpp
rename : src/server/scripts/kalimdor/temple_of_ahnqiraj/boss_viscidus.cpp => src/server/scripts/Kalimdor/temple_of_ahnqiraj/boss_viscidus.cpp
rename : src/server/scripts/kalimdor/temple_of_ahnqiraj/instance_temple_of_ahnqiraj.cpp => src/server/scripts/Kalimdor/temple_of_ahnqiraj/instance_temple_of_ahnqiraj.cpp
rename : src/server/scripts/kalimdor/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp => src/server/scripts/Kalimdor/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp
rename : src/server/scripts/kalimdor/temple_of_ahnqiraj/temple_of_ahnqiraj.h => src/server/scripts/Kalimdor/temple_of_ahnqiraj/temple_of_ahnqiraj.h
rename : src/server/scripts/kalimdor/the_barrens.cpp => src/server/scripts/Kalimdor/the_barrens.cpp
rename : src/server/scripts/kalimdor/thousand_needles.cpp => src/server/scripts/Kalimdor/thousand_needles.cpp
rename : src/server/scripts/kalimdor/thunder_bluff.cpp => src/server/scripts/Kalimdor/thunder_bluff.cpp
rename : src/server/scripts/kalimdor/ungoro_crater.cpp => src/server/scripts/Kalimdor/ungoro_crater.cpp
rename : src/server/scripts/kalimdor/wailing_caverns/instance_wailing_caverns.cpp => src/server/scripts/Kalimdor/wailing_caverns/instance_wailing_caverns.cpp
rename : src/server/scripts/kalimdor/wailing_caverns/wailing_caverns.cpp => src/server/scripts/Kalimdor/wailing_caverns/wailing_caverns.cpp
rename : src/server/scripts/kalimdor/wailing_caverns/wailing_caverns.h => src/server/scripts/Kalimdor/wailing_caverns/wailing_caverns.h
rename : src/server/scripts/kalimdor/winterspring.cpp => src/server/scripts/Kalimdor/winterspring.cpp
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/azjol_nerub/ahnkahet/ahnkahet.h
rename : src/server/scripts/northrend/azjol_nerub/ahnkahet/boss_amanitar.cpp => src/server/scripts/Northrend/azjol_nerub/ahnkahet/boss_amanitar.cpp
rename : src/server/scripts/northrend/azjol_nerub/ahnkahet/boss_elder_nadox.cpp => src/server/scripts/Northrend/azjol_nerub/ahnkahet/boss_elder_nadox.cpp
rename : src/server/scripts/northrend/azjol_nerub/ahnkahet/boss_herald_volazj.cpp => src/server/scripts/Northrend/azjol_nerub/ahnkahet/boss_herald_volazj.cpp
rename : src/server/scripts/northrend/azjol_nerub/ahnkahet/boss_jedoga_shadowseeker.cpp => src/server/scripts/Northrend/azjol_nerub/ahnkahet/boss_jedoga_shadowseeker.cpp
rename : src/server/scripts/northrend/azjol_nerub/ahnkahet/boss_prince_taldaram.cpp => src/server/scripts/Northrend/azjol_nerub/ahnkahet/boss_prince_taldaram.cpp
rename : src/server/scripts/northrend/azjol_nerub/ahnkahet/instance_ahnkahet.cpp => src/server/scripts/Northrend/azjol_nerub/ahnkahet/instance_ahnkahet.cpp
rename : src/server/scripts/northrend/azjol_nerub/azjol_nerub/azjol_nerub.h => src/server/scripts/Northrend/azjol_nerub/azjol_nerub/azjol_nerub.h
rename : src/server/scripts/northrend/azjol_nerub/azjol_nerub/boss_anubarak.cpp => src/server/scripts/Northrend/azjol_nerub/azjol_nerub/boss_anubarak.cpp
rename : src/server/scripts/northrend/azjol_nerub/azjol_nerub/boss_hadronox.cpp => src/server/scripts/Northrend/azjol_nerub/azjol_nerub/boss_hadronox.cpp
rename : src/server/scripts/northrend/azjol_nerub/azjol_nerub/boss_krikthir_the_gatewatcher.cpp => src/server/scripts/Northrend/azjol_nerub/azjol_nerub/boss_krikthir_the_gatewatcher.cpp
rename : src/server/scripts/northrend/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp => src/server/scripts/Northrend/azjol_nerub/azjol_nerub/instance_azjol_nerub.cpp
rename : src/server/scripts/northrend/borean_tundra.cpp => src/server/scripts/Northrend/borean_tundra.cpp
rename : src/server/scripts/northrend/crusaders_coliseum/trial_of_the_champion/boss_argent_challenge.cpp => src/server/scripts/Northrend/crusaders_coliseum/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/crusaders_coliseum/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/crusaders_coliseum/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/crusaders_coliseum/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/crusaders_coliseum/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/crusaders_coliseum/trial_of_the_champion/trial_of_the_champion.h
rename : src/server/scripts/northrend/crystalsong_forest.cpp => src/server/scripts/Northrend/crystalsong_forest.cpp
rename : src/server/scripts/northrend/dalaran.cpp => src/server/scripts/Northrend/dalaran.cpp
rename : src/server/scripts/northrend/dragonblight.cpp => src/server/scripts/Northrend/dragonblight.cpp
rename : src/server/scripts/northrend/draktharon_keep/boss_dred.cpp => src/server/scripts/Northrend/draktharon_keep/boss_dred.cpp
rename : src/server/scripts/northrend/draktharon_keep/boss_novos.cpp => src/server/scripts/Northrend/draktharon_keep/boss_novos.cpp
rename : src/server/scripts/northrend/draktharon_keep/boss_tharon_ja.cpp => src/server/scripts/Northrend/draktharon_keep/boss_tharon_ja.cpp
rename : src/server/scripts/northrend/draktharon_keep/boss_trollgore.cpp => src/server/scripts/Northrend/draktharon_keep/boss_trollgore.cpp
rename : src/server/scripts/northrend/draktharon_keep/drak_tharon_keep.h => src/server/scripts/Northrend/draktharon_keep/drak_tharon_keep.h
rename : src/server/scripts/northrend/draktharon_keep/instance_drak_tharon_keep.cpp => src/server/scripts/Northrend/draktharon_keep/instance_drak_tharon_keep.cpp
rename : src/server/scripts/northrend/frozen_halls/forge_of_souls/boss_bronjahm.cpp => src/server/scripts/Northrend/frozen_halls/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/frozen_halls/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/frozen_halls/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/frozen_halls/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/frozen_halls/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/frozen_halls/halls_of_reflection/boss_falric.cpp
rename : src/server/scripts/northrend/frozen_halls/halls_of_reflection/boss_marwyn.cpp => src/server/scripts/Northrend/frozen_halls/halls_of_reflection/boss_marwyn.cpp
rename : src/server/scripts/northrend/frozen_halls/halls_of_reflection/halls_of_reflection.cpp => src/server/scripts/Northrend/frozen_halls/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/frozen_halls/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/frozen_halls/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/frozen_halls/pit_of_saron/boss_forgemaster_garfrost.cpp
rename : src/server/scripts/northrend/frozen_halls/pit_of_saron/boss_krickandick.cpp => src/server/scripts/Northrend/frozen_halls/pit_of_saron/boss_krickandick.cpp
rename : src/server/scripts/northrend/frozen_halls/pit_of_saron/boss_scourgelord_tyrannus.cpp => src/server/scripts/Northrend/frozen_halls/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/frozen_halls/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/frozen_halls/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/frozen_halls/pit_of_saron/pit_of_saron.h
rename : src/server/scripts/northrend/grizzly_hills.cpp => src/server/scripts/Northrend/grizzly_hills.cpp
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/howling_fjord.cpp => src/server/scripts/Northrend/howling_fjord.cpp
rename : src/server/scripts/northrend/icecrown.cpp => src/server/scripts/Northrend/icecrown.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/nexus/eye_of_eternity/boss_malygos.cpp => src/server/scripts/Northrend/nexus/eye_of_eternity/boss_malygos.cpp
rename : src/server/scripts/northrend/nexus/eye_of_eternity/eye_of_eternity.h => src/server/scripts/Northrend/nexus/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/nexus/eye_of_eternity/instance_eye_of_eternity.cpp
rename : src/server/scripts/northrend/nexus/nexus/boss_anomalus.cpp => src/server/scripts/Northrend/nexus/nexus/boss_anomalus.cpp
rename : src/server/scripts/northrend/nexus/nexus/boss_keristrasza.cpp => src/server/scripts/Northrend/nexus/nexus/boss_keristrasza.cpp
rename : src/server/scripts/northrend/nexus/nexus/boss_magus_telestra.cpp => src/server/scripts/Northrend/nexus/nexus/boss_magus_telestra.cpp
rename : src/server/scripts/northrend/nexus/nexus/boss_ormorok.cpp => src/server/scripts/Northrend/nexus/nexus/boss_ormorok.cpp
rename : src/server/scripts/northrend/nexus/nexus/commander_kolurg.cpp => src/server/scripts/Northrend/nexus/nexus/commander_kolurg.cpp
rename : src/server/scripts/northrend/nexus/nexus/commander_stoutbeard.cpp => src/server/scripts/Northrend/nexus/nexus/commander_stoutbeard.cpp
rename : src/server/scripts/northrend/nexus/nexus/instance_nexus.cpp => src/server/scripts/Northrend/nexus/nexus/instance_nexus.cpp
rename : src/server/scripts/northrend/nexus/nexus/nexus.h => src/server/scripts/Northrend/nexus/nexus/nexus.h
rename : src/server/scripts/northrend/nexus/oculus/boss_drakos.cpp => src/server/scripts/Northrend/nexus/oculus/boss_drakos.cpp
rename : src/server/scripts/northrend/nexus/oculus/boss_eregos.cpp => src/server/scripts/Northrend/nexus/oculus/boss_eregos.cpp
rename : src/server/scripts/northrend/nexus/oculus/boss_urom.cpp => src/server/scripts/Northrend/nexus/oculus/boss_urom.cpp
rename : src/server/scripts/northrend/nexus/oculus/boss_varos.cpp => src/server/scripts/Northrend/nexus/oculus/boss_varos.cpp
rename : src/server/scripts/northrend/nexus/oculus/instance_oculus.cpp => src/server/scripts/Northrend/nexus/oculus/instance_oculus.cpp
rename : src/server/scripts/northrend/nexus/oculus/oculus.cpp => src/server/scripts/Northrend/nexus/oculus/oculus.cpp
rename : src/server/scripts/northrend/nexus/oculus/oculus.h => src/server/scripts/Northrend/nexus/oculus/oculus.h
rename : src/server/scripts/northrend/obsidian_sanctum/boss_sartharion.cpp => src/server/scripts/Northrend/obsidian_sanctum/boss_sartharion.cpp
rename : src/server/scripts/northrend/obsidian_sanctum/instance_obsidian_sanctum.cpp => src/server/scripts/Northrend/obsidian_sanctum/instance_obsidian_sanctum.cpp
rename : src/server/scripts/northrend/obsidian_sanctum/obsidian_sanctum.h => src/server/scripts/Northrend/obsidian_sanctum/obsidian_sanctum.h
rename : src/server/scripts/northrend/sholazar_basin.cpp => src/server/scripts/Northrend/sholazar_basin.cpp
rename : src/server/scripts/northrend/storm_peaks.cpp => src/server/scripts/Northrend/storm_peaks.cpp
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/utgarde_keep/utgarde_keep/boss_ingvar_the_plunderer.cpp
rename : src/server/scripts/northrend/utgarde_keep/utgarde_keep/boss_keleseth.cpp => src/server/scripts/Northrend/utgarde_keep/utgarde_keep/boss_keleseth.cpp
rename : src/server/scripts/northrend/utgarde_keep/utgarde_keep/boss_skarvald_dalronn.cpp => src/server/scripts/Northrend/utgarde_keep/utgarde_keep/boss_skarvald_dalronn.cpp
rename : src/server/scripts/northrend/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp => src/server/scripts/Northrend/utgarde_keep/utgarde_keep/instance_utgarde_keep.cpp
rename : src/server/scripts/northrend/utgarde_keep/utgarde_keep/utgarde_keep.cpp => src/server/scripts/Northrend/utgarde_keep/utgarde_keep/utgarde_keep.cpp
rename : src/server/scripts/northrend/utgarde_keep/utgarde_keep/utgarde_keep.h => src/server/scripts/Northrend/utgarde_keep/utgarde_keep/utgarde_keep.h
rename : src/server/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_palehoof.cpp => src/server/scripts/Northrend/utgarde_keep/utgarde_pinnacle/boss_palehoof.cpp
rename : src/server/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_skadi.cpp => src/server/scripts/Northrend/utgarde_keep/utgarde_pinnacle/boss_skadi.cpp
rename : src/server/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_svala.cpp => src/server/scripts/Northrend/utgarde_keep/utgarde_pinnacle/boss_svala.cpp
rename : src/server/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_ymiron.cpp => src/server/scripts/Northrend/utgarde_keep/utgarde_pinnacle/boss_ymiron.cpp
rename : src/server/scripts/northrend/utgarde_keep/utgarde_pinnacle/instance_pinnacle.cpp => src/server/scripts/Northrend/utgarde_keep/utgarde_pinnacle/instance_pinnacle.cpp
rename : src/server/scripts/northrend/utgarde_keep/utgarde_pinnacle/utgarde_pinnacle.h => src/server/scripts/Northrend/utgarde_keep/utgarde_pinnacle/utgarde_pinnacle.h
rename : src/server/scripts/northrend/vault_of_archavon/boss_archavon.cpp => src/server/scripts/Northrend/vault_of_archavon/boss_archavon.cpp
rename : src/server/scripts/northrend/vault_of_archavon/boss_emalon.cpp => src/server/scripts/Northrend/vault_of_archavon/boss_emalon.cpp
rename : src/server/scripts/northrend/vault_of_archavon/boss_koralon.cpp => src/server/scripts/Northrend/vault_of_archavon/boss_koralon.cpp
rename : src/server/scripts/northrend/vault_of_archavon/boss_toravon.cpp => src/server/scripts/Northrend/vault_of_archavon/boss_toravon.cpp
rename : src/server/scripts/northrend/vault_of_archavon/instance_vault_of_archavon.cpp => src/server/scripts/Northrend/vault_of_archavon/instance_vault_of_archavon.cpp
rename : src/server/scripts/northrend/vault_of_archavon/vault_of_archavon.h => src/server/scripts/Northrend/vault_of_archavon/vault_of_archavon.h
rename : src/server/scripts/northrend/violet_hold/boss_cyanigosa.cpp => src/server/scripts/Northrend/violet_hold/boss_cyanigosa.cpp
rename : src/server/scripts/northrend/violet_hold/boss_erekem.cpp => src/server/scripts/Northrend/violet_hold/boss_erekem.cpp
rename : src/server/scripts/northrend/violet_hold/boss_ichoron.cpp => src/server/scripts/Northrend/violet_hold/boss_ichoron.cpp
rename : src/server/scripts/northrend/violet_hold/boss_lavanthor.cpp => src/server/scripts/Northrend/violet_hold/boss_lavanthor.cpp
rename : src/server/scripts/northrend/violet_hold/boss_moragg.cpp => src/server/scripts/Northrend/violet_hold/boss_moragg.cpp
rename : src/server/scripts/northrend/violet_hold/boss_xevozz.cpp => src/server/scripts/Northrend/violet_hold/boss_xevozz.cpp
rename : src/server/scripts/northrend/violet_hold/boss_zuramat.cpp => src/server/scripts/Northrend/violet_hold/boss_zuramat.cpp
rename : src/server/scripts/northrend/violet_hold/instance_violet_hold.cpp => src/server/scripts/Northrend/violet_hold/instance_violet_hold.cpp
rename : src/server/scripts/northrend/violet_hold/violet_hold.cpp => src/server/scripts/Northrend/violet_hold/violet_hold.cpp
rename : src/server/scripts/northrend/violet_hold/violet_hold.h => src/server/scripts/Northrend/violet_hold/violet_hold.h
rename : src/server/scripts/northrend/zuldrak.cpp => src/server/scripts/Northrend/zuldrak.cpp
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/black_temple/black_temple.cpp
rename : src/server/scripts/outland/black_temple/black_temple.h => src/server/scripts/Outland/black_temple/black_temple.h
rename : src/server/scripts/outland/black_temple/boss_bloodboil.cpp => src/server/scripts/Outland/black_temple/boss_bloodboil.cpp
rename : src/server/scripts/outland/black_temple/boss_illidan.cpp => src/server/scripts/Outland/black_temple/boss_illidan.cpp
rename : src/server/scripts/outland/black_temple/boss_mother_shahraz.cpp => src/server/scripts/Outland/black_temple/boss_mother_shahraz.cpp
rename : src/server/scripts/outland/black_temple/boss_reliquary_of_souls.cpp => src/server/scripts/Outland/black_temple/boss_reliquary_of_souls.cpp
rename : src/server/scripts/outland/black_temple/boss_shade_of_akama.cpp => src/server/scripts/Outland/black_temple/boss_shade_of_akama.cpp
rename : src/server/scripts/outland/black_temple/boss_supremus.cpp => src/server/scripts/Outland/black_temple/boss_supremus.cpp
rename : src/server/scripts/outland/black_temple/boss_teron_gorefiend.cpp => src/server/scripts/Outland/black_temple/boss_teron_gorefiend.cpp
rename : src/server/scripts/outland/black_temple/boss_warlord_najentus.cpp => src/server/scripts/Outland/black_temple/boss_warlord_najentus.cpp
rename : src/server/scripts/outland/black_temple/illidari_council.cpp => src/server/scripts/Outland/black_temple/illidari_council.cpp
rename : src/server/scripts/outland/black_temple/instance_black_temple.cpp => src/server/scripts/Outland/black_temple/instance_black_temple.cpp
rename : src/server/scripts/outland/blades_edge_mountains.cpp => src/server/scripts/Outland/blades_edge_mountains.cpp
rename : src/server/scripts/outland/boss_doomlord_kazzak.cpp => src/server/scripts/Outland/boss_doomlord_kazzak.cpp
rename : src/server/scripts/outland/boss_doomwalker.cpp => src/server/scripts/Outland/boss_doomwalker.cpp
rename : src/server/scripts/outland/coilfang_resevoir/serpent_shrine/boss_fathomlord_karathress.cpp => src/server/scripts/Outland/coilfang_resevoir/serpent_shrine/boss_fathomlord_karathress.cpp
rename : src/server/scripts/outland/coilfang_resevoir/serpent_shrine/boss_hydross_the_unstable.cpp => src/server/scripts/Outland/coilfang_resevoir/serpent_shrine/boss_hydross_the_unstable.cpp
rename : src/server/scripts/outland/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp => src/server/scripts/Outland/coilfang_resevoir/serpent_shrine/boss_lady_vashj.cpp
rename : src/server/scripts/outland/coilfang_resevoir/serpent_shrine/boss_leotheras_the_blind.cpp => src/server/scripts/Outland/coilfang_resevoir/serpent_shrine/boss_leotheras_the_blind.cpp
rename : src/server/scripts/outland/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp => src/server/scripts/Outland/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp
rename : src/server/scripts/outland/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp => src/server/scripts/Outland/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp
rename : src/server/scripts/outland/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp => src/server/scripts/Outland/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp
rename : src/server/scripts/outland/coilfang_resevoir/serpent_shrine/serpent_shrine.h => src/server/scripts/Outland/coilfang_resevoir/serpent_shrine/serpent_shrine.h
rename : src/server/scripts/outland/coilfang_resevoir/steam_vault/boss_hydromancer_thespia.cpp => src/server/scripts/Outland/coilfang_resevoir/steam_vault/boss_hydromancer_thespia.cpp
rename : src/server/scripts/outland/coilfang_resevoir/steam_vault/boss_mekgineer_steamrigger.cpp => src/server/scripts/Outland/coilfang_resevoir/steam_vault/boss_mekgineer_steamrigger.cpp
rename : src/server/scripts/outland/coilfang_resevoir/steam_vault/boss_warlord_kalithresh.cpp => src/server/scripts/Outland/coilfang_resevoir/steam_vault/boss_warlord_kalithresh.cpp
rename : src/server/scripts/outland/coilfang_resevoir/steam_vault/instance_steam_vault.cpp => src/server/scripts/Outland/coilfang_resevoir/steam_vault/instance_steam_vault.cpp
rename : src/server/scripts/outland/coilfang_resevoir/steam_vault/steam_vault.h => src/server/scripts/Outland/coilfang_resevoir/steam_vault/steam_vault.h
rename : src/server/scripts/outland/coilfang_resevoir/underbog/boss_hungarfen.cpp => src/server/scripts/Outland/coilfang_resevoir/underbog/boss_hungarfen.cpp
rename : src/server/scripts/outland/coilfang_resevoir/underbog/boss_the_black_stalker.cpp => src/server/scripts/Outland/coilfang_resevoir/underbog/boss_the_black_stalker.cpp
rename : src/server/scripts/outland/gruuls_lair/boss_gruul.cpp => src/server/scripts/Outland/gruuls_lair/boss_gruul.cpp
rename : src/server/scripts/outland/gruuls_lair/boss_high_king_maulgar.cpp => src/server/scripts/Outland/gruuls_lair/boss_high_king_maulgar.cpp
rename : src/server/scripts/outland/gruuls_lair/gruuls_lair.h => src/server/scripts/Outland/gruuls_lair/gruuls_lair.h
rename : src/server/scripts/outland/gruuls_lair/instance_gruuls_lair.cpp => src/server/scripts/Outland/gruuls_lair/instance_gruuls_lair.cpp
rename : src/server/scripts/outland/hellfire_citadel/blood_furnace/blood_furnace.h => src/server/scripts/Outland/hellfire_citadel/blood_furnace/blood_furnace.h
rename : src/server/scripts/outland/hellfire_citadel/blood_furnace/boss_broggok.cpp => src/server/scripts/Outland/hellfire_citadel/blood_furnace/boss_broggok.cpp
rename : src/server/scripts/outland/hellfire_citadel/blood_furnace/boss_kelidan_the_breaker.cpp => src/server/scripts/Outland/hellfire_citadel/blood_furnace/boss_kelidan_the_breaker.cpp
rename : src/server/scripts/outland/hellfire_citadel/blood_furnace/boss_the_maker.cpp => src/server/scripts/Outland/hellfire_citadel/blood_furnace/boss_the_maker.cpp
rename : src/server/scripts/outland/hellfire_citadel/blood_furnace/instance_blood_furnace.cpp => src/server/scripts/Outland/hellfire_citadel/blood_furnace/instance_blood_furnace.cpp
rename : src/server/scripts/outland/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp => src/server/scripts/Outland/hellfire_citadel/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/hellfire_citadel/hellfire_ramparts/boss_vazruden_the_herald.cpp
rename : src/server/scripts/outland/hellfire_citadel/hellfire_ramparts/boss_watchkeeper_gargolmar.cpp => src/server/scripts/Outland/hellfire_citadel/hellfire_ramparts/boss_watchkeeper_gargolmar.cpp
rename : src/server/scripts/outland/hellfire_citadel/hellfire_ramparts/hellfire_ramparts.h => src/server/scripts/Outland/hellfire_citadel/hellfire_ramparts/hellfire_ramparts.h
rename : src/server/scripts/outland/hellfire_citadel/hellfire_ramparts/instance_hellfire_ramparts.cpp => src/server/scripts/Outland/hellfire_citadel/hellfire_ramparts/instance_hellfire_ramparts.cpp
rename : src/server/scripts/outland/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp => src/server/scripts/Outland/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp
rename : src/server/scripts/outland/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp => src/server/scripts/Outland/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp
rename : src/server/scripts/outland/hellfire_citadel/magtheridons_lair/magtheridons_lair.h => src/server/scripts/Outland/hellfire_citadel/magtheridons_lair/magtheridons_lair.h
rename : src/server/scripts/outland/hellfire_citadel/shattered_halls/boss_nethekurse.cpp => src/server/scripts/Outland/hellfire_citadel/shattered_halls/boss_nethekurse.cpp
rename : src/server/scripts/outland/hellfire_citadel/shattered_halls/boss_warbringer_omrogg.cpp => src/server/scripts/Outland/hellfire_citadel/shattered_halls/boss_warbringer_omrogg.cpp
rename : src/server/scripts/outland/hellfire_citadel/shattered_halls/boss_warchief_kargath_bladefist.cpp => src/server/scripts/Outland/hellfire_citadel/shattered_halls/boss_warchief_kargath_bladefist.cpp
rename : src/server/scripts/outland/hellfire_citadel/shattered_halls/instance_shattered_halls.cpp => src/server/scripts/Outland/hellfire_citadel/shattered_halls/instance_shattered_halls.cpp
rename : src/server/scripts/outland/hellfire_citadel/shattered_halls/shattered_halls.h => src/server/scripts/Outland/hellfire_citadel/shattered_halls/shattered_halls.h
rename : src/server/scripts/outland/hellfire_peninsula.cpp => src/server/scripts/Outland/hellfire_peninsula.cpp
rename : src/server/scripts/outland/nagrand.cpp => src/server/scripts/Outland/nagrand.cpp
rename : src/server/scripts/outland/netherstorm.cpp => src/server/scripts/Outland/netherstorm.cpp
rename : src/server/scripts/outland/shadowmoon_valley.cpp => src/server/scripts/Outland/shadowmoon_valley.cpp
rename : src/server/scripts/outland/shattrath_city.cpp => src/server/scripts/Outland/shattrath_city.cpp
rename : src/server/scripts/outland/tempest_keep/arcatraz/arcatraz.cpp => src/server/scripts/Outland/tempest_keep/arcatraz/arcatraz.cpp
rename : src/server/scripts/outland/tempest_keep/arcatraz/arcatraz.h => src/server/scripts/Outland/tempest_keep/arcatraz/arcatraz.h
rename : src/server/scripts/outland/tempest_keep/arcatraz/boss_harbinger_skyriss.cpp => src/server/scripts/Outland/tempest_keep/arcatraz/boss_harbinger_skyriss.cpp
rename : src/server/scripts/outland/tempest_keep/arcatraz/instance_arcatraz.cpp => src/server/scripts/Outland/tempest_keep/arcatraz/instance_arcatraz.cpp
rename : src/server/scripts/outland/tempest_keep/botanica/boss_high_botanist_freywinn.cpp => src/server/scripts/Outland/tempest_keep/botanica/boss_high_botanist_freywinn.cpp
rename : src/server/scripts/outland/tempest_keep/botanica/boss_laj.cpp => src/server/scripts/Outland/tempest_keep/botanica/boss_laj.cpp
rename : src/server/scripts/outland/tempest_keep/botanica/boss_warp_splinter.cpp => src/server/scripts/Outland/tempest_keep/botanica/boss_warp_splinter.cpp
rename : src/server/scripts/outland/tempest_keep/the_eye/boss_alar.cpp => src/server/scripts/Outland/tempest_keep/the_eye/boss_alar.cpp
rename : src/server/scripts/outland/tempest_keep/the_eye/boss_astromancer.cpp => src/server/scripts/Outland/tempest_keep/the_eye/boss_astromancer.cpp
rename : src/server/scripts/outland/tempest_keep/the_eye/boss_kaelthas.cpp => src/server/scripts/Outland/tempest_keep/the_eye/boss_kaelthas.cpp
rename : src/server/scripts/outland/tempest_keep/the_eye/boss_void_reaver.cpp => src/server/scripts/Outland/tempest_keep/the_eye/boss_void_reaver.cpp
rename : src/server/scripts/outland/tempest_keep/the_eye/instance_the_eye.cpp => src/server/scripts/Outland/tempest_keep/the_eye/instance_the_eye.cpp
rename : src/server/scripts/outland/tempest_keep/the_eye/the_eye.cpp => src/server/scripts/Outland/tempest_keep/the_eye/the_eye.cpp
rename : src/server/scripts/outland/tempest_keep/the_eye/the_eye.h => src/server/scripts/Outland/tempest_keep/the_eye/the_eye.h
rename : src/server/scripts/outland/tempest_keep/the_mechanar/boss_gatewatcher_gyrokill.cpp => src/server/scripts/Outland/tempest_keep/the_mechanar/boss_gatewatcher_gyrokill.cpp
rename : src/server/scripts/outland/tempest_keep/the_mechanar/boss_gatewatcher_ironhand.cpp => src/server/scripts/Outland/tempest_keep/the_mechanar/boss_gatewatcher_ironhand.cpp
rename : src/server/scripts/outland/tempest_keep/the_mechanar/boss_nethermancer_sepethrea.cpp => src/server/scripts/Outland/tempest_keep/the_mechanar/boss_nethermancer_sepethrea.cpp
rename : src/server/scripts/outland/tempest_keep/the_mechanar/boss_pathaleon_the_calculator.cpp => src/server/scripts/Outland/tempest_keep/the_mechanar/boss_pathaleon_the_calculator.cpp
rename : src/server/scripts/outland/tempest_keep/the_mechanar/instance_mechanar.cpp => src/server/scripts/Outland/tempest_keep/the_mechanar/instance_mechanar.cpp
rename : src/server/scripts/outland/tempest_keep/the_mechanar/mechanar.h => src/server/scripts/Outland/tempest_keep/the_mechanar/mechanar.h
rename : src/server/scripts/outland/terokkar_forest.cpp => src/server/scripts/Outland/terokkar_forest.cpp
rename : src/server/scripts/outland/zangarmarsh.cpp => src/server/scripts/Outland/zangarmarsh.cpp
rename : src/server/scripts/world/areatrigger_scripts.cpp => src/server/scripts/World/areatrigger_scripts.cpp
rename : src/server/scripts/world/boss_emeriss.cpp => src/server/scripts/World/boss_emeriss.cpp
rename : src/server/scripts/world/boss_lethon.cpp => src/server/scripts/World/boss_lethon.cpp
rename : src/server/scripts/world/boss_taerar.cpp => src/server/scripts/World/boss_taerar.cpp
rename : src/server/scripts/world/boss_ysondre.cpp => src/server/scripts/World/boss_ysondre.cpp
rename : src/server/scripts/world/go_scripts.cpp => src/server/scripts/World/go_scripts.cpp
rename : src/server/scripts/world/guards.cpp => src/server/scripts/World/guards.cpp
rename : src/server/scripts/world/item_scripts.cpp => src/server/scripts/World/item_scripts.cpp
rename : src/server/scripts/world/mob_generic_creature.cpp => src/server/scripts/World/mob_generic_creature.cpp
rename : src/server/scripts/world/npc_innkeeper.cpp => src/server/scripts/World/npc_innkeeper.cpp
rename : src/server/scripts/world/npc_professions.cpp => src/server/scripts/World/npc_professions.cpp
rename : src/server/scripts/world/npc_taxi.cpp => src/server/scripts/World/npc_taxi.cpp
rename : src/server/scripts/world/npcs_special.cpp => src/server/scripts/World/npcs_special.cpp
This commit is contained in:
Tartalo
2010-06-07 00:00:11 +02:00
parent e548d60b4e
commit 910980d3c6
565 changed files with 0 additions and 0 deletions
@@ -0,0 +1,52 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef DEF_AHNKAHET_H
#define DEF_AHNKAHET_H
enum Data64
{
DATA_ELDER_NADOX,
DATA_PRINCE_TALDARAM,
DATA_JEDOGA_SHADOWSEEKER,
DATA_HERALD_VOLAZJ,
DATA_AMANITAR,
DATA_SPHERE1,
DATA_SPHERE2,
DATA_PRINCE_TALDARAM_PLATFORM,
DATA_PL_JEDOGA_TARGET,
DATA_ADD_JEDOGA_OPFER,
DATA_ADD_JEDOGA_INITIAND
};
enum Data
{
DATA_ELDER_NADOX_EVENT,
DATA_PRINCE_TALDARAM_EVENT,
DATA_JEDOGA_SHADOWSEEKER_EVENT,
DATA_HERALD_VOLAZJ_EVENT,
DATA_AMANITAR_EVENT,
DATA_SPHERE1_EVENT,
DATA_SPHERE2_EVENT,
DATA_JEDOGA_TRIGGER_SWITCH,
DATA_JEDOGA_RESET_INITIANDS,
DATA_INITIAND_KILLED,
DATA_ALL_INITIAND_DEAD
};
#endif
@@ -0,0 +1,226 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* Comment: Find correct mushrooms spell to make them visible - buffs of the mushrooms not ever applied to the users...
*/
#include "ScriptedPch.h"
#include "ahnkahet.h"
enum Spells
{
SPELL_BASH = 57094, // Victim
SPELL_ENTANGLING_ROOTS = 57095, // Random Victim 100Y
SPELL_MINI = 57055, // Self
SPELL_VENOM_BOLT_VOLLEY = 57088, // Random Victim 100Y
SPELL_HEALTHY_MUSHROOM_POTENT_FUNGUS = 56648, // Killer 3Y
SPELL_POISONOUS_MUSHROOM_POISON_CLOUD = 57061, // Self - Duration 8 Sec
SPELL_POISONOUS_MUSHROOM_VISUAL_AREA = 61566, // Self
SPELL_POISONOUS_MUSHROOM_VISUAL_AURA = 56741, // Self
SPELL_PUTRID_MUSHROOM = 31690, // To make the mushrooms visible
};
enum Creatures
{
NPC_HEALTHY_MUSHROOM = 30391,
NPC_POISONOUS_MUSHROOM = 30435
};
struct boss_amanitarAI : public ScriptedAI
{
boss_amanitarAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
bFirstTime = true;
}
ScriptedInstance* pInstance;
uint32 uiRootTimer;
uint32 uiBashTimer;
uint32 uiBoltTimer;
uint32 uiSpawnTimer;
bool bFirstTime;
void Reset()
{
uiRootTimer = urand(5*IN_MILISECONDS,9*IN_MILISECONDS);
uiBashTimer = urand(10*IN_MILISECONDS,14*IN_MILISECONDS);
uiBoltTimer = urand(15*IN_MILISECONDS,30*IN_MILISECONDS);
uiSpawnTimer = 0;
me->SetMeleeDamageSchool(SPELL_SCHOOL_NATURE);
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
if (pInstance)
{
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MINI);
if (!bFirstTime)
pInstance->SetData(DATA_AMANITAR_EVENT, FAIL);
else
bFirstTime = false;
}
}
void JustDied(Unit * /*Killer*/)
{
if (pInstance)
{
pInstance->SetData(DATA_AMANITAR_EVENT, DONE);
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MINI);
}
}
void EnterCombat(Unit * /*who*/)
{
if (pInstance)
pInstance->SetData(DATA_AMANITAR_EVENT, IN_PROGRESS);
DoCast(me, SPELL_MINI, false);
}
void SpawnAdds()
{
for (uint8 i = 0; i < 30; ++i)
{
Unit* victim = SelectUnit(SELECT_TARGET_RANDOM, 0);
if (victim)
{
Position pos;
victim->GetPosition(&pos);
me->GetRandomNearPosition(pos, float(urand(5,80)));
me->SummonCreature(NPC_POISONOUS_MUSHROOM, pos, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30*IN_MILISECONDS);
me->GetRandomNearPosition(pos, float(urand(5,80)));
me->SummonCreature(NPC_HEALTHY_MUSHROOM, pos, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30*IN_MILISECONDS);
}
}
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (uiSpawnTimer <= diff)
{
SpawnAdds();
uiSpawnTimer = urand(35*IN_MILISECONDS,40*IN_MILISECONDS);
} else uiSpawnTimer -= diff;
if (uiRootTimer <= diff)
{
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
DoCast(pTarget, SPELL_ENTANGLING_ROOTS);
uiRootTimer = urand(15*IN_MILISECONDS,30*IN_MILISECONDS);
} else uiRootTimer -= diff;
if (uiBashTimer <= diff)
{
DoCastVictim(SPELL_BASH);
uiBashTimer = urand(15*IN_MILISECONDS,30*IN_MILISECONDS);
} else uiBashTimer -= diff;
if (uiBoltTimer <= diff)
{
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
DoCast(pTarget, SPELL_VENOM_BOLT_VOLLEY);
uiBoltTimer = urand(15*IN_MILISECONDS,30*IN_MILISECONDS);
} else uiBoltTimer -= diff;
DoMeleeAttackIfReady();
}
};
struct mob_amanitar_mushroomsAI : public Scripted_NoMovementAI
{
mob_amanitar_mushroomsAI(Creature* c) : Scripted_NoMovementAI(c) {}
uint32 uiAuraTimer;
uint32 uiDeathTimer;
void Reset()
{
DoCast(me, SPELL_PUTRID_MUSHROOM, true); // Hack, to make the mushrooms visible, can't find orig. spell...
if (me->GetEntry() == NPC_POISONOUS_MUSHROOM)
DoCast(me, SPELL_POISONOUS_MUSHROOM_VISUAL_AURA, true);
uiAuraTimer = 0;
uiDeathTimer = 30*IN_MILISECONDS;
}
void JustDied(Unit *killer)
{
if (!killer)
return;
if (me->GetEntry() == NPC_HEALTHY_MUSHROOM && killer->GetTypeId() == TYPEID_PLAYER)
{
me->InterruptNonMeleeSpells(false);
DoCast(killer, SPELL_HEALTHY_MUSHROOM_POTENT_FUNGUS, false);
}
}
void EnterCombat(Unit * /*who*/) {}
void AttackStart(Unit * /*victim*/) {}
void UpdateAI(const uint32 diff)
{
if (me->GetEntry() == NPC_POISONOUS_MUSHROOM)
{
if (uiAuraTimer <= diff)
{
DoCast(me, SPELL_POISONOUS_MUSHROOM_VISUAL_AREA, true);
DoCast(me, SPELL_POISONOUS_MUSHROOM_POISON_CLOUD, false);
uiAuraTimer = 7*IN_MILISECONDS;
} else uiAuraTimer -= diff;
}
if (uiDeathTimer <= diff)
me->DisappearAndDie();
else uiDeathTimer -= diff;
}
};
CreatureAI* GetAI_boss_amanitar(Creature* pCreature)
{
return new boss_amanitarAI (pCreature);
}
CreatureAI* GetAI_mob_amanitar_mushrooms(Creature *pCreature)
{
return new mob_amanitar_mushroomsAI (pCreature);
}
void AddSC_boss_amanitar()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_amanitar";
newscript->GetAI = &GetAI_boss_amanitar;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_amanitar_mushrooms";
newscript->GetAI = &GetAI_mob_amanitar_mushrooms;
newscript->RegisterSelf();
}
@@ -0,0 +1,283 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "ahnkahet.h"
bool DeadAhnkaharGuardian; // needed for achievement: Respect Your Elders(2038)
enum Achievements
{
ACHIEV_RESPECT_YOUR_ELDERS = 2038
};
//not in db
enum Yells
{
SAY_AGGRO = -1619014,
SAY_SLAY_1 = -1619015,
SAY_SLAY_2 = -1619016,
SAY_SLAY_3 = -1619017,
SAY_DEATH = -1619018,
SAY_EGG_SAC_1 = -1619019,
SAY_EGG_SAC_2 = -1619020
};
enum Spells
{
SPELL_BROOD_PLAGUE = 56130,
H_SPELL_BROOD_PLAGUE = 59467,
H_SPELL_BROOD_RAGE = 59465,
SPELL_ENRAGE = 26662, // Enraged if too far away from home
SPELL_SUMMON_SWARMERS = 56119, //2x 30178 -- 2x every 10secs
SPELL_SUMMON_SWARM_GUARD = 56120, //1x 30176 -- every 25secs
};
enum Creatures
{
MOB_AHNKAHAR_SWARMER = 30178,
MOB_AHNKAHAR_GUARDIAN_ENTRY = 30176
};
#define EMOTE_HATCHES "An Ahn'kahar Guardian hatches!"
struct boss_elder_nadoxAI : public ScriptedAI
{
boss_elder_nadoxAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
uint32 uiPlagueTimer;
uint32 uiRagueTimer;
uint32 uiSwarmerSpawnTimer;
uint32 uiGuardSpawnTimer;
uint32 uiEnragueTimer;
bool bGuardSpawned;
ScriptedInstance *pInstance;
void Reset()
{
uiPlagueTimer = 13*IN_MILISECONDS;
uiRagueTimer = 20*IN_MILISECONDS;
uiSwarmerSpawnTimer = 10*IN_MILISECONDS;
uiGuardSpawnTimer = 25*IN_MILISECONDS;
uiEnragueTimer = 5*IN_MILISECONDS;
DeadAhnkaharGuardian = false;
bGuardSpawned = false;
if (pInstance)
pInstance->SetData(DATA_ELDER_NADOX_EVENT, NOT_STARTED);
}
void EnterCombat(Unit * /*who*/)
{
DoScriptText(SAY_DEATH,me);
if (pInstance)
pInstance->SetData(DATA_ELDER_NADOX_EVENT, IN_PROGRESS);
}
void KilledUnit(Unit * /*victim*/)
{
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), me);
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_SLAY_3,me); //SAY_SLAY_3 on death?
if (pInstance)
{
pInstance->SetData(DATA_ELDER_NADOX_EVENT, DONE);
if (IsHeroic() && !DeadAhnkaharGuardian)
pInstance->DoCompleteAchievement(ACHIEV_RESPECT_YOUR_ELDERS);
}
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (uiPlagueTimer <= diff)
{
DoCast(me->getVictim(), SPELL_BROOD_PLAGUE);
uiPlagueTimer = 15*IN_MILISECONDS;
} else uiPlagueTimer -= diff;
if (IsHeroic())
if (uiRagueTimer <= diff)
{
if (Creature *pSwarmer = me->FindNearestCreature(MOB_AHNKAHAR_SWARMER, 35))
{
DoCast(pSwarmer, H_SPELL_BROOD_RAGE, true);
uiRagueTimer = 15*IN_MILISECONDS;
}
} else uiRagueTimer -= diff;
if (uiSwarmerSpawnTimer <= diff)
{
DoCast(me, SPELL_SUMMON_SWARMERS, true);
DoCast(me, SPELL_SUMMON_SWARMERS);
if (urand(1,3) == 3) // 33% chance of dialog
DoScriptText(RAND(SAY_EGG_SAC_1,SAY_EGG_SAC_2), me);
uiSwarmerSpawnTimer = 10*IN_MILISECONDS;
} else uiSwarmerSpawnTimer -= diff;
if (!bGuardSpawned && uiGuardSpawnTimer <= diff)
{
me->MonsterTextEmote(EMOTE_HATCHES,me->GetGUID(),true);
DoCast(me, SPELL_SUMMON_SWARM_GUARD);
bGuardSpawned = true;
} else uiGuardSpawnTimer -= diff;
if (uiEnragueTimer <= diff)
{
if (me->HasAura(SPELL_ENRAGE,0))
return;
float x, y, z, o;
me->GetHomePosition(x, y, z, o);
if (z < 24)
if (!me->IsNonMeleeSpellCasted(false))
DoCast(me, SPELL_ENRAGE, true);
uiEnragueTimer = 5*IN_MILISECONDS;
} else uiEnragueTimer -= diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_elder_nadox(Creature* pCreature)
{
return new boss_elder_nadoxAI(pCreature);
}
enum AddSpells
{
SPELL_SPRINT = 56354,
SPELL_GUARDIAN_AURA = 56151
};
struct mob_ahnkahar_nerubianAI : public ScriptedAI
{
mob_ahnkahar_nerubianAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance *pInstance;
uint32 uiSprintTimer;
void Reset()
{
if (me->GetEntry() == MOB_AHNKAHAR_GUARDIAN_ENTRY) //magic numbers are bad!
DoCast(me, SPELL_GUARDIAN_AURA, true);
uiSprintTimer = 10*IN_MILISECONDS;
}
void JustDied(Unit * /*killer*/)
{
if (me->GetEntry() == MOB_AHNKAHAR_GUARDIAN_ENTRY)
DeadAhnkaharGuardian = true;
}
void EnterCombat(Unit * /*who*/){}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (me->GetEntry() == MOB_AHNKAHAR_GUARDIAN_ENTRY)
me->RemoveAurasDueToSpell(SPELL_GUARDIAN_AURA);
if (pInstance)
{
if (pInstance->GetData(DATA_ELDER_NADOX_EVENT) != IN_PROGRESS)
{
me->DisappearAndDie();
}
}
if (!UpdateVictim())
return;
if (uiSprintTimer <= diff)
{
DoCast(me, SPELL_SPRINT);
uiSprintTimer = 25*IN_MILISECONDS;
} else uiSprintTimer -= diff;
DoMeleeAttackIfReady();
}
};
//HACK: No, AI. Replace with proper db content?
struct mob_nadox_eggsAI : public Scripted_NoMovementAI
{
mob_nadox_eggsAI(Creature* c) : Scripted_NoMovementAI(c)
{
c->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
c->UpdateAllStats();
}
void Reset() {}
void EnterCombat(Unit* /*who*/) {}
void AttackStart(Unit* /*victim*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
void UpdateAI(const uint32 /*diff*/) {}
};
CreatureAI* GetAI_mob_ahnkahar_nerubian(Creature* pCreature)
{
return new mob_ahnkahar_nerubianAI(pCreature);
}
CreatureAI* GetAI_mob_nadox_eggs(Creature* _Creature)
{
return new mob_nadox_eggsAI(_Creature);
}
void AddSC_boss_elder_nadox()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_elder_nadox";
newscript->GetAI = &GetAI_boss_elder_nadox;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_ahnkahar_nerubian";
newscript->GetAI = &GetAI_mob_ahnkahar_nerubian;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_nadox_eggs";
newscript->GetAI = &GetAI_mob_nadox_eggs;
newscript->RegisterSelf();
}
@@ -0,0 +1,328 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* Comment: Missing AI for Twisted Visages
*/
#include "ScriptedPch.h"
#include "ahnkahet.h"
enum Spells
{
SPELL_INSANITY = 57496, //Dummy
INSANITY_VISUAL = 57561,
SPELL_INSANITY_TARGET = 57508,
SPELL_MIND_FLAY = 57941,
SPELL_SHADOW_BOLT_VOLLEY = 57942,
SPELL_SHIVER = 57949,
SPELL_CLONE_PLAYER = 57507, //casted on player during insanity
SPELL_INSANITY_PHASING_1 = 57508,
SPELL_INSANITY_PHASING_2 = 57509,
SPELL_INSANITY_PHASING_3 = 57510,
SPELL_INSANITY_PHASING_4 = 57511,
SPELL_INSANITY_PHASING_5 = 57512
};
enum Creatures
{
MOB_TWISTED_VISAGE = 30625
};
//not in db
enum Yells
{
SAY_AGGRO = -1619030,
SAY_SLAY_1 = -1619031,
SAY_SLAY_2 = -1619032,
SAY_SLAY_3 = -1619033,
SAY_DEATH_1 = -1619034,
SAY_DEATH_2 = -1619035,
SAY_PHASE = -1619036
};
enum Achievements
{
ACHIEV_QUICK_DEMISE_START_EVENT = 20382,
};
struct boss_volazjAI : public ScriptedAI
{
boss_volazjAI(Creature* pCreature) : ScriptedAI(pCreature),Summons(me)
{
pInstance = pCreature->GetInstanceData();
}
ScriptedInstance *pInstance;
uint32 uiMindFlayTimer;
uint32 uiShadowBoltVolleyTimer;
uint32 uiShiverTimer;
uint32 insanityHandled;
SummonList Summons;
// returns the percentage of health after taking the given damage.
uint32 GetHealthPct(uint32 damage)
{
if (damage > me->GetHealth())
return 0;
return 100*(me->GetHealth()-damage)/me->GetMaxHealth();
}
void DamageTaken(Unit * /*pAttacker*/, uint32 &damage)
{
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
damage = 0;
if ((GetHealthPct(0) >= 66 && GetHealthPct(damage) < 66)||
(GetHealthPct(0) >= 33 && GetHealthPct(damage) < 33))
{
me->InterruptNonMeleeSpells(false);
DoCast(me, SPELL_INSANITY, false);
}
}
void SpellHitTarget(Unit *pTarget, const SpellEntry *spell)
{
if (spell->Id == SPELL_INSANITY)
{
// Not good target or too many players
if (pTarget->GetTypeId() != TYPEID_PLAYER || insanityHandled > 4)
return;
// First target - start channel visual and set self as unnattackable
if (!insanityHandled)
{
// Channel visual
DoCast(me, INSANITY_VISUAL, true);
// Unattackable
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetControlled(true, UNIT_STAT_STUNNED);
}
// phase mask
pTarget->CastSpell(pTarget, SPELL_INSANITY_TARGET+insanityHandled, true);
// summon twisted party members for this target
Map::PlayerList const &players = me->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)
{
Player *plr = i->getSource();
if (!plr || !plr->isAlive())
continue;
// Summon clone
if (Unit *summon = me->SummonCreature(MOB_TWISTED_VISAGE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(),TEMPSUMMON_CORPSE_DESPAWN,0))
{
// required for correct visual
// Fixme: allow mirror image query to send other guid to get rid of minion status
summon->SetUInt64Value(UNIT_FIELD_CREATEDBY, plr->GetGUID());
// clone
plr->CastSpell(summon, SPELL_CLONE_PLAYER, true);
// set phase
summon->SetPhaseMask((1<<(4+insanityHandled)),true);
}
}
++insanityHandled;
}
}
void ResetPlayersPhaseMask()
{
Map::PlayerList const &players = me->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)
{
Player* pPlayer = i->getSource();
pPlayer->RemoveAurasDueToSpell(GetSpellForPhaseMask(pPlayer->GetPhaseMask()));
}
}
void Reset()
{
uiMindFlayTimer = 8*IN_MILISECONDS;
uiShadowBoltVolleyTimer = 5*IN_MILISECONDS;
uiShiverTimer = 15*IN_MILISECONDS;
if (pInstance)
{
pInstance->SetData(DATA_HERALD_VOLAZJ, NOT_STARTED);
pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT);
}
// Visible for all players in insanity
me->SetPhaseMask((1|16|32|64|128|256),true);
// Used for Insanity handling
insanityHandled = 0;
ResetPlayersPhaseMask();
// Cleanup
Summons.DespawnAll();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
{
pInstance->SetData(DATA_HERALD_VOLAZJ, IN_PROGRESS);
pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT);
}
}
void JustSummoned(Creature *summon)
{
Summons.Summon(summon);
}
uint32 GetSpellForPhaseMask(uint32 phase)
{
uint32 spell = 0;
switch (phase)
{
case 16:
spell = SPELL_INSANITY_PHASING_1;
break;
case 32:
spell = SPELL_INSANITY_PHASING_2;
break;
case 64:
spell = SPELL_INSANITY_PHASING_3;
break;
case 128:
spell = SPELL_INSANITY_PHASING_4;
break;
case 256:
spell = SPELL_INSANITY_PHASING_5;
break;
}
return spell;
}
void SummonedCreatureDespawn(Creature *summon)
{
uint32 phase= summon->GetPhaseMask();
uint32 nextPhase = 0;
Summons.Despawn(summon);
// Check if all summons in this phase killed
for (SummonList::const_iterator iter = Summons.begin(); iter != Summons.end(); ++iter)
{
if (Creature *visage = Unit::GetCreature(*me, *iter))
{
// Not all are dead
if (phase == visage->GetPhaseMask())
return;
else
nextPhase = visage->GetPhaseMask();
}
}
// Roll Insanity
uint32 spell = GetSpellForPhaseMask(phase);
uint32 spell2 = GetSpellForPhaseMask(nextPhase);
Map* pMap = me->GetMap();
if (!pMap)
return;
Map::PlayerList const &PlayerList = pMap->GetPlayers();
if (!PlayerList.isEmpty())
{
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
if (Player* pPlayer = i->getSource())
{
if (pPlayer->HasAura(spell))
{
pPlayer->RemoveAurasDueToSpell(spell);
if (spell2) // if there is still some different mask cast spell for it
pPlayer->CastSpell(pPlayer, spell2, true);
}
}
}
}
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (insanityHandled)
{
if (!Summons.empty())
return;
insanityHandled = 0;
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetControlled(false, UNIT_STAT_STUNNED);
me->RemoveAurasDueToSpell(INSANITY_VISUAL);
}
if (uiMindFlayTimer <= diff)
{
DoCast(me->getVictim(), SPELL_MIND_FLAY);
uiMindFlayTimer = 20*IN_MILISECONDS;
} else uiMindFlayTimer -= diff;
if (uiShadowBoltVolleyTimer <= diff)
{
DoCast(me->getVictim(), SPELL_SHADOW_BOLT_VOLLEY);
uiShadowBoltVolleyTimer = 5*IN_MILISECONDS;
} else uiShadowBoltVolleyTimer -= diff;
if (uiShiverTimer <= diff)
{
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_SHIVER);
uiShiverTimer = 15*IN_MILISECONDS;
} else uiShiverTimer -= diff;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH_1, me);
if (pInstance)
pInstance->SetData(DATA_HERALD_VOLAZJ, DONE);
Summons.DespawnAll();
ResetPlayersPhaseMask();
}
void KilledUnit(Unit * /*victim*/)
{
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), me);
}
};
CreatureAI* GetAI_boss_volazj(Creature* pCreature)
{
return new boss_volazjAI (pCreature);
}
void AddSC_boss_volazj()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_volazj";
newscript->GetAI = &GetAI_boss_volazj;
newscript->RegisterSelf();
}
@@ -0,0 +1,588 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* Comment: Complete - BUT THE TRIGGER NEEDS DATA WHETHER THE PRISON OF TALDARAM IS OFFLINE !
*/
#include "ScriptedPch.h"
#include "ahnkahet.h"
enum Yells
{
TEXT_AGGRO = -1619000,
TEXT_SACRIFICE_1_1 = -1619001,
TEXT_SACRIFICE_1_2 = -1619002,
TEXT_SACRIFICE_2_1 = -1619003,
TEXT_SACRIFICE_2_2 = -1619004,
TEXT_SLAY_1 = -1619005,
TEXT_SLAY_2 = -1619006,
TEXT_SLAY_3 = -1619007,
TEXT_DEATH = -1619008,
TEXT_PREACHING_1 = -1619009,
TEXT_PREACHING_2 = -1619010,
TEXT_PREACHING_3 = -1619011,
TEXT_PREACHING_4 = -1619012,
TEXT_PREACHING_5 = -1619013
};
enum Spells
{
SPELL_SPHERE_VISUAL = 56075,
SPELL_GIFT_OF_THE_HERALD = 56219,
SPELL_CYCLONE_STRIKE = 56855, // Self
SPELL_CYCLONE_STRIKE_H = 60030,
SPELL_LIGHTNING_BOLT = 56891, // 40Y
SPELL_LIGHTNING_BOLT_H = 60032, // 40Y
SPELL_THUNDERSHOCK = 56926, // 30Y
SPELL_THUNDERSHOCK_H = 60029 // 30Y
};
enum Creatures
{
NPC_JEDOGA_CONTROLLER = 30181
};
const Position JedogaPosition[2] =
{
{372.330994f, -705.278015f, -0.624178f, 5.427970f},
{372.330994f, -705.278015f, -16.179716f, 5.427970f}
};
struct boss_jedoga_shadowseekerAI : public ScriptedAI
{
boss_jedoga_shadowseekerAI(Creature* c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
bFirstTime = true;
bPreDone = false;
}
ScriptedInstance* pInstance;
uint32 uiOpFerTimer;
uint32 uiCycloneTimer;
uint32 uiBoltTimer;
uint32 uiThunderTimer;
bool bPreDone;
bool bOpFerok;
bool bOnGround;
bool bOpFerokFail;
bool bCanDown;
bool bFirstTime;
void Reset()
{
uiOpFerTimer = urand(15*IN_MILISECONDS,20*IN_MILISECONDS);
uiCycloneTimer = 3*IN_MILISECONDS;
uiBoltTimer = 7*IN_MILISECONDS;
uiThunderTimer = 12*IN_MILISECONDS;
bOpFerok = false;
bOpFerokFail = false;
bOnGround = false;
bCanDown = false;
if (pInstance)
{
if (!bFirstTime)
pInstance->SetData(DATA_JEDOGA_SHADOWSEEKER_EVENT, FAIL);
pInstance->SetData64(DATA_PL_JEDOGA_TARGET, 0);
pInstance->SetData64(DATA_ADD_JEDOGA_OPFER, 0);
pInstance->SetData(DATA_JEDOGA_RESET_INITIANDS, 0);
}
MoveUp();
bFirstTime = false;
}
void EnterCombat(Unit* who)
{
if (!pInstance || (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_JEDOGA_CONTROLLER))
return;
DoScriptText(TEXT_AGGRO, me);
me->SetInCombatWithZone();
pInstance->SetData(DATA_JEDOGA_SHADOWSEEKER_EVENT, IN_PROGRESS);
}
void AttackStart(Unit* who)
{
if (!who || (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_JEDOGA_CONTROLLER))
return;
ScriptedAI::AttackStart(who);
}
void KilledUnit(Unit* Victim)
{
if (!Victim || Victim->GetTypeId() != TYPEID_PLAYER)
return;
DoScriptText(RAND(TEXT_SLAY_1, TEXT_SLAY_2, TEXT_SLAY_3), me);
}
void JustDied(Unit* /*Killer*/)
{
DoScriptText(TEXT_DEATH, me);
if (pInstance)
pInstance->SetData(DATA_JEDOGA_SHADOWSEEKER_EVENT, DONE);
}
void MoveInLineOfSight(Unit* who)
{
if (!pInstance || !who || (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_JEDOGA_CONTROLLER))
return;
if (!bPreDone && who->GetTypeId() == TYPEID_PLAYER && me->GetDistance(who) < 100.0f)
{
DoScriptText(RAND(TEXT_PREACHING_1, TEXT_PREACHING_2, TEXT_PREACHING_3, TEXT_PREACHING_4, TEXT_PREACHING_5), me);
bPreDone = true;
}
if (pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS || !bOnGround)
return;
if (!me->getVictim() && who->isTargetableForAttack() && me->IsHostileTo(who) && who->isInAccessiblePlaceFor(me))
{
float attackRadius = me->GetAttackDistance(who);
if (me->IsWithinDistInMap(who, attackRadius) && me->IsWithinLOSInMap(who))
{
if (!me->getVictim())
{
who->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);
AttackStart(who);
}
else if (me->GetMap()->IsDungeon())
{
who->SetInCombatWith(me);
me->AddThreat(who, 0.0f);
}
}
}
}
void MoveDown()
{
if (!pInstance)
return;
bOpFerokFail = false;
pInstance->SetData(DATA_JEDOGA_TRIGGER_SWITCH, 0);
me->GetMotionMaster()->MovePoint(1, JedogaPosition[1]);
/* me->SetUnitMovementFlags(MOVEMENTFLAG_JUMPING);
me->SendMonsterMove(JedogaPosition[1], MOVEFLAG_JUMP, 0);
me->Relocate(JedogaPosition[1][0], JedogaPosition[1][1], JedogaPosition[1][2], JedogaPosition[1][3]);
me->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE);
*/
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, false);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
me->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
bOnGround = true;
if (UpdateVictim())
{
AttackStart(me->getVictim());
me->GetMotionMaster()->MoveChase(me->getVictim());
}
else
{
if (Unit* pTarget = Unit::GetUnit(*me, pInstance->GetData64(DATA_PL_JEDOGA_TARGET)))
{
AttackStart(pTarget);
pInstance->SetData(DATA_JEDOGA_RESET_INITIANDS, 0);
if (pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS)
EnterCombat(pTarget);
}
else if (!me->isInCombat())
EnterEvadeMode();
}
}
void MoveUp()
{
if (!pInstance)
return;
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
me->AttackStop();
me->RemoveAllAuras();
me->LoadCreaturesAddon();
me->GetMotionMaster()->MovePoint(0, JedogaPosition[0]);
/* me->SetUnitMovementFlags(MOVEMENTFLAG_JUMPING);
me->SendMonsterMove(JedogaPosition[0][0], JedogaPosition[0][1], JedogaPosition[0][2], 0, MOVEFLAG_JUMP, 0);
me->Relocate(JedogaPosition[0][0], JedogaPosition[0][1], JedogaPosition[0][2], JedogaPosition[0][3]);
me->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MoveIdle();
me->StopMoving();
*/
pInstance->SetData(DATA_JEDOGA_TRIGGER_SWITCH, 1);
if (pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) OpferRufen();
bOnGround = false;
uiOpFerTimer = urand(15*IN_MILISECONDS,30*IN_MILISECONDS);
}
void OpferRufen()
{
if (!pInstance)
return;
uint64 opfer = pInstance->GetData64(DATA_ADD_JEDOGA_INITIAND);
if (opfer)
{
DoScriptText(RAND(TEXT_SACRIFICE_1_1, TEXT_SACRIFICE_1_2), me);
pInstance->SetData64(DATA_ADD_JEDOGA_OPFER, opfer);
} else
bCanDown = true;
}
void Opfern()
{
DoScriptText(RAND(TEXT_SACRIFICE_2_1, TEXT_SACRIFICE_2_2), me);
me->InterruptNonMeleeSpells(false);
DoCast(me, SPELL_GIFT_OF_THE_HERALD, false);
bOpFerok = false;
bCanDown = true;
}
void UpdateAI(const uint32 diff)
{
if (!pInstance)
return;
if (pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS && pInstance->GetData(DATA_ALL_INITIAND_DEAD))
MoveDown();
if (bOpFerok && !bOnGround && !bCanDown) Opfern();
if (bOpFerokFail && !bOnGround && !bCanDown)
bCanDown = true;
if (bCanDown)
{
MoveDown();
bCanDown = false;
}
if (bOnGround)
{
if (!UpdateVictim())
return;
if (uiCycloneTimer <= diff)
{
DoCast(me, SPELL_CYCLONE_STRIKE, false);
uiCycloneTimer = urand(15*IN_MILISECONDS,30*IN_MILISECONDS);
} else uiCycloneTimer -= diff;
if (uiBoltTimer <= diff)
{
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
me->CastSpell(pTarget, DUNGEON_MODE(SPELL_LIGHTNING_BOLT, SPELL_LIGHTNING_BOLT_H), false);
uiBoltTimer = urand(15*IN_MILISECONDS,30*IN_MILISECONDS);
} else uiBoltTimer -= diff;
if (uiThunderTimer <= diff)
{
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
me->CastSpell(pTarget, DUNGEON_MODE(SPELL_THUNDERSHOCK, SPELL_THUNDERSHOCK_H), false);
uiThunderTimer = urand(15*IN_MILISECONDS,30*IN_MILISECONDS);
} else uiThunderTimer -= diff;
if (uiOpFerTimer <= diff)
MoveUp();
else
uiOpFerTimer -= diff;
DoMeleeAttackIfReady();
}
}
};
struct mob_jedoga_initiandAI : public ScriptedAI
{
mob_jedoga_initiandAI(Creature* c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
uint32 bCheckTimer;
bool bWalking;
void Reset()
{
if (!pInstance)
return;
bWalking = false;
bCheckTimer = 2*IN_MILISECONDS;
if (pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS)
{
me->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, false);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
}
else
{
DoCast(me, SPELL_SPHERE_VISUAL, false);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
}
}
void JustDied(Unit* Killer)
{
if (!Killer || !pInstance) return;
if (bWalking)
{
Creature* boss = me->GetMap()->GetCreature(pInstance->GetData64(DATA_JEDOGA_SHADOWSEEKER));
if (boss && !CAST_AI(boss_jedoga_shadowseekerAI, boss->AI())->bOpFerok) CAST_AI(boss_jedoga_shadowseekerAI, boss->AI())->bOpFerokFail = true;
if (Killer->GetTypeId() == TYPEID_PLAYER) pInstance->SetData(DATA_INITIAND_KILLED, 1);
pInstance->SetData64(DATA_ADD_JEDOGA_OPFER, 0);
bWalking = false;
}
if (Killer->GetTypeId() == TYPEID_PLAYER) pInstance->SetData64(DATA_PL_JEDOGA_TARGET, Killer->GetGUID());
}
void EnterCombat(Unit* who)
{
if ((pInstance && pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) || !who) return;
}
void AttackStart(Unit* victim)
{
if ((pInstance && pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) || !victim) return;
ScriptedAI::AttackStart(victim);
}
void MoveInLineOfSight(Unit* who)
{
if ((pInstance && pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) || !who) return;
ScriptedAI::MoveInLineOfSight(who);
}
void MovementInform(uint32 uiType, uint32 uiPointId)
{
if (uiType != POINT_MOTION_TYPE || !pInstance) return;
switch(uiPointId)
{
case 1:
{
Creature* boss = me->GetMap()->GetCreature(pInstance->GetData64(DATA_JEDOGA_SHADOWSEEKER));
if (boss)
{
CAST_AI(boss_jedoga_shadowseekerAI, boss->AI())->bOpFerok = true;
CAST_AI(boss_jedoga_shadowseekerAI, boss->AI())->bOpFerokFail = false;
me->Kill(me);
}
}
break;
}
}
void UpdateAI(const uint32 diff)
{
if (pInstance && bCheckTimer <= diff)
{
if (me->GetGUID() == pInstance->GetData64(DATA_ADD_JEDOGA_OPFER) && !bWalking)
{
me->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, false);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
float distance = me->GetDistance(JedogaPosition[1]);
if (distance < 9.0f)
me->SetSpeed(MOVE_WALK, 0.5f, true);
else if (distance < 15.0f)
me->SetSpeed(MOVE_WALK, 0.75f, true);
else if (distance < 20.0f)
me->SetSpeed(MOVE_WALK, 1.0f, true);
me->GetMotionMaster()->Clear(false);
me->GetMotionMaster()->MovePoint(1, JedogaPosition[1]);
bWalking = true;
}
if (!bWalking)
{
if (pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS && me->HasAura(SPELL_SPHERE_VISUAL))
{
me->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, false);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
}
if (pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS && !me->HasAura(SPELL_SPHERE_VISUAL))
{
DoCast(me, SPELL_SPHERE_VISUAL, false);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true);
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
}
}
bCheckTimer = 2*IN_MILISECONDS;
} else bCheckTimer -= diff;
//Return since we have no target
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
};
// ------------------------------------------------------------------------------------------------------------
// Jedogas Aufseher - Entry: 30181
// ------------------------------------------------------------------------------------------------------------
enum AufseherSpell
{
SPELL_BEAM_VISUAL_JEDOGAS_AUFSEHER_1 = 60342,
SPELL_BEAM_VISUAL_JEDOGAS_AUFSEHER_2 = 56312
};
struct npc_jedogas_aufseher_triggerAI : public Scripted_NoMovementAI
{
npc_jedogas_aufseher_triggerAI(Creature* c) : Scripted_NoMovementAI(c)
{
pInstance = c->GetInstanceData();
// c->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686);
// c->setFaction(35);
bRemoved = false;
bRemoved2 = false;
bCasted = false;
bCasted2 = false;
}
ScriptedInstance* pInstance;
bool bRemoved;
bool bRemoved2;
bool bCasted;
bool bCasted2;
void Reset() {}
void EnterCombat(Unit* /*who*/) {}
void AttackStart(Unit* /*victim*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
void UpdateAI(const uint32 /*diff*/)
{
if (!pInstance)
return;
if (!bRemoved && me->GetPositionX() > 440.0f)
{
if (pInstance->GetData(DATA_PRINCE_TALDARAM_EVENT) == DONE)
{
me->InterruptNonMeleeSpells(true);
bRemoved = true;
return;
}
if (!bCasted)
{
DoCast(me, SPELL_BEAM_VISUAL_JEDOGAS_AUFSEHER_1, false);
bCasted = true;
}
}
if (!bRemoved2 && me->GetPositionX() < 440.0f)
{
if (!bCasted2 && pInstance->GetData(DATA_JEDOGA_TRIGGER_SWITCH))
{
DoCast(me, SPELL_BEAM_VISUAL_JEDOGAS_AUFSEHER_2, false);
bCasted2 = true;
}
if (bCasted2 && !pInstance->GetData(DATA_JEDOGA_TRIGGER_SWITCH))
{
me->InterruptNonMeleeSpells(true);
bCasted2 = false;
}
if (!bRemoved2 && pInstance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == DONE)
{
me->InterruptNonMeleeSpells(true);
bRemoved2 = true;
}
}
}
};
CreatureAI* GetAI_boss_jedoga_shadowseeker(Creature* pCreature)
{
return new boss_jedoga_shadowseekerAI (pCreature);
}
CreatureAI* GetAI_mob_jedoga_initiand(Creature* pCreature)
{
return new mob_jedoga_initiandAI (pCreature);
}
CreatureAI* GetAI_npc_jedogas_aufseher_trigger(Creature* pCreature)
{
return new npc_jedogas_aufseher_triggerAI (pCreature);
}
void AddSC_boss_jedoga_shadowseeker()
{
Script* newscript;
newscript = new Script;
newscript->Name = "boss_jedoga_shadowseeker";
newscript->GetAI = &GetAI_boss_jedoga_shadowseeker;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_jedoga_initiand";
newscript->GetAI = &GetAI_mob_jedoga_initiand;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_jedogas_aufseher_trigger";
newscript->GetAI = &GetAI_npc_jedogas_aufseher_trigger;
newscript->RegisterSelf();
}
@@ -0,0 +1,412 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "ahnkahet.h"
enum Spells
{
SPELL_BLOODTHIRST = 55968, //Trigger Spell + add aura
SPELL_CONJURE_FLAME_SPHERE = 55931,
SPELL_FLAME_SPHERE_SUMMON_1 = 55895,// 1x 30106
H_SPELL_FLAME_SPHERE_SUMMON_1 = 59511,// 1x 31686
H_SPELL_FLAME_SPHERE_SUMMON_2 = 59512,// 1x 31687
SPELL_FLAME_SPHERE_SPAWN_EFFECT = 55891,
SPELL_FLAME_SPHERE_VISUAL = 55928,
SPELL_FLAME_SPHERE_PERIODIC = 55926,
H_SPELL_FLAME_SPHERE_PERIODIC = 59508,
SPELL_FLAME_SPHERE_DEATH_EFFECT = 55947,
SPELL_BEAM_VISUAL = 60342,
SPELL_EMBRACE_OF_THE_VAMPYR = 55959,
H_SPELL_EMBRACE_OF_THE_VAMPYR = 59513,
SPELL_VANISH = 55964,
CREATURE_FLAME_SPHERE = 30106,
H_CREATURE_FLAME_SPHERE_1 = 31686,
H_CREATURE_FLAME_SPHERE_2 = 31687
};
enum Misc
{
DATA_EMBRACE_DMG = 20000,
H_DATA_EMBRACE_DMG = 40000,
DATA_SPHERE_DISTANCE = 15
};
#define DATA_SPHERE_ANGLE_OFFSET 0.7
#define DATA_GROUND_POSITION_Z 11.4
enum Yells
{
SAY_AGGRO = -1619021,
SAY_SLAY_1 = -1619022,
SAY_SLAY_2 = -1619023,
SAY_DEATH = -1619024,
SAY_FEED_1 = -1619025,
SAY_FEED_2 = -1619026,
SAY_VANISH_1 = -1619027,
SAY_VANISH_2 = -1619028
};
enum CombatPhase
{
NORMAL,
CASTING_FLAME_SPHERES,
JUST_VANISHED,
VANISHED,
FEEDING
};
enum GameObjects
{
GO_SPHERE1 = 193093,
GO_SPHERE2 = 193094
};
struct boss_taldaramAI : public ScriptedAI
{
boss_taldaramAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
uint32 uiBloodthirstTimer;
uint32 uiVanishTimer;
uint32 uiWaitTimer;
uint32 uiEmbraceTimer;
uint32 uiEmbraceTakenDamage;
uint32 uiFlamesphereTimer;
uint32 uiPhaseTimer;
uint64 uiEmbraceTarget;
CombatPhase Phase;
ScriptedInstance* pInstance;
void Reset()
{
uiBloodthirstTimer = 10*IN_MILISECONDS;
uiVanishTimer = urand(25*IN_MILISECONDS,35*IN_MILISECONDS);
uiEmbraceTimer = 20*IN_MILISECONDS;
uiFlamesphereTimer = 5*IN_MILISECONDS;
uiEmbraceTakenDamage = 0;
Phase = NORMAL;
uiPhaseTimer = 0;
uiEmbraceTarget = 0;
if (pInstance)
pInstance->SetData(DATA_PRINCE_TALDARAM_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
if (pInstance)
pInstance->SetData(DATA_PRINCE_TALDARAM_EVENT, IN_PROGRESS);
DoScriptText(SAY_AGGRO, me);
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (uiPhaseTimer <= diff)
{
switch (Phase)
{
case CASTING_FLAME_SPHERES:
{
Creature* pSpheres[3];
//DoCast(me, SPELL_FLAME_SPHERE_SUMMON_1);
pSpheres[0] = DoSpawnCreature(CREATURE_FLAME_SPHERE, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10*IN_MILISECONDS);
Unit *pSphereTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
if (pSphereTarget && pSpheres[0])
{
float angle,x,y;
angle = pSpheres[0]->GetAngle(pSphereTarget);
x = pSpheres[0]->GetPositionX() + DATA_SPHERE_DISTANCE * cos(angle);
y = pSpheres[0]->GetPositionY() + DATA_SPHERE_DISTANCE * sin(angle);
pSpheres[0]->GetMotionMaster()->MovePoint(0, x, y, pSpheres[0]->GetPositionZ());
}
if (IsHeroic())
{
//DoCast(me, H_SPELL_FLAME_SPHERE_SUMMON_1);
pSpheres[1] = DoSpawnCreature(H_CREATURE_FLAME_SPHERE_1, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10*IN_MILISECONDS);
//DoCast(me, H_SPELL_FLAME_SPHERE_SUMMON_2);
pSpheres[2] = DoSpawnCreature(H_CREATURE_FLAME_SPHERE_2, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10*IN_MILISECONDS);
if (pSphereTarget && pSpheres[1] && pSpheres[2])
{
float angle,x,y;
angle = pSpheres[1]->GetAngle(pSphereTarget) + DATA_SPHERE_ANGLE_OFFSET;
x = pSpheres[1]->GetPositionX() + DATA_SPHERE_DISTANCE/2 * cos(angle);
y = pSpheres[1]->GetPositionY() + DATA_SPHERE_DISTANCE/2 * sin(angle);
pSpheres[1]->GetMotionMaster()->MovePoint(0, x, y, pSpheres[1]->GetPositionZ());
angle = pSpheres[2]->GetAngle(pSphereTarget) - DATA_SPHERE_ANGLE_OFFSET;
x = pSpheres[2]->GetPositionX() + DATA_SPHERE_DISTANCE/2 * cos(angle);
y = pSpheres[2]->GetPositionY() + DATA_SPHERE_DISTANCE/2 * sin(angle);
pSpheres[2]->GetMotionMaster()->MovePoint(0, x, y, pSpheres[2]->GetPositionZ());
}
}
Phase = NORMAL;
uiPhaseTimer = 0;
break;
}
case JUST_VANISHED:
if (Unit *pEmbraceTarget = GetEmbraceTarget())
{
me->GetMotionMaster()->Clear();
me->SetSpeed(MOVE_WALK, 2.0f, true);
me->GetMotionMaster()->MoveChase(pEmbraceTarget);
}
Phase = VANISHED;
uiPhaseTimer = 1300;
break;
case VANISHED:
if (Unit *pEmbraceTarget = GetEmbraceTarget())
DoCast(pEmbraceTarget, SPELL_EMBRACE_OF_THE_VAMPYR);
me->GetMotionMaster()->Clear();
me->SetSpeed(MOVE_WALK, 1.0f, true);
me->GetMotionMaster()->MoveChase(me->getVictim());
Phase = FEEDING;
uiPhaseTimer = 20*IN_MILISECONDS;
break;
case FEEDING:
Phase = NORMAL;
uiPhaseTimer = 0;
uiEmbraceTarget = 0;
break;
case NORMAL:
if (uiBloodthirstTimer <= diff)
{
DoCast(me->getVictim(), SPELL_BLOODTHIRST);
uiBloodthirstTimer = 10*IN_MILISECONDS;
} else uiBloodthirstTimer -= diff;
if (uiFlamesphereTimer <= diff)
{
DoCast(me, SPELL_CONJURE_FLAME_SPHERE);
Phase = CASTING_FLAME_SPHERES;
uiPhaseTimer = 3*IN_MILISECONDS + diff;
uiFlamesphereTimer = 15*IN_MILISECONDS;
} else uiFlamesphereTimer -= diff;
if (uiVanishTimer <= diff)
{
//Count alive players
Unit *pTarget = NULL;
std::list<HostileReference *> t_list = me->getThreatManager().getThreatList();
std::vector<Unit *> target_list;
for (std::list<HostileReference *>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
{
pTarget = Unit::GetUnit(*me, (*itr)->getUnitGuid());
// exclude pets & totems
if (pTarget && pTarget->GetTypeId() == TYPEID_PLAYER && pTarget->isAlive())
target_list.push_back(pTarget);
pTarget = NULL;
}
//He only vanishes if there are 3 or more alive players
if (target_list.size() > 2)
{
DoScriptText(RAND(SAY_VANISH_1,SAY_VANISH_2), me);
DoCast(me, SPELL_VANISH);
Phase = JUST_VANISHED;
uiPhaseTimer = 500;
if (Unit* pEmbraceTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
uiEmbraceTarget = pEmbraceTarget->GetGUID();
}
uiVanishTimer = urand(25*IN_MILISECONDS,35*IN_MILISECONDS);
} else uiVanishTimer -= diff;
DoMeleeAttackIfReady();
break;
}
} else uiPhaseTimer -= diff;
}
void DamageTaken(Unit* /*done_by*/, uint32 &damage)
{
Unit* pEmbraceTarget = GetEmbraceTarget();
if (Phase == FEEDING && pEmbraceTarget && pEmbraceTarget->isAlive())
{
uiEmbraceTakenDamage += damage;
if (uiEmbraceTakenDamage > DUNGEON_MODE(DATA_EMBRACE_DMG, H_DATA_EMBRACE_DMG))
{
Phase = NORMAL;
uiPhaseTimer = 0;
uiEmbraceTarget = 0;
me->CastStop();
}
}
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
pInstance->SetData(DATA_PRINCE_TALDARAM_EVENT, DONE);
}
void KilledUnit(Unit * victim)
{
if (victim == me)
return;
Unit* pEmbraceTarget = GetEmbraceTarget();
if (Phase == FEEDING && pEmbraceTarget && victim == pEmbraceTarget)
{
Phase = NORMAL;
uiPhaseTimer = 0;
uiEmbraceTarget = 0;
}
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
}
bool CheckSpheres()
{
if (!pInstance)
return false;
uint64 uiSphereGuids[2];
uiSphereGuids[0] = pInstance->GetData64(DATA_SPHERE1);
uiSphereGuids[1] = pInstance->GetData64(DATA_SPHERE2);
for (uint8 i=0; i < 2; ++i)
{
GameObject *pSpheres = pInstance->instance->GetGameObject(uiSphereGuids[i]);
if (!pSpheres)
return false;
if (pSpheres->GetGoState() != GO_STATE_ACTIVE)
return false;
}
RemovePrison();
return true;
}
Unit* GetEmbraceTarget()
{
if (!uiEmbraceTarget)
return NULL;
return Unit::GetUnit(*me, uiEmbraceTarget);
}
void RemovePrison()
{
if (!pInstance)
return;
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->RemoveAurasDueToSpell(SPELL_BEAM_VISUAL);
me->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE);
me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), DATA_GROUND_POSITION_Z, me->GetOrientation());
uint64 prison_GUID = pInstance->GetData64(DATA_PRINCE_TALDARAM_PLATFORM);
pInstance->HandleGameObject(prison_GUID,true);
}
};
struct mob_taldaram_flamesphereAI : public ScriptedAI
{
mob_taldaram_flamesphereAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
uint32 uiDespawnTimer;
ScriptedInstance* pInstance;
void Reset()
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
me->setFaction(16);
me->SetFloatValue(OBJECT_FIELD_SCALE_X, 1.0f);
DoCast(me, SPELL_FLAME_SPHERE_VISUAL);
DoCast(me, SPELL_FLAME_SPHERE_SPAWN_EFFECT);
DoCast(me, SPELL_FLAME_SPHERE_PERIODIC);
uiDespawnTimer = 10*IN_MILISECONDS;
}
void EnterCombat(Unit * /*who*/) {}
void MoveInLineOfSight(Unit * /*who*/) {}
void JustDied(Unit* /*who*/)
{
DoCast(me, SPELL_FLAME_SPHERE_DEATH_EFFECT);
}
void UpdateAI(const uint32 diff)
{
if (uiDespawnTimer <= diff)
me->DisappearAndDie();
else
uiDespawnTimer -= diff;
}
};
CreatureAI* GetAI_boss_taldaram(Creature* pCreature)
{
return new boss_taldaramAI (pCreature);
}
CreatureAI* GetAI_mob_taldaram_flamesphere(Creature* pCreature)
{
return new mob_taldaram_flamesphereAI (pCreature);
}
bool GOHello_prince_taldaram_sphere(Player * /*pPlayer*/, GameObject *pGO)
{
ScriptedInstance *pInstance = pGO->GetInstanceData();
Creature *pPrinceTaldaram = Unit::GetCreature(*pGO, pInstance ? pInstance->GetData64(DATA_PRINCE_TALDARAM) : 0);
if (pPrinceTaldaram && pPrinceTaldaram->isAlive())
{
// maybe these are hacks :(
pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
pGO->SetGoState(GO_STATE_ACTIVE);
switch(pGO->GetEntry())
{
case GO_SPHERE1: pInstance->SetData(DATA_SPHERE1_EVENT,IN_PROGRESS); break;
case GO_SPHERE2: pInstance->SetData(DATA_SPHERE2_EVENT,IN_PROGRESS); break;
}
CAST_AI(boss_taldaramAI, pPrinceTaldaram->AI())->CheckSpheres();
}
return true;
}
void AddSC_boss_taldaram()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_taldaram";
newscript->GetAI = &GetAI_boss_taldaram;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_taldaram_flamesphere";
newscript->GetAI = &GetAI_mob_taldaram_flamesphere;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "prince_taldaram_sphere";
newscript->pGOHello = &GOHello_prince_taldaram_sphere;
newscript->RegisterSelf();
}
@@ -0,0 +1,313 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "ahnkahet.h"
/* Ahn'kahet encounters:
0 - Elder Nadox
1 - Prince Taldaram
2 - Jedoga Shadowseeker
3 - Herald Volazj
4 - Amanitar (Heroic only)
*/
#define MAX_ENCOUNTER 5
enum Achievements
{
ACHIEV_VOLUNTEER_WORK = 2056
};
struct instance_ahnkahet : public ScriptedInstance
{
instance_ahnkahet(Map* pMap) : ScriptedInstance(pMap) {Initialize();};
uint64 Elder_Nadox;
uint64 Prince_Taldaram;
uint64 Jedoga_Shadowseeker;
uint64 Herald_Volazj;
uint64 Amanitar;
uint64 Prince_TaldaramSpheres[2];
uint64 Prince_TaldaramPlatform;
uint64 Prince_TaldaramGate;
std::set<uint64> InitiandGUIDs;
uint64 JedogaSacrifices;
uint64 JedogaTarget;
uint32 m_auiEncounter[MAX_ENCOUNTER];
uint32 spheres[2];
uint8 InitiandCnt,
switchtrigger,
initiandkilled;
std::string str_data;
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
InitiandGUIDs.clear();
Elder_Nadox =0;
Prince_Taldaram =0;
Jedoga_Shadowseeker =0;
Herald_Volazj =0;
Amanitar =0;
spheres[0] = NOT_STARTED;
spheres[1] = NOT_STARTED;
InitiandCnt = 0;
switchtrigger = 0;
initiandkilled = 0;
JedogaSacrifices = 0;
JedogaTarget = 0;
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) return true;
return false;
}
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
{
switch(pCreature->GetEntry())
{
case 29309: Elder_Nadox = pCreature->GetGUID(); break;
case 29308: Prince_Taldaram = pCreature->GetGUID(); break;
case 29310: Jedoga_Shadowseeker = pCreature->GetGUID(); break;
case 29311: Herald_Volazj = pCreature->GetGUID(); break;
case 30258: Amanitar = pCreature->GetGUID(); break;
case 30114: InitiandGUIDs.insert(pCreature->GetGUID()); break;
}
}
void OnGameObjectCreate(GameObject* pGo, bool /*add*/)
{
switch(pGo->GetEntry())
{
case 193564: Prince_TaldaramPlatform = pGo->GetGUID();
if (m_auiEncounter[1] == DONE) HandleGameObject(NULL,true,pGo); break;
case 193093: Prince_TaldaramSpheres[0] = pGo->GetGUID();
if (spheres[0] == IN_PROGRESS)
{
pGo->SetGoState(GO_STATE_ACTIVE);
pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
}
else pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
break;
case 193094: Prince_TaldaramSpheres[1] = pGo->GetGUID();
if (spheres[1] == IN_PROGRESS)
{
pGo->SetGoState(GO_STATE_ACTIVE);
pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
}
else pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
break;
case 192236: Prince_TaldaramGate = pGo->GetGUID(); // Web gate past Prince Taldaram
if (m_auiEncounter[1] == DONE)HandleGameObject(NULL,true,pGo);break;
}
}
void SetData64(uint32 idx, uint64 guid)
{
switch(idx)
{
case DATA_ADD_JEDOGA_OPFER: JedogaSacrifices = guid; break;
case DATA_PL_JEDOGA_TARGET: JedogaTarget = guid; break;
}
}
uint64 GetData64(uint32 identifier)
{
switch(identifier)
{
case DATA_ELDER_NADOX: return Elder_Nadox;
case DATA_PRINCE_TALDARAM: return Prince_Taldaram;
case DATA_JEDOGA_SHADOWSEEKER: return Jedoga_Shadowseeker;
case DATA_HERALD_VOLAZJ: return Herald_Volazj;
case DATA_AMANITAR: return Amanitar;
case DATA_SPHERE1: return Prince_TaldaramSpheres[0];
case DATA_SPHERE2: return Prince_TaldaramSpheres[1];
case DATA_PRINCE_TALDARAM_PLATFORM: return Prince_TaldaramPlatform;
case DATA_ADD_JEDOGA_INITIAND:
{
std::vector<uint64> vInitiands;
vInitiands.clear();
for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
{
Creature* cr = instance->GetCreature(*itr);
if (cr && cr->isAlive())
vInitiands.push_back(*itr);
}
if (vInitiands.empty())
return 0;
uint8 j = urand(0,vInitiands.size() -1);
return vInitiands[j];
}
case DATA_ADD_JEDOGA_OPFER: return JedogaSacrifices;
case DATA_PL_JEDOGA_TARGET: return JedogaTarget;
}
return 0;
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
case DATA_ELDER_NADOX_EVENT: m_auiEncounter[0] = data; break;
case DATA_PRINCE_TALDARAM_EVENT:
if (data == DONE)
HandleGameObject(Prince_TaldaramGate,true);
m_auiEncounter[1] = data;
break;
case DATA_JEDOGA_SHADOWSEEKER_EVENT:
m_auiEncounter[2] = data;
if (data == DONE)
{
for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
{
Creature* cr = instance->GetCreature(*itr);
if (cr && cr->isAlive())
{
cr->SetVisibility(VISIBILITY_OFF);
cr->setDeathState(JUST_DIED);
cr->RemoveCorpse();
}
}
if (!initiandkilled && instance->IsHeroic())
DoCompleteAchievement(ACHIEV_VOLUNTEER_WORK);
}
break;
case DATA_HERALD_VOLAZJ_EVENT: m_auiEncounter[3] = data; break;
case DATA_AMANITAR_EVENT: m_auiEncounter[4] = data; break;
case DATA_SPHERE1_EVENT: spheres[0] = data; break;
case DATA_SPHERE2_EVENT: spheres[1] = data; break;
case DATA_JEDOGA_TRIGGER_SWITCH: switchtrigger = data; break;
case DATA_INITIAND_KILLED: initiandkilled = data; break;
case DATA_JEDOGA_RESET_INITIANDS:
for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
{
Creature* cr = instance->GetCreature(*itr);
if (cr)
{
cr->Respawn();
if (!cr->IsInEvadeMode()) cr->AI()->EnterEvadeMode();
}
}
break;
}
if (data == DONE)
SaveToDB();
}
uint32 GetData(uint32 type)
{
switch(type)
{
case DATA_ELDER_NADOX_EVENT: return m_auiEncounter[0];
case DATA_PRINCE_TALDARAM_EVENT: return m_auiEncounter[1];
case DATA_JEDOGA_SHADOWSEEKER_EVENT: return m_auiEncounter[2];
case DATA_HERALD_VOLAZJ: return m_auiEncounter[3];
case DATA_AMANITAR_EVENT: return m_auiEncounter[4];
case DATA_SPHERE1_EVENT: return spheres[0];
case DATA_SPHERE2_EVENT: return spheres[1];
case DATA_ALL_INITIAND_DEAD:
for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr)
{
Creature* cr = instance->GetCreature(*itr);
if (!cr || (cr && cr->isAlive())) return 0;
}
return 1;
case DATA_JEDOGA_TRIGGER_SWITCH: return switchtrigger;
case DATA_INITIAND_KILLED: return initiandkilled;
}
return 0;
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "A K " << m_auiEncounter[0] << " " << m_auiEncounter[1] << " "
<< m_auiEncounter[2] << " " << m_auiEncounter[3] << " " << m_auiEncounter[4] << " "
<< spheres[0] << " " << spheres[1];
str_data = saveStream.str();
OUT_SAVE_INST_DATA_COMPLETE;
return str_data;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
uint16 data0, data1, data2, data3, data4, data5, data6;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4 >> data5 >> data6;
if (dataHead1 == 'A' && dataHead2 == 'K')
{
m_auiEncounter[0] = data0;
m_auiEncounter[1] = data1;
m_auiEncounter[2] = data2;
m_auiEncounter[3] = data3;
m_auiEncounter[4] = data4;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
m_auiEncounter[i] = NOT_STARTED;
spheres[0] = data5;
spheres[1] = data6;
} else OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
InstanceData* GetInstanceData_instance_ahnkahet(Map* pMap)
{
return new instance_ahnkahet(pMap);
}
void AddSC_instance_ahnkahet()
{
Script *newscript;
newscript = new Script;
newscript->Name = "instance_ahnkahet";
newscript->GetInstanceData = &GetInstanceData_instance_ahnkahet;
newscript->RegisterSelf();
}
@@ -0,0 +1,38 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef DEF_AZJOL_NERUB_H
#define DEF_AZJOL_NERUB_H
enum Data64
{
DATA_KRIKTHIR_THE_GATEWATCHER,
DATA_HADRONOX,
DATA_ANUBARAK,
DATA_WATCHER_GASHRA,
DATA_WATCHER_SILTHIK,
DATA_WATCHER_NARJIL
};
enum Data
{
DATA_KRIKTHIR_THE_GATEWATCHER_EVENT,
DATA_HADRONOX_EVENT,
DATA_ANUBARAK_EVENT
};
#endif
@@ -0,0 +1,360 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "azjol_nerub.h"
//SQL: UPDATE creature_template SET mechanic_immune_mask = 1073741823 WHERE name like "anub'arak%";
enum Spells
{
SPELL_CARRION_BEETLES = 53520,
SPELL_SUMMON_CARRION_BEETLES = 53521,
SPELL_LEECHING_SWARM = 53467,
SPELL_POUND = 53472,
SPELL_POUND_H = 59433,
SPELL_SUBMERGE = 53421,
SPELL_IMPALE_DMG = 53454,
SPELL_IMPALE_DMG_H = 59446,
SPELL_IMPALE_SHAKEGROUND = 53455,
SPELL_IMPALE_SPIKE = 53539, //this is not the correct visual effect
//SPELL_IMPALE_TARGET = 53458,
};
enum Creatures
{
CREATURE_GUARDIAN = 29216,
CREATURE_VENOMANCER = 29217,
CREATURE_DATTER = 29213,
CREATURE_IMPALE_TARGET = 89,
DISPLAY_INVISIBLE = 11686
};
// not in db
enum Yells
{
SAY_INTRO = -1601010,
SAY_AGGRO = -1601000,
SAY_SLAY_1 = -1601001,
SAY_SLAY_2 = -1601002,
SAY_SLAY_3 = -1601003,
SAY_LOCUST_1 = -1601005,
SAY_LOCUST_2 = -1601006,
SAY_LOCUST_3 = -1601007,
SAY_SUBMERGE_1 = -1601008,
SAY_SUBMERGE_2 = -1601009,
SAY_DEATH = -1601004
};
enum
{
ACHIEV_TIMED_START_EVENT = 20381,
};
enum Phases
{
PHASE_MELEE = 0,
PHASE_UNDERGROUND = 1,
IMPALE_PHASE_TARGET = 0,
IMPALE_PHASE_ATTACK = 1,
IMPALE_PHASE_DMG = 2
};
const Position SpawnPoint[2] =
{
{ 550.7, 282.8, 224.3 },
{ 551.1, 229.4, 224.3 },
};
const Position SpawnPointGuardian[2] =
{
{ 550.348633, 316.006805, 234.2947 },
{ 550.188660, 324.264557, 237.7412 },
};
struct boss_anub_arakAI : public ScriptedAI
{
boss_anub_arakAI(Creature *c) : ScriptedAI(c), lSummons(me)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance *pInstance;
bool bChanneling;
bool bGuardianSummoned;
bool bVenomancerSummoned;
bool bDatterSummoned;
uint8 uiPhase;
uint32 uiUndergroundPhase;
uint32 uiCarrionBeetlesTimer;
uint32 uiLeechingSwarmTimer;
uint32 uiPoundTimer;
uint32 uiSubmergeTimer;
uint32 uiUndergroundTimer;
uint32 uiVenomancerTimer;
uint32 uiDatterTimer;
uint32 uiImpaleTimer;
uint32 uiImpalePhase;
uint64 uiImpaleTarget;
SummonList lSummons;
void Reset()
{
uiCarrionBeetlesTimer = 8*IN_MILISECONDS;
uiLeechingSwarmTimer = 20*IN_MILISECONDS;
uiImpaleTimer = 9*IN_MILISECONDS;
uiPoundTimer = 15*IN_MILISECONDS;
uiPhase = PHASE_MELEE;
uiUndergroundPhase = 0;
bChanneling = false;
uiImpalePhase = IMPALE_PHASE_TARGET;
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
me->RemoveAura(SPELL_SUBMERGE);
lSummons.DespawnAll();
if (pInstance)
{
pInstance->SetData(DATA_ANUBARAK_EVENT, NOT_STARTED);
pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
}
Creature* DoSummonImpaleTarget(Unit *pTarget)
{
Position targetPos;
pTarget->GetPosition(&targetPos);
if (TempSummon* pImpaleTarget = me->SummonCreature(CREATURE_IMPALE_TARGET, targetPos, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 6*IN_MILISECONDS))
{
uiImpaleTarget = pImpaleTarget->GetGUID();
pImpaleTarget->SetReactState(REACT_PASSIVE);
pImpaleTarget->SetDisplayId(DISPLAY_INVISIBLE);
pImpaleTarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE|UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
return pImpaleTarget;
}
return NULL;
}
void EnterCombat(Unit * /*pWho*/)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
{
pInstance->SetData(DATA_ANUBARAK_EVENT, IN_PROGRESS);
pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
switch (uiPhase)
{
case PHASE_UNDERGROUND:
if (uiImpaleTimer <= diff)
{
switch(uiImpalePhase)
{
case IMPALE_PHASE_TARGET:
if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{
if (Creature *pImpaleTarget = DoSummonImpaleTarget(target))
pImpaleTarget->CastSpell(pImpaleTarget, SPELL_IMPALE_SHAKEGROUND, true);
uiImpaleTimer = 3*IN_MILISECONDS;
uiImpalePhase = IMPALE_PHASE_ATTACK;
}
break;
case IMPALE_PHASE_ATTACK:
if (Creature* pImpaleTarget = Unit::GetCreature(*me, uiImpaleTarget))
{
pImpaleTarget->CastSpell(pImpaleTarget, SPELL_IMPALE_SPIKE, false);
pImpaleTarget->RemoveAurasDueToSpell(SPELL_IMPALE_SHAKEGROUND);
}
uiImpalePhase = IMPALE_PHASE_DMG;
uiImpaleTimer = 1*IN_MILISECONDS;
break;
case IMPALE_PHASE_DMG:
if (Creature* pImpaleTarget = Unit::GetCreature(*me, uiImpaleTarget))
me->CastSpell(pImpaleTarget, DUNGEON_MODE(SPELL_IMPALE_DMG, SPELL_IMPALE_DMG_H), true);
uiImpalePhase = IMPALE_PHASE_TARGET;
uiImpaleTimer = 9*IN_MILISECONDS;
break;
}
} else uiImpaleTimer -= diff;
if (!bGuardianSummoned)
{
for (uint8 i = 0; i < 2; ++i)
{
if (Creature *Guardian = me->SummonCreature(CREATURE_GUARDIAN,SpawnPointGuardian[i],TEMPSUMMON_CORPSE_DESPAWN,0))
{
Guardian->AddThreat(me->getVictim(), 0.0f);
DoZoneInCombat(Guardian);
}
}
bGuardianSummoned = true;
}
if (!bVenomancerSummoned)
{
if (uiVenomancerTimer <= diff)
{
if (uiUndergroundPhase > 1)
{
for (uint8 i = 0; i < 2; ++i)
{
if (Creature *Venomancer = me->SummonCreature(CREATURE_VENOMANCER,SpawnPoint[i],TEMPSUMMON_CORPSE_DESPAWN,0))
{
Venomancer->AddThreat(me->getVictim(), 0.0f);
DoZoneInCombat(Venomancer);
}
}
bVenomancerSummoned = true;
}
} else uiVenomancerTimer -= diff;
}
if (!bDatterSummoned)
{
if (uiDatterTimer <= diff)
{
if (uiUndergroundPhase > 2)
{
for (uint8 i = 0; i < 2; ++i)
{
if (Creature *Datter = me->SummonCreature(CREATURE_DATTER,SpawnPoint[i],TEMPSUMMON_CORPSE_DESPAWN,0))
{
Datter->AddThreat(me->getVictim(), 0.0f);
DoZoneInCombat(Datter);
}
}
bDatterSummoned = true;
}
} else uiDatterTimer -= diff;
}
if (uiUndergroundTimer <= diff)
{
me->RemoveAura(SPELL_SUBMERGE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
uiPhase = PHASE_MELEE;
} else uiUndergroundTimer -= diff;
break;
case PHASE_MELEE:
if (((uiUndergroundPhase == 0 && HealthBelowPct(75))
|| (uiUndergroundPhase == 1 && HealthBelowPct(50))
|| (uiUndergroundPhase == 2 && HealthBelowPct(25)))
&& !me->hasUnitState(UNIT_STAT_CASTING))
{
bGuardianSummoned = false;
bVenomancerSummoned = false;
bDatterSummoned = false;
uiUndergroundTimer = 40*IN_MILISECONDS;
uiVenomancerTimer = 25*IN_MILISECONDS;
uiDatterTimer = 32*IN_MILISECONDS;
uiImpalePhase = 0;
uiImpaleTimer = 9*IN_MILISECONDS;
DoCast(me, SPELL_SUBMERGE, false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
uiPhase = PHASE_UNDERGROUND;
++uiUndergroundPhase;
}
if (bChanneling == true)
{
for (uint8 i = 0; i < 8; ++i)
DoCast(me->getVictim(), SPELL_SUMMON_CARRION_BEETLES, true);
bChanneling = false;
}
else if (uiCarrionBeetlesTimer <= diff)
{
bChanneling = true;
DoCastVictim(SPELL_CARRION_BEETLES);
uiCarrionBeetlesTimer = 25*IN_MILISECONDS;
} else uiCarrionBeetlesTimer -= diff;
if (uiLeechingSwarmTimer <= diff)
{
DoCast(me, SPELL_LEECHING_SWARM, true);
uiLeechingSwarmTimer = 19*IN_MILISECONDS;
} else uiLeechingSwarmTimer -= diff;
if (uiPoundTimer <= diff)
{
if (Unit *target = me->getVictim())
{
if (Creature *pImpaleTarget = DoSummonImpaleTarget(target))
me->CastSpell(pImpaleTarget, DUNGEON_MODE(SPELL_POUND, SPELL_POUND_H), false);
}
uiPoundTimer = 16.5*IN_MILISECONDS;
} else uiPoundTimer -= diff;
DoMeleeAttackIfReady();
break;
}
}
void JustDied(Unit * /*pKiller*/)
{
DoScriptText(SAY_DEATH, me);
lSummons.DespawnAll();
if (pInstance)
pInstance->SetData(DATA_ANUBARAK_EVENT, DONE);
}
void KilledUnit(Unit *pVictim)
{
if (pVictim == me)
return;
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), me);
}
void JustSummoned(Creature* summon)
{
lSummons.Summon(summon);
}
};
CreatureAI* GetAI_boss_anub_arak(Creature *pCreature)
{
return new boss_anub_arakAI (pCreature);
}
void AddSC_boss_anub_arak()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_anub_arak";
newscript->GetAI = &GetAI_boss_anub_arak;
newscript->RegisterSelf();
}
@@ -0,0 +1,206 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* Comment: No Waves atm and the doors spells are crazy...
*
* When your group enters the main room (the one after the bridge), you will notice a group of 3 Nerubians.
* When you engage them, 2 more groups like this one spawn behind the first one - it is important to pull the first group back,
* so you don't aggro all 3. Hadronox will be under you, fighting Nerubians.
*
* This is the timed gauntlet - waves of non-elite spiders
* will spawn from the 3 doors located a little above the main room, and will then head down to fight Hadronox. After clearing the
* main room, it is recommended to just stay in it, kill the occasional non-elites that will attack you instead of the boss, and wait for
* Hadronox to make his way to you. When Hadronox enters the main room, she will web the doors, and no more non-elites will spawn.
*/
#include "ScriptedPch.h"
#include "azjol_nerub.h"
enum Spells
{
SPELL_ACID_CLOUD = 53400, // Victim
SPELL_LEECH_POISON = 53030, // Victim
SPELL_PIERCE_ARMOR = 53418, // Victim
SPELL_WEB_GRAB = 57731, // Victim
SPELL_WEB_FRONT_DOORS = 53177, // Self
SPELL_WEB_SIDE_DOORS = 53185, // Self
H_SPELL_ACID_CLOUD = 59419,
H_SPELL_LEECH_POISON = 59417,
H_SPELL_WEB_GRAB = 59421
};
struct boss_hadronoxAI : public ScriptedAI
{
boss_hadronoxAI(Creature* c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
fMaxDistance = 50.0f;
bFirstTime = true;
}
ScriptedInstance* pInstance;
uint32 uiAcidTimer;
uint32 uiLeechTimer;
uint32 uiPierceTimer;
uint32 uiGrabTimer;
uint32 uiDoorsTimer;
uint32 uiCheckDistanceTimer;
bool bFirstTime;
float fMaxDistance;
void Reset()
{
me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 9.0f);
me->SetFloatValue(UNIT_FIELD_COMBATREACH, 9.0f);
uiAcidTimer = urand(10*IN_MILISECONDS,14*IN_MILISECONDS);
uiLeechTimer = urand(3*IN_MILISECONDS,9*IN_MILISECONDS);
uiPierceTimer = urand(1*IN_MILISECONDS,3*IN_MILISECONDS);
uiGrabTimer = urand(15*IN_MILISECONDS,19*IN_MILISECONDS);
uiDoorsTimer = urand(20*IN_MILISECONDS,30*IN_MILISECONDS);
uiCheckDistanceTimer = 2*IN_MILISECONDS;
if (pInstance && (pInstance->GetData(DATA_HADRONOX_EVENT) != DONE && !bFirstTime))
pInstance->SetData(DATA_HADRONOX_EVENT, FAIL);
bFirstTime = false;
}
//when Hadronox kills any enemy (that includes a party member) she will regain 10% of her HP if the target had Leech Poison on
void KilledUnit(Unit* Victim)
{
// not sure if this aura check is correct, I think it is though
if (!Victim || !Victim->HasAura(DUNGEON_MODE(SPELL_LEECH_POISON, H_SPELL_LEECH_POISON)) || !me->isAlive())
return;
uint32 health = me->GetMaxHealth()/10;
if ((me->GetHealth()+health) >= me->GetMaxHealth())
me->SetHealth(me->GetMaxHealth());
else
me->SetHealth(me->GetHealth()+health);
}
void JustDied(Unit* /*Killer*/)
{
if (pInstance)
pInstance->SetData(DATA_HADRONOX_EVENT, DONE);
}
void EnterCombat(Unit* /*who*/)
{
if (pInstance)
pInstance->SetData(DATA_HADRONOX_EVENT, IN_PROGRESS);
me->SetInCombatWithZone();
}
void CheckDistance(float dist, const uint32 uiDiff)
{
if (!me->isInCombat())
return;
float x=0.0f, y=0.0f, z=0.0f;
me->GetRespawnCoord(x,y,z);
if (uiCheckDistanceTimer <= uiDiff)
uiCheckDistanceTimer = 5*IN_MILISECONDS;
else
{
uiCheckDistanceTimer -= uiDiff;
return;
}
if (me->IsInEvadeMode() || !me->getVictim())
return;
if (me->GetDistance(x,y,z) > dist)
EnterEvadeMode();
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim()) return;
// Without he comes up through the air to players on the bridge after krikthir if players crossing this bridge!
CheckDistance(fMaxDistance, diff);
if (me->HasAura(SPELL_WEB_FRONT_DOORS) || me->HasAura(SPELL_WEB_SIDE_DOORS))
{
if (IsCombatMovement())
SetCombatMovement(false);
}
else if (!IsCombatMovement())
SetCombatMovement(true);
if (uiPierceTimer <= diff)
{
DoCast(me->getVictim(), SPELL_PIERCE_ARMOR);
uiPierceTimer = 8*IN_MILISECONDS;
} else uiPierceTimer -= diff;
if (uiAcidTimer <= diff)
{
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
DoCast(pTarget, SPELL_ACID_CLOUD);
uiAcidTimer = urand(20*IN_MILISECONDS,30*IN_MILISECONDS);
} else uiAcidTimer -= diff;
if (uiLeechTimer <= diff)
{
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
DoCast(pTarget, SPELL_LEECH_POISON);
uiLeechTimer = urand(11*IN_MILISECONDS,14*IN_MILISECONDS);
} else uiLeechTimer -= diff;
if (uiGrabTimer <= diff)
{
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) // Draws all players (and attacking Mobs) to itself.
DoCast(pTarget, SPELL_WEB_GRAB);
uiGrabTimer = urand(15*IN_MILISECONDS,30*IN_MILISECONDS);
} else uiGrabTimer -= diff;
if (uiDoorsTimer <= diff)
{
//DoCast(me, RAND(SPELL_WEB_FRONT_DOORS, SPELL_WEB_SIDE_DOORS));
uiDoorsTimer = urand(30*IN_MILISECONDS,60*IN_MILISECONDS);
} else uiDoorsTimer -= diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_hadronox(Creature* pCreature)
{
return new boss_hadronoxAI (pCreature);
}
void AddSC_boss_hadronox()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_hadronox";
newscript->GetAI = &GetAI_boss_hadronox;
newscript->RegisterSelf();
}
@@ -0,0 +1,553 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* Comment: Find in the future best timers and the event is not implemented.
*/
#include "ScriptedPch.h"
#include "azjol_nerub.h"
enum Spells
{
SPELL_MIND_FLAY = 52586,
H_SPELL_MIND_FLAY = 59367,
SPELL_CURSE_OF_FATIGUE = 52592,
H_SPELL_CURSE_OF_FATIGUE = 59368,
SPELL_FRENZY = 28747, //maybe 53361
SPELL_SUMMON_SKITTERING_SWARMER = 52438, //AOE Effect 140, maybe 52439
SPELL_SUMMON_SKITTERING_SWARMER_1 = 52439, //Summon 3x 28735
H_SPELL_ACID_SPLASH = 59363,
SPELL_ACID_SPLASH = 52446,
SPELL_CHARGE = 16979,//maybe is another spell
SPELL_BACKSTAB = 52540,
SPELL_SHADOW_BOLT = 52534,
H_SPELL_SHADOW_BOLT = 59357,
SPELL_SHADOW_NOVA = 52535,
H_SPELL_SHADOW_NOVA = 59358,
SPELL_STRIKE = 52532,
SPELL_CLEAVE = 49806,
SPELL_ENRAGE = 52470,
SPELL_INFECTED_BITE = 52469,
H_SPELL_INFECTED_BITE = 59364,
SPELL_WEB_WRAP = 52086,//the spell is not working properly
SPELL_BLINDING_WEBS = 52524,
H_SPELL_BLINDING_WEBS = 59365,
SPELL_POSION_SPRAY = 52493,
H_SPELL_POSION_SPRAY = 59366
};
enum Mobs
{
MOB_SKITTERING_SWARMER = 28735,
MOB_SKITTERING_SWARMER_CONTROLLER = 32593,
MOB_SKITTERING_INFECTIOR = 28736
};
enum Yells
{
SAY_AGGRO = -1601011,
SAY_SLAY_1 = -1601012,
SAY_SLAY_2 = -1601013,
SAY_DEATH = -1601014,
//Not in db
SAY_SEND_GROUP_1 = -1601020,
SAY_SEND_GROUP_2 = -1601021,
SAY_SEND_GROUP_3 = -1601022,
SAY_SWARM_1 = -1601015,
SAY_SWARM_2 = -1601016,
SAY_PREFIGHT_1 = -1601017,
SAY_PREFIGHT_2 = -1601018,
SAY_PREFIGHT_3 = -1601019
};
enum Misc
{
ACHIEV_WATH_HIM_DIE = 1296
};
const Position SpawnPoint[] =
{
{ 566.164, 682.087, 769.079, 2.21657 },
{ 529.042, 706.941, 777.298, 1.0821 },
{ 489.975, 671.239, 772.131, 0.261799 },
{ 488.556, 692.95, 771.764, 4.88692 },
{ 553.34, 640.387, 777.419, 1.20428 },
{ 517.486, 706.398, 777.335, 5.35816 },
{ 504.01, 637.693, 777.479, 0.506145 },
{ 552.625, 706.408, 777.177, 3.4383 }
};
struct boss_krik_thirAI : public ScriptedAI
{
boss_krik_thirAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
uint32 uiMindFlayTimer;
uint32 uiCurseFatigueTimer;
uint32 uiSummonTimer;
void Reset()
{
uiMindFlayTimer = 15*IN_MILISECONDS;
uiCurseFatigueTimer = 12*IN_MILISECONDS;
if (pInstance)
pInstance->SetData(DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
Summon();
uiSummonTimer = 15*IN_MILISECONDS;
if (pInstance)
pInstance->SetData(DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, IN_PROGRESS);
}
void Summon()
{
me->SummonCreature(MOB_SKITTERING_SWARMER,SpawnPoint[0],TEMPSUMMON_TIMED_DESPAWN,25*IN_MILISECONDS);
me->SummonCreature(MOB_SKITTERING_SWARMER,SpawnPoint[0],TEMPSUMMON_TIMED_DESPAWN,25*IN_MILISECONDS);
me->SummonCreature(MOB_SKITTERING_SWARMER,SpawnPoint[1],TEMPSUMMON_TIMED_DESPAWN,25*IN_MILISECONDS);
me->SummonCreature(MOB_SKITTERING_SWARMER,SpawnPoint[1],TEMPSUMMON_TIMED_DESPAWN,25*IN_MILISECONDS);
me->SummonCreature(MOB_SKITTERING_SWARMER,SpawnPoint[2],TEMPSUMMON_TIMED_DESPAWN,25*IN_MILISECONDS);
me->SummonCreature(MOB_SKITTERING_SWARMER,SpawnPoint[2],TEMPSUMMON_TIMED_DESPAWN,25*IN_MILISECONDS);
me->SummonCreature(MOB_SKITTERING_SWARMER,SpawnPoint[3],TEMPSUMMON_TIMED_DESPAWN,25*IN_MILISECONDS);
me->SummonCreature(MOB_SKITTERING_SWARMER,SpawnPoint[3],TEMPSUMMON_TIMED_DESPAWN,25*IN_MILISECONDS);
me->SummonCreature(MOB_SKITTERING_INFECTIOR,SpawnPoint[4],TEMPSUMMON_TIMED_DESPAWN,25*IN_MILISECONDS);
me->SummonCreature(MOB_SKITTERING_SWARMER,SpawnPoint[4],TEMPSUMMON_TIMED_DESPAWN,25*IN_MILISECONDS);
me->SummonCreature(MOB_SKITTERING_INFECTIOR,SpawnPoint[5],TEMPSUMMON_TIMED_DESPAWN,25*IN_MILISECONDS);
me->SummonCreature(MOB_SKITTERING_SWARMER,SpawnPoint[5],TEMPSUMMON_TIMED_DESPAWN,25*IN_MILISECONDS);
me->SummonCreature(MOB_SKITTERING_INFECTIOR,SpawnPoint[6],TEMPSUMMON_TIMED_DESPAWN,25*IN_MILISECONDS);
me->SummonCreature(MOB_SKITTERING_SWARMER,SpawnPoint[6],TEMPSUMMON_TIMED_DESPAWN,25*IN_MILISECONDS);
me->SummonCreature(MOB_SKITTERING_SWARMER,SpawnPoint[7],TEMPSUMMON_TIMED_DESPAWN,25*IN_MILISECONDS);
me->SummonCreature(MOB_SKITTERING_SWARMER,SpawnPoint[7],TEMPSUMMON_TIMED_DESPAWN,25*IN_MILISECONDS);
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (uiSummonTimer <= diff)
{
Summon();
uiSummonTimer = 15*IN_MILISECONDS;
} else uiSummonTimer -= diff;
if (uiMindFlayTimer <= diff)
{
DoCast(me->getVictim(), SPELL_MIND_FLAY);
uiMindFlayTimer = 15*IN_MILISECONDS;
} else uiMindFlayTimer -= diff;
if (uiCurseFatigueTimer <= diff)
{
//WowWiki say "Curse of Fatigue-Kirk'thir will cast Curse of Fatigue on 2-3 targets periodically."
Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
Unit *pTarget_1 = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true);
DoCast(pTarget, SPELL_CURSE_OF_FATIGUE);
DoCast(pTarget_1, SPELL_CURSE_OF_FATIGUE);
uiCurseFatigueTimer = 10*IN_MILISECONDS;
} else uiCurseFatigueTimer -= diff;
if (!me->HasAura(SPELL_FRENZY) && HealthBelowPct(10))
DoCast(me, SPELL_FRENZY, true);
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
if (!pInstance)
return;
pInstance->SetData(DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, DONE);
//Achievement: Watch him die
Creature *pAdd = Unit::GetCreature(*me, pInstance->GetData64(DATA_WATCHER_GASHRA));
if (!pAdd || !pAdd->isAlive())
return;
pAdd = Unit::GetCreature(*me, pInstance->GetData64(DATA_WATCHER_SILTHIK));
if (!pAdd || !pAdd->isAlive())
return;
pAdd = Unit::GetCreature(*me, pInstance->GetData64(DATA_WATCHER_NARJIL));
if (!pAdd || !pAdd->isAlive())
return;
pInstance->DoCompleteAchievement(ACHIEV_WATH_HIM_DIE);
}
void KilledUnit(Unit * victim)
{
if (victim == me)
return;
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
}
void JustSummoned(Creature* summoned)
{
summoned->GetMotionMaster()->MovePoint(0,me->GetPositionX(),me->GetPositionY(),me->GetPositionZ());
}
};
struct npc_skittering_infectorAI : public ScriptedAI
{
npc_skittering_infectorAI(Creature *c) : ScriptedAI(c) {}
void JustDied(Unit* /*killer*/)
{
//The spell is not working propperly
DoCast(me->getVictim(),SPELL_ACID_SPLASH, true);
}
};
struct npc_anub_ar_skirmisherAI : public ScriptedAI
{
npc_anub_ar_skirmisherAI(Creature *c) : ScriptedAI(c) {}
uint32 uiChargeTimer;
uint32 uiBackstabTimer;
void Reset()
{
uiChargeTimer = 11*IN_MILISECONDS;
uiBackstabTimer = 7*IN_MILISECONDS;
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (uiChargeTimer <= diff)
{
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{
DoResetThreat();
me->AddThreat(pTarget,1.0f);
DoCast(pTarget, SPELL_CHARGE, true);
}
uiChargeTimer = 15*IN_MILISECONDS;
} else uiChargeTimer -= diff;
if (uiBackstabTimer <= diff)
{
DoCast(me->getVictim(), SPELL_BACKSTAB);
uiBackstabTimer = 12*IN_MILISECONDS;
} else uiBackstabTimer -= diff;
DoMeleeAttackIfReady();
}
};
struct npc_anub_ar_shadowcasterAI : public ScriptedAI
{
npc_anub_ar_shadowcasterAI(Creature *c) : ScriptedAI(c) {}
uint32 uiShadowBoltTimer;
uint32 uiShadowNovaTimer;
void Reset()
{
uiShadowBoltTimer = 6*IN_MILISECONDS;
uiShadowNovaTimer = 15*IN_MILISECONDS;
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (uiShadowBoltTimer <= diff)
{
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
DoCast(pTarget, SPELL_SHADOW_BOLT, true);
uiShadowBoltTimer = 15*IN_MILISECONDS;
} else uiShadowBoltTimer -= diff;
if (uiShadowNovaTimer <= diff)
{
DoCast(me->getVictim(), SPELL_SHADOW_NOVA, true);
uiShadowNovaTimer = 17*IN_MILISECONDS;
} else uiShadowNovaTimer -= diff;
DoMeleeAttackIfReady();
}
};
struct npc_anub_ar_warriorAI : public ScriptedAI
{
npc_anub_ar_warriorAI(Creature *c) : ScriptedAI(c){}
uint32 uiCleaveTimer;
uint32 uiStrikeTimer;
void Reset()
{
uiCleaveTimer = 11*IN_MILISECONDS;
uiStrikeTimer = 6*IN_MILISECONDS;
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (uiStrikeTimer <= diff)
{
DoCast(me->getVictim(), SPELL_STRIKE, true);
uiStrikeTimer = 15*IN_MILISECONDS;
} else uiStrikeTimer -= diff;
if (uiCleaveTimer <= diff)
{
DoCast(me->getVictim(), SPELL_CLEAVE, true);
uiCleaveTimer = 17*IN_MILISECONDS;
} else uiCleaveTimer -= diff;
DoMeleeAttackIfReady();
}
};
struct npc_watcher_gashraAI : public ScriptedAI
{
npc_watcher_gashraAI(Creature *c) : ScriptedAI(c) {}
uint32 uiWebWrapTimer;
uint32 uiInfectedBiteTimer;
void Reset()
{
uiWebWrapTimer = 11*IN_MILISECONDS;
uiInfectedBiteTimer = 4*IN_MILISECONDS;
}
void EnterCombat(Unit* /*who*/)
{
DoCast(me, SPELL_ENRAGE, true);
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (uiWebWrapTimer <= diff)
{
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
DoCast(pTarget, SPELL_WEB_WRAP, true);
uiWebWrapTimer = 17*IN_MILISECONDS;
} else uiWebWrapTimer -= diff;
if (uiInfectedBiteTimer <= diff)
{
DoCast(me->getVictim(), SPELL_INFECTED_BITE, true);
uiInfectedBiteTimer = 15*IN_MILISECONDS;
} else uiInfectedBiteTimer -= diff;
DoMeleeAttackIfReady();
}
};
struct npc_watcher_narjilAI : public ScriptedAI
{
npc_watcher_narjilAI(Creature *c) : ScriptedAI(c) {}
uint32 uiWebWrapTimer;
uint32 uiInfectedBiteTimer;
uint32 uiBindingWebsTimer;
void Reset()
{
uiWebWrapTimer = 11*IN_MILISECONDS;
uiInfectedBiteTimer = 4*IN_MILISECONDS;
uiBindingWebsTimer = 17*IN_MILISECONDS;
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (uiWebWrapTimer <= diff)
{
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
DoCast(pTarget, SPELL_WEB_WRAP, true);
uiWebWrapTimer = 15*IN_MILISECONDS;
} else uiWebWrapTimer -= diff;
if (uiInfectedBiteTimer <= diff)
{
DoCast(me->getVictim(), SPELL_INFECTED_BITE, true);
uiInfectedBiteTimer = 11*IN_MILISECONDS;
} else uiInfectedBiteTimer -= diff;
if (uiBindingWebsTimer <= diff)
{
DoCast(me->getVictim(), SPELL_BLINDING_WEBS, true);
uiBindingWebsTimer = 17*IN_MILISECONDS;
} else uiBindingWebsTimer -= diff;
DoMeleeAttackIfReady();
}
};
struct npc_watcher_silthikAI : public ScriptedAI
{
npc_watcher_silthikAI(Creature *c) : ScriptedAI(c) {}
uint32 uiWebWrapTimer;
uint32 uiInfectedBiteTimer;
uint32 uiPoisonSprayTimer;
void Reset()
{
uiWebWrapTimer = 11*IN_MILISECONDS;
uiInfectedBiteTimer = 4*IN_MILISECONDS;
uiPoisonSprayTimer = 15*IN_MILISECONDS;
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (uiWebWrapTimer <= diff)
{
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
DoCast(pTarget, SPELL_WEB_WRAP, true);
uiWebWrapTimer = 15*IN_MILISECONDS;
} else uiWebWrapTimer -= diff;
if (uiInfectedBiteTimer <= diff)
{
DoCast(me->getVictim(), SPELL_INFECTED_BITE, true);
uiInfectedBiteTimer = 15*IN_MILISECONDS;
} else uiInfectedBiteTimer -= diff;
if (uiPoisonSprayTimer <= diff)
{
DoCast(me->getVictim(), SPELL_POSION_SPRAY, true);
uiPoisonSprayTimer = 17*IN_MILISECONDS;
} else uiPoisonSprayTimer -= diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_krik_thir(Creature* pCreature)
{
return new boss_krik_thirAI (pCreature);
}
CreatureAI* GetAI_npc_anub_ar_skirmisher (Creature* pCreature)
{
return new npc_anub_ar_skirmisherAI (pCreature);
}
CreatureAI* GetAI_npc_skittering_infector (Creature* pCreature)
{
return new npc_skittering_infectorAI (pCreature);
}
CreatureAI* GetAI_npc_anub_ar_shadowcaster (Creature* pCreature)
{
return new npc_anub_ar_shadowcasterAI (pCreature);
}
CreatureAI* GetAI_npc_anub_ar_warrior (Creature* pCreature)
{
return new npc_anub_ar_warriorAI (pCreature);
}
CreatureAI* GetAI_npc_watcher_gashra (Creature* pCreature)
{
return new npc_watcher_gashraAI (pCreature);
}
CreatureAI* GetAI_npc_watcher_narjil (Creature* pCreature)
{
return new npc_watcher_narjilAI (pCreature);
}
CreatureAI* GetAI_npc_watcher_silthik (Creature* pCreature)
{
return new npc_watcher_silthikAI (pCreature);
}
void AddSC_boss_krik_thir()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_krik_thir";
newscript->GetAI = &GetAI_boss_krik_thir;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_skittering_infector";
newscript->GetAI = &GetAI_npc_skittering_infector;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_anub_ar_skirmisher";
newscript->GetAI = &GetAI_npc_anub_ar_skirmisher;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_anub_ar_shadowcaster";
newscript->GetAI = &GetAI_npc_anub_ar_shadowcaster;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_watcher_gashra";
newscript->GetAI = &GetAI_npc_watcher_gashra;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_anub_ar_warrior";
newscript->GetAI = &GetAI_npc_anub_ar_warrior;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_watcher_silthik";
newscript->GetAI = &GetAI_npc_watcher_silthik;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_watcher_narjil";
newscript->GetAI = &GetAI_npc_watcher_narjil;
newscript->RegisterSelf();
}
@@ -0,0 +1,215 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "azjol_nerub.h"
#define MAX_ENCOUNTER 3
/* Azjol Nerub encounters:
0 - Krik'thir the Gatewatcher
1 - Hadronox
2 - Anub'arak
*/
struct instance_azjol_nerub : public ScriptedInstance
{
instance_azjol_nerub(Map* pMap) : ScriptedInstance(pMap) {Initialize();};
uint64 uiKrikthir;
uint64 uiHadronox;
uint64 uiAnubarak;
uint64 uiWatcherGashra;
uint64 uiWatcherSilthik;
uint64 uiWatcherNarjil;
uint64 uiAnubarakDoor[3];
uint64 uiKrikthirDoor;
uint32 auiEncounter[MAX_ENCOUNTER];
void Initialize()
{
memset(&auiEncounter, 0, sizeof(auiEncounter));
memset(&uiAnubarakDoor, 0, sizeof(uiAnubarakDoor));
uiKrikthir = 0;
uiHadronox = 0;
uiAnubarak = 0;
uiWatcherGashra = 0;
uiWatcherSilthik = 0;
uiWatcherNarjil = 0;
uiKrikthirDoor = 0;
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (auiEncounter[i] == IN_PROGRESS) return true;
return false;
}
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
{
switch(pCreature->GetEntry())
{
case 28684: uiKrikthir = pCreature->GetGUID(); break;
case 28921: uiHadronox = pCreature->GetGUID(); break;
case 29120: uiAnubarak = pCreature->GetGUID(); break;
case 28730: uiWatcherGashra = pCreature->GetGUID(); break;
case 28731: uiWatcherSilthik = pCreature->GetGUID(); break;
case 28729: uiWatcherNarjil = pCreature->GetGUID(); break;
}
}
void OnGameObjectCreate(GameObject* pGo, bool /*add*/)
{
switch (pGo->GetEntry())
{
case 192395:
uiKrikthirDoor = pGo->GetGUID();
if (auiEncounter[0] == DONE)
HandleGameObject(NULL,true,pGo);
break;
case 192396:
uiAnubarakDoor[0] = pGo->GetGUID();
break;
case 192397:
uiAnubarakDoor[1] = pGo->GetGUID();
break;
case 192398:
uiAnubarakDoor[2] = pGo->GetGUID();
break;
}
}
uint64 GetData64(uint32 identifier)
{
switch(identifier)
{
case DATA_KRIKTHIR_THE_GATEWATCHER: return uiKrikthir;
case DATA_HADRONOX: return uiHadronox;
case DATA_ANUBARAK: return uiAnubarak;
case DATA_WATCHER_GASHRA: return uiWatcherGashra;
case DATA_WATCHER_SILTHIK: return uiWatcherSilthik;
case DATA_WATCHER_NARJIL: return uiWatcherNarjil;
}
return 0;
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
case DATA_KRIKTHIR_THE_GATEWATCHER_EVENT:
auiEncounter[0] = data;
if (data == DONE)
HandleGameObject(uiKrikthirDoor,true);
break;
case DATA_HADRONOX_EVENT:
auiEncounter[1] = data;
break;
case DATA_ANUBARAK_EVENT:
auiEncounter[2] = data;
if (data == IN_PROGRESS)
for (uint8 i = 0; i < 3; ++i)
HandleGameObject(uiAnubarakDoor[i], false);
else if (data == NOT_STARTED || data == DONE)
for (uint8 i = 0; i < 3; ++i)
HandleGameObject(uiAnubarakDoor[i], true);
break;
}
if (data == DONE)
{
SaveToDB();
}
}
uint32 GetData(uint32 type)
{
switch(type)
{
case DATA_KRIKTHIR_THE_GATEWATCHER_EVENT: return auiEncounter[0];
case DATA_HADRONOX_EVENT: return auiEncounter[1];
case DATA_ANUBARAK_EVENT: return auiEncounter[2];
}
return 0;
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "A N " << auiEncounter[0] << " " << auiEncounter[1] << " "
<< auiEncounter[2];
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
uint16 data0,data1,data2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2;
if (dataHead1 == 'A' && dataHead2 == 'N')
{
auiEncounter[0] = data0;
auiEncounter[1] = data1;
auiEncounter[2] = data2;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (auiEncounter[i] == IN_PROGRESS)
auiEncounter[i] = NOT_STARTED;
} else OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
InstanceData* GetInstanceData_instance_azjol_nerub(Map* pMap)
{
return new instance_azjol_nerub(pMap);
}
void AddSC_instance_azjol_nerub()
{
Script *newscript;
newscript = new Script;
newscript->Name = "instance_azjol_nerub";
newscript->GetInstanceData = &GetInstanceData_instance_azjol_nerub;
newscript->RegisterSelf();
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,512 @@
/*
* Copyright (C) 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
*/
/* ScriptData
SDName: Argent Challenge Encounter.
SD%Complete: 50 %
SDComment: AI for Argent Soldiers are not implemented. AI from bosses need more improvements.
SDCategory: Trial of the Champion
EndScriptData */
#include "ScriptedPch.h"
#include "trial_of_the_champion.h"
#include "ScriptedEscortAI.h"
enum eSpells
{
//Eadric
SPELL_EADRIC_ACHIEVEMENT = 68197,
SPELL_HAMMER_JUSTICE = 66863,
SPELL_HAMMER_RIGHTEOUS = 66867,
SPELL_RADIANCE = 66935,
SPELL_VENGEANCE = 66865,
//Paletress
SPELL_SMITE = 66536,
SPELL_SMITE_H = 67674,
SPELL_HOLY_FIRE = 66538,
SPELL_HOLY_FIRE_H = 67676,
SPELL_RENEW = 66537,
SPELL_RENEW_H = 67675,
SPELL_HOLY_NOVA = 66546,
SPELL_SHIELD = 66515,
SPELL_CONFESS = 66680,
SPELL_SUMMON_MEMORY = 66545,
//Memory
SPELL_OLD_WOUNDS = 66620,
SPELL_OLD_WOUNDS_H = 67679,
SPELL_SHADOWS_PAST = 66619,
SPELL_SHADOWS_PAST_H = 67678,
SPELL_WAKING_NIGHTMARE = 66552,
SPELL_WAKING_NIGHTMARE_H = 67677
};
struct boss_eadricAI : public ScriptedAI
{
boss_eadricAI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
pCreature->SetReactState(REACT_PASSIVE);
pCreature->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE);
}
ScriptedInstance* pInstance;
uint32 uiVenganceTimer;
uint32 uiRadianceTimer;
uint32 uiHammerJusticeTimer;
uint32 uiResetTimer;
bool bDone;
void Reset()
{
uiVenganceTimer = 10000;
uiRadianceTimer = 16000;
uiHammerJusticeTimer = 25000;
uiResetTimer = 5000;
bDone = false;
}
void DamageTaken(Unit * /*done_by*/, uint32 &damage)
{
if (damage >= me->GetHealth())
{
damage = 0;
EnterEvadeMode();
me->setFaction(35);
bDone = true;
}
}
void MovementInform(uint32 MovementType, uint32 /*Data*/)
{
if (MovementType != POINT_MOTION_TYPE)
return;
if (pInstance)
pInstance->SetData(BOSS_ARGENT_CHALLENGE_E, DONE);
me->DisappearAndDie();
}
void UpdateAI(const uint32 uiDiff)
{
if (bDone && uiResetTimer <= uiDiff)
{
me->GetMotionMaster()->MovePoint(0,746.87,665.87,411.75);
bDone = false;
} else uiResetTimer -= uiDiff;
if (!UpdateVictim())
return;
if (uiHammerJusticeTimer <= uiDiff)
{
me->InterruptNonMeleeSpells(true);
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 250, true))
{
if (pTarget && pTarget->isAlive())
{
DoCast(pTarget, SPELL_HAMMER_JUSTICE);
DoCast(pTarget, SPELL_HAMMER_RIGHTEOUS);
}
}
uiHammerJusticeTimer = 25000;
} else uiHammerJusticeTimer -= uiDiff;
if (uiVenganceTimer <= uiDiff)
{
DoCast(me,SPELL_VENGEANCE);
uiVenganceTimer = 10000;
} else uiVenganceTimer -= uiDiff;
if (uiRadianceTimer <= uiDiff)
{
DoCastAOE(SPELL_RADIANCE);
uiRadianceTimer = 16000;
} else uiRadianceTimer -= uiDiff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_eadric(Creature* pCreature)
{
return new boss_eadricAI(pCreature);
}
struct boss_paletressAI : public ScriptedAI
{
boss_paletressAI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
MemoryGUID = 0;
pCreature->SetReactState(REACT_PASSIVE);
pCreature->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE);
pCreature->RestoreFaction();
}
ScriptedInstance* pInstance;
Creature* pMemory;
uint64 MemoryGUID;
bool bHealth;
bool bDone;
uint32 uiHolyFireTimer;
uint32 uiHolySmiteTimer;
uint32 uiRenewTimer;
uint32 uiResetTimer;
void Reset()
{
me->RemoveAllAuras();
uiHolyFireTimer = urand(9000,12000);
uiHolySmiteTimer = urand(5000,7000);
uiRenewTimer = urand(2000,5000);
uiResetTimer = 7000;
bHealth = false;
bDone = false;
if (Creature *pMemory = Unit::GetCreature(*me, MemoryGUID))
if (pMemory->isAlive())
pMemory->RemoveFromWorld();
}
void SetData(uint32 uiId, uint32 /*uiValue*/)
{
if (uiId == 1)
me->RemoveAura(SPELL_SHIELD);
}
void DamageTaken(Unit * /*done_by*/, uint32 &damage)
{
if (damage >= me->GetHealth())
{
damage = 0;
EnterEvadeMode();
me->setFaction(35);
bDone = true;
}
}
void MovementInform(uint32 MovementType, uint32 Point)
{
if (MovementType != POINT_MOTION_TYPE || Point != 0)
return;
if (pInstance)
pInstance->SetData(BOSS_ARGENT_CHALLENGE_P, DONE);
me->DisappearAndDie();
}
void UpdateAI(const uint32 uiDiff)
{
if (bDone && uiResetTimer <= uiDiff)
{
me->GetMotionMaster()->MovePoint(0,746.87,665.87,411.75);
bDone = false;
} else uiResetTimer -= uiDiff;
if (!UpdateVictim())
return;
if (uiHolyFireTimer <= uiDiff)
{
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 250, true))
{
if (pTarget && pTarget->isAlive())
DoCast(pTarget,SPELL_HOLY_FIRE);
}
if (me->HasAura(SPELL_SHIELD))
uiHolyFireTimer = 13000;
else
uiHolyFireTimer = urand(9000,12000);
} else uiHolyFireTimer -= uiDiff;
if (uiHolySmiteTimer <= uiDiff)
{
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 250, true))
{
if (pTarget && pTarget->isAlive())
DoCast(pTarget,SPELL_SMITE);
}
if (me->HasAura(SPELL_SHIELD))
uiHolySmiteTimer = 9000;
else
uiHolySmiteTimer = urand(5000,7000);
} else uiHolySmiteTimer -= uiDiff;
if (me->HasAura(SPELL_SHIELD))
if (uiRenewTimer <= uiDiff)
{
me->InterruptNonMeleeSpells(true);
uint8 uiTarget = urand(0,1);
switch(uiTarget)
{
case 0:
DoCast(me,SPELL_RENEW);
break;
case 1:
if (Creature *pMemory = Unit::GetCreature(*me, MemoryGUID))
if (pMemory->isAlive())
DoCast(pMemory, SPELL_RENEW);
break;
}
uiRenewTimer = urand(15000,17000);
} else uiRenewTimer -= uiDiff;
if (!bHealth && me->GetHealth()*100 / me->GetMaxHealth() <= 25)
{
me->InterruptNonMeleeSpells(true);
DoCastAOE(SPELL_HOLY_NOVA,false);
DoCast(me, SPELL_SHIELD);
DoCastAOE(SPELL_SUMMON_MEMORY,false);
DoCastAOE(SPELL_CONFESS,false);
bHealth = true;
}
DoMeleeAttackIfReady();
}
void JustSummoned(Creature* pSummon)
{
MemoryGUID = pSummon->GetGUID();
}
};
CreatureAI* GetAI_boss_paletress(Creature* pCreature)
{
return new boss_paletressAI(pCreature);
}
struct npc_memoryAI : public ScriptedAI
{
npc_memoryAI(Creature* pCreature) : ScriptedAI(pCreature) {}
uint32 uiOldWoundsTimer;
uint32 uiShadowPastTimer;
uint32 uiWakingNightmare;
void Reset()
{
uiOldWoundsTimer = 12000;
uiShadowPastTimer = 5000;
uiWakingNightmare = 7000;
}
void UpdateAI(const uint32 uiDiff)
{
if (!UpdateVictim())
return;
if (uiOldWoundsTimer <= uiDiff)
{
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
{
if (pTarget && pTarget->isAlive())
DoCast(pTarget, SPELL_OLD_WOUNDS);
}
uiOldWoundsTimer = 12000;
}else uiOldWoundsTimer -= uiDiff;
if (uiWakingNightmare <= uiDiff)
{
DoCast(me, SPELL_WAKING_NIGHTMARE);
uiWakingNightmare = 7000;
}else uiWakingNightmare -= uiDiff;
if (uiShadowPastTimer <= uiDiff)
{
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,1))
{
if (pTarget && pTarget->isAlive())
DoCast(pTarget,SPELL_SHADOWS_PAST);
}
uiShadowPastTimer = 5000;
}else uiShadowPastTimer -= uiDiff;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*pKiller*/)
{
if (me->isSummon())
{
if (Unit* pSummoner = CAST_SUM(me)->GetSummoner())
{
if (pSummoner && pSummoner->isAlive())
CAST_CRE(pSummoner)->AI()->SetData(1,0);
}
}
}
};
CreatureAI* GetAI_npc_memory(Creature* pCreature)
{
return new npc_memoryAI(pCreature);
}
// THIS AI NEEDS MORE IMPROVEMENTS
struct npc_argent_soldierAI : public npc_escortAI
{
npc_argent_soldierAI(Creature* pCreature) : npc_escortAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
me->SetReactState(REACT_DEFENSIVE);
SetDespawnAtEnd(false);
uiWaypoint = 0;
}
ScriptedInstance* pInstance;
uint8 uiWaypoint;
void WaypointReached(uint32 uiPoint)
{
if (uiPoint == 0)
{
switch(uiWaypoint)
{
case 0:
me->SetOrientation(5.81);
break;
case 1:
me->SetOrientation(4.60);
break;
case 2:
me->SetOrientation(2.79);
break;
}
me->SendMovementFlagUpdate();
}
}
void SetData(uint32 uiType, uint32 /*uiData*/)
{
switch(me->GetEntry())
{
case NPC_ARGENT_LIGHWIELDER:
switch(uiType)
{
case 0:
AddWaypoint(0,712.14,628.42,411.88);
break;
case 1:
AddWaypoint(0,742.44,650.29,411.79);
break;
case 2:
AddWaypoint(0,783.33,615.29,411.84);
break;
}
break;
case NPC_ARGENT_MONK:
switch(uiType)
{
case 0:
AddWaypoint(0,713.12,632.97,411.90);
break;
case 1:
AddWaypoint(0,746.73,650.24,411.56);
break;
case 2:
AddWaypoint(0,781.32,610.54,411.82);
break;
}
break;
case NPC_PRIESTESS:
switch(uiType)
{
case 0:
AddWaypoint(0,715.06,637.07,411.91);
break;
case 1:
AddWaypoint(0,750.72,650.20,411.77);
break;
case 2:
AddWaypoint(0,779.77,607.03,411.81);
break;
}
break;
}
Start(false,true,0);
uiWaypoint = uiType;
}
void UpdateAI(const uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*pKiller*/)
{
if (pInstance)
pInstance->SetData(DATA_ARGENT_SOLDIER_DEFEATED,pInstance->GetData(DATA_ARGENT_SOLDIER_DEFEATED) + 1);
}
};
CreatureAI* GetAI_npc_argent_soldier(Creature* pCreature)
{
return new npc_argent_soldierAI(pCreature);
}
void AddSC_boss_argent_challenge()
{
Script* NewScript;
NewScript = new Script;
NewScript->Name = "boss_eadric";
NewScript->GetAI = &GetAI_boss_eadric;
NewScript->RegisterSelf();
NewScript = new Script;
NewScript->Name = "boss_paletress";
NewScript->GetAI = &GetAI_boss_paletress;
NewScript->RegisterSelf();
NewScript = new Script;
NewScript->Name = "npc_memory";
NewScript->GetAI = &GetAI_npc_memory;
NewScript->RegisterSelf();
NewScript = new Script;
NewScript->Name = "npc_argent_soldier";
NewScript->GetAI = &GetAI_npc_argent_soldier;
NewScript->RegisterSelf();
}
@@ -0,0 +1,373 @@
/*
* Copyright (C) 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
*/
/* ScriptData
SDName: Boss Black Knight
SD%Complete: 80%
SDComment: missing yells. not sure about timers.
SDCategory: Trial of the Champion
EndScriptData */
#include "ScriptedPch.h"
#include "ScriptedEscortAI.h"
#include "trial_of_the_champion.h"
enum eSpells
{
//phase 1
SPELL_PLAGUE_STRIKE = 67884,
SPELL_PLAGUE_STRIKE_2 = 67724,
SPELL_ICY_TOUCH_H = 67881,
SPELL_ICY_TOUCH = 67718,
SPELL_DEATH_RESPITE = 67745,
SPELL_DEATH_RESPITE_2 = 68306,
SPELL_DEATH_RESPITE_3 = 66798,
SPELL_OBLITERATE_H = 67883,
SPELL_OBLITERATE = 67725,
//in this phase should rise herald (the spell is missing)
//phase 2 - During this phase, the Black Knight will use the same abilities as in phase 1, except for Death's Respite
SPELL_ARMY_DEAD = 67761,
SPELL_DESECRATION = 67778,
SPELL_DESECRATION_2 = 67778,
SPELL_GHOUL_EXPLODE = 67751,
//phase 3
SPELL_DEATH_BITE_H = 67875,
SPELL_DEATH_BITE = 67808,
SPELL_MARKED_DEATH = 67882,
SPELL_MARKED_DEATH_2 = 67823,
SPELL_BLACK_KNIGHT_RES = 67693,
SPELL_LEAP = 67749,
SPELL_LEAP_H = 67880
};
enum eModels
{
MODEL_SKELETON = 29846,
MODEL_GHOST = 21300
};
enum ePhases
{
PHASE_UNDEAD = 1,
PHASE_SKELETON = 2,
PHASE_GHOST = 3
};
struct boss_black_knightAI : public ScriptedAI
{
boss_black_knightAI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* pInstance;
std::list<uint64> SummonList;
bool bEventInProgress;
bool bEvent;
bool bSummonArmy;
bool bDeathArmyDone;
uint8 uiPhase;
uint32 uiPlagueStrikeTimer;
uint32 uiIcyTouchTimer;
uint32 uiDeathRespiteTimer;
uint32 uiObliterateTimer;
uint32 uiDesecration;
uint32 uiResurrectTimer;
uint32 uiDeathArmyCheckTimer;
uint32 uiGhoulExplodeTimer;
uint32 uiDeathBiteTimer;
uint32 uiMarkedDeathTimer;
void Reset()
{
RemoveSummons();
me->SetDisplayId(me->GetNativeDisplayId());
me->clearUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED);
bEventInProgress = false;
bEvent = false;
bSummonArmy = false;
bDeathArmyDone = false;
uiPhase = PHASE_UNDEAD;
uiIcyTouchTimer = urand(5000,9000);
uiPlagueStrikeTimer = urand(10000,13000);
uiDeathRespiteTimer = urand(15000,16000);
uiObliterateTimer = urand(17000,19000);
uiDesecration = urand(15000,16000);
uiDeathArmyCheckTimer = 7000;
uiResurrectTimer = 4000;
uiGhoulExplodeTimer = 8000;
uiDeathBiteTimer = urand (2000,4000);
uiMarkedDeathTimer = urand (5000,7000);
}
void RemoveSummons()
{
if (SummonList.empty())
return;
for (std::list<uint64>::const_iterator itr = SummonList.begin(); itr != SummonList.end(); ++itr)
{
if (Creature* pTemp = Unit::GetCreature(*me, *itr))
if (pTemp)
pTemp->DisappearAndDie();
}
SummonList.clear();
}
void JustSummoned(Creature* pSummon)
{
SummonList.push_back(pSummon->GetGUID());
pSummon->AI()->AttackStart(me->getVictim());
}
void UpdateAI(const uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (bEventInProgress)
if (uiResurrectTimer <= uiDiff)
{
me->SetHealth(me->GetMaxHealth());
DoCast(me,SPELL_BLACK_KNIGHT_RES,true);
uiPhase++;
uiResurrectTimer = 4000;
bEventInProgress = false;
me->clearUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED);
} else uiResurrectTimer -= uiDiff;
switch(uiPhase)
{
case PHASE_UNDEAD:
case PHASE_SKELETON:
{
if (uiIcyTouchTimer <= uiDiff)
{
DoCastVictim(SPELL_ICY_TOUCH);
uiIcyTouchTimer = urand(5000,7000);
} else uiIcyTouchTimer -= uiDiff;
if (uiPlagueStrikeTimer <= uiDiff)
{
DoCastVictim(SPELL_ICY_TOUCH);
uiPlagueStrikeTimer = urand(12000,15000);
} else uiPlagueStrikeTimer -= uiDiff;
if (uiObliterateTimer <= uiDiff)
{
DoCastVictim(SPELL_OBLITERATE);
uiObliterateTimer = urand(17000,19000);
} else uiObliterateTimer -= uiDiff;
switch(uiPhase)
{
case PHASE_UNDEAD:
{
if (uiDeathRespiteTimer <= uiDiff)
{
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{
if (pTarget && pTarget->isAlive())
DoCast(pTarget,SPELL_DEATH_RESPITE);
}
uiDeathRespiteTimer = urand(15000,16000);
} else uiDeathRespiteTimer -= uiDiff;
break;
}
case PHASE_SKELETON:
{
if (!bSummonArmy)
{
bSummonArmy = true;
me->addUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED);
DoCast(me, SPELL_ARMY_DEAD);
}
if (!bDeathArmyDone)
if (uiDeathArmyCheckTimer <= uiDiff)
{
me->clearUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED);
uiDeathArmyCheckTimer = 0;
bDeathArmyDone = true;
} else uiDeathArmyCheckTimer -= uiDiff;
if (uiDesecration <= uiDiff)
{
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{
if (pTarget && pTarget->isAlive())
DoCast(pTarget,SPELL_DESECRATION);
}
uiDesecration = urand(15000,16000);
} else uiDesecration -= uiDiff;
if (uiGhoulExplodeTimer <= uiDiff)
{
DoCast(me, SPELL_GHOUL_EXPLODE);
uiGhoulExplodeTimer = 8000;
} else uiGhoulExplodeTimer -= uiDiff;
break;
}
break;
}
break;
}
case PHASE_GHOST:
{
if (uiDeathBiteTimer <= uiDiff)
{
DoCastAOE(SPELL_DEATH_BITE);
uiDeathBiteTimer = urand (2000, 4000);
} else uiDeathBiteTimer -= uiDiff;
if (uiMarkedDeathTimer <= uiDiff)
{
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{
if (pTarget && pTarget->isAlive())
DoCast(pTarget,SPELL_MARKED_DEATH);
}
uiMarkedDeathTimer = urand (5000, 7000);
} else uiMarkedDeathTimer -= uiDiff;
break;
}
}
if (!me->hasUnitState(UNIT_STAT_ROOT) && !me->GetHealth()*100 / me->GetMaxHealth() <= 0)
DoMeleeAttackIfReady();
}
void DamageTaken(Unit* /*pDoneBy*/, uint32& uiDamage)
{
if (uiDamage > me->GetHealth() && uiPhase <= PHASE_SKELETON)
{
uiDamage = 0;
me->SetHealth(0);
me->addUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED);
RemoveSummons();
switch(uiPhase)
{
case PHASE_UNDEAD:
me->SetDisplayId(MODEL_SKELETON);
break;
case PHASE_SKELETON:
me->SetDisplayId(MODEL_GHOST);
break;
}
bEventInProgress = true;
}
}
void JustDied(Unit* /*pKiller*/)
{
if (pInstance)
pInstance->SetData(BOSS_BLACK_KNIGHT,DONE);
}
};
CreatureAI* GetAI_boss_black_knight(Creature *pCreature)
{
return new boss_black_knightAI (pCreature);
}
struct npc_risen_ghoulAI : public ScriptedAI
{
npc_risen_ghoulAI(Creature* pCreature) : ScriptedAI(pCreature) {}
uint32 uiAttackTimer;
void Reset()
{
uiAttackTimer = 3500;
}
void UpdateAI(const uint32 uiDiff)
{
if (!UpdateVictim())
return;
if (uiAttackTimer <= uiDiff)
{
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
{
if (pTarget && pTarget->isAlive())
DoCast(pTarget, (SPELL_LEAP));
}
uiAttackTimer = 3500;
} else uiAttackTimer -= uiDiff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_npc_risen_ghoul(Creature* pCreature)
{
return new npc_risen_ghoulAI(pCreature);
}
struct npc_black_knight_skeletal_gryphonAI : public npc_escortAI
{
npc_black_knight_skeletal_gryphonAI(Creature* pCreature) : npc_escortAI(pCreature)
{
Start(false,true,0,NULL);
}
void WaypointReached(uint32 /*i*/)
{
}
void UpdateAI(const uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
if (!UpdateVictim())
return;
}
};
CreatureAI* GetAI_npc_black_knight_skeletal_gryphon(Creature* pCreature)
{
return new npc_black_knight_skeletal_gryphonAI(pCreature);
}
void AddSC_boss_black_knight()
{
Script* NewScript;
NewScript = new Script;
NewScript->Name = "boss_black_knight";
NewScript->GetAI = &GetAI_boss_black_knight;
NewScript->RegisterSelf();
NewScript = new Script;
NewScript->Name = "npc_risen_ghoul";
NewScript->GetAI = &GetAI_npc_risen_ghoul;
NewScript->RegisterSelf();
NewScript = new Script;
NewScript->Name = "npc_black_knight_skeletal_gryphon";
NewScript->GetAI = &GetAI_npc_black_knight_skeletal_gryphon;
NewScript->RegisterSelf();
}
@@ -0,0 +1,993 @@
/* 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_grand_champions
SD%Complete: 50 %
SDComment: Is missing the ai to make the npcs look for a new mount and use it.
SDCategory: Trial Of the Champion
EndScriptData */
#include "ScriptedPch.h"
#include "ScriptedEscortAI.h"
#include "Vehicle.h"
#include "trial_of_the_champion.h"
enum eSpells
{
//Vehicle
SPELL_CHARGE = 63010,
SPELL_SHIELD_BREAKER = 68504,
SPELL_SHIELD = 66482,
// Marshal Jacob Alerius && Mokra the Skullcrusher || Warrior
SPELL_MORTAL_STRIKE = 68783,
SPELL_MORTAL_STRIKE_H = 68784,
SPELL_BLADESTORM = 63784,
SPELL_INTERCEPT = 67540,
SPELL_ROLLING_THROW = 47115, //not implemented in the AI yet...
// Ambrose Boltspark && Eressea Dawnsinger || Mage
SPELL_FIREBALL = 66042,
SPELL_FIREBALL_H = 68310,
SPELL_BLAST_WAVE = 66044,
SPELL_BLAST_WAVE_H = 68312,
SPELL_HASTE = 66045,
SPELL_POLYMORPH = 66043,
SPELL_POLYMORPH_H = 68311,
// Colosos && Runok Wildmane || Shaman
SPELL_CHAIN_LIGHTNING = 67529,
SPELL_CHAIN_LIGHTNING_H = 68319,
SPELL_EARTH_SHIELD = 67530,
SPELL_HEALING_WAVE = 67528,
SPELL_HEALING_WAVE_H = 68318,
SPELL_HEX_OF_MENDING = 67534,
// Jaelyne Evensong && Zul'tore || Hunter
SPELL_DISENGAGE = 68340, //not implemented in the AI yet...
SPELL_LIGHTNING_ARROWS = 66083,
SPELL_MULTI_SHOT = 66081,
SPELL_SHOOT = 65868,
SPELL_SHOOT_H = 67988,
// Lana Stouthammer Evensong && Deathstalker Visceri || Rouge
SPELL_EVISCERATE = 67709,
SPELL_EVISCERATE_H = 68317,
SPELL_FAN_OF_KNIVES = 67706,
SPELL_POISON_BOTTLE = 67701
};
enum eSeat
{
SEAT_ID_0 = 0
};
struct Point
{
float x,y,z;
};
const Point MovementPoint[] =
{
{746.84,623.15,411.41},
{747.96,620.29,411.09},
{750.23,618.35,411.09}
};
void AggroAllPlayers(Creature* pTemp)
{
Map::PlayerList const &PlList = pTemp->GetMap()->GetPlayers();
if (PlList.isEmpty())
return;
for (Map::PlayerList::const_iterator i = PlList.begin(); i != PlList.end(); ++i)
{
if (Player* pPlayer = i->getSource())
{
if (pPlayer->isGameMaster())
continue;
if (pPlayer->isAlive())
{
pTemp->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE);
pTemp->SetReactState(REACT_AGGRESSIVE);
pTemp->SetInCombatWith(pPlayer);
pPlayer->SetInCombatWith(pTemp);
pTemp->AddThreat(pPlayer, 0.0f);
}
}
}
}
bool GrandChampionsOutVehicle(Creature* me)
{
ScriptedInstance* pInstance = me->GetInstanceData();
if (!pInstance)
return false;
Creature* pGrandChampion1 = Unit::GetCreature(*me, pInstance->GetData64(DATA_GRAND_CHAMPION_1));
Creature* pGrandChampion2 = Unit::GetCreature(*me, pInstance->GetData64(DATA_GRAND_CHAMPION_2));
Creature* pGrandChampion3 = Unit::GetCreature(*me, pInstance->GetData64(DATA_GRAND_CHAMPION_3));
if (pGrandChampion1 && pGrandChampion2 && pGrandChampion3)
{
if (!pGrandChampion1->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) &&
!pGrandChampion2->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) &&
!pGrandChampion3->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
return true;
}
return false;
}
/*
* Generic AI for vehicles used by npcs in ToC, it needs more improvements. *
* Script Complete: 25%. *
*/
struct generic_vehicleAI_toc5AI : public npc_escortAI
{
generic_vehicleAI_toc5AI(Creature* pCreature) : npc_escortAI(pCreature)
{
SetDespawnAtEnd(false);
uiWaypointPath = 0;
pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* pInstance;
uint32 uiChargeTimer;
uint32 uiShieldBreakerTimer;
uint32 uiBuffTimer;
uint32 uiWaypointPath;
void Reset()
{
uiChargeTimer = 5000;
uiShieldBreakerTimer = 8000;
uiBuffTimer = urand(30000,60000);
}
void SetData(uint32 uiType, uint32 /*uiData*/)
{
switch(uiType)
{
case 1:
AddWaypoint(0,747.36,634.07,411.572);
AddWaypoint(1,780.43,607.15,411.82);
AddWaypoint(2,785.99,599.41,411.92);
AddWaypoint(3,778.44,601.64,411.79);
uiWaypointPath = 1;
break;
case 2:
AddWaypoint(0,747.35,634.07,411.57);
AddWaypoint(1,768.72,581.01,411.92);
AddWaypoint(2,763.55,590.52,411.71);
uiWaypointPath = 2;
break;
case 3:
AddWaypoint(0,747.35,634.07,411.57);
AddWaypoint(1,784.02,645.33,412.39);
AddWaypoint(2,775.67,641.91,411.91);
uiWaypointPath = 3;
break;
}
if (uiType <= 3)
Start(false,true,0,NULL);
}
void WaypointReached(uint32 i)
{
switch(i)
{
case 2:
if (pInstance && uiWaypointPath == 3 || uiWaypointPath == 2)
pInstance->SetData(DATA_MOVEMENT_DONE, pInstance->GetData(DATA_MOVEMENT_DONE)+1);
break;
case 3:
if (pInstance)
pInstance->SetData(DATA_MOVEMENT_DONE, pInstance->GetData(DATA_MOVEMENT_DONE)+1);
break;
}
}
void EnterCombat(Unit* /*pWho*/)
{
DoCastSpellShield();
}
void DoCastSpellShield()
{
for (uint8 i = 0; i < 3; ++i)
DoCast(me,SPELL_SHIELD,true);
}
void UpdateAI(const uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
if (!UpdateVictim())
return;
if (uiBuffTimer <= uiDiff)
{
if (!me->HasAura(SPELL_SHIELD))
DoCastSpellShield();
uiBuffTimer = urand(30000,45000);
}else uiBuffTimer -= uiDiff;
if (uiChargeTimer <= uiDiff)
{
Map::PlayerList const& players = me->GetMap()->GetPlayers();
if (me->GetMap()->IsDungeon() && !players.isEmpty())
{
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
Player* pPlayer = itr->getSource();
if (pPlayer && !pPlayer->isGameMaster() && me->IsInRange(pPlayer,8.0f,25.0f,false))
{
DoResetThreat();
me->AddThreat(pPlayer,1.0f);
DoCast(pPlayer, SPELL_CHARGE);
break;
}
}
}
uiChargeTimer = 5000;
}else uiChargeTimer -= uiDiff;
//dosen't work at all
if (uiShieldBreakerTimer <= uiDiff)
{
Vehicle *pVehicle = me->GetVehicleKit();
if (!pVehicle)
return;
if (Unit* pPassenger = pVehicle->GetPassenger(SEAT_ID_0))
{
Map::PlayerList const& players = me->GetMap()->GetPlayers();
if (me->GetMap()->IsDungeon() && !players.isEmpty())
{
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
Player* pPlayer = itr->getSource();
if (pPlayer && !pPlayer->isGameMaster() && me->IsInRange(pPlayer,10.0f,30.0f,false))
{
pPassenger->CastSpell(pPlayer,SPELL_SHIELD_BREAKER,true);
break;
}
}
}
}
uiShieldBreakerTimer = 7000;
}else uiShieldBreakerTimer -= uiDiff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_generic_vehicleAI_toc5(Creature* pCreature)
{
return new generic_vehicleAI_toc5AI(pCreature);
}
// Marshal Jacob Alerius && Mokra the Skullcrusher || Warrior
struct boss_warrior_toc5AI : public ScriptedAI
{
boss_warrior_toc5AI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
bDone = false;
bHome = false;
uiPhase = 0;
uiPhaseTimer = 0;
me->SetReactState(REACT_PASSIVE);
// THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
me->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE);
}
ScriptedInstance* pInstance;
uint8 uiPhase;
uint32 uiPhaseTimer;
uint32 uiBladeStormTimer;
uint32 uiInterceptTimer;
uint32 uiMortalStrikeTimer;
uint32 uiAttackTimer;
bool bDone;
bool bHome;
void Reset()
{
uiBladeStormTimer = urand(15000,20000);
uiInterceptTimer = 7000;
uiMortalStrikeTimer = urand(8000,12000);
}
void JustReachedHome()
{
ScriptedAI::JustReachedHome();
if (!bHome)
return;
uiPhaseTimer = 15000;
uiPhase = 1;
bHome = false;
}
void UpdateAI(const uint32 uiDiff)
{
if (!bDone && GrandChampionsOutVehicle(me))
{
bDone = true;
if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_1))
me->SetHomePosition(739.678,662.541,412.393,4.49);
else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_2))
me->SetHomePosition(746.71,661.02,411.69,4.6);
else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_3))
me->SetHomePosition(754.34,660.70,412.39,4.79);
EnterEvadeMode();
bHome = true;
}
if (uiPhaseTimer <= uiDiff)
{
if (uiPhase == 1)
{
AggroAllPlayers(me);
uiPhase = 0;
}
}else uiPhaseTimer -= uiDiff;
if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
return;
if (uiInterceptTimer <= uiDiff)
{
Map::PlayerList const& players = me->GetMap()->GetPlayers();
if (me->GetMap()->IsDungeon() && !players.isEmpty())
{
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
Player* pPlayer = itr->getSource();
if (pPlayer && !pPlayer->isGameMaster() && me->IsInRange(pPlayer,8.0f,25.0f,false))
{
DoResetThreat();
me->AddThreat(pPlayer,5.0f);
DoCast(pPlayer,SPELL_INTERCEPT);
break;
}
}
}
uiInterceptTimer = 7000;
} else uiInterceptTimer -= uiDiff;
if (uiBladeStormTimer <= uiDiff)
{
DoCastVictim(SPELL_BLADESTORM);
uiBladeStormTimer = urand(15000,20000);
} else uiBladeStormTimer -= uiDiff;
if (uiMortalStrikeTimer <= uiDiff)
{
DoCastVictim(SPELL_MORTAL_STRIKE);
uiMortalStrikeTimer = urand(8000,12000);
} else uiMortalStrikeTimer -= uiDiff;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*pKiller*/)
{
if (pInstance)
pInstance->SetData(BOSS_GRAND_CHAMPIONS, DONE);
}
};
CreatureAI* GetAI_boss_warrior_toc5(Creature* pCreature)
{
return new boss_warrior_toc5AI(pCreature);
}
// Ambrose Boltspark && Eressea Dawnsinger || Mage
struct boss_mage_toc5AI : public ScriptedAI
{
boss_mage_toc5AI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
bDone = false;
bHome = false;
uiPhase = 0;
uiPhaseTimer = 0;
me->SetReactState(REACT_PASSIVE);
// THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
me->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE);
}
ScriptedInstance* pInstance;
uint8 uiPhase;
uint32 uiPhaseTimer;
uint32 uiFireBallTimer;
uint32 uiBlastWaveTimer;
uint32 uiHasteTimer;
uint32 uiPolymorphTimer;
bool bDone;
bool bHome;
void Reset()
{
uiFireBallTimer = 5000;
uiPolymorphTimer = 8000;
uiBlastWaveTimer = 12000;
uiHasteTimer = 22000;
}
void JustReachedHome()
{
ScriptedAI::JustReachedHome();
if (!bHome)
return;
uiPhaseTimer = 15000;
uiPhase = 1;
bHome = false;
}
void UpdateAI(const uint32 uiDiff)
{
if (!bDone && GrandChampionsOutVehicle(me))
{
bDone = true;
if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_1))
me->SetHomePosition(739.678,662.541,412.393,4.49);
else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_2))
me->SetHomePosition(746.71,661.02,411.69,4.6);
else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_3))
me->SetHomePosition(754.34,660.70,412.39,4.79);
if (pInstance)
pInstance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS);
EnterEvadeMode();
bHome = true;
}
if (uiPhaseTimer <= uiDiff)
{
if (uiPhase == 1)
{
AggroAllPlayers(me);
uiPhase = 0;
}
}else uiPhaseTimer -= uiDiff;
if (uiFireBallTimer <= uiDiff)
{
if (me->getVictim())
DoCastVictim(SPELL_FIREBALL);
uiFireBallTimer = 5000;
} else uiFireBallTimer -= uiDiff;
if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
return;
if (uiFireBallTimer <= uiDiff)
{
DoCastVictim(SPELL_FIREBALL);
uiFireBallTimer = 5000;
} else uiFireBallTimer -= uiDiff;
if (uiPolymorphTimer <= uiDiff)
{
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(pTarget, SPELL_POLYMORPH);
uiPolymorphTimer = 8000;
} else uiPolymorphTimer -= uiDiff;
if (uiBlastWaveTimer <= uiDiff)
{
DoCastAOE(SPELL_BLAST_WAVE,false);
uiBlastWaveTimer = 13000;
} else uiBlastWaveTimer -= uiDiff;
if (uiHasteTimer <= uiDiff)
{
me->InterruptNonMeleeSpells(true);
DoCast(me,SPELL_HASTE);
uiHasteTimer = 22000;
} else uiHasteTimer -= uiDiff;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*pKiller*/)
{
if (pInstance)
pInstance->SetData(BOSS_GRAND_CHAMPIONS, DONE);
}
};
CreatureAI* GetAI_boss_mage_toc5(Creature* pCreature)
{
return new boss_mage_toc5AI(pCreature);
}
// Colosos && Runok Wildmane || Shaman
struct boss_shaman_toc5AI : public ScriptedAI
{
boss_shaman_toc5AI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
bDone = false;
bHome = false;
uiPhase = 0;
uiPhaseTimer = 0;
me->SetReactState(REACT_PASSIVE);
// THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
me->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE);
}
ScriptedInstance* pInstance;
uint8 uiPhase;
uint32 uiPhaseTimer;
uint32 uiChainLightningTimer;
uint32 uiEartShieldTimer;
uint32 uiHealingWaveTimer;
uint32 uiHexMendingTimer;
bool bDone;
bool bHome;
void Reset()
{
uiChainLightningTimer = 16000;
uiHealingWaveTimer = 12000;
uiEartShieldTimer = urand(30000,35000);
uiHexMendingTimer = urand(20000,25000);
}
void EnterCombat(Unit* pWho)
{
DoCast(me,SPELL_EARTH_SHIELD);
DoCast(pWho,SPELL_HEX_OF_MENDING);
};
void JustReachedHome()
{
ScriptedAI::JustReachedHome();
if (!bHome)
return;
uiPhaseTimer = 15000;
uiPhase = 1;
bHome = false;
}
void UpdateAI(const uint32 uiDiff)
{
if (!bDone && GrandChampionsOutVehicle(me))
{
bDone = true;
if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_1))
me->SetHomePosition(739.678,662.541,412.393,4.49);
else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_2))
me->SetHomePosition(746.71,661.02,411.69,4.6);
else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_3))
me->SetHomePosition(754.34,660.70,412.39,4.79);
if (pInstance)
pInstance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS);
EnterEvadeMode();
bHome = true;
}
if (uiPhaseTimer <= uiDiff)
{
if (uiPhase == 1)
{
AggroAllPlayers(me);
uiPhase = 0;
}
}else uiPhaseTimer -= uiDiff;
if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
return;
if (uiChainLightningTimer <= uiDiff)
{
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(pTarget,SPELL_CHAIN_LIGHTNING);
uiChainLightningTimer = 16000;
} else uiChainLightningTimer -= uiDiff;
if (uiHealingWaveTimer <= uiDiff)
{
bool bChance = urand(0,1);
if (!bChance)
{
if (Unit* pFriend = DoSelectLowestHpFriendly(40))
DoCast(pFriend,SPELL_HEALING_WAVE);
} else
DoCast(me,SPELL_HEALING_WAVE);
uiHealingWaveTimer = 12000;
} else uiHealingWaveTimer -= uiDiff;
if (uiEartShieldTimer <= uiDiff)
{
DoCast(me,SPELL_EARTH_SHIELD);
uiEartShieldTimer = urand(30000,35000);
} else uiEartShieldTimer -= uiDiff;
if (uiHexMendingTimer <= uiDiff)
{
DoCastVictim(SPELL_HEX_OF_MENDING,true);
uiHexMendingTimer = urand(20000,25000);
} else uiHexMendingTimer -= uiDiff;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*pKiller*/)
{
if (pInstance)
pInstance->SetData(BOSS_GRAND_CHAMPIONS, DONE);
}
};
CreatureAI* GetAI_boss_shaman_toc5(Creature* pCreature)
{
return new boss_shaman_toc5AI(pCreature);
}
// Jaelyne Evensong && Zul'tore || Hunter
struct boss_hunter_toc5AI : public ScriptedAI
{
boss_hunter_toc5AI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
bDone = false;
bHome = false;
uiPhase = 0;
uiPhaseTimer = 0;
me->SetReactState(REACT_PASSIVE);
// THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
me->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE);
}
ScriptedInstance* pInstance;
uint8 uiPhase;
uint32 uiPhaseTimer;
uint32 uiShootTimer;
uint32 uiMultiShotTimer;
uint32 uiLightningArrowsTimer;
uint64 uiTargetGUID;
bool bShoot;
bool bDone;
bool bHome;
void Reset()
{
uiShootTimer = 12000;
uiMultiShotTimer = 0;
uiLightningArrowsTimer = 7000;
uiTargetGUID = 0;
bShoot = false;
}
void JustReachedHome()
{
ScriptedAI::JustReachedHome();
if (!bHome)
return;
uiPhaseTimer = 15000;
uiPhase = 1;
bHome = false;
}
void UpdateAI(const uint32 uiDiff)
{
if (!bDone && GrandChampionsOutVehicle(me))
{
bDone = true;
if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_1))
me->SetHomePosition(739.678,662.541,412.393,4.49);
else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_2))
me->SetHomePosition(746.71,661.02,411.69,4.6);
else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_3))
me->SetHomePosition(754.34,660.70,412.39,4.79);
if (pInstance)
pInstance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS);
EnterEvadeMode();
bHome = true;
}
if (uiPhaseTimer <= uiDiff)
{
if (uiPhase == 1)
{
AggroAllPlayers(me);
uiPhase = 0;
}
}else uiPhaseTimer -= uiDiff;
if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
return;
if (uiLightningArrowsTimer <= uiDiff)
{
DoCastAOE(SPELL_LIGHTNING_ARROWS,false);
uiLightningArrowsTimer = 7000;
} else uiLightningArrowsTimer -= uiDiff;
if (uiShootTimer <= uiDiff)
{
if (Unit* pTarget = SelectTarget(SELECT_TARGET_FARTHEST,0,30.0f))
{
uiTargetGUID = pTarget->GetGUID();
DoCast(pTarget, SPELL_SHOOT);
}
uiShootTimer = 12000;
uiMultiShotTimer = 3000;
bShoot = true;
} else uiShootTimer -= uiDiff;
if (bShoot && uiMultiShotTimer <= uiDiff)
{
me->InterruptNonMeleeSpells(true);
Unit* pTarget = Unit::GetUnit(*me, uiTargetGUID);
if (pTarget && me->IsInRange(pTarget,5.0f,30.0f,false))
{
DoCast(pTarget,SPELL_MULTI_SHOT);
} else
{
Map::PlayerList const& players = me->GetMap()->GetPlayers();
if (me->GetMap()->IsDungeon() && !players.isEmpty())
{
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
Player* pPlayer = itr->getSource();
if (pPlayer && !pPlayer->isGameMaster() && me->IsInRange(pPlayer,5.0f,30.0f,false))
{
DoCast(pTarget,SPELL_MULTI_SHOT);
break;
}
}
}
}
bShoot = false;
} else uiMultiShotTimer -= uiDiff;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*pKiller*/)
{
if (pInstance)
pInstance->SetData(BOSS_GRAND_CHAMPIONS, DONE);
}
};
CreatureAI* GetAI_boss_hunter_toc5(Creature* pCreature)
{
return new boss_hunter_toc5AI(pCreature);
}
// Lana Stouthammer Evensong && Deathstalker Visceri || Rouge
struct boss_rouge_toc5AI : public ScriptedAI
{
boss_rouge_toc5AI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
bDone = false;
bHome = false;
uiPhase = 0;
uiPhaseTimer = 0;
me->SetReactState(REACT_PASSIVE);
// THIS IS A HACK, SHOULD BE REMOVED WHEN THE EVENT IS FULL SCRIPTED
me->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE);
}
ScriptedInstance* pInstance;
uint8 uiPhase;
uint32 uiPhaseTimer;
uint32 uiEviscerateTimer;
uint32 uiFanKivesTimer;
uint32 uiPosionBottleTimer;
bool bDone;
bool bHome;
void Reset()
{
uiEviscerateTimer = 8000;
uiFanKivesTimer = 14000;
uiPosionBottleTimer = 19000;
}
void JustReachedHome()
{
ScriptedAI::JustReachedHome();
if (!bHome)
return;
uiPhaseTimer = 15000;
uiPhase = 1;
bHome = false;
}
void UpdateAI(const uint32 uiDiff)
{
if (!bDone && GrandChampionsOutVehicle(me))
{
bDone = true;
if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_1))
me->SetHomePosition(739.678,662.541,412.393,4.49);
else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_2))
me->SetHomePosition(746.71,661.02,411.69,4.6);
else if (pInstance && me->GetGUID() == pInstance->GetData64(DATA_GRAND_CHAMPION_3))
me->SetHomePosition(754.34,660.70,412.39,4.79);
if (pInstance)
pInstance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS);
EnterEvadeMode();
bHome = true;
}
if (uiPhaseTimer <= uiDiff)
{
if (uiPhase == 1)
{
AggroAllPlayers(me);
uiPhase = 0;
}
} else uiPhaseTimer -= uiDiff;
if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
return;
if (uiEviscerateTimer <= uiDiff)
{
DoCast(me->getVictim(),SPELL_EVISCERATE);
uiEviscerateTimer = 8000;
} else uiEviscerateTimer -= uiDiff;
if (uiFanKivesTimer <= uiDiff)
{
DoCastAOE(SPELL_FAN_OF_KNIVES,false);
uiFanKivesTimer = 14000;
} else uiFanKivesTimer -= uiDiff;
if (uiPosionBottleTimer <= uiDiff)
{
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(pTarget,SPELL_POISON_BOTTLE);
uiPosionBottleTimer = 19000;
} else uiPosionBottleTimer -= uiDiff;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*pKiller*/)
{
if (pInstance)
pInstance->SetData(BOSS_GRAND_CHAMPIONS, DONE);
}
};
CreatureAI* GetAI_boss_rouge_toc5(Creature* pCreature)
{
return new boss_rouge_toc5AI(pCreature);
}
void AddSC_boss_grand_champions()
{
Script* NewScript;
NewScript = new Script;
NewScript->Name = "generic_vehicleAI_toc5";
NewScript->GetAI = &GetAI_generic_vehicleAI_toc5;
NewScript->RegisterSelf();
NewScript = new Script;
NewScript->Name = "boss_warrior_toc5";
NewScript->GetAI = &GetAI_boss_warrior_toc5;
NewScript->RegisterSelf();
NewScript = new Script;
NewScript->Name = "boss_mage_toc5";
NewScript->GetAI = &GetAI_boss_mage_toc5;
NewScript->RegisterSelf();
NewScript = new Script;
NewScript->Name = "boss_shaman_toc5";
NewScript->GetAI = &GetAI_boss_shaman_toc5;
NewScript->RegisterSelf();
NewScript = new Script;
NewScript->Name = "boss_hunter_toc5";
NewScript->GetAI = &GetAI_boss_hunter_toc5;
NewScript->RegisterSelf();
NewScript = new Script;
NewScript->Name = "boss_rouge_toc5";
NewScript->GetAI = &GetAI_boss_rouge_toc5;
NewScript->RegisterSelf();
}
@@ -0,0 +1,340 @@
/*
* Copyright (C) 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
*/
/* ScriptData
SDName: Instance Trial of the Champion
SDComment:
SDCategory: Trial Of the Champion
EndScriptData */
#include "ScriptedPch.h"
#include "trial_of_the_champion.h"
#define MAX_ENCOUNTER 4
struct instance_trial_of_the_champion : public ScriptedInstance
{
instance_trial_of_the_champion(Map* pMap) : ScriptedInstance(pMap) {Initialize();}
uint32 m_auiEncounter[MAX_ENCOUNTER];
uint8 uiMovementDone;
uint8 uiGrandChampionsDeaths;
uint8 uiArgentSoldierDeaths;
uint64 uiAnnouncerGUID;
uint64 uiMainGateGUID;
uint64 uiGrandChampionVehicle1GUID;
uint64 uiGrandChampionVehicle2GUID;
uint64 uiGrandChampionVehicle3GUID;
uint64 uiGrandChampion1GUID;
uint64 uiGrandChampion2GUID;
uint64 uiGrandChampion3GUID;
uint64 uiChampionLootGUID;
uint64 uiArgentChampionGUID;
std::list<uint64> VehicleList;
std::string str_data;
bool bDone;
void Initialize()
{
uiMovementDone = 0;
uiGrandChampionsDeaths = 0;
uiArgentSoldierDeaths = 0;
uiAnnouncerGUID = 0;
uiMainGateGUID = 0;
uiGrandChampionVehicle1GUID = 0;
uiGrandChampionVehicle2GUID = 0;
uiGrandChampionVehicle3GUID = 0;
uiGrandChampion1GUID = 0;
uiGrandChampion2GUID = 0;
uiGrandChampion3GUID = 0;
uiChampionLootGUID = 0;
uiArgentChampionGUID = 0;
bDone = false;
VehicleList.clear();
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
{
if (m_auiEncounter[i] == IN_PROGRESS)
return true;
}
return false;
}
void OnCreatureCreate(Creature* pCreature, bool /*bAdd*/)
{
Map::PlayerList const &players = instance->GetPlayers();
uint32 TeamInInstance = 0;
if (!players.isEmpty())
{
if (Player* pPlayer = players.begin()->getSource())
TeamInInstance = pPlayer->GetTeam();
}
switch(pCreature->GetEntry())
{
// Champions
case VEHICLE_MOKRA_SKILLCRUSHER_MOUNT:
if (TeamInInstance == HORDE)
pCreature->UpdateEntry(VEHICLE_MARSHAL_JACOB_ALERIUS_MOUNT, ALLIANCE);
break;
case VEHICLE_ERESSEA_DAWNSINGER_MOUNT:
if (TeamInInstance == HORDE)
pCreature->UpdateEntry(VEHICLE_AMBROSE_BOLTSPARK_MOUNT, ALLIANCE);
break;
case VEHICLE_RUNOK_WILDMANE_MOUNT:
if (TeamInInstance == HORDE)
pCreature->UpdateEntry(VEHICLE_COLOSOS_MOUNT, ALLIANCE);
break;
case VEHICLE_ZUL_TORE_MOUNT:
if (TeamInInstance == HORDE)
pCreature->UpdateEntry(VEHICLE_EVENSONG_MOUNT, ALLIANCE);
break;
case VEHICLE_DEATHSTALKER_VESCERI_MOUNT:
if (TeamInInstance == HORDE)
pCreature->UpdateEntry(VEHICLE_LANA_STOUTHAMMER_MOUNT, ALLIANCE);
break;
// Coliseum Announcer || Just NPC_JAEREN must be spawned.
case NPC_JAEREN:
uiAnnouncerGUID = pCreature->GetGUID();
if (TeamInInstance == ALLIANCE)
pCreature->UpdateEntry(NPC_ARELAS,ALLIANCE);
break;
case VEHICLE_ARGENT_WARHORSE:
case VEHICLE_ARGENT_BATTLEWORG:
VehicleList.push_back(pCreature->GetGUID());
break;
case NPC_EADRIC:
case NPC_PALETRESS:
uiArgentChampionGUID = pCreature->GetGUID();
break;
}
}
void OnGameObjectCreate(GameObject* pGO, bool /*bAdd*/)
{
switch(pGO->GetEntry())
{
case GO_MAIN_GATE:
uiMainGateGUID = pGO->GetGUID();
break;
case GO_CHAMPIONS_LOOT:
case GO_CHAMPIONS_LOOT_H:
uiChampionLootGUID = pGO->GetGUID();
break;
}
}
void SetData(uint32 uiType, uint32 uiData)
{
switch(uiType)
{
case DATA_MOVEMENT_DONE:
uiMovementDone = uiData;
if (uiMovementDone == 3)
{
if (Creature* pAnnouncer = instance->GetCreature(uiAnnouncerGUID))
pAnnouncer->AI()->SetData(DATA_IN_POSITION,0);
}
break;
case BOSS_GRAND_CHAMPIONS:
m_auiEncounter[0] = uiData;
if (uiData == IN_PROGRESS)
{
for (std::list<uint64>::const_iterator itr = VehicleList.begin(); itr != VehicleList.end(); ++itr)
if (Creature* pSummon = instance->GetCreature(*itr))
pSummon->RemoveFromWorld();
}else if (uiData == DONE)
{
++uiGrandChampionsDeaths;
if (uiGrandChampionsDeaths == 3)
{
if (Creature* pAnnouncer = instance->GetCreature(uiAnnouncerGUID))
{
pAnnouncer->GetMotionMaster()->MovePoint(0,748.309,619.487,411.171);
pAnnouncer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
pAnnouncer->SummonGameObject(instance->IsHeroic()? GO_CHAMPIONS_LOOT_H : GO_CHAMPIONS_LOOT,746.59,618.49,411.09,1.42,0, 0, 0, 0,90000000);
}
}
}
break;
case DATA_ARGENT_SOLDIER_DEFEATED:
uiArgentSoldierDeaths = uiData;
if (uiArgentSoldierDeaths == 9)
{
if (Creature* pBoss = instance->GetCreature(uiArgentChampionGUID))
{
pBoss->GetMotionMaster()->MovePoint(0,746.88,618.74,411.06);
pBoss->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE);
pBoss->SetReactState(REACT_AGGRESSIVE);
}
}
break;
case BOSS_ARGENT_CHALLENGE_E:
m_auiEncounter[1] = uiData;
if (Creature* pAnnouncer = instance->GetCreature(uiAnnouncerGUID))
{
pAnnouncer->GetMotionMaster()->MovePoint(0,748.309,619.487,411.171);
pAnnouncer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
pAnnouncer->SummonGameObject(instance->IsHeroic()? GO_EADRIC_LOOT_H : GO_EADRIC_LOOT,746.59,618.49,411.09,1.42,0, 0, 0, 0,90000000);
}
break;
case BOSS_ARGENT_CHALLENGE_P:
m_auiEncounter[2] = uiData;
if (Creature* pAnnouncer = instance->GetCreature(uiAnnouncerGUID))
{
pAnnouncer->GetMotionMaster()->MovePoint(0,748.309,619.487,411.171);
pAnnouncer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
pAnnouncer->SummonGameObject(instance->IsHeroic()? GO_PALETRESS_LOOT_H : GO_PALETRESS_LOOT,746.59,618.49,411.09,1.42,0, 0, 0, 0,90000000);
}
break;
}
if (uiData == DONE)
SaveToDB();
}
uint32 GetData(uint32 uiData)
{
switch(uiData)
{
case BOSS_GRAND_CHAMPIONS: return m_auiEncounter[0];
case BOSS_ARGENT_CHALLENGE_E: return m_auiEncounter[1];
case BOSS_ARGENT_CHALLENGE_P: return m_auiEncounter[2];
case BOSS_BLACK_KNIGHT: return m_auiEncounter[3];
case DATA_MOVEMENT_DONE: return uiMovementDone;
case DATA_ARGENT_SOLDIER_DEFEATED: return uiArgentSoldierDeaths;
}
return 0;
}
uint64 GetData64(uint32 uiData)
{
switch(uiData)
{
case DATA_ANNOUNCER: return uiAnnouncerGUID;
case DATA_MAIN_GATE: return uiMainGateGUID;
case DATA_GRAND_CHAMPION_1: return uiGrandChampion1GUID;
case DATA_GRAND_CHAMPION_2: return uiGrandChampion2GUID;
case DATA_GRAND_CHAMPION_3: return uiGrandChampion3GUID;
}
return 0;
}
void SetData64(uint32 uiType, uint64 uiData)
{
switch(uiType)
{
case DATA_GRAND_CHAMPION_1:
uiGrandChampion1GUID = uiData;
break;
case DATA_GRAND_CHAMPION_2:
uiGrandChampion2GUID = uiData;
break;
case DATA_GRAND_CHAMPION_3:
uiGrandChampion3GUID = uiData;
break;
}
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "T C " << m_auiEncounter[0]
<< " " << m_auiEncounter[1]
<< " " << m_auiEncounter[2]
<< " " << m_auiEncounter[3]
<< " " << uiGrandChampionsDeaths
<< " " << uiMovementDone;
str_data = saveStream.str();
OUT_SAVE_INST_DATA_COMPLETE;
return str_data;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
uint16 data0, data1, data2, data3, data4, data5;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4 >> data5;
if (dataHead1 == 'T' && dataHead2 == 'C')
{
m_auiEncounter[0] = data0;
m_auiEncounter[1] = data1;
m_auiEncounter[2] = data2;
m_auiEncounter[3] = data3;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
m_auiEncounter[i] = NOT_STARTED;
uiGrandChampionsDeaths = data4;
uiMovementDone = data5;
} else OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
InstanceData* GetInstanceData_instance_trial_of_the_champion(Map* pMap)
{
return new instance_trial_of_the_champion(pMap);
}
void AddSC_instance_trial_of_the_champion()
{
Script *newscript;
newscript = new Script;
newscript->Name = "instance_trial_of_the_champion";
newscript->GetInstanceData = &GetInstanceData_instance_trial_of_the_champion;
newscript->RegisterSelf();
}
@@ -0,0 +1,512 @@
/*
* Copyright (C) 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
*/
/* ScriptData
SDName: Trial Of the Champion
SD%Complete:
SDComment:
SDCategory: trial_of_the_champion
EndScriptData */
/* ContentData
npc_announcer_toc5
EndContentData */
#include "ScriptedPch.h"
#include "trial_of_the_champion.h"
#include "Vehicle.h"
#define GOSSIP_START_EVENT1 "I'm ready to start challenge."
#define GOSSIP_START_EVENT2 "I'm ready for the next challenge."
#define ORIENTATION 4.714
/*######
## npc_announcer_toc5
######*/
const Position SpawnPosition = {746.261,657.401,411.681,4.65};
struct npc_announcer_toc5AI : public ScriptedAI
{
npc_announcer_toc5AI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
uiSummonTimes = 0;
uiPosition = 0;
uiLesserChampions = 0;
uiFirstBoss = 0;
uiSecondBoss = 0;
uiThirdBoss = 0;
uiArgentChampion = 0;
uiPhase = 0;
uiTimer = 0;
uiVehicle1GUID = 0;
uiVehicle2GUID = 0;
uiVehicle3GUID = 0;
Champion1List.clear();
Champion2List.clear();
Champion3List.clear();
me->SetReactState(REACT_PASSIVE);
me->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE);
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
SetGrandChampionsForEncounter();
SetArgentChampion();
}
ScriptedInstance* pInstance;
uint8 uiSummonTimes;
uint8 uiPosition;
uint8 uiLesserChampions;
uint32 uiArgentChampion;
uint32 uiFirstBoss;
uint32 uiSecondBoss;
uint32 uiThirdBoss;
uint32 uiPhase;
uint32 uiTimer;
uint64 uiVehicle1GUID;
uint64 uiVehicle2GUID;
uint64 uiVehicle3GUID;
uint64 uiGrandChampionBoss1;
std::list<uint64> Champion1List;
std::list<uint64> Champion2List;
std::list<uint64> Champion3List;
void NextStep(uint32 uiTimerStep,bool bNextStep = true,uint8 uiPhaseStep = 0)
{
uiTimer = uiTimerStep;
if (bNextStep)
++uiPhase;
else
uiPhase = uiPhaseStep;
}
void SetData(uint32 uiType, uint32 /*uiData*/)
{
switch (uiType)
{
case DATA_START:
DoSummonGrandChampion(uiFirstBoss);
NextStep(10000,false,1);
break;
case DATA_IN_POSITION: //movement done.
me->GetMotionMaster()->MovePoint(1,735.81,661.92,412.39);
if (GameObject* pGO = GameObject::GetGameObject(*me, pInstance->GetData64(DATA_MAIN_GATE)))
pInstance->HandleGameObject(pGO->GetGUID(),false);
NextStep(10000,false,3);
break;
case DATA_LESSER_CHAMPIONS_DEFEATED:
{
++uiLesserChampions;
std::list<uint64> TempList;
if (uiLesserChampions == 3 || uiLesserChampions == 6)
{
switch(uiLesserChampions)
{
case 3:
TempList = Champion2List;
break;
case 6:
TempList = Champion3List;
break;
}
for (std::list<uint64>::const_iterator itr = TempList.begin(); itr != TempList.end(); ++itr)
if (Creature* pSummon = Unit::GetCreature(*me, *itr))
AggroAllPlayers(pSummon);
}else if (uiLesserChampions == 9)
StartGrandChampionsAttack();
break;
}
}
}
void StartGrandChampionsAttack()
{
Creature* pGrandChampion1 = Unit::GetCreature(*me, uiVehicle1GUID);
Creature* pGrandChampion2 = Unit::GetCreature(*me, uiVehicle2GUID);
Creature* pGrandChampion3 = Unit::GetCreature(*me, uiVehicle3GUID);
if (pGrandChampion1 && pGrandChampion2 && pGrandChampion3)
{
AggroAllPlayers(pGrandChampion1);
AggroAllPlayers(pGrandChampion2);
AggroAllPlayers(pGrandChampion3);
}
}
void MovementInform(uint32 uiType, uint32 uiPointId)
{
if (uiType != POINT_MOTION_TYPE)
return;
if (uiPointId == 1)
{
me->SetOrientation(ORIENTATION);
me->SendMovementFlagUpdate();
}
}
void DoSummonGrandChampion(uint32 uiBoss)
{
++uiSummonTimes;
uint32 VEHICLE_TO_SUMMON1 = 0;
uint32 VEHICLE_TO_SUMMON2 = 0;
switch(uiBoss)
{
case 0:
VEHICLE_TO_SUMMON1 = VEHICLE_MOKRA_SKILLCRUSHER_MOUNT;
VEHICLE_TO_SUMMON2 = VEHICLE_ORGRIMMAR_WOLF;
break;
case 1:
VEHICLE_TO_SUMMON1 = VEHICLE_ERESSEA_DAWNSINGER_MOUNT;
VEHICLE_TO_SUMMON2 = VEHICLE_SILVERMOON_HAWKSTRIDER;
break;
case 2:
VEHICLE_TO_SUMMON1 = VEHICLE_RUNOK_WILDMANE_MOUNT;
VEHICLE_TO_SUMMON2 = VEHICLE_THUNDER_BLUFF_KODO;
break;
case 3:
VEHICLE_TO_SUMMON1 = VEHICLE_ZUL_TORE_MOUNT;
VEHICLE_TO_SUMMON2 = VEHICLE_DARKSPEAR_RAPTOR;
break;
case 4:
VEHICLE_TO_SUMMON1 = VEHICLE_DEATHSTALKER_VESCERI_MOUNT;
VEHICLE_TO_SUMMON2 = VEHICLE_FORSAKE_WARHORSE;
break;
default:
return;
}
if (Creature* pBoss = me->SummonCreature(VEHICLE_TO_SUMMON1,SpawnPosition))
{
switch(uiSummonTimes)
{
case 1:
{
uiVehicle1GUID = pBoss->GetGUID();
uint64 uiGrandChampionBoss1 = 0;
if (Creature* pBoss = Unit::GetCreature(*me, uiVehicle1GUID))
if (Vehicle* pVehicle = pBoss->GetVehicleKit())
if (Unit* pUnit = pVehicle->GetPassenger(0))
uiGrandChampionBoss1 = pUnit->GetGUID();
if (pInstance)
{
pInstance->SetData64(DATA_GRAND_CHAMPION_VEHICLE_1,uiVehicle1GUID);
pInstance->SetData64(DATA_GRAND_CHAMPION_1,uiGrandChampionBoss1);
}
pBoss->AI()->SetData(1,0);
break;
}
case 2:
{
uiVehicle2GUID = pBoss->GetGUID();
uint64 uiGrandChampionBoss2 = 0;
if (Creature* pBoss = Unit::GetCreature(*me, uiVehicle2GUID))
if (Vehicle* pVehicle = pBoss->GetVehicleKit())
if (Unit* pUnit = pVehicle->GetPassenger(0))
uiGrandChampionBoss2 = pUnit->GetGUID();
if (pInstance)
{
pInstance->SetData64(DATA_GRAND_CHAMPION_VEHICLE_2,uiVehicle2GUID);
pInstance->SetData64(DATA_GRAND_CHAMPION_2,uiGrandChampionBoss2);
}
pBoss->AI()->SetData(2,0);
break;
}
case 3:
{
uiVehicle3GUID = pBoss->GetGUID();
uint64 uiGrandChampionBoss3 = 0;
if (Creature* pBoss = Unit::GetCreature(*me, uiVehicle3GUID))
if (Vehicle* pVehicle = pBoss->GetVehicleKit())
if (Unit* pUnit = pVehicle->GetPassenger(0))
uiGrandChampionBoss3 = pUnit->GetGUID();
if (pInstance)
{
pInstance->SetData64(DATA_GRAND_CHAMPION_VEHICLE_3,uiVehicle3GUID);
pInstance->SetData64(DATA_GRAND_CHAMPION_3,uiGrandChampionBoss3);
}
pBoss->AI()->SetData(3,0);
break;
}
default:
return;
}
for (uint8 i = 0; i < 3; ++i)
{
if (Creature* pAdd = me->SummonCreature(VEHICLE_TO_SUMMON2,SpawnPosition,TEMPSUMMON_CORPSE_DESPAWN))
{
switch(uiSummonTimes)
{
case 1:
Champion1List.push_back(pAdd->GetGUID());
break;
case 2:
Champion2List.push_back(pAdd->GetGUID());
break;
case 3:
Champion3List.push_back(pAdd->GetGUID());
break;
}
switch(i)
{
case 0:
pAdd->GetMotionMaster()->MoveFollow(pBoss,2.0f,M_PI);
break;
case 1:
pAdd->GetMotionMaster()->MoveFollow(pBoss,2.0f,M_PI / 2);
break;
case 2:
pAdd->GetMotionMaster()->MoveFollow(pBoss,2.0f,M_PI / 2 + M_PI);
break;
}
}
}
}
}
void DoStartArgentChampionEncounter()
{
me->GetMotionMaster()->MovePoint(1,735.81,661.92,412.39);
if (Creature* pBoss = me->SummonCreature(uiArgentChampion,SpawnPosition))
{
for (uint8 i = 0; i < 3; ++i)
{
if (Creature* pTrash = me->SummonCreature(NPC_ARGENT_LIGHWIELDER,SpawnPosition))
pTrash->AI()->SetData(i,0);
if (Creature* pTrash = me->SummonCreature(NPC_ARGENT_MONK,SpawnPosition))
pTrash->AI()->SetData(i,0);
if (Creature* pTrash = me->SummonCreature(NPC_PRIESTESS,SpawnPosition))
pTrash->AI()->SetData(i,0);
}
}
}
void SetGrandChampionsForEncounter()
{
uiFirstBoss = urand(0,4);
while (uiSecondBoss == uiFirstBoss || uiThirdBoss == uiFirstBoss || uiThirdBoss == uiSecondBoss)
{
uiSecondBoss = urand(0,4);
uiThirdBoss = urand(0,4);
}
}
void SetArgentChampion()
{
uint8 uiTempBoss = urand(0,1);
switch(uiTempBoss)
{
case 0:
uiArgentChampion = NPC_EADRIC;
break;
case 1:
uiArgentChampion = NPC_PALETRESS;
break;
}
}
void StartEncounter()
{
if (!pInstance)
return;
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
if (pInstance->GetData(BOSS_BLACK_KNIGHT) == NOT_STARTED)
{
if (pInstance->GetData(BOSS_ARGENT_CHALLENGE_E) == NOT_STARTED && pInstance->GetData(BOSS_ARGENT_CHALLENGE_P) == NOT_STARTED)
{
if (pInstance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED)
me->AI()->SetData(DATA_START,0);
if (pInstance->GetData(BOSS_GRAND_CHAMPIONS) == DONE)
DoStartArgentChampionEncounter();
}
if (pInstance->GetData(BOSS_GRAND_CHAMPIONS) == DONE &&
pInstance->GetData(BOSS_ARGENT_CHALLENGE_E) == DONE ||
pInstance->GetData(BOSS_ARGENT_CHALLENGE_P) == DONE)
me->SummonCreature(VEHICLE_BLACK_KNIGHT,769.834,651.915,447.035,0);
}
}
void AggroAllPlayers(Creature* pTemp)
{
Map::PlayerList const &PlList = me->GetMap()->GetPlayers();
if (PlList.isEmpty())
return;
for (Map::PlayerList::const_iterator i = PlList.begin(); i != PlList.end(); ++i)
{
if (Player* pPlayer = i->getSource())
{
if (pPlayer->isGameMaster())
continue;
if (pPlayer->isAlive())
{
pTemp->SetHomePosition(me->GetPositionX(),me->GetPositionY(),me->GetPositionZ(),me->GetOrientation());
pTemp->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE);
pTemp->SetReactState(REACT_AGGRESSIVE);
pTemp->SetInCombatWith(pPlayer);
pPlayer->SetInCombatWith(pTemp);
pTemp->AddThreat(pPlayer, 0.0f);
}
}
}
}
void UpdateAI(const uint32 uiDiff)
{
ScriptedAI::UpdateAI(uiDiff);
if (uiTimer <= uiDiff)
{
switch(uiPhase)
{
case 1:
DoSummonGrandChampion(uiSecondBoss);
NextStep(10000,true);
break;
case 2:
DoSummonGrandChampion(uiThirdBoss);
NextStep(0,false);
break;
case 3:
if (!Champion1List.empty())
{
for (std::list<uint64>::const_iterator itr = Champion1List.begin(); itr != Champion1List.end(); ++itr)
if (Creature* pSummon = Unit::GetCreature(*me, *itr))
AggroAllPlayers(pSummon);
NextStep(0,false);
}
break;
}
} else uiTimer -= uiDiff;
if (!UpdateVictim())
return;
}
void JustSummoned(Creature* pSummon)
{
if (pInstance && pInstance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED)
{
pSummon->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE);
pSummon->SetReactState(REACT_PASSIVE);
}
}
void SummonedCreatureDespawn(Creature* pSummon)
{
switch(pSummon->GetEntry())
{
case VEHICLE_DARNASSIA_NIGHTSABER:
case VEHICLE_EXODAR_ELEKK:
case VEHICLE_STORMWIND_STEED:
case VEHICLE_GNOMEREGAN_MECHANOSTRIDER:
case VEHICLE_IRONFORGE_RAM:
case VEHICLE_FORSAKE_WARHORSE:
case VEHICLE_THUNDER_BLUFF_KODO:
case VEHICLE_ORGRIMMAR_WOLF:
case VEHICLE_SILVERMOON_HAWKSTRIDER:
case VEHICLE_DARKSPEAR_RAPTOR:
me->AI()->SetData(DATA_LESSER_CHAMPIONS_DEFEATED,0);
break;
}
}
};
CreatureAI* GetAI_npc_announcer_toc5(Creature* pCreature)
{
return new npc_announcer_toc5AI(pCreature);
}
bool GossipHello_npc_announcer_toc5(Player* pPlayer, Creature* pCreature)
{
ScriptedInstance* pInstance = pCreature->GetInstanceData();
if (pInstance &&
pInstance->GetData(BOSS_GRAND_CHAMPIONS) == DONE &&
pInstance->GetData(BOSS_BLACK_KNIGHT) == DONE &&
pInstance->GetData(BOSS_ARGENT_CHALLENGE_E) == DONE ||
pInstance->GetData(BOSS_ARGENT_CHALLENGE_P) == DONE)
return false;
if (pInstance &&
pInstance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED &&
pInstance->GetData(BOSS_ARGENT_CHALLENGE_E) == NOT_STARTED &&
pInstance->GetData(BOSS_ARGENT_CHALLENGE_P) == NOT_STARTED &&
pInstance->GetData(BOSS_BLACK_KNIGHT) == NOT_STARTED)
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_START_EVENT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
else if (pInstance)
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_START_EVENT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_announcer_toc5(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
if (uiAction == GOSSIP_ACTION_INFO_DEF+1)
{
pPlayer->CLOSE_GOSSIP_MENU();
CAST_AI(npc_announcer_toc5AI, pCreature->AI())->StartEncounter();
}
return true;
}
void AddSC_trial_of_the_champion()
{
Script* NewScript;
NewScript = new Script;
NewScript->Name = "npc_announcer_toc5";
NewScript->GetAI = &GetAI_npc_announcer_toc5;
NewScript->pGossipHello = &GossipHello_npc_announcer_toc5;
NewScript->pGossipSelect = &GossipSelect_npc_announcer_toc5;
NewScript->RegisterSelf();
}
@@ -0,0 +1,115 @@
/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
#ifndef DEF_TOC_H
#define DEF_TOC_H
enum eData
{
BOSS_GRAND_CHAMPIONS,
BOSS_ARGENT_CHALLENGE_E,
BOSS_ARGENT_CHALLENGE_P,
BOSS_BLACK_KNIGHT,
DATA_MOVEMENT_DONE,
DATA_LESSER_CHAMPIONS_DEFEATED,
DATA_START,
DATA_IN_POSITION,
DATA_ARGENT_SOLDIER_DEFEATED
};
enum Data64
{
DATA_ANNOUNCER,
DATA_MAIN_GATE,
DATA_GRAND_CHAMPION_VEHICLE_1,
DATA_GRAND_CHAMPION_VEHICLE_2,
DATA_GRAND_CHAMPION_VEHICLE_3,
DATA_GRAND_CHAMPION_1,
DATA_GRAND_CHAMPION_2,
DATA_GRAND_CHAMPION_3
};
enum eNpcs
{
// Horde Champions
NPC_MOKRA = 35572,
NPC_ERESSEA = 35569,
NPC_RUNOK = 35571,
NPC_ZULTORE = 35570,
NPC_VISCERI = 35617,
// Alliance Champions
NPC_JACOB = 34705,
NPC_AMBROSE = 34702,
NPC_COLOSOS = 34701,
NPC_JAELYNE = 34657,
NPC_LANA = 34703,
NPC_EADRIC = 35119,
NPC_PALETRESS = 34928,
NPC_ARGENT_LIGHWIELDER = 35309,
NPC_ARGENT_MONK = 35305,
NPC_PRIESTESS = 35307,
NPC_BLACK_KNIGHT = 35451,
NPC_RISEN_JAEREN = 35545,
NPC_RISEN_ARELAS = 35564,
NPC_JAEREN = 35004,
NPC_ARELAS = 35005
};
enum eGameObjects
{
GO_MAIN_GATE = 195647,
GO_CHAMPIONS_LOOT = 195709,
GO_CHAMPIONS_LOOT_H = 195710,
GO_EADRIC_LOOT = 195374,
GO_EADRIC_LOOT_H = 195375,
GO_PALETRESS_LOOT = 195323,
GO_PALETRESS_LOOT_H = 195324
};
enum eVehicles
{
//Grand Champions Alliance Vehicles
VEHICLE_MARSHAL_JACOB_ALERIUS_MOUNT = 35637,
VEHICLE_AMBROSE_BOLTSPARK_MOUNT = 35633,
VEHICLE_COLOSOS_MOUNT = 35768,
VEHICLE_EVENSONG_MOUNT = 34658,
VEHICLE_LANA_STOUTHAMMER_MOUNT = 35636,
//Faction Champions (ALLIANCE)
VEHICLE_DARNASSIA_NIGHTSABER = 33298,
VEHICLE_EXODAR_ELEKK = 33416,
VEHICLE_STORMWIND_STEED = 33297,
VEHICLE_GNOMEREGAN_MECHANOSTRIDER = 33301,
VEHICLE_IRONFORGE_RAM = 33408,
//Grand Champions Horde Vehicles
VEHICLE_MOKRA_SKILLCRUSHER_MOUNT = 35638,
VEHICLE_ERESSEA_DAWNSINGER_MOUNT = 35635,
VEHICLE_RUNOK_WILDMANE_MOUNT = 35640,
VEHICLE_ZUL_TORE_MOUNT = 35641,
VEHICLE_DEATHSTALKER_VESCERI_MOUNT = 35634,
//Faction Champions (HORDE)
VEHICLE_FORSAKE_WARHORSE = 33414,
VEHICLE_THUNDER_BLUFF_KODO = 33300,
VEHICLE_ORGRIMMAR_WOLF = 33409,
VEHICLE_SILVERMOON_HAWKSTRIDER = 33418,
VEHICLE_DARKSPEAR_RAPTOR = 33299,
VEHICLE_ARGENT_WARHORSE = 35644,
VEHICLE_ARGENT_BATTLEWORG = 36558,
VEHICLE_BLACK_KNIGHT = 35491
};
#endif
@@ -0,0 +1,110 @@
/*
* Copyright (C) 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
*/
/* Script Data Start
SDName: CrystalSongForest
SDAuthor: Malcrom
SD%Complete: 99%
SDComment:
SDCategory: CrystalsongForest
Script Data End */
#include "ScriptedPch.h"
/*******************************************************
* npc_warmage_violetstand
*******************************************************/
enum Spells
{
SPELL_TRANSITUS_SHIELD_BEAM = 48310
};
enum NPCs
{
NPC_TRANSITUS_SHIELD_DUMMY = 27306,
NPC_WARMAGE_SARINA = 32369,
NPC_WARMAGE_HALISTER = 32371,
NPC_WARMAGE_ILSUDRIA = 32372
};
struct npc_warmage_violetstandAI : public Scripted_NoMovementAI
{
npc_warmage_violetstandAI(Creature* pCreature) : Scripted_NoMovementAI(pCreature){}
uint64 uiTargetGUID;
void Reset()
{
uiTargetGUID = 0;
}
void UpdateAI(const uint32 /*uiDiff*/)
{
if (me->IsNonMeleeSpellCasted(false))
return;
if (me->GetEntry() == NPC_WARMAGE_SARINA)
{
if (!uiTargetGUID)
{
std::list<Creature*> orbList;
GetCreatureListWithEntryInGrid(orbList, me, NPC_TRANSITUS_SHIELD_DUMMY, 32.0f);
if (!orbList.empty())
{
for (std::list<Creature*>::const_iterator itr = orbList.begin(); itr != orbList.end(); ++itr)
{
if (Creature* pOrb = *itr)
{
if (pOrb->GetPositionY() < 1000)
{
uiTargetGUID = pOrb->GetGUID();
break;
}
}
}
}
}
}else
{
if (!uiTargetGUID)
if (Creature* pOrb = GetClosestCreatureWithEntry(me,NPC_TRANSITUS_SHIELD_DUMMY,32.0f))
uiTargetGUID = pOrb->GetGUID();
}
if (Creature* pOrb = me->GetCreature(*me,uiTargetGUID))
DoCast(pOrb,SPELL_TRANSITUS_SHIELD_BEAM);
}
};
CreatureAI* GetAI_npc_warmage_violetstand(Creature* pCreature)
{
return new npc_warmage_violetstandAI(pCreature);
}
void AddSC_crystalsong_forest()
{
Script *newscript;
newscript = new Script;
newscript->Name = "npc_warmage_violetstand";
newscript->GetAI = &GetAI_npc_warmage_violetstand;
newscript->RegisterSelf();
}
+159
View File
@@ -0,0 +1,159 @@
/*
* Copyright (C) 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
*/
/* Script Data Start
SDName: Dalaran
SDAuthor: WarHead, MaXiMiUS
SD%Complete: 99%
SDComment: For what is 63990+63991? Same function but don't work correct...
SDCategory: Dalaran
Script Data End */
#include "ScriptedPch.h"
/*******************************************************
* npc_mageguard_dalaran
*******************************************************/
enum Spells
{
SPELL_TRESPASSER_A = 54028,
SPELL_TRESPASSER_H = 54029
};
enum NPCs // All outdoor guards are within 35.0f of these NPCs
{
NPC_APPLEBOUGH_A = 29547,
NPC_SWEETBERRY_H = 29715,
};
struct npc_mageguard_dalaranAI : public Scripted_NoMovementAI
{
npc_mageguard_dalaranAI(Creature* pCreature) : Scripted_NoMovementAI(pCreature)
{
pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
pCreature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_NORMAL, true);
pCreature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);
}
void Reset(){}
void Aggro(Unit* /*pWho*/){}
void AttackStart(Unit* /*pWho*/){}
void MoveInLineOfSight(Unit *pWho)
{
if (!pWho || !pWho->IsInWorld() || pWho->GetZoneId() != 4395)
return;
if (!me->IsWithinDist(pWho, 65.0f, false))
return;
Player *pPlayer = pWho->GetCharmerOrOwnerPlayerOrPlayerItself();
if (!pPlayer || pPlayer->isGameMaster() || pPlayer->IsBeingTeleported())
return;
switch (me->GetEntry())
{
case 29254:
if (pPlayer->GetTeam() == HORDE) // Horde unit found in Alliance area
if (GetClosestCreatureWithEntry(me, NPC_APPLEBOUGH_A, 32.0f))
{
if (me->isInBackInMap(pWho, 12.0f)) // In my line of sight, "outdoors", and behind me
DoCast(pWho, SPELL_TRESPASSER_A); // Teleport the Horde unit out
}
else // In my line of sight, and "indoors"
DoCast(pWho, SPELL_TRESPASSER_A); // Teleport the Horde unit out
break;
case 29255:
if (pPlayer->GetTeam() == ALLIANCE) // Alliance unit found in Horde area
if (GetClosestCreatureWithEntry(me, NPC_SWEETBERRY_H, 32.0f))
{
if (me->isInBackInMap(pWho, 12.0f)) // In my line of sight, "outdoors", and behind me
DoCast(pWho, SPELL_TRESPASSER_H); // Teleport the Alliance unit out
}
else // In my line of sight, and "indoors"
DoCast(pWho, SPELL_TRESPASSER_H); // Teleport the Alliance unit out
break;
}
me->SetOrientation(me->GetHomePosition().GetOrientation());
return;
}
void UpdateAI(const uint32 /*diff*/){}
};
CreatureAI* GetAI_npc_mageguard_dalaran(Creature* pCreature)
{
return new npc_mageguard_dalaranAI(pCreature);
}
/*######
## npc_hira_snowdawn
######*/
enum eHiraSnowdawn
{
SPELL_COLD_WEATHER_FLYING = 54197
};
#define GOSSIP_TEXT_TRAIN_HIRA "I seek training to ride a steed."
bool GossipHello_npc_hira_snowdawn(Player* pPlayer, Creature* pCreature)
{
if (!pCreature->isVendor() || !pCreature->isTrainer())
return false;
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_TRAIN_HIRA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN);
if (pPlayer->getLevel() >= 80 && pPlayer->HasSpell(SPELL_COLD_WEATHER_FLYING))
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_hira_snowdawn(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
if (uiAction == GOSSIP_ACTION_TRAIN)
pPlayer->SEND_TRAINERLIST(pCreature->GetGUID());
if (uiAction == GOSSIP_ACTION_TRADE)
pPlayer->SEND_VENDORLIST(pCreature->GetGUID());
return true;
}
void AddSC_dalaran()
{
Script *newscript;
newscript = new Script;
newscript->Name = "npc_mageguard_dalaran";
newscript->GetAI = &GetAI_npc_mageguard_dalaran;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_hira_snowdawn";
newscript->pGossipHello = &GossipHello_npc_hira_snowdawn;
newscript->pGossipSelect = &GossipSelect_npc_hira_snowdawn;
newscript->RegisterSelf();
}
@@ -0,0 +1,272 @@
/* 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: Dragonblight
SD%Complete: 100
SDComment:
SDCategory: Dragonblight
EndScriptData */
/* ContentData
npc_alexstrasza_wr_gate
EndContentData */
#include "ScriptedPch.h"
#include "ScriptedEscortAI.h"
enum eEnums
{
QUEST_RETURN_TO_AG_A = 12499,
QUEST_RETURN_TO_AG_H = 12500,
MOVIE_ID_GATES = 14
};
#define GOSSIP_ITEM_WHAT_HAPPENED "Alexstrasza, can you show me what happened here?"
bool GossipHello_npc_alexstrasza_wr_gate(Player* pPlayer, Creature* pCreature)
{
if (pCreature->isQuestGiver())
pPlayer->PrepareQuestMenu(pCreature->GetGUID());
if (pPlayer->GetQuestRewardStatus(QUEST_RETURN_TO_AG_A) || pPlayer->GetQuestRewardStatus(QUEST_RETURN_TO_AG_H))
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_WHAT_HAPPENED, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_alexstrasza_wr_gate(Player* pPlayer, Creature* /*pCreature*/, uint32 /*uiSender*/, uint32 uiAction)
{
if (uiAction == GOSSIP_ACTION_INFO_DEF+1)
{
pPlayer->CLOSE_GOSSIP_MENU();
pPlayer->SendMovieStart(MOVIE_ID_GATES);
}
return true;
}
/*######
## npc_inquisitor_hallard. Quest 12321
######*/
enum eInquisitor
{
NPC_GODFREY = 27577,
SPELL_HOLY_FIRE = 39323,
SAY_WP_0 = -1800014,
SAY_WP_1 = -1800015,
SAY_WP_2 = -1800016,
SAY_WP_3 = -1800017,
SAY_WP_4 = -1800018,
SAY_WP_5 = -1800019,
SAY_WP_6 = -1800020,
SAY_WP_7 = -1800021,
SAY_WP_8 = -1800022,
SAY_WP_9 = -1800023,
SAY_WP_10 = -1800024,
SAY_WP_11 = -1800025,
SAY_WP_12 = -1800026,
SAY_WP_13 = -1800027,
SAY_WP_14 = -1800028,
SAY_WP_15 = -1800029,
SAY_WP_16 = -1800030,
SAY_WP_17 = -1800031,
SAY_WP_18 = -1800032,
SAY_WP_19 = -1800033,
SAY_WP_20 = -1800034,
SAY_WP_21 = -1800035,
SAY_WP_22 = -1800036,
SAY_WP_23 = -1800037,
SAY_WP_24 = -1800038,
SAY_WP_25 = -1800039,
SAY_WP_26 = -1800040,
SAY_WP_27 = -1800041
};
#define QUEST_A_RIGHTEOUS_SERMON 12321
struct npc_inquisitor_hallardAI : public npc_escortAI
{
npc_inquisitor_hallardAI(Creature* pCreature) : npc_escortAI(pCreature) { }
bool Completed;
void WaypointReached(uint32 i)
{
Player* pPlayer = GetPlayerForEscort();
if (!pPlayer)
return;
Creature* Godfrey = me->FindNearestCreature(NPC_GODFREY, 50, true);
if (!Godfrey)
return;
switch (i)
{
case 1:
DoScriptText(SAY_WP_1, me, Godfrey);
me->SetUInt64Value(UNIT_FIELD_TARGET, Godfrey->GetGUID());
me->HandleEmoteCommand(5);
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
break;
case 2:
Godfrey->HandleEmoteCommand(434);
DoScriptText(SAY_WP_2, me, Godfrey);
me->HandleEmoteCommand(15);
break;
case 3:
DoScriptText(SAY_WP_3, me, Godfrey);
me->HandleEmoteCommand(1);
break;
case 4:
DoScriptText(SAY_WP_4, Godfrey);
break;
case 5:
DoScriptText(SAY_WP_5, Godfrey);
break;
case 6:
DoScriptText(SAY_WP_6, Godfrey);
break;
case 7:
DoScriptText(SAY_WP_7, me, Godfrey);
me->HandleEmoteCommand(1);
break;
case 8:
DoScriptText(SAY_WP_8, me, Godfrey);
me->HandleEmoteCommand(16);
break;
case 9:
DoScriptText(SAY_WP_9, me, Godfrey);
me->HandleEmoteCommand(5);
break;
case 10:
DoScriptText(SAY_WP_10, me, Godfrey);
DoCast(Godfrey, SPELL_HOLY_FIRE);
break;
case 11:
Godfrey->HandleEmoteCommand(434);
DoScriptText(SAY_WP_11, Godfrey);
break;
case 12:
DoScriptText(SAY_WP_12, me, Godfrey);
DoCast(Godfrey, SPELL_HOLY_FIRE);
break;
case 13:
DoScriptText(SAY_WP_13, me, Godfrey);
DoCast(Godfrey, SPELL_HOLY_FIRE);
break;
case 14:
Godfrey->HandleEmoteCommand(434);
DoScriptText(SAY_WP_14, Godfrey);
break;
case 15:
DoScriptText(SAY_WP_15, me, Godfrey);
DoCast(Godfrey, SPELL_HOLY_FIRE);
break;
case 16:
DoScriptText(SAY_WP_16, me, Godfrey);
break;
case 17:
DoScriptText(SAY_WP_17, me, Godfrey);
break;
case 18:
DoScriptText(SAY_WP_18, Godfrey);
break;
case 19:
DoScriptText(SAY_WP_19, me, Godfrey);
break;
case 20:
DoScriptText(SAY_WP_20, Godfrey);
break;
case 21:
DoScriptText(SAY_WP_21, Godfrey);
break;
case 22:
DoScriptText(SAY_WP_22, me, Godfrey);
break;
case 23:
DoScriptText(SAY_WP_23, Godfrey);
break;
case 24:
DoScriptText(SAY_WP_24, Godfrey);
break;
case 25:
DoScriptText(SAY_WP_25, me, Godfrey);
break;
case 26:
DoScriptText(SAY_WP_26, me);
me->SetUInt64Value(UNIT_FIELD_TARGET, pPlayer->GetGUID());
break;
case 27:
DoScriptText(SAY_WP_27, me, Godfrey);
me->SetUInt64Value(UNIT_FIELD_TARGET, Godfrey->GetGUID());
Completed = true;
if (pPlayer)
pPlayer->GroupEventHappens(QUEST_A_RIGHTEOUS_SERMON, me);
break;
}
}
void Reset()
{
Completed = false;
}
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
};
bool QuestAccept_npc_inquisitor_hallard(Player* pPlayer, Creature* pCreature, Quest const* quest)
{
if (quest->GetQuestId() == QUEST_A_RIGHTEOUS_SERMON)
{
DoScriptText(SAY_WP_0, pCreature, pPlayer);
if (npc_escortAI* pEscortAI = CAST_AI(npc_inquisitor_hallardAI, pCreature->AI()))
{
pEscortAI->Start(true, false, pPlayer->GetGUID(), 0, true);
pCreature->GetMotionMaster()->MovePoint(0, 3801.543, -679.350, 213.75);
}
}
return true;
}
CreatureAI* GetAI_npc_inquisitor_hallard(Creature* pCreature)
{
return new npc_inquisitor_hallardAI(pCreature);
}
void AddSC_dragonblight()
{
Script *newscript;
newscript = new Script;
newscript->Name = "npc_alexstrasza_wr_gate";
newscript->pGossipHello = &GossipHello_npc_alexstrasza_wr_gate;
newscript->pGossipSelect = &GossipSelect_npc_alexstrasza_wr_gate;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_inquisitor_hallard";
newscript->GetAI = &GetAI_npc_inquisitor_hallard;
newscript->pQuestAccept = &QuestAccept_npc_inquisitor_hallard;
newscript->RegisterSelf();
}
@@ -0,0 +1,270 @@
/*
* 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
*/
/*
* Comment: MAYBE need more improve the "Raptor Call".
*/
#include "ScriptedPch.h"
#include "drak_tharon_keep.h"
enum eSpells
{
SPELL_BELLOWING_ROAR = 22686, // fears the group, can be resisted/dispelled
SPELL_GRIEVOUS_BITE = 48920,
SPELL_MANGLING_SLASH = 48873, //casted on the current tank, adds debuf
SPELL_FEARSOME_ROAR = 48849,
H_SPELL_FEARSOME_ROAR = 59422, //Not stacking, debuff
SPELL_PIERCING_SLASH = 48878, //debuff -->Armor reduced by 75%
SPELL_RAPTOR_CALL = 59416, //dummy
SPELL_GUT_RIP = 49710,
SPELL_REND = 13738
};
enum eArchivements
{
ACHIEV_BETTER_OFF_DRED = 2039
};
enum Creatures
{
NPC_RAPTOR_1 = 26641,
NPC_RAPTOR_2 = 26628
};
struct boss_dredAI : public ScriptedAI
{
boss_dredAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
uint32 uiBellowingRoarTimer;
uint32 uiGrievousBiteTimer;
uint32 uiManglingSlashTimer;
uint32 uiFearsomeRoarTimer;
uint32 uiPiercingSlashTimer;
uint32 uiRaptorCallTimer;
ScriptedInstance* pInstance;
void Reset()
{
if (pInstance)
{
pInstance->SetData(DATA_DRED_EVENT,NOT_STARTED);
pInstance->SetData(DATA_KING_DRED_ACHIEV, 0);
}
uiBellowingRoarTimer = 33*IN_MILISECONDS;
uiGrievousBiteTimer = 20*IN_MILISECONDS;
uiManglingSlashTimer = 18.5*IN_MILISECONDS;
uiFearsomeRoarTimer = urand(10*IN_MILISECONDS,20*IN_MILISECONDS);
uiPiercingSlashTimer = 17*IN_MILISECONDS;
uiRaptorCallTimer = urand(20*IN_MILISECONDS,25*IN_MILISECONDS);
}
void EnterCombat(Unit* /*who*/)
{
if (pInstance)
pInstance->SetData(DATA_DRED_EVENT,IN_PROGRESS);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (uiBellowingRoarTimer < diff)
{
DoCastAOE(SPELL_BELLOWING_ROAR, false);
uiBellowingRoarTimer = 40*IN_MILISECONDS;
} else uiBellowingRoarTimer -=diff;
if (uiGrievousBiteTimer < diff)
{
DoCastVictim(SPELL_GRIEVOUS_BITE ,false);
uiGrievousBiteTimer = 20*IN_MILISECONDS;
} else uiGrievousBiteTimer -=diff;
if (uiManglingSlashTimer < diff)
{
DoCastVictim(SPELL_MANGLING_SLASH,false);
uiManglingSlashTimer = 20*IN_MILISECONDS;
} else uiManglingSlashTimer -=diff;
if (uiFearsomeRoarTimer < diff)
{
DoCastAOE(SPELL_FEARSOME_ROAR,false);
uiFearsomeRoarTimer = urand(16*IN_MILISECONDS,18*IN_MILISECONDS);
} else uiFearsomeRoarTimer -=diff;
if (uiPiercingSlashTimer < diff)
{
DoCastVictim(SPELL_PIERCING_SLASH,false);
uiPiercingSlashTimer = 20*IN_MILISECONDS;
} else uiPiercingSlashTimer -=diff;
if (uiRaptorCallTimer < diff)
{
DoCastVictim(SPELL_RAPTOR_CALL,false);
float x,y,z;
me->GetClosePoint(x,y,z,me->GetObjectSize()/3,10.0f);
me->SummonCreature(RAND(NPC_RAPTOR_1,NPC_RAPTOR_2),x,y,z,0,TEMPSUMMON_DEAD_DESPAWN,1*IN_MILISECONDS);
uiRaptorCallTimer = urand(20*IN_MILISECONDS,25*IN_MILISECONDS);
} else uiRaptorCallTimer -=diff;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
if (pInstance)
{
pInstance->SetData(DATA_DRED_EVENT,DONE);
if (IsHeroic() && pInstance->GetData(DATA_KING_DRED_ACHIEV) == 6)
pInstance->DoCompleteAchievement(ACHIEV_BETTER_OFF_DRED);
}
}
};
CreatureAI* GetAI_boss_dred(Creature* pCreature)
{
return new boss_dredAI (pCreature);
}
struct npc_drakkari_gutripperAI : public ScriptedAI
{
npc_drakkari_gutripperAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
uint32 GutRipTimer;
void Reset()
{
GutRipTimer = urand(10000,15000);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (GutRipTimer < diff)
{
DoCastVictim(SPELL_GUT_RIP,false);
GutRipTimer = urand(10000,15000);
}else GutRipTimer -=diff;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
if (pInstance)
{
if (IsHeroic() && pInstance->GetData(DATA_DRED_EVENT) == IN_PROGRESS && pInstance->GetData(DATA_KING_DRED_ACHIEV) < 6)
{
pInstance->SetData(DATA_KING_DRED_ACHIEV, pInstance->GetData(DATA_KING_DRED_ACHIEV) + 1);
}
}
}
};
CreatureAI* GetAI_npc_drakkari_gutripper(Creature* pCreature)
{
return new npc_drakkari_gutripperAI (pCreature);
}
struct npc_drakkari_scytheclawAI : public ScriptedAI
{
npc_drakkari_scytheclawAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
uint32 uiRendTimer;
void Reset()
{
uiRendTimer = urand(10*IN_MILISECONDS,15*IN_MILISECONDS);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (uiRendTimer < diff)
{
DoCastVictim(SPELL_REND,false);
uiRendTimer = urand(10*IN_MILISECONDS,15*IN_MILISECONDS);
}else uiRendTimer -=diff;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
if (pInstance)
{
if (IsHeroic() && pInstance->GetData(DATA_DRED_EVENT) == IN_PROGRESS && pInstance->GetData(DATA_KING_DRED_ACHIEV) < 6)
{
pInstance->SetData(DATA_KING_DRED_ACHIEV, pInstance->GetData(DATA_KING_DRED_ACHIEV) + 1);
}
}
}
};
CreatureAI* GetAI_npc_drakkari_scytheclaw(Creature* pCreature)
{
return new npc_drakkari_scytheclawAI (pCreature);
}
void AddSC_boss_dred()
{
Script *newscript;
newscript = new Script;
newscript->Name = "npc_drakkari_gutripper";
newscript->GetAI = &GetAI_npc_drakkari_gutripper;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_drakkari_scytheclaw";
newscript->GetAI = &GetAI_npc_drakkari_scytheclaw;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "boss_dred";
newscript->GetAI = &GetAI_boss_dred;
newscript->RegisterSelf();
}
@@ -0,0 +1,328 @@
/*
* Copyright (C) 2008 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "drak_tharon_keep.h"
enum Spells
{
SPELL_ARCANE_BLAST = 49198,
H_SPELL_ARCANE_BLAST = 59909,
SPELL_ARCANE_FIELD = 47346,
SPELL_BLIZZARD = 49034,
H_SPELL_BLIZZARD = 59854,
SPELL_FROSTBOLT = 49037,
H_SPELL_FROSTBOLT = 59855,
SPELL_WRATH_OF_MISERY = 50089,
H_SPELL_WRATH_OF_MISERY = 59856,
SPELL_SUMMON_MINIONS = 59910 //Summons an army of Fetid Troll Corpses to assist the caster.
};
//not in db
enum Yells
{
SAY_AGGRO = -1600000,
SAY_KILL = -1600001,
SAY_DEATH = -1600002,
SAY_NECRO_ADD = -1600003,
SAY_REUBBLE_1 = -1600004,
SAY_REUBBLE_2 = -1600005
};
enum Creatures
{
CREATURE_RISEN_SHADOWCASTER = 27600,
CREATURE_FETID_TROLL_CORPSE = 27598,
CREATURE_HULKING_CORPSE = 27597,
CREATURE_CRYSTAL_HANDLER = 26627
};
enum CombatPhase
{
IDLE,
PHASE_1,
PHASE_2
};
enum Achievements
{
ACHIEV_OH_NOVOS = 2057
};
static Position AddSpawnPoint = { -379.20, -816.76, 59.70 };
static Position CrystalHandlerSpawnPoint = { -326.626343, -709.956604, 27.813314 };
static Position AddDestinyPoint = { -379.314545, -772.577637, 28.58837 };
struct boss_novosAI : public Scripted_NoMovementAI
{
boss_novosAI(Creature *c) : Scripted_NoMovementAI(c), lSummons(me)
{
pInstance = c->GetInstanceData();
}
uint32 uiTimer;
uint32 uiCrystalHandlerTimer;
bool bAchiev;
SummonList lSummons;
std::list<uint64> luiCrystals;
CombatPhase Phase;
ScriptedInstance* pInstance;
void Reset()
{
Phase = IDLE;
luiCrystals.clear();
bAchiev = true;
me->CastStop();
lSummons.DespawnAll();
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE))
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
if (pInstance)
{
pInstance->SetData(DATA_NOVOS_EVENT, NOT_STARTED);
luiCrystals.push_back(pInstance->GetData64(DATA_NOVOS_CRYSTAL_1));
luiCrystals.push_back(pInstance->GetData64(DATA_NOVOS_CRYSTAL_2));
luiCrystals.push_back(pInstance->GetData64(DATA_NOVOS_CRYSTAL_3));
luiCrystals.push_back(pInstance->GetData64(DATA_NOVOS_CRYSTAL_4));
for (std::list<uint64>::const_iterator itr = luiCrystals.begin(); itr != luiCrystals.end(); ++itr)
{
if (GameObject* pTemp = pInstance->instance->GetGameObject(*itr))
pTemp->SetGoState(GO_STATE_READY);
}
}
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
Phase = PHASE_1;
uiCrystalHandlerTimer = 30*IN_MILISECONDS;
uiTimer = 1*IN_MILISECONDS;
DoCast(SPELL_ARCANE_FIELD);
if (pInstance)
{
for (std::list<uint64>::const_iterator itr = luiCrystals.begin(); itr != luiCrystals.end(); ++itr)
{
if (GameObject *pTemp = pInstance->instance->GetGameObject(*itr))
pTemp->SetGoState(GO_STATE_ACTIVE);
}
pInstance->SetData(DATA_NOVOS_EVENT, IN_PROGRESS);
}
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
void UpdateAI(const uint32 diff)
{
switch (Phase)
{
case PHASE_1:
if (uiTimer <= diff)
{
Creature *pSummon = me->SummonCreature(RAND(CREATURE_FETID_TROLL_CORPSE,CREATURE_HULKING_CORPSE,CREATURE_RISEN_SHADOWCASTER), AddSpawnPoint, TEMPSUMMON_CORPSE_TIMED_DESPAWN,20*IN_MILISECONDS);
pSummon->GetMotionMaster()->MovePoint(0, AddDestinyPoint);
//If spell is casted stops casting arcane field so no spell casting
//DoCast(me, SPELL_SUMMON_MINIONS);
uiTimer = 3*IN_MILISECONDS;
} else uiTimer -= diff;
if (uiCrystalHandlerTimer <= diff)
{
DoScriptText(SAY_NECRO_ADD, me);
Creature *pCrystalHandler = me->SummonCreature(CREATURE_CRYSTAL_HANDLER, CrystalHandlerSpawnPoint, TEMPSUMMON_CORPSE_TIMED_DESPAWN,20*IN_MILISECONDS);
pCrystalHandler->GetMotionMaster()->MovePoint(0, AddDestinyPoint);
uiCrystalHandlerTimer = urand(20*IN_MILISECONDS,30*IN_MILISECONDS);
} else uiCrystalHandlerTimer -= diff;
break;
case PHASE_2:
if (uiTimer <= diff)
{
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
DoCast(pTarget, DUNGEON_MODE(RAND(SPELL_ARCANE_BLAST,SPELL_BLIZZARD,SPELL_FROSTBOLT,SPELL_WRATH_OF_MISERY),
RAND(H_SPELL_ARCANE_BLAST,H_SPELL_BLIZZARD,H_SPELL_FROSTBOLT,H_SPELL_WRATH_OF_MISERY)));
uiTimer = urand(1*IN_MILISECONDS,3*IN_MILISECONDS);
} else uiTimer -= diff;
break;
}
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
{
pInstance->SetData(DATA_NOVOS_EVENT, DONE);
if (IsHeroic() && bAchiev)
pInstance->DoCompleteAchievement(ACHIEV_OH_NOVOS);
}
lSummons.DespawnAll();
}
void KilledUnit(Unit * victim)
{
if (victim == me)
return;
DoScriptText(SAY_KILL, me);
}
void JustSummoned(Creature *summon)
{
lSummons.Summon(summon);
}
void RemoveCrystal()
{
if (!luiCrystals.empty())
{
if (pInstance)
if (GameObject *pTemp = pInstance->instance->GetGameObject(luiCrystals.back()))
pTemp->SetGoState(GO_STATE_READY);
luiCrystals.pop_back();
}
if (luiCrystals.empty())
{
me->CastStop();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Phase = PHASE_2;
uiTimer = 1*IN_MILISECONDS;
}
}
Unit* GetRandomTarget()
{
return SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
}
};
enum CrystalHandlerSpells
{
SPELL_FLASH_OF_DARKNESS = 49668,
H_SPELL_FLASH_OF_DARKNESS = 59004
};
struct mob_crystal_handlerAI : public ScriptedAI
{
mob_crystal_handlerAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
uint32 uiFlashOfDarknessTimer;
ScriptedInstance *pInstance;
void Reset()
{
uiFlashOfDarknessTimer = 5*IN_MILISECONDS;
}
void JustDied(Unit* /*killer*/)
{
if (Creature* pNovos = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_NOVOS) : 0))
CAST_AI(boss_novosAI,pNovos->AI())->RemoveCrystal();
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (uiFlashOfDarknessTimer <= diff)
{
DoCast(me->getVictim(), DUNGEON_MODE(SPELL_FLASH_OF_DARKNESS,H_SPELL_FLASH_OF_DARKNESS));
uiFlashOfDarknessTimer = 5*IN_MILISECONDS;
} else uiFlashOfDarknessTimer -= diff;
DoMeleeAttackIfReady();
}
void MovementInform(uint32 type, uint32 id)
{
if (type != POINT_MOTION_TYPE || id != 0)
return;
if (Creature *pNovos = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_NOVOS) : 0))
if (Unit *pTarget = CAST_AI(boss_novosAI, pNovos->AI())->GetRandomTarget())
AttackStart(pTarget);
}
};
struct mob_novos_minionAI : public ScriptedAI
{
mob_novos_minionAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance *pInstance;
void MovementInform(uint32 type, uint32 id)
{
if (type != POINT_MOTION_TYPE || id !=0)
return;
if (Creature* pNovos = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_NOVOS) : 0))
{
CAST_AI(boss_novosAI, pNovos->AI())->bAchiev = false;
if (Unit *pTarget = CAST_AI(boss_novosAI, pNovos->AI())->GetRandomTarget())
AttackStart(pTarget);
}
}
};
CreatureAI* GetAI_boss_novos(Creature* pCreature)
{
return new boss_novosAI (pCreature);
}
CreatureAI* GetAI_mob_crystal_handler(Creature* pCreature)
{
return new mob_crystal_handlerAI (pCreature);
}
CreatureAI* GetAI_mob_novos_minion(Creature* pCreature)
{
return new mob_novos_minionAI (pCreature);
}
void AddSC_boss_novos()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_novos";
newscript->GetAI = &GetAI_boss_novos;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_crystal_handler";
newscript->GetAI = &GetAI_mob_crystal_handler;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_novos_minion";
newscript->GetAI = &GetAI_mob_novos_minion;
newscript->RegisterSelf();
}
@@ -0,0 +1,260 @@
/*
* 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 "drak_tharon_keep.h"
enum Spells
{
//skeletal spells (phase 1)
SPELL_CURSE_OF_LIFE = 49527,
H_SPELL_CURSE_OF_LIFE = 59972,
SPELL_RAIN_OF_FIRE = 49518,
H_SPELL_RAIN_OF_FIRE = 59971,
SPELL_SHADOW_VOLLEY = 49528,
H_SPELL_SHADOW_VOLLEY = 59973,
SPELL_DECAY_FLESH = 49356, //casted at end of phase 1, starts phase 2
//flesh spells (phase 2)
SPELL_GIFT_OF_THARON_JA = 52509,
SPELL_EYE_BEAM = 49544,
H_SPELL_EYE_BEAM = 59965,
SPELL_LIGHTNING_BREATH = 49537,
H_SPELL_LIGHTNING_BREATH = 59963,
SPELL_POISON_CLOUD = 49548,
H_SPELL_POISON_CLOUD = 59969,
SPELL_RETURN_FLESH = 53463, //Channeled spell ending phase two and returning to phase 1. This ability will stun the party for 6 seconds.
SPELL_ACHIEVEMENT_CHECK = 61863,
};
enum Yells
{
SAY_AGGRO = -1600011,
SAY_KILL_1 = -1600012,
SAY_KILL_2 = -1600013,
SAY_FLESH_1 = -1600014,
SAY_FLESH_2 = -1600015,
SAY_SKELETON_1 = -1600016,
SAY_SKELETON_2 = -1600017,
SAY_DEATH = -1600018
};
enum Models
{
MODEL_FLESH = 27073,
MODEL_SKELETON = 27511
};
enum CombatPhase
{
SKELETAL,
GOING_FLESH,
FLESH,
GOING_SKELETAL
};
struct boss_tharon_jaAI : public ScriptedAI
{
boss_tharon_jaAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
uint32 uiPhaseTimer;
uint32 uiCurseOfLifeTimer;
uint32 uiRainOfFireTimer;
uint32 uiShadowVolleyTimer;
uint32 uiEyeBeamTimer;
uint32 uiLightningBreathTimer;
uint32 uiPoisonCloudTimer;
CombatPhase Phase;
ScriptedInstance* pInstance;
void Reset()
{
uiPhaseTimer = 20*IN_MILISECONDS;
uiCurseOfLifeTimer = 1*IN_MILISECONDS;
uiRainOfFireTimer = urand(14*IN_MILISECONDS,18*IN_MILISECONDS);
uiShadowVolleyTimer = urand(8*IN_MILISECONDS,10*IN_MILISECONDS);
Phase = SKELETAL;
me->SetDisplayId(me->GetNativeDisplayId());
if (pInstance)
pInstance->SetData(DATA_THARON_JA_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
pInstance->SetData(DATA_THARON_JA_EVENT, IN_PROGRESS);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
switch (Phase)
{
case SKELETAL:
if (uiCurseOfLifeTimer < diff)
{
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
DoCast(pTarget, SPELL_CURSE_OF_LIFE);
uiCurseOfLifeTimer = urand(10*IN_MILISECONDS,15*IN_MILISECONDS);
} else uiCurseOfLifeTimer -= diff;
if (uiShadowVolleyTimer < diff)
{
DoCastVictim(SPELL_SHADOW_VOLLEY);
uiShadowVolleyTimer = urand(8*IN_MILISECONDS,10*IN_MILISECONDS);
} else uiShadowVolleyTimer -= diff;
if (uiRainOfFireTimer < diff)
{
DoCastAOE(SPELL_RAIN_OF_FIRE);
uiRainOfFireTimer = urand(14*IN_MILISECONDS,18*IN_MILISECONDS);
} else uiRainOfFireTimer -= diff;
if (uiPhaseTimer < diff)
{
DoCast(SPELL_DECAY_FLESH);
Phase = GOING_FLESH;
uiPhaseTimer = 6*IN_MILISECONDS;
} else uiPhaseTimer -= diff;
DoMeleeAttackIfReady();
break;
case GOING_FLESH:
if (uiPhaseTimer < diff)
{
DoScriptText(RAND(SAY_FLESH_1,SAY_FLESH_2),me);
me->SetDisplayId(MODEL_FLESH);
std::list<HostileReference*>& threatlist = me->getThreatManager().getThreatList();
for (std::list<HostileReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
{
Unit *pTemp = Unit::GetUnit((*me),(*itr)->getUnitGuid());
if (pTemp && pTemp->GetTypeId() == TYPEID_PLAYER)
{
me->AddAura(SPELL_GIFT_OF_THARON_JA,pTemp);
pTemp->SetDisplayId(MODEL_SKELETON);
}
}
uiPhaseTimer = 20*IN_MILISECONDS;
uiLightningBreathTimer = urand(3*IN_MILISECONDS,4*IN_MILISECONDS);
uiEyeBeamTimer = urand(4*IN_MILISECONDS,8*IN_MILISECONDS);
uiPoisonCloudTimer = urand(6*IN_MILISECONDS,7*IN_MILISECONDS);
Phase = FLESH;
} else uiPhaseTimer -= diff;
break;
case FLESH:
if (uiLightningBreathTimer < diff)
{
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
DoCast(pTarget, SPELL_LIGHTNING_BREATH);
uiLightningBreathTimer = urand(6*IN_MILISECONDS,7*IN_MILISECONDS);
} else uiLightningBreathTimer -= diff;
if (uiEyeBeamTimer < diff)
{
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
DoCast(pTarget, SPELL_EYE_BEAM);
uiEyeBeamTimer = urand(4*IN_MILISECONDS,6*IN_MILISECONDS);
} else uiEyeBeamTimer -= diff;
if (uiPoisonCloudTimer < diff)
{
DoCastAOE(SPELL_POISON_CLOUD);
uiPoisonCloudTimer = urand(10*IN_MILISECONDS,12*IN_MILISECONDS);
} else uiPoisonCloudTimer -= diff;
if (uiPhaseTimer < diff)
{
DoCast(SPELL_RETURN_FLESH);
Phase = GOING_SKELETAL;
uiPhaseTimer = 6*IN_MILISECONDS;
} else uiPhaseTimer -= diff;
DoMeleeAttackIfReady();
break;
case GOING_SKELETAL:
if (uiPhaseTimer < diff)
{
DoScriptText(RAND(SAY_SKELETON_1,SAY_SKELETON_2), me);
me->DeMorph();
Phase = SKELETAL;
uiPhaseTimer = 20*IN_MILISECONDS;
uiCurseOfLifeTimer = 1*IN_MILISECONDS;
uiRainOfFireTimer = urand(14*IN_MILISECONDS,18*IN_MILISECONDS);
uiShadowVolleyTimer = urand(8*IN_MILISECONDS,10*IN_MILISECONDS);
std::list<HostileReference*>& threatlist = me->getThreatManager().getThreatList();
for (std::list<HostileReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
{
Unit *pTemp = Unit::GetUnit((*me),(*itr)->getUnitGuid());
if (pTemp && pTemp->GetTypeId() == TYPEID_PLAYER)
{
if (pTemp->HasAura(SPELL_GIFT_OF_THARON_JA))
pTemp->RemoveAura(SPELL_GIFT_OF_THARON_JA);
pTemp->DeMorph();
}
}
} else uiPhaseTimer -= diff;
break;
}
}
void KilledUnit(Unit * /*victim*/)
{
DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2),me);
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH,me);
if (pInstance)
{
// clean morph on players
Map::PlayerList const &PlayerList = pInstance->instance->GetPlayers();
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
if (Player *pPlayer = i->getSource())
pPlayer->DeMorph();
// cast is not rewarding the achievement.
// DoCast(SPELL_ACHIEVEMENT_CHECK);
pInstance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2, SPELL_ACHIEVEMENT_CHECK);
pInstance->SetData(DATA_THARON_JA_EVENT, DONE);
}
}
};
CreatureAI* GetAI_boss_tharon_ja(Creature* pCreature)
{
return new boss_tharon_jaAI (pCreature);
}
void AddSC_boss_tharon_ja()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_tharon_ja";
newscript->GetAI = &GetAI_boss_tharon_ja;
newscript->RegisterSelf();
}
@@ -0,0 +1,197 @@
/*
* 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
*/
/*
* Comment: TODO: spawn troll waves
*/
#include "ScriptedPch.h"
#include "drak_tharon_keep.h"
enum Spells
{
SPELL_INFECTED_WOUND = 49637,
SPELL_CRUSH = 49639,
SPELL_CORPSE_EXPLODE = 49555,
SPELL_CONSUME = 49380,
SPELL_CONSUME_AURA = 49381,
//Heroic spells
H_SPELL_CORPSE_EXPLODE = 59807,
H_SPELL_CONSUME = 59803,
H_SPELL_CONSUME_AURA = 59805,
};
enum Yells
{
SAY_AGGRO = -1600006,
SAY_KILL = -1600007,
SAY_CONSUME = -1600008,
SAY_EXPLODE = -1600009,
SAY_DEATH = -1600010
};
enum Achievements
{
ACHIEV_CONSUMPTION_JUNCTION = 2151
};
enum Creatures
{
NPC_DRAKKARI_INVADER_1 = 27753,
NPC_DRAKKARI_INVADER_2 = 27709
};
Position AddSpawnPoint = { -260.493011, -622.968018, 26.605301, 3.036870 };
struct boss_trollgoreAI : public ScriptedAI
{
boss_trollgoreAI(Creature *c) : ScriptedAI(c), lSummons(me)
{
pInstance = c->GetInstanceData();
}
uint32 uiConsumeTimer;
uint32 uiAuraCountTimer;
uint32 uiCrushTimer;
uint32 uiInfectedWoundTimer;
uint32 uiExplodeCorpseTimer;
uint32 uiSpawnTimer;
bool bAchiev;
SummonList lSummons;
ScriptedInstance* pInstance;
void Reset()
{
uiConsumeTimer = 15*IN_MILISECONDS;
uiAuraCountTimer = 15.5*IN_MILISECONDS;
uiCrushTimer = urand(1*IN_MILISECONDS,5*IN_MILISECONDS);
uiInfectedWoundTimer = urand(60*IN_MILISECONDS,10*IN_MILISECONDS);
uiExplodeCorpseTimer = 3*IN_MILISECONDS;
uiSpawnTimer = urand(30*IN_MILISECONDS,40*IN_MILISECONDS);
bAchiev = IsHeroic();
lSummons.DespawnAll();
me->RemoveAura(DUNGEON_MODE(SPELL_CONSUME_AURA,H_SPELL_CONSUME_AURA));
if (pInstance)
pInstance->SetData(DATA_TROLLGORE_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
pInstance->SetData(DATA_TROLLGORE_EVENT, IN_PROGRESS);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (uiSpawnTimer <= diff)
{
uint32 spawnNumber = urand(2,DUNGEON_MODE(3,5));
for (uint8 i = 0; i < spawnNumber; ++i)
DoSummon(RAND(NPC_DRAKKARI_INVADER_1,NPC_DRAKKARI_INVADER_2), AddSpawnPoint, 0, TEMPSUMMON_DEAD_DESPAWN);
uiSpawnTimer = urand(30*IN_MILISECONDS,40*IN_MILISECONDS);
} else uiSpawnTimer -= diff;
if (uiConsumeTimer <= diff)
{
DoScriptText(SAY_CONSUME, me);
DoCast(SPELL_CONSUME);
uiConsumeTimer = 15*IN_MILISECONDS;
} else uiConsumeTimer -= diff;
if (bAchiev)
{
Aura *pConsumeAura = me->GetAura(DUNGEON_MODE(SPELL_CONSUME_AURA,H_SPELL_CONSUME_AURA));
if (pConsumeAura && pConsumeAura->GetStackAmount() > 9)
bAchiev = false;
}
if (uiCrushTimer <= diff)
{
DoCastVictim(SPELL_CRUSH);
uiCrushTimer = urand(10*IN_MILISECONDS,15*IN_MILISECONDS);
} else uiCrushTimer -= diff;
if (uiInfectedWoundTimer <= diff)
{
DoCastVictim(SPELL_INFECTED_WOUND);
uiInfectedWoundTimer = urand(25*IN_MILISECONDS,35*IN_MILISECONDS);
} else uiInfectedWoundTimer -= diff;
if (uiExplodeCorpseTimer <= diff)
{
DoCast(SPELL_CORPSE_EXPLODE);
DoScriptText(SAY_EXPLODE, me);
uiExplodeCorpseTimer = urand(15*IN_MILISECONDS,19*IN_MILISECONDS);
} else uiExplodeCorpseTimer -= diff;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
lSummons.DespawnAll();
if (pInstance)
{
if (bAchiev)
pInstance->DoCompleteAchievement(ACHIEV_CONSUMPTION_JUNCTION);
pInstance->SetData(DATA_TROLLGORE_EVENT, DONE);
}
}
void KilledUnit(Unit * victim)
{
if (victim == me)
return;
DoScriptText(SAY_KILL, me);
}
void JustSummoned(Creature* summon)
{
lSummons.push_back(summon->GetGUID());
if (summon->AI())
summon->AI()->AttackStart(me);
}
};
CreatureAI* GetAI_boss_trollgore(Creature* pCreature)
{
return new boss_trollgoreAI (pCreature);
}
void AddSC_boss_trollgore()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_trollgore";
newscript->GetAI = &GetAI_boss_trollgore;
newscript->RegisterSelf();
}
@@ -0,0 +1,40 @@
/*
* Copyright (C) 2008 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef DEF_DRAK_THARON_H
#define DEF_DRAK_THARON_H
enum Data
{
DATA_TROLLGORE_EVENT,
DATA_NOVOS_EVENT,
DATA_DRED_EVENT,
DATA_THARON_JA_EVENT,
DATA_KING_DRED_ACHIEV
};
enum Data64
{
DATA_TROLLGORE,
DATA_NOVOS,
DATA_DRED,
DATA_THARON_JA,
DATA_NOVOS_CRYSTAL_1,
DATA_NOVOS_CRYSTAL_2,
DATA_NOVOS_CRYSTAL_3,
DATA_NOVOS_CRYSTAL_4
};
#endif
@@ -0,0 +1,243 @@
/*
* 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 "drak_tharon_keep.h"
#define MAX_ENCOUNTER 4
/* Drak'Tharon Keep encounters:
0 - Trollgore
1 - Novos
2 - King Dred
3 - Tharon Ja
*/
enum Creatures
{
NPC_TROLLGORE = 26630,
NPC_NOVOS = 26631,
NPC_KING_DRED = 27483,
NPC_THARON_JA = 26632
};
enum GameObjects
{
GO_NOVOS_CRYSTAL_1 = 189299,
GO_NOVOS_CRYSTAL_2 = 189300,
GO_NOVOS_CRYSTAL_3 = 189301,
GO_NOVOS_CRYSTAL_4 = 189302
};
struct instance_drak_tharon : public ScriptedInstance
{
instance_drak_tharon(Map* pMap) : ScriptedInstance(pMap) {Initialize();};
uint8 uiDredAchievCounter;
uint64 uiTrollgore;
uint64 uiNovos;
uint64 uiDred;
uint64 uiTharonJa;
uint64 uiNovosCrystal1;
uint64 uiNovosCrystal2;
uint64 uiNovosCrystal3;
uint64 uiNovosCrystal4;
uint8 m_auiEncounter[MAX_ENCOUNTER];
std::string str_data;
void Initialize()
{
uiTrollgore = 0;
uiNovos = 0;
uiDred = 0;
uiTharonJa = 0;
uiNovosCrystal1 = 0;
uiNovosCrystal2 = 0;
uiNovosCrystal3 = 0;
uiNovosCrystal4 = 0;
uiDredAchievCounter = 0;
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) return true;
return false;
}
void OnGameObjectCreate(GameObject* pGo, bool /*add*/)
{
switch(pGo->GetEntry())
{
case GO_NOVOS_CRYSTAL_1:
uiNovosCrystal1 = pGo->GetGUID();
break;
case GO_NOVOS_CRYSTAL_2:
uiNovosCrystal2 = pGo->GetGUID();
break;
case GO_NOVOS_CRYSTAL_3:
uiNovosCrystal3 = pGo->GetGUID();
break;
case GO_NOVOS_CRYSTAL_4:
uiNovosCrystal4 = pGo->GetGUID();
break;
}
}
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
{
switch(pCreature->GetEntry())
{
case NPC_TROLLGORE:
uiTrollgore = pCreature->GetGUID();
break;
case NPC_NOVOS:
uiNovos = pCreature->GetGUID();
break;
case NPC_KING_DRED:
uiDred = pCreature->GetGUID();
break;
case NPC_THARON_JA:
uiTharonJa = pCreature->GetGUID();
break;
}
}
uint64 GetData64(uint32 identifier)
{
switch(identifier)
{
case DATA_TROLLGORE: return uiTrollgore;
case DATA_NOVOS: return uiNovos;
case DATA_DRED: return uiDred;
case DATA_THARON_JA: return uiTharonJa;
case DATA_NOVOS_CRYSTAL_1: return uiNovosCrystal1;
case DATA_NOVOS_CRYSTAL_2: return uiNovosCrystal2;
case DATA_NOVOS_CRYSTAL_3: return uiNovosCrystal3;
case DATA_NOVOS_CRYSTAL_4: return uiNovosCrystal4;
}
return 0;
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
case DATA_TROLLGORE_EVENT:
m_auiEncounter[0] = data;
break;
case DATA_NOVOS_EVENT:
m_auiEncounter[1] = data;
break;
case DATA_DRED_EVENT:
m_auiEncounter[2] = data;
break;
case DATA_THARON_JA_EVENT:
m_auiEncounter[3] = data;
break;
case DATA_KING_DRED_ACHIEV:
uiDredAchievCounter = data;
break;
}
if (data == DONE)
{
SaveToDB();
}
}
uint32 GetData(uint32 type)
{
switch (type)
{
case DATA_TROLLGORE_EVENT: return m_auiEncounter[0];
case DATA_NOVOS_EVENT: return m_auiEncounter[1];
case DATA_DRED_EVENT: return m_auiEncounter[2];
case DATA_THARON_JA_EVENT: return m_auiEncounter[3];
case DATA_KING_DRED_ACHIEV: return uiDredAchievCounter;
}
return 0;
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::string str_data;
std::ostringstream saveStream;
saveStream << "D K " << m_auiEncounter[0] << " " << m_auiEncounter[1] << " "
<< m_auiEncounter[2] << " " << m_auiEncounter[3];
str_data = saveStream.str();
OUT_SAVE_INST_DATA_COMPLETE;
return str_data;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
uint16 data0,data1,data2,data3;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3;
if (dataHead1 == 'D' && dataHead2 == 'K')
{
m_auiEncounter[0] = data0;
m_auiEncounter[1] = data1;
m_auiEncounter[2] = data2;
m_auiEncounter[3] = data3;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
m_auiEncounter[i] = NOT_STARTED;
} else OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
InstanceData* GetInstanceData_instance_drak_tharon(Map* pMap)
{
return new instance_drak_tharon(pMap);
}
void AddSC_instance_drak_tharon()
{
Script *newscript;
newscript = new Script;
newscript->Name = "instance_drak_tharon";
newscript->GetInstanceData = &GetInstanceData_instance_drak_tharon;
newscript->RegisterSelf();
}
@@ -0,0 +1,263 @@
/* Copyright (C) 2006 - 2010 TrinityCore <https://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 "forge_of_souls.h"
/*
* TODO:
* - Fix Soul Storm spell and remove work around.
*/
enum Yells
{
SAY_AGGRO = -1632001,
SAY_SLAY_1 = -1632002,
SAY_SLAY_2 = -1632003,
SAY_DEATH = -1632004,
SAY_SOUL_STORM = -1632005,
SAY_CORRUPT_SOUL = -1632006,
};
enum Spells
{
SPELL_MAGIC_S_BANE = 68793,
SPELL_CORRUPT_SOUL = 68839,
SPELL_CONSUME_SOUL = 68858,
SPELL_TELEPORT = 68988,
SPELL_FEAR = 68950,
SPELL_SOULSTORM = 68872,
SPELL_SOULSTORM_AURA = 68921,
SPELL_SHADOW_BOLT = 70043,
};
enum Events
{
EVENT_NONE,
EVENT_SHADOW_BOLT,
EVENT_MAGIC_BANE,
EVENT_CORRUPT_SOUL,
EVENT_SOUL_STORM,
EVENT_SOUL_STORM_AURA,
EVENT_FEAR,
};
enum CombatPhases
{
PHASE_1,
PHASE_2
};
struct boss_bronjahmAI : public ScriptedAI
{
boss_bronjahmAI(Creature *c) : ScriptedAI(c)
{
pInstance = me->GetInstanceData();
}
ScriptedInstance* pInstance;
EventMap events;
CombatPhases phase;
void Reset()
{
phase = PHASE_1;
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
events.Reset();
events.ScheduleEvent(EVENT_SHADOW_BOLT, 2000);
events.ScheduleEvent(EVENT_MAGIC_BANE, urand(8000,15000));
events.ScheduleEvent(EVENT_CORRUPT_SOUL, urand(25000,35000));
if (pInstance)
pInstance->SetData(DATA_BRONJAHM_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
pInstance->SetData(DATA_BRONJAHM_EVENT, IN_PROGRESS);
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
pInstance->SetData(DATA_BRONJAHM_EVENT, DONE);
}
void KilledUnit(Unit * /*who*/)
{
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
}
// Cast aura spell on all players farther than 10y
void ApplySoulStorm()
{
std::list<Unit*> targetList;
SelectTargetList(targetList, 100, SELECT_TARGET_TOPAGGRO, -10.0f);
if (targetList.empty())
return;
for (std::list<Unit *>::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr)
{
Unit* pUnit = (*itr);
if (pUnit && pUnit->isAlive())
me->CastSpell(pUnit, SPELL_SOULSTORM_AURA, true);
}
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
if (phase == PHASE_1 && HealthBelowPct(30))
{
phase = PHASE_2;
DoCast(me,SPELL_TELEPORT);
me->GetMotionMaster()->Clear();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
events.CancelEvent(EVENT_CORRUPT_SOUL);
events.ScheduleEvent(EVENT_SOUL_STORM, 1000);
events.ScheduleEvent(EVENT_FEAR, urand(8000,12000));
return;
}
while (uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
{
case EVENT_CORRUPT_SOUL:
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,1))
{
DoScriptText(SAY_CORRUPT_SOUL, me);
DoCast(pTarget,SPELL_CORRUPT_SOUL);
}
events.ScheduleEvent(EVENT_CORRUPT_SOUL, urand(25000,35000));
break;
case EVENT_SOUL_STORM:
DoScriptText(SAY_SOUL_STORM, me);
// DoCast(me, SPELL_SOULSTORM); bug: put the aura without the limit of 10 yards.
events.ScheduleEvent(EVENT_SOUL_STORM_AURA, 1000);
break;
case EVENT_SOUL_STORM_AURA:
ApplySoulStorm();
events.ScheduleEvent(EVENT_SOUL_STORM_AURA, 1000);
break;
case EVENT_FEAR:
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,1))
DoCast(pTarget,SPELL_FEAR);
events.ScheduleEvent(EVENT_FEAR, urand(8000,12000));
break;
case EVENT_SHADOW_BOLT:
DoCastVictim(SPELL_SHADOW_BOLT);
events.ScheduleEvent(EVENT_SHADOW_BOLT, 2000);
break;
case EVENT_MAGIC_BANE:
DoCastVictim(SPELL_MAGIC_S_BANE);
events.ScheduleEvent(EVENT_MAGIC_BANE, urand(8000,15000));
break;
}
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_bronjahm(Creature* pCreature)
{
return new boss_bronjahmAI(pCreature);
}
struct mob_corrupted_soul_fragmentAI : public ScriptedAI
{
mob_corrupted_soul_fragmentAI(Creature *c) : ScriptedAI(c)
{
pInstance = me->GetInstanceData();
}
ScriptedInstance* pInstance;
uint32 uiCheckTimer;
void Reset()
{
uiCheckTimer = 0; // first check is immediate
}
void UpdateAI(const uint32 diff)
{
if (uiCheckTimer <= diff)
{
if (pInstance)
{
Creature* pBronjham = Unit::GetCreature(*me, pInstance->GetData64(DATA_BRONJAHM));
if (pBronjham && pBronjham->isAlive())
{
if (me->IsWithinMeleeRange(pBronjham))
{
pBronjham->CastSpell(pBronjham, SPELL_CONSUME_SOUL, true);
me->ForcedDespawn();
}
else
{
Position pos;
pBronjham->GetPosition(&pos);
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MovePoint(0, pos);
}
}
else
me->ForcedDespawn();
}
uiCheckTimer = 500;
}
else
uiCheckTimer -= diff;
}
};
CreatureAI* GetAI_mob_corrupted_soul_fragment(Creature* pCreature)
{
return new mob_corrupted_soul_fragmentAI(pCreature);
}
void AddSC_boss_bronjahm()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_bronjahm";
newscript->GetAI = &GetAI_boss_bronjahm;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_corrupted_soul_fragment";
newscript->GetAI = &GetAI_mob_corrupted_soul_fragment;
newscript->RegisterSelf();
}
@@ -0,0 +1,349 @@
/* Copyright (C) 2006 - 2010 TrinityCore <https://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 "forge_of_souls.h"
/*
* TODO:
* - Fix model id during unleash soul -> seems DB issue 36503 is missing (likewise 36504 is also missing).
* - Fix outro npc movement
*/
#define PI 3.1415f
enum Yells
{
SAY_FACE_ANGER_AGGRO = -1632010,
SAY_FACE_DESIRE_AGGRO = -1632011,
SAY_FACE_ANGER_SLAY_1 = -1632012,
SAY_FACE_SORROW_SLAY_1 = -1632013,
SAY_FACE_DESIRE_SLAY_1 = -1632014,
SAY_FACE_ANGER_SLAY_2 = -1632015,
SAY_FACE_SORROW_SLAY_2 = -1632016,
SAY_FACE_DESIRE_SLAY_2 = -1632017,
SAY_FACE_SORROW_DEATH = -1632019,
SAY_FACE_DESIRE_DEATH = -1632020,
EMOTE_MIRRORED_SOUL = -1632021,
EMOTE_UNLEASH_SOUL = -1632022,
SAY_FACE_ANGER_UNLEASH_SOUL = -1632023,
SAY_FACE_SORROW_UNLEASH_SOUL = -1632024,
SAY_FACE_DESIRE_UNLEASH_SOUL = -1632025,
EMOTE_WAILING_SOUL = -1632026,
SAY_FACE_ANGER_WAILING_SOUL = -1632027,
SAY_FACE_DESIRE_WAILING_SOUL = -1632028,
SAY_JAINA_OUTRO = -1632029,
SAY_SYLVANAS_OUTRO = -1632030,
};
enum Spells
{
SPELL_PHANTOM_BLAST = 68982,
H_SPELL_PHANTOM_BLAST = 70322,
SPELL_MIRRORED_SOUL = 69051,
SPELL_WELL_OF_SOULS = 68820,
SPELL_WELL_OF_SOULS_VIS = 68854,
SPELL_UNLEASHED_SOULS = 68939,
SPELL_WAILING_SOULS_STARTING = 68912, // Initial spell cast at begining of wailing souls phase
SPELL_WAILING_SOULS_BEAM = 68875, // the beam visual
SPELL_WAILING_SOULS = 68873, // the actual spell
H_SPELL_WAILING_SOULS = 70324,
// 68871,68873,68875,68876,68899,68912,70324,
// 68899 trigger 68871
};
enum Events
{
EVENT_NONE,
EVENT_PHANTOM_BLAST,
EVENT_MIRRORED_SOUL,
EVENT_WELL_OF_SOULS,
EVENT_UNLEASHED_SOULS,
EVENT_WAILING_SOULS,
EVENT_WAILING_SOULS_TICK,
EVENT_FACE_ANGER,
};
enum eEnum
{
ACHIEV_THREE_FACED = 4523,
DISPLAY_ANGER = 30148,
DISPLAY_SORROW = 30149,
DISPLAY_DESIRE = 30150,
};
struct
{
uint32 entry[2];
Position movePosition;
} outroPositions[] =
{
{ NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE, { 5590.47, 2427.79, 705.935, 0.802851 } },
{ NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE, { 5593.59, 2428.34, 705.935, 0.977384 } },
{ NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE, { 5600.81, 2429.31, 705.935, 0.890118 } },
{ NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE, { 5600.81, 2421.12, 705.935, 0.890118 } },
{ NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE, { 5601.43, 2426.53, 705.935, 0.890118 } },
{ NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE, { 5601.55, 2418.36, 705.935, 1.15192 } },
{ NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE, { 5598, 2429.14, 705.935, 1.0472 } },
{ NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE, { 5594.04, 2424.87, 705.935, 1.15192 } },
{ NPC_CHAMPION_1_ALLIANCE, NPC_CHAMPION_1_HORDE, { 5597.89, 2421.54, 705.935, 0.610865 } },
{ NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE, { 5598.57, 2434.62, 705.935, 1.13446 } },
{ NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE, { 5585.46, 2417.99, 705.935, 1.06465 } },
{ NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE, { 5605.81, 2428.42, 705.935, 0.820305 } },
{ NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE, { 5591.61, 2412.66, 705.935, 0.925025 } },
{ NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE, { 5593.9, 2410.64, 705.935, 0.872665 } },
{ NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_2_HORDE, { 5586.76, 2416.73, 705.935, 0.942478 } },
{ NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE, { 5592.23, 2419.14, 705.935, 0.855211 } },
{ NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE, { 5594.61, 2416.87, 705.935, 0.907571 } },
{ NPC_CHAMPION_2_ALLIANCE, NPC_CHAMPION_3_HORDE, { 5589.77, 2421.03, 705.935, 0.855211 } },
{ NPC_KORELN, NPC_LORALEN, { 5602.58, 2435.95, 705.935, 0.959931 } },
{ NPC_ELANDRA, NPC_KALIRA, { 5606.13, 2433.16, 705.935, 0.785398 } },
{ NPC_JAINA_PART2, NPC_SYLVANAS_PART2, { 5606.12, 2436.6, 705.935, 0.890118 } },
{ 0, 0, { 0, 0, 0, 0 } }
};
struct boss_devourer_of_soulsAI : public ScriptedAI
{
boss_devourer_of_soulsAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
bool bThreeFaceAchievement;
ScriptedInstance* pInstance;
EventMap events;
// wailing soul event
float beamAngle;
float beamAngleDiff;
int8 wailingSoulTick;
uint64 uiMirroredSoulTarget;
void Reset()
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
me->SetDisplayId(DISPLAY_ANGER);
me->SetReactState(REACT_AGGRESSIVE);
events.Reset();
bThreeFaceAchievement = true;
uiMirroredSoulTarget = 0;
if (pInstance)
pInstance->SetData(DATA_DEVOURER_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
if (pInstance)
pInstance->SetData(DATA_DEVOURER_EVENT, IN_PROGRESS);
DoScriptText(RAND(SAY_FACE_ANGER_AGGRO,SAY_FACE_DESIRE_AGGRO), me);
events.ScheduleEvent(EVENT_PHANTOM_BLAST, 5000);
events.ScheduleEvent(EVENT_MIRRORED_SOUL, 8000);
events.ScheduleEvent(EVENT_WELL_OF_SOULS, 30000);
events.ScheduleEvent(EVENT_UNLEASHED_SOULS, 20000);
events.ScheduleEvent(EVENT_WAILING_SOULS, urand(60000,70000));
}
void DamageTaken(Unit * /*pDoneBy*/, uint32 &uiDamage)
{
if (uiMirroredSoulTarget && me->HasAura(SPELL_MIRRORED_SOUL))
{
if (Player *pPlayer = Unit::GetPlayer(uiMirroredSoulTarget))
{
if (Aura *pAura = pPlayer->GetAura(SPELL_MIRRORED_SOUL))
{
int32 mirrorDamage = (uiDamage * 45)/100;
me->CastCustomSpell(pPlayer, 69034, &mirrorDamage, 0, 0, true);
// me->DealDamage(pPlayer, (uiDamage * 45)/100, 0, SPELL_DIRECT_DAMAGE, SPELL_SCHOOL_MASK_SHADOW);
}
else
uiMirroredSoulTarget = 0;
}
}
}
void KilledUnit(Unit * /*victim*/)
{
DoScriptText(RAND(SAY_FACE_ANGER_SLAY_1,SAY_FACE_SORROW_SLAY_1,SAY_FACE_DESIRE_SLAY_1,
SAY_FACE_ANGER_SLAY_2,SAY_FACE_SORROW_SLAY_2,SAY_FACE_DESIRE_SLAY_2), me);
}
void JustDied(Unit* /*killer*/)
{
Position spawnPoint = { 5618.139, 2451.873, 705.854 };
DoScriptText(RAND(SAY_FACE_SORROW_DEATH,SAY_FACE_DESIRE_DEATH), me);
if (pInstance)
{
pInstance->SetData(DATA_DEVOURER_EVENT, DONE);
if (bThreeFaceAchievement && IsHeroic())
pInstance->DoCompleteAchievement(ACHIEV_THREE_FACED);
int32 entryIndex;
if (pInstance->GetData(DATA_TEAM_IN_INSTANCE) == TEAM_ALLIANCE)
entryIndex = 0;
else
entryIndex = 1;
for (int8 i = 0; outroPositions[i].entry[entryIndex] != 0; ++i)
{
if (Creature *pSummon = me->SummonCreature(outroPositions[i].entry[entryIndex], spawnPoint, TEMPSUMMON_DEAD_DESPAWN))
{
pSummon->GetMotionMaster()->MovePoint(0, outroPositions[i].movePosition);
if (pSummon->GetEntry() == NPC_JAINA_PART2)
DoScriptText(SAY_JAINA_OUTRO, pSummon);
else if (pSummon->GetEntry() == NPC_SYLVANAS_PART2)
DoScriptText(SAY_SYLVANAS_OUTRO, pSummon);
}
}
}
}
void SpellHitTarget(Unit* /*pTarget*/, const SpellEntry *pSpell)
{
if (pSpell->Id == H_SPELL_PHANTOM_BLAST)
bThreeFaceAchievement = false;
}
void UpdateAI(const uint32 diff)
{
// Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
{
case EVENT_PHANTOM_BLAST:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_TOPAGGRO, 0))
DoCast(pTarget, SPELL_PHANTOM_BLAST);
events.ScheduleEvent(EVENT_PHANTOM_BLAST, 5000);
break;
case EVENT_MIRRORED_SOUL:
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true))
{
uiMirroredSoulTarget = pTarget->GetGUID();
DoCast(pTarget, SPELL_MIRRORED_SOUL);
DoScriptText(EMOTE_MIRRORED_SOUL, me);
}
events.ScheduleEvent(EVENT_MIRRORED_SOUL, urand(15000,30000));
break;
case EVENT_WELL_OF_SOULS:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_WELL_OF_SOULS);
events.ScheduleEvent(EVENT_WELL_OF_SOULS, 20000);
break;
case EVENT_UNLEASHED_SOULS:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_UNLEASHED_SOULS);
me->SetDisplayId(DISPLAY_SORROW);
DoScriptText(RAND(SAY_FACE_ANGER_UNLEASH_SOUL,SAY_FACE_SORROW_UNLEASH_SOUL,SAY_FACE_DESIRE_UNLEASH_SOUL), me);
DoScriptText(EMOTE_UNLEASH_SOUL, me);
events.ScheduleEvent(EVENT_UNLEASHED_SOULS, 30000);
events.ScheduleEvent(EVENT_FACE_ANGER, 5000);
break;
case EVENT_FACE_ANGER:
me->SetDisplayId(DISPLAY_ANGER);
break;
case EVENT_WAILING_SOULS:
me->SetDisplayId(DISPLAY_DESIRE);
DoScriptText(RAND(SAY_FACE_ANGER_WAILING_SOUL,SAY_FACE_DESIRE_WAILING_SOUL), me);
DoScriptText(EMOTE_WAILING_SOUL, me);
DoCast(me, SPELL_WAILING_SOULS_STARTING);
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
me->SetOrientation(me->GetAngle(pTarget));
DoCast(me, SPELL_WAILING_SOULS_BEAM);
}
beamAngle = me->GetOrientation();
beamAngleDiff = PI/30.0f; // PI/2 in 15 sec = PI/30 per tick
if (RAND(true,false))
beamAngleDiff = -beamAngleDiff;
me->InterruptNonMeleeSpells(false);
me->SetReactState(REACT_PASSIVE);
//Remove any target
me->SetUInt64Value(UNIT_FIELD_TARGET, 0);
me->GetMotionMaster()->Clear();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
wailingSoulTick = 15;
events.DelayEvents(18000); // no other events during wailing souls
events.ScheduleEvent(EVENT_WAILING_SOULS_TICK, 3000); // first one after 3 secs.
break;
case EVENT_WAILING_SOULS_TICK:
beamAngle += beamAngleDiff;
me->SetOrientation(beamAngle);
me->StopMoving();
DoCast(me, SPELL_WAILING_SOULS);
if (--wailingSoulTick)
events.ScheduleEvent(EVENT_WAILING_SOULS_TICK, 1000);
else
{
me->SetReactState(REACT_AGGRESSIVE);
me->SetDisplayId(DISPLAY_ANGER);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
me->GetMotionMaster()->MoveChase(me->getVictim());
events.ScheduleEvent(EVENT_WAILING_SOULS, urand(60000,70000));
}
break;
}
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_devourer_of_souls(Creature* pCreature)
{
return new boss_devourer_of_soulsAI(pCreature);
}
void AddSC_boss_devourer_of_souls()
{
Script *newscript;
newscript = new Script;
newscript->Name="boss_devourer_of_souls";
newscript->GetAI = &GetAI_boss_devourer_of_souls;
newscript->RegisterSelf();
}
@@ -0,0 +1,899 @@
/* Copyright (C) 2006 - 2010 TrinityCore <https://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 "forge_of_souls.h"
enum Spells
{
//Spiteful Apparition
SPELL_SPITE = 68895,
H_SPELL_SPITE = 70212,
//Spectral Warden
SPELL_VEIL_OF_SHADOWS = 69633,
SPELL_WAIL_OF_SOULS = 69148,
H_SPELL_WAIL_OF_SOULS = 70210,
//Soulguard Watchman
SPELL_SHROUD_OF_RUNES = 69056,
SPELL_UNHOLY_RAGE = 69053,
//Soulguard Reaper
SPELL_FROST_NOVA = 69060,
H_SPELL_FROST_NOVA = 70209,
SPELL_SHADOW_LANCE = 69058,
//Soulguard Bonecaster
SPELL_BONE_VOLLEY = 69080,
H_SPELL_BONE_VOLLEY = 70206,
SPELL_RAISE_DEAD = 69562,
SPELL_SHIELD_OF_BONES = 69069,
H_SPELL_SHIELD_OF_BONES = 70207,
//Soulguard Animator
// Raise dead 69562
SPELL_SHADOW_BOLT = 69068,
H_SPELL_SHADOW_BOLT = 70208,
SPELL_SOUL_SICKNESS = 69131,
SPELL_SOUL_SIPHON = 69128,
//Soulguard Adept
//Raise dead 69562
//Shadow Bolt 69068/70208
SPELL_DRAIN_LIFE = 69066,
H_SPELL_DRAIN_LIFE = 70213,
SPELL_SHADOW_MEND = 69564,
H_SPELL_SHADOW_MEND = 70205,
//Soul Horror
SPELL_SOUL_STRIKE = 69088,
H_SPELL_SOUL_STRIKE = 70211,
};
enum Events
{
EVENT_NONE,
// Jaina/Sylvanas Intro
EVENT_INTRO_1,
EVENT_INTRO_2,
EVENT_INTRO_3,
EVENT_INTRO_4,
EVENT_INTRO_5,
EVENT_INTRO_6,
EVENT_INTRO_7,
EVENT_INTRO_8,
//Spiteful Apparition
EVENT_SPITE,
//Spectral Warden
EVENT_VEIL_OF_SHADOWS,
EVENT_WAIL_OF_SOULS,
//Soulguard Watchman
EVENT_SHROUD_OF_RUNES,
EVENT_UNHOLY_RAGE,
//Soulguard Reaper
EVENT_FROST_NOVA,
EVENT_SHADOW_LANCE,
//Soulguard Bonecaster
EVENT_BONE_VOLLEY,
EVENT_RAISE_DEAD,
EVENT_SHIELD_OF_BONES,
//Soulguard Animator
EVENT_SHADOW_BOLT,
EVENT_SOUL_SICKNESS,
EVENT_SOUL_SIPHON,
//Soulguard Adept
EVENT_DRAIN_LIFE,
EVENT_SHADOW_MEND,
//Soul Horror
EVENT_SOUL_STRIKE,
};
/****************************************SYLVANAS************************************/
#define GOSSIP_SYLVANAS_ITEM "What would you have of me, Banshee Queen?"
#define GOSSIP_JAINA_ITEM "What would you have of me, my lady?"
enum Yells
{
SAY_JAINA_INTRO_1 = -1632040,
SAY_JAINA_INTRO_2 = -1632041,
SAY_JAINA_INTRO_3 = -1632042,
SAY_JAINA_INTRO_4 = -1632043,
SAY_JAINA_INTRO_5 = -1632044,
SAY_JAINA_INTRO_6 = -1632045,
SAY_JAINA_INTRO_7 = -1632046,
SAY_JAINA_INTRO_8 = -1632047,
SAY_SYLVANAS_INTRO_1 = -1632050,
SAY_SYLVANAS_INTRO_2 = -1632051,
SAY_SYLVANAS_INTRO_3 = -1632052,
SAY_SYLVANAS_INTRO_4 = -1632053,
SAY_SYLVANAS_INTRO_5 = -1632054,
SAY_SYLVANAS_INTRO_6 = -1632055,
};
enum eSylvanas
{
GOSSIP_SPEECHINTRO = 13525,
ACTION_INTRO,
};
enum Phase
{
PHASE_NORMAL,
PHASE_INTRO,
};
struct npc_sylvanas_fosAI: public ScriptedAI
{
npc_sylvanas_fosAI(Creature *c) : ScriptedAI(c)
{
pInstance = me->GetInstanceData();
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
}
ScriptedInstance* pInstance;
EventMap events;
Phase phase;
void Reset()
{
events.Reset();
phase = PHASE_NORMAL;
}
void DoAction(const int32 actionId)
{
switch(actionId)
{
case ACTION_INTRO:
{
phase = PHASE_INTRO;
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
events.Reset();
events.ScheduleEvent(EVENT_INTRO_1, 1000);
}
}
}
void UpdateAI(const uint32 diff)
{
if (phase == PHASE_INTRO)
{
if (!pInstance)
return;
events.Update(diff);
switch(events.ExecuteEvent())
{
case EVENT_INTRO_1:
DoScriptText(SAY_SYLVANAS_INTRO_1, me);
events.ScheduleEvent(EVENT_INTRO_2, 11500);
break;
case EVENT_INTRO_2:
DoScriptText(SAY_SYLVANAS_INTRO_2, me);
events.ScheduleEvent(EVENT_INTRO_3, 10500);
break;
case EVENT_INTRO_3:
DoScriptText(SAY_SYLVANAS_INTRO_3, me);
events.ScheduleEvent(EVENT_INTRO_4, 9500);
break;
case EVENT_INTRO_4:
DoScriptText(SAY_SYLVANAS_INTRO_4, me);
events.ScheduleEvent(EVENT_INTRO_5, 10500);
break;
case EVENT_INTRO_5:
DoScriptText(SAY_SYLVANAS_INTRO_5, me);
events.ScheduleEvent(EVENT_INTRO_6, 9500);
break;
case EVENT_INTRO_6:
DoScriptText(SAY_SYLVANAS_INTRO_6, me);
// End of Intro
phase = PHASE_NORMAL;
break;
}
}
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
//if (me->hasUnitState(UNIT_STAT_CASTING))
// return;
//while (uint32 eventId = events.ExecuteEvent())
//{
// switch(eventId)
// {
// }
//}
DoMeleeAttackIfReady();
}
};
struct npc_jaina_fosAI: public ScriptedAI
{
npc_jaina_fosAI(Creature *c) : ScriptedAI(c)
{
pInstance = me->GetInstanceData();
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
}
ScriptedInstance* pInstance;
EventMap events;
Phase phase;
void Reset()
{
events.Reset();
phase = PHASE_NORMAL;
}
void DoAction(const int32 actionId)
{
switch(actionId)
{
case ACTION_INTRO:
{
phase = PHASE_INTRO;
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
events.Reset();
events.ScheduleEvent(EVENT_INTRO_1, 1000);
}
}
}
void UpdateAI(const uint32 diff)
{
if (phase == PHASE_INTRO)
{
if (!pInstance)
return;
events.Update(diff);
switch(events.ExecuteEvent())
{
case EVENT_INTRO_1:
DoScriptText(SAY_JAINA_INTRO_1, me);
events.ScheduleEvent(EVENT_INTRO_2, 8000);
break;
case EVENT_INTRO_2:
DoScriptText(SAY_JAINA_INTRO_2, me);
events.ScheduleEvent(EVENT_INTRO_3, 8500);
break;
case EVENT_INTRO_3:
DoScriptText(SAY_JAINA_INTRO_3, me);
events.ScheduleEvent(EVENT_INTRO_4, 8000);
break;
case EVENT_INTRO_4:
DoScriptText(SAY_JAINA_INTRO_4, me);
events.ScheduleEvent(EVENT_INTRO_5, 10000);
break;
case EVENT_INTRO_5:
DoScriptText(SAY_JAINA_INTRO_5, me);
events.ScheduleEvent(EVENT_INTRO_6, 8000);
break;
case EVENT_INTRO_6:
DoScriptText(SAY_JAINA_INTRO_6, me);
events.ScheduleEvent(EVENT_INTRO_7, 12000);
break;
case EVENT_INTRO_7:
DoScriptText(SAY_JAINA_INTRO_7, me);
events.ScheduleEvent(EVENT_INTRO_8, 8000);
break;
case EVENT_INTRO_8:
DoScriptText(SAY_JAINA_INTRO_8, me);
// End of Intro
phase = PHASE_NORMAL;
break;
}
}
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
//if (me->hasUnitState(UNIT_STAT_CASTING))
// return;
//while (uint32 eventId = events.ExecuteEvent())
//{
// switch(eventId)
// {
// }
//}
DoMeleeAttackIfReady();
}
};
bool GossipHello_npc_jaina_or_slyvanas_fos(Player* pPlayer, Creature* pCreature)
{
if (pCreature->isQuestGiver())
pPlayer->PrepareQuestMenu(pCreature->GetGUID());
if (pCreature->GetEntry() == NPC_JAINA_PART1)
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_JAINA_ITEM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
else
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SYLVANAS_ITEM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_jaina_or_slyvanas_fos(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
switch(uiAction)
{
case GOSSIP_ACTION_INFO_DEF+1:
pPlayer->CLOSE_GOSSIP_MENU();
if (pCreature->AI())
pCreature->AI()->DoAction(ACTION_INTRO);
break;
}
return true;
}
struct mob_spiteful_apparitionAI: public ScriptedAI
{
mob_spiteful_apparitionAI(Creature *c) : ScriptedAI(c)
{
}
EventMap events;
void Reset()
{
events.Reset();
}
void EnterCombat(Unit* /*who*/)
{
events.ScheduleEvent(EVENT_SPITE, 8000);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
{
case EVENT_SPITE:
DoCast(me->getVictim(), SPELL_SPITE);
events.RescheduleEvent(EVENT_SPITE, 8000);
return;
}
}
DoMeleeAttackIfReady();
}
};
struct mob_spectral_wardenAI: public ScriptedAI
{
mob_spectral_wardenAI(Creature *c) : ScriptedAI(c)
{
}
EventMap events;
void Reset()
{
events.Reset();
}
void EnterCombat(Unit* /*who*/)
{
events.ScheduleEvent(EVENT_VEIL_OF_SHADOWS, 5000);
events.ScheduleEvent(EVENT_WAIL_OF_SOULS, 10000);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
{
case EVENT_VEIL_OF_SHADOWS:
DoCast(me->getVictim(), SPELL_VEIL_OF_SHADOWS);
events.RescheduleEvent(EVENT_VEIL_OF_SHADOWS, 10000);
return;
case EVENT_WAIL_OF_SOULS:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_WAIL_OF_SOULS);
events.RescheduleEvent(EVENT_WAIL_OF_SOULS, 5000);
return;
}
}
DoMeleeAttackIfReady();
}
};
struct mob_soulguard_watchmanAI: public ScriptedAI
{
mob_soulguard_watchmanAI(Creature *c) : ScriptedAI(c)
{
}
EventMap events;
void Reset()
{
events.Reset();
}
void EnterCombat(Unit* /*who*/)
{
events.ScheduleEvent(EVENT_SHROUD_OF_RUNES, 1000);
events.ScheduleEvent(EVENT_UNHOLY_RAGE, 1000);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
{
case EVENT_SHROUD_OF_RUNES:
DoCast(me, SPELL_SHROUD_OF_RUNES);
events.RescheduleEvent(EVENT_SHROUD_OF_RUNES, 5000);
return;
case EVENT_UNHOLY_RAGE:
DoCast(me, SPELL_UNHOLY_RAGE);
events.RescheduleEvent(EVENT_UNHOLY_RAGE, 99999);
return;
}
}
DoMeleeAttackIfReady();
}
};
struct mob_soulguard_reaperAI: public ScriptedAI
{
mob_soulguard_reaperAI(Creature *c) : ScriptedAI(c)
{
}
EventMap events;
void Reset()
{
events.Reset();
}
void EnterCombat(Unit* /*who*/)
{
events.ScheduleEvent(EVENT_FROST_NOVA, 8000);
events.ScheduleEvent(EVENT_SHADOW_LANCE, 5000);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
{
case EVENT_FROST_NOVA:
DoCast(me, SPELL_FROST_NOVA);
events.RescheduleEvent(EVENT_FROST_NOVA, 9600);
return;
case EVENT_SHADOW_LANCE:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_SHADOW_LANCE);
events.RescheduleEvent(EVENT_SHADOW_LANCE, 8000);
return;
}
}
DoMeleeAttackIfReady();
}
};
struct mob_soulguard_bonecasterAI: public ScriptedAI
{
mob_soulguard_bonecasterAI(Creature *c) : ScriptedAI(c)
{
}
EventMap events;
void Reset()
{
events.Reset();
}
void EnterCombat(Unit* /*who*/)
{
events.ScheduleEvent(EVENT_BONE_VOLLEY, 6000);
events.ScheduleEvent(EVENT_RAISE_DEAD, 25000);
events.ScheduleEvent(EVENT_SHIELD_OF_BONES, 6000);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
{
case EVENT_BONE_VOLLEY:
DoCastAOE(SPELL_BONE_VOLLEY);
events.RescheduleEvent(EVENT_BONE_VOLLEY, 7000);
return;
case EVENT_RAISE_DEAD:
DoCast(me, SPELL_RAISE_DEAD);
events.RescheduleEvent(EVENT_RAISE_DEAD, 25000);
return;
case EVENT_SHIELD_OF_BONES:
DoCast(me, SPELL_SHIELD_OF_BONES);
events.RescheduleEvent(EVENT_SHIELD_OF_BONES, 8000);
return;
}
}
DoMeleeAttackIfReady();
}
};
struct mob_soulguard_animatorAI: public ScriptedAI
{
mob_soulguard_animatorAI(Creature *c) : ScriptedAI(c)
{
}
EventMap events;
void Reset()
{
events.Reset();
}
void EnterCombat(Unit* /*who*/)
{
events.ScheduleEvent(EVENT_RAISE_DEAD, 25000);
events.ScheduleEvent(EVENT_SHADOW_BOLT, 5000);
events.ScheduleEvent(EVENT_SOUL_SICKNESS, 8000);
events.ScheduleEvent(EVENT_SOUL_SIPHON, 10000);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
{
case EVENT_RAISE_DEAD:
DoCast(me, SPELL_RAISE_DEAD);
events.RescheduleEvent(EVENT_RAISE_DEAD, 25000);
return;
case EVENT_SHADOW_BOLT:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_SHADOW_BOLT);
events.RescheduleEvent(EVENT_SHADOW_BOLT, 5000);
return;
case EVENT_SOUL_SICKNESS:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_SOUL_SICKNESS);
events.RescheduleEvent(EVENT_SOUL_SICKNESS, 10000);
return;
case EVENT_SOUL_SIPHON:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_SOUL_SIPHON);
events.RescheduleEvent(EVENT_SOUL_SIPHON, 8000);
return;
}
}
DoMeleeAttackIfReady();
}
};
struct mob_soulguard_adeptAI: public ScriptedAI
{
mob_soulguard_adeptAI(Creature *c) : ScriptedAI(c)
{
}
EventMap events;
void Reset()
{
events.Reset();
}
void EnterCombat(Unit* /*who*/)
{
events.ScheduleEvent(EVENT_RAISE_DEAD, 25000);
events.ScheduleEvent(EVENT_SHADOW_BOLT, 8000);
events.ScheduleEvent(EVENT_DRAIN_LIFE, 7000);
events.ScheduleEvent(EVENT_SHADOW_MEND, 35000);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
{
case EVENT_RAISE_DEAD:
DoCast(me, SPELL_RAISE_DEAD);
events.RescheduleEvent(EVENT_RAISE_DEAD, 25000);
return;
case EVENT_SHADOW_BOLT:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_SHADOW_BOLT);
events.RescheduleEvent(EVENT_SHADOW_BOLT, 4000);
return;
case EVENT_DRAIN_LIFE:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_DRAIN_LIFE);
events.RescheduleEvent(EVENT_DRAIN_LIFE, 9000);
return;
case EVENT_SHADOW_MEND:
DoCast(me, SPELL_SHADOW_MEND);
events.RescheduleEvent(EVENT_SHADOW_MEND, 20000);
return;
}
}
DoMeleeAttackIfReady();
}
};
struct mob_soul_horrorAI: public ScriptedAI
{
mob_soul_horrorAI(Creature *c) : ScriptedAI(c)
{
}
EventMap events;
void Reset()
{
events.Reset();
}
void EnterCombat(Unit* /*who*/)
{
events.ScheduleEvent(EVENT_SOUL_STRIKE, 6000);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
{
case EVENT_SOUL_STRIKE:
DoCast(me->getVictim(), SPELL_SOUL_STRIKE);
events.RescheduleEvent(EVENT_SOUL_STRIKE, 8000);
return;
}
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_npc_jaina_fosAI(Creature* pCreature)
{
return new npc_jaina_fosAI(pCreature);
};
CreatureAI* GetAI_npc_sylvanas_fosAI(Creature* pCreature)
{
return new npc_sylvanas_fosAI(pCreature);
};
CreatureAI* GetAI_mob_spiteful_apparitionAI(Creature* pCreature)
{
return new mob_spiteful_apparitionAI(pCreature);
}
CreatureAI* GetAI_mob_spectral_wardenAI(Creature* pCreature)
{
return new mob_spectral_wardenAI(pCreature);
}
CreatureAI* GetAI_mob_soulguard_watchmanAI(Creature* pCreature)
{
return new mob_soulguard_watchmanAI(pCreature);
}
CreatureAI* GetAI_mob_soulguard_reaperAI(Creature* pCreature)
{
return new mob_soulguard_reaperAI(pCreature);
}
CreatureAI* GetAI_mob_soulguard_bonecasterAI(Creature* pCreature)
{
return new mob_soulguard_bonecasterAI(pCreature);
}
CreatureAI* GetAI_mob_soulguard_animatorAI(Creature* pCreature)
{
return new mob_soulguard_animatorAI(pCreature);
}
CreatureAI* GetAI_mob_soulguard_adeptAI(Creature* pCreature)
{
return new mob_soulguard_adeptAI(pCreature);
}
CreatureAI* GetAI_mob_soul_horrorAI(Creature* pCreature)
{
return new mob_soul_horrorAI(pCreature);
}
void AddSC_forge_of_souls()
{
Script *newscript;
newscript = new Script;
newscript->Name = "npc_sylvanas_fos";
newscript->GetAI = &GetAI_npc_sylvanas_fosAI;
newscript->pGossipHello = &GossipHello_npc_jaina_or_slyvanas_fos;
newscript->pGossipSelect = &GossipSelect_npc_jaina_or_slyvanas_fos;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_jaina_fos";
newscript->GetAI = &GetAI_npc_jaina_fosAI;
newscript->pGossipHello = &GossipHello_npc_jaina_or_slyvanas_fos;
newscript->pGossipSelect = &GossipSelect_npc_jaina_or_slyvanas_fos;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="mob_spiteful_apparition";
newscript->GetAI = &GetAI_mob_spiteful_apparitionAI;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="mob_spectral_warden";
newscript->GetAI = &GetAI_mob_spectral_wardenAI;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="mob_soulguard_watchman";
newscript->GetAI = &GetAI_mob_soulguard_watchmanAI;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="mob_soulguard_reaper";
newscript->GetAI = &GetAI_mob_soulguard_reaperAI;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="mob_soulguard_bonecaster";
newscript->GetAI = &GetAI_mob_soulguard_bonecasterAI;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="mob_soulguard_animator";
newscript->GetAI = &GetAI_mob_soulguard_animatorAI;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="mob_soulguard_adept";
newscript->GetAI = &GetAI_mob_soulguard_adeptAI;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="mob_soul_horror";
newscript->GetAI = &GetAI_mob_soul_horrorAI;
newscript->RegisterSelf();
}
@@ -0,0 +1,52 @@
/* Copyright (C) 2006 - 2010 TrinityCore <https://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_FORGE_OF_SOULS_H
#define DEF_FORGE_OF_SOULS_H
enum Data
{
DATA_BRONJAHM_EVENT,
DATA_DEVOURER_EVENT,
DATA_TEAM_IN_INSTANCE,
};
enum Data64
{
DATA_BRONJAHM,
DATA_DEVOURER,
};
enum Creatures
{
CREATURE_BRONJAHM = 36497,
CREATURE_DEVOURER = 36502,
NPC_SYLVANAS_PART1 = 37596,
NPC_SYLVANAS_PART2 = 38161,
NPC_JAINA_PART1 = 37597,
NPC_JAINA_PART2 = 38160,
NPC_KALIRA = 37583,
NPC_ELANDRA = 37774,
NPC_LORALEN = 37779,
NPC_KORELN = 37582,
NPC_CHAMPION_1_HORDE = 37584,
NPC_CHAMPION_2_HORDE = 37587,
NPC_CHAMPION_3_HORDE = 37588,
NPC_CHAMPION_1_ALLIANCE = 37496,
NPC_CHAMPION_2_ALLIANCE = 37497,
};
#endif
@@ -0,0 +1,168 @@
/* Copyright (C) 2006 - 2010 TrinityCore <https://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 "forge_of_souls.h"
#define MAX_ENCOUNTER 2
/* Forge of Souls encounters:
0- Bronjahm, The Godfather of Souls
1- The Devourer of Souls
*/
struct instance_forge_of_souls : public ScriptedInstance
{
instance_forge_of_souls(Map* pMap) : ScriptedInstance(pMap) {};
uint64 uiBronjahm;
uint64 uiDevourer;
uint32 uiEncounter[MAX_ENCOUNTER];
uint32 uiTeamInInstance;
void Initialize()
{
uiBronjahm = 0;
uiDevourer = 0;
uiTeamInInstance = 0;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
uiEncounter[i] = NOT_STARTED;
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (uiEncounter[i] == IN_PROGRESS) return true;
return false;
}
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
{
Map::PlayerList const &players = instance->GetPlayers();
if (!players.isEmpty())
if (Player* pPlayer = players.begin()->getSource())
uiTeamInInstance = pPlayer->GetTeam();
switch(pCreature->GetEntry())
{
case CREATURE_BRONJAHM:
uiBronjahm = pCreature->GetGUID();
break;
case CREATURE_DEVOURER:
uiDevourer = pCreature->GetGUID();
break;
}
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
case DATA_BRONJAHM_EVENT:
uiEncounter[0] = data;
break;
case DATA_DEVOURER_EVENT:
uiEncounter[1] = data;
break;
}
if (data == DONE)
SaveToDB();
}
uint32 GetData(uint32 type)
{
switch(type)
{
case DATA_BRONJAHM_EVENT: return uiEncounter[0];
case DATA_DEVOURER_EVENT: return uiEncounter[1];
case DATA_TEAM_IN_INSTANCE: return uiTeamInInstance;
}
return 0;
}
uint64 GetData64(uint32 identifier)
{
switch(identifier)
{
case DATA_BRONJAHM: return uiBronjahm;
case DATA_DEVOURER: return uiBronjahm;
}
return 0;
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "F S " << uiEncounter[0] << " " << uiEncounter[1];
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
uint16 data0, data1;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1;
if (dataHead1 == 'F' && dataHead2 == 'S')
{
uiEncounter[0] = data0;
uiEncounter[1] = data1;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (uiEncounter[i] == IN_PROGRESS)
uiEncounter[i] = NOT_STARTED;
} else OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
InstanceData* GetInstanceData_instance_forge_of_souls(Map* pMap)
{
return new instance_forge_of_souls(pMap);
}
void AddSC_instance_forge_of_souls()
{
Script *newscript;
newscript = new Script;
newscript->Name = "instance_forge_of_souls";
newscript->GetInstanceData = &GetInstanceData_instance_forge_of_souls;
newscript->RegisterSelf();
}
@@ -0,0 +1,142 @@
/* Copyright (C) 2006 - 2010 TrinityCore <https://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 "halls_of_reflection.h"
enum Yells
{
SAY_AGGRO = -1668050,
SAY_SLAY_1 = -1668051,
SAY_SLAY_2 = -1668052,
SAY_DEATH = -1668053,
SAY_IMPENDING_DESPAIR = -1668054,
SAY_DEFILING_HORROR = -1668055,
};
enum Spells
{
SPELL_QUIVERING_STRIKE = 72422,
SPELL_IMPENDING_DESPAIR = 72426,
SPELL_DEFILING_HORROR = 72435,
SPELL_HOPELESSNESS = 72395,
H_SPELL_HOPELESSNESS = 72390, // TODO: not in dbc. Add in DB.
};
enum Events
{
EVENT_NONE,
EVENT_QUIVERING_STRIKE,
EVENT_IMPENDING_DESPAIR,
EVENT_DEFILING_HORROR,
};
struct boss_falricAI : public boss_horAI
{
boss_falricAI(Creature *pCreature) : boss_horAI(pCreature) {}
uint8 uiHopelessnessCount;
void Reset()
{
boss_horAI::Reset();
uiHopelessnessCount = 0;
if (pInstance)
pInstance->SetData(DATA_FALRIC_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* who)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
pInstance->SetData(DATA_FALRIC_EVENT, IN_PROGRESS);
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 23000);
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 9000);
events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(25000,45000)); // TODO adjust timer.
}
void JustDied(Unit* killer)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
pInstance->SetData(DATA_FALRIC_EVENT, DONE);
}
void KilledUnit(Unit *victim)
{
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
}
void UpdateAI(const uint32 diff)
{
// Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_QUIVERING_STRIKE:
DoCast(SPELL_QUIVERING_STRIKE);
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 10000);
break;
case EVENT_IMPENDING_DESPAIR:
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM))
{
DoScriptText(SAY_IMPENDING_DESPAIR, me);
DoCast(pTarget, SPELL_IMPENDING_DESPAIR);
}
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 13000);
break;
case EVENT_DEFILING_HORROR:
DoCast(SPELL_DEFILING_HORROR);
events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(25000,45000)); // TODO adjust timer.
break;
}
if ((uiHopelessnessCount < 1 && HealthBelowPct(66))
|| (uiHopelessnessCount < 2 && HealthBelowPct(33))
|| (uiHopelessnessCount < 3 && HealthBelowPct(10)))
{
uiHopelessnessCount++;
DoCast(DUNGEON_MODE(SPELL_HOPELESSNESS,H_SPELL_HOPELESSNESS));
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_falric(Creature* pCreature)
{
return new boss_falricAI(pCreature);
}
void AddSC_boss_falric()
{
Script *newscript;
newscript = new Script;
newscript->Name="boss_falric";
newscript->GetAI = &GetAI_boss_falric;
newscript->RegisterSelf();
}
@@ -0,0 +1,133 @@
/* Copyright (C) 2006 - 2010 TrinityCore <https://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 "halls_of_reflection.h"
enum Yells
{
SAY_AGGRO = -1668060,
SAY_SLAY_1 = -1668061,
SAY_SLAY_2 = -1668062,
SAY_DEATH = -1668063,
SAY_CORRUPTED_FLESH_1 = -1668064,
SAY_CORRUPTED_FLESH_2 = -1668065,
};
enum Spells
{
SPELL_OBLITERATE = 72360,
SPELL_WELL_OF_CORRUPTION = 72362,
SPELL_CORRUPTED_FLESH = 72363,
SPELL_SHARED_SUFFERING = 72368,
};
enum Events
{
EVENT_NONE,
EVENT_OBLITERATE,
EVENT_WELL_OF_CORRUPTION,
EVENT_CORRUPTED_FLESH,
EVENT_SHARED_SUFFERING,
};
struct boss_marwynAI : public boss_horAI
{
boss_marwynAI(Creature *pCreature) : boss_horAI(pCreature) {}
void Reset()
{
boss_horAI::Reset();
if (pInstance)
pInstance->SetData(DATA_MARWYN_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* who)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
pInstance->SetData(DATA_MARWYN_EVENT, IN_PROGRESS);
events.ScheduleEvent(EVENT_OBLITERATE, 30000); // TODO Check timer
events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000);
events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000);
events.ScheduleEvent(EVENT_SHARED_SUFFERING, 20000); // TODO Check timer
}
void JustDied(Unit* killer)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
pInstance->SetData(DATA_MARWYN_EVENT, DONE);
}
void KilledUnit(Unit *victim)
{
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
}
void UpdateAI(const uint32 diff)
{
// Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_OBLITERATE:
DoCast(SPELL_OBLITERATE);
events.ScheduleEvent(EVENT_OBLITERATE, 30000);
break;
case EVENT_WELL_OF_CORRUPTION:
DoCast(SPELL_WELL_OF_CORRUPTION);
events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000);
break;
case EVENT_CORRUPTED_FLESH:
DoScriptText(RAND(SAY_CORRUPTED_FLESH_1,SAY_CORRUPTED_FLESH_2), me);
DoCast(SPELL_CORRUPTED_FLESH);
events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000);
break;
case EVENT_SHARED_SUFFERING:
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(pTarget, SPELL_SHARED_SUFFERING);
events.ScheduleEvent(EVENT_SHARED_SUFFERING, 20000);
break;
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_marwyn(Creature* pCreature)
{
return new boss_marwynAI(pCreature);
}
void AddSC_boss_marwyn()
{
Script *newscript;
newscript = new Script;
newscript->Name="boss_marwyn";
newscript->GetAI = &GetAI_boss_marwyn;
newscript->RegisterSelf();
}
@@ -0,0 +1,156 @@
/* Copyright (C) 2006 - 2010 TrinityCore <https://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_HALLS_OF_REFLECTION_H
#define DEF_HALLS_OF_REFLECTION_H
enum Data
{
DATA_FALRIC_EVENT,
DATA_MARWYN_EVENT,
DATA_LICHKING_EVENT,
DATA_WAVE_COUNT,
DATA_TEAM_IN_INSTANCE,
};
enum Data64
{
DATA_FALRIC,
DATA_MARWYN,
DATA_LICHKING,
DATA_FROSTMOURNE,
};
enum Creatures
{
NPC_FALRIC = 38112,
NPC_MARWYN = 38113,
NPC_LICH_KING_EVENT = 37226,
NPC_LICH_KING_BOSS = 36954,
NPC_UTHER = 37225,
NPC_JAINA_PART1 = 37221,
NPC_JAINA_PART2 = 36955,
NPC_SYLVANAS_PART1 = 37223,
NPC_SYLVANAS_PART2 = 37554,
NPC_WAVE_MERCENARY = 38177,
NPC_WAVE_FOOTMAN = 38173,
NPC_WAVE_RIFLEMAN = 38176,
NPC_WAVE_PRIEST = 38175,
NPC_WAVE_MAGE = 38172,
};
enum GameObjects
{
GO_FROSTMOURNE = 202302,
GO_FROSTMOURNE_ALTAR = 202236,
GO_FRONT_DOOR = 201976,
GO_ARTHAS_DOOR = 197341,
};
enum HorWorldStates
{
WORLD_STATE_HOR = 4884,
WORLD_STATE_HOR_WAVE_COUNT = 4882,
};
// Common actions from Instance Script to Boss Script
enum Actions
{
ACTION_ENTER_COMBAT,
};
// Base class for FALRIC and MARWYN
// handled the summonList and the notification events to/from the InstanceData
struct boss_horAI : ScriptedAI
{
boss_horAI(Creature *pCreature) : ScriptedAI(pCreature), summons(pCreature)
{
pInstance = me->GetInstanceData();
}
InstanceData* pInstance;
EventMap events;
SummonList summons;
void Reset()
{
events.Reset();
me->SetVisibility(VISIBILITY_OFF);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_PASSIVE);
}
void DamageTaken(Unit *pWho, uint32 &uiDamage)
{
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
uiDamage = 0;
}
void DoAction(const int32 actionID)
{
switch(actionID)
{
case ACTION_ENTER_COMBAT: // called by InstanceData when boss shall enter in combat.
// Just in case. Should have been done by InstanceData
me->SetVisibility(VISIBILITY_ON);
// Reset flags
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_AGGRESSIVE);
if (Unit *pUnit = me->SelectNearestTarget())
AttackStart(pUnit);
DoZoneInCombat();
break;
}
}
void JustSummoned(Creature *pSummoned)
{
summons.Summon(pSummoned);
if (Unit *pUnit = pSummoned->SelectNearestTarget())
{
if (pSummoned->AI())
pSummoned->AI()->AttackStart(pUnit);
else
{
pSummoned->GetMotionMaster()->MoveChase(pUnit);
pSummoned->Attack(pUnit, true);
}
}
if (pSummoned->AI())
pSummoned->AI()->DoZoneInCombat();
}
void SummonedCreatureDespawn(Creature *pSummoned)
{
summons.Despawn(pSummoned);
if (summons.empty())
{
if (pSummoned->isAlive())
pInstance->SetData(DATA_WAVE_COUNT, NOT_STARTED);
else
pInstance->SetData(DATA_WAVE_COUNT, SPECIAL);
}
}
};
#endif
@@ -0,0 +1,431 @@
/* Copyright (C) 2006 - 2010 TrinityCore <https://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 "halls_of_reflection.h"
#define MAX_ENCOUNTER 3
/* Halls of Reflection encounters:
0- Falric
1- Marwyn
2- The Lich King
*/
enum eEnum
{
ENCOUNTER_WAVE_MERCENARY = 6,
ENCOUNTER_WAVE_FOOTMAN = 10,
ENCOUNTER_WAVE_RIFLEMAN = 6,
ENCOUNTER_WAVE_PRIEST = 6,
ENCOUNTER_WAVE_MAGE = 6,
};
enum Events
{
EVENT_NONE,
EVENT_NEXT_WAVE,
EVENT_START_LICH_KING,
};
static Position PriestSpawnPos[ENCOUNTER_WAVE_PRIEST] =
{
{5277.74,2016.88,707.778,5.96903},
{5295.88,2040.34,707.778,5.07891},
{5320.37,1980.13,707.778,2.00713},
{5280.51,1997.84,707.778,0.296706},
{5302.45,2042.22,707.778,4.90438},
{5306.57,1977.47,707.778,1.50098},
};
static Position MageSpawnPos[ENCOUNTER_WAVE_MAGE] =
{
{5312.75,2037.12,707.778,4.59022},
{5309.58,2042.67,707.778,4.69494},
{5275.08,2008.72,707.778,6.21337},
{5279.65,2004.66,707.778,0.069813},
{5275.48,2001.14,707.778,0.174533},
{5316.7,2041.55,707.778,4.50295},
};
static Position MercenarySpawnPos[ENCOUNTER_WAVE_MERCENARY] =
{
{5302.25,1972.41,707.778,1.37881},
{5311.03,1972.23,707.778,1.64061},
{5277.36,1993.23,707.778,0.401426},
{5318.7,2036.11,707.778,4.2237},
{5335.72,1996.86,707.778,2.74017},
{5299.43,1979.01,707.778,1.23918},
};
static Position FootmenSpawnPos[ENCOUNTER_WAVE_FOOTMAN] =
{
{5306.06,2037,707.778,4.81711},
{5344.15,2007.17,707.778,3.15905},
{5337.83,2010.06,707.778,3.22886},
{5343.29,1999.38,707.778,2.9147},
{5340.84,1992.46,707.778,2.75762},
{5325.07,1977.6,707.778,2.07694},
{5336.6,2017.28,707.778,3.47321},
{5313.82,1978.15,707.778,1.74533},
{5280.63,2012.16,707.778,6.05629},
{5322.96,2040.29,707.778,4.34587},
};
static Position RiflemanSpawnPos[ENCOUNTER_WAVE_RIFLEMAN] =
{
{5343.47,2015.95,707.778,3.49066},
{5337.86,2003.4,707.778,2.98451},
{5319.16,1974,707.778,1.91986},
{5299.25,2036,707.778,5.02655},
{5295.64,1973.76,707.778,1.18682},
{5282.9,2019.6,707.778,5.88176},
};
struct instance_halls_of_reflection : public ScriptedInstance
{
instance_halls_of_reflection(Map* pMap) : ScriptedInstance(pMap) {};
uint64 uiFalric;
uint64 uiMarwyn;
uint64 uiLichKingEvent;
uint64 uiJainaPart1;
uint64 uiSylvanasPart1;
uint64 uiFrostmourne;
uint64 uiFrostmourneAltar;
uint64 uiArthasDoor;
uint64 uiFrontDoor;
uint32 uiEncounter[MAX_ENCOUNTER];
uint32 uiTeamInInstance;
uint32 uiWaveCount;
bool bIntroDone;
EventMap events;
void Initialize()
{
events.Reset();
uiFalric = 0;
uiMarwyn = 0;
uiLichKingEvent = 0;
uiJainaPart1 = 0;
uiSylvanasPart1 = 0;
uiFrostmourne = 0;
uiFrostmourneAltar = 0;
uiArthasDoor = 0;
uiFrontDoor = 0;
uiTeamInInstance = 0;
uiWaveCount = 0;
bIntroDone = false;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
uiEncounter[i] = NOT_STARTED;
}
void OnCreatureCreate(Creature* pCreature, bool add)
{
if (!add)
return;
Map::PlayerList const &players = instance->GetPlayers();
if (!players.isEmpty())
if (Player* pPlayer = players.begin()->getSource())
uiTeamInInstance = pPlayer->GetTeam();
switch(pCreature->GetEntry())
{
case NPC_FALRIC:
uiFalric = pCreature->GetGUID();
break;
case NPC_MARWYN:
uiMarwyn = pCreature->GetGUID();
break;
case NPC_LICH_KING_EVENT:
uiLichKingEvent = pCreature->GetGUID();
break;
case NPC_JAINA_PART1:
uiJainaPart1 = pCreature->GetGUID();
break;
case NPC_SYLVANAS_PART1:
uiSylvanasPart1 = pCreature->GetGUID();
break;
}
}
void OnGameObjectCreate(GameObject* pGo, bool add)
{
if (!add)
return;
// TODO: init state depending on encounters
switch(pGo->GetEntry())
{
case GO_FROSTMOURNE:
uiFrostmourne = pGo->GetGUID();
pGo->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_INTERACT_COND);
HandleGameObject(0, false, pGo);
break;
case GO_FROSTMOURNE_ALTAR:
uiFrostmourneAltar = pGo->GetGUID();
pGo->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_INTERACT_COND);
HandleGameObject(0, true, pGo);
break;
case GO_FRONT_DOOR:
uiFrontDoor = pGo->GetGUID();
pGo->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_INTERACT_COND);
HandleGameObject(0, true, pGo);
break;
case GO_ARTHAS_DOOR:
uiArthasDoor = pGo->GetGUID();
pGo->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_INTERACT_COND);
if (uiEncounter[1] == DONE)
HandleGameObject(0, true, pGo);
else
HandleGameObject(0, false, pGo);
break;
}
}
void SetData(uint32 type, uint32 data)
{
if (type == DATA_WAVE_COUNT && data == SPECIAL)
{
bIntroDone = true;
events.ScheduleEvent(EVENT_NEXT_WAVE, 10000);
return;
}
if (uiWaveCount && data == NOT_STARTED)
DoWipe();
switch(type)
{
case DATA_FALRIC_EVENT:
uiEncounter[0] = data;
if (data == DONE)
events.ScheduleEvent(EVENT_NEXT_WAVE, 60000);
break;
case DATA_MARWYN_EVENT:
uiEncounter[1] = data;
if (data == DONE)
HandleGameObject(uiArthasDoor, true);
break;
case DATA_LICHKING_EVENT:
uiEncounter[2] = data;
break;
}
if (data == DONE)
SaveToDB();
}
uint32 GetData(uint32 type)
{
switch(type)
{
case DATA_FALRIC_EVENT: return uiEncounter[0];
case DATA_MARWYN_EVENT: return uiEncounter[1];
case DATA_LICHKING_EVENT: return uiEncounter[2];
case DATA_WAVE_COUNT: return uiWaveCount;
case DATA_TEAM_IN_INSTANCE: return uiTeamInInstance;
}
return 0;
}
uint64 GetData64(uint32 identifier)
{
switch(identifier)
{
case DATA_FALRIC: return uiFalric;
case DATA_MARWYN: return uiMarwyn;
case DATA_LICHKING: return uiLichKingEvent;
case DATA_FROSTMOURNE: return uiFrostmourne;
}
return 0;
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "H R 1 " << uiEncounter[0] << " " << uiEncounter[1] << " " << uiEncounter[2];
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
uint16 version;
uint16 data0, data1, data2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> version >> data0 >> data1 >> data2;
if (dataHead1 == 'H' && dataHead2 == 'R')
{
uiEncounter[0] = data0;
uiEncounter[1] = data1;
uiEncounter[2] = data2;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (uiEncounter[i] == IN_PROGRESS)
uiEncounter[i] = NOT_STARTED;
} else OUT_LOAD_INST_DATA_FAIL;
if (uiEncounter[0] == DONE || uiEncounter[1] == DONE)
bIntroDone = true;
OUT_LOAD_INST_DATA_COMPLETE;
}
void AddWave()
{
DoUpdateWorldState(WORLD_STATE_HOR, 1);
DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, uiWaveCount);
switch(uiWaveCount)
{
case 1:
case 2:
case 3:
case 4:
if (Creature *pFalric = instance->GetCreature(uiFalric))
SpawnWave(pFalric);
break;
case 5:
if (GetData(DATA_FALRIC_EVENT) == DONE)
events.ScheduleEvent(EVENT_NEXT_WAVE, 10000);
else if (Creature *pFalric = instance->GetCreature(uiFalric))
if (pFalric->AI())
pFalric->AI()->DoAction(ACTION_ENTER_COMBAT);
break;
case 6:
case 7:
case 8:
case 9:
if (Creature *pMarwyn = instance->GetCreature(uiMarwyn))
SpawnWave(pMarwyn);
break;
case 10:
if (GetData(DATA_MARWYN_EVENT) != DONE) // wave should not have been started if DONE. Check anyway to avoid bug exploit!
if (Creature *pMarwyn = instance->GetCreature(uiMarwyn))
if (pMarwyn->AI())
pMarwyn->AI()->DoAction(ACTION_ENTER_COMBAT);
break;
}
}
// Wipe has been detected. Perform cleanup and reset.
void DoWipe()
{
uiWaveCount = 0;
events.Reset();
DoUpdateWorldState(WORLD_STATE_HOR, 1);
DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, uiWaveCount);
HandleGameObject(uiFrontDoor, true);
// TODO
// in case of wipe, the event is normally restarted by jumping into the center of the room.
// As I can't find a trigger area there, just respawn Jaina/Sylvanas so the event may be restarted.
if (Creature* pJaina = instance->GetCreature(uiJainaPart1))
pJaina->Respawn();
if (Creature* pSylvanas = instance->GetCreature(uiSylvanasPart1))
pSylvanas->Respawn();
if (Creature* pFalric = instance->GetCreature(uiFalric))
pFalric->SetVisibility(VISIBILITY_OFF);
if (Creature* pMarwyn = instance->GetCreature(uiMarwyn))
pMarwyn->SetVisibility(VISIBILITY_OFF);
}
// spawn a wave on behalf of the summoner.
void SpawnWave(Creature *pSummoner)
{
uint32 index;
pSummoner->SetVisibility(VISIBILITY_ON);
// TODO: do composition at random. # of spawn also depends on uiWaveCount
// As of now, it is just one of each.
index = urand(0,ENCOUNTER_WAVE_MERCENARY-1);
pSummoner->SummonCreature(NPC_WAVE_MERCENARY, MercenarySpawnPos[index], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0);
index = urand(0,ENCOUNTER_WAVE_FOOTMAN-1);
pSummoner->SummonCreature(NPC_WAVE_FOOTMAN, FootmenSpawnPos[index], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0);
index = urand(0,ENCOUNTER_WAVE_RIFLEMAN-1);
pSummoner->SummonCreature(NPC_WAVE_RIFLEMAN, RiflemanSpawnPos[index], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0);
index = urand(0,ENCOUNTER_WAVE_PRIEST-1);
pSummoner->SummonCreature(NPC_WAVE_PRIEST, PriestSpawnPos[index], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0);
index = urand(0,ENCOUNTER_WAVE_MAGE-1);
pSummoner->SummonCreature(NPC_WAVE_MAGE, MageSpawnPos[index], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0);
}
void Update(uint32 diff)
{
if (!instance->HavePlayers())
return;
events.Update(diff);
switch(uint32 eventId = events.ExecuteEvent())
{
case EVENT_NEXT_WAVE:
uiWaveCount++;
AddWave();
break;
case EVENT_START_LICH_KING:
// TODO
break;
}
}
};
InstanceData* GetInstanceData_instance_halls_of_reflection(Map* pMap)
{
return new instance_halls_of_reflection(pMap);
}
void AddSC_instance_halls_of_reflection()
{
Script *newscript;
newscript = new Script;
newscript->Name = "instance_halls_of_reflection";
newscript->GetInstanceData = &GetInstanceData_instance_halls_of_reflection;
newscript->RegisterSelf();
}
@@ -0,0 +1,209 @@
/* Copyright (C) 2006 - 2010 TrinityCore <https://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 "pit_of_saron.h"
enum Yells
{
SAY_AGGRO = -1658001,
SAY_SLAY_1 = -1658002,
SAY_SLAY_2 = -1658003,
SAY_DEATH = -1658004,
SAY_PHASE2 = -1658005,
SAY_PHASE3 = -1658006,
SAY_TYRANNUS_DEATH = -1659007,
};
enum eEvents
{
EVENT_NONE,
EVENT_PERMAFROST,
EVENT_THROW_SARONITE,
EVENT_CHILLINGWAVE,
EVENT_DEEPFREEZE,
};
enum Spells
{
SPELL_PERMAFROST = 70326,
SPELL_PERMAFROST_TRIGGER = 68786, // triggered by PERMAFROST. Used to check aura
SPELL_THROW_SARONITE = 68788,
SPELL_THUNDERING_STOMP = 68771,
SPELL_CHILLING_WAVE = 68778,
H_SPELL_CHILLING_WAVE = 70333,
SPELL_DEEP_FREEZE = 70381,
H_SPELL_DEEP_FREEZE = 72930,
SPELL_FORGE_MACE = 68785,
H_SPELL_FORGE_MACE = 70335,
SPELL_FORGE_BLADE = 68774,
H_SPELL_FORGE_BLADE = 70334,
};
enum eEnums
{
EQUIP_ID_SWORD = 49345,
EQUIP_ID_MACE = 49344,
ACHIEV_DOESNT_GO_TO_ELEVEN = 4524,
};
struct boss_garfrostAI : public ScriptedAI
{
boss_garfrostAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
bool phase2;
bool phase3;
bool bAchievement;
ScriptedInstance* pInstance;
EventMap events;
void Reset()
{
events.Reset();
phase2 = false;
phase3 = false;
bAchievement = true;
if (pInstance)
pInstance->SetData(DATA_GARFROST_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
DoCast(me, SPELL_PERMAFROST);
if (pInstance)
pInstance->SetData(DATA_GARFROST_EVENT, IN_PROGRESS);
events.ScheduleEvent(EVENT_THROW_SARONITE, 45000);
}
void DamageTaken(Unit* /*pDoneBy*/, uint32& /*uiDamage*/)
{
if (HealthBelowPct(66) && !phase2)
{
phase2 = true;
DoCast(me, SPELL_THUNDERING_STOMP);
// TODO: should go to a forge
DoCast(me, SPELL_FORGE_BLADE);
// TODO: should equip when spell completes
SetEquipmentSlots(false, EQUIP_ID_SWORD, -1, -1);
me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
events.ScheduleEvent(EVENT_CHILLINGWAVE, 10000);
}
if (HealthBelowPct(33) && !phase3)
{
phase3 = true;
DoCast(me, SPELL_THUNDERING_STOMP);
// TODO: should go to a forge
DoCast(me, SPELL_FORGE_MACE);
// TODO: should equip when spell completes
SetEquipmentSlots(false, EQUIP_ID_MACE, -1, -1);
me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
events.CancelEvent(EVENT_CHILLINGWAVE); // cast only in phase 2.
events.ScheduleEvent(EVENT_DEEPFREEZE, 10000);
}
}
void KilledUnit(Unit * victim)
{
if (victim == me)
return;
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
{
if (Creature *pTyrannus = me->GetCreature(*me, pInstance->GetData64(DATA_TYRANNUS)))
DoScriptText(SAY_TYRANNUS_DEATH, pTyrannus);
pInstance->SetData(DATA_GARFROST_EVENT, DONE);
if (IsHeroic() && bAchievement)
pInstance->DoCompleteAchievement(ACHIEV_DOESNT_GO_TO_ELEVEN);
}
}
void SpellHitTarget(Unit* pTarget, const SpellEntry *spell)
{
if (spell->Id == SPELL_PERMAFROST_TRIGGER && bAchievement)
{
if (Aura *pAura = pTarget->GetAura(SPELL_PERMAFROST_TRIGGER))
if (pAura->GetStackAmount() > 10)
bAchievement = false;
}
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
{
case EVENT_THROW_SARONITE:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_THROW_SARONITE);
events.RescheduleEvent(EVENT_THROW_SARONITE, 35000);
return;
case EVENT_DEEPFREEZE:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_DEEP_FREEZE);
events.RescheduleEvent(EVENT_DEEPFREEZE, 35000);
return;
case EVENT_CHILLINGWAVE:
DoCastAOE(SPELL_CHILLING_WAVE);
events.RescheduleEvent(EVENT_CHILLINGWAVE, 40000);
return;
}
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_garfrost(Creature* pCreature)
{
return new boss_garfrostAI (pCreature);
}
void AddSC_boss_garfrost()
{
Script *newscript;
newscript = new Script;
newscript->Name="boss_garfrost";
newscript->GetAI = &GetAI_boss_garfrost;
newscript->RegisterSelf();
}
@@ -0,0 +1,482 @@
/* Copyright (C) 2006 - 2010 TrinityCore <https://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 "pit_of_saron.h"
/*
* SDComment: Spell Explosive barrage is not working.
*/
enum Spells
{
SPELL_PURSUED = 68987,
SPELL_CONFUSION = 69029,
SPELL_EXPLOSIVE_BARRAGE = 69263,
SPELL_MIGHTY_KICK = 69021,
SPELL_POISON_NOVA = 68989,
H_SPELL_POISON_NOVA = 70434,
SPELL_SHADOW_BOLT = 69028,
SPELL_TOXIC_WASTE = 69024,
H_SPELL_TOXIC_WASTE = 70436,
};
enum Yells
{
// Krick
SAY_KRICK_AGGRO = -1658010,
SAY_KRICK_SLAY_1 = -1658011,
SAY_KRICK_SLAY_2 = -1658012,
SAY_KRICK_BARRAGE_1 = -1658013,
SAY_KRICK_BARRAGE_2 = -1658014,
SAY_KRICK_POISON_NOVA = -1658015,
SAY_KRICK_CHASE_1 = -1658016,
SAY_KRICK_CHASE_2 = -1658017,
SAY_KRICK_CHASE_3 = -1658018,
// Ick
SAY_ICK_POISON_NOVA = -1658020,
SAY_ICK_CHASE_1 = -1658021,
// OUTRO
SAY_KRICK_OUTRO_1 = -1658030,
SAY_JAYNA_OUTRO_2 = -1658031,
SAY_SYLVANAS_OUTRO_2 = -1658032,
SAY_KRICK_OUTRO_3 = -1658033,
SAY_JAYNA_OUTRO_4 = -1658034,
SAY_SYLVANAS_OUTRO_4 = -1658035,
SAY_KRICK_OUTRO_5 = -1658036,
SAY_TYRANNUS_OUTRO_7 = -1658037,
SAY_KRICK_OUTRO_8 = -1658038,
SAY_TYRANNUS_OUTRO_9 = -1658039,
SAY_JAYNA_OUTRO_10 = -1658040,
SAY_SYLVANAS_OUTRO_10 = -1658041,
};
enum Events
{
EVENT_NONE,
EVENT_PURSUE,
EVENT_MIGHTY_KICK,
EVENT_POISON_NOVA,
EVENT_EXPLOSIVE_BARRAGE,
EVENT_END_EXPLOSIVE_BARRAGE,
// Krick
EVENT_SHADOW_BOLT,
EVENT_TOXIC_WASTE,
// Krick OUTRO
EVENT_OUTRO_1,
EVENT_OUTRO_2,
EVENT_OUTRO_3,
EVENT_OUTRO_4,
EVENT_OUTRO_5,
EVENT_OUTRO_6,
EVENT_OUTRO_7,
EVENT_OUTRO_8,
EVENT_OUTRO_9,
EVENT_OUTRO_10,
EVENT_OUTRO_11,
EVENT_OUTRO_12,
EVENT_OUTRO_END,
};
enum KrickPhase
{
PHASE_COMBAT,
PHASE_OUTRO,
};
enum Actions
{
ACTION_OUTRO,
};
enum Misc
{
SEAT_KRICK = 0,
// events GCD. Shall not be 0.
GCD_1 = 1,
};
// Krick is the Gnome.
// Ick is the Mount
// Common Events are handled/triggered by Ick that "drive" Krick through DoAction.
struct boss_ickAI : public ScriptedAI
{
boss_ickAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
EventMap events;
void Reset()
{
events.Reset();
if (pInstance)
pInstance->SetData(DATA_KRICKANDICK_EVENT, NOT_STARTED);
}
Creature* GetKrick()
{
return me->GetCreature(*me, pInstance ? pInstance->GetData64(DATA_KRICK) : 0);
}
void EnterCombat(Unit * /*who*/)
{
if (pInstance)
pInstance->SetData(DATA_KRICKANDICK_EVENT, IN_PROGRESS);
Creature* pKrick = GetKrick();
if (!pKrick)
pKrick = me->SummonCreature(CREATURE_KRICK, *me, TEMPSUMMON_MANUAL_DESPAWN);
if (pKrick)
DoScriptText(SAY_KRICK_AGGRO, pKrick);
events.ScheduleEvent(EVENT_MIGHTY_KICK, 20000, GCD_1);
events.ScheduleEvent(EVENT_PURSUE, 30000, GCD_1);
events.ScheduleEvent(EVENT_POISON_NOVA, 30000, GCD_1);
events.ScheduleEvent(EVENT_EXPLOSIVE_BARRAGE, 35000);
events.ScheduleEvent(EVENT_TOXIC_WASTE, 5000);
events.ScheduleEvent(EVENT_SHADOW_BOLT, 15000);
}
void EnterEvadeMode()
{
me->GetMotionMaster()->Clear();
ScriptedAI::EnterEvadeMode();
}
void JustDied(Unit* /*pKiller*/)
{
if (Creature* pKrick = GetKrick())
{
if (pKrick->AI())
pKrick->AI()->DoAction(ACTION_OUTRO);
}
if (pInstance)
pInstance->SetData(DATA_KRICKANDICK_EVENT, DONE);
}
void UpdateAI(const uint32 diff)
{
if (!me->isInCombat())
return;
if (!me->getVictim() && me->getThreatManager().isThreatListEmpty())
{
EnterEvadeMode();
return;
}
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
switch(events.ExecuteEvent())
{
case EVENT_PURSUE:
if (Creature* pKrick = GetKrick())
DoScriptText(RAND(SAY_KRICK_CHASE_1,SAY_KRICK_CHASE_2,SAY_KRICK_CHASE_3), pKrick);
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
me->Attack(pTarget,false);
DoScriptText(SAY_ICK_CHASE_1, me, pTarget);
DoCast(pTarget, SPELL_PURSUED);
}
DoCast(SPELL_CONFUSION);
events.ScheduleEvent(EVENT_PURSUE, 30000, GCD_1);
return;
case EVENT_MIGHTY_KICK:
DoCast(me->getVictim(), SPELL_MIGHTY_KICK);
events.ScheduleEvent(EVENT_MIGHTY_KICK, 25000, GCD_1);
return;
case EVENT_POISON_NOVA:
if (Creature* pKrick = GetKrick())
DoScriptText(SAY_KRICK_POISON_NOVA, pKrick);
DoScriptText(SAY_ICK_POISON_NOVA, me);
DoCastAOE(SPELL_POISON_NOVA);
events.ScheduleEvent(EVENT_POISON_NOVA, 30000, GCD_1);
return;
case EVENT_TOXIC_WASTE:
DoCast(me->getVictim(), SPELL_TOXIC_WASTE);
events.ScheduleEvent(EVENT_TOXIC_WASTE, 5000);
return;
case EVENT_SHADOW_BOLT:
DoCast(me->getVictim(), SPELL_SHADOW_BOLT);
events.ScheduleEvent(EVENT_SHADOW_BOLT, 15000);
return;
case EVENT_EXPLOSIVE_BARRAGE:
if (Creature *pKrick = GetKrick())
{
DoScriptText(SAY_KRICK_BARRAGE_1, pKrick);
DoScriptText(SAY_KRICK_BARRAGE_2, pKrick);
}
DoCastAOE(SPELL_EXPLOSIVE_BARRAGE);
me->GetMotionMaster()->MoveIdle();
events.DelayEvents(20000, GCD_1); // 2 sec cast + 18 sec
events.ScheduleEvent(EVENT_END_EXPLOSIVE_BARRAGE, 20000);
return;
case EVENT_END_EXPLOSIVE_BARRAGE:
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MoveChase(me->getVictim());
events.ScheduleEvent(EVENT_EXPLOSIVE_BARRAGE, 25000);
break;
}
DoMeleeAttackIfReady();
}
};
struct boss_krickAI : public ScriptedAI
{
boss_krickAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
EventMap events;
KrickPhase phase;
uint64 uiNpcOutroDialog;
uint64 uiTyrannus;
void Reset()
{
uiNpcOutroDialog = 0;
uiTyrannus = 0;
phase = PHASE_COMBAT;
me->SetReactState(REACT_PASSIVE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetVisibility(VISIBILITY_OFF);
}
Creature* GetIck()
{
return me->GetCreature(*me, pInstance ? pInstance->GetData64(DATA_ICK) : 0);
}
void KilledUnit(Unit * victim)
{
if (victim == me)
return;
DoScriptText(RAND(SAY_KRICK_SLAY_1,SAY_KRICK_SLAY_2), me);
}
void DamageTaken(Unit * /*pDoneBy*/, uint32 &uiDamage)
{
// if killed whatever the reason, it breaks the outro
uiDamage = 0;
}
void DoAction(const int32 actionId)
{
switch(actionId)
{
case ACTION_OUTRO:
{
Position pos;
if (Creature* pIck = GetIck())
{
// TODO: tele on Ick then run some distance.
pIck->GetNearPosition(pos, 5.0f, 3.14);
me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), 0.0f);
}
me->SetVisibility(VISIBILITY_ON);
Creature* pJainaOrSylvanas = me->GetCreature(*me, pInstance->GetData64(DATA_JAINA_SYLVANAS_1));
if (pJainaOrSylvanas) {
Position pos;
me->GetNearPosition(pos, 5.0f, 0);
pJainaOrSylvanas->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(),
pos.GetAngle(me->GetPositionX(), me->GetPositionY()));
}
else {
if (pInstance->GetData(DATA_TEAM_IN_INSTANCE) == TEAM_ALLIANCE)
pJainaOrSylvanas = me->SummonCreature(NPC_SYLVANAS_PART1, *me, TEMPSUMMON_MANUAL_DESPAWN);
else
pJainaOrSylvanas = me->SummonCreature(NPC_JAINA_PART1, *me, TEMPSUMMON_MANUAL_DESPAWN);
}
if (pJainaOrSylvanas)
{
pJainaOrSylvanas->SetOrientation(pJainaOrSylvanas->GetAngle(me->GetPositionX(), me->GetPositionY()));
me->SetOrientation(me->GetAngle(pJainaOrSylvanas->GetPositionX(), pJainaOrSylvanas->GetPositionY()));
uiNpcOutroDialog = pJainaOrSylvanas->GetGUID();
}
phase = PHASE_OUTRO;
events.Reset();
events.ScheduleEvent(EVENT_OUTRO_1, 1000);
break;
}
}
}
void UpdateAI(const uint32 diff)
{
if (phase == PHASE_OUTRO)
{
if (!pInstance)
return;
events.Update(diff);
switch(events.ExecuteEvent())
{
case EVENT_OUTRO_1:
{
DoScriptText(SAY_KRICK_OUTRO_1, me);
events.ScheduleEvent(EVENT_OUTRO_2, 14000);
break;
}
case EVENT_OUTRO_2:
{
Creature* pNpcDialog = me->GetCreature(*me, uiNpcOutroDialog);
if (pNpcDialog)
{
if (pInstance->GetData(DATA_TEAM_IN_INSTANCE) == TEAM_ALLIANCE)
DoScriptText(SAY_JAYNA_OUTRO_2, pNpcDialog);
else
DoScriptText(SAY_SYLVANAS_OUTRO_2, pNpcDialog);
}
events.ScheduleEvent(EVENT_OUTRO_3, 8500);
break;
}
case EVENT_OUTRO_3:
DoScriptText(SAY_KRICK_OUTRO_3, me);
events.ScheduleEvent(EVENT_OUTRO_4, 12000);
break;
case EVENT_OUTRO_4:
{
Creature* pNpcDialog = me->GetCreature(*me, uiNpcOutroDialog);
if (pNpcDialog)
{
if (pInstance->GetData(DATA_TEAM_IN_INSTANCE) == TEAM_ALLIANCE)
DoScriptText(SAY_JAYNA_OUTRO_4, pNpcDialog);
else
DoScriptText(SAY_SYLVANAS_OUTRO_4, pNpcDialog);
}
events.ScheduleEvent(EVENT_OUTRO_5, 8000);
break;
}
case EVENT_OUTRO_5:
DoScriptText(SAY_KRICK_OUTRO_5, me);
events.ScheduleEvent(EVENT_OUTRO_6, 4000);
break;
case EVENT_OUTRO_6:
// TODO spawn Tyrannus at some distance and MovePoint near-by (flying on rimefang)
// store uiTyrannus
// Adjust timer so tyrannus has time to come
uiTyrannus = (pInstance ? pInstance->GetData64(DATA_TYRANNUS) : 0);
events.ScheduleEvent(EVENT_OUTRO_7, 1);
break;
case EVENT_OUTRO_7:
if (Creature *pTyrannus = me->GetCreature(*me, uiTyrannus))
DoScriptText(SAY_TYRANNUS_OUTRO_7, pTyrannus);
events.ScheduleEvent(EVENT_OUTRO_8, 7000);
break;
case EVENT_OUTRO_8:
DoScriptText(SAY_KRICK_OUTRO_8, me);
// TODO: Tyrannus starts killing Krick.
// there shall be some visual spell effect
events.ScheduleEvent(EVENT_OUTRO_9, 6000);
break;
case EVENT_OUTRO_9:
// tyrannus kills krick
me->SetStandState(UNIT_STAND_STATE_DEAD);
me->SetHealth(0);
if (Creature *pTyrannus = me->GetCreature(*me, uiTyrannus))
DoScriptText(SAY_TYRANNUS_OUTRO_9, pTyrannus);
events.ScheduleEvent(EVENT_OUTRO_10, 12000);
break;
case EVENT_OUTRO_10:
{
Creature* pNpcDialog = me->GetCreature(*me, uiNpcOutroDialog);
if (pNpcDialog)
{
if (pInstance->GetData(DATA_TEAM_IN_INSTANCE) == TEAM_ALLIANCE)
DoScriptText(SAY_JAYNA_OUTRO_10, pNpcDialog);
else
DoScriptText(SAY_SYLVANAS_OUTRO_10, pNpcDialog);
}
// End of OUTRO. for now...
events.ScheduleEvent(EVENT_OUTRO_END, 8000);
break;
}
case EVENT_OUTRO_END:
{
Creature* pNpcDialog = me->GetCreature(*me, uiNpcOutroDialog);
if (pNpcDialog)
pNpcDialog->DisappearAndDie();
me->DisappearAndDie();
break;
}
}
return;
}
}
};
CreatureAI* GetAI_boss_ick(Creature* pCreature)
{
return new boss_ickAI(pCreature);
}
CreatureAI* GetAI_boss_krick(Creature* pCreature)
{
return new boss_krickAI(pCreature);
}
void AddSC_boss_ick()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_ick";
newscript->GetAI = &GetAI_boss_ick;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "boss_krick";
newscript->GetAI = &GetAI_boss_krick;
newscript->RegisterSelf();
}
@@ -0,0 +1,273 @@
/* Copyright (C) 2006 - 2010 TrinityCore <https://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 "pit_of_saron.h"
/*
* SDComment: TODO:
* - implement aura for spell Overlord Brand.
* - Intro/Outro
* - improve script of Rimefang
*/
enum Yells
{
SAY_AMBUSH_1 = -1658050,
SAY_AMBUSH_2 = -1658051,
SAY_GAUNTLET_START = -1658052,
SAY_INTRO_1 = -1658053,
SAY_INTRO_2 = -1658054,
SAY_AGGRO = -1658055,
SAY_SLAY_1 = -1658056,
SAY_SLAY_2 = -1658057,
SAY_DEATH = -1658058,
SAY_MARK_RIMEFANG_1 = -1658059,
SAY_MARK_RIMEFANG_2 = -1658060,
SAY_DARK_MIGHT_1 = -1658061,
SAY_DARK_MIGHT_2 = -1658062,
SAY_GORKUN_OUTRO_1 = -1658063,
SAY_GORKUN_OUTRO_2 = -1658064,
SAY_JAYNA_OUTRO_3 = -1658065,
SAY_SYLVANAS_OUTRO_3 = -1658066,
SAY_JAYNA_OUTRO_4 = -1658067,
SAY_SYLVANAS_OUTRO_4 = -1658068,
SAY_JAYNA_OUTRO_5 = -1658069,
};
enum Spells
{
SPELL_FORCEFUL_SMASH = 69155,
H_SPELL_FORCEFUL_SMASH = 69627,
SPELL_OVERLORDS_BRAND = 69172,
SPELL_DARK_MIGHT = 69167,
H_SPELL_DARK_MIGHT = 69629,
SPELL_HOARFROST = 69246,
SPELL_MARK_OF_RIMEFANG = 69275,
SPELL_ICY_BLAST = 69233,
H_SPELL_ICY_BLAST = 69646,
SPELL_ICY_BLAST_2 = 69238,
H_SPELL_ICY_BLAST_2 = 69628,
};
enum Events
{
EVENT_NONE,
EVENT_FORCEFUL_SMASH,
EVENT_OVERLORDS_BRAND,
EVENT_DARK_MIGHT,
// Rimefang
EVENT_MARK_OF_RIMEFANG,
EVENT_HOARFROST,
EVENT_ICY_BLAST,
EVENT_ICY_BLAST_2,
};
enum Misc
{
SEAT_TYRANNUS = 0
};
struct boss_tyrannusAI : public ScriptedAI
{
boss_tyrannusAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
EventMap events;
void Reset()
{
events.Reset();
if (pInstance)
pInstance->SetData(DATA_TYRANNUS_EVENT, NOT_STARTED);
}
Creature* GetRimefang()
{
return me->GetCreature(*me, pInstance->GetData64(DATA_RIMEFANG));
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
me->ExitVehicle();
// restore health if any damage done during intro
me->SetHealth(me->GetMaxHealth());
if (pInstance)
pInstance->SetData(DATA_TYRANNUS_EVENT, IN_PROGRESS);
events.ScheduleEvent(EVENT_FORCEFUL_SMASH, 10000);
events.ScheduleEvent(EVENT_OVERLORDS_BRAND, 35000);
events.ScheduleEvent(EVENT_DARK_MIGHT, 40000);
}
void KilledUnit(Unit * /*victim*/)
{
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
{
pInstance->SetData(DATA_TYRANNUS_EVENT, DONE);
if (Creature* pRimefang = GetRimefang())
pRimefang->ForcedDespawn();
}
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
{
case EVENT_FORCEFUL_SMASH:
DoCast(me->getVictim(), SPELL_FORCEFUL_SMASH);
events.ScheduleEvent(EVENT_FORCEFUL_SMASH, 10000);
return;
case EVENT_OVERLORDS_BRAND:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_OVERLORDS_BRAND);
events.ScheduleEvent(EVENT_OVERLORDS_BRAND, 45000);
return;
case EVENT_DARK_MIGHT:
DoScriptText(SAY_DARK_MIGHT_1, me);
DoScriptText(SAY_DARK_MIGHT_2, me);
DoCast(me, SPELL_DARK_MIGHT);
events.ScheduleEvent(EVENT_DARK_MIGHT, 60000);
return;
}
}
DoMeleeAttackIfReady();
}
};
struct boss_rimefangAI : public ScriptedAI
{
boss_rimefangAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
EventMap events;
void Reset()
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
me->InterruptSpell(CURRENT_GENERIC_SPELL);
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
events.Reset();
}
void EnterCombat(Unit* /*who*/)
{
me->InterruptSpell(CURRENT_GENERIC_SPELL);
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
events.ScheduleEvent(EVENT_MARK_OF_RIMEFANG, 25000);
events.ScheduleEvent(EVENT_ICY_BLAST, 35000);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
{
case EVENT_MARK_OF_RIMEFANG:
DoScriptText(SAY_MARK_RIMEFANG_1, me);
DoScriptText(SAY_MARK_RIMEFANG_2, me);
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_MARK_OF_RIMEFANG);
events.ScheduleEvent(EVENT_HOARFROST, 5000);
return;
case EVENT_HOARFROST:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_HOARFROST);
events.ScheduleEvent(EVENT_MARK_OF_RIMEFANG, 20000);
return;
case EVENT_ICY_BLAST:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_ICY_BLAST);
events.ScheduleEvent(EVENT_ICY_BLAST_2, 5000);
return;
case EVENT_ICY_BLAST_2:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget->getVictim(), SPELL_ICY_BLAST_2);
events.ScheduleEvent(EVENT_ICY_BLAST, 30000);
return;
}
}
}
};
CreatureAI* GetAI_boss_tyrannus(Creature* pCreature)
{
return new boss_tyrannusAI(pCreature);
}
CreatureAI* GetAI_boss_rimefang(Creature* pCreature)
{
return new boss_rimefangAI(pCreature);
}
void AddSC_boss_tyrannus()
{
Script *newscript;
newscript = new Script;
newscript->Name="boss_tyrannus";
newscript->GetAI = &GetAI_boss_tyrannus;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="boss_rimefang";
newscript->GetAI = &GetAI_boss_rimefang;
newscript->RegisterSelf();
}
@@ -0,0 +1,236 @@
/* Copyright (C) 2006 - 2010 TrinityCore <https://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 "pit_of_saron.h"
#define MAX_ENCOUNTER 3
/* Pit of Saron encounters:
0- Forgemaster Garfrost
1- Krick and Ick
2- Scourgelord Tyrannus
*/
struct instance_pit_of_saron : public ScriptedInstance
{
instance_pit_of_saron(Map* pMap) : ScriptedInstance(pMap) {};
uint64 uiKrick;
uint64 uiIck;
uint64 uiGarfrost;
uint64 uiTyrannus;
uint64 uiRimefang;
uint64 uiJainaOrSylvanas1;
uint64 uiJainaOrSylvanas2;
uint32 uiTeamInInstance;
uint32 uiEncounter[MAX_ENCOUNTER];
void Initialize()
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
uiEncounter[i] = NOT_STARTED;
uiGarfrost = 0;
uiKrick = 0;
uiIck = 0;
uiTyrannus = 0;
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (uiEncounter[i] == IN_PROGRESS)
return true;
return false;
}
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
{
Map::PlayerList const &players = instance->GetPlayers();
if (!players.isEmpty())
{
if (Player* pPlayer = players.begin()->getSource())
uiTeamInInstance = pPlayer->GetTeam();
}
switch(pCreature->GetEntry())
{
case CREATURE_KRICK:
uiKrick = pCreature->GetGUID();
break;
case CREATURE_ICK:
uiIck = pCreature->GetGUID();
break;
case CREATURE_GARFROST:
uiGarfrost = pCreature->GetGUID();
break;
case CREATURE_TYRANNUS:
uiTyrannus = pCreature->GetGUID();
break;
case CREATURE_RIMEFANG:
uiRimefang = pCreature->GetGUID();
break;
case NPC_SYLVANAS_PART1:
if (uiTeamInInstance == ALLIANCE)
pCreature->UpdateEntry(NPC_JAINA_PART1, ALLIANCE);
uiJainaOrSylvanas1 = pCreature->GetGUID();
break;
case NPC_SYLVANAS_PART2:
if (uiTeamInInstance == ALLIANCE)
pCreature->UpdateEntry(NPC_JAINA_PART2, ALLIANCE);
uiJainaOrSylvanas2 = pCreature->GetGUID();
break;
case NPC_KILARA:
if (uiTeamInInstance == ALLIANCE)
pCreature->UpdateEntry(NPC_ELANDRA, ALLIANCE);
break;
case NPC_KORALEN:
if (uiTeamInInstance == ALLIANCE)
pCreature->UpdateEntry(NPC_KORLAEN, ALLIANCE);
break;
case NPC_CHAMPION_1_HORDE:
if (uiTeamInInstance == ALLIANCE)
pCreature->UpdateEntry(NPC_CHAMPION_1_ALLIANCE, ALLIANCE);
break;
case NPC_CHAMPION_2_HORDE:
if (uiTeamInInstance == ALLIANCE)
pCreature->UpdateEntry(NPC_CHAMPION_2_ALLIANCE, ALLIANCE);
break;
case NPC_CHAMPION_3_HORDE: // No 3rd set for Alliance?
if (uiTeamInInstance == ALLIANCE)
pCreature->UpdateEntry(NPC_CHAMPION_2_ALLIANCE, ALLIANCE);
break;
}
}
uint64 GetData64(uint32 identifier)
{
switch(identifier)
{
case DATA_GARFROST: return uiGarfrost;
case DATA_KRICK: return uiKrick;
case DATA_ICK: return uiIck;
case DATA_TYRANNUS: return uiTyrannus;
case DATA_RIMEFANG: return uiRimefang;
case DATA_JAINA_SYLVANAS_1: return uiJainaOrSylvanas1;
case DATA_JAINA_SYLVANAS_2: return uiJainaOrSylvanas2;
}
return 0;
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
case DATA_GARFROST_EVENT:
uiEncounter[0] = data;
break;
case DATA_TYRANNUS_EVENT:
uiEncounter[1] = data;
break;
case DATA_KRICKANDICK_EVENT:
uiEncounter[2] = data;
break;
}
if (data == DONE)
SaveToDB();
}
uint32 GetData(uint32 type)
{
switch(type)
{
case DATA_GARFROST_EVENT: return uiEncounter[0];
case DATA_TYRANNUS_EVENT: return uiEncounter[1];
case DATA_KRICKANDICK_EVENT: return uiEncounter[2];
}
return 0;
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::string str_data;
std::ostringstream saveStream;
saveStream << "P S " << uiEncounter[0] << " " << uiEncounter[1] << " " << uiEncounter[2];
str_data = saveStream.str();
OUT_SAVE_INST_DATA_COMPLETE;
return str_data;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
uint16 data0, data1, data2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2;
if (dataHead1 == 'P' && dataHead2 == 'S')
{
uiEncounter[0] = data0;
uiEncounter[1] = data1;
uiEncounter[2] = data2;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (uiEncounter[i] == IN_PROGRESS)
uiEncounter[i] = NOT_STARTED;
} else OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
InstanceData* GetInstanceData_instance_pit_of_saron(Map* pMap)
{
return new instance_pit_of_saron(pMap);
}
void AddSC_instance_pit_of_saron()
{
Script *newscript;
newscript = new Script;
newscript->Name = "instance_pit_of_saron";
newscript->GetInstanceData = &GetInstanceData_instance_pit_of_saron;
newscript->RegisterSelf();
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,63 @@
/* Copyright (C) 2006 - 2010 TrinityCore <https://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_PIT_OF_SARON_H
#define DEF_PIT_OF_SARON_H
enum Data
{
DATA_GARFROST_EVENT,
DATA_KRICKANDICK_EVENT,
DATA_TYRANNUS_EVENT,
DATA_TEAM_IN_INSTANCE,
};
enum Data64
{
DATA_GARFROST,
DATA_KRICK,
DATA_ICK,
DATA_TYRANNUS,
DATA_RIMEFANG,
DATA_JAINA_SYLVANAS_1, // GUID of either Jaina or Sylvanas part 1, depending on team, as it's the same spawn.
DATA_JAINA_SYLVANAS_2, // GUID of either Jaina or Sylvanas part 2, depending on team, as it's the same spawn.
};
enum Creatures
{
CREATURE_GARFROST = 36494,
CREATURE_KRICK = 36477,
CREATURE_ICK = 36476,
CREATURE_TYRANNUS = 36658,
CREATURE_RIMEFANG = 36661,
NPC_SYLVANAS_PART1 = 36990,
NPC_SYLVANAS_PART2 = 38189,
NPC_JAINA_PART1 = 36993,
NPC_JAINA_PART2 = 38188,
NPC_KILARA = 37583,
NPC_ELANDRA = 37774,
NPC_KORALEN = 37779,
NPC_KORLAEN = 37582,
NPC_CHAMPION_1_HORDE = 37584,
NPC_CHAMPION_2_HORDE = 37587,
NPC_CHAMPION_3_HORDE = 37588,
NPC_CHAMPION_1_ALLIANCE = 37496,
NPC_CHAMPION_2_ALLIANCE = 37497,
};
#endif
@@ -0,0 +1,625 @@
/* 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: Grizzly_Hills
SD%Complete: 80
SDComment: Quest support: 12231, 12247
SDCategory: Grizzly Hills
EndScriptData */
/* ContentData
npc_orsonn_and_kodian
EndContentData */
#include "ScriptedPch.h"
#include "ScriptedEscortAI.h"
#define GOSSIP_ITEM1 "You're free to go Orsonn, but first tell me what's wrong with the furbolg."
#define GOSSIP_ITEM2 "What happened then?"
#define GOSSIP_ITEM3 "Thank you, Son of Ursoc. I'll see what can be done."
#define GOSSIP_ITEM4 "Who was this stranger?"
#define GOSSIP_ITEM5 "Thank you, Kodian. I'll do what I can."
enum eEnums
{
GOSSIP_TEXTID_ORSONN1 = 12793,
GOSSIP_TEXTID_ORSONN2 = 12794,
GOSSIP_TEXTID_ORSONN3 = 12796,
GOSSIP_TEXTID_KODIAN1 = 12797,
GOSSIP_TEXTID_KODIAN2 = 12798,
NPC_ORSONN = 27274,
NPC_KODIAN = 27275,
//trigger creatures
NPC_ORSONN_CREDIT = 27322,
NPC_KODIAN_CREDIT = 27321,
QUEST_CHILDREN_OF_URSOC = 12247,
QUEST_THE_BEAR_GODS_OFFSPRING = 12231
};
bool GossipHello_npc_orsonn_and_kodian(Player* pPlayer, Creature* pCreature)
{
if (pCreature->isQuestGiver())
pPlayer->PrepareQuestMenu(pCreature->GetGUID());
if (pPlayer->GetQuestStatus(QUEST_CHILDREN_OF_URSOC) == QUEST_STATUS_INCOMPLETE || pPlayer->GetQuestStatus(QUEST_THE_BEAR_GODS_OFFSPRING) == QUEST_STATUS_INCOMPLETE)
{
switch(pCreature->GetEntry())
{
case NPC_ORSONN:
if (!pPlayer->GetReqKillOrCastCurrentCount(QUEST_CHILDREN_OF_URSOC, NPC_ORSONN_CREDIT) || !pPlayer->GetReqKillOrCastCurrentCount(QUEST_THE_BEAR_GODS_OFFSPRING, NPC_ORSONN_CREDIT))
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ORSONN1, pCreature->GetGUID());
return true;
}
break;
case NPC_KODIAN:
if (!pPlayer->GetReqKillOrCastCurrentCount(QUEST_CHILDREN_OF_URSOC, NPC_KODIAN_CREDIT) || !pPlayer->GetReqKillOrCastCurrentCount(QUEST_THE_BEAR_GODS_OFFSPRING, NPC_KODIAN_CREDIT))
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_KODIAN1, pCreature->GetGUID());
return true;
}
break;
}
}
pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_orsonn_and_kodian(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
switch(uiAction)
{
case GOSSIP_ACTION_INFO_DEF+1:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ORSONN2, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+2:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ORSONN3, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+3:
pPlayer->CLOSE_GOSSIP_MENU();
pPlayer->TalkedToCreature(NPC_ORSONN_CREDIT, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+4:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_KODIAN2, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+5:
pPlayer->CLOSE_GOSSIP_MENU();
pPlayer->TalkedToCreature(NPC_KODIAN_CREDIT, pCreature->GetGUID());
break;
}
return true;
}
/*######
## Quest 12027: Mr. Floppy's Perilous Adventure
######*/
enum eFloppy
{
NPC_MRFLOPPY = 26589,
NPC_HUNGRY_WORG = 26586,
NPC_RAVENOUS_WORG = 26590, //RWORG
NPC_EMILY = 26588,
QUEST_PERILOUS_ADVENTURE = 12027,
SPELL_MRFLOPPY = 47184, //vehicle aura
SAY_WORGHAGGRO1 = -1800001, //Um... I think one of those wolves is back...
SAY_WORGHAGGRO2 = -1800002, //He's going for Mr. Floppy!
SAY_WORGRAGGRO3 = -1800003, //Oh, no! Look, it's another wolf, and it's a biiiiiig one!
SAY_WORGRAGGRO4 = -1800004, //He's gonna eat Mr. Floppy! You gotta help Mr. Floppy! You just gotta!
SAY_RANDOMAGGRO = -1800005, //There's a big meanie attacking Mr. Floppy! Help!
SAY_VICTORY1 = -1800006, //Let's get out of here before more wolves find us!
SAY_VICTORY2 = -1800007, //Don't go toward the light, Mr. Floppy!
SAY_VICTORY3 = -1800008, //Mr. Floppy, you're ok! Thank you so much for saving Mr. Floppy!
SAY_VICTORY4 = -1800009, //I think I see the camp! We're almost home, Mr. Floppy! Let's go!
TEXT_EMOTE_WP1 = -1800010, //Mr. Floppy revives
TEXT_EMOTE_AGGRO = -1800011, //The Ravenous Worg chomps down on Mr. Floppy
SAY_QUEST_ACCEPT = -1800012, //Are you ready, Mr. Floppy? Stay close to me and watch out for those wolves!
SAY_QUEST_COMPLETE = -1800013 //Thank you for helping me get back to the camp. Go tell Walter that I'm safe now!
};
//emily
struct npc_emilyAI : public npc_escortAI
{
npc_emilyAI(Creature* pCreature) : npc_escortAI(pCreature) { }
uint32 m_uiChatTimer;
uint64 RWORGGUID;
uint64 MrfloppyGUID;
bool Completed;
void JustSummoned(Creature* pSummoned)
{
if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 50.0f))
pSummoned->AI()->AttackStart(Mrfloppy);
else
pSummoned->AI()->AttackStart(me->getVictim());
}
void WaypointReached(uint32 i)
{
Player* pPlayer = GetPlayerForEscort();
if (!pPlayer)
return;
switch (i)
{
case 9:
if (Creature *Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 100.0f))
MrfloppyGUID = Mrfloppy->GetGUID();
break;
case 10:
if (Creature *Mrfloppy = Unit::GetCreature(*me, MrfloppyGUID))
{
DoScriptText(SAY_WORGHAGGRO1, me);
me->SummonCreature(NPC_HUNGRY_WORG,me->GetPositionX()+5,me->GetPositionY()+2,me->GetPositionZ()+1,3.229f,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,120000);
}
break;
case 11:
if (Creature *Mrfloppy = Unit::GetCreature(*me, MrfloppyGUID))
Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
break;
case 17:
if (Creature *Mrfloppy = Unit::GetCreature(*me, MrfloppyGUID))
Mrfloppy->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ());
DoScriptText(SAY_WORGRAGGRO3, me);
if (Creature *RWORG = me->SummonCreature(NPC_RAVENOUS_WORG,me->GetPositionX()+10,me->GetPositionY()+8,me->GetPositionZ()+2,3.229f,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,120000))
{
RWORG->setFaction(35);
RWORGGUID = RWORG->GetGUID();
}
break;
case 18:
if (Creature *Mrfloppy = Unit::GetCreature(*me, MrfloppyGUID))
{
if (Creature *RWORG = Unit::GetCreature(*me, RWORGGUID))
RWORG->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ());
DoCast(Mrfloppy,SPELL_MRFLOPPY);
}
break;
case 19:
if (Creature *Mrfloppy = Unit::GetCreature(*me, MrfloppyGUID))
{
if (Mrfloppy->HasAura(SPELL_MRFLOPPY, 0))
{
if (Creature *RWORG = Unit::GetCreature(*me, RWORGGUID))
Mrfloppy->EnterVehicle(RWORG);
}
}
break;
case 20:
if (Creature *RWORG = Unit::GetCreature(*me, RWORGGUID))
RWORG->HandleEmoteCommand(34);
break;
case 21:
if (Creature *Mrfloppy = Unit::GetCreature(*me, MrfloppyGUID))
{
if (Creature *RWORG = Unit::GetCreature(*me, RWORGGUID))
{
RWORG->Kill(Mrfloppy);
Mrfloppy->ExitVehicle();
RWORG->setFaction(14);
RWORG->GetMotionMaster()->MovePoint(0, RWORG->GetPositionX()+10,RWORG->GetPositionY()+80,RWORG->GetPositionZ());
DoScriptText(SAY_VICTORY2, me);
}
}
break;
case 22:
if (Creature *Mrfloppy = Unit::GetCreature(*me, MrfloppyGUID))
{
if (Mrfloppy->isDead())
{
if (Creature *RWORG = Unit::GetCreature(*me, RWORGGUID))
RWORG->DisappearAndDie();
me->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ());
Mrfloppy->setDeathState(ALIVE);
Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
DoScriptText(SAY_VICTORY3, me);
}
}
break;
case 24:
if (pPlayer)
{
Completed = true;
pPlayer->GroupEventHappens(QUEST_PERILOUS_ADVENTURE, me);
DoScriptText(SAY_QUEST_COMPLETE, me, pPlayer);
}
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
break;
case 25:
DoScriptText(SAY_VICTORY4, me);
break;
case 27:
me->DisappearAndDie();
if (Creature *Mrfloppy = Unit::GetCreature(*me, MrfloppyGUID))
Mrfloppy->DisappearAndDie();
break;
}
}
void EnterCombat(Unit* /*Who*/)
{
DoScriptText(SAY_RANDOMAGGRO, me);
}
void Reset()
{
m_uiChatTimer = 4000;
MrfloppyGUID = 0;
RWORGGUID = 0;
}
void UpdateAI(const uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
if (HasEscortState(STATE_ESCORT_ESCORTING))
{
if (m_uiChatTimer <= uiDiff)
{
m_uiChatTimer = 12000;
}
else
m_uiChatTimer -= uiDiff;
}
}
};
bool QuestAccept_npc_emily(Player* pPlayer, Creature* pCreature, Quest const* quest)
{
if (quest->GetQuestId() == QUEST_PERILOUS_ADVENTURE)
{
DoScriptText(SAY_QUEST_ACCEPT, pCreature);
if (Creature* Mrfloppy = GetClosestCreatureWithEntry(pCreature, NPC_MRFLOPPY, 180.0f))
{
Mrfloppy->GetMotionMaster()->MoveFollow(pCreature, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
}
if (npc_escortAI* pEscortAI = CAST_AI(npc_emilyAI, (pCreature->AI())))
pEscortAI->Start(true, false, pPlayer->GetGUID());
}
return true;
}
CreatureAI* GetAI_npc_emily(Creature* pCreature)
{
return new npc_emilyAI(pCreature);
}
//mrfloppy
struct npc_mrfloppyAI : public ScriptedAI
{
npc_mrfloppyAI(Creature *c) : ScriptedAI(c) {}
uint64 EmilyGUID;
uint64 RWORGGUID;
uint64 HWORGGUID;
void Reset() {}
void EnterCombat(Unit* Who)
{
if (Creature* Emily = GetClosestCreatureWithEntry(me, NPC_EMILY, 50.0f))
{
switch(Who->GetEntry())
{
case NPC_HUNGRY_WORG:
DoScriptText(SAY_WORGHAGGRO2, Emily);
break;
case NPC_RAVENOUS_WORG:
DoScriptText(SAY_WORGRAGGRO4, Emily);
break;
default:
DoScriptText(SAY_RANDOMAGGRO, Emily);
}
}
}
void EnterEvadeMode() {}
void MoveInLineOfSight(Unit * /*who*/) {}
void UpdateAI(const uint32 /*diff*/)
{
if (!UpdateVictim())
return;
}
};
CreatureAI* GetAI_npc_mrfloppy(Creature* pCreature)
{
return new npc_mrfloppyAI(pCreature);
}
// Outhouse Bunny
enum eOuthouseBunny
{
SPELL_OUTHOUSE_GROANS = 48382,
SPELL_CAMERA_SHAKE = 47533,
SPELL_DUST_FIELD = 48329
};
enum eSounds
{
SOUND_FEMALE = 12671,
SOUND_MALE = 12670
};
struct npc_outhouse_bunnyAI : public ScriptedAI
{
npc_outhouse_bunnyAI(Creature* pCreature) : ScriptedAI(pCreature) {}
uint8 m_counter;
uint8 m_gender;
void Reset()
{
m_counter = 0;
m_gender = 0;
}
void SetData(uint32 uiType, uint32 uiData)
{
if (uiType == 1)
m_gender = uiData;
}
void SpellHit(Unit* pCaster, const SpellEntry* pSpell)
{
if (pSpell->Id == SPELL_OUTHOUSE_GROANS)
{
++m_counter;
if (m_counter < 5)
DoCast(pCaster, SPELL_CAMERA_SHAKE, true);
else
m_counter = 0;
DoCast(me, SPELL_DUST_FIELD, true);
switch (m_gender)
{
case GENDER_FEMALE: DoPlaySoundToSet(me, SOUND_FEMALE); break;
case GENDER_MALE: DoPlaySoundToSet(me, SOUND_MALE); break;
}
}
}
};
CreatureAI* GetAI_npc_outhouse_bunny(Creature* pCreature)
{
return new npc_outhouse_bunnyAI (pCreature);
}
// Tallhorn Stage
enum etallhornstage
{
OBJECT_HAUNCH = 188665
};
struct npc_tallhorn_stagAI : public ScriptedAI
{
npc_tallhorn_stagAI(Creature* pCreature) : ScriptedAI(pCreature) {}
uint8 m_uiPhase;
void Reset()
{
m_uiPhase = 1;
}
void UpdateAI(const uint32 /*uiDiff*/)
{
if (m_uiPhase == 1)
{
if (GameObject* haunch = me->FindNearestGameObject(OBJECT_HAUNCH, 2.0f))
{
me->SetStandState(UNIT_STAND_STATE_DEAD);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
me->SetUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
}
m_uiPhase = 0;
}
}
};
CreatureAI* GetAI_npc_tallhorn_stag(Creature* pCreature)
{
return new npc_tallhorn_stagAI (pCreature);
}
// Amberpine Woodsman
enum eamberpinewoodsman
{
TALLHORN_STAG = 26363
};
struct npc_amberpine_woodsmanAI : public ScriptedAI
{
npc_amberpine_woodsmanAI(Creature* pCreature) : ScriptedAI(pCreature) {}
uint8 m_uiPhase;
uint32 m_uiTimer;
void Reset()
{
m_uiTimer = 0;
m_uiPhase = 1;
}
void UpdateAI(const uint32 uiDiff)
{
// call this each update tick?
if (Creature* stag = me->FindNearestCreature(TALLHORN_STAG, 0.2f))
{
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USESTANDING);
}
else
if (m_uiPhase)
{
if (m_uiTimer <= uiDiff)
{
switch(m_uiPhase)
{
case 1:
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_LOOT);
m_uiTimer = 3000;
m_uiPhase = 2;
break;
case 2:
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK1H);
m_uiTimer = 4000;
m_uiPhase = 1;
break;
}
}
else
m_uiTimer -= uiDiff;
}
ScriptedAI::UpdateAI(uiDiff);
UpdateVictim();
}
};
/*######
## Quest 12288: Overwhelmed!
######*/
enum eSkirmisher
{
SPELL_RENEW_SKIRMISHER = 48812,
CREDIT_NPC = 27466,
RANDOM_SAY_1 = -1800044, //Ahh..better..
RANDOM_SAY_2 = -1800045, //Whoa.. i nearly died there. Thank you, $Race!
RANDOM_SAY_3 = -1800046 //Thank you. $Class!
};
struct npc_wounded_skirmisherAI : public ScriptedAI
{
npc_wounded_skirmisherAI(Creature *c) : ScriptedAI(c) {}
uint64 uiPlayerGUID;
uint32 DespawnTimer;
void Reset ()
{
DespawnTimer = 5000;
uiPlayerGUID = 0;
}
void MovementInform(uint32, uint32 id)
{
if (id == 1)
me->ForcedDespawn(DespawnTimer);
}
void SpellHit(Unit *caster, const SpellEntry *spell)
{
if (spell->Id == SPELL_RENEW_SKIRMISHER && caster->GetTypeId() == TYPEID_PLAYER
&& caster->ToPlayer()->GetQuestStatus(12288) == QUEST_STATUS_INCOMPLETE)
{
caster->ToPlayer()->KilledMonsterCredit(CREDIT_NPC, 0);
DoScriptText(RAND(RANDOM_SAY_1,RANDOM_SAY_2,RANDOM_SAY_3),caster);
if(me->IsStandState())
me->GetMotionMaster()->MovePoint(1, me->GetPositionX()+7, me->GetPositionY()+7, me->GetPositionZ());
else
{
me->SetStandState(UNIT_STAND_STATE_STAND);
me->ForcedDespawn(DespawnTimer);
}
}
}
void UpdateAI(const uint32 /*diff*/)
{
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_npc_wounded_skirmisher(Creature* pCreature)
{
return new npc_wounded_skirmisherAI(pCreature);
}
CreatureAI* GetAI_npc_amberpine_woodsman(Creature* pCreature)
{
return new npc_amberpine_woodsmanAI (pCreature);
}
void AddSC_grizzly_hills()
{
Script* newscript;
newscript = new Script;
newscript->Name = "npc_orsonn_and_kodian";
newscript->pGossipHello = &GossipHello_npc_orsonn_and_kodian;
newscript->pGossipSelect = &GossipSelect_npc_orsonn_and_kodian;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_emily";
newscript->GetAI = &GetAI_npc_emily;
newscript->pQuestAccept = &QuestAccept_npc_emily;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_mrfloppy";
newscript->GetAI = &GetAI_npc_mrfloppy;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_outhouse_bunny";
newscript->GetAI = &GetAI_npc_outhouse_bunny;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_tallhorn_stag";
newscript->GetAI = &GetAI_npc_tallhorn_stag;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_amberpine_woodsman";
newscript->GetAI = &GetAI_npc_amberpine_woodsman;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_wounded_skirmisher";
newscript->GetAI = &GetAI_npc_wounded_skirmisher;
newscript->RegisterSelf();
}
@@ -0,0 +1,317 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* Comment: The event with the Living Mojos is not implemented, just is done that when one of the mojos around the boss take damage will make the boss enter in combat!
*/
#include "ScriptedPch.h"
#include "gundrak.h"
enum Spells
{
SPELL_EMERGE = 54850,
SPELL_MIGHTY_BLOW = 54719,
SPELL_MERGE = 54878,
SPELL_SURGE = 54801,
SPELL_FREEZE_ANIM = 16245,
SPELL_MOJO_PUDDLE = 55627,
H_SPELL_MOJO_PUDDLE = 58994,
SPELL_MOJO_WAVE = 55626,
H_SPELL_MOJO_WAVE = 58993
};
struct boss_drakkari_colossusAI : public ScriptedAI
{
boss_drakkari_colossusAI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* pInstance;
bool bHealth;
bool bHealth1;
uint32 MightyBlowTimer;
void Reset()
{
if (pInstance)
pInstance->SetData(DATA_DRAKKARI_COLOSSUS_EVENT, NOT_STARTED);
if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE))
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->clearUnitState(UNIT_STAT_STUNNED | UNIT_STAT_ROOT);
me->SetReactState(REACT_PASSIVE);
MightyBlowTimer = 10*IN_MILISECONDS;
bHealth = false;
bHealth1 = false;
}
void EnterCombat(Unit* /*who*/)
{
if (pInstance)
pInstance->SetData(DATA_DRAKKARI_COLOSSUS_EVENT, IN_PROGRESS);
}
void CreatureState(Creature* pWho, bool bRestore = false)
{
if (!pWho)
return;
if (bRestore)
{
pWho->clearUnitState(UNIT_STAT_STUNNED | UNIT_STAT_ROOT);
pWho->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if (pWho == me)
me->RemoveAura(SPELL_FREEZE_ANIM);
}else
{
pWho->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
pWho->addUnitState(UNIT_STAT_STUNNED | UNIT_STAT_ROOT);
if (pWho == me)
DoCast(me,SPELL_FREEZE_ANIM);
}
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (!bHealth && HealthBelowPct(50) && !HealthBelowPct(5))
{
CreatureState(me, false);
DoCast(me,SPELL_FREEZE_ANIM);
DoCast(me,SPELL_EMERGE);
bHealth = true;
}
if (!bHealth1 && HealthBelowPct(5))
{
DoCast(me,SPELL_EMERGE);
CreatureState(me, false);
bHealth1 = true;
me->RemoveAllAuras();
}
if (MightyBlowTimer <= diff)
{
DoCast(me->getVictim(), SPELL_MIGHTY_BLOW, true);
MightyBlowTimer = 10*IN_MILISECONDS;
} else MightyBlowTimer -= diff;
if (!me->hasUnitState(UNIT_STAT_STUNNED))
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
if (pInstance)
pInstance->SetData(DATA_DRAKKARI_COLOSSUS_EVENT, DONE);
}
void JustSummoned(Creature* pSummon)
{
if (HealthBelowPct(5))
pSummon->DealDamage(pSummon, pSummon->GetHealth() * 0.5 , NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
pSummon->AI()->AttackStart(me->getVictim());
}
};
struct boss_drakkari_elementalAI : public ScriptedAI
{
boss_drakkari_elementalAI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* pInstance;
uint32 uiSurgeTimer;
bool bGoToColossus;
void Reset()
{
if (Creature *pColossus = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->CreatureState(me, true);
uiSurgeTimer = 7*IN_MILISECONDS;
bGoToColossus = false;
}
void EnterEvadeMode()
{
me->RemoveFromWorld();
}
void MovementInform(uint32 uiType, uint32 /*uiId*/)
{
if (uiType != POINT_MOTION_TYPE)
return;
if (Creature *pColossus = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
{
CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->CreatureState(pColossus, true);
CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->bHealth1 = false;
}
me->RemoveFromWorld();
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (!bGoToColossus && HealthBelowPct(50))
{
if (Creature *pColossus = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
{
if (!CAST_AI(boss_drakkari_colossusAI,pColossus->AI())->HealthBelowPct(6))
{
me->InterruptNonMeleeSpells(true);
DoCast(pColossus, SPELL_MERGE);
bGoToColossus = true;
}
}
}
if (uiSurgeTimer <= diff)
{
DoCast(me->getVictim(), SPELL_SURGE);
uiSurgeTimer = 7*IN_MILISECONDS;
} else uiSurgeTimer -= diff;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
if (Creature *pColossus = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
pColossus->Kill(pColossus);
}
};
struct npc_living_mojoAI : public ScriptedAI
{
npc_living_mojoAI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* pInstance;
uint32 uiMojoWaveTimer;
uint32 uiMojoPuddleTimer;
void Reset()
{
uiMojoWaveTimer = 2*IN_MILISECONDS;
uiMojoPuddleTimer = 7*IN_MILISECONDS;
}
void EnterCombat(Unit* /*who*/)
{
//Check if the npc is near of Drakkari Colossus.
if (Creature *pColossus = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
{
if (pColossus->isAlive() && me->IsInRange3d(pColossus->GetHomePosition().GetPositionX(),pColossus->GetHomePosition().GetPositionY(),pColossus->GetHomePosition().GetPositionZ(),0.0f,17.0f))
me->SetReactState(REACT_PASSIVE);
else
me->SetReactState(REACT_AGGRESSIVE);
}
}
void DamageTaken(Unit* pDone_by, uint32& /*uiDamage*/)
{
if (me->HasReactState(REACT_PASSIVE))
{
if (Creature *pColossus = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
{
if (pColossus->isAlive() && !pColossus->isInCombat())
{
pColossus->RemoveAura(SPELL_FREEZE_ANIM);
pColossus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
pColossus->SetReactState(REACT_AGGRESSIVE);
if (pDone_by && pDone_by->isAlive())
pColossus->AI()->AttackStart(pDone_by);
EnterEvadeMode();
}
}
}
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (uiMojoWaveTimer <= diff)
{
DoCast(me->getVictim(), SPELL_MOJO_WAVE);
uiMojoWaveTimer = 15*IN_MILISECONDS;
} else uiMojoWaveTimer -= diff;
if (uiMojoPuddleTimer <= diff)
{
DoCast(me->getVictim(), SPELL_MOJO_PUDDLE);
uiMojoPuddleTimer = 18*IN_MILISECONDS;
} else uiMojoPuddleTimer -= diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_drakkari_colossus(Creature* pCreature)
{
return new boss_drakkari_colossusAI (pCreature);
}
CreatureAI* GetAI_boss_drakkari_elemental(Creature* pCreature)
{
return new boss_drakkari_elementalAI (pCreature);
}
CreatureAI* GetAI_npc_living_mojo(Creature* pCreature)
{
return new npc_living_mojoAI (pCreature);
}
void AddSC_boss_drakkari_colossus()
{
Script* newscript;
newscript = new Script;
newscript->Name = "boss_drakkari_colossus";
newscript->GetAI = &GetAI_boss_drakkari_colossus;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "boss_drakkari_elemental";
newscript->GetAI = &GetAI_boss_drakkari_elemental;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_living_mojo";
newscript->GetAI = &GetAI_npc_living_mojo;
newscript->RegisterSelf();
}
@@ -0,0 +1,168 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "gundrak.h"
enum Spells
{
SPELL_ECK_BERSERK = 55816, //Eck goes berserk, increasing his attack speed by 150% and all damage he deals by 500%.
SPELL_ECK_BITE = 55813, //Eck bites down hard, inflicting 150% of his normal damage to an enemy.
SPELL_ECK_SPIT = 55814, //Eck spits toxic bile at enemies in a cone in front of him, inflicting 2970 Nature damage and draining 220 mana every 1 sec for 3 sec.
SPELL_ECK_SPRING_1 = 55815, //Eck leaps at a distant target. --> Drops aggro and charges a random player. Tank can simply taunt him back.
SPELL_ECK_SPRING_2 = 55837 //Eck leaps at a distant target.
};
static Position EckSpawnPoint = { 1643.877930, 936.278015, 107.204948, 0.668432 };
struct boss_eckAI : public ScriptedAI
{
boss_eckAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
uint32 uiBerserkTimer;
uint32 uiBiteTimer;
uint32 uiSpitTimer;
uint32 uiSpringTimer;
bool bBerserk;
ScriptedInstance* pInstance;
void Reset()
{
uiBerserkTimer = urand(60*IN_MILISECONDS,90*IN_MILISECONDS); //60-90 secs according to wowwiki
uiBiteTimer = 5*IN_MILISECONDS;
uiSpitTimer = 10*IN_MILISECONDS;
uiSpringTimer = 8*IN_MILISECONDS;
bBerserk = false;
if (pInstance)
pInstance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
if (pInstance)
pInstance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, IN_PROGRESS);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (uiBiteTimer <= diff)
{
DoCast(me->getVictim(), SPELL_ECK_BITE);
uiBiteTimer = urand(8*IN_MILISECONDS,12*IN_MILISECONDS);
} else uiBiteTimer -= diff;
if (uiSpitTimer <= diff)
{
DoCast(me->getVictim(), SPELL_ECK_SPIT);
uiSpitTimer = urand(6*IN_MILISECONDS,14*IN_MILISECONDS);
} else uiSpitTimer -= diff;
if (uiSpringTimer <= diff)
{
Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,1);
if (pTarget && pTarget->GetTypeId() == TYPEID_PLAYER)
{
DoCast(pTarget, RAND(SPELL_ECK_SPRING_1, SPELL_ECK_SPRING_2));
uiSpringTimer = urand(5*IN_MILISECONDS,10*IN_MILISECONDS);
}
} else uiSpringTimer -= diff;
//Berserk on timer or 20% of health
if (!bBerserk)
{
if (uiBerserkTimer <= diff)
{
DoCast(me, SPELL_ECK_BERSERK);
bBerserk = true;
}
else
{
uiBerserkTimer -= diff;
if (HealthBelowPct(20))
{
DoCast(me, SPELL_ECK_BERSERK);
bBerserk = true;
}
}
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
if (pInstance)
pInstance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, DONE);
}
};
CreatureAI* GetAI_boss_eck(Creature* pCreature)
{
return new boss_eckAI (pCreature);
}
struct npc_ruins_dwellerAI : public ScriptedAI
{
npc_ruins_dwellerAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
void JustDied(Unit * /*who*/)
{
if (pInstance)
{
pInstance->SetData64(DATA_RUIN_DWELLER_DIED,me->GetGUID());
if (pInstance->GetData(DATA_ALIVE_RUIN_DWELLERS) == 0)
me->SummonCreature(CREATURE_ECK, EckSpawnPoint, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300*IN_MILISECONDS);
}
}
};
CreatureAI* GetAI_npc_ruins_dweller(Creature* pCreature)
{
return new npc_ruins_dwellerAI (pCreature);
}
void AddSC_boss_eck()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_eck";
newscript->GetAI = &GetAI_boss_eck;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_ruins_dweller";
newscript->GetAI = &GetAI_npc_ruins_dweller;
newscript->RegisterSelf();
}
@@ -0,0 +1,288 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "gundrak.h"
//Spells
enum Spells
{
SPELL_ENRAGE = 55285,
H_SPELL_ENRAGE = 59828,
SPELL_IMPALING_CHARGE = 54956,
H_SPELL_IMPALING_CHARGE = 59827,
SPELL_STOMP = 55292,
H_SPELL_STOMP = 59829,
SPELL_PUNCTURE = 55276,
H_SPELL_PUNCTURE = 59826,
SPELL_STAMPEDE = 55218,
SPELL_WHIRLING_SLASH = 55250,
H_SPELL_WHIRLING_SLASH = 59824,
SPELL_ECK_RESIDUE = 55817
};
//Yells
enum Yells
{
SAY_AGGRO = -1604000,
SAY_SLAY_1 = -1604001,
SAY_SLAY_2 = -1604002,
SAY_SLAY_3 = -1604003,
SAY_DEATH = -1604004,
SAY_SUMMON_RHINO_1 = -1604005,
SAY_SUMMON_RHINO_2 = -1604006,
SAY_SUMMON_RHINO_3 = -1604007,
SAY_TRANSFORM_1 = -1604008, //Phase change
SAY_TRANSFORM_2 = -1604009
};
enum Achievements
{
ACHIEV_WHAT_THE_ECK = 1864,
ACHIEV_SHARE_THE_LOVE = 2152
};
enum Displays
{
DISPLAY_RHINO = 26265,
DISPLAY_TROLL = 27061
};
enum CombatPhase
{
TROLL,
RHINO
};
struct boss_gal_darahAI : public ScriptedAI
{
boss_gal_darahAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
uint32 uiStampedeTimer;
uint32 uiWhirlingSlashTimer;
uint32 uiPunctureTimer;
uint32 uiEnrageTimer;
uint32 uiImpalingChargeTimer;
uint32 uiStompTimer;
uint32 uiTransformationTimer;
std::set<uint64> lImpaledPlayers;
CombatPhase Phase;
uint8 uiPhaseCounter;
bool bStartOfTransformation;
ScriptedInstance* pInstance;
void Reset()
{
uiStampedeTimer = 10*IN_MILISECONDS;
uiWhirlingSlashTimer = 21*IN_MILISECONDS;
uiPunctureTimer = 10*IN_MILISECONDS;
uiEnrageTimer = 15*IN_MILISECONDS;
uiImpalingChargeTimer = 21*IN_MILISECONDS;
uiStompTimer = 25*IN_MILISECONDS;
uiTransformationTimer = 9*IN_MILISECONDS;
uiPhaseCounter = 0;
lImpaledPlayers.clear();
bStartOfTransformation = true;
Phase = TROLL;
me->SetDisplayId(DISPLAY_TROLL);
if (pInstance)
pInstance->SetData(DATA_GAL_DARAH_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
pInstance->SetData(DATA_GAL_DARAH_EVENT, IN_PROGRESS);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
switch (Phase)
{
case TROLL:
if (uiPhaseCounter == 2)
{
if (uiTransformationTimer <= diff)
{
me->SetDisplayId(DISPLAY_RHINO);
Phase = RHINO;
uiPhaseCounter = 0;
DoScriptText(SAY_TRANSFORM_1, me);
uiTransformationTimer = 5*IN_MILISECONDS;
bStartOfTransformation = true;
me->clearUnitState(UNIT_STAT_STUNNED|UNIT_STAT_ROOT);
me->SetReactState(REACT_AGGRESSIVE);
}
else
{
uiTransformationTimer -= diff;
if (bStartOfTransformation)
{
bStartOfTransformation = false;
me->addUnitState(UNIT_STAT_STUNNED|UNIT_STAT_ROOT);
me->SetReactState(REACT_PASSIVE);
}
}
}
else
{
if (uiStampedeTimer <= diff)
{
DoCast(me, SPELL_STAMPEDE);
DoScriptText(RAND(SAY_SUMMON_RHINO_1,SAY_SUMMON_RHINO_2,SAY_SUMMON_RHINO_3),me);
uiStampedeTimer = 15*IN_MILISECONDS;
} else uiStampedeTimer -= diff;
if (uiWhirlingSlashTimer <= diff)
{
DoCast(me->getVictim(), SPELL_WHIRLING_SLASH);
uiWhirlingSlashTimer = 21*IN_MILISECONDS;
++uiPhaseCounter;
} else uiWhirlingSlashTimer -= diff;
}
break;
case RHINO:
if (uiPhaseCounter == 2)
{
if (uiTransformationTimer <= diff)
{
me->SetDisplayId(DISPLAY_TROLL);
Phase = TROLL;
uiPhaseCounter = 0;
DoScriptText(SAY_TRANSFORM_2, me);
uiTransformationTimer = 9*IN_MILISECONDS;
bStartOfTransformation = true;
me->clearUnitState(UNIT_STAT_STUNNED|UNIT_STAT_ROOT);
me->SetReactState(REACT_AGGRESSIVE);
}
else
{
uiTransformationTimer -= diff;
if (bStartOfTransformation)
{
bStartOfTransformation = false;
me->addUnitState(UNIT_STAT_STUNNED|UNIT_STAT_ROOT);
me->SetReactState(REACT_PASSIVE);
}
}
}
else
{
if (uiPunctureTimer <= diff)
{
DoCast(me->getVictim(), SPELL_PUNCTURE);
uiPunctureTimer = 8*IN_MILISECONDS;
} else uiPunctureTimer -= diff;
if (uiEnrageTimer <= diff)
{
DoCast(me->getVictim(), SPELL_ENRAGE);
uiEnrageTimer = 20*IN_MILISECONDS;
} else uiEnrageTimer -= diff;
if (uiStompTimer <= diff)
{
DoCast(me->getVictim(), SPELL_STOMP);
uiStompTimer = 20*IN_MILISECONDS;
} else uiStompTimer -= diff;
if (uiImpalingChargeTimer <= diff)
{
if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{
DoCast(pTarget, SPELL_IMPALING_CHARGE);
lImpaledPlayers.insert(pTarget->GetGUID());
}
uiImpalingChargeTimer = 31*IN_MILISECONDS;
++uiPhaseCounter;
} else uiImpalingChargeTimer -= diff;
}
break;
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
{
if (IsHeroic())
{
if (lImpaledPlayers.size() == 5)
pInstance->DoCompleteAchievement(ACHIEV_SHARE_THE_LOVE);
AchievementEntry const *achievWhatTheEck = GetAchievementStore()->LookupEntry(ACHIEV_WHAT_THE_ECK);
if (achievWhatTheEck)
{
Map::PlayerList const &players = pInstance->instance->GetPlayers();
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if (itr->getSource()->HasAura(SPELL_ECK_RESIDUE))
itr->getSource()->CompletedAchievement(achievWhatTheEck);
}
}
pInstance->SetData(DATA_GAL_DARAH_EVENT, DONE);
}
}
void KilledUnit(Unit * victim)
{
if (victim == me)
return;
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), me);
}
};
CreatureAI* GetAI_boss_gal_darah(Creature* pCreature)
{
return new boss_gal_darahAI (pCreature);
}
void AddSC_boss_gal_darah()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_gal_darah";
newscript->GetAI = &GetAI_boss_gal_darah;
newscript->RegisterSelf();
}
@@ -0,0 +1,175 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "gundrak.h"
enum eSpells
{
SPELL_DETERMINED_STAB = 55104,
SPELL_GROUND_TREMOR = 55142,
SPELL_NUMBING_SHOUT = 55106,
SPELL_DETERMINED_GORE = 55102,
H_SPELL_DETERMINED_GORE = 59444,
SPELL_QUAKE = 55101,
SPELL_NUMBING_ROAR = 55100,
SPELL_MOJO_FRENZY = 55163,
SPELL_TRANSFORMATION = 55098, //Periodic, The caster transforms into a powerful mammoth, increasing Physical damage done by 25% and granting immunity to Stun effects.
};
enum eArchivements
{
ACHIEV_LESS_RABI = 2040
};
enum eSays
{
SAY_AGGRO = -1604010,
//SAY_SLAY_1 = -1604011, // not in db
SAY_SLAY_2 = -1604012,
SAY_SLAY_3 = -1604013,
SAY_DEATH = -1604014,
SAY_TRANSFORM = -1604015,
SAY_QUAKE = -1604016,
EMOTE_TRANSFORM = -1604017
};
struct boss_moorabiAI : public ScriptedAI
{
boss_moorabiAI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* pInstance;
bool bPhase;
uint32 uiNumblingShoutTimer;
uint32 uiGroundTremorTimer;
uint32 uiDeterminedStabTimer;
uint32 uiTransformationTImer;
void Reset()
{
uiGroundTremorTimer = 18*IN_MILISECONDS;
uiNumblingShoutTimer = 10*IN_MILISECONDS;
uiDeterminedStabTimer = 20*IN_MILISECONDS;
uiTransformationTImer = 12*IN_MILISECONDS;
bPhase = false;
if (pInstance)
pInstance->SetData(DATA_MOORABI_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*pWho*/)
{
DoScriptText(SAY_AGGRO, me);
DoCast(me, SPELL_MOJO_FRENZY, true);
if (pInstance)
pInstance->SetData(DATA_MOORABI_EVENT, IN_PROGRESS);
}
void UpdateAI(const uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (!bPhase && me->HasAura(SPELL_TRANSFORMATION))
{
bPhase = true;
me->RemoveAura(SPELL_MOJO_FRENZY);
}
if (uiGroundTremorTimer <= uiDiff)
{
DoScriptText(SAY_QUAKE, me);
if (bPhase)
DoCast(me->getVictim(), SPELL_QUAKE, true);
else
DoCast(me->getVictim(), SPELL_GROUND_TREMOR, true);
uiGroundTremorTimer = 10*IN_MILISECONDS;
} else uiGroundTremorTimer -= uiDiff;
if (uiNumblingShoutTimer <= uiDiff)
{
if (bPhase)
DoCast(me->getVictim(), SPELL_NUMBING_ROAR, true);
else
DoCast(me->getVictim(), SPELL_NUMBING_SHOUT, true);
uiNumblingShoutTimer = 10*IN_MILISECONDS;
} else uiNumblingShoutTimer -=uiDiff;
if (uiDeterminedStabTimer <= uiDiff)
{
if (bPhase)
DoCast(me->getVictim(), SPELL_DETERMINED_GORE);
else
DoCast(me->getVictim(), SPELL_DETERMINED_STAB, true);
uiDeterminedStabTimer = 8*IN_MILISECONDS;
} else uiDeterminedStabTimer -=uiDiff;
if (!bPhase && uiTransformationTImer <= uiDiff)
{
DoScriptText(EMOTE_TRANSFORM, me);
DoScriptText(SAY_TRANSFORM, me);
DoCast(me, SPELL_TRANSFORMATION, false);
uiTransformationTImer = 10*IN_MILISECONDS;
} else uiTransformationTImer -= uiDiff;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*pKiller*/)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
{
pInstance->SetData(DATA_MOORABI_EVENT, DONE);
if (IsHeroic() && !bPhase)
pInstance->DoCompleteAchievement(ACHIEV_LESS_RABI);
}
}
void KilledUnit(Unit* pVictim)
{
if (pVictim == me)
return;
DoScriptText(RAND(SAY_SLAY_2,SAY_SLAY_3), me);
}
};
CreatureAI* GetAI_boss_moorabi(Creature *pCreature)
{
return new boss_moorabiAI(pCreature);
}
void AddSC_boss_moorabi()
{
Script* newscript;
newscript = new Script;
newscript->Name = "boss_moorabi";
newscript->GetAI = &GetAI_boss_moorabi;
newscript->RegisterSelf();
}
@@ -0,0 +1,266 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "gundrak.h"
//Spells
enum Spells
{
SPELL_POISON_NOVA = 55081,
H_SPELL_POISON_NOVA = 59842,
SPELL_POWERFULL_BITE = 48287,
H_SPELL_POWERFULL_BITE = 59840,
SPELL_VENOM_BOLT = 54970,
H_SPELL_VENOM_BOLT = 59839
};
//Yell
enum Yells
{
SAY_AGGRO = -1604017,
SAY_SLAY_1 = -1604018,
SAY_SLAY_2 = -1604019,
SAY_SLAY_3 = -1604020,
SAY_DEATH = -1604021,
SAY_SUMMON_SNAKES = -1604022,
SAY_SUMMON_CONSTRICTORS = -1604023
};
//Creatures
enum Creatures
{
CREATURE_SNAKE = 29680,
CREATURE_CONSTRICTORS = 29713
};
//Creatures' spells
enum ConstrictorSpells
{
SPELL_GRIP_OF_SLAD_RAN = 55093,
SPELL_VENOMOUS_BITE = 54987,
H_SPELL_VENOMOUS_BITE = 58996
};
static Position SpawnLoc[]=
{
{1783.81, 646.637, 133.948, 3.71755},
{1775.03, 606.586, 134.165, 1.43117},
{1717.39, 630.041, 129.282, 5.96903},
{1765.66, 646.542, 134.02, 5.11381},
{1716.76, 635.159, 129.282, 0.191986}
};
struct boss_slad_ranAI : public ScriptedAI
{
boss_slad_ranAI(Creature *c) : ScriptedAI(c), lSummons(me)
{
pInstance = c->GetInstanceData();
}
uint32 uiPoisonNovaTimer;
uint32 uiPowerfullBiteTimer;
uint32 uiVenomBoltTimer;
uint32 uiSpawnTimer;
uint8 uiPhase;
SummonList lSummons;
ScriptedInstance* pInstance;
void Reset()
{
uiPoisonNovaTimer = 10*IN_MILISECONDS;
uiPowerfullBiteTimer = 3*IN_MILISECONDS;
uiVenomBoltTimer = 15*IN_MILISECONDS;
uiSpawnTimer = 5*IN_MILISECONDS;
uiPhase = 0;
lSummons.DespawnAll();
if (pInstance)
pInstance->SetData(DATA_SLAD_RAN_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
pInstance->SetData(DATA_SLAD_RAN_EVENT, IN_PROGRESS);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (uiPoisonNovaTimer <= diff)
{
DoCast(me->getVictim(), SPELL_POISON_NOVA);
uiPoisonNovaTimer = 15*IN_MILISECONDS;
} else uiPoisonNovaTimer -= diff;
if (uiPowerfullBiteTimer <= diff)
{
DoCast(me->getVictim(), SPELL_POWERFULL_BITE);
uiPowerfullBiteTimer = 10*IN_MILISECONDS;
} else uiPowerfullBiteTimer -= diff;
if (uiVenomBoltTimer <= diff)
{
DoCast(me->getVictim(), SPELL_VENOM_BOLT);
uiVenomBoltTimer = 10*IN_MILISECONDS;
} else uiVenomBoltTimer -= diff;
if (uiPhase)
{
if (uiSpawnTimer <= diff)
{
if (uiPhase == 1)
for (uint8 i = 0; i < DUNGEON_MODE(3, 5); ++i)
me->SummonCreature(CREATURE_SNAKE, SpawnLoc[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN,20*IN_MILISECONDS);
if (uiPhase == 2)
for (uint8 i = 0; i < DUNGEON_MODE(3, 5); ++i)
me->SummonCreature(CREATURE_CONSTRICTORS, SpawnLoc[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN,20*IN_MILISECONDS);
uiSpawnTimer = 5*IN_MILISECONDS;
} else uiSpawnTimer -= diff;
}
if (uiPhase == 0 && HealthBelowPct(30))
{
DoScriptText(SAY_SUMMON_SNAKES,me);
uiPhase = 1;
}
if (uiPhase == 1 && HealthBelowPct(25))
{
DoScriptText(SAY_SUMMON_CONSTRICTORS,me);
uiPhase = 2;
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
pInstance->SetData(DATA_SLAD_RAN_EVENT, DONE);
}
void KilledUnit(Unit * /*victim*/)
{
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), me);
}
void JustSummoned(Creature* summoned)
{
summoned->GetMotionMaster()->MovePoint(0,me->GetPositionX(),me->GetPositionY(),me->GetPositionZ());
lSummons.Summon(summoned);
}
};
struct mob_slad_ran_constrictorAI : public ScriptedAI
{
mob_slad_ran_constrictorAI(Creature *c) : ScriptedAI(c) {}
uint32 uiGripOfSladRanTimer;
void Reset()
{
uiGripOfSladRanTimer = 1*IN_MILISECONDS;
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (uiGripOfSladRanTimer <= diff)
{
DoCast(me->getVictim(), SPELL_GRIP_OF_SLAD_RAN);
uiGripOfSladRanTimer = 5*IN_MILISECONDS;
} else uiGripOfSladRanTimer -= diff;
}
ScriptedInstance* pInstance;
};
struct mob_slad_ran_viperAI : public ScriptedAI
{
mob_slad_ran_viperAI(Creature *c) : ScriptedAI(c) {}
uint32 uiVenomousBiteTimer;
ScriptedInstance* pInstance;
void Reset()
{
uiVenomousBiteTimer = 2*IN_MILISECONDS;
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (uiVenomousBiteTimer <= diff)
{
DoCast(me->getVictim(), SPELL_VENOMOUS_BITE);
uiVenomousBiteTimer = 10*IN_MILISECONDS;
} else uiVenomousBiteTimer -= diff;
}
};
CreatureAI* GetAI_boss_slad_ran(Creature* pCreature)
{
return new boss_slad_ranAI (pCreature);
}
CreatureAI* GetAI_mob_slad_ran_constrictor(Creature* pCreature)
{
return new mob_slad_ran_constrictorAI (pCreature);
}
CreatureAI* GetAI_mob_slad_ran_viper(Creature* pCreature)
{
return new mob_slad_ran_viperAI (pCreature);
}
void AddSC_boss_slad_ran()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_slad_ran";
newscript->GetAI = &GetAI_boss_slad_ran;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_slad_ran_constrictor";
newscript->GetAI = &GetAI_mob_slad_ran_constrictor;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_slad_ran_viper";
newscript->GetAI = &GetAI_mob_slad_ran_viper;
newscript->RegisterSelf();
}
@@ -0,0 +1,54 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef DEF_GUNDRAK_H
#define DEF_GUNDRAK_H
enum Data
{
DATA_SLAD_RAN_EVENT,
DATA_MOORABI_EVENT,
DATA_DRAKKARI_COLOSSUS_EVENT,
DATA_GAL_DARAH_EVENT,
DATA_ECK_THE_FEROCIOUS_EVENT,
DATA_ALIVE_RUIN_DWELLERS
};
enum Data64
{
DATA_SLAD_RAN_ALTAR,
DATA_MOORABI_ALTAR,
DATA_DRAKKARI_COLOSSUS_ALTAR,
DATA_SLAD_RAN_STATUE,
DATA_MOORABI_STATUE,
DATA_DRAKKARI_COLOSSUS_STATUE,
DATA_DRAKKARI_COLOSSUS,
DATA_RUIN_DWELLER_DIED
};
enum mainCreatures
{
CREATURE_RUIN_DWELLER = 29920,
CREATURE_SLAD_RAN = 29304,
CREATURE_MOORABI = 29305,
CREATURE_GALDARAH = 29306,
CREATURE_DRAKKARICOLOSSUS = 29307,
CREATURE_ECK = 29932
};
#endif
@@ -0,0 +1,536 @@
/*
* Copyright (C) 2009 - 2010 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "gundrak.h"
#define MAX_ENCOUNTER 5
/* GunDrak encounters:
0 - Slad'Ran
1 - Moorabi
2 - Drakkari Colossus
3 - Gal'Darah
4 - Eck the Ferocious
*/
struct instance_gundrak : public ScriptedInstance
{
instance_gundrak(Map* pMap) : ScriptedInstance(pMap)
{
bHeroicMode = pMap->IsHeroic();
Initialize();
};
bool bHeroicMode;
bool spawnSupport;
uint32 timer;
uint32 phase;
uint64 toActivate;
uint64 uiSladRan;
uint64 uiMoorabi;
uint64 uiDrakkariColossus;
uint64 uiGalDarah;
uint64 uiEckTheFerocious;
uint64 uiSladRanAltar;
uint64 uiMoorabiAltar;
uint64 uiDrakkariColossusAltar;
uint64 uiSladRanStatue;
uint64 uiMoorabiStatue;
uint64 uiDrakkariColossusStatue;
uint64 uiGalDarahStatue;
uint64 uiEckTheFerociousDoor;
uint64 uiEckTheFerociousDoorBehind;
uint64 uiGalDarahDoor1;
uint64 uiGalDarahDoor2;
uint64 uiBridge;
uint64 uiCollision;
uint32 m_auiEncounter[MAX_ENCOUNTER];
GOState uiSladRanStatueState;
GOState uiMoorabiStatueState;
GOState uiDrakkariColossusStatueState;
GOState uiGalDarahStatueState;
GOState uiBridgeState;
GOState uiCollisionState;
std::set<uint64> DwellerGUIDs;
std::string str_data;
void Initialize()
{
spawnSupport = false;
timer = 0;
phase = 0;
toActivate = 0;
uiSladRan = 0;
uiMoorabi = 0;
uiDrakkariColossus = 0;
uiGalDarah = 0;
uiEckTheFerocious = 0;
uiSladRanAltar = 0;
uiMoorabiAltar = 0;
uiDrakkariColossusAltar = 0;
uiSladRanStatue = 0;
uiMoorabiStatue = 0;
uiDrakkariColossusStatue = 0;
uiGalDarahStatue = 0;
uiEckTheFerociousDoor = 0;
uiEckTheFerociousDoorBehind = 0;
uiGalDarahDoor1 = 0;
uiGalDarahDoor2 = 0;
uiBridge = 0;
uiCollision = 0;
uiSladRanStatueState = GO_STATE_ACTIVE;
uiMoorabiStatueState = GO_STATE_ACTIVE;
uiDrakkariColossusStatueState = GO_STATE_ACTIVE;
uiGalDarahStatueState = GO_STATE_READY;
uiBridgeState = GO_STATE_ACTIVE;
uiCollisionState = GO_STATE_READY;
DwellerGUIDs.clear();
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) return true;
return false;
}
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
{
switch(pCreature->GetEntry())
{
case CREATURE_SLAD_RAN: uiSladRan = pCreature->GetGUID(); break;
case CREATURE_MOORABI: uiMoorabi = pCreature->GetGUID(); break;
case CREATURE_GALDARAH: uiGalDarah = pCreature->GetGUID(); break;
case CREATURE_DRAKKARICOLOSSUS: uiDrakkariColossus = pCreature->GetGUID(); break;
case CREATURE_ECK: uiEckTheFerocious = pCreature->GetGUID(); break;
case CREATURE_RUIN_DWELLER:
if (pCreature->isAlive())
DwellerGUIDs.insert(pCreature->GetGUID());
break;
}
}
void OnGameObjectCreate(GameObject* pGo, bool /*add*/)
{
switch(pGo->GetEntry())
{
case 192518:
uiSladRanAltar = pGo->GetGUID();
// Make sure that they start out as unusuable
pGo->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1);
if (m_auiEncounter[0] == DONE)
{
if (uiSladRanStatueState == GO_STATE_ACTIVE)
pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1);
else
{
++phase;
pGo->SetGoState(GO_STATE_ACTIVE);
}
}
break;
case 192519:
uiMoorabiAltar = pGo->GetGUID();
// Make sure that they start out as unusuable
pGo->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1);
if (m_auiEncounter[0] == DONE)
{
if (uiMoorabiStatueState == GO_STATE_ACTIVE)
pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1);
else
{
++phase;
pGo->SetGoState(GO_STATE_ACTIVE);
}
}
break;
case 192520:
uiDrakkariColossusAltar = pGo->GetGUID();
// Make sure that they start out as unusuable
pGo->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1);
if (m_auiEncounter[0] == DONE)
{
if (uiDrakkariColossusStatueState == GO_STATE_ACTIVE)
pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1);
else
{
++phase;
pGo->SetGoState(GO_STATE_ACTIVE);
}
}
break;
case 192564:
uiSladRanStatue = pGo->GetGUID();
pGo->SetGoState(uiSladRanStatueState);
break;
case 192565:
uiMoorabiStatue = pGo->GetGUID();
pGo->SetGoState(uiMoorabiStatueState);
break;
case 192566:
uiGalDarahStatue = pGo->GetGUID();
pGo->SetGoState(uiGalDarahStatueState);
break;
case 192567:
uiDrakkariColossusStatue = pGo->GetGUID();
pGo->SetGoState(uiDrakkariColossusStatueState);
break;
case 192632:
uiEckTheFerociousDoor = pGo->GetGUID();
if (bHeroicMode && m_auiEncounter[1] == DONE)
HandleGameObject(NULL,true,pGo);
break;
case 192569:
uiEckTheFerociousDoorBehind = pGo->GetGUID();
if (bHeroicMode && m_auiEncounter[4] == DONE)
HandleGameObject(NULL,true,pGo);
case 193208:
uiGalDarahDoor1 = pGo->GetGUID();
if (m_auiEncounter[3] == DONE)
HandleGameObject(NULL,true,pGo);
break;
case 193209:
uiGalDarahDoor2 = pGo->GetGUID();
if (m_auiEncounter[3] == DONE)
HandleGameObject(NULL,true,pGo);
break;
case 193188:
uiBridge = pGo->GetGUID();
pGo->SetGoState(uiBridgeState);
break;
case 192633:
uiCollision = pGo->GetGUID();
pGo->SetGoState(uiCollisionState);
// Can't spawn here with SpawnGameObject because pGo isn't added to world yet...
if (uiCollisionState == GO_STATE_ACTIVE_ALTERNATIVE)
spawnSupport = true;
break;
}
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
case DATA_SLAD_RAN_EVENT:
m_auiEncounter[0] = data;
if (data == DONE)
{
GameObject* pGo = instance->GetGameObject(uiSladRanAltar);
if (pGo)
pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1);
}
break;
case DATA_MOORABI_EVENT:
m_auiEncounter[1] = data;
if (data == DONE)
{
GameObject* pGo = instance->GetGameObject(uiMoorabiAltar);
if (pGo)
pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1);
if (bHeroicMode)
HandleGameObject(uiEckTheFerociousDoor,true);
}
break;
case DATA_DRAKKARI_COLOSSUS_EVENT:
m_auiEncounter[2] = data;
if (data == DONE)
{
GameObject* pGo = instance->GetGameObject(uiDrakkariColossusAltar);
if (pGo)
pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1);
}
break;
case DATA_GAL_DARAH_EVENT:
m_auiEncounter[3] = data;
if (data == DONE)
{
HandleGameObject(uiGalDarahDoor1,true);
HandleGameObject(uiGalDarahDoor2,true);
}
break;
case DATA_ECK_THE_FEROCIOUS_EVENT:
m_auiEncounter[4] = data;
if (bHeroicMode && data == DONE)
HandleGameObject(uiEckTheFerociousDoorBehind,true);
break;
}
if (data == DONE)
SaveToDB();
}
void SetData64(uint32 type, uint64 data)
{
if (type == DATA_RUIN_DWELLER_DIED)
DwellerGUIDs.erase(data);
}
uint32 GetData(uint32 type)
{
switch(type)
{
case DATA_SLAD_RAN_EVENT: return m_auiEncounter[0];
case DATA_MOORABI_EVENT: return m_auiEncounter[1];
case DATA_GAL_DARAH_EVENT: return m_auiEncounter[2];
case DATA_DRAKKARI_COLOSSUS_EVENT: return m_auiEncounter[3];
case DATA_ECK_THE_FEROCIOUS_EVENT: return m_auiEncounter[4];
case DATA_ALIVE_RUIN_DWELLERS: return DwellerGUIDs.size();
}
return 0;
}
uint64 GetData64(uint32 type)
{
switch(type)
{
case DATA_SLAD_RAN_ALTAR: return uiSladRanAltar;
case DATA_MOORABI_ALTAR: return uiMoorabiAltar;
case DATA_DRAKKARI_COLOSSUS_ALTAR: return uiDrakkariColossusAltar;
case DATA_SLAD_RAN_STATUE: return uiSladRanStatue;
case DATA_MOORABI_STATUE: return uiMoorabiStatue;
case DATA_DRAKKARI_COLOSSUS_STATUE: return uiDrakkariColossusStatue;
case DATA_DRAKKARI_COLOSSUS: return uiDrakkariColossus;
}
return 0;
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "G D " << m_auiEncounter[0] << " " << m_auiEncounter[1] << " "
<< m_auiEncounter[2] << " " << m_auiEncounter[3] << " " << m_auiEncounter[4] << " "
<< (uiSladRanStatue ? GetObjState(uiSladRanStatue) : GO_STATE_ACTIVE) << " " << (uiMoorabiStatue ? GetObjState(uiMoorabiStatue) : GO_STATE_ACTIVE) << " "
<< (uiDrakkariColossusStatue ? GetObjState(uiDrakkariColossusStatue) : GO_STATE_ACTIVE) << " " << (uiGalDarahStatue ? GetObjState(uiGalDarahStatue) : GO_STATE_READY) << " "
<< (uiBridge ? GetObjState(uiBridge) : GO_STATE_ACTIVE) << " " << (uiCollision ? GetObjState(uiCollision) : GO_STATE_READY);
str_data = saveStream.str();
OUT_SAVE_INST_DATA_COMPLETE;
return str_data;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
uint16 data0, data1, data2, data3, data4, data5, data6, data7, data8, data9, data10;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3
>> data4 >> data5 >> data6 >> data7 >> data8 >> data9 >> data10;
if (dataHead1 == 'G' && dataHead2 == 'D')
{
m_auiEncounter[0] = data0;
m_auiEncounter[1] = data1;
m_auiEncounter[2] = data2;
m_auiEncounter[3] = data3;
m_auiEncounter[4] = data4;
uiSladRanStatueState = GOState(data5);
uiMoorabiStatueState = GOState(data6);
uiDrakkariColossusStatueState = GOState(data7);
uiGalDarahStatueState = GOState(data8);
uiBridgeState = GOState(data9);
uiCollisionState = GOState(data10);
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
m_auiEncounter[i] = NOT_STARTED;
} else OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
bool QueueActivation(uint64 guid, uint32 time)
{
if (timer)
return false;
toActivate = guid;
timer = time;
phase++;
return true;
}
void Update(uint32 diff)
{
// Spawn the support for the bridge if necessary
if (spawnSupport)
{
if (GameObject* pCollision = instance->GetGameObject(uiCollision))
pCollision->SummonGameObject(192743, pCollision->GetPositionX(), pCollision->GetPositionY(), pCollision->GetPositionZ(), pCollision->GetOrientation(), 0, 0, 0, 0, 0);
spawnSupport = false;
}
// If there is nothing to activate, then return
if (!toActivate)
return;
if (timer < diff)
{
timer = 0;
if (toActivate == uiBridge)
{
toActivate = 0;
GameObject* pBridge = instance->GetGameObject(uiBridge);
GameObject* pCollision = instance->GetGameObject(uiCollision);
GameObject* pSladRanStatue = instance->GetGameObject(uiSladRanStatue);
GameObject* pMoorabiStatue = instance->GetGameObject(uiMoorabiStatue);
GameObject* pDrakkariColossusStatue = instance->GetGameObject(uiDrakkariColossusStatue);
GameObject* pGalDarahStatue = instance->GetGameObject(uiGalDarahStatue);
if (pBridge && pCollision && pSladRanStatue && pMoorabiStatue && pDrakkariColossusStatue && pGalDarahStatue)
{
pBridge->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
pCollision->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
pSladRanStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
pMoorabiStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
pDrakkariColossusStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
pGalDarahStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
// Add the GO that solidifies the bridge so you can walk on it
spawnSupport = true;
SaveToDB();
}
}
else
{
uint32 spell = 0;
GameObject* pAltar = NULL;
if (toActivate == uiSladRanStatue)
{
spell = 57071;
pAltar = instance->GetGameObject(uiSladRanAltar);
} else if (toActivate == uiMoorabiStatue)
{
spell = 57068;
pAltar = instance->GetGameObject(uiMoorabiAltar);
} else if (toActivate == uiDrakkariColossusStatue)
{
spell = 57072;
pAltar = instance->GetGameObject(uiDrakkariColossusAltar);
}
// This is a workaround to make the beam cast properly. The caster should be ID 30298 but since the spells
// all are with scripted target for that same ID, it will hit itself.
if (pAltar)
if (Creature* trigger = pAltar->SummonCreature(18721, pAltar->GetPositionX(), pAltar->GetPositionY(), pAltar->GetPositionZ() + 3, pAltar->GetOrientation(), TEMPSUMMON_CORPSE_DESPAWN, 5000))
{
// Set the trigger model to invisible
trigger->SetDisplayId(11686);
trigger->CastSpell(trigger, spell, false);
}
if (GameObject* statueGO = instance->GetGameObject(toActivate))
statueGO->SetGoState(GO_STATE_READY);
toActivate = 0;
if (phase == 3)
QueueActivation(uiBridge, 3000);
else
SaveToDB(); // Don't save in between last statue and bridge turning in case of crash leading to stuck instance
}
} else timer -= diff;
}
GOState GetObjState(uint64 guid)
{
if (GameObject* go = instance->GetGameObject(guid))
return go->GetGoState();
return GO_STATE_ACTIVE;
}
};
bool GOHello_altar(Player * /*pPlayer*/, GameObject *pGO)
{
ScriptedInstance *pInstance = pGO->GetInstanceData();
uint64 uiStatue = 0;
pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
pGO->SetGoState(GO_STATE_ACTIVE);
if (pInstance)
{
switch(pGO->GetEntry())
{
case 192518: uiStatue = pInstance->GetData64(DATA_SLAD_RAN_STATUE); break;
case 192519: uiStatue = pInstance->GetData64(DATA_MOORABI_STATUE); break;
case 192520: uiStatue = pInstance->GetData64(DATA_DRAKKARI_COLOSSUS_STATUE); break;
}
if (((instance_gundrak*)pInstance)->QueueActivation(uiStatue, 3500))
{
pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
pGO->SetGoState(GO_STATE_ACTIVE);
}
return true;
}
return false;
}
InstanceData* GetInstanceData_instance_gundrak(Map* pMap)
{
return new instance_gundrak(pMap);
}
void AddSC_instance_gundrak()
{
Script *newscript;
newscript = new Script;
newscript->Name = "instance_gundrak";
newscript->GetInstanceData = &GetInstanceData_instance_gundrak;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "go_gundrak_altar";
newscript->pGOHello = &GOHello_altar;
newscript->RegisterSelf();
}
@@ -0,0 +1,338 @@
/* 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
*/
/* ScriptData
SDName: Sholazar_Basin
SD%Complete: 100
SDComment: Quest support: 11253, 11241.
SDCategory: howling_fjord
EndScriptData */
/* ContentData
npc_plaguehound_tracker
npc_apothecary_hanes
EndContentData */
#include "ScriptedPch.h"
#include "ScriptedEscortAI.h"
/*######
## npc_apothecary_hanes
######*/
enum Entries
{
NPC_APOTHECARY_HANES = 23784,
FACTION_ESCORTEE_A = 774,
FACTION_ESCORTEE_H = 775,
NPC_HANES_FIRE_TRIGGER = 23968,
QUEST_TRAIL_OF_FIRE = 11241,
SPELL_COSMETIC_LOW_POLY_FIRE = 56274
};
bool QuestAccept_npc_apothecary_hanes(Player* pPlayer, Creature* pCreature, Quest const* quest)
{
if (quest->GetQuestId() == QUEST_TRAIL_OF_FIRE)
{
switch (pPlayer->GetTeam())
{
case ALLIANCE:
pCreature->setFaction(FACTION_ESCORTEE_A);
break;
case HORDE:
pCreature->setFaction(FACTION_ESCORTEE_H);
break;
}
CAST_AI(npc_escortAI, (pCreature->AI()))->Start(true, false, pPlayer->GetGUID());
}
return true;
}
struct npc_Apothecary_HanesAI : public npc_escortAI
{
npc_Apothecary_HanesAI(Creature* pCreature) : npc_escortAI(pCreature){}
uint32 PotTimer;
void Reset ()
{
SetDespawnAtFar(false);
PotTimer = 10000; //10 sec cooldown on potion
}
void JustDied(Unit* /*killer*/)
{
if (Player* pPlayer = GetPlayerForEscort())
pPlayer->FailQuest(QUEST_TRAIL_OF_FIRE);
}
void UpdateEscortAI(const uint32 diff)
{
if (HealthBelowPct(75))
{
if (PotTimer <= diff)
{
DoCast(me, 17534, true);
PotTimer = 10000;
} else PotTimer -= diff;
}
if (GetAttack() && UpdateVictim())
DoMeleeAttackIfReady();
}
void WaypointReached(uint32 i)
{
Player* pPlayer = GetPlayerForEscort();
if (!pPlayer)
return;
switch(i)
{
case 1:
me->SetReactState(REACT_AGGRESSIVE);
SetRun(true);
break;
case 23:
if (pPlayer)
pPlayer->GroupEventHappens(QUEST_TRAIL_OF_FIRE, me);
me->ForcedDespawn();
break;
case 5:
if (Unit* Trigger = me->FindNearestCreature(NPC_HANES_FIRE_TRIGGER,10.0f))
Trigger->CastSpell(Trigger, SPELL_COSMETIC_LOW_POLY_FIRE, false);
SetRun(false);
break;
case 6:
if (Unit* Trigger = me->FindNearestCreature(NPC_HANES_FIRE_TRIGGER,10.0f))
Trigger->CastSpell(Trigger, SPELL_COSMETIC_LOW_POLY_FIRE, false);
SetRun(true);
break;
case 8:
if (Unit* Trigger = me->FindNearestCreature(NPC_HANES_FIRE_TRIGGER,10.0f))
Trigger->CastSpell(Trigger, SPELL_COSMETIC_LOW_POLY_FIRE, false);
SetRun(false);
break;
case 9:
if (Unit* Trigger = me->FindNearestCreature(NPC_HANES_FIRE_TRIGGER,10.0f))
Trigger->CastSpell(Trigger, SPELL_COSMETIC_LOW_POLY_FIRE, false);
break;
case 10:
SetRun(true);
break;
case 13:
SetRun(false);
break;
case 14:
if (Unit* Trigger = me->FindNearestCreature(NPC_HANES_FIRE_TRIGGER,10.0f))
Trigger->CastSpell(Trigger, SPELL_COSMETIC_LOW_POLY_FIRE, false);
SetRun(true);
break;
}
}
};
CreatureAI* GetAI_npc_apothecary_hanes(Creature* pCreature)
{
return new npc_Apothecary_HanesAI(pCreature);
}
/*######
## npc_plaguehound_tracker
######*/
enum ePlaguehound
{
QUEST_SNIFF_OUT_ENEMY = 11253
};
struct npc_plaguehound_trackerAI : public npc_escortAI
{
npc_plaguehound_trackerAI(Creature* pCreature) : npc_escortAI(pCreature) { }
void Reset()
{
InitScriptData();
}
void InitScriptData()
{
Player* pPlayer = NULL;
if (me->isSummon())
if (Unit* summoner = CAST_SUM(me)->GetSummoner())
if (summoner->GetTypeId() == TYPEID_PLAYER)
pPlayer = CAST_PLR(summoner);
if (!pPlayer)
return;
me->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE);
Start(false, false, pPlayer->GetGUID());
}
void WaypointReached(uint32 i)
{
Player* pPlayer = NULL;
if (me->isSummon())
if (Unit* summoner = CAST_SUM(me)->GetSummoner())
if (summoner->GetTypeId() == TYPEID_PLAYER)
pPlayer = CAST_PLR(summoner);
if (!pPlayer)
return;
switch(i)
{
case 26:
me->ForcedDespawn();
break;
}
}
};
CreatureAI* GetAI_npc_plaguehound_tracker(Creature* pCreature)
{
return new npc_plaguehound_trackerAI(pCreature);
}
/*######
## npc_razael_and_lyana
######*/
#define GOSSIP_RAZAEL_REPORT "High Executor Anselm wants a report on the situation."
#define GOSSIP_LYANA_REPORT "High Executor Anselm requests your report."
enum eRazael
{
QUEST_REPORTS_FROM_THE_FIELD = 11221,
NPC_RAZAEL = 23998,
NPC_LYANA = 23778,
GOSSIP_TEXTID_RAZAEL1 = 11562,
GOSSIP_TEXTID_RAZAEL2 = 11564,
GOSSIP_TEXTID_LYANA1 = 11586,
GOSSIP_TEXTID_LYANA2 = 11588
};
bool GossipHello_npc_razael_and_lyana(Player* pPlayer, Creature* pCreature)
{
if (pCreature->isQuestGiver())
pPlayer->PrepareQuestMenu(pCreature->GetGUID());
if (pPlayer->GetQuestStatus(QUEST_REPORTS_FROM_THE_FIELD) == QUEST_STATUS_INCOMPLETE)
switch (pCreature->GetEntry())
{
case NPC_RAZAEL:
if (!pPlayer->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_RAZAEL))
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_RAZAEL_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_RAZAEL1, pCreature->GetGUID());
return true;
}
break;
case NPC_LYANA:
if (!pPlayer->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_LYANA))
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LYANA_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_LYANA1, pCreature->GetGUID());
return true;
}
break;
}
pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_razael_and_lyana(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
switch (uiAction)
{
case GOSSIP_ACTION_INFO_DEF + 1:
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_RAZAEL2, pCreature->GetGUID());
pPlayer->TalkedToCreature(NPC_RAZAEL, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF + 2:
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_LYANA2, pCreature->GetGUID());
pPlayer->TalkedToCreature(NPC_LYANA, pCreature->GetGUID());
break;
}
return true;
}
/*######
## npc_mcgoyver
######*/
#define GOSSIP_ITEM_MG_I "Walt sent me to pick up some dark iron ingots."
#define GOSSIP_ITEM_MG_II "Yarp."
enum eMcGoyver
{
QUEST_WE_CAN_REBUILD_IT = 11483,
SPELL_CREATURE_DARK_IRON_INGOTS = 44512,
SPELL_TAXI_EXPLORERS_LEAGUE = 44280,
GOSSIP_TEXTID_MCGOYVER = 12193
};
bool GossipHello_npc_mcgoyver(Player* pPlayer, Creature* pCreature)
{
if (pPlayer->GetQuestStatus(QUEST_WE_CAN_REBUILD_IT) == QUEST_STATUS_INCOMPLETE)
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_MG_I, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_mcgoyver(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
switch(uiAction)
{
case GOSSIP_ACTION_INFO_DEF+1:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_MG_II, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_MCGOYVER, pCreature->GetGUID());
pPlayer->CastSpell(pPlayer, SPELL_CREATURE_DARK_IRON_INGOTS, true);
break;
case GOSSIP_ACTION_INFO_DEF+2:
pPlayer->CastSpell(pPlayer, SPELL_TAXI_EXPLORERS_LEAGUE, true);
pPlayer->CLOSE_GOSSIP_MENU();
break;
}
return true;
}
void AddSC_howling_fjord()
{
Script *newscript;
newscript = new Script;
newscript->Name = "npc_apothecary_hanes";
newscript->GetAI = &GetAI_npc_apothecary_hanes;
newscript->pQuestAccept = &QuestAccept_npc_apothecary_hanes;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_plaguehound_tracker";
newscript->GetAI = &GetAI_npc_plaguehound_tracker;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_razael_and_lyana";
newscript->pGossipHello = &GossipHello_npc_razael_and_lyana;
newscript->pGossipSelect = &GossipSelect_npc_razael_and_lyana;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_mcgoyver";
newscript->pGossipHello = &GossipHello_npc_mcgoyver;
newscript->pGossipSelect = &GossipSelect_npc_mcgoyver;
newscript->RegisterSelf();
}
+422
View File
@@ -0,0 +1,422 @@
/* 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: Icecrown
SD%Complete: 100
SDComment: Quest support: 12807
SDCategory: Icecrown
EndScriptData */
/* ContentData
npc_arete
EndContentData */
#include "ScriptedPch.h"
/*######
## npc_arete
######*/
#define GOSSIP_ARETE_ITEM1 "Lord-Commander, I would hear your tale."
#define GOSSIP_ARETE_ITEM2 "<You nod slightly but do not complete the motion as the Lord-Commander narrows his eyes before he continues.>"
#define GOSSIP_ARETE_ITEM3 "I thought that they now called themselves the Scarlet Onslaught?"
#define GOSSIP_ARETE_ITEM4 "Where did the grand admiral go?"
#define GOSSIP_ARETE_ITEM5 "That's fine. When do I start?"
#define GOSSIP_ARETE_ITEM6 "Let's finish this!"
#define GOSSIP_ARETE_ITEM7 "That's quite a tale, Lord-Commander."
enum eArete
{
GOSSIP_TEXTID_ARETE1 = 13525,
GOSSIP_TEXTID_ARETE2 = 13526,
GOSSIP_TEXTID_ARETE3 = 13527,
GOSSIP_TEXTID_ARETE4 = 13528,
GOSSIP_TEXTID_ARETE5 = 13529,
GOSSIP_TEXTID_ARETE6 = 13530,
GOSSIP_TEXTID_ARETE7 = 13531,
QUEST_THE_STORY_THUS_FAR = 12807
};
bool GossipHello_npc_arete(Player* pPlayer, Creature* pCreature)
{
if (pCreature->isQuestGiver())
pPlayer->PrepareQuestMenu(pCreature->GetGUID());
if (pPlayer->GetQuestStatus(QUEST_THE_STORY_THUS_FAR) == QUEST_STATUS_INCOMPLETE)
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE1, pCreature->GetGUID());
return true;
}
pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_arete(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
switch(uiAction)
{
case GOSSIP_ACTION_INFO_DEF+1:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE2, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+2:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE3, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+3:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE4, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+4:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE5, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+5:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE6, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+6:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE7, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+7:
pPlayer->CLOSE_GOSSIP_MENU();
pPlayer->AreaExploredOrEventHappens(QUEST_THE_STORY_THUS_FAR);
break;
}
return true;
}
/*######
## npc_dame_evniki_kapsalis
######*/
enum eDameEnvikiKapsalis
{
TITLE_CRUSADER = 123
};
bool GossipHello_npc_dame_evniki_kapsalis(Player* pPlayer, Creature* pCreature)
{
if (pPlayer->HasTitle(TITLE_CRUSADER))
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_dame_evniki_kapsalis(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
if (uiAction == GOSSIP_ACTION_TRADE)
pPlayer->SEND_VENDORLIST(pCreature->GetGUID());
return true;
}
/*######
## npc_squire_david
######*/
enum eSquireDavid
{
QUEST_THE_ASPIRANT_S_CHALLENGE_H = 13680,
QUEST_THE_ASPIRANT_S_CHALLENGE_A = 13679,
NPC_ARGENT_VALIANT = 33448,
GOSSIP_TEXTID_SQUIRE = 14407
};
#define GOSSIP_SQUIRE_ITEM_1 "I am ready to fight!"
#define GOSSIP_SQUIRE_ITEM_2 "How do the Argent Crusader raiders fight?"
bool GossipHello_npc_squire_david(Player* pPlayer, Creature* pCreature)
{
if (pPlayer->GetQuestStatus(QUEST_THE_ASPIRANT_S_CHALLENGE_H) == QUEST_STATUS_INCOMPLETE ||
pPlayer->GetQuestStatus(QUEST_THE_ASPIRANT_S_CHALLENGE_A) == QUEST_STATUS_INCOMPLETE)//We need more info about it.
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SQUIRE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SQUIRE_ITEM_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
}
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_SQUIRE, pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_squire_david(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
if (uiAction == GOSSIP_ACTION_INFO_DEF+1)
{
pPlayer->CLOSE_GOSSIP_MENU();
pCreature->SummonCreature(NPC_ARGENT_VALIANT,8575.451,952.472,547.554,0.38);
}
//else
//pPlayer->SEND_GOSSIP_MENU(???, pCreature->GetGUID()); Missing text
return true;
}
/*######
## npc_argent_valiant
######*/
enum eArgentValiant
{
SPELL_CHARGE = 63010,
SPELL_SHIELD_BREAKER = 65147,
NPC_ARGENT_VALIANT_CREDIT = 24108
};
struct npc_argent_valiantAI : public ScriptedAI
{
npc_argent_valiantAI(Creature* pCreature) : ScriptedAI(pCreature)
{
pCreature->GetMotionMaster()->MovePoint(0,8599.258,963.951,547.553);
pCreature->setFaction(35); //wrong faction in db?
}
uint32 uiChargeTimer;
uint32 uiShieldBreakerTimer;
void Reset()
{
uiChargeTimer = 7000;
uiShieldBreakerTimer = 10000;
}
void MovementInform(uint32 uiType, uint32 /*uiId*/)
{
if (uiType != POINT_MOTION_TYPE)
return;
me->setFaction(14);
}
void DamageTaken(Unit* pDoneBy, uint32& uiDamage)
{
if (uiDamage > me->GetHealth() && pDoneBy->GetTypeId() == TYPEID_PLAYER)
{
uiDamage = 0;
CAST_PLR(pDoneBy)->KilledMonsterCredit(NPC_ARGENT_VALIANT_CREDIT,0);
me->setFaction(35);
me->ForcedDespawn(5000);
me->SetHomePosition(me->GetPositionX(),me->GetPositionY(),me->GetPositionZ(),me->GetOrientation());
EnterEvadeMode();
}
}
void UpdateAI(const uint32 uiDiff)
{
if (!UpdateVictim())
return;
if (uiChargeTimer <= uiDiff)
{
DoCastVictim(SPELL_CHARGE);
uiChargeTimer = 7000;
} else uiChargeTimer -= uiDiff;
if (uiShieldBreakerTimer <= uiDiff)
{
DoCastVictim(SPELL_SHIELD_BREAKER);
uiShieldBreakerTimer = 10000;
} else uiShieldBreakerTimer -= uiDiff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_npc_argent_valiant(Creature* pCreature)
{
return new npc_argent_valiantAI (pCreature);
}
/*######
## npc_argent_tournament_post
######*/
enum eArgentTournamentPost
{
SPELL_ROPE_BEAM = 63413,
NPC_GORMOK_THE_IMPALER = 35469,
NPC_ICEHOWL = 35470
};
struct npc_argent_tournament_postAI : public ScriptedAI
{
npc_argent_tournament_postAI(Creature* pCreature) : ScriptedAI(pCreature) {}
void UpdateAI(const uint32 /*uiDiff*/)
{
if (me->IsNonMeleeSpellCasted(false))
return;
if (Creature* pTarget = me->FindNearestCreature(NPC_GORMOK_THE_IMPALER, 6.0f))
DoCast(pTarget, SPELL_ROPE_BEAM);
if (Creature* pTarget2 = me->FindNearestCreature(NPC_ICEHOWL, 6.0f))
DoCast(pTarget2, SPELL_ROPE_BEAM);
if (!UpdateVictim())
return;
}
};
CreatureAI* GetAI_npc_argent_tournament_post(Creature* pCreature)
{
return new npc_argent_tournament_postAI (pCreature);
}
/*######
## npc_alorah_and_grimmin
######*/
enum ealorah_and_grimmin
{
SPELL_CHAIN = 68341,
NPC_FJOLA_LIGHTBANE = 36065,
NPC_EYDIS_DARKBANE = 36066,
NPC_PRIESTESS_ALORAH = 36101,
NPC_PRIEST_GRIMMIN = 36102
};
struct npc_alorah_and_grimminAI : public ScriptedAI
{
npc_alorah_and_grimminAI(Creature* pCreature) : ScriptedAI(pCreature) {}
bool uiCast;
void Reset()
{
uiCast = false;
}
void UpdateAI(const uint32 /*uiDiff*/)
{
if (uiCast)
return;
uiCast = true;
Creature* pTarget = NULL;
switch(me->GetEntry())
{
case NPC_PRIESTESS_ALORAH:
pTarget = me->FindNearestCreature(NPC_EYDIS_DARKBANE, 10.0f);
break;
case NPC_PRIEST_GRIMMIN:
pTarget = me->FindNearestCreature(NPC_FJOLA_LIGHTBANE, 10.0f);
break;
}
if (pTarget)
DoCast(pTarget, SPELL_CHAIN);
if (!UpdateVictim())
return;
}
};
CreatureAI* GetAI_npc_alorah_and_grimmin(Creature* pCreature)
{
return new npc_alorah_and_grimminAI (pCreature);
}
/*######
## npc_guardian_pavilion
######*/
enum eGuardianPavilion
{
SPELL_TRESPASSER_H = 63987,
AREA_SUNREAVER_PAVILION = 4676,
AREA_SILVER_COVENANT_PAVILION = 4677,
SPELL_TRESPASSER_A = 63986,
};
struct npc_guardian_pavilionAI : public Scripted_NoMovementAI
{
npc_guardian_pavilionAI(Creature* pCreature) : Scripted_NoMovementAI(pCreature) {}
void MoveInLineOfSight(Unit* pWho)
{
if (me->GetAreaId() != AREA_SUNREAVER_PAVILION && me->GetAreaId() != AREA_SILVER_COVENANT_PAVILION)
return;
if (!pWho || pWho->GetTypeId() != TYPEID_PLAYER || !me->IsHostileTo(pWho) || !me->isInBackInMap(pWho, 5.0f))
return;
if (pWho->HasAura(SPELL_TRESPASSER_H) || pWho->HasAura(SPELL_TRESPASSER_A))
return;
if (pWho->ToPlayer()->GetTeamId() == TEAM_ALLIANCE)
pWho->CastSpell(pWho, SPELL_TRESPASSER_H, true);
else
pWho->CastSpell(pWho, SPELL_TRESPASSER_A, true);
}
};
CreatureAI* GetAI_npc_guardian_pavilion(Creature* pCreature)
{
return new npc_guardian_pavilionAI (pCreature);
}
void AddSC_icecrown()
{
Script *newscript;
newscript = new Script;
newscript->Name = "npc_arete";
newscript->pGossipHello = &GossipHello_npc_arete;
newscript->pGossipSelect = &GossipSelect_npc_arete;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_dame_evniki_kapsalis";
newscript->pGossipHello = &GossipHello_npc_dame_evniki_kapsalis;
newscript->pGossipSelect = &GossipSelect_npc_dame_evniki_kapsalis;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_squire_david";
newscript->pGossipHello = &GossipHello_npc_squire_david;
newscript->pGossipSelect = &GossipSelect_npc_squire_david;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_argent_valiant";
newscript->GetAI = &GetAI_npc_argent_valiant;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_argent_tournament_post";
newscript->GetAI = &GetAI_npc_argent_tournament_post;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_alorah_and_grimmin";
newscript->GetAI = &GetAI_npc_alorah_and_grimmin;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_guardian_pavilion";
newscript->GetAI = &GetAI_npc_guardian_pavilion;
newscript->RegisterSelf();
}
@@ -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
@@ -0,0 +1,175 @@
/* Script Data Start
SDName: Boss malygos
SDAuthor: LordVanMartin
SD%Complete:
SDComment:
SDCategory:
Script Data End */
/*** SQL START ***
update creature_template set scriptname = '' where entry = '';
*** SQL END ***/
#include "ScriptedPch.h"
//Spells
#define SPELL_ARCANE_BREATH_N 56272
#define SPELL_ARCANE_BREATH_H 60072
#define SPELL_ARCANE_PULSE 57432
#define SPELL_ARCANE_STORM_1 57459
#define SPELL_ARCANE_STORM_2 61693
#define SPELL_ARCANE_STORM_3 61694
#define SPELL_STATIC_FIELD 57430
#define SPELL_SURGE_OF_POWER_1 56505
#define SPELL_SURGE_OF_POWER_2 57407
#define SPELL_SURGE_OF_POWER_3 60936
#define SPELL_VORTEX 56105
//Dragon "mounts" spells in Phase3
//they use Rugelike energy
#define SPELL_DMOUNT_FLAME_SPIKE 56091 //maybe not accurate
#define SPELL_DMOUNT_ENGULF_IN_FLAMES 61621
#define SPELL_DMOUNT_REVIVIFY 57090
#define SPELL_DMOUNT_LIFE_BURST 57143
#define SPELL_DMOUNT_FLAME_SHIELD 57108
//#define SPELL_DMOUNT_UNKNOWN XYZ //Increases your drake's flight speed by 500%.
//not in db
//Yell
//-->Other
#define SAY_ANTI_MAGIC_SHELL -1616000
#define SAY_BREATH_ATTACK -1616001
#define SAY_HIGH_DAMAGE_MODE -1616002
#define SAY_MAGIC_BLAST -1616003
//--> Generic Spells
#define SAY_GENERIC_SPELL_1 -1616004
#define SAY_GENERIC_SPELL_2 -1616005
#define SAY_GENERIC_SPELL_3 -1616006
#define SAY_DEATH -1616007
//--> Prefight
#define SAY_PREFIGHT_1 -1616008
#define SAY_PREFIGHT_2 -1616009
#define SAY_PREFIGHT_3 -1616010
#define SAY_PREFIGHT_4 -1616011
#define SAY_PREFIGHT_5 -1616012
//--> Phase1
#define SAY_PHASE1_AGGRO -1616013
#define SAY_PHASE1_END -1616014
#define SAY_PHASE1_SLAY_1 -1616015
#define SAY_PHASE1_SLAY_2 -1616016
#define SAY_PHASE1_SLAY_3 -1616017
//--> Phase2 at 50% HP,
/*Malygos himself is not targetable during this phase, it will end when the adds he spawns are all killed. However, he does continue to play a part in the encounter.
During this phase he drops anti-magic zones onto the ground the raid MUST stand inside of, it reduces magical damage taken by 50%. They shrink over time, so it's important that your raid moves to each new one he drops.
Throughout the phase, he will deep breath doing ~4k damage per second, unless you are standing inside of the anti-magic zone.
The way the fight works during this phase is there are NPCs riding around on disks in the room. There are two types of mobs, Lords and Scions.
The Lords will move down onto the group, and need to be tanked (They will one-shot a non-tank). After they die, they drop a disk that a raid member can mount onto, which allows them to fly, to attack the Scions that do not come down to the ground.
It is recommended to let melee take the first disks, then ranged. As those mobs die, they also drop disks, which allows the rest of your dps to get onto them.
The Scions will continually cast Arcane Blast on random targets on the floor, which is mitigated by the anti-magic zones. While mounted on a disk, you will not take damage.
After all of the NPCs riding on the disks die, the players on the disks need to dismount as Phase 3 is about to begin.*/
//not in db
#define SAY_PHASE2_AGGRO -1616018
#define SAY_PHASE2_END -1616019
#define SAY_PHASE2_SLAY_1 -1616020
#define SAY_PHASE2_SLAY_2 -1616021
#define SAY_PHASE2_SLAY_3 -1616022
//--> Phase3 Malygos destroys the floor, encounter continues on dragon "mounts"
#define SAY_PHASE3_INTRO -1616023
#define SAY_PHASE3_AGGRO -1616024
#define SAY_PHASE3_SLAY_1 -1616025
#define SAY_PHASE3_SLAY_2 -1616026
#define SAY_PHASE3_SLAY_3 -1616027
#define SAY_PHASE3_BIG_ATTACK -1616028
enum
{
ACHIEV_TIMED_START_EVENT = 20387,
};
struct boss_malygosAI : public ScriptedAI
{
boss_malygosAI(Creature *c) : ScriptedAI(c)
{
instance = me->GetInstanceData();
}
InstanceData *instance;
uint32 phase;
uint32 enrage;
void Reset()
{
phase = 1;
enrage = 615000; //Source Deadly Boss Mod
if (instance)
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
void EnterCombat(Unit* /*who*/)
{
if (phase == 1)
{
DoScriptText(SAY_PHASE1_AGGRO, me);
if (instance)
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
if (phase == 2)
DoScriptText(SAY_PHASE1_AGGRO, me);
if (phase == 3)
DoScriptText(SAY_PHASE1_AGGRO, me);
}
void UpdateAI(const uint32 /*diff*/)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (phase == 1 && HealthBelowPct(50)) {
phase = 2;
//spawn adds
//set malygos unatackable untill all adds spawned dead
//start phase3
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
}
void KilledUnit(Unit * victim)
{
if (victim == me)
return;
if (phase == 1)
DoScriptText(RAND(SAY_PHASE1_SLAY_1,SAY_PHASE1_SLAY_2,SAY_PHASE1_SLAY_3), me);
if (phase == 2)
DoScriptText(RAND(SAY_PHASE2_SLAY_1,SAY_PHASE2_SLAY_2,SAY_PHASE2_SLAY_3), me);
if (phase == 3)
DoScriptText(RAND(SAY_PHASE3_SLAY_1,SAY_PHASE3_SLAY_2,SAY_PHASE3_SLAY_3), me);
}
};
CreatureAI* GetAI_boss_malygos(Creature* pCreature)
{
return new boss_malygosAI (pCreature);
}
void AddSC_boss_malygos()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_malygos";
newscript->GetAI = &GetAI_boss_malygos;
newscript->RegisterSelf();
}
@@ -0,0 +1,4 @@
#ifndef DEF_EYE_OF_ETERNITY_H
#define DEF_EYE_OF_ETERNITY_H
#endif
@@ -0,0 +1,21 @@
#include "ScriptedPch.h"
#include "eye_of_eternity.h"
struct instance_eye_of_eternity : public ScriptedInstance
{
instance_eye_of_eternity(Map* pMap) : ScriptedInstance(pMap) {Initialize();};
};
InstanceData* GetInstanceData_instance_eye_of_eternity(Map* pMap)
{
return new instance_eye_of_eternity(pMap);
}
void AddSC_instance_eye_of_eternity()
{
Script *newscript;
newscript = new Script;
newscript->Name = "instance_eye_of_eternity";
newscript->GetInstanceData = &GetInstanceData_instance_eye_of_eternity;
newscript->RegisterSelf();
}
@@ -0,0 +1,253 @@
/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* Copyright (C) 2008 - 2010 TrinityCore <http://www.trinitycore.org>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "nexus.h"
enum Spells
{
//Spells
SPELL_SPARK = 47751,
H_SPELL_SPARK = 57062,
SPELL_RIFT_SHIELD = 47748,
SPELL_CHARGE_RIFT = 47747, //Works wrong (affect players, not rifts)
SPELL_CREATE_RIFT = 47743, //Don't work, using WA
SPELL_ARCANE_ATTRACTION = 57063, //No idea, when it's used
};
enum Adds
{
MOB_CRAZED_MANA_WRAITH = 26746,
MOB_CHAOTIC_RIFT = 26918
};
enum Yells
{
//Yell
SAY_AGGRO = -1576010,
SAY_DEATH = -1576011,
SAY_RIFT = -1576012,
SAY_SHIELD = -1576013
};
enum Achievs
{
ACHIEV_CHAOS_THEORY = 2037
};
const Position RiftLocation[6] =
{
{652.64, -273.70, -8.75},
{634.45, -265.94, -8.44},
{620.73, -281.17, -9.02},
{626.10, -304.67, -9.44},
{639.87, -314.11, -9.49},
{651.72, -297.44, -9.37}
};
struct boss_anomalusAI : public ScriptedAI
{
boss_anomalusAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
uint8 Phase;
uint32 uiSparkTimer;
uint32 uiCreateRiftTimer;
uint64 uiChaoticRiftGUID;
bool bDeadChaoticRift; // needed for achievement: Chaos Theory(2037)
void Reset()
{
Phase = 0;
uiSparkTimer = 5*IN_MILISECONDS;
uiChaoticRiftGUID = 0;
bDeadChaoticRift = false;
if (pInstance)
pInstance->SetData(DATA_ANOMALUS_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
pInstance->SetData(DATA_ANOMALUS_EVENT, IN_PROGRESS);
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
{
if (IsHeroic() && !bDeadChaoticRift)
pInstance->DoCompleteAchievement(ACHIEV_CHAOS_THEORY);
pInstance->SetData(DATA_ANOMALUS_EVENT, DONE);
}
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (me->GetDistance(me->GetHomePosition()) > 60.0f)
{
//Not blizzlike, hack to avoid an exploit
EnterEvadeMode();
return;
}
if (me->HasAura(SPELL_RIFT_SHIELD))
{
if (uiChaoticRiftGUID)
{
Unit* Rift = Unit::GetUnit((*me), uiChaoticRiftGUID);
if (Rift && Rift->isDead())
{
me->RemoveAurasDueToSpell(SPELL_RIFT_SHIELD);
uiChaoticRiftGUID = 0;
}
return;
}
} else
uiChaoticRiftGUID = 0;
if ((Phase == 0) && HealthBelowPct(50))
{
Phase = 1;
DoScriptText(SAY_SHIELD, me);
DoCast(me, SPELL_RIFT_SHIELD);
Creature* Rift = me->SummonCreature(MOB_CHAOTIC_RIFT, RiftLocation[urand(0,5)], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1*IN_MILISECONDS);
if (Rift)
{
//DoCast(Rift, SPELL_CHARGE_RIFT);
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
Rift->AI()->AttackStart(pTarget);
uiChaoticRiftGUID = Rift->GetGUID();
DoScriptText(SAY_RIFT , me);
}
}
if (uiSparkTimer <= diff)
{
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_SPARK);
uiSparkTimer = 5*IN_MILISECONDS;
} else uiSparkTimer -= diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_anomalus(Creature* pCreature)
{
return new boss_anomalusAI (pCreature);
}
enum RiftSpells
{
SPELL_CHAOTIC_ENERGY_BURST = 47688,
SPELL_CHARGED_CHAOTIC_ENERGY_BURST = 47737,
SPELL_ARCANEFORM = 48019 //Chaotic Rift visual
};
struct mob_chaotic_riftAI : public Scripted_NoMovementAI
{
mob_chaotic_riftAI(Creature *c) : Scripted_NoMovementAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
uint32 uiChaoticEnergyBurstTimer;
uint32 uiSummonCrazedManaWraithTimer;
void Reset()
{
uiChaoticEnergyBurstTimer = 1*IN_MILISECONDS;
uiSummonCrazedManaWraithTimer = 5*IN_MILISECONDS;
//me->SetDisplayId(25206); //For some reason in DB models for ally and horde are different.
//Model for ally (1126) does not show auras. Horde model works perfect.
//Set model to horde number
DoCast(me, SPELL_ARCANEFORM, false);
}
void JustDied(Unit * /*killer*/)
{
if (Creature* pAnomalus = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_ANOMALUS) : 0))
CAST_AI(boss_anomalusAI,pAnomalus->AI())->bDeadChaoticRift = true;
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (uiChaoticEnergyBurstTimer <= diff)
{
Unit* pAnomalus = Unit::GetUnit(*me, pInstance ? pInstance->GetData64(DATA_ANOMALUS) : 0);
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
if (pAnomalus && pAnomalus->HasAura(SPELL_RIFT_SHIELD))
DoCast(pTarget, SPELL_CHARGED_CHAOTIC_ENERGY_BURST);
else
DoCast(pTarget, SPELL_CHAOTIC_ENERGY_BURST);
uiChaoticEnergyBurstTimer = 1*IN_MILISECONDS;
} else uiChaoticEnergyBurstTimer -= diff;
if (uiSummonCrazedManaWraithTimer <= diff)
{
Creature* Wraith = me->SummonCreature(MOB_CRAZED_MANA_WRAITH, me->GetPositionX()+1, me->GetPositionY()+1, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1*IN_MILISECONDS);
if (Wraith)
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
Wraith->AI()->AttackStart(pTarget);
Unit* Anomalus = Unit::GetUnit(*me, pInstance ? pInstance->GetData64(DATA_ANOMALUS) : 0);
if (Anomalus && Anomalus->HasAura(SPELL_RIFT_SHIELD))
uiSummonCrazedManaWraithTimer = 5*IN_MILISECONDS;
else
uiSummonCrazedManaWraithTimer = 10*IN_MILISECONDS;
} else uiSummonCrazedManaWraithTimer -= diff;
}
};
CreatureAI* GetAI_mob_chaotic_rift(Creature* pCreature)
{
return new mob_chaotic_riftAI (pCreature);
}
void AddSC_boss_anomalus()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_anomalus";
newscript->GetAI = &GetAI_boss_anomalus;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_chaotic_rift";
newscript->GetAI = &GetAI_mob_chaotic_rift;
newscript->RegisterSelf();
}
@@ -0,0 +1,247 @@
/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* Copyright (C) 2008 - 2010 TrinityCore <http://www.trinitycore.org>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "nexus.h"
enum Spells
{
//Spells
SPELL_FROZEN_PRISON = 47854,
SPELL_TAIL_SWEEP = 50155,
SPELL_CRYSTAL_CHAINS = 50997,
SPELL_ENRAGE = 8599,
SPELL_CRYSTALFIRE_BREATH = 48096,
H_SPELL_CRYSTALFIRE_BREATH = 57091,
SPELL_CRYSTALIZE = 48179,
SPELL_INTENSE_COLD = 48094,
SPELL_INTENSE_COLD_TRIGGERED = 48095
};
enum Yells
{
//Yell
SAY_AGGRO = -1576040,
SAY_SLAY = -1576041,
SAY_ENRAGE = -1576042,
SAY_DEATH = -1576043,
SAY_CRYSTAL_NOVA = -1576044
};
enum Achievements
{
ACHIEV_INTENSE_COLD = 2036
};
enum Misc
{
DATA_CONTAINMENT_SPHERES = 3
};
struct boss_keristraszaAI : public ScriptedAI
{
boss_keristraszaAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
uint32 uiCrystalfireBreathTimer;
uint32 uiCrystalChainsCrystalizeTimer;
uint32 uiTailSweepTimer;
bool bEnrage;
uint64 auiContainmentSphereGUIDs[DATA_CONTAINMENT_SPHERES];
uint32 uiCheckIntenseColdTimer;
bool bMoreThanTwoIntenseCold; // needed for achievement: Intense Cold(2036)
void Reset()
{
uiCrystalfireBreathTimer = 14*IN_MILISECONDS;
uiCrystalChainsCrystalizeTimer = DUNGEON_MODE(30*IN_MILISECONDS,11*IN_MILISECONDS);
uiTailSweepTimer = 5*IN_MILISECONDS;
bEnrage = false;
uiCheckIntenseColdTimer = 2*IN_MILISECONDS;
bMoreThanTwoIntenseCold = false;
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
RemovePrison(CheckContainmentSpheres());
if (pInstance)
pInstance->SetData(DATA_KERISTRASZA_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
DoCastAOE(SPELL_INTENSE_COLD);
if (pInstance)
pInstance->SetData(DATA_KERISTRASZA_EVENT, IN_PROGRESS);
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
{
if (IsHeroic() && !bMoreThanTwoIntenseCold)
pInstance->DoCompleteAchievement(ACHIEV_INTENSE_COLD);
pInstance->SetData(DATA_KERISTRASZA_EVENT, DONE);
}
}
void KilledUnit(Unit * /*victim*/)
{
DoScriptText(SAY_SLAY, me);
}
bool CheckContainmentSpheres(bool remove_prison = false)
{
if (!pInstance)
return false;
auiContainmentSphereGUIDs[0] = pInstance->GetData64(ANOMALUS_CONTAINMET_SPHERE);
auiContainmentSphereGUIDs[1] = pInstance->GetData64(ORMOROKS_CONTAINMET_SPHERE);
auiContainmentSphereGUIDs[2] = pInstance->GetData64(TELESTRAS_CONTAINMET_SPHERE);
GameObject *ContainmentSpheres[DATA_CONTAINMENT_SPHERES];
for (uint8 i = 0; i < DATA_CONTAINMENT_SPHERES; ++i)
{
ContainmentSpheres[i] = pInstance->instance->GetGameObject(auiContainmentSphereGUIDs[i]);
if (!ContainmentSpheres[i])
return false;
if (ContainmentSpheres[i]->GetGoState() != GO_STATE_ACTIVE)
return false;
}
if (remove_prison)
RemovePrison(true);
return true;
}
void RemovePrison(bool remove)
{
if (remove)
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if (me->HasAura(SPELL_FROZEN_PRISON))
me->RemoveAurasDueToSpell(SPELL_FROZEN_PRISON);
}
else
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
DoCast(me, SPELL_FROZEN_PRISON, false);
}
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (uiCheckIntenseColdTimer < diff && !bMoreThanTwoIntenseCold)
{
std::list<HostileReference*> ThreatList = me->getThreatManager().getThreatList();
for (std::list<HostileReference*>::const_iterator itr = ThreatList.begin(); itr != ThreatList.end(); ++itr)
{
Unit *pTarget = Unit::GetUnit(*me, (*itr)->getUnitGuid());
if (!pTarget || pTarget->GetTypeId() != TYPEID_PLAYER)
continue;
Aura *AuraIntenseCold = pTarget->GetAura(SPELL_INTENSE_COLD_TRIGGERED);
if (AuraIntenseCold && AuraIntenseCold->GetStackAmount() > 2)
{
bMoreThanTwoIntenseCold = true;
break;
}
}
uiCheckIntenseColdTimer = 2*IN_MILISECONDS;
} else uiCheckIntenseColdTimer -= diff;
if (!bEnrage && HealthBelowPct(25))
{
DoScriptText(SAY_ENRAGE, me);
DoCast(me, SPELL_ENRAGE);
bEnrage = true;
}
if (uiCrystalfireBreathTimer <= diff)
{
DoCast(me->getVictim(), SPELL_CRYSTALFIRE_BREATH);
uiCrystalfireBreathTimer = 14*IN_MILISECONDS;
} else uiCrystalfireBreathTimer -= diff;
if (uiTailSweepTimer <= diff)
{
DoCast(me, SPELL_TAIL_SWEEP);
uiTailSweepTimer = 5*IN_MILISECONDS;
} else uiTailSweepTimer -= diff;
if (uiCrystalChainsCrystalizeTimer <= diff)
{
DoScriptText(SAY_CRYSTAL_NOVA, me);
if (IsHeroic())
DoCast(me, SPELL_CRYSTALIZE);
else if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
DoCast(pTarget, SPELL_CRYSTAL_CHAINS);
uiCrystalChainsCrystalizeTimer = DUNGEON_MODE(30*IN_MILISECONDS,11*IN_MILISECONDS);
} else uiCrystalChainsCrystalizeTimer -= diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_keristrasza(Creature* pCreature)
{
return new boss_keristraszaAI (pCreature);
}
bool GOHello_containment_sphere(Player * /*pPlayer*/, GameObject *pGO)
{
ScriptedInstance *pInstance = pGO->GetInstanceData();
Creature *pKeristrasza = Unit::GetCreature(*pGO, pInstance ? pInstance->GetData64(DATA_KERISTRASZA) : 0);
if (pKeristrasza && pKeristrasza->isAlive())
{
// maybe these are hacks :(
pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
pGO->SetGoState(GO_STATE_ACTIVE);
CAST_AI(boss_keristraszaAI, pKeristrasza->AI())->CheckContainmentSpheres(true);
}
return true;
}
void AddSC_boss_keristrasza()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_keristrasza";
newscript->GetAI = &GetAI_boss_keristrasza;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "containment_sphere";
newscript->pGOHello = &GOHello_containment_sphere;
newscript->RegisterSelf();
}
@@ -0,0 +1,327 @@
/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* Copyright (C) 2008 - 2010 TrinityCore <http://www.trinitycore.org>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "nexus.h"
enum Spells
{
SPELL_ICE_NOVA = 47772,
H_SPELL_ICE_NOVA = 56935,
SPELL_FIREBOMB = 47773,
H_SPELL_FIREBOMB = 56934,
SPELL_GRAVITY_WELL = 47756,
SPELL_TELESTRA_BACK = 47714,
SPELL_FIRE_MAGUS_VISUAL = 47705,
SPELL_FROST_MAGUS_VISUAL = 47706,
SPELL_ARCANE_MAGUS_VISUAL = 47704
};
enum Creatures
{
MOB_FIRE_MAGUS = 26928,
MOB_FROST_MAGUS = 26930,
MOB_ARCANE_MAGUS = 26929
};
enum Yells
{
SAY_AGGRO = -1576000,
SAY_KILL = -1576001,
SAY_DEATH = -1576002,
SAY_MERGE = -1576003,
SAY_SPLIT_1 = -1576004,
SAY_SPLIT_2 = -1576005,
};
enum Achievements
{
ACHIEV_SPLIT_PERSONALITY = 2150,
ACHIEV_TIMER = 5*IN_MILISECONDS
};
const Position CenterOfRoom = {504.80, 89.07, -16.12, 6.27};
struct boss_magus_telestraAI : public ScriptedAI
{
boss_magus_telestraAI(Creature* c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
uint64 uiFireMagusGUID;
uint64 uiFrostMagusGUID;
uint64 uiArcaneMagusGUID;
bool bFireMagusDead;
bool bFrostMagusDead;
bool bArcaneMagusDead;
bool bIsWaitingToAppear;
bool bIsAchievementTimerRunning;
uint32 uiIsWaitingToAppearTimer;
uint32 uiIceNovaTimer;
uint32 uiFireBombTimer;
uint32 uiGravityWellTimer;
uint32 uiCooldown;
uint32 uiAchievementTimer;
uint8 Phase;
uint8 uiAchievementProgress;
void Reset()
{
Phase = 0;
//These times are probably wrong
uiIceNovaTimer = 7*IN_MILISECONDS;
uiFireBombTimer = 0;
uiGravityWellTimer = 15*IN_MILISECONDS;
uiCooldown = 0;
uiFireMagusGUID = 0;
uiFrostMagusGUID = 0;
uiArcaneMagusGUID = 0;
uiAchievementProgress = 0;
uiAchievementTimer = 0;
bIsAchievementTimerRunning = false;
bIsWaitingToAppear = false;
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetVisibility(VISIBILITY_ON);
if (pInstance)
pInstance->SetData(DATA_MAGUS_TELESTRA_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
pInstance->SetData(DATA_MAGUS_TELESTRA_EVENT, IN_PROGRESS);
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
{
if (IsHeroic() && uiAchievementProgress == 2)
pInstance->DoCompleteAchievement(ACHIEV_SPLIT_PERSONALITY);
pInstance->SetData(DATA_MAGUS_TELESTRA_EVENT, DONE);
}
}
void KilledUnit(Unit * /*victim*/)
{
DoScriptText(SAY_KILL, me);
}
uint64 SplitPersonality(uint32 entry)
{
if (Creature* Summoned = me->SummonCreature(entry, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1*IN_MILISECONDS))
{
switch (entry)
{
case MOB_FIRE_MAGUS:
{
Summoned->CastSpell(Summoned, SPELL_FIRE_MAGUS_VISUAL, false);
break;
}
case MOB_FROST_MAGUS:
{
Summoned->CastSpell(Summoned, SPELL_FROST_MAGUS_VISUAL, false);
break;
}
case MOB_ARCANE_MAGUS:
{
Summoned->CastSpell(Summoned, SPELL_ARCANE_MAGUS_VISUAL, false);
break;
}
}
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
Summoned->AI()->AttackStart(pTarget);
return Summoned->GetGUID();
}
return 0;
}
void SummonedCreatureDespawn(Creature *summon)
{
if (summon->isAlive())
return;
if (summon->GetGUID() == uiFireMagusGUID)
{
bFireMagusDead = true;
bIsAchievementTimerRunning = true;
}
else if (summon->GetGUID() == uiFrostMagusGUID)
{
bFrostMagusDead = true;
bIsAchievementTimerRunning = true;
}
else if (summon->GetGUID() == uiArcaneMagusGUID)
{
bArcaneMagusDead = true;
bIsAchievementTimerRunning = true;
}
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (bIsWaitingToAppear)
{
me->StopMoving();
me->AttackStop();
if (uiIsWaitingToAppearTimer <= diff)
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
bIsWaitingToAppear = false;
} else uiIsWaitingToAppearTimer -= diff;
return;
}
if ((Phase == 1) ||(Phase == 3))
{
if (bIsAchievementTimerRunning)
uiAchievementTimer += diff;
if (bFireMagusDead && bFrostMagusDead && bArcaneMagusDead)
{
if (uiAchievementTimer <= ACHIEV_TIMER)
uiAchievementProgress +=1;
me->GetMotionMaster()->Clear();
me->GetMap()->CreatureRelocation(me, CenterOfRoom.GetPositionX(), CenterOfRoom.GetPositionY(), CenterOfRoom.GetPositionZ(), CenterOfRoom.GetOrientation());
DoCast(me, SPELL_TELESTRA_BACK);
me->SetVisibility(VISIBILITY_ON);
if (Phase == 1)
Phase = 2;
if (Phase == 3)
Phase = 4;
uiFireMagusGUID = 0;
uiFrostMagusGUID = 0;
uiArcaneMagusGUID = 0;
bIsWaitingToAppear = true;
uiIsWaitingToAppearTimer = 4*IN_MILISECONDS;
DoScriptText(SAY_MERGE, me);
bIsAchievementTimerRunning = false;
uiAchievementTimer = 0;
}
else
return;
}
if ((Phase == 0) && HealthBelowPct(50))
{
Phase = 1;
me->CastStop();
me->RemoveAllAuras();
me->SetVisibility(VISIBILITY_OFF);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
uiFireMagusGUID = SplitPersonality(MOB_FIRE_MAGUS);
uiFrostMagusGUID = SplitPersonality(MOB_FROST_MAGUS);
uiArcaneMagusGUID = SplitPersonality(MOB_ARCANE_MAGUS);
bFireMagusDead = false;
bFrostMagusDead = false;
bArcaneMagusDead = false;
DoScriptText(RAND(SAY_SPLIT_1,SAY_SPLIT_2), me);
return;
}
if (IsHeroic() && (Phase == 2) && HealthBelowPct(10))
{
Phase = 3;
me->CastStop();
me->RemoveAllAuras();
me->SetVisibility(VISIBILITY_OFF);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
uiFireMagusGUID = SplitPersonality(MOB_FIRE_MAGUS);
uiFrostMagusGUID = SplitPersonality(MOB_FROST_MAGUS);
uiArcaneMagusGUID = SplitPersonality(MOB_ARCANE_MAGUS);
bFireMagusDead = false;
bFrostMagusDead = false;
bArcaneMagusDead = false;
DoScriptText(RAND(SAY_SPLIT_1,SAY_SPLIT_2), me);
return;
}
if (uiCooldown)
{
if (uiCooldown <= diff)
uiCooldown = 0;
else
{
uiCooldown -= diff;
return;
}
}
if (uiIceNovaTimer <= diff)
{
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
DoCast(pTarget, SPELL_ICE_NOVA, false);
uiCooldown = 1.5*IN_MILISECONDS;
}
uiIceNovaTimer = 15*IN_MILISECONDS;
} else uiIceNovaTimer -= diff;
if (uiGravityWellTimer <= diff)
{
if (Unit *pTarget = me->getVictim())
{
DoCast(pTarget, SPELL_GRAVITY_WELL);
uiCooldown = 6*IN_MILISECONDS;
}
uiGravityWellTimer = 15*IN_MILISECONDS;
} else uiGravityWellTimer -= diff;
if (uiFireBombTimer <= diff)
{
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
DoCast(pTarget, SPELL_FIREBOMB, false);
uiCooldown = 2*IN_MILISECONDS;
}
uiFireBombTimer = 2*IN_MILISECONDS;
} else uiFireBombTimer -=diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_magus_telestra(Creature* pCreature)
{
return new boss_magus_telestraAI (pCreature);
}
void AddSC_boss_magus_telestra()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_magus_telestra";
newscript->GetAI = &GetAI_boss_magus_telestra;
newscript->RegisterSelf();
}
@@ -0,0 +1,298 @@
/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* Copyright (C) 2008 - 2010 TrinityCore <http://www.trinitycore.org>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "nexus.h"
enum Spells
{
SPELL_CRYSTAL_SPIKES = 47958, //Don't work, using walkaround
H_SPELL_CRYSTAL_SPIKES = 57082, //Don't work, using walkaround
SPELL_CRYSTALL_SPIKE_DAMAGE = 47944,
H_SPELL_CRYSTALL_SPIKE_DAMAGE = 57067,
SPELL_CRYSTAL_SPIKE_PREVISUAL = 50442,
MOB_CRYSTAL_SPIKE = 27099,
SPELL_SPELL_REFLECTION = 47981,
SPELL_TRAMPLE = 48016,
H_SPELL_TRAMPLE = 57066,
SPELL_FRENZY = 48017,
SPELL_SUMMON_CRYSTALLINE_TANGLER = 61564, //summons npc 32665
SPELL_ROOTS = 28858 //proper spell id is unknown
};
enum Yells
{
SAY_AGGRO = -1576020,
SAY_DEATH = -1576021,
SAY_REFLECT = -1576022,
SAY_CRYSTAL_SPIKES = -1576023,
SAY_KILL = -1576024
};
enum Creatures
{
MOB_CRYSTALLINE_TANGLER = 32665
};
#define SPIKE_DISTANCE 5.0f
struct boss_ormorokAI : public ScriptedAI
{
boss_ormorokAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
bool bFrenzy;
bool bCrystalSpikes;
uint8 uiCrystalSpikesCount;
float fBaseX;
float fBaseY;
float fBaseZ;
float fBaseO;
float fSpikeXY[4][2];
uint32 uiCrystalSpikesTimer;
uint32 uiCrystalSpikesTimer2;
uint32 uiTrampleTimer;
uint32 uiFrenzyTimer;
uint32 uiSpellReflectionTimer;
uint32 uiSummonCrystallineTanglerTimer;
void Reset()
{
uiCrystalSpikesTimer = 12*IN_MILISECONDS;
uiTrampleTimer = 10*IN_MILISECONDS;
uiSpellReflectionTimer = 30*IN_MILISECONDS;
uiSummonCrystallineTanglerTimer = 17*IN_MILISECONDS;
bFrenzy = false;
bCrystalSpikes = false;
if (pInstance)
pInstance->SetData(DATA_ORMOROK_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
pInstance->SetData(DATA_ORMOROK_EVENT, IN_PROGRESS);
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
pInstance->SetData(DATA_ORMOROK_EVENT, DONE);
}
void KilledUnit(Unit * /*victim*/)
{
DoScriptText(SAY_KILL, me);
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
{
return;
}
if (bCrystalSpikes)
if (uiCrystalSpikesTimer2 <= diff)
{
fSpikeXY[0][0] = fBaseX+(SPIKE_DISTANCE*uiCrystalSpikesCount*cos(fBaseO));
fSpikeXY[0][1] = fBaseY+(SPIKE_DISTANCE*uiCrystalSpikesCount*sin(fBaseO));
fSpikeXY[1][0] = fBaseX-(SPIKE_DISTANCE*uiCrystalSpikesCount*cos(fBaseO));
fSpikeXY[1][1] = fBaseY-(SPIKE_DISTANCE*uiCrystalSpikesCount*sin(fBaseO));
fSpikeXY[2][0] = fBaseX+(SPIKE_DISTANCE*uiCrystalSpikesCount*cos(fBaseO-(M_PI/2)));
fSpikeXY[2][1] = fBaseY+(SPIKE_DISTANCE*uiCrystalSpikesCount*sin(fBaseO-(M_PI/2)));
fSpikeXY[3][0] = fBaseX-(SPIKE_DISTANCE*uiCrystalSpikesCount*cos(fBaseO-(M_PI/2)));
fSpikeXY[3][1] = fBaseY-(SPIKE_DISTANCE*uiCrystalSpikesCount*sin(fBaseO-(M_PI/2)));
for (uint8 i = 0; i < 4; ++i)
me->SummonCreature(MOB_CRYSTAL_SPIKE, fSpikeXY[i][0], fSpikeXY[i][1], fBaseZ, 0, TEMPSUMMON_TIMED_DESPAWN, 7*IN_MILISECONDS);
if (++uiCrystalSpikesCount >= 13)
bCrystalSpikes = false;
uiCrystalSpikesTimer2 = 200;
} else uiCrystalSpikesTimer2 -= diff;
if (!bFrenzy && (me->GetHealth() < me->GetMaxHealth() * 0.25))
{
DoCast(me, SPELL_FRENZY);
bFrenzy = true;
}
if (uiTrampleTimer <= diff)
{
DoCast(me, SPELL_TRAMPLE);
uiTrampleTimer = 10*IN_MILISECONDS;
} else uiTrampleTimer -= diff;
if (uiSpellReflectionTimer <= diff)
{
DoScriptText(SAY_REFLECT, me);
DoCast(me, SPELL_SPELL_REFLECTION);
uiSpellReflectionTimer = 30*IN_MILISECONDS;
} else uiSpellReflectionTimer -= diff;
if (uiCrystalSpikesTimer <= diff)
{
DoScriptText(SAY_CRYSTAL_SPIKES, me);
bCrystalSpikes = true;
uiCrystalSpikesCount = 1;
uiCrystalSpikesTimer2 = 0;
fBaseX = me->GetPositionX();
fBaseY = me->GetPositionY();
fBaseZ = me->GetPositionZ();
fBaseO = me->GetOrientation();
uiCrystalSpikesTimer = 20*IN_MILISECONDS;
} else uiCrystalSpikesTimer -= diff;
if (IsHeroic() && (uiSummonCrystallineTanglerTimer <= diff))
{
Creature* Crystalline_Tangler = me->SummonCreature(MOB_CRYSTALLINE_TANGLER, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);
if (Crystalline_Tangler)
{
Unit *pTarget = NULL;
uint8 Healer = 0;
for (uint8 j = 1; j <= 4; j++)
{
switch (j)
{
case 1: Healer = CLASS_PRIEST; break;
case 2: Healer = CLASS_PALADIN; break;
case 3: Healer = CLASS_DRUID; break;
case 4: Healer = CLASS_SHAMAN; break;
}
std::list<HostileReference*>::const_iterator i = me->getThreatManager().getThreatList().begin();
for (; i != me->getThreatManager().getThreatList().end(); ++i)
{
Unit* pTemp = Unit::GetUnit((*me),(*i)->getUnitGuid());
if (pTemp && pTemp->GetTypeId() == TYPEID_PLAYER && pTemp->getClass() == Healer)
{
pTarget = pTemp;
break;
}
}
if (pTarget)
break;
}
if (!pTarget)
pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0);
if (pTarget)
{
Crystalline_Tangler->AI()->AttackStart(pTarget);
Crystalline_Tangler->getThreatManager().addThreat(pTarget, 1000000000.0f);
}
}
uiSummonCrystallineTanglerTimer = 17*IN_MILISECONDS;
} else uiSummonCrystallineTanglerTimer -= diff;
DoMeleeAttackIfReady();
}
};
struct mob_crystal_spikeAI : public Scripted_NoMovementAI
{
mob_crystal_spikeAI(Creature *c) : Scripted_NoMovementAI(c)
{
}
uint32 SpellCrystalSpikeDamageTimer;
uint32 SpellCrystalSpikePrevisualTimer;
void Reset()
{
SpellCrystalSpikeDamageTimer = 3.7*IN_MILISECONDS;
SpellCrystalSpikePrevisualTimer = 1*IN_MILISECONDS;
}
void UpdateAI(const uint32 diff)
{
if (SpellCrystalSpikePrevisualTimer <= diff)
{
DoCast(me, SPELL_CRYSTAL_SPIKE_PREVISUAL);
SpellCrystalSpikePrevisualTimer = 10*IN_MILISECONDS;
} else SpellCrystalSpikePrevisualTimer -= diff;
if (SpellCrystalSpikeDamageTimer <= diff)
{
DoCast(me, SPELL_CRYSTALL_SPIKE_DAMAGE);
SpellCrystalSpikeDamageTimer = 10*IN_MILISECONDS;
} else SpellCrystalSpikeDamageTimer -= diff;
}
};
struct mob_crystalline_tanglerAI : public ScriptedAI
{
mob_crystalline_tanglerAI(Creature *c) : ScriptedAI(c) {}
uint32 uiRootsTimer;
void Reset()
{
uiRootsTimer = 1*IN_MILISECONDS;
}
void UpdateAI(const uint32 diff)
{
if (uiRootsTimer <= diff)
{
if (me->IsWithinDist(me->getVictim(), 5.0f, false))
{
DoCast(me->getVictim(), SPELL_ROOTS);
uiRootsTimer = 15*IN_MILISECONDS;
}
} else uiRootsTimer -= diff;
}
};
CreatureAI* GetAI_mob_crystal_spike(Creature* pCreature)
{
return new mob_crystal_spikeAI (pCreature);
}
CreatureAI* GetAI_mob_crystalline_tangler(Creature* pCreature)
{
return new mob_crystalline_tanglerAI (pCreature);
}
CreatureAI* GetAI_boss_ormorok(Creature* pCreature)
{
return new boss_ormorokAI (pCreature);
}
void AddSC_boss_ormorok()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_ormorok";
newscript->GetAI = &GetAI_boss_ormorok;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_crystal_spike";
newscript->GetAI = &GetAI_mob_crystal_spike;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_crystalline_tangler";
newscript->GetAI = &GetAI_mob_crystalline_tangler;
newscript->RegisterSelf();
}
@@ -0,0 +1,58 @@
/* Script Data Start
SDName: Boss Commander Kolurg
SDAuthor: LordVanMartin
SD%Complete:
SDComment: Only Alliance Heroic
SDCategory:
Script Data End */
/*** SQL START ***
update creature_template set scriptname = 'boss_commander_kolurg' where entry = '';
*** SQL END ***/
#include "ScriptedPch.h"
#define SPELL_BATTLE_SHOUT 31403
#define SPELL_CHARGE 60067
#define SPELL_FRIGHTENING_SHOUT 19134
#define SPELL_WHIRLWIND_1 38619
#define SPELL_WHIRLWIND_2 38618
//not used
//Yell
#define SAY_AGGRO -1576024
#define SAY_KILL -1576025
#define SAY_DEATH -1576026
struct boss_commander_kolurgAI : public ScriptedAI
{
boss_commander_kolurgAI(Creature *c) : ScriptedAI(c) {}
void Reset() {}
void EnterCombat(Unit* /*who*/) {}
void AttackStart(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
void UpdateAI(const uint32 /*diff*/)
{
//Return since we have no target
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/) {}
};
CreatureAI* GetAI_boss_commander_kolurg(Creature* pCreature)
{
return new boss_commander_kolurgAI (pCreature);
}
void AddSC_boss_commander_kolurg()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_commander_kolurg";
newscript->GetAI = &GetAI_boss_commander_kolurg;
newscript->RegisterSelf();
}
@@ -0,0 +1,64 @@
/* Script Data Start
SDName: Boss Commander Stoutbeard
SDAuthor: LordVanMartin
SD%Complete:
SDComment: Only Horde Heroic
SDCategory:
Script Data End */
/*** SQL START ***
update creature_template set scriptname = 'boss_commander_stoutbeard' where entry = '';
*** SQL END ***/
#include "ScriptedPch.h"
#define SPELL_BATTLE_SHOUT 31403
#define SPELL_CHARGE 60067
#define SPELL_FRIGHTENING_SHOUT 19134
#define SPELL_WHIRLWIND_1 38619
#define SPELL_WHIRLWIND_2 38618
//not used
//Yell
#define SAY_AGGRO -1576021
#define SAY_KILL -1576022
#define SAY_DEATH -1576023
struct boss_commander_stoutbeardAI : public ScriptedAI
{
boss_commander_stoutbeardAI(Creature *c) : ScriptedAI(c) {}
void Reset() {}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
}
void AttackStart(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
void UpdateAI(const uint32 /*diff*/)
{
//Return since we have no target
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
}
};
CreatureAI* GetAI_boss_commander_stoutbeard(Creature* pCreature)
{
return new boss_commander_stoutbeardAI (pCreature);
}
void AddSC_boss_commander_stoutbeard()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_commander_stoutbeard";
newscript->GetAI = &GetAI_boss_commander_stoutbeard;
newscript->RegisterSelf();
}
@@ -0,0 +1,259 @@
/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* Copyright (C) 2008 - 2010 TrinityCore <http://www.trinitycore.org>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "nexus.h"
#define NUMBER_OF_ENCOUNTERS 4
enum Factions
{
FACTION_HOSTILE_FOR_ALL = 16
};
struct instance_nexus : public ScriptedInstance
{
instance_nexus(Map *pMap) : ScriptedInstance(pMap) { Initialize(); }
uint32 m_auiEncounter[NUMBER_OF_ENCOUNTERS];
uint64 Anomalus;
uint64 Keristrasza;
uint64 AnomalusContainmentSphere;
uint64 OrmoroksContainmentSphere;
uint64 TelestrasContainmentSphere;
std::string strInstData;
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
Anomalus = 0;
Keristrasza = 0;
}
void OnCreatureCreate(Creature *pCreature, bool /*bAdd*/)
{
Map::PlayerList const &players = instance->GetPlayers();
uint32 TeamInInstance = 0;
if (!players.isEmpty())
{
if (Player* pPlayer = players.begin()->getSource())
TeamInInstance = pPlayer->GetTeam();
}
switch (pCreature->GetEntry())
{
case 26763:
Anomalus = pCreature->GetGUID();
break;
case 26723:
Keristrasza = pCreature->GetGUID();
break;
// Alliance npcs are spawned by default, if you are alliance, you will fight against horde npcs.
case 26800:
{
if (ServerAllowsTwoSideGroups())
pCreature->setFaction(FACTION_HOSTILE_FOR_ALL);
if (TeamInInstance == ALLIANCE)
pCreature->UpdateEntry(26799, HORDE);
break;
}
case 26802:
{
if (ServerAllowsTwoSideGroups())
pCreature->setFaction(FACTION_HOSTILE_FOR_ALL);
if (TeamInInstance == ALLIANCE)
pCreature->UpdateEntry(26801, HORDE);
break;
}
case 26805:
{
if (ServerAllowsTwoSideGroups())
pCreature->setFaction(FACTION_HOSTILE_FOR_ALL);
if (TeamInInstance == ALLIANCE)
pCreature->UpdateEntry(26803, HORDE);
break;
}
case 27949:
{
if (ServerAllowsTwoSideGroups())
pCreature->setFaction(FACTION_HOSTILE_FOR_ALL);
if (TeamInInstance == ALLIANCE)
pCreature->UpdateEntry(27947, HORDE);
break;
}
case 26796:
{
if (ServerAllowsTwoSideGroups())
pCreature->setFaction(FACTION_HOSTILE_FOR_ALL);
if (TeamInInstance == ALLIANCE)
pCreature->UpdateEntry(26798, HORDE);
break;
}
}
}
void OnGameObjectCreate(GameObject *pGo, bool /*bAdd*/)
{
switch (pGo->GetEntry())
{
case 188527:
{
AnomalusContainmentSphere = pGo->GetGUID();
if (m_auiEncounter[1] == DONE)
pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
break;
}
case 188528:
{
OrmoroksContainmentSphere = pGo->GetGUID();
if (m_auiEncounter[2] == DONE)
pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
break;
}
case 188526:
{
TelestrasContainmentSphere = pGo->GetGUID();
if (m_auiEncounter[0] == DONE)
pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
break;
}
}
}
uint32 GetData(uint32 identifier)
{
switch(identifier)
{
case DATA_MAGUS_TELESTRA_EVENT: return m_auiEncounter[0];
case DATA_ANOMALUS_EVENT: return m_auiEncounter[1];
case DATA_ORMOROK_EVENT: return m_auiEncounter[2];
case DATA_KERISTRASZA_EVENT: return m_auiEncounter[3];
}
return 0;
}
void SetData(uint32 identifier, uint32 data)
{
switch (identifier)
{
case DATA_MAGUS_TELESTRA_EVENT:
{
if (data == DONE)
{
GameObject *Sphere = instance->GetGameObject(TelestrasContainmentSphere);
if (Sphere)
Sphere->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
}
m_auiEncounter[0] = data;
break;
}
case DATA_ANOMALUS_EVENT:
{
if (data == DONE)
{
if (GameObject *Sphere = instance->GetGameObject(AnomalusContainmentSphere))
Sphere->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
}
m_auiEncounter[1] = data;
break;
}
case DATA_ORMOROK_EVENT:
{
if (data == DONE)
{
if (GameObject *Sphere = instance->GetGameObject(OrmoroksContainmentSphere))
Sphere->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
}
m_auiEncounter[2] = data;
break;
}
case DATA_KERISTRASZA_EVENT:
m_auiEncounter[3] = data;
break;
}
if (data == DONE)
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " "
<< m_auiEncounter[3];
strInstData = saveStream.str();
SaveToDB();
OUT_SAVE_INST_DATA_COMPLETE;
}
}
uint64 GetData64(uint32 uiIdentifier)
{
switch(uiIdentifier)
{
case DATA_ANOMALUS: return Anomalus;
case DATA_KERISTRASZA: return Keristrasza;
case ANOMALUS_CONTAINMET_SPHERE: return AnomalusContainmentSphere;
case ORMOROKS_CONTAINMET_SPHERE: return OrmoroksContainmentSphere;
case TELESTRAS_CONTAINMET_SPHERE: return TelestrasContainmentSphere;
}
return 0;
}
std::string GetSaveData()
{
return strInstData;
}
void Load(const char *chrIn)
{
if (!chrIn)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(chrIn);
std::istringstream loadStream(chrIn);
loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3];
for (uint8 i = 0; i < NUMBER_OF_ENCOUNTERS; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
m_auiEncounter[i] = NOT_STARTED;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
InstanceData *GetInstanceData_instance_nexus(Map *pMap)
{
return new instance_nexus(pMap);
}
void AddSC_instance_nexus()
{
Script *newscript;
newscript = new Script;
newscript->Name = "instance_nexus";
newscript->GetInstanceData = &GetInstanceData_instance_nexus;
newscript->RegisterSelf();
}
@@ -0,0 +1,35 @@
/* Copyright (C) 2008 - 2010 TrinityCore <http://www.trinitycore.org>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef DEF_NEXUS_H
#define DEF_NEXUS_H
enum eTypes
{
DATA_MAGUS_TELESTRA_EVENT,
DATA_ANOMALUS_EVENT,
DATA_ORMOROK_EVENT,
DATA_KERISTRASZA_EVENT,
DATA_ANOMALUS,
DATA_KERISTRASZA,
ANOMALUS_CONTAINMET_SPHERE,
ORMOROKS_CONTAINMET_SPHERE,
TELESTRAS_CONTAINMET_SPHERE
};
#endif
@@ -0,0 +1,218 @@
/* Copyright (C) 2008 - 2010 TrinityCore <http://www.trinitycore.org>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "oculus.h"
enum Spells
{
SPELL_MAGIC_PULL = 51336,
SPELL_MAGIC_PULL_EFFECT = 50770,
SPELL_THUNDERING_STOMP = 50774,
SPELL_THUNDERING_STOMP_H = 59370,
SPELL_UNSTABLE_SPHERE_PASSIVE = 50756,
SPELL_UNSTABLE_SPHERE_PULSE = 50757,
SPELL_UNSTABLE_SPHERE_TIMER = 50758,
NPC_UNSTABLE_SPHERE = 28166,
};
//not in db
enum Yells
{
SAY_AGGRO = -1578000,
SAY_KILL_1 = -1578001,
SAY_KILL_2 = -1578002,
SAY_KILL_3 = -1578003,
SAY_DEATH = -1578004,
SAY_PULL_1 = -1578005,
SAY_PULL_2 = -1578006,
SAY_PULL_3 = -1578007,
SAY_PULL_4 = -1578008,
SAY_STOMP_1 = -1578009,
SAY_STOMP_2 = -1578010,
SAY_STOMP_3 = -1578011
};
enum
{
ACHIEV_TIMED_START_EVENT = 18153,
};
struct boss_drakosAI : public ScriptedAI
{
boss_drakosAI(Creature* pCreature) : ScriptedAI(pCreature), lSummons(me)
{
pInstance = pCreature->GetInstanceData();
}
uint32 uiMagicPullTimer;
uint32 uiStompTimer;
uint32 uiBombSummonTimer;
bool bPostPull;
ScriptedInstance* pInstance;
SummonList lSummons;
void Reset()
{
lSummons.DespawnAll();
uiMagicPullTimer = 15000;
uiStompTimer = 17000;
uiBombSummonTimer = 2000;
bPostPull = false;
if (pInstance)
pInstance->SetData(DATA_DRAKOS_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
pInstance->SetData(DATA_DRAKOS_EVENT, IN_PROGRESS);
}
void JustSummoned(Creature* pSummon)
{
lSummons.Summon(pSummon);
}
void UpdateAI(const uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (uiBombSummonTimer <= uiDiff)
{
Position pPosition;
me->GetPosition(&pPosition);
if (bPostPull)
{
for (uint8 uiI = 0; uiI >= 3; uiI++)
{
me->GetRandomNearPosition(pPosition, float(urand(0,10)));
me->SummonCreature(NPC_UNSTABLE_SPHERE, pPosition);
}
}
else
{
me->GetRandomNearPosition(pPosition, float(urand(0,10)));
me->SummonCreature(NPC_UNSTABLE_SPHERE, pPosition);
}
uiBombSummonTimer = 2000;
} else uiBombSummonTimer -= uiDiff;
if (uiMagicPullTimer <= uiDiff)
{
DoCast(SPELL_MAGIC_PULL);
bPostPull = true;
uiMagicPullTimer = 15000;
} else uiMagicPullTimer -= uiDiff;
if (uiStompTimer <= uiDiff)
{
DoScriptText(RAND(SAY_STOMP_1,SAY_STOMP_2,SAY_STOMP_3), me);
DoCast(SPELL_THUNDERING_STOMP);
uiStompTimer = 17000;
} else uiStompTimer -= uiDiff;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
{
pInstance->SetData(DATA_DRAKOS_EVENT, DONE);
// start achievement timer (kill Eregos within 20 min)
pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
lSummons.DespawnAll();
}
void KilledUnit(Unit* /*victim*/)
{
DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2,SAY_KILL_3), me);
}
};
CreatureAI* GetAI_boss_drakos(Creature* pCreature)
{
return new boss_drakosAI (pCreature);
}
struct npc_unstable_sphereAI : public ScriptedAI
{
npc_unstable_sphereAI(Creature* pCreature) : ScriptedAI(pCreature) {}
uint32 uiPulseTimer;
uint32 uiDeathTimer;
void Reset()
{
me->SetReactState(REACT_PASSIVE);
me->GetMotionMaster()->MoveRandom(40.0f);
me->AddAura(SPELL_UNSTABLE_SPHERE_PASSIVE, me);
me->AddAura(SPELL_UNSTABLE_SPHERE_TIMER, me);
uiPulseTimer = 3000;
uiDeathTimer = 19000;
}
void UpdateAI(const uint32 uiDiff)
{
if (uiPulseTimer <= uiDiff)
{
DoCast(SPELL_UNSTABLE_SPHERE_PULSE);
uiPulseTimer = 3*IN_MILISECONDS;
} else uiPulseTimer -= uiDiff;
if (uiDeathTimer <= uiDiff)
me->DisappearAndDie();
else uiDeathTimer -= uiDiff;
}
};
CreatureAI* GetAI_npc_unstable_sphere(Creature* pCreature)
{
return new npc_unstable_sphereAI (pCreature);
}
void AddSC_boss_drakos()
{
Script* newscript;
newscript = new Script;
newscript->Name = "boss_drakos";
newscript->GetAI = &GetAI_boss_drakos;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_unstable_sphere";
newscript->GetAI = &GetAI_npc_unstable_sphere;
newscript->RegisterSelf();
}
@@ -0,0 +1,129 @@
/* Copyright (C) 2008 - 2010 TrinityCore <http://www.trinitycore.org>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "oculus.h"
//Types of drake mounts: Ruby(Tank), Amber(DPS), Emerald(Healer)
//Two Repeating phases
enum Spells
{
SPELL_ARCANE_BARRAGE = 50804,
H_SPELL_ARCANE_BARRAGE = 59381,
SPELL_ARCANE_VOLLEY = 51153,
H_SPELL_ARCANE_VOLLEY = 59382,
SPELL_ENRAGED_ASSAULT = 51170,
SPELL_PLANAR_ANOMALIES = 57959,
SPELL_PLANAR_SHIFT = 51162,
};
/*Ruby Drake ,
(npc 27756) (item 37860)
(summoned by spell Ruby Essence = 37860 ---> Call Amber Drake == 49462 ---> Summon 27756)
*/
enum RubyDrake
{
NPC_RUBY_DRAKE_VEHICLE = 27756,
SPELL_RIDE_RUBY_DRAKE_QUE = 49463, //Apply Aura: Periodic Trigger, Interval: 3 seconds ---> 49464
SPELL_RUBY_DRAKE_SADDLE = 49464, //Allows you to ride on the back of an Amber Drake. ---> Dummy
SPELL_RUBY_SEARING_WRATH = 50232, //(60 yds) - Instant - Breathes a stream of fire at an enemy dragon, dealing 6800 to 9200 Fire damage and then jumping to additional dragons within 30 yards. Each jump increases the damage by 50%. Affects up to 5 total targets
SPELL_RUBY_EVASIVE_AURA = 50248, //Instant - Allows the Ruby Drake to generate Evasive Charges when hit by hostile attacks and spells.
SPELL_RUBY_EVASIVE_MANEUVERS = 50240, //Instant - 5 sec. cooldown - Allows your drake to dodge all incoming attacks and spells. Requires Evasive Charges to use. Each attack or spell dodged while this ability is active burns one Evasive Charge. Lasts 30 sec. or until all charges are exhausted.
//you do not have acces to until you kill Mage-Lord Urom
SPELL_RUBY_MARTYR = 50253 //Instant - 10 sec. cooldown - Redirect all harmful spells cast at friendly drakes to yourself for 10 sec.
};
/*Amber Drake,
(npc 27755) (item 37859)
(summoned by spell Amber Essence = 37859 ---> Call Amber Drake == 49461 ---> Summon 27755)
*/
enum AmberDrake
{
NPC_AMBER_DRAKE_VEHICLE = 27755,
SPELL_RIDE_AMBER_DRAKE_QUE = 49459, //Apply Aura: Periodic Trigger, Interval: 3 seconds ---> 49460
SPELL_AMBER_DRAKE_SADDLE = 49460, //Allows you to ride on the back of an Amber Drake. ---> Dummy
SPELL_AMBER_SHOCK_LANCE = 49840, //(60 yds) - Instant - Deals 4822 to 5602 Arcane damage and detonates all Shock Charges on an enemy dragon. Damage is increased by 6525 for each detonated.
// SPELL_AMBER_STOP_TIME //Instant - 1 min cooldown - Halts the passage of time, freezing all enemy dragons in place for 10 sec. This attack applies 5 Shock Charges to each affected target.
//you do not have access to until you kill the Mage-Lord Urom.
SPELL_AMBER_TEMPORAL_RIFT = 49592 //(60 yds) - Channeled - Channels a temporal rift on an enemy dragon for 10 sec. While trapped in the rift, all damage done to the target is increased by 100%. In addition, for every 15,000 damage done to a target affected by Temporal Rift, 1 Shock Charge is generated.
};
/*Emerald Drake,
(npc 27692) (item 37815),
(summoned by spell Emerald Essence = 37815 ---> Call Emerald Drake == 49345 ---> Summon 27692)
*/
enum EmeraldDrake
{
NPC_EMERALD_DRAKE_VEHICLE = 27692,
SPELL_RIDE_EMERALD_DRAKE_QUE = 49427, //Apply Aura: Periodic Trigger, Interval: 3 seconds ---> 49346
SPELL_EMERALD_DRAKE_SADDLE = 49346, //Allows you to ride on the back of an Amber Drake. ---> Dummy
SPELL_EMERALD_LEECHING_POISON = 50328, //(60 yds) - Instant - Poisons the enemy dragon, leeching 1300 to the caster every 2 sec. for 12 sec. Stacks up to 3 times.
SPELL_EMERALD_TOUCH_THE_NIGHTMARE = 50341, //(60 yds) - Instant - Consumes 30% of the caster's max health to inflict 25,000 nature damage to an enemy dragon and reduce the damage it deals by 25% for 30 sec.
// you do not have access to until you kill the Mage-Lord Urom
SPELL_EMERALD_DREAM_FUNNEL = 50344 //(60 yds) - Channeled - Transfers 5% of the caster's max health to a friendly drake every second for 10 seconds as long as the caster channels.
};
struct boss_eregosAI : public ScriptedAI
{
boss_eregosAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
void Reset()
{
if (pInstance)
pInstance->SetData(DATA_EREGOS_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
if (pInstance)
pInstance->SetData(DATA_EREGOS_EVENT, IN_PROGRESS);
}
void AttackStart(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
void UpdateAI(const uint32 /*diff*/)
{
//Return since we have no target
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
if (pInstance)
pInstance->SetData(DATA_EREGOS_EVENT, DONE);
}
};
CreatureAI* GetAI_boss_eregos(Creature* pCreature)
{
return new boss_eregosAI (pCreature);
}
void AddSC_boss_eregos()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_eregos";
newscript->GetAI = &GetAI_boss_eregos;
newscript->RegisterSelf();
}
@@ -0,0 +1,356 @@
/* Copyright (C) 2008 - 2010 TrinityCore <http://www.trinitycore.org>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
SDName: Urom
SD%Complete: 80
SDComment: Is not working SPELL_ARCANE_SHIELD. SPELL_FROSTBOMB has some issues, the damage aura should not stack.
SDCategory: Instance Script
EndScriptData */
#include "ScriptedPch.h"
#include "oculus.h"
enum Spells
{
SPELL_ARCANE_SHIELD = 53813, //Dummy --> Channeled, shields the caster from damage.
SPELL_EMPOWERED_ARCANE_EXPLOSION = 51110,
SPELL_EMPOWERED_ARCANE_EXPLOSION_2 = 59377,
SPELL_FROSTBOMB = 51103, //Urom throws a bomb, hitting its target with the highest aggro which inflict directly 650 frost damage and drops a frost zone on the ground. This zone deals 650 frost damage per second and reduce the movement speed by 35%. Lasts 1 minute.
SPELL_SUMMON_MENAGERIE = 50476, //Summons an assortment of creatures and teleports the caster to safety.
SPELL_SUMMON_MENAGERIE_2 = 50495,
SPELL_SUMMON_MENAGERIE_3 = 50496,
SPELL_TELEPORT = 51112, //Teleports to the center of Oculus
SPELL_TIME_BOMB = 51121, //Deals arcane damage to a random player, and after 6 seconds, deals zone damage to nearby equal to the health missing of the target afflicted by the debuff.
SPELL_TIME_BOMB_2 = 59376
};
enum Yells
{
SAY_AGGRO_1 = -1578000,
SAY_AGGRO_2 = -1578001,
SAY_AGGRO_3 = -1578002,
SAY_AGGRO_4 = -1578003,
SAY_TELEPORT = -1578004,
};
enum eCreature
{
NPC_PHANTASMAL_CLOUDSCRAPER = 27645,
NPC_PHANTASMAL_MAMMOTH = 27642,
NPC_PHANTASMAL_WOLF = 27644,
NPC_PHANTASMAL_AIR = 27650,
NPC_PHANTASMAL_FIRE = 27651,
NPC_PHANTASMAL_WATER = 27653,
NPC_PHANTASMAL_MURLOC = 27649,
NPC_PHANTASMAL_NAGAL = 27648,
NPC_PHANTASMAL_OGRE = 27647
};
struct Summons
{
uint32 uiEntry[4];
};
static Summons Group[]=
{
{NPC_PHANTASMAL_CLOUDSCRAPER,NPC_PHANTASMAL_CLOUDSCRAPER,NPC_PHANTASMAL_MAMMOTH,NPC_PHANTASMAL_WOLF},
{NPC_PHANTASMAL_AIR,NPC_PHANTASMAL_AIR,NPC_PHANTASMAL_WATER,NPC_PHANTASMAL_FIRE},
{NPC_PHANTASMAL_OGRE,NPC_PHANTASMAL_OGRE,NPC_PHANTASMAL_NAGAL,NPC_PHANTASMAL_MURLOC}
};
static uint32 TeleportSpells[]=
{
SPELL_SUMMON_MENAGERIE,SPELL_SUMMON_MENAGERIE_2,SPELL_SUMMON_MENAGERIE_3
};
static int32 SayAggro[]=
{
SAY_AGGRO_1,SAY_AGGRO_2,SAY_AGGRO_3,SAY_AGGRO_4
};
struct boss_uromAI : public ScriptedAI
{
boss_uromAI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* pInstance;
float x,y;
bool bCanCast;
bool bCanGoBack;
uint8 uiGroup[3];
uint32 uiTeleportTimer;
uint32 uiArcaneExplosionTimer;
uint32 uiCastArcaneExplosionTimer;
uint32 uiFrostBombTimer;
uint32 uiTimeBombTimer;
void Reset()
{
if (pInstance && pInstance->GetData(DATA_VAROS_EVENT) != DONE)
DoCast(SPELL_ARCANE_SHIELD);
if (pInstance)
pInstance->SetData(DATA_UROM_EVENT, NOT_STARTED);
if (pInstance && pInstance->GetData(DATA_UROM_PLATAFORM) == 0)
{
uiGroup[0] = 0;
uiGroup[1] = 0;
uiGroup[2] = 0;
}
x,y = 0.0f;
bCanCast = false;
bCanGoBack = false;
me->GetMotionMaster()->MoveIdle();
uiTeleportTimer = urand(30000,35000);
uiArcaneExplosionTimer = 9000;
uiCastArcaneExplosionTimer = 2000;
uiFrostBombTimer = urand(5000,8000);
uiTimeBombTimer = urand(20000,25000);
}
void EnterCombat(Unit* pWho)
{
if (pInstance)
pInstance->SetData(DATA_UROM_EVENT, IN_PROGRESS);
SetGroups();
SummonGroups();
CastTeleport();
if (pInstance && pInstance->GetData(DATA_UROM_PLATAFORM) != 3)
pInstance->SetData(DATA_UROM_PLATAFORM,pInstance->GetData(DATA_UROM_PLATAFORM)+1);
}
void AttackStart(Unit* pWho)
{
if (!pWho)
return;
if (me->GetPositionZ() > 518.63)
DoStartNoMovement(pWho);
if (me->GetPositionZ() < 518.63)
{
if (me->Attack(pWho, true))
{
DoScriptText(SayAggro[3],me);
me->SetInCombatWith(pWho);
pWho->SetInCombatWith(me);
me->GetMotionMaster()->MoveChase(pWho, 0,0);
}
}
}
void SetGroups()
{
if (!pInstance || pInstance->GetData(DATA_UROM_PLATAFORM) != 0)
return;
while (uiGroup[0] == uiGroup[1] || uiGroup[0] == uiGroup[2] || uiGroup[1] == uiGroup[2])
{
uiGroup[0] = urand(0,2);
uiGroup[1] = urand(0,2);
uiGroup[2] = urand(0,2);
}
}
void SetPosition(uint8 uiI)
{
switch(uiI)
{
case 0:
x = me->GetPositionX() + 4;
y = me->GetPositionY() - 4;
break;
case 1:
x = me->GetPositionX() + 4;
y = me->GetPositionY() + 4;
break;
case 2:
x = me->GetPositionX() - 4;
y = me->GetPositionY() + 4;
break;
case 3:
x = me->GetPositionX() - 4;
y = me->GetPositionY() - 4;
break;
default:
break;
}
}
void SummonGroups()
{
if (!pInstance || pInstance->GetData(DATA_UROM_PLATAFORM) > 2)
return;
for (uint8 uiI = 0; uiI < 4 ; uiI++)
{
SetPosition(uiI);
me->SummonCreature(Group[uiGroup[pInstance->GetData(DATA_UROM_PLATAFORM)]].uiEntry[uiI],x,y,me->GetPositionZ(),me->GetOrientation());
}
}
void CastTeleport()
{
if (!pInstance || pInstance->GetData(DATA_UROM_PLATAFORM) > 2)
return;
DoScriptText(SayAggro[pInstance->GetData(DATA_UROM_PLATAFORM)],me);
DoCast(TeleportSpells[pInstance->GetData(DATA_UROM_PLATAFORM)]);
}
void UpdateAI(const uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (!pInstance || pInstance->GetData(DATA_UROM_PLATAFORM) < 2)
return;
if (uiTeleportTimer <= uiDiff)
{
me->InterruptNonMeleeSpells(false);
DoScriptText(SAY_TELEPORT,me);
me->GetMotionMaster()->MoveIdle();
DoCast(SPELL_TELEPORT);
uiTeleportTimer = urand(30000,35000);
} else uiTeleportTimer -= uiDiff;
if (bCanCast && !me->FindCurrentSpellBySpellId(SPELL_EMPOWERED_ARCANE_EXPLOSION))
{
if (uiCastArcaneExplosionTimer <= uiDiff)
{
bCanCast = false;
bCanGoBack = true;
DoCastAOE(SPELL_EMPOWERED_ARCANE_EXPLOSION);
uiCastArcaneExplosionTimer = 2000;
}else uiCastArcaneExplosionTimer -= uiDiff;
}
if (bCanGoBack)
{
if (uiArcaneExplosionTimer <= uiDiff)
{
Position pPos;
me->getVictim()->GetPosition(&pPos);
me->NearTeleportTo(pPos.GetPositionX(),pPos.GetPositionY(),pPos.GetPositionZ(),pPos.GetOrientation());
me->GetMotionMaster()->MoveChase(me->getVictim(),0,0);
me->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE);
bCanCast = false;
bCanGoBack = false;
uiArcaneExplosionTimer = 9000;
} else uiArcaneExplosionTimer -= uiDiff;
}
if (!me->IsNonMeleeSpellCasted(false, true, true))
{
if (uiFrostBombTimer <= uiDiff)
{
DoCastVictim(SPELL_FROSTBOMB);
uiFrostBombTimer = urand(5000,8000);
} else uiFrostBombTimer -= uiDiff;
if (uiTimeBombTimer <= uiDiff)
{
if (Unit* pUnit = SelectTarget(SELECT_TARGET_RANDOM))
DoCast(pUnit,SPELL_TIME_BOMB);
uiTimeBombTimer = urand(20000,25000);
} else uiTimeBombTimer -= uiDiff;
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
if (pInstance)
pInstance->SetData(DATA_UROM_EVENT, DONE);
}
void JustSummoned(Creature* pSummon)
{
pSummon->SetInCombatWithZone();
}
void LeaveCombat()
{
me->RemoveAllAuras();
me->CombatStop(false);
me->DeleteThreatList();
}
void SpellHit(Unit* pCaster, const SpellEntry* pSpell)
{
switch(pSpell->Id)
{
case SPELL_SUMMON_MENAGERIE:
me->SetHomePosition(968.66,1042.53,527.32,0.077);
LeaveCombat();
break;
case SPELL_SUMMON_MENAGERIE_2:
me->SetHomePosition(1164.02,1170.85,527.321,3.66);
LeaveCombat();
break;
case SPELL_SUMMON_MENAGERIE_3:
me->SetHomePosition(1118.31,1080.377,508.361,4.25);
LeaveCombat();
break;
case SPELL_TELEPORT:
me->AddUnitMovementFlag(MOVEMENTFLAG_FLY_MODE); // with out it the npc will fall down while is casting
bCanCast = true;
break;
default:
break;
}
}
};
CreatureAI* GetAI_boss_urom(Creature* pCreature)
{
return new boss_uromAI (pCreature);
}
void AddSC_boss_urom()
{
Script* newscript;
newscript = new Script;
newscript->Name = "boss_urom";
newscript->GetAI = &GetAI_boss_urom;
newscript->RegisterSelf();
}
@@ -0,0 +1,105 @@
/* Copyright (C) 2008 - 2010 TrinityCore <http://www.trinitycore.org>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "oculus.h"
enum Spells
{
SPELL_ENERGIZE_CORES = 50785, //Damage 5938 to 6562, effec2 Triggers 54069, effect3 Triggers 56251
SPELL_ENERGIZE_CORES_TRIGGER_1 = 54069,
SPELL_ENERGIZE_CORES_TRIGGER_2 = 56251,
SPELL_ENERGIZE_CORES_2 = 59372, //Damage 9025 to 9975, effect2 Triggers 54069, effect 56251
SPELL_CALL_AZURE_RING_CAPTAIN = 51002, //Effect Send Event (12229)
SPELL_CALL_AZURE_RING_CAPTAIN_2 = 51006, //Effect Send Event (10665)
SPELL_CALL_AZURE_RING_CAPTAIN_3 = 51007, //Effect Send Event (18454)
SPELL_CALL_AZURE_RING_CAPTAIN_4 = 51008, //Effect Send Event (18455)
SPELL_CALL_AMPLIFY_MAGIC = 51054,
SPELL_CALL_AMPLIFY_MAGIC_2 = 59371
};
//not in db
enum Yells
{
SAY_AGGRO = -1578022,
SAY_KILL_1 = -1578023,
SAY_KILL_2 = -1578024,
SAY_DEATH = -1578025,
SAY_STRIKE_1 = -1578026,
SAY_STRIKE_2 = -1578027,
SAY_STRIKE_3 = -1578028,
SAY_SPAWN = -1578029
};
struct boss_varosAI : public ScriptedAI
{
boss_varosAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
void Reset()
{
if (pInstance)
pInstance->SetData(DATA_VAROS_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
pInstance->SetData(DATA_VAROS_EVENT, IN_PROGRESS);
}
void AttackStart(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
void UpdateAI(const uint32 /*diff*/)
{
//Return since we have no target
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
pInstance->SetData(DATA_VAROS_EVENT, DONE);
}
void KilledUnit(Unit * victim)
{
if (victim == me)
return;
DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2), me);
}
};
CreatureAI* GetAI_boss_varos(Creature* pCreature)
{
return new boss_varosAI (pCreature);
}
void AddSC_boss_varos()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_varos";
newscript->GetAI = &GetAI_boss_varos;
newscript->RegisterSelf();
}
@@ -0,0 +1,205 @@
/* Copyright (C) 2008 - 2010 TrinityCore <http://www.trinitycore.org>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "oculus.h"
#define MAX_ENCOUNTER 4
/* The Occulus encounters:
0 - Drakos the Interrogator
1 - Varos Cloudstrider
2 - Mage-Lord Urom
3 - Ley-Guardian Eregos */
struct instance_oculus : public ScriptedInstance
{
instance_oculus(Map* pMap) : ScriptedInstance(pMap) {Initialize();};
uint64 uiDrakos;
uint64 uiVaros;
uint64 uiUrom;
uint64 uiEregos;
uint8 uiPlataformUrom;
uint8 m_auiEncounter[MAX_ENCOUNTER];
std::string str_data;
std::list<uint64> GameObjectList;
void Initialize()
{
uiPlataformUrom = 0;
}
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
{
switch(pCreature->GetEntry())
{
case CREATURE_DRAKOS:
uiDrakos = pCreature->GetGUID();
break;
case CREATURE_VAROS:
uiVaros = pCreature->GetGUID();
break;
case CREATURE_UROM:
uiUrom = pCreature->GetGUID();
break;
case CREATURE_EREGOS:
uiEregos = pCreature->GetGUID();
break;
}
}
void OnGameObjectCreate(GameObject* pGO, bool bAdd)
{
if (pGO->GetEntry() == GO_DRAGON_CAGE_DOOR)
{
if (DATA_DRAKOS_EVENT == DONE)
pGO->SetGoState(GO_STATE_ACTIVE);
else
pGO->SetGoState(GO_STATE_READY);
GameObjectList.push_back(pGO->GetGUID());
}
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
case DATA_DRAKOS_EVENT:
m_auiEncounter[0] = data;
if (data == DONE)
OpenCageDoors();
break;
case DATA_VAROS_EVENT:
m_auiEncounter[1] = data;
break;
case DATA_UROM_EVENT:
m_auiEncounter[2] = data;
break;
case DATA_EREGOS_EVENT:
m_auiEncounter[3] = data;
break;
case DATA_UROM_PLATAFORM:
uiPlataformUrom = data;
break;
}
if (data == DONE)
SaveToDB();
}
uint32 GetData(uint32 type)
{
switch(type)
{
case DATA_DRAKOS_EVENT: return m_auiEncounter[0];
case DATA_VAROS_EVENT: return m_auiEncounter[1];
case DATA_UROM_EVENT: return m_auiEncounter[2];
case DATA_EREGOS_EVENT: return m_auiEncounter[3];
case DATA_UROM_PLATAFORM: return uiPlataformUrom;
}
return 0;
}
uint64 GetData64(uint32 identifier)
{
switch(identifier)
{
case DATA_DRAKOS: return uiDrakos;
case DATA_VAROS: return uiVaros;
case DATA_UROM: return uiUrom;
case DATA_EREGOS: return uiEregos;
}
return 0;
}
void OpenCageDoors()
{
if (GameObjectList.empty())
return;
for (std::list<uint64>::const_iterator itr = GameObjectList.begin(); itr != GameObjectList.end(); ++itr)
{
if (GameObject* pGO = instance->GetGameObject(*itr))
pGO->SetGoState(GO_STATE_ACTIVE);
}
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "T O " << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3];
str_data = saveStream.str();
OUT_SAVE_INST_DATA_COMPLETE;
return str_data;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
uint16 data0, data1, data2, data3;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3;
if (dataHead1 == 'T' && dataHead2 == 'O')
{
m_auiEncounter[0] = data0;
m_auiEncounter[1] = data1;
m_auiEncounter[2] = data2;
m_auiEncounter[3] = data3;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
m_auiEncounter[i] = NOT_STARTED;
} else OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
InstanceData* GetInstanceData_instance_oculus(Map* pMap)
{
return new instance_oculus(pMap);
}
void AddSC_instance_oculus()
{
Script *newscript;
newscript = new Script;
newscript->Name = "instance_oculus";
newscript->GetInstanceData = &GetInstanceData_instance_oculus;
newscript->RegisterSelf();
}
@@ -0,0 +1,174 @@
/* Copyright (C) 2006 - 2010 TrinityCore <http://www.trinitycore.org>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ScriptedPch.h"
#include "oculus.h"
#define GOSSIP_ITEM_DRAKES "So where do we go from here?"
#define GOSSIP_ITEM_BELGARISTRASZ1 "I want to fly on the wings of the Red Flight"
#define GOSSIP_ITEM_BELGARISTRASZ2 "What abilities do Ruby Drakes have?"
#define GOSSIP_ITEM_VERDISA1 "I want to fly on the wings of the Green Flight"
#define GOSSIP_ITEM_VERDISA2 "What abilities do Emerald Drakes have?"
#define GOSSIP_ITEM_ETERNOS1 "I want to fly on the wings of the Bronze Flight"
#define GOSSIP_ITEM_ETERNOS2 "What abilities do Amber Drakes have?"
#define HAS_ESSENCE(a) ((a)->HasItemCount(ITEM_EMERALD_ESSENCE,1) || (a)->HasItemCount(ITEM_AMBER_ESSENCE,1) || (a)->HasItemCount(ITEM_RUBY_ESSENCE,1))
enum Drakes
{
GOSSIP_TEXTID_DRAKES = 13267,
GOSSIP_TEXTID_BELGARISTRASZ1 = 12916,
GOSSIP_TEXTID_BELGARISTRASZ2 = 13466,
GOSSIP_TEXTID_BELGARISTRASZ3 = 13254,
GOSSIP_TEXTID_VERDISA1 = 1,
GOSSIP_TEXTID_VERDISA2 = 1,
GOSSIP_TEXTID_VERDISA3 = 1,
GOSSIP_TEXTID_ETERNOS1 = 1,
GOSSIP_TEXTID_ETERNOS2 = 1,
GOSSIP_TEXTID_ETERNOS3 = 13256,
ITEM_EMERALD_ESSENCE = 37815,
ITEM_AMBER_ESSENCE = 37859,
ITEM_RUBY_ESSENCE = 37860,
NPC_VERDISA = 27657,
NPC_BELGARISTRASZ = 27658,
NPC_ETERNOS = 27659
};
bool GossipHello_npc_oculus_drake(Player* pPlayer, Creature* pCreature)
{
if (pCreature->isQuestGiver())
pPlayer->PrepareQuestMenu(pCreature->GetGUID());
if (pCreature->GetInstanceData()->GetData(DATA_DRAKOS_EVENT) == DONE)
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_DRAKES, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_DRAKES, pCreature->GetGUID());
}
return true;
}
bool GossipSelect_npc_oculus_drake(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
switch(pCreature->GetEntry())
{
case NPC_VERDISA: //Verdisa
switch(uiAction)
{
case GOSSIP_ACTION_INFO_DEF + 1:
if (!HAS_ESSENCE(pPlayer))
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_VERDISA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_VERDISA2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_VERDISA1, pCreature->GetGUID());
}
else
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_VERDISA2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_VERDISA2, pCreature->GetGUID());
}
break;
case GOSSIP_ACTION_INFO_DEF + 2:
{
ItemPosCountVec dest;
uint8 msg = pPlayer->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_EMERALD_ESSENCE, 1);
if (msg == EQUIP_ERR_OK)
pPlayer->StoreNewItem(dest, ITEM_EMERALD_ESSENCE, true);
pPlayer->CLOSE_GOSSIP_MENU();
break;
}
case GOSSIP_ACTION_INFO_DEF + 3:
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_VERDISA3, pCreature->GetGUID());
break;
}
break;
case NPC_BELGARISTRASZ: //Belgaristrasz
switch(uiAction)
{
case GOSSIP_ACTION_INFO_DEF + 1:
if (!HAS_ESSENCE(pPlayer))
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BELGARISTRASZ1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BELGARISTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_BELGARISTRASZ1, pCreature->GetGUID());
}
else
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_BELGARISTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_BELGARISTRASZ2, pCreature->GetGUID());
}
break;
case GOSSIP_ACTION_INFO_DEF + 2:
{
ItemPosCountVec dest;
uint8 msg = pPlayer->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_RUBY_ESSENCE, 1);
if (msg == EQUIP_ERR_OK)
pPlayer->StoreNewItem(dest, ITEM_RUBY_ESSENCE, true);
pPlayer->CLOSE_GOSSIP_MENU();
break;
}
case GOSSIP_ACTION_INFO_DEF + 3:
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_BELGARISTRASZ3, pCreature->GetGUID());
break;
}
break;
case NPC_ETERNOS: //Eternos
switch(uiAction)
{
case GOSSIP_ACTION_INFO_DEF + 1:
if (!HAS_ESSENCE(pPlayer))
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ETERNOS1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ETERNOS2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ETERNOS1, pCreature->GetGUID());
}
else
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ETERNOS2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ETERNOS2, pCreature->GetGUID());
}
break;
case GOSSIP_ACTION_INFO_DEF + 2:
{
ItemPosCountVec dest;
uint8 msg = pPlayer->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_AMBER_ESSENCE, 1);
if (msg == EQUIP_ERR_OK)
pPlayer->StoreNewItem(dest, ITEM_AMBER_ESSENCE, true);
pPlayer->CLOSE_GOSSIP_MENU();
break;
}
case GOSSIP_ACTION_INFO_DEF + 3:
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ETERNOS3, pCreature->GetGUID());
break;
}
break;
}
return true;
}
void AddSC_oculus()
{
Script *newscript;
newscript = new Script;
newscript->Name = "npc_oculus_drake";
newscript->pGossipHello = &GossipHello_npc_oculus_drake;
newscript->pGossipSelect = &GossipSelect_npc_oculus_drake;
newscript->RegisterSelf();
}
@@ -0,0 +1,34 @@
#ifndef DEF_OCULUS_H
#define DEF_OCULUS_H
enum Data
{
DATA_DRAKOS_EVENT,
DATA_VAROS_EVENT,
DATA_UROM_EVENT,
DATA_EREGOS_EVENT,
DATA_UROM_PLATAFORM
};
enum Data64
{
DATA_DRAKOS,
DATA_VAROS,
DATA_UROM,
DATA_EREGOS
};
enum Bosses
{
CREATURE_DRAKOS = 27654,
CREATURE_VAROS = 27447,
CREATURE_UROM = 27655,
CREATURE_EREGOS = 27656
};
enum GameObjects
{
GO_DRAGON_CAGE_DOOR = 193995
};
#endif
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,97 @@
#include "ScriptedPch.h"
#include "obsidian_sanctum.h"
#define MAX_ENCOUNTER 1
/* Obsidian Sanctum encounters:
0 - Sartharion
*/
struct instance_obsidian_sanctum : public ScriptedInstance
{
instance_obsidian_sanctum(Map* pMap) : ScriptedInstance(pMap) {Initialize();};
uint32 m_auiEncounter[MAX_ENCOUNTER];
uint64 m_uiSartharionGUID;
uint64 m_uiTenebronGUID;
uint64 m_uiShadronGUID;
uint64 m_uiVesperonGUID;
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
m_uiSartharionGUID = 0;
m_uiTenebronGUID = 0;
m_uiShadronGUID = 0;
m_uiVesperonGUID = 0;
}
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
{
switch(pCreature->GetEntry())
{
case NPC_SARTHARION:
m_uiSartharionGUID = pCreature->GetGUID();
break;
//three dragons below set to active state once created.
//we must expect bigger raid to encounter main boss, and then three dragons must be active due to grid differences
case NPC_TENEBRON:
m_uiTenebronGUID = pCreature->GetGUID();
pCreature->setActive(true);
break;
case NPC_SHADRON:
m_uiShadronGUID = pCreature->GetGUID();
pCreature->setActive(true);
break;
case NPC_VESPERON:
m_uiVesperonGUID = pCreature->GetGUID();
pCreature->setActive(true);
break;
}
}
void SetData(uint32 uiType, uint32 uiData)
{
if (uiType == TYPE_SARTHARION_EVENT)
m_auiEncounter[0] = uiData;
}
uint32 GetData(uint32 uiType)
{
if (uiType == TYPE_SARTHARION_EVENT)
return m_auiEncounter[0];
return 0;
}
uint64 GetData64(uint32 uiData)
{
switch(uiData)
{
case DATA_SARTHARION:
return m_uiSartharionGUID;
case DATA_TENEBRON:
return m_uiTenebronGUID;
case DATA_SHADRON:
return m_uiShadronGUID;
case DATA_VESPERON:
return m_uiVesperonGUID;
}
return 0;
}
};
InstanceData* GetInstanceData_instance_obsidian_sanctum(Map* pMap)
{
return new instance_obsidian_sanctum(pMap);
}
void AddSC_instance_obsidian_sanctum()
{
Script *newscript;
newscript = new Script;
newscript->Name = "instance_obsidian_sanctum";
newscript->GetInstanceData = &GetInstanceData_instance_obsidian_sanctum;
newscript->RegisterSelf();
}
@@ -0,0 +1,20 @@
#ifndef DEF_OBSIDIAN_SANCTUM_H
#define DEF_OBSIDIAN_SANCTUM_H
enum eTypes
{
TYPE_SARTHARION_EVENT = 1,
DATA_SARTHARION = 10,
DATA_TENEBRON = 11,
DATA_SHADRON = 12,
DATA_VESPERON = 13,
NPC_SARTHARION = 28860,
NPC_TENEBRON = 30452,
NPC_SHADRON = 30451,
NPC_VESPERON = 30449,
GO_TWILIGHT_PORTAL = 193988
};
#endif
@@ -0,0 +1,449 @@
/* 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
*/
/* ScriptData
SDName: Sholazar_Basin
SD%Complete: 100
SDComment: Quest support: 12570, 12573, 12621.
SDCategory: Sholazar_Basin
EndScriptData */
/* ContentData
npc_injured_rainspeaker_oracle
npc_vekjik
avatar_of_freya
EndContentData */
#include "ScriptedPch.h"
#include "ScriptedEscortAI.h"
/*######
## npc_injured_rainspeaker_oracle
######*/
#define GOSSIP_ITEM1 "I am ready to travel to your village now."
enum eRainspeaker
{
SAY_START_IRO = -1571000,
SAY_QUEST_ACCEPT_IRO = -1571001,
SAY_END_IRO = -1571002,
QUEST_FORTUNATE_MISUNDERSTANDINGS = 12570,
FACTION_ESCORTEE_A = 774,
FACTION_ESCORTEE_H = 775
};
struct npc_injured_rainspeaker_oracleAI : public npc_escortAI
{
npc_injured_rainspeaker_oracleAI(Creature* c) : npc_escortAI(c) { c_guid = c->GetGUID(); }
uint64 c_guid;
void Reset()
{
me->RestoreFaction();
// if we will have other way to assign this to only one npc remove this part
if (GUID_LOPART(me->GetGUID()) != 101030)
{
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
}
}
void WaypointReached(uint32 i)
{
Player* pPlayer = GetPlayerForEscort();
if (!pPlayer)
return;
switch(i)
{
case 1: SetRun(); break;
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
me->RemoveUnitMovementFlag(MOVEMENTFLAG_SWIMMING);
me->RemoveUnitMovementFlag(MOVEMENTFLAG_JUMPING);
me->SetSpeed(MOVE_SWIM, 0.85f, true);
me->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_LEVITATING);
break;
case 19:
me->SetUnitMovementFlags(MOVEMENTFLAG_JUMPING);
break;
case 28:
if (Player* pPlayer = GetPlayerForEscort())
pPlayer->GroupEventHappens(QUEST_FORTUNATE_MISUNDERSTANDINGS, me);
// me->RestoreFaction();
DoScriptText(SAY_END_IRO,me);
SetRun(false);
break;
}
}
void JustDied(Unit* /*killer*/)
{
if (!HasEscortState(STATE_ESCORT_ESCORTING))
return;
if (Player* pPlayer = GetPlayerForEscort())
{
if (pPlayer->GetQuestStatus(QUEST_FORTUNATE_MISUNDERSTANDINGS) != QUEST_STATUS_COMPLETE)
pPlayer->FailQuest(QUEST_FORTUNATE_MISUNDERSTANDINGS);
}
}
};
bool GossipHello_npc_injured_rainspeaker_oracle(Player* pPlayer, Creature* pCreature)
{
if (pCreature->isQuestGiver())
pPlayer->PrepareQuestMenu(pCreature->GetGUID());
if (pPlayer->GetQuestStatus(QUEST_FORTUNATE_MISUNDERSTANDINGS) == QUEST_STATUS_INCOMPLETE)
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_injured_rainspeaker_oracle(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
if (uiAction == GOSSIP_ACTION_INFO_DEF+1)
{
CAST_AI(npc_escortAI, (pCreature->AI()))->Start(true, false, pPlayer->GetGUID());
CAST_AI(npc_escortAI, (pCreature->AI()))->SetMaxPlayerDistance(35.0f);
pCreature->SetUnitMovementFlags(MOVEMENTFLAG_JUMPING);
DoScriptText(SAY_START_IRO, pCreature);
switch (pPlayer->GetTeam()){
case ALLIANCE:
pCreature->setFaction(FACTION_ESCORTEE_A);
break;
case HORDE:
pCreature->setFaction(FACTION_ESCORTEE_H);
break;
}
}
return true;
}
bool QuestAccept_npc_injured_rainspeaker_oracle(Player* /*pPlayer*/, Creature* pCreature, Quest const * /*_Quest*/)
{
DoScriptText(SAY_QUEST_ACCEPT_IRO, pCreature);
return false;
}
CreatureAI* GetAI_npc_injured_rainspeaker_oracle(Creature* pCreature)
{
return new npc_injured_rainspeaker_oracleAI(pCreature);
}
/*######
## npc_vekjik
######*/
#define GOSSIP_VEKJIK_ITEM1 "Shaman Vekjik, I have spoken with the big-tongues and they desire peace. I have brought this offering on their behalf."
#define GOSSIP_VEKJIK_ITEM2 "No no... I had no intentions of betraying your people. I was only defending myself. it was all a misunderstanding."
enum eVekjik
{
GOSSIP_TEXTID_VEKJIK1 = 13137,
GOSSIP_TEXTID_VEKJIK2 = 13138,
SAY_TEXTID_VEKJIK1 = -1000208,
SPELL_FREANZYHEARTS_FURY = 51469,
QUEST_MAKING_PEACE = 12573
};
bool GossipHello_npc_vekjik(Player* pPlayer, Creature* pCreature)
{
if (pCreature->isQuestGiver())
pPlayer->PrepareQuestMenu(pCreature->GetGUID());
if (pPlayer->GetQuestStatus(QUEST_MAKING_PEACE) == QUEST_STATUS_INCOMPLETE)
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_VEKJIK1, pCreature->GetGUID());
return true;
}
pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_vekjik(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
switch(uiAction)
{
case GOSSIP_ACTION_INFO_DEF+1:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_VEKJIK2, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+2:
pPlayer->CLOSE_GOSSIP_MENU();
DoScriptText(SAY_TEXTID_VEKJIK1, pCreature, pPlayer);
pPlayer->AreaExploredOrEventHappens(QUEST_MAKING_PEACE);
pCreature->CastSpell(pPlayer, SPELL_FREANZYHEARTS_FURY, false);
break;
}
return true;
}
/*######
## avatar_of_freya
######*/
#define GOSSIP_ITEM_AOF1 "I want to stop the Scourge as much as you do. How can I help?"
#define GOSSIP_ITEM_AOF2 "You can trust me. I am no friend of the Lich King."
#define GOSSIP_ITEM_AOF3 "I will not fail."
enum eFreya
{
QUEST_FREYA_PACT = 12621,
SPELL_FREYA_CONVERSATION = 52045,
GOSSIP_TEXTID_AVATAR1 = 13303,
GOSSIP_TEXTID_AVATAR2 = 13304,
GOSSIP_TEXTID_AVATAR3 = 13305
};
bool GossipHello_npc_avatar_of_freya(Player* pPlayer, Creature* pCreature)
{
if (pCreature->isQuestGiver())
pPlayer->PrepareQuestMenu(pCreature->GetGUID());
if (pPlayer->GetQuestStatus(QUEST_FREYA_PACT) == QUEST_STATUS_INCOMPLETE)
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR1, pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_avatar_of_freya(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
switch (uiAction)
{
case GOSSIP_ACTION_INFO_DEF+1:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
pPlayer->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR2, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+2:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
pPlayer->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR3, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+3:
pPlayer->CastSpell(pPlayer, SPELL_FREYA_CONVERSATION, true);
pPlayer->CLOSE_GOSSIP_MENU();
break;
}
return true;
}
/*######
## npc_geezle
######*/
struct npc_bushwhackerAI : public ScriptedAI
{
npc_bushwhackerAI(Creature* pCreature) : ScriptedAI(pCreature)
{
MoveToSummoner();
}
void MoveToSummoner()
{
if (me->isSummon())
if (Unit* pSummoner = CAST_SUM(me)->GetSummoner())
if (pSummoner)
me->GetMotionMaster()->MovePoint(0,pSummoner->GetPositionX(),pSummoner->GetPositionY(),pSummoner->GetPositionZ());
}
void UpdateAI(const uint32 /*uiDiff*/)
{
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_npc_bushwhacker(Creature* pCreature)
{
return new npc_bushwhackerAI(pCreature);
}
/*######
## npc_engineer_helice
######*/
enum eEnums
{
SPELL_EXPLODE_CRYSTAL = 62487,
SPELL_FLAMES = 64561,
SAY_WP_7 = -1800047,
SAY_WP_6 = -1800048,
SAY_WP_5 = -1800049,
SAY_WP_4 = -1800050,
SAY_WP_3 = -1800051,
SAY_WP_2 = -1800052,
SAY_WP_1 = -1800053,
QUEST_DISASTER = 12688
};
struct npc_engineer_heliceAI : public npc_escortAI
{
npc_engineer_heliceAI(Creature* pCreature) : npc_escortAI(pCreature) { }
uint32 m_uiChatTimer;
void WaypointReached(uint32 i)
{
Player* pPlayer = GetPlayerForEscort();
switch (i)
{
case 0:
DoScriptText(SAY_WP_2, me);
break;
case 1:
DoScriptText(SAY_WP_3, me);
me->CastSpell(5918.33, 5372.91, -98.770, SPELL_EXPLODE_CRYSTAL, true);
me->SummonGameObject(184743, 5918.33, 5372.91, -98.770, 0, 0, 0, 0, 0, TEMPSUMMON_MANUAL_DESPAWN); //approx 3 to 4 seconds
me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH);
break;
case 2:
DoScriptText(SAY_WP_4, me);
break;
case 7:
DoScriptText(SAY_WP_5, me);
break;
case 8:
me->CastSpell(5887.37, 5379.39, -91.289, SPELL_EXPLODE_CRYSTAL, true);
me->SummonGameObject(184743, 5887.37, 5379.39, -91.289, 0, 0, 0, 0, 0, TEMPSUMMON_MANUAL_DESPAWN); //approx 3 to 4 seconds
me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH);
break;
case 9:
DoScriptText(SAY_WP_6, me);
break;
case 13:
if (pPlayer)
{
pPlayer->GroupEventHappens(QUEST_DISASTER, me);
DoScriptText(SAY_WP_7, me);
}
break;
}
}
void Reset()
{
m_uiChatTimer = 4000;
}
void JustDied(Unit* /*pKiller*/)
{
Player* pPlayer = GetPlayerForEscort();
if (HasEscortState(STATE_ESCORT_ESCORTING))
{
if (pPlayer)
pPlayer->FailQuest(QUEST_DISASTER);
}
}
void UpdateAI(const uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
if (HasEscortState(STATE_ESCORT_ESCORTING))
{
if (m_uiChatTimer <= uiDiff)
{
m_uiChatTimer = 12000;
}
else
m_uiChatTimer -= uiDiff;
}
}
};
CreatureAI* GetAI_npc_engineer_helice(Creature* pCreature)
{
return new npc_engineer_heliceAI(pCreature);
}
bool QuestAccept_npc_engineer_helice(Player* pPlayer, Creature* pCreature, const Quest* pQuest)
{
if (pQuest->GetQuestId() == QUEST_DISASTER)
{
if (npc_engineer_heliceAI* pEscortAI = CAST_AI(npc_engineer_heliceAI, pCreature->AI()))
{
pCreature->GetMotionMaster()->MoveJumpTo(0, 0.4, 0.4);
pCreature->setFaction(113);
pEscortAI->Start(false, false, pPlayer->GetGUID());
DoScriptText(SAY_WP_1, pCreature);
}
}
return true;
}
void AddSC_sholazar_basin()
{
Script *newscript;
newscript = new Script;
newscript->Name = "npc_injured_rainspeaker_oracle";
newscript->GetAI = &GetAI_npc_injured_rainspeaker_oracle;
newscript->pGossipHello = &GossipHello_npc_injured_rainspeaker_oracle;
newscript->pGossipSelect = &GossipSelect_npc_injured_rainspeaker_oracle;
newscript->pQuestAccept = &QuestAccept_npc_injured_rainspeaker_oracle;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_vekjik";
newscript->pGossipHello = &GossipHello_npc_vekjik;
newscript->pGossipSelect = &GossipSelect_npc_vekjik;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_avatar_of_freya";
newscript->pGossipHello = &GossipHello_npc_avatar_of_freya;
newscript->pGossipSelect = &GossipSelect_npc_avatar_of_freya;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_bushwhacker";
newscript->GetAI = &GetAI_npc_bushwhacker;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_engineer_helice";
newscript->GetAI = &GetAI_npc_engineer_helice;
newscript->pQuestAccept = &QuestAccept_npc_engineer_helice;
newscript->RegisterSelf();
}
@@ -0,0 +1,491 @@
/* 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 "ScriptedEscortAI.h"
/*######
## npc_agnetta_tyrsdottar
######*/
#define SAY_AGGRO -1571003
#define GOSSIP_AGNETTA "Skip the warmup, sister... or are you too scared to face soemeone your own size?"
enum eAgnetta
{
QUEST_ITS_THAT_YOUR_GOBLIN = 12969,
FACTION_HOSTILE_AT1 = 45
};
struct npc_agnetta_tyrsdottarAI : public ScriptedAI
{
npc_agnetta_tyrsdottarAI(Creature* pCreature) : ScriptedAI(pCreature) { }
void Reset()
{
me->RestoreFaction();
}
};
CreatureAI* GetAI_npc_agnetta_tyrsdottar(Creature* pCreature)
{
return new npc_agnetta_tyrsdottarAI(pCreature);
}
bool GossipHello_npc_agnetta_tyrsdottar(Player* pPlayer, Creature* pCreature)
{
if (pPlayer->GetQuestStatus(QUEST_ITS_THAT_YOUR_GOBLIN) == QUEST_STATUS_INCOMPLETE)
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_AGNETTA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(13691, pCreature->GetGUID());
return true;
}
bool GossipSelect_npc_agnetta_tyrsdottar(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
if (uiAction == GOSSIP_ACTION_INFO_DEF+1)
{
DoScriptText(SAY_AGGRO, pCreature);
pPlayer->CLOSE_GOSSIP_MENU();
pCreature->setFaction(FACTION_HOSTILE_AT1);
pCreature->AI()->AttackStart(pPlayer);
}
return true;
}
/*######
## npc_frostborn_scout
######*/
#define GOSSIP_ITEM1 "Are you okay? I've come to take you back to Frosthold if you can stand."
#define GOSSIP_ITEM2 "I'm sorry that I didn't get here sooner. What happened?"
#define GOSSIP_ITEM3 "I'll go get some help. Hang in there."
enum eFrostbornScout
{
QUEST_MISSING_SCOUTS = 12864
};
bool GossipHello_npc_frostborn_scout(Player* pPlayer, Creature* pCreature)
{
if (pPlayer->GetQuestStatus(QUEST_MISSING_SCOUTS) == QUEST_STATUS_INCOMPLETE)
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->PlayerTalkClass->SendGossipMenu(13611, pCreature->GetGUID());
}
return true;
}
bool GossipSelect_npc_frostborn_scout(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
switch (uiAction)
{
case GOSSIP_ACTION_INFO_DEF+1:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
pPlayer->PlayerTalkClass->SendGossipMenu(13612, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+2:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
pPlayer->PlayerTalkClass->SendGossipMenu(13613, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+3:
pPlayer->PlayerTalkClass->SendGossipMenu(13614, pCreature->GetGUID());
pPlayer->AreaExploredOrEventHappens(QUEST_MISSING_SCOUTS);
break;
}
return true;
}
/*######
## npc_thorim
######*/
#define GOSSIP_HN "Thorim?"
#define GOSSIP_SN1 "Can you tell me what became of Sif?"
#define GOSSIP_SN2 "He did more than that, Thorim. He controls Ulduar now."
#define GOSSIP_SN3 "It needn't end this way."
enum eThorim
{
QUEST_SIBLING_RIVALRY = 13064,
NPC_THORIM = 29445,
GOSSIP_TEXTID_THORIM1 = 13799,
GOSSIP_TEXTID_THORIM2 = 13801,
GOSSIP_TEXTID_THORIM3 = 13802,
GOSSIP_TEXTID_THORIM4 = 13803
};
bool GossipHello_npc_thorim(Player* pPlayer, Creature* pCreature)
{
if (pCreature->isQuestGiver())
pPlayer->PrepareQuestMenu(pCreature->GetGUID());
if (pPlayer->GetQuestStatus(QUEST_SIBLING_RIVALRY) == QUEST_STATUS_INCOMPLETE) {
pPlayer->ADD_GOSSIP_ITEM(0, GOSSIP_HN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_THORIM1, pCreature->GetGUID());
return true;
}
return false;
}
bool GossipSelect_npc_thorim(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
switch (uiAction)
{
case GOSSIP_ACTION_INFO_DEF+1:
pPlayer->ADD_GOSSIP_ITEM(0, GOSSIP_SN1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_THORIM2, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+2:
pPlayer->ADD_GOSSIP_ITEM(0, GOSSIP_SN2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_THORIM3, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+3:
pPlayer->ADD_GOSSIP_ITEM(0, GOSSIP_SN3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_THORIM4, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+4:
pPlayer->CLOSE_GOSSIP_MENU();
pPlayer->CompleteQuest(QUEST_SIBLING_RIVALRY);
break;
}
return true;
}
/*######
## npc_goblin_prisoner
######*/
enum eGoblinPrisoner
{
GO_RUSTY_CAGE = 191544
};
struct npc_goblin_prisonerAI : public ScriptedAI
{
npc_goblin_prisonerAI(Creature* pCreature) : ScriptedAI (pCreature){}
void Reset()
{
me->SetReactState(REACT_PASSIVE);
if (GameObject* pGO = me->FindNearestGameObject(GO_RUSTY_CAGE,5.0f))
{
if (pGO->GetGoState() == GO_STATE_ACTIVE)
pGO->SetGoState(GO_STATE_READY);
}
}
};
CreatureAI* GetAI_npc_goblin_prisoner(Creature* pCreature)
{
return new npc_goblin_prisonerAI(pCreature);
}
/*######
## npc_victorious_challenger
######*/
#define GOSSIP_CHALLENGER "Let's do this, sister."
enum eVictoriousChallenger
{
QUEST_TAKING_ALL_CHALLENGERS = 12971,
QUEST_DEFENDING_YOUR_TITLE = 13423,
SPELL_SUNDER_ARMOR = 11971,
SPELL_REND_VC = 11977
};
struct npc_victorious_challengerAI : public ScriptedAI
{
npc_victorious_challengerAI(Creature* pCreature) : ScriptedAI(pCreature) {}
uint32 SunderArmorTimer;
uint32 RendTimer;
void Reset()
{
me->RestoreFaction();
SunderArmorTimer = 10000;
RendTimer = 15000;
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (RendTimer < diff)
{
DoCast(me->getVictim(), SPELL_REND_VC, true);
RendTimer = 15000;
}else RendTimer -= diff;
if (SunderArmorTimer < diff)
{
DoCast(me->getVictim(), SPELL_SUNDER_ARMOR, true);
SunderArmorTimer = 10000;
}else SunderArmorTimer -= diff;
DoMeleeAttackIfReady();
}
void KilledUnit(Unit* /*victim*/)
{
me->RestoreFaction();
}
};
bool GossipHello_npc_victorious_challenger(Player* pPlayer, Creature* pCreature)
{
if (pCreature->isQuestGiver())
pPlayer->PrepareQuestMenu(pCreature->GetGUID());
if (pPlayer->GetQuestStatus(QUEST_TAKING_ALL_CHALLENGERS) == QUEST_STATUS_INCOMPLETE || pPlayer->GetQuestStatus(QUEST_DEFENDING_YOUR_TITLE) == QUEST_STATUS_INCOMPLETE)
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_CHALLENGER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
return true;
}
return false;
}
bool GossipSelect_npc_victorious_challenger(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
if (uiAction == GOSSIP_ACTION_INFO_DEF+1)
{
pPlayer->CLOSE_GOSSIP_MENU();
pCreature->setFaction(14);
pCreature->AI()->AttackStart(pPlayer);
}
return true;
}
CreatureAI* GetAI_npc_victorious_challenger(Creature* pCreature)
{
return new npc_victorious_challengerAI(pCreature);
}
/*######
## npc_loklira_crone
######*/
#define GOSSIP_LOKLIRACRONE "Tell me about this proposal"
#define GOSSIP_LOKLIRACRONE1 "What happened then?"
#define GOSSIP_LOKLIRACRONE2 "You want me to take part in the Hyldsmeet to end the war?"
#define GOSSIP_LOKLIRACRONE3 "Very well. I'll take part in this competition."
enum eLokliraCrone
{
QUEST_HYLDSMEET = 12970,
GOSSIP_TEXTID_LOK1 = 13778,
GOSSIP_TEXTID_LOK2 = 13779,
GOSSIP_TEXTID_LOK3 = 13780
};
bool GossipHello_npc_loklira_crone(Player* pPlayer, Creature* pCreature)
{
if (pCreature->isQuestGiver())
pPlayer->PrepareQuestMenu(pCreature->GetGUID());
if (pPlayer->GetQuestStatus(QUEST_HYLDSMEET) == QUEST_STATUS_INCOMPLETE)
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LOKLIRACRONE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
return true;
}
return false;
}
bool GossipSelect_npc_loklira_crone(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
switch (uiAction)
{
case GOSSIP_ACTION_INFO_DEF+1:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LOKLIRACRONE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_LOK1, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+2:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LOKLIRACRONE2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_LOK2, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+3:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LOKLIRACRONE3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4);
pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXTID_LOK3, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+4:
pPlayer->CLOSE_GOSSIP_MENU();
pPlayer->CompleteQuest(QUEST_HYLDSMEET);
break;
}
return true;
}
/////////////////////
///npc_injured_goblin
/////////////////////
enum eInjuredGoblin
{
QUEST_BITTER_DEPARTURE = 12832,
SAY_QUEST_ACCEPT = -1800042,
SAY_END_WP_REACHED = -1800043
};
#define GOSSIP_ITEM_1 "I am ready, lets get you out of here"
struct npc_injured_goblinAI : public npc_escortAI
{
npc_injured_goblinAI(Creature* pCreature) : npc_escortAI(pCreature) { }
void WaypointReached(uint32 i)
{
Player* pPlayer = GetPlayerForEscort();
switch (i)
{
case 26:
DoScriptText(SAY_END_WP_REACHED, me, pPlayer);
break;
case 27:
if (pPlayer)
pPlayer->GroupEventHappens(QUEST_BITTER_DEPARTURE, me);
break;
}
}
void EnterCombat(Unit* /*pWho*/) {}
void Reset() {}
void JustDied(Unit* /*pKiller*/)
{
Player* pPlayer = GetPlayerForEscort();
if (HasEscortState(STATE_ESCORT_ESCORTING) && pPlayer)
pPlayer->FailQuest(QUEST_BITTER_DEPARTURE);
}
void UpdateAI(const uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_npc_injured_goblin(Creature* pCreature)
{
return new npc_injured_goblinAI(pCreature);
}
bool GossipHello_npc_injured_goblin(Player* pPlayer, Creature* pCreature)
{
if (pCreature->isQuestGiver())
pPlayer->PrepareQuestMenu(pCreature->GetGUID());
if (pPlayer->GetQuestStatus(QUEST_BITTER_DEPARTURE) == QUEST_STATUS_INCOMPLETE)
{
pPlayer->ADD_GOSSIP_ITEM(0, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->PlayerTalkClass->SendGossipMenu(9999999, pCreature->GetGUID());
}
else
pPlayer->SEND_GOSSIP_MENU(999999, pCreature->GetGUID());
return true;
}
bool QuestAccept_npc_injured_goblin(Player* /*pPlayer*/, Creature* pCreature, Quest const *quest)
{
if (quest->GetQuestId() == QUEST_BITTER_DEPARTURE)
DoScriptText(SAY_QUEST_ACCEPT, pCreature);
return false;
}
bool GossipSelect_npc_injured_goblin(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
npc_escortAI* pEscortAI = CAST_AI(npc_injured_goblinAI, pCreature->AI());
if (uiAction == GOSSIP_ACTION_INFO_DEF+1)
{
pEscortAI->Start(true, true, pPlayer->GetGUID());
pCreature->setFaction(113);
}
return true;
}
void AddSC_storm_peaks()
{
Script* newscript;
newscript = new Script;
newscript->Name = "npc_agnetta_tyrsdottar";
newscript->GetAI = &GetAI_npc_agnetta_tyrsdottar;
newscript->pGossipHello = &GossipHello_npc_agnetta_tyrsdottar;
newscript->pGossipSelect = &GossipSelect_npc_agnetta_tyrsdottar;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_frostborn_scout";
newscript->pGossipHello = &GossipHello_npc_frostborn_scout;
newscript->pGossipSelect = &GossipSelect_npc_frostborn_scout;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_thorim";
newscript->pGossipHello = &GossipHello_npc_thorim;
newscript->pGossipSelect = &GossipSelect_npc_thorim;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_goblin_prisoner";
newscript->GetAI = &GetAI_npc_goblin_prisoner;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_victorious_challenger";
newscript->GetAI = &GetAI_npc_victorious_challenger;
newscript->pGossipHello = &GossipHello_npc_victorious_challenger;
newscript->pGossipSelect = &GossipSelect_npc_victorious_challenger;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_loklira_crone";
newscript->pGossipHello = &GossipHello_npc_loklira_crone;
newscript->pGossipSelect = &GossipSelect_npc_loklira_crone;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_injured_goblin";
newscript->GetAI = &GetAI_npc_injured_goblin;
newscript->pGossipHello = &GossipHello_npc_injured_goblin;
newscript->pGossipSelect = &GossipSelect_npc_injured_goblin;
newscript->pQuestAccept = &QuestAccept_npc_injured_goblin;
newscript->RegisterSelf();
}
@@ -0,0 +1,432 @@
/* 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 General Bjarngrim
SD%Complete: 70%
SDComment: Waypoint needed, we expect boss to always have 2x Stormforged Lieutenant following
SDCategory: Halls of Lightning
EndScriptData */
#include "ScriptedPch.h"
#include "halls_of_lightning.h"
enum eEnums
{
//Yell
SAY_AGGRO = -1602000,
SAY_SLAY_1 = -1602001,
SAY_SLAY_2 = -1602002,
SAY_SLAY_3 = -1602003,
SAY_DEATH = -1602004,
SAY_BATTLE_STANCE = -1602005,
EMOTE_BATTLE_STANCE = -1602006,
SAY_BERSEKER_STANCE = -1602007,
EMOTE_BERSEKER_STANCE = -1602008,
SAY_DEFENSIVE_STANCE = -1602009,
EMOTE_DEFENSIVE_STANCE = -1602010,
SPELL_DEFENSIVE_STANCE = 53790,
//SPELL_DEFENSIVE_AURA = 41105,
SPELL_SPELL_REFLECTION = 36096,
SPELL_PUMMEL = 12555,
SPELL_KNOCK_AWAY = 52029,
SPELL_IRONFORM = 52022,
SPELL_BERSEKER_STANCE = 53791,
//SPELL_BERSEKER_AURA = 41107,
SPELL_INTERCEPT = 58769,
SPELL_WHIRLWIND = 52027,
SPELL_CLEAVE = 15284,
SPELL_BATTLE_STANCE = 53792,
//SPELL_BATTLE_AURA = 41106,
SPELL_MORTAL_STRIKE = 16856,
SPELL_SLAM = 52026,
//OTHER SPELLS
//SPELL_CHARGE_UP = 52098, // only used when starting walk from one platform to the other
//SPELL_TEMPORARY_ELECTRICAL_CHARGE = 52092, // triggered part of above
NPC_STORMFORGED_LIEUTENANT = 29240,
SPELL_ARC_WELD = 59085,
SPELL_RENEW_STEEL_N = 52774,
SPELL_RENEW_STEEL_H = 59160,
EQUIP_SWORD = 37871,
EQUIP_SHIELD = 35642,
EQUIP_MACE = 43623,
STANCE_DEFENSIVE = 0,
STANCE_BERSERKER = 1,
STANCE_BATTLE = 2
};
/*######
## boss_bjarngrim
######*/
struct boss_bjarngrimAI : public ScriptedAI
{
boss_bjarngrimAI(Creature *pCreature) : ScriptedAI(pCreature)
{
m_pInstance = pCreature->GetInstanceData();
m_uiStance = STANCE_DEFENSIVE;
memset(&m_auiStormforgedLieutenantGUID, 0, sizeof(m_auiStormforgedLieutenantGUID));
}
ScriptedInstance* m_pInstance;
bool m_bIsChangingStance;
uint8 m_uiChargingStatus;
uint8 m_uiStance;
uint32 m_uiCharge_Timer;
uint32 m_uiChangeStance_Timer;
uint32 m_uiReflection_Timer;
uint32 m_uiKnockAway_Timer;
uint32 m_uiPummel_Timer;
uint32 m_uiIronform_Timer;
uint32 m_uiIntercept_Timer;
uint32 m_uiWhirlwind_Timer;
uint32 m_uiCleave_Timer;
uint32 m_uiMortalStrike_Timer;
uint32 m_uiSlam_Timer;
uint64 m_auiStormforgedLieutenantGUID[2];
void Reset()
{
m_bIsChangingStance = false;
m_uiChargingStatus = 0;
m_uiCharge_Timer = 1000;
m_uiChangeStance_Timer = 20000 + rand()%5000;
m_uiReflection_Timer = 8000;
m_uiKnockAway_Timer = 20000;
m_uiPummel_Timer = 10000;
m_uiIronform_Timer = 25000;
m_uiIntercept_Timer = 5000;
m_uiWhirlwind_Timer = 10000;
m_uiCleave_Timer = 8000;
m_uiMortalStrike_Timer = 8000;
m_uiSlam_Timer = 10000;
for (uint8 i = 0; i < 2; ++i)
{
if (Creature* pStormforgedLieutenant = (Unit::GetCreature((*me), m_auiStormforgedLieutenantGUID[i])))
{
if (!pStormforgedLieutenant->isAlive())
pStormforgedLieutenant->Respawn();
}
}
if (m_uiStance != STANCE_DEFENSIVE)
{
DoRemoveStanceAura(m_uiStance);
DoCast(me, SPELL_DEFENSIVE_STANCE);
m_uiStance = STANCE_DEFENSIVE;
}
SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SHIELD, EQUIP_NO_CHANGE);
if (m_pInstance)
m_pInstance->SetData(TYPE_BJARNGRIM, NOT_STARTED);
}
void EnterCombat(Unit* /*pWho*/)
{
DoScriptText(SAY_AGGRO, me);
//must get both lieutenants here and make sure they are with him
me->CallForHelp(30.0f);
if (m_pInstance)
m_pInstance->SetData(TYPE_BJARNGRIM, IN_PROGRESS);
}
void KilledUnit(Unit* /*pVictim*/)
{
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), me);
}
void JustDied(Unit* /*pKiller*/)
{
DoScriptText(SAY_DEATH, me);
if (m_pInstance)
m_pInstance->SetData(TYPE_BJARNGRIM, DONE);
}
//TODO: remove when removal is done by the core
void DoRemoveStanceAura(uint8 uiStance)
{
switch(uiStance)
{
case STANCE_DEFENSIVE:
me->RemoveAurasDueToSpell(SPELL_DEFENSIVE_STANCE);
break;
case STANCE_BERSERKER:
me->RemoveAurasDueToSpell(SPELL_BERSEKER_STANCE);
break;
case STANCE_BATTLE:
me->RemoveAurasDueToSpell(SPELL_BATTLE_STANCE);
break;
}
}
void UpdateAI(const uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
return;
// Change stance
if (m_uiChangeStance_Timer <= uiDiff)
{
//wait for current spell to finish before change stance
if (me->IsNonMeleeSpellCasted(false))
return;
DoRemoveStanceAura(m_uiStance);
int uiTempStance = rand()%(3-1);
if (uiTempStance >= m_uiStance)
++uiTempStance;
m_uiStance = uiTempStance;
switch(m_uiStance)
{
case STANCE_DEFENSIVE:
DoScriptText(SAY_DEFENSIVE_STANCE, me);
DoScriptText(EMOTE_DEFENSIVE_STANCE, me);
DoCast(me, SPELL_DEFENSIVE_STANCE);
SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SHIELD, EQUIP_NO_CHANGE);
break;
case STANCE_BERSERKER:
DoScriptText(SAY_BERSEKER_STANCE, me);
DoScriptText(EMOTE_BERSEKER_STANCE, me);
DoCast(me, SPELL_BERSEKER_STANCE);
SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SWORD, EQUIP_NO_CHANGE);
break;
case STANCE_BATTLE:
DoScriptText(SAY_BATTLE_STANCE, me);
DoScriptText(EMOTE_BATTLE_STANCE, me);
DoCast(me, SPELL_BATTLE_STANCE);
SetEquipmentSlots(false, EQUIP_MACE, EQUIP_UNEQUIP, EQUIP_NO_CHANGE);
break;
}
m_uiChangeStance_Timer = 20000 + rand()%5000;
return;
}
else
m_uiChangeStance_Timer -= uiDiff;
switch(m_uiStance)
{
case STANCE_DEFENSIVE:
{
if (m_uiReflection_Timer <= uiDiff)
{
DoCast(me, SPELL_SPELL_REFLECTION);
m_uiReflection_Timer = 8000 + rand()%1000;
}
else
m_uiReflection_Timer -= uiDiff;
if (m_uiKnockAway_Timer <= uiDiff)
{
DoCast(me, SPELL_KNOCK_AWAY);
m_uiKnockAway_Timer = 20000 + rand()%1000;
}
else
m_uiKnockAway_Timer -= uiDiff;
if (m_uiPummel_Timer <= uiDiff)
{
DoCast(me->getVictim(), SPELL_PUMMEL);
m_uiPummel_Timer = 10000 + rand()%1000;
}
else
m_uiPummel_Timer -= uiDiff;
if (m_uiIronform_Timer <= uiDiff)
{
DoCast(me, SPELL_IRONFORM);
m_uiIronform_Timer = 25000 + rand()%1000;
}
else
m_uiIronform_Timer -= uiDiff;
break;
}
case STANCE_BERSERKER:
{
if (m_uiIntercept_Timer <= uiDiff)
{
//not much point is this, better random target and more often?
DoCast(me->getVictim(), SPELL_INTERCEPT);
m_uiIntercept_Timer = 45000 + rand()%1000;
}
else
m_uiIntercept_Timer -= uiDiff;
if (m_uiWhirlwind_Timer <= uiDiff)
{
DoCast(me, SPELL_WHIRLWIND);
m_uiWhirlwind_Timer = 10000 + rand()%1000;
}
else
m_uiWhirlwind_Timer -= uiDiff;
if (m_uiCleave_Timer <= uiDiff)
{
DoCast(me->getVictim(), SPELL_CLEAVE);
m_uiCleave_Timer = 8000 + rand()%1000;
}
else
m_uiCleave_Timer -= uiDiff;
break;
}
case STANCE_BATTLE:
{
if (m_uiMortalStrike_Timer <= uiDiff)
{
DoCast(me->getVictim(), SPELL_MORTAL_STRIKE);
m_uiMortalStrike_Timer = 20000 + rand()%1000;
}
else
m_uiMortalStrike_Timer -= uiDiff;
if (m_uiSlam_Timer <= uiDiff)
{
DoCast(me->getVictim(), SPELL_SLAM);
m_uiSlam_Timer = 15000 + rand()%1000;
}
else
m_uiSlam_Timer -= uiDiff;
break;
}
}
DoMeleeAttackIfReady();
}
};
/*######
## mob_stormforged_lieutenant
######*/
struct mob_stormforged_lieutenantAI : public ScriptedAI
{
mob_stormforged_lieutenantAI(Creature *pCreature) : ScriptedAI(pCreature)
{
m_pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* m_pInstance;
uint32 m_uiArcWeld_Timer;
uint32 m_uiRenewSteel_Timer;
void Reset()
{
m_uiArcWeld_Timer = 20000 + rand()%1000;
m_uiRenewSteel_Timer = 10000 + rand()%1000;
}
void EnterCombat(Unit* pWho)
{
if (m_pInstance)
{
if (Creature* pBjarngrim = m_pInstance->instance->GetCreature(m_pInstance->GetData64(DATA_BJARNGRIM)))
{
if (pBjarngrim->isAlive() && !pBjarngrim->getVictim())
pBjarngrim->AI()->AttackStart(pWho);
}
}
}
void UpdateAI(const uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (m_uiArcWeld_Timer <= uiDiff)
{
DoCast(me->getVictim(), SPELL_ARC_WELD);
m_uiArcWeld_Timer = 20000 + rand()%1000;
}
else
m_uiArcWeld_Timer -= uiDiff;
if (m_uiRenewSteel_Timer <= uiDiff)
{
if (m_pInstance)
{
if (Creature* pBjarngrim = m_pInstance->instance->GetCreature(m_pInstance->GetData64(DATA_BJARNGRIM)))
{
if (pBjarngrim->isAlive())
DoCast(pBjarngrim, SPELL_RENEW_STEEL_N);
}
}
m_uiRenewSteel_Timer = 10000 + rand()%4000;
}
else
m_uiRenewSteel_Timer -= uiDiff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_bjarngrim(Creature* pCreature)
{
return new boss_bjarngrimAI(pCreature);
}
CreatureAI* GetAI_mob_stormforged_lieutenant(Creature* pCreature)
{
return new mob_stormforged_lieutenantAI(pCreature);
}
void AddSC_boss_bjarngrim()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_bjarngrim";
newscript->GetAI = &GetAI_boss_bjarngrim;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_stormforged_lieutenant";
newscript->GetAI = &GetAI_mob_stormforged_lieutenant;
newscript->RegisterSelf();
}
@@ -0,0 +1,388 @@
/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* Copyright (C) 2008 - 2010 TrinityCore <http://www.trinitycore.org/>
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* Comment: Timer check pending
*/
#include "ScriptedPch.h"
#include "halls_of_lightning.h"
enum Spells
{
SPELL_BALL_LIGHTNING = 52780,
H_SPELL_BALL_LIGHTNING = 59800,
SPELL_STATIC_OVERLOAD = 52658,
H_SPELL_STATIC_OVERLOAD = 59795,
SPELL_DISPERSE = 52770,
SPELL_SUMMON_SPARK = 52746,
SPELL_SPARK_DESPAWN = 52776,
//Spark of Ionar
SPELL_SPARK_VISUAL_TRIGGER = 52667,
H_SPELL_SPARK_VISUAL_TRIGGER = 59833
};
enum Yells
{
SAY_AGGRO = -1602011,
SAY_SLAY_1 = -1602012,
SAY_SLAY_2 = -1602013,
SAY_SLAY_3 = -1602014,
SAY_DEATH = -1602015,
SAY_SPLIT_1 = -1602016,
SAY_SPLIT_2 = -1602017
};
enum Creatures
{
NPC_SPARK_OF_IONAR = 28926
};
enum Misc
{
DATA_MAX_SPARKS = 5,
DATA_MAX_SPARK_DISTANCE = 90, // Distance to boss - prevent runs through the whole instance
DATA_POINT_CALLBACK = 0
};
/*######
## Boss Ionar
######*/
struct boss_ionarAI : public ScriptedAI
{
boss_ionarAI(Creature *pCreature) : ScriptedAI(pCreature), lSparkList(pCreature)
{
pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* pInstance;
SummonList lSparkList;
bool bIsSplitPhase;
bool bHasDispersed;
uint32 uiSplitTimer;
uint32 uiStaticOverloadTimer;
uint32 uiBallLightningTimer;
uint32 uiDisperseHealth;
void Reset()
{
lSparkList.DespawnAll();
bIsSplitPhase = true;
bHasDispersed = false;
uiSplitTimer = 25*IN_MILISECONDS;
uiStaticOverloadTimer = urand(5*IN_MILISECONDS, 6*IN_MILISECONDS);
uiBallLightningTimer = urand(10*IN_MILISECONDS, 11*IN_MILISECONDS);
uiDisperseHealth = 45 + urand(0,10);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_DISABLE_MOVE);
if (me->GetVisibility() == VISIBILITY_OFF)
me->SetVisibility(VISIBILITY_ON);
if (pInstance)
pInstance->SetData(TYPE_IONAR, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
if (pInstance)
pInstance->SetData(TYPE_IONAR, IN_PROGRESS);
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
lSparkList.DespawnAll();
if (pInstance)
pInstance->SetData(TYPE_IONAR, DONE);
}
void KilledUnit(Unit * /*victim*/)
{
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), me);
}
//make sparks come back
void CallBackSparks()
{
//should never be empty here, but check
if (lSparkList.empty())
return;
Position pos;
me->GetPosition(&pos);
for (std::list<uint64>::const_iterator itr = lSparkList.begin(); itr != lSparkList.end(); ++itr)
{
if (Creature* pSpark = Unit::GetCreature(*me, *itr))
{
if (pSpark->isAlive())
{
pSpark->SetSpeed(MOVE_RUN, 2.0f);
pSpark->GetMotionMaster()->Clear();
pSpark->GetMotionMaster()->MovePoint(DATA_POINT_CALLBACK, pos);
}
else
pSpark->ForcedDespawn();
}
}
}
void DamageTaken(Unit * /*pDoneBy*/, uint32 &uiDamage)
{
if (me->GetVisibility() == VISIBILITY_OFF)
uiDamage = 0;
}
void JustSummoned(Creature* pSummoned)
{
if (pSummoned->GetEntry() == NPC_SPARK_OF_IONAR)
{
lSparkList.Summon(pSummoned);
pSummoned->CastSpell(pSummoned, DUNGEON_MODE(SPELL_SPARK_VISUAL_TRIGGER,H_SPELL_SPARK_VISUAL_TRIGGER), true);
Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0);
if (pTarget)
{
pSummoned->SetInCombatWith(pTarget);
pSummoned->GetMotionMaster()->Clear();
pSummoned->GetMotionMaster()->MoveFollow(pTarget, 0.0f, 0.0f);
}
}
}
void SummonedCreatureDespawn(Creature *pSummoned)
{
if (pSummoned->GetEntry() == NPC_SPARK_OF_IONAR)
lSparkList.Despawn(pSummoned);
}
void UpdateAI(const uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
return;
// Splitted
if (me->GetVisibility() == VISIBILITY_OFF)
{
if (uiSplitTimer <= uiDiff)
{
uiSplitTimer = 2.5*IN_MILISECONDS;
// Return sparks to where Ionar splitted
if (bIsSplitPhase)
{
CallBackSparks();
bIsSplitPhase = false;
}
// Lightning effect and restore Ionar
else if (lSparkList.empty())
{
me->SetVisibility(VISIBILITY_ON);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_DISABLE_MOVE);
DoCast(me, SPELL_SPARK_DESPAWN, false);
uiSplitTimer = 25*IN_MILISECONDS;
bIsSplitPhase = true;
if (me->getVictim())
me->GetMotionMaster()->MoveChase(me->getVictim());
}
}
else
uiSplitTimer -= uiDiff;
return;
}
if (uiStaticOverloadTimer <= uiDiff)
{
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_STATIC_OVERLOAD);
uiStaticOverloadTimer = urand(5*IN_MILISECONDS, 6*IN_MILISECONDS);
}
else
uiStaticOverloadTimer -= uiDiff;
if (uiBallLightningTimer <= uiDiff)
{
DoCast(me->getVictim(), SPELL_BALL_LIGHTNING);
uiBallLightningTimer = urand(10*IN_MILISECONDS, 11*IN_MILISECONDS);
}
else
uiBallLightningTimer -= uiDiff;
// Health check
if (!bHasDispersed && HealthBelowPct(uiDisperseHealth))
{
bHasDispersed = true;
DoScriptText(RAND(SAY_SPLIT_1,SAY_SPLIT_2), me);
if (me->IsNonMeleeSpellCasted(false))
me->InterruptNonMeleeSpells(false);
DoCast(me, SPELL_DISPERSE, true);
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_ionar(Creature* pCreature)
{
return new boss_ionarAI(pCreature);
}
bool EffectDummyCreature_boss_ionar(Unit* /*pCaster*/, uint32 uiSpellId, uint32 uiEffIndex, Creature* pCreatureTarget)
{
//always check spellid and effectindex
if (uiSpellId == SPELL_DISPERSE && uiEffIndex == 0)
{
if (pCreatureTarget->GetEntry() != NPC_IONAR)
return true;
for (uint8 i = 0; i < DATA_MAX_SPARKS; ++i)
pCreatureTarget->CastSpell(pCreatureTarget, SPELL_SUMMON_SPARK, true);
pCreatureTarget->AttackStop();
pCreatureTarget->SetVisibility(VISIBILITY_OFF);
pCreatureTarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_DISABLE_MOVE);
pCreatureTarget->GetMotionMaster()->Clear();
pCreatureTarget->GetMotionMaster()->MoveIdle();
//always return true when we are handling this spell and effect
return true;
}
return false;
}
/*######
## mob_spark_of_ionar
######*/
struct mob_spark_of_ionarAI : public ScriptedAI
{
mob_spark_of_ionarAI(Creature *pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* pInstance;
uint32 uiCheckTimer;
void Reset()
{
uiCheckTimer = 2*IN_MILISECONDS;
me->SetReactState(REACT_PASSIVE);
}
void MovementInform(uint32 uiType, uint32 uiPointId)
{
if (uiType != POINT_MOTION_TYPE || !pInstance)
return;
if (uiPointId == DATA_POINT_CALLBACK)
me->ForcedDespawn();
}
void DamageTaken(Unit * /*pDoneBy*/, uint32 &uiDamage)
{
uiDamage = 0;
}
void UpdateAI(const uint32 uiDiff)
{
// Despawn if the encounter is not running
if (pInstance && pInstance->GetData(TYPE_IONAR) != IN_PROGRESS)
{
me->ForcedDespawn();
return;
}
// Prevent them to follow players through the whole instance
if (uiCheckTimer <= uiDiff)
{
if (pInstance)
{
Creature* pIonar = pInstance->instance->GetCreature(pInstance->GetData64(DATA_IONAR));
if (pIonar && pIonar->isAlive())
{
if (me->GetDistance(pIonar) > DATA_MAX_SPARK_DISTANCE)
{
Position pos;
pIonar->GetPosition(&pos);
me->SetSpeed(MOVE_RUN, 2.0f);
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MovePoint(DATA_POINT_CALLBACK, pos);
}
}
else
me->ForcedDespawn();
}
uiCheckTimer = 2*IN_MILISECONDS;
}
else
uiCheckTimer -= uiDiff;
// No melee attack at all!
}
};
CreatureAI* GetAI_mob_spark_of_ionar(Creature* pCreature)
{
return new mob_spark_of_ionarAI(pCreature);
}
void AddSC_boss_ionar()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_ionar";
newscript->GetAI = &GetAI_boss_ionar;
newscript->pEffectDummyCreature = &EffectDummyCreature_boss_ionar;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_spark_of_ionar";
newscript->GetAI = &GetAI_mob_spark_of_ionar;
newscript->RegisterSelf();
}
@@ -0,0 +1,222 @@
/* 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 Loken
SD%Complete: 60%
SDComment: Missing intro. Remove hack of Pulsing Shockwave when core supports. Aura is not working (59414)
SDCategory: Halls of Lightning
EndScriptData */
#include "ScriptedPch.h"
#include "halls_of_lightning.h"
enum eEnums
{
ACHIEV_TIMELY_DEATH_START_EVENT = 20384,
SAY_AGGRO = -1602018,
SAY_INTRO_1 = -1602019,
SAY_INTRO_2 = -1602020,
SAY_SLAY_1 = -1602021,
SAY_SLAY_2 = -1602022,
SAY_SLAY_3 = -1602023,
SAY_DEATH = -1602024,
SAY_NOVA_1 = -1602025,
SAY_NOVA_2 = -1602026,
SAY_NOVA_3 = -1602027,
SAY_75HEALTH = -1602028,
SAY_50HEALTH = -1602029,
SAY_25HEALTH = -1602030,
EMOTE_NOVA = -1602031,
SPELL_ARC_LIGHTNING = 52921,
SPELL_LIGHTNING_NOVA_N = 52960,
SPELL_LIGHTNING_NOVA_H = 59835,
SPELL_PULSING_SHOCKWAVE_N = 52961,
SPELL_PULSING_SHOCKWAVE_H = 59836,
SPELL_PULSING_SHOCKWAVE_AURA = 59414
};
/*######
## Boss Loken
######*/
struct boss_lokenAI : public ScriptedAI
{
boss_lokenAI(Creature* pCreature) : ScriptedAI(pCreature)
{
m_pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* m_pInstance;
bool m_bIsAura;
uint32 m_uiArcLightning_Timer;
uint32 m_uiLightningNova_Timer;
uint32 m_uiPulsingShockwave_Timer;
uint32 m_uiResumePulsingShockwave_Timer;
uint32 m_uiHealthAmountModifier;
void Reset()
{
m_bIsAura = false;
m_uiArcLightning_Timer = 15000;
m_uiLightningNova_Timer = 20000;
m_uiPulsingShockwave_Timer = 2000;
m_uiResumePulsingShockwave_Timer = 15000;
m_uiHealthAmountModifier = 1;
if (m_pInstance)
{
m_pInstance->SetData(TYPE_LOKEN, NOT_STARTED);
m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT);
}
}
void EnterCombat(Unit* /*pWho*/)
{
DoScriptText(SAY_AGGRO, me);
if (m_pInstance)
{
m_pInstance->SetData(TYPE_LOKEN, IN_PROGRESS);
m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT);
}
}
void JustDied(Unit* /*pKiller*/)
{
DoScriptText(SAY_DEATH, me);
if (m_pInstance)
m_pInstance->SetData(TYPE_LOKEN, DONE);
}
void KilledUnit(Unit* /*pVictim*/)
{
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), me);
}
void UpdateAI(const uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (m_bIsAura)
{
// workaround for PULSING_SHOCKWAVE
if (m_uiPulsingShockwave_Timer <= uiDiff)
{
Map* pMap = me->GetMap();
if (pMap->IsDungeon())
{
Map::PlayerList const &PlayerList = pMap->GetPlayers();
if (PlayerList.isEmpty())
return;
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
if (i->getSource() && i->getSource()->isAlive() && i->getSource()->isTargetableForAttack())
{
int32 dmg;
float m_fDist = me->GetExactDist(i->getSource()->GetPositionX(), i->getSource()->GetPositionY(), i->getSource()->GetPositionZ());
dmg = DUNGEON_MODE(100, 150); // need to correct damage
if (m_fDist > 1.0f) // Further from 1 yard
dmg *= m_fDist;
me->CastCustomSpell(i->getSource(), DUNGEON_MODE(52942, 59837), &dmg, 0, 0, false);
}
}
m_uiPulsingShockwave_Timer = 2000;
} else m_uiPulsingShockwave_Timer -= uiDiff;
}
else
{
if (m_uiResumePulsingShockwave_Timer <= uiDiff)
{
//breaks at movement, can we assume when it's time, this spell is casted and also must stop movement?
DoCast(me, SPELL_PULSING_SHOCKWAVE_AURA, true);
DoCast(me, SPELL_PULSING_SHOCKWAVE_N); // need core support
m_bIsAura = true;
m_uiResumePulsingShockwave_Timer = 0;
}
else
m_uiResumePulsingShockwave_Timer -= uiDiff;
}
if (m_uiArcLightning_Timer <= uiDiff)
{
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_ARC_LIGHTNING);
m_uiArcLightning_Timer = 15000 + rand()%1000;
}
else
m_uiArcLightning_Timer -= uiDiff;
if (m_uiLightningNova_Timer <= uiDiff)
{
DoScriptText(RAND(SAY_NOVA_1,SAY_NOVA_2,SAY_NOVA_3), me);
DoScriptText(EMOTE_NOVA, me);
DoCast(me, SPELL_LIGHTNING_NOVA_N);
m_bIsAura = false;
m_uiResumePulsingShockwave_Timer = DUNGEON_MODE(5000, 4000); // Pause Pulsing Shockwave aura
m_uiLightningNova_Timer = 20000 + rand()%1000;
}
else
m_uiLightningNova_Timer -= uiDiff;
// Health check
if ((me->GetHealth()*100 / me->GetMaxHealth()) < (100-(25*m_uiHealthAmountModifier)))
{
switch(m_uiHealthAmountModifier)
{
case 1: DoScriptText(SAY_75HEALTH, me); break;
case 2: DoScriptText(SAY_50HEALTH, me); break;
case 3: DoScriptText(SAY_25HEALTH, me); break;
}
++m_uiHealthAmountModifier;
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_loken(Creature* pCreature)
{
return new boss_lokenAI(pCreature);
}
void AddSC_boss_loken()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_loken";
newscript->GetAI = &GetAI_boss_loken;
newscript->RegisterSelf();
}
@@ -0,0 +1,478 @@
/* 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 Volkhan
SD%Complete: 60%
SDComment: Not considered complete. Some events may fail and need further development
SDCategory: Halls of Lightning
EndScriptData */
#include "ScriptedPch.h"
#include "halls_of_lightning.h"
enum eEnums
{
SAY_AGGRO = -1602032,
SAY_SLAY_1 = -1602033,
SAY_SLAY_2 = -1602034,
SAY_SLAY_3 = -1602035,
SAY_DEATH = -1602036,
SAY_STOMP_1 = -1602037,
SAY_STOMP_2 = -1602038,
SAY_FORGE_1 = -1602039,
SAY_FORGE_2 = -1602040,
EMOTE_TO_ANVIL = -1602041,
EMOTE_SHATTER = -1602042,
SPELL_HEAT_N = 52387,
SPELL_HEAT_H = 59528,
SPELL_SHATTERING_STOMP_N = 52237,
SPELL_SHATTERING_STOMP_H = 59529,
//unclear how "directions" of spells must be. Last, summoning GO, what is it for? Script depend on:
SPELL_TEMPER = 52238, //TARGET_SCRIPT boss->anvil
SPELL_TEMPER_DUMMY = 52654, //TARGET_SCRIPT anvil->boss
//SPELL_TEMPER_VISUAL = 52661, //summons GO
SPELL_SUMMON_MOLTEN_GOLEM = 52405,
//Molten Golem
SPELL_BLAST_WAVE = 23113,
SPELL_IMMOLATION_STRIKE_N = 52433,
SPELL_IMMOLATION_STRIKE_H = 59530,
SPELL_SHATTER_N = 52429,
SPELL_SHATTER_H = 59527,
NPC_VOLKHAN_ANVIL = 28823,
NPC_MOLTEN_GOLEM = 28695,
NPC_BRITTLE_GOLEM = 28681,
POINT_ID_ANVIL = 0,
MAX_GOLEM = 2,
ACHIEVEMENT_SHATTER_RESISTANT = 2042
};
/*######
## Boss Volkhan
######*/
struct boss_volkhanAI : public ScriptedAI
{
boss_volkhanAI(Creature *pCreature) : ScriptedAI(pCreature)
{
m_pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* m_pInstance;
std::list<uint64> m_lGolemGUIDList;
bool m_bHasTemper;
bool m_bIsStriking;
bool m_bCanShatterGolem;
uint8 GolemsShattered;
uint32 m_uiPause_Timer;
uint32 m_uiShatteringStomp_Timer;
uint32 m_uiShatter_Timer;
uint32 m_uiHealthAmountModifier;
void Reset()
{
m_bIsStriking = false;
m_bHasTemper = false;
m_bCanShatterGolem = false;
m_uiPause_Timer = 3500;
m_uiShatteringStomp_Timer = 0;
m_uiShatter_Timer = 5000;
GolemsShattered = 0;
m_uiHealthAmountModifier = 1;
DespawnGolem();
m_lGolemGUIDList.clear();
if (m_pInstance)
m_pInstance->SetData(TYPE_VOLKHAN, NOT_STARTED);
}
void EnterCombat(Unit* /*pWho*/)
{
DoScriptText(SAY_AGGRO, me);
if (m_pInstance)
m_pInstance->SetData(TYPE_VOLKHAN, IN_PROGRESS);
}
void AttackStart(Unit* pWho)
{
if (me->Attack(pWho, true))
{
me->AddThreat(pWho, 0.0f);
me->SetInCombatWith(pWho);
pWho->SetInCombatWith(me);
if (!m_bHasTemper)
me->GetMotionMaster()->MoveChase(pWho);
}
}
void JustDied(Unit* /*pKiller*/)
{
DoScriptText(SAY_DEATH, me);
DespawnGolem();
if (m_pInstance)
m_pInstance->SetData(TYPE_VOLKHAN, DONE);
if (IsHeroic() && GolemsShattered < 5)
{
AchievementEntry const *AchievShatterResistant = GetAchievementStore()->LookupEntry(ACHIEVEMENT_SHATTER_RESISTANT);
if (AchievShatterResistant)
{
Map* pMap = me->GetMap();
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(AchievShatterResistant);
}
}
}
}
void KilledUnit(Unit* /*pVictim*/)
{
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), me);
}
void DespawnGolem()
{
if (m_lGolemGUIDList.empty())
return;
for (std::list<uint64>::const_iterator itr = m_lGolemGUIDList.begin(); itr != m_lGolemGUIDList.end(); ++itr)
{
if (Creature* pTemp = Unit::GetCreature(*me, *itr))
{
if (pTemp->isAlive())
pTemp->ForcedDespawn();
}
}
m_lGolemGUIDList.clear();
}
void ShatterGolem()
{
if (m_lGolemGUIDList.empty())
return;
for (std::list<uint64>::const_iterator itr = m_lGolemGUIDList.begin(); itr != m_lGolemGUIDList.end(); ++itr)
{
if (Creature* pTemp = Unit::GetCreature(*me, *itr))
{
// only shatter brittle golems
if (pTemp->isAlive() && pTemp->GetEntry() == NPC_BRITTLE_GOLEM)
{
pTemp->CastSpell(pTemp, DUNGEON_MODE(SPELL_SHATTER_N, SPELL_SHATTER_H), false);
GolemsShattered += 1;
}
}
}
}
void SpellHit(Unit* /*pCaster*/, const SpellEntry* pSpell)
{
if (pSpell->Id == SPELL_TEMPER_DUMMY)
m_bIsStriking = true;
}
void JustSummoned(Creature* pSummoned)
{
if (pSummoned->GetEntry() == NPC_MOLTEN_GOLEM)
{
m_lGolemGUIDList.push_back(pSummoned->GetGUID());
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
pSummoned->AI()->AttackStart(pTarget);
//why healing when just summoned?
pSummoned->CastSpell(pSummoned, DUNGEON_MODE(SPELL_HEAT_N, SPELL_HEAT_H), false, NULL, NULL, me->GetGUID());
}
}
void UpdateAI(const uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (m_bIsStriking)
{
if (m_uiPause_Timer <= uiDiff)
{
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != TARGETED_MOTION_TYPE)
{
if (me->getVictim())
me->GetMotionMaster()->MoveChase(me->getVictim());
}
m_bHasTemper = false;
m_bIsStriking = false;
m_uiPause_Timer = 3500;
}
else
m_uiPause_Timer -= uiDiff;
return;
}
// When to start shatter? After 60, 40 or 20% hp?
if (!m_bHasTemper && m_uiHealthAmountModifier >= 3)
{
if (m_uiShatteringStomp_Timer <= uiDiff)
{
//should he stomp even if he has no brittle golem to shatter?
DoScriptText(RAND(SAY_STOMP_1,SAY_STOMP_2), me);
DoCast(me, SPELL_SHATTERING_STOMP_N);
DoScriptText(EMOTE_SHATTER, me);
m_uiShatteringStomp_Timer = 30000;
m_bCanShatterGolem = true;
}
else
m_uiShatteringStomp_Timer -= uiDiff;
}
// Shatter Golems 3 seconds after Shattering Stomp
if (m_bCanShatterGolem)
{
if (m_uiShatter_Timer <= uiDiff)
{
ShatterGolem();
m_uiShatter_Timer = 3000;
m_bCanShatterGolem = false;
}
else
m_uiShatter_Timer -= uiDiff;
}
// Health check
if (!m_bCanShatterGolem && (me->GetHealth()*100 / me->GetMaxHealth()) < (100-(20*m_uiHealthAmountModifier)))
{
++m_uiHealthAmountModifier;
if (me->IsNonMeleeSpellCasted(false))
me->InterruptNonMeleeSpells(false);
DoScriptText(RAND(SAY_FORGE_1,SAY_FORGE_2), me);
m_bHasTemper = true;
DoCast(me, SPELL_TEMPER, false);
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_volkhan(Creature* pCreature)
{
return new boss_volkhanAI(pCreature);
}
bool EffectDummyCreature_boss_volkhan(Unit* pCaster, uint32 uiSpellId, uint32 uiEffIndex, Creature* pCreatureTarget)
{
//always check spellid and effectindex
if (uiSpellId == SPELL_TEMPER_DUMMY && uiEffIndex == 0)
{
if (pCaster->GetEntry() != NPC_VOLKHAN_ANVIL || pCreatureTarget->GetEntry() != NPC_VOLKHAN)
return true;
for (uint8 i = 0; i < MAX_GOLEM; ++i)
{
pCreatureTarget->CastSpell(pCaster, SPELL_SUMMON_MOLTEN_GOLEM, true);
}
//always return true when we are handling this spell and effect
return true;
}
return false;
}
/*######
## npc_volkhan_anvil
######*/
bool EffectDummyCreature_npc_volkhan_anvil(Unit* pCaster, uint32 uiSpellId, uint32 uiEffIndex, Creature* pCreatureTarget)
{
//always check spellid and effectindex
if (uiSpellId == SPELL_TEMPER && uiEffIndex == 0)
{
if (pCaster->GetEntry() != NPC_VOLKHAN || pCreatureTarget->GetEntry() != NPC_VOLKHAN_ANVIL)
return true;
Creature *cre = CAST_CRE(pCaster);
DoScriptText(EMOTE_TO_ANVIL, pCaster);
float fX, fY, fZ;
pCreatureTarget->GetContactPoint(pCaster, fX, fY, fZ, INTERACTION_DISTANCE);
pCaster->AttackStop();
if (pCaster->GetMotionMaster()->GetCurrentMovementGeneratorType() == TARGETED_MOTION_TYPE)
pCaster->GetMotionMaster()->MovementExpired();
cre->GetMap()->CreatureRelocation(cre, fX, fY, fZ, pCreatureTarget->GetOrientation());
cre->SendMonsterMove(fX, fY, fZ, 0, cre->GetUnitMovementFlags(), 1);
pCreatureTarget->CastSpell(pCaster, SPELL_TEMPER_DUMMY, false);
//always return true when we are handling this spell and effect
return true;
}
return false;
}
/*######
## mob_molten_golem
######*/
struct mob_molten_golemAI : public ScriptedAI
{
mob_molten_golemAI(Creature *pCreature) : ScriptedAI(pCreature)
{
}
bool m_bIsFrozen;
uint32 m_uiBlast_Timer;
uint32 m_uiDeathDelay_Timer;
uint32 m_uiImmolation_Timer;
void Reset()
{
m_bIsFrozen = false;
m_uiBlast_Timer = 20000;
m_uiDeathDelay_Timer = 0;
m_uiImmolation_Timer = 5000;
}
void AttackStart(Unit* pWho)
{
if (me->Attack(pWho, true))
{
me->AddThreat(pWho, 0.0f);
me->SetInCombatWith(pWho);
pWho->SetInCombatWith(me);
if (!m_bIsFrozen)
me->GetMotionMaster()->MoveChase(pWho);
}
}
void DamageTaken(Unit* /*pDoneBy*/, uint32 &uiDamage)
{
if (uiDamage > me->GetHealth())
{
me->UpdateEntry(NPC_BRITTLE_GOLEM);
me->SetHealth(1);
uiDamage = 0;
me->RemoveAllAuras();
me->AttackStop();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
if (me->IsNonMeleeSpellCasted(false))
me->InterruptNonMeleeSpells(false);
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == TARGETED_MOTION_TYPE)
me->GetMotionMaster()->MovementExpired();
m_bIsFrozen = true;
}
}
void SpellHit(Unit* /*pCaster*/, const SpellEntry* pSpell)
{
//this is the dummy effect of the spells
if (pSpell->Id == SPELL_SHATTER_N || pSpell->Id == SPELL_SHATTER_H)
{
if (me->GetEntry() == NPC_BRITTLE_GOLEM)
me->ForcedDespawn();
}
}
void UpdateAI(const uint32 uiDiff)
{
//Return since we have no target or if we are frozen
if (!UpdateVictim() || m_bIsFrozen)
return;
if (m_uiBlast_Timer <= uiDiff)
{
DoCast(me, SPELL_BLAST_WAVE);
m_uiBlast_Timer = 20000;
}
else
m_uiBlast_Timer -= uiDiff;
if (m_uiImmolation_Timer <= uiDiff)
{
DoCast(me->getVictim(), SPELL_IMMOLATION_STRIKE_N);
m_uiImmolation_Timer = 5000;
}
else
m_uiImmolation_Timer -= uiDiff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_mob_molten_golem(Creature* pCreature)
{
return new mob_molten_golemAI(pCreature);
}
void AddSC_boss_volkhan()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_volkhan";
newscript->GetAI = &GetAI_boss_volkhan;
newscript->pEffectDummyCreature = &EffectDummyCreature_boss_volkhan;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_volkhan_anvil";
newscript->pEffectDummyCreature = &EffectDummyCreature_npc_volkhan_anvil;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_molten_golem";
newscript->GetAI = &GetAI_mob_molten_golem;
newscript->RegisterSelf();
}
@@ -0,0 +1,34 @@
/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
#ifndef DEF_HALLS_OF_LIGHTNING_H
#define DEF_HALLS_OF_LIGHTNING_H
enum eTypes
{
MAX_ENCOUNTER = 4,
DATA_BJARNGRIM = 1,
DATA_IONAR = 2,
DATA_LOKEN = 3,
DATA_VOLKHAN = 4,
TYPE_BJARNGRIM = 10,
TYPE_IONAR = 11,
TYPE_LOKEN = 12,
TYPE_VOLKHAN = 13,
NPC_BJARNGRIM = 28586,
NPC_VOLKHAN = 28587,
NPC_IONAR = 28546,
NPC_LOKEN = 28923,
GO_BJARNGRIM_DOOR = 191416, //_doors10
GO_VOLKHAN_DOOR = 191325, //_doors07
GO_IONAR_DOOR = 191326, //_doors05
GO_LOKEN_DOOR = 191324, //_doors02
GO_LOKEN_THRONE = 192654
};
#endif

Some files were not shown because too many files have changed in this diff Show More