aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/CMakeLists.txt2
-rw-r--r--src/server/scripts/Commands/CMakeLists.txt3
-rw-r--r--src/server/scripts/Commands/cs_account.cpp36
-rw-r--r--src/server/scripts/Commands/cs_character.cpp4
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp6
-rw-r--r--src/server/scripts/Commands/cs_deserter.cpp199
-rw-r--r--src/server/scripts/Commands/cs_disable.cpp32
-rw-r--r--src/server/scripts/Commands/cs_gm.cpp46
-rw-r--r--src/server/scripts/Commands/cs_gobject.cpp2
-rw-r--r--src/server/scripts/Commands/cs_lfg.cpp10
-rw-r--r--src/server/scripts/Commands/cs_list.cpp110
-rw-r--r--src/server/scripts/Commands/cs_message.cpp22
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp195
-rw-r--r--src/server/scripts/Commands/cs_mmaps.cpp294
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp10
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp55
-rw-r--r--src/server/scripts/Commands/cs_quest.cpp8
-rw-r--r--src/server/scripts/Commands/cs_rbac.cpp780
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp29
-rw-r--r--src/server/scripts/Commands/cs_ticket.cpp14
-rw-r--r--src/server/scripts/Commands/cs_wp.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp20
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockDepths/boss_ambassador_flamelash.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockDepths/boss_anubshiah.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockDepths/boss_general_angerforge.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockDepths/boss_gorosh_the_dervish.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockDepths/boss_grizzle.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockDepths/boss_high_interrogator_gerstahn.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockDepths/boss_magmus.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockDepths/boss_moira_bronzebeard.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockDepths/boss_tomb_of_seven.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/boss_halycon.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp10
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/boss_the_beast.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp93
-rw-r--r--src/server/scripts/EasternKingdoms/BlackwingLair/boss_chromaggus.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackwingLair/boss_ebonroc.cpp24
-rw-r--r--src/server/scripts/EasternKingdoms/BlackwingLair/boss_firemaw.cpp16
-rw-r--r--src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp14
-rw-r--r--src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackwingLair/boss_razorgore.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackwingLair/boss_vaelastrasz.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackwingLair/boss_victor_nefarius.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp8
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp16
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp22
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp12
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp20
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/MoltenCore/boss_baron_geddon.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/MoltenCore/boss_garr.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/MoltenCore/boss_gehennas.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/MoltenCore/boss_golemagg.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/MoltenCore/boss_lucifron.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/MoltenCore/boss_magmadar.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/MoltenCore/boss_ragnaros.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/MoltenCore/boss_shazzrah.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp24
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp89
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_azshir_the_sleepless.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_bloodmage_thalnos.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp8
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_houndmaster_loksey.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_scorn.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp472
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp33
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp37
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp22
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp121
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp22
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp33
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp34
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp295
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/scholomance.h32
-rw-r--r--src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_postmaster_malown.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp24
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp15
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp57
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp22
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp38
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp179
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp11
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp60
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp20
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp10
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp20
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp528
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp87
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp85
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp292
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp103
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp66
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp222
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp551
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp303
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp20
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp355
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp62
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp66
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp193
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h66
-rw-r--r--src/server/scripts/EasternKingdoms/boss_kruul.cpp19
-rw-r--r--src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/zone_duskwood.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp15
-rw-r--r--src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/zone_silvermoon_city.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/zone_undercity.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp9
-rw-r--r--src/server/scripts/Events/childrens_week.cpp26
-rw-r--r--src/server/scripts/Examples/example_creature.cpp2
-rw-r--r--src/server/scripts/Examples/example_escort.cpp2
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp2
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp2
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp2
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CMakeLists.txt6
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp4
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp6
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp4
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp31
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp (renamed from src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp)4
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp (renamed from src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp)2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp4
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp (renamed from src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp)4
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_aeonus.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp6
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_temporus.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp6
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp4
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp8
-rw-r--r--src/server/scripts/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp2
-rw-r--r--src/server/scripts/Kalimdor/Maraudon/boss_landslide.cpp2
-rw-r--r--src/server/scripts/Kalimdor/Maraudon/boss_noxxion.cpp2
-rw-r--r--src/server/scripts/Kalimdor/Maraudon/boss_princess_theradras.cpp2
-rw-r--r--src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp2
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp2
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp2
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp262
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp39
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp2
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp4
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp16
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp2
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp10
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h11
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp15
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp46
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp6
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp2
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp2
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp4
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp14
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp6
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp6
-rw-r--r--src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp2
-rw-r--r--src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp10
-rw-r--r--src/server/scripts/Kalimdor/boss_azuregos.cpp2
-rw-r--r--src/server/scripts/Kalimdor/zone_ashenvale.cpp10
-rw-r--r--src/server/scripts/Kalimdor/zone_azshara.cpp8
-rw-r--r--src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp13
-rw-r--r--src/server/scripts/Kalimdor/zone_darkshore.cpp4
-rw-r--r--src/server/scripts/Kalimdor/zone_desolace.cpp110
-rw-r--r--src/server/scripts/Kalimdor/zone_durotar.cpp13
-rw-r--r--src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp10
-rw-r--r--src/server/scripts/Kalimdor/zone_feralas.cpp3
-rw-r--r--src/server/scripts/Kalimdor/zone_moonglade.cpp9
-rw-r--r--src/server/scripts/Kalimdor/zone_mulgore.cpp4
-rw-r--r--src/server/scripts/Kalimdor/zone_orgrimmar.cpp6
-rw-r--r--src/server/scripts/Kalimdor/zone_silithus.cpp8
-rw-r--r--src/server/scripts/Kalimdor/zone_tanaris.cpp6
-rw-r--r--src/server/scripts/Kalimdor/zone_the_barrens.cpp6
-rw-r--r--src/server/scripts/Kalimdor/zone_thousand_needles.cpp4
-rw-r--r--src/server/scripts/Kalimdor/zone_thunder_bluff.cpp7
-rw-r--r--src/server/scripts/Kalimdor/zone_ungoro_crater.cpp4
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp40
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp32
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp4
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp14
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp10
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp2
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp4
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp4
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp14
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp2
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp33
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp17
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp19
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp98
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp2
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp22
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp4
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp8
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp6
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp12
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp2
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp20
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp34
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp82
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp23
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp16
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp2
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp10
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h4
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp8
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp6
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp2
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp4
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp4
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp6
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp8
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp8
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp6
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp34
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h2
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp8
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp24
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp8
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp20
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp6
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp11
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_eck.cpp2
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp2
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp2
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp8
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp26
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp97
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp42
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp4
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp21
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp266
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp19
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp10
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp115
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp108
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp26
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp33
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h1
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp4
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp8
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp6
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp2
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp8
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp6
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp46
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp4
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp8
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp2
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp6
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_noth.cpp2
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp2
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp4
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp4
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp8
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp2747
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h32
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp92
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp9
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_commander_kolurg.cpp2
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp2
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp4
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp4
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp4
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp4
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp4
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp2
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp6
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp6
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp7
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp4
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp4
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp6
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp6
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp27
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp12
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp10
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp30
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp66
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp8
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp20
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp8
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp4
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp32
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp4
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp23
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp6
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp36
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp22
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp4
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp4
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp12
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp2
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp18
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp2
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp4
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp4
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp8
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp14
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp2
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_erekem.cpp4
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp8
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp2
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_moragg.cpp2
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp8
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp2
-rw-r--r--src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp2
-rw-r--r--src/server/scripts/Northrend/VioletHold/violet_hold.cpp24
-rw-r--r--src/server/scripts/Northrend/zone_borean_tundra.cpp38
-rw-r--r--src/server/scripts/Northrend/zone_crystalsong_forest.cpp9
-rw-r--r--src/server/scripts/Northrend/zone_dalaran.cpp6
-rw-r--r--src/server/scripts/Northrend/zone_dragonblight.cpp2
-rw-r--r--src/server/scripts/Northrend/zone_grizzly_hills.cpp14
-rw-r--r--src/server/scripts/Northrend/zone_howling_fjord.cpp2
-rw-r--r--src/server/scripts/Northrend/zone_icecrown.cpp215
-rw-r--r--src/server/scripts/Northrend/zone_sholazar_basin.cpp109
-rw-r--r--src/server/scripts/Northrend/zone_storm_peaks.cpp124
-rw-r--r--src/server/scripts/Northrend/zone_wintergrasp.cpp4
-rw-r--r--src/server/scripts/Northrend/zone_zuldrak.cpp18
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPNA.h2
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPZM.h2
-rw-r--r--src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp6
-rw-r--r--src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp4
-rw-r--r--src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp6
-rw-r--r--src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp2
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp10
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp2
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp2
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp2
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp4
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp2
-rw-r--r--src/server/scripts/Outland/BlackTemple/black_temple.cpp2
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp12
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_illidan.cpp23
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp4
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp8
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp8
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_supremus.cpp13
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp9
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp2
-rw-r--r--src/server/scripts/Outland/BlackTemple/illidari_council.cpp12
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp70
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp5
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp10
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp16
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp17
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp11
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp4
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp4
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp2
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/underbog/boss_hungarfen.cpp11
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp2
-rw-r--r--src/server/scripts/Outland/GruulsLair/boss_gruul.cpp4
-rw-r--r--src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp13
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp4
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp4
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp2
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp10
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp2
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp8
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp2
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp6
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp6
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp4
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp2
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp6
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp16
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp25
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp2
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp2
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp117
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp146
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp130
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp153
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp202
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp115
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h21
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp6
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp2
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp2
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp2
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp2
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp2
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp4
-rw-r--r--src/server/scripts/Outland/boss_doomlord_kazzak.cpp2
-rw-r--r--src/server/scripts/Outland/boss_doomwalker.cpp2
-rw-r--r--src/server/scripts/Outland/zone_blades_edge_mountains.cpp16
-rw-r--r--src/server/scripts/Outland/zone_hellfire_peninsula.cpp4
-rw-r--r--src/server/scripts/Outland/zone_nagrand.cpp10
-rw-r--r--src/server/scripts/Outland/zone_netherstorm.cpp10
-rw-r--r--src/server/scripts/Outland/zone_shadowmoon_valley.cpp106
-rw-r--r--src/server/scripts/Outland/zone_shattrath_city.cpp6
-rw-r--r--src/server/scripts/Outland/zone_terokkar_forest.cpp6
-rw-r--r--src/server/scripts/Outland/zone_zangarmarsh.cpp2
-rw-r--r--src/server/scripts/Spells/spell_dk.cpp843
-rw-r--r--src/server/scripts/Spells/spell_druid.cpp356
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp464
-rw-r--r--src/server/scripts/Spells/spell_holiday.cpp96
-rw-r--r--src/server/scripts/Spells/spell_hunter.cpp501
-rw-r--r--src/server/scripts/Spells/spell_item.cpp595
-rw-r--r--src/server/scripts/Spells/spell_mage.cpp531
-rw-r--r--src/server/scripts/Spells/spell_paladin.cpp687
-rw-r--r--src/server/scripts/Spells/spell_pet.cpp2
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp428
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp126
-rw-r--r--src/server/scripts/Spells/spell_rogue.cpp429
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp645
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp811
-rw-r--r--src/server/scripts/Spells/spell_warrior.cpp739
-rw-r--r--src/server/scripts/World/achievement_scripts.cpp25
-rw-r--r--src/server/scripts/World/areatrigger_scripts.cpp66
-rw-r--r--src/server/scripts/World/boss_emerald_dragons.cpp18
-rw-r--r--src/server/scripts/World/go_scripts.cpp4
-rw-r--r--src/server/scripts/World/guards.cpp6
-rw-r--r--src/server/scripts/World/mob_generic_creature.cpp4
-rw-r--r--src/server/scripts/World/npcs_special.cpp77
496 files changed, 14820 insertions, 7593 deletions
diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt
index 9726cc1a937..cf4618022b3 100644
--- a/src/server/scripts/CMakeLists.txt
+++ b/src/server/scripts/CMakeLists.txt
@@ -45,6 +45,8 @@ message("")
include_directories(
${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour
+ ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast
${CMAKE_SOURCE_DIR}/dep/g3dlite/include
${CMAKE_SOURCE_DIR}/dep/SFMT
${CMAKE_SOURCE_DIR}/dep/zlib
diff --git a/src/server/scripts/Commands/CMakeLists.txt b/src/server/scripts/Commands/CMakeLists.txt
index 97e9b35e6cd..15e16c2caf1 100644
--- a/src/server/scripts/Commands/CMakeLists.txt
+++ b/src/server/scripts/Commands/CMakeLists.txt
@@ -18,6 +18,7 @@ set(scripts_STAT_SRCS
Commands/cs_character.cpp
Commands/cs_cheat.cpp
Commands/cs_debug.cpp
+ Commands/cs_deserter.cpp
Commands/cs_disable.cpp
Commands/cs_event.cpp
Commands/cs_gm.cpp
@@ -35,6 +36,7 @@ set(scripts_STAT_SRCS
Commands/cs_modify.cpp
Commands/cs_npc.cpp
Commands/cs_quest.cpp
+ Commands/cs_rbac.cpp
Commands/cs_reload.cpp
Commands/cs_reset.cpp
Commands/cs_tele.cpp
@@ -42,6 +44,7 @@ set(scripts_STAT_SRCS
Commands/cs_server.cpp
Commands/cs_titles.cpp
Commands/cs_wp.cpp
+ Commands/cs_mmaps.cpp
# Commands/cs_pdump.cpp
# Commands/cs_channel.cpp
# Commands/cs_pet.cpp
diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp
index 3a20a03bb4a..3953beab3da 100644
--- a/src/server/scripts/Commands/cs_account.cpp
+++ b/src/server/scripts/Commands/cs_account.cpp
@@ -106,7 +106,7 @@ public:
if (!accountName || !password)
return false;
- AccountOpResult result = AccountMgr::CreateAccount(std::string(accountName), std::string(password));
+ AccountOpResult result = sAccountMgr->CreateAccount(std::string(accountName), std::string(password));
switch (result)
{
case AOR_OK:
@@ -140,7 +140,7 @@ public:
}
/// Delete a user account and all associated characters in this realm
- /// \todo This function has to be enhanced to respect the login/realm split (delete char, delete account chars in realm then delete account)
+ /// @todo This function has to be enhanced to respect the login/realm split (delete char, delete account chars in realm then delete account)
static bool HandleAccountDeleteCommand(ChatHandler* handler, char const* args)
{
if (!*args)
@@ -503,36 +503,8 @@ public:
return false;
}
- // If gmRealmID is -1, delete all values for the account id, else, insert values for the specific realmID
- PreparedStatement* stmt;
-
- if (gmRealmID == -1)
- {
- stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_ACCOUNT_ACCESS);
-
- stmt->setUInt32(0, targetAccountId);
- }
- else
- {
- stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_ACCOUNT_ACCESS_BY_REALM);
-
- stmt->setUInt32(0, targetAccountId);
- stmt->setUInt32(1, realmID);
- }
-
- LoginDatabase.Execute(stmt);
-
- if (gm != 0)
- {
- stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_ACCOUNT_ACCESS);
-
- stmt->setUInt32(0, targetAccountId);
- stmt->setUInt8(1, uint8(gm));
- stmt->setInt32(2, gmRealmID);
-
- LoginDatabase.Execute(stmt);
- }
-
+ RBACData* rbac = isAccountNameGiven ? NULL : handler->getSelectedPlayer()->GetSession()->GetRBACData();
+ sAccountMgr->UpdateAccountAccess(rbac, targetAccountId, uint8(gm), gmRealmID);
handler->PSendSysMessage(LANG_YOU_CHANGE_SECURITY, targetAccountName.c_str(), gm);
return true;
diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp
index 5ec40bcd0fc..c29b62975ab 100644
--- a/src/server/scripts/Commands/cs_character.cpp
+++ b/src/server/scripts/Commands/cs_character.cpp
@@ -443,7 +443,7 @@ public:
stmt->setUInt16(0, uint16(AT_LOGIN_CHANGE_RACE));
if (target)
{
- // TODO : add text into database
+ /// @todo add text into database
handler->PSendSysMessage(LANG_CUSTOMIZE_PLAYER, handler->GetNameLink(target).c_str());
target->SetAtLoginFlag(AT_LOGIN_CHANGE_RACE);
stmt->setUInt32(1, target->GetGUIDLow());
@@ -451,7 +451,7 @@ public:
else
{
std::string oldNameLink = handler->playerLink(targetName);
- // TODO : add text into database
+ /// @todo add text into database
handler->PSendSysMessage(LANG_CUSTOMIZE_PLAYER_GUID, oldNameLink.c_str(), GUID_LOPART(targetGuid));
stmt->setUInt32(1, GUID_LOPART(targetGuid));
}
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index 030bc136333..400e35b705b 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -1120,13 +1120,13 @@ public:
if (isInt32)
{
uint32 value = (uint32)atoi(y);
- target->SetUInt32Value(opcode , value);
+ target->SetUInt32Value(opcode, value);
handler->PSendSysMessage(LANG_SET_UINT_FIELD, GUID_LOPART(guid), opcode, value);
}
else
{
float value = (float)atof(y);
- target->SetFloatValue(opcode , value);
+ target->SetFloatValue(opcode, value);
handler->PSendSysMessage(LANG_SET_FLOAT_FIELD, GUID_LOPART(guid), opcode, value);
}
@@ -1328,7 +1328,7 @@ public:
{
Player* player = handler->GetSession()->GetPlayer();
- sLog->outInfo(LOG_FILTER_SQL_DEV, "(@PATH, XX, %.3f, %.3f, %.5f, 0,0, 0,100, 0),", player->GetPositionX(), player->GetPositionY(), player->GetPositionZ());
+ sLog->outInfo(LOG_FILTER_SQL_DEV, "(@PATH, XX, %.3f, %.3f, %.5f, 0, 0, 0, 100, 0),", player->GetPositionX(), player->GetPositionY(), player->GetPositionZ());
handler->PSendSysMessage("Waypoint SQL written to SQL Developer log");
return true;
diff --git a/src/server/scripts/Commands/cs_deserter.cpp b/src/server/scripts/Commands/cs_deserter.cpp
new file mode 100644
index 00000000000..3850456fcb3
--- /dev/null
+++ b/src/server/scripts/Commands/cs_deserter.cpp
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+* @file cs_deserter.cpp
+* @brief .deserter related commands
+*
+* This file contains the CommandScripts for all deserter sub-commands
+*/
+
+#include "Chat.h"
+#include "Player.h"
+#include "Language.h"
+#include "ScriptMgr.h"
+#include "SpellAuras.h"
+
+enum Spells
+{
+ LFG_SPELL_DUNGEON_DESERTER = 71041,
+ BG_SPELL_DESERTER = 26013
+};
+
+class deserter_commandscript : public CommandScript
+{
+public:
+ deserter_commandscript() : CommandScript("deserter_commandscript") { }
+
+ /**
+ * @brief Returns the command structure for the system.
+ */
+
+ ChatCommand* GetCommands() const
+ {
+ static ChatCommand deserterInstanceCommandTable[] =
+ {
+ { "add", SEC_ADMINISTRATOR, false, &HandleDeserterInstanceAdd, "", NULL },
+ { "remove", SEC_ADMINISTRATOR, false, &HandleDeserterInstanceRemove, "", NULL },
+ { NULL, SEC_PLAYER, false, NULL, "", NULL }
+ };
+ static ChatCommand deserterBGCommandTable[] =
+ {
+ { "add", SEC_ADMINISTRATOR, false, &HandleDeserterBGAdd, "", NULL },
+ { "remove", SEC_ADMINISTRATOR, false, &HandleDeserterBGRemove, "", NULL },
+ { NULL, SEC_PLAYER, false, NULL, "", NULL }
+ };
+
+ static ChatCommand deserterCommandTable[] =
+ {
+ { "instance", SEC_ADMINISTRATOR, false, NULL, "", deserterInstanceCommandTable },
+ { "bg", SEC_ADMINISTRATOR, false, NULL, "", deserterBGCommandTable },
+ { NULL, SEC_PLAYER, false, NULL, "", NULL }
+ };
+ static ChatCommand commandTable[] =
+ {
+ { "deserter", SEC_ADMINISTRATOR, false, NULL, "", deserterCommandTable },
+ { NULL, SEC_PLAYER, false, NULL, "", NULL }
+ };
+ return commandTable;
+ }
+
+ /**
+ * @brief Applies the Deserter Debuff to a player
+ *
+ * This function applies a Deserter Debuff of the given type (Instance or BG) to the
+ * selected player, with the provided duration in seconds.
+ *
+ * @param handler The ChatHandler, passed by the system.
+ * @param args The provided duration in seconds.
+ * @param isInstance provided by the relaying functions, so we don't have
+ * to write that much code :)
+ *
+ * @return true if everything was correct, false if an error occured.
+ *
+ * Example Usage:
+ * @code
+ * .deserter instance add 3600 (one hour)
+ * -or-
+ * .deserter bg add 3600 (one hour)
+ * @endcode
+ */
+ static bool HandleDeserterAdd(ChatHandler* handler, char const* args, bool isInstance)
+ {
+ if (!*args)
+ return false;
+
+ Player* player = handler->getSelectedPlayer();
+ if (!player)
+ {
+ handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ char* timeStr = strtok((char*)args, " ");
+ if (!timeStr)
+ {
+ handler->SendSysMessage(LANG_BAD_VALUE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ uint32 time = atoi(timeStr);
+
+ if (!time)
+ {
+ handler->SendSysMessage(LANG_BAD_VALUE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ Aura* aura = player->AddAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER, player);
+
+ if (!aura)
+ {
+ handler->SendSysMessage(LANG_BAD_VALUE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ aura->SetDuration(time * IN_MILLISECONDS);
+
+ return true;
+ }
+
+ /**
+ * @brief Removes the Deserter Debuff from a player
+ *
+ * This function removes a Deserter Debuff of the given type (Instance or BG) from the
+ * selected player.
+ *
+ * @param handler The ChatHandler, passed by the system.
+ * @param args Should be nothing.
+ * @param isInstance provided by the relaying functions, so we don't have
+ * to write that much code :)
+ *
+ * @return true if everything was correct, false if an error occured.
+ *
+ * Example Usage:
+ * @code
+ * .deserter instance remove
+ * -or-
+ * .deserter bg remove
+ * @endcode
+ */
+ static bool HandleDeserterRemove(ChatHandler* handler, char const* /*args*/, bool isInstance)
+ {
+ Player* player = handler->getSelectedPlayer();
+ if (!player)
+ {
+ handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ player->RemoveAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER);
+
+ return true;
+ }
+
+ /// @sa HandleDeserterAdd()
+ static bool HandleDeserterInstanceAdd(ChatHandler* handler, char const* args)
+ {
+ return HandleDeserterAdd(handler, args, true);
+ }
+
+ /// @sa HandleDeserterAdd()
+ static bool HandleDeserterBGAdd(ChatHandler* handler, char const* args)
+ {
+ return HandleDeserterAdd(handler, args, false);
+ }
+
+ /// @sa HandleDeserterRemove()
+ static bool HandleDeserterInstanceRemove(ChatHandler* handler, char const* args)
+ {
+ return HandleDeserterRemove(handler, args, true);
+ }
+
+ /// @sa HandleDeserterRemove()
+ static bool HandleDeserterBGRemove(ChatHandler* handler, char const* args)
+ {
+ return HandleDeserterRemove(handler, args, false);
+ }
+};
+
+void AddSC_deserter_commandscript()
+{
+ new deserter_commandscript();
+}
diff --git a/src/server/scripts/Commands/cs_disable.cpp b/src/server/scripts/Commands/cs_disable.cpp
index 37e282cac8e..34738777c85 100644
--- a/src/server/scripts/Commands/cs_disable.cpp
+++ b/src/server/scripts/Commands/cs_disable.cpp
@@ -48,6 +48,7 @@ public:
{ "achievement_criteria", SEC_ADMINISTRATOR, true, &HandleRemoveDisableAchievementCriteriaCommand, "", NULL },
{ "outdoorpvp", SEC_ADMINISTRATOR, true, &HandleRemoveDisableOutdoorPvPCommand, "", NULL },
{ "vmap", SEC_ADMINISTRATOR, true, &HandleRemoveDisableVmapCommand, "", NULL },
+ { "mmap", SEC_ADMINISTRATOR, true, &HandleRemoveDisableMMapCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand addDisableCommandTable[] =
@@ -59,6 +60,7 @@ public:
{ "achievement_criteria", SEC_ADMINISTRATOR, true, &HandleAddDisableAchievementCriteriaCommand, "", NULL },
{ "outdoorpvp", SEC_ADMINISTRATOR, true, &HandleAddDisableOutdoorPvPCommand, "", NULL },
{ "vmap", SEC_ADMINISTRATOR, true, &HandleAddDisableVmapCommand, "", NULL },
+ { "mmap", SEC_ADMINISTRATOR, true, &HandleAddDisableMMapCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand disableCommandTable[] =
@@ -172,6 +174,17 @@ public:
disableTypeStr = "vmap";
break;
}
+ case DISABLE_TYPE_MMAP:
+ {
+ if (!sMapStore.LookupEntry(entry))
+ {
+ handler->PSendSysMessage(LANG_COMMAND_NOMAPFOUND);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ disableTypeStr = "mmap";
+ break;
+ }
default:
break;
}
@@ -256,6 +269,14 @@ public:
return HandleAddDisables(handler, args, DISABLE_TYPE_VMAP);
}
+ static bool HandleAddDisableMMapCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ return HandleAddDisables(handler, args, DISABLE_TYPE_MMAP);
+ }
+
static bool HandleRemoveDisables(ChatHandler* handler, char const* args, uint8 disableType)
{
char* entryStr = strtok((char*)args, " ");
@@ -289,6 +310,9 @@ public:
case DISABLE_TYPE_VMAP:
disableTypeStr = "vmap";
break;
+ case DISABLE_TYPE_MMAP:
+ disableTypeStr = "mmap";
+ break;
}
PreparedStatement* stmt = NULL;
@@ -367,6 +391,14 @@ public:
return HandleRemoveDisables(handler, args, DISABLE_TYPE_VMAP);
}
+
+ static bool HandleRemoveDisableMMapCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ return HandleRemoveDisables(handler, args, DISABLE_TYPE_MMAP);
+ }
};
void AddSC_disable_commandscript()
diff --git a/src/server/scripts/Commands/cs_gm.cpp b/src/server/scripts/Commands/cs_gm.cpp
index 932bb562f11..168a5ec60b8 100644
--- a/src/server/scripts/Commands/cs_gm.cpp
+++ b/src/server/scripts/Commands/cs_gm.cpp
@@ -59,30 +59,32 @@ public:
// Enables or disables hiding of the staff badge
static bool HandleGMChatCommand(ChatHandler* handler, char const* args)
{
- if (!*args)
+ if (WorldSession* session = handler->GetSession())
{
- WorldSession* session = handler->GetSession();
- if (!AccountMgr::IsPlayerAccount(session->GetSecurity()) && session->GetPlayer()->isGMChat())
- session->SendNotification(LANG_GM_CHAT_ON);
- else
- session->SendNotification(LANG_GM_CHAT_OFF);
- return true;
- }
+ if (!*args)
+ {
+ if (session->HasPermission(RBAC_PERM_CHAT_USE_STAFF_BADGE) && session->GetPlayer()->isGMChat())
+ session->SendNotification(LANG_GM_CHAT_ON);
+ else
+ session->SendNotification(LANG_GM_CHAT_OFF);
+ return true;
+ }
- std::string param = (char*)args;
+ std::string param = (char*)args;
- if (param == "on")
- {
- handler->GetSession()->GetPlayer()->SetGMChat(true);
- handler->GetSession()->SendNotification(LANG_GM_CHAT_ON);
- return true;
- }
+ if (param == "on")
+ {
+ session->GetPlayer()->SetGMChat(true);
+ session->SendNotification(LANG_GM_CHAT_ON);
+ return true;
+ }
- if (param == "off")
- {
- handler->GetSession()->GetPlayer()->SetGMChat(false);
- handler->GetSession()->SendNotification(LANG_GM_CHAT_OFF);
- return true;
+ if (param == "off")
+ {
+ session->GetPlayer()->SetGMChat(false);
+ session->SendNotification(LANG_GM_CHAT_OFF);
+ return true;
+ }
}
handler->SendSysMessage(LANG_USE_BOL);
@@ -126,7 +128,9 @@ public:
for (HashMapHolder<Player>::MapType::const_iterator itr = m.begin(); itr != m.end(); ++itr)
{
AccountTypes itrSec = itr->second->GetSession()->GetSecurity();
- if ((itr->second->isGameMaster() || (!AccountMgr::IsPlayerAccount(itrSec) && itrSec <= AccountTypes(sWorld->getIntConfig(CONFIG_GM_LEVEL_IN_GM_LIST)))) &&
+ if ((itr->second->isGameMaster() ||
+ (itr->second->GetSession()->HasPermission(RBAC_PERM_COMMANDS_APPEAR_IN_GM_LIST) &&
+ itrSec <= AccountTypes(sWorld->getIntConfig(CONFIG_GM_LEVEL_IN_GM_LIST)))) &&
(!handler->GetSession() || itr->second->IsVisibleGloballyFor(handler->GetSession()->GetPlayer())))
{
if (first)
diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp
index 4093861ae9a..f99e51fb260 100644
--- a/src/server/scripts/Commands/cs_gobject.cpp
+++ b/src/server/scripts/Commands/cs_gobject.cpp
@@ -174,7 +174,7 @@ public:
return false;
}
- // TODO: is it really necessary to add both the real and DB table guid here ?
+ /// @todo is it really necessary to add both the real and DB table guid here ?
sObjectMgr->AddGameobjectToGrid(guidLow, sObjectMgr->GetGOData(guidLow));
handler->PSendSysMessage(LANG_GAMEOBJECT_ADD, objectId, objectInfo->name.c_str(), guidLow, x, y, z);
diff --git a/src/server/scripts/Commands/cs_lfg.cpp b/src/server/scripts/Commands/cs_lfg.cpp
index 7f39a8fc024..aa9d9308bcd 100644
--- a/src/server/scripts/Commands/cs_lfg.cpp
+++ b/src/server/scripts/Commands/cs_lfg.cpp
@@ -28,12 +28,12 @@ void GetPlayerInfo(ChatHandler* handler, Player* player)
return;
uint64 guid = player->GetGUID();
- LfgDungeonSet dungeons = sLFGMgr->GetSelectedDungeons(guid);
+ lfg::LfgDungeonSet dungeons = sLFGMgr->GetSelectedDungeons(guid);
- std::string const& state = sLFGMgr->GetStateString(sLFGMgr->GetState(guid));
+ std::string const& state = lfg::GetStateString(sLFGMgr->GetState(guid));
handler->PSendSysMessage(LANG_LFG_PLAYER_INFO, player->GetName().c_str(),
- state.c_str(), uint8(dungeons.size()), sLFGMgr->ConcatenateDungeons(dungeons).c_str(),
- sLFGMgr->GetRolesString(sLFGMgr->GetRoles(guid)).c_str(), sLFGMgr->GetComment(guid).c_str());
+ state.c_str(), uint8(dungeons.size()), lfg::ConcatenateDungeons(dungeons).c_str(),
+ lfg::GetRolesString(sLFGMgr->GetRoles(guid)).c_str(), sLFGMgr->GetComment(guid).c_str());
}
class lfg_commandscript : public CommandScript
@@ -87,7 +87,7 @@ public:
}
uint64 guid = grp->GetGUID();
- std::string const& state = sLFGMgr->GetStateString(sLFGMgr->GetState(guid));
+ std::string const& state = lfg::GetStateString(sLFGMgr->GetState(guid));
handler->PSendSysMessage(LANG_LFG_GROUP_INFO, grp->isLFGGroup(),
state.c_str(), sLFGMgr->GetDungeon(guid));
diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp
index fce1f77c2cf..81608ebd458 100644
--- a/src/server/scripts/Commands/cs_list.cpp
+++ b/src/server/scripts/Commands/cs_list.cpp
@@ -29,6 +29,7 @@ EndScriptData */
#include "ObjectAccessor.h"
#include "ObjectMgr.h"
#include "Player.h"
+#include <iostream>
class list_commandscript : public CommandScript
{
@@ -43,6 +44,7 @@ public:
{ "item", SEC_ADMINISTRATOR, true, &HandleListItemCommand, "", NULL },
{ "object", SEC_ADMINISTRATOR, true, &HandleListObjectCommand, "", NULL },
{ "auras", SEC_ADMINISTRATOR, false, &HandleListAurasCommand, "", NULL },
+ { "mail", SEC_ADMINISTRATOR, true, &HandleListMailCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
@@ -463,6 +465,114 @@ public:
return true;
}
+ // handle list mail command
+ static bool HandleListMailCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target;
+ uint64 targetGuid;
+ std::string targetName;
+
+ if (!*args)
+ return false;
+
+ uint32 parseGUID = MAKE_NEW_GUID(atol((char*)args), 0, HIGHGUID_PLAYER);
+
+ if (sObjectMgr->GetPlayerNameByGUID(parseGUID, targetName))
+ {
+ target = sObjectMgr->GetPlayerByLowGUID(parseGUID);
+ targetGuid = parseGUID;
+ }
+ else if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName))
+ return false;
+
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL_LIST_COUNT);
+ stmt->setUInt32(0, targetGuid);
+ PreparedQueryResult result = CharacterDatabase.Query(stmt);
+ if (result)
+ {
+ Field* fields = result->Fetch();
+ uint32 countMail = fields[0].GetUInt64();
+ std::string nameLink = handler->playerLink(targetName);
+ handler->PSendSysMessage(LANG_LIST_MAIL_HEADER, countMail, nameLink.c_str(), targetGuid);
+ handler->PSendSysMessage(LANG_ACCOUNT_LIST_BAR);
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL_LIST_INFO);
+ stmt->setUInt32(0, targetGuid);
+ PreparedQueryResult result = CharacterDatabase.Query(stmt);
+ if (result)
+ {
+ do
+ {
+ Field* fields = result->Fetch();
+ uint32 messageId = fields[0].GetUInt32();
+ uint32 senderId = fields[1].GetUInt32();
+ std::string sender = fields[2].GetString();
+ uint32 receiverId = fields[3].GetUInt32();
+ std::string receiver = fields[4].GetString();
+ std::string subject = fields[5].GetString();
+ uint64 deliverTime = fields[6].GetUInt32();
+ uint64 expireTime = fields[7].GetUInt32();
+ uint32 money = fields[8].GetUInt32();
+ int hasItem = fields[9].GetUInt8();
+ uint32 gold = money /GOLD;
+ uint32 silv = (money % GOLD) / SILVER;
+ uint32 copp = (money % GOLD) % SILVER;
+ std::string receiverStr = handler->playerLink(receiver);
+ std::string senderStr = handler->playerLink(sender);
+ handler->PSendSysMessage(LANG_LIST_MAIL_INFO_1 , messageId, subject.c_str(),gold, silv, copp);
+ handler->PSendSysMessage(LANG_LIST_MAIL_INFO_2, senderStr.c_str(), senderId, receiverStr.c_str(), receiverId);
+ handler->PSendSysMessage(LANG_LIST_MAIL_INFO_3, TimeToTimestampStr(deliverTime).c_str(), TimeToTimestampStr(expireTime).c_str());
+ if (hasItem == 1)
+ {
+ QueryResult result2;
+ result2 = CharacterDatabase.PQuery("SELECT item_guid FROM mail_items WHERE mail_id = '%u'", messageId);
+ if (result2)
+ {
+ do
+ {
+ uint32 item_guid = (*result2)[0].GetUInt32();
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL_LIST_ITEMS);
+ stmt->setUInt32(0, item_guid);
+ PreparedQueryResult result3 = CharacterDatabase.Query(stmt);
+ if (result3)
+ {
+ do
+ {
+ Field* fields = result3->Fetch();
+ uint32 item_entry = fields[0].GetUInt32();
+ uint32 item_count = fields[1].GetUInt32();
+ QueryResult result4;
+ result4 = WorldDatabase.PQuery("SELECT name,quality FROM item_template WHERE entry = '%u'", item_entry);
+ Field* fields1 = result4->Fetch();
+ std::string item_name = fields1[0].GetString();
+ int item_quality = fields1[1].GetUInt8();
+ if (handler->GetSession())
+ {
+ uint32 color = ItemQualityColors[item_quality];
+ std::ostringstream itemStr;
+ itemStr << "|c" << std::hex << color << "|Hitem:" << item_entry << ":0:0:0:0:0:0:0:0:0|h[" << item_name << "]|h|r";
+ handler->PSendSysMessage(LANG_LIST_MAIL_INFO_ITEM, itemStr.str().c_str(), item_entry, item_guid, item_count);
+ }
+ else
+ handler->PSendSysMessage(LANG_LIST_MAIL_INFO_ITEM, item_name.c_str(), item_entry, item_guid, item_count);
+ }
+ while (result3->NextRow());
+ }
+ }
+ while (result2->NextRow());
+ }
+ }
+ handler->PSendSysMessage(LANG_ACCOUNT_LIST_BAR);
+ }
+ while (result->NextRow());
+ }
+ else
+ handler->PSendSysMessage(LANG_LIST_MAIL_NOT_FOUND);
+ return true;
+ }
+ else
+ handler->PSendSysMessage(LANG_LIST_MAIL_NOT_FOUND);
+ return true;
+ }
};
void AddSC_list_commandscript()
diff --git a/src/server/scripts/Commands/cs_message.cpp b/src/server/scripts/Commands/cs_message.cpp
index e2c53492e9d..cc50490e831 100644
--- a/src/server/scripts/Commands/cs_message.cpp
+++ b/src/server/scripts/Commands/cs_message.cpp
@@ -27,6 +27,7 @@ EndScriptData */
#include "ChannelMgr.h"
#include "Language.h"
#include "Player.h"
+#include "ObjectMgr.h"
class message_commandscript : public CommandScript
{
@@ -186,7 +187,7 @@ public:
return true;
}
- std::string argStr = (char*)args;
+ std::string argStr = strtok((char*)args, " ");
// whisper on
if (argStr == "on")
{
@@ -205,6 +206,25 @@ public:
return true;
}
+ if (argStr == "remove")
+ {
+ std::string name = strtok(NULL, " ");
+ if (normalizePlayerName(name))
+ {
+ if (Player* player = sObjectAccessor->FindPlayerByName(name))
+ {
+ handler->GetSession()->GetPlayer()->RemoveFromWhisperWhiteList(player->GetGUID());
+ handler->PSendSysMessage(LANG_COMMAND_WHISPEROFFPLAYER, name.c_str());
+ return true;
+ }
+ else
+ {
+ handler->PSendSysMessage(LANG_PLAYER_NOT_FOUND, name.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ }
+ }
handler->SendSysMessage(LANG_USE_BOL);
handler->SetSentErrorMessage(true);
return false;
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 59315e1a813..c6d80cea3a5 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -33,6 +33,9 @@
#include "ace/INET_Addr.h"
#include "Player.h"
#include "Pet.h"
+#include "LFG.h"
+#include "GroupMgr.h"
+#include "MMapFactory.h"
class misc_commandscript : public CommandScript
{
@@ -46,6 +49,8 @@ public:
{ "leader", SEC_ADMINISTRATOR, false, &HandleGroupLeaderCommand, "", NULL },
{ "disband", SEC_ADMINISTRATOR, false, &HandleGroupDisbandCommand, "", NULL },
{ "remove", SEC_ADMINISTRATOR, false, &HandleGroupRemoveCommand, "", NULL },
+ { "join", SEC_ADMINISTRATOR, false, &HandleGroupJoinCommand, "", NULL },
+ { "list", SEC_ADMINISTRATOR, false, &HandleGroupListCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand petCommandTable[] =
@@ -187,8 +192,9 @@ public:
uint32 zoneId, areaId;
object->GetZoneAndAreaId(zoneId, areaId);
+ uint32 mapId = object->GetMapId();
- MapEntry const* mapEntry = sMapStore.LookupEntry(object->GetMapId());
+ MapEntry const* mapEntry = sMapStore.LookupEntry(mapId);
AreaTableEntry const* zoneEntry = GetAreaEntryByAreaID(zoneId);
AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(areaId);
@@ -207,8 +213,9 @@ public:
int gridX = 63 - gridCoord.x_coord;
int gridY = 63 - gridCoord.y_coord;
- uint32 haveMap = Map::ExistMap(object->GetMapId(), gridX, gridY) ? 1 : 0;
- uint32 haveVMap = Map::ExistVMap(object->GetMapId(), gridX, gridY) ? 1 : 0;
+ uint32 haveMap = Map::ExistMap(mapId, gridX, gridY) ? 1 : 0;
+ uint32 haveVMap = Map::ExistVMap(mapId, gridX, gridY) ? 1 : 0;
+ uint32 haveMMap = (MMAP::MMapFactory::IsPathfindingEnabled(mapId) && MMAP::MMapFactory::createOrGetMMapManager()->GetNavMesh(handler->GetSession()->GetPlayer()->GetMapId())) ? 1 : 0;
if (haveVMap)
{
@@ -221,13 +228,13 @@ public:
handler->PSendSysMessage("no VMAP available for area info");
handler->PSendSysMessage(LANG_MAP_POSITION,
- object->GetMapId(), (mapEntry ? mapEntry->name[handler->GetSessionDbcLocale()] : "<unknown>"),
+ mapId, (mapEntry ? mapEntry->name[handler->GetSessionDbcLocale()] : "<unknown>"),
zoneId, (zoneEntry ? zoneEntry->area_name[handler->GetSessionDbcLocale()] : "<unknown>"),
areaId, (areaEntry ? areaEntry->area_name[handler->GetSessionDbcLocale()] : "<unknown>"),
object->GetPhaseMask(),
object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(),
cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(),
- zoneX, zoneY, groundZ, floorZ, haveMap, haveVMap);
+ zoneX, zoneY, groundZ, floorZ, haveMap, haveVMap, haveMMap);
LiquidData liquidStatus;
ZLiquidStatus status = map->getLiquidStatus(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), MAP_ALL_LIQUIDS, &liquidStatus);
@@ -674,7 +681,7 @@ public:
if (target)
{
- target->ResurrectPlayer(!AccountMgr::IsPlayerAccount(target->GetSession()->GetSecurity()) ? 1.0f : 0.5f);
+ target->ResurrectPlayer(target->GetSession()->HasPermission(RBAC_PERM_RESURRECT_WITH_FULL_HPS) ? 1.0f : 0.5f);
target->SpawnCorpseBones();
target->SaveToDB();
}
@@ -877,7 +884,7 @@ public:
Player* player = handler->GetSession()->GetPlayer();
// save GM account without delay and output message
- if (!AccountMgr::IsPlayerAccount(handler->GetSession()->GetSecurity()))
+ if (handler->GetSession()->HasPermission(RBAC_PERM_COMMANDS_SAVE_WITHOUT_DELAY))
{
if (Player* target = handler->getSelectedPlayer())
target->SaveToDB();
@@ -934,8 +941,8 @@ public:
static bool HandleUnstuckCommand(ChatHandler* handler, char const* args)
{
- //No args required for players
- if (handler->GetSession() && AccountMgr::IsPlayerAccount(handler->GetSession()->GetSecurity()))
+ // No args required for players
+ if (handler->GetSession() && !handler->GetSession()->HasPermission(RBAC_PERM_COMMANDS_USE_UNSTUCK_WITH_ARGS))
{
// 7355: "Stuck"
if (Player* player = handler->GetSession()->GetPlayer())
@@ -1534,7 +1541,7 @@ public:
return false;
Field* fields = result->Fetch();
- totalPlayerTime = fields[0].GetUInt32();
+ totalPlayerTime = fields[0].GetUInt32();
level = fields[1].GetUInt8();
money = fields[2].GetUInt32();
accId = fields[3].GetUInt32();
@@ -1546,6 +1553,8 @@ public:
std::string userName = handler->GetTrinityString(LANG_ERROR);
std::string eMail = handler->GetTrinityString(LANG_ERROR);
+ std::string muteReason = "";
+ std::string muteBy = "";
std::string lastIp = handler->GetTrinityString(LANG_ERROR);
uint32 security = 0;
std::string lastLogin = handler->GetTrinityString(LANG_ERROR);
@@ -1562,6 +1571,8 @@ public:
security = fields[1].GetUInt8();
eMail = fields[2].GetString();
muteTime = fields[5].GetUInt64();
+ muteReason = fields[6].GetString();
+ muteBy = fields[7].GetString();
if (eMail.empty())
eMail = "-";
@@ -1617,13 +1628,13 @@ public:
if (result2)
{
Field* fields = result2->Fetch();
- banTime = int64(fields[1].GetBool() ? 0 : fields[0].GetUInt32());
+ banTime = int64(fields[1].GetUInt64() ? 0 : fields[0].GetUInt32());
bannedby = fields[2].GetString();
banreason = fields[3].GetString();
}
if (muteTime > 0)
- handler->PSendSysMessage(LANG_PINFO_MUTE, secsToTimeString(muteTime - time(NULL), true).c_str());
+ handler->PSendSysMessage(LANG_PINFO_MUTE, secsToTimeString(muteTime - time(NULL), true).c_str(), muteBy.c_str(), muteReason.c_str());
if (banTime >= 0)
handler->PSendSysMessage(LANG_PINFO_BAN, banTime > 0 ? secsToTimeString(banTime - time(NULL), true).c_str() : "permanently", bannedby.c_str(), banreason.c_str());
@@ -1730,6 +1741,23 @@ public:
else
handler->PSendSysMessage(LANG_PINFO_MAP_OFFLINE, map->name[locale], areaName.c_str());
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_MEMBER_EXTENDED);
+ stmt->setUInt32(0, GUID_LOPART(targetGuid));
+
+ result = CharacterDatabase.Query(stmt);
+ if (result)
+ {
+ Field* fields = result->Fetch();
+
+ uint32 guildId = fields[0].GetUInt32();
+ std::string guildName = fields[1].GetString();
+ std::string guildRank = fields[2].GetString();
+ std::string note = fields[3].GetString();
+ std::string officeNote = fields[4].GetString();
+
+ handler->PSendSysMessage(LANG_PINFO_GUILD_INFO, guildName.c_str(), guildId, guildRank.c_str(), note.c_str(), officeNote.c_str());
+ }
+
return true;
}
@@ -1799,6 +1827,11 @@ public:
return false;
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME);
+ std::string muteBy = "";
+ if (handler->GetSession())
+ muteBy = handler->GetSession()->GetPlayerName();
+ else
+ muteBy = "Console";
if (target)
{
@@ -1806,7 +1839,7 @@ public:
int64 muteTime = time(NULL) + notSpeakTime * MINUTE;
target->GetSession()->m_muteTime = muteTime;
stmt->setInt64(0, muteTime);
- ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notSpeakTime, muteReasonStr.c_str());
+ ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notSpeakTime, muteBy.c_str(), muteReasonStr.c_str());
}
else
{
@@ -1815,7 +1848,9 @@ public:
stmt->setInt64(0, muteTime);
}
- stmt->setUInt32(1, accountId);
+ stmt->setString(1, muteReasonStr.c_str());
+ stmt->setString(2, muteBy.c_str());
+ stmt->setUInt32(3, accountId);
LoginDatabase.Execute(stmt);
std::string nameLink = handler->playerLink(targetName);
@@ -1858,7 +1893,9 @@ public:
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME);
stmt->setInt64(0, 0);
- stmt->setUInt32(1, accountId);
+ stmt->setString(1, "");
+ stmt->setString(2, "");
+ stmt->setUInt32(3, accountId);
LoginDatabase.Execute(stmt);
if (target)
@@ -2177,7 +2214,7 @@ public:
// from console show not existed sender
MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
- //- TODO: Fix poor design
+ /// @todo Fix poor design
SQLTransaction trans = CharacterDatabase.BeginTransaction();
MailDraft(subject, text)
.SendMailTo(trans, MailReceiver(target, GUID_LOPART(targetGuid)), sender);
@@ -2725,6 +2762,132 @@ public:
return true;
}
+ static bool HandleGroupJoinCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ Player* playerSource = NULL;
+ Player* playerTarget = NULL;
+ Group* groupSource = NULL;
+ Group* groupTarget = NULL;
+ uint64 guidSource = 0;
+ uint64 guidTarget = 0;
+ char* nameplgrStr = strtok((char*)args, " ");
+ char* nameplStr = strtok(NULL, " ");
+
+ if (handler->GetPlayerGroupAndGUIDByName(nameplgrStr, playerSource, groupSource, guidSource, true))
+ {
+ if (groupSource)
+ {
+ if (handler->GetPlayerGroupAndGUIDByName(nameplStr, playerTarget, groupTarget, guidTarget, true))
+ {
+ if (!groupTarget && playerTarget->GetGroup() != groupSource)
+ {
+ if (!groupSource->IsFull())
+ {
+ groupSource->AddMember(playerTarget);
+ groupSource->BroadcastGroupUpdate();
+ handler->PSendSysMessage(LANG_GROUP_PLAYER_JOINED, playerTarget->GetName().c_str(), playerSource->GetName().c_str());
+ return true;
+ }
+ else
+ {
+ // group is full
+ handler->PSendSysMessage(LANG_GROUP_FULL);
+ return true;
+ }
+ }
+ else
+ {
+ // group is full or target player already in a group
+ handler->PSendSysMessage(LANG_GROUP_ALREADY_IN_GROUP, playerTarget->GetName().c_str());
+ return true;
+ }
+ }
+ }
+ else
+ {
+ // specified source player is not in a group
+ handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, playerSource->GetName().c_str());
+ return true;
+ }
+ }
+
+ return true;
+ }
+
+ static bool HandleGroupListCommand(ChatHandler* handler, char const* args)
+ {
+ Player* playerTarget;
+ uint64 guidTarget;
+ std::string nameTarget;
+
+ uint32 parseGUID = MAKE_NEW_GUID(atol((char*)args), 0, HIGHGUID_PLAYER);
+
+ if (sObjectMgr->GetPlayerNameByGUID(parseGUID, nameTarget))
+ {
+ playerTarget = sObjectMgr->GetPlayerByLowGUID(parseGUID);
+ guidTarget = parseGUID;
+ }
+ else if (!handler->extractPlayerTarget((char*)args, &playerTarget, &guidTarget, &nameTarget))
+ return false;
+
+ Group* groupTarget = NULL;
+ if (playerTarget)
+ groupTarget = playerTarget->GetGroup();
+
+ if (!groupTarget)
+ {
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GROUP_MEMBER);
+ stmt->setUInt32(0, guidTarget);
+ PreparedQueryResult resultGroup = CharacterDatabase.Query(stmt);
+ if (resultGroup)
+ groupTarget = sGroupMgr->GetGroupByDbStoreId((*resultGroup)[0].GetUInt32());
+ }
+
+ if (groupTarget)
+ {
+ handler->PSendSysMessage(LANG_GROUP_TYPE, (groupTarget->isRaidGroup() ? "raid" : "party"));
+ Group::MemberSlotList const& members = groupTarget->GetMemberSlots();
+ for (Group::MemberSlotList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
+ {
+ Group::MemberSlot const& slot = *itr;
+
+ std::string flags;
+ if (slot.flags & MEMBER_FLAG_ASSISTANT)
+ flags = "Assistant";
+
+ if (slot.flags & MEMBER_FLAG_MAINTANK)
+ {
+ if (!flags.empty())
+ flags.append(", ");
+ flags.append("MainTank");
+ }
+
+ if (slot.flags & MEMBER_FLAG_MAINASSIST)
+ {
+ if (!flags.empty())
+ flags.append(", ");
+ flags.append("MainAssist");
+ }
+
+ if (flags.empty())
+ flags = "None";
+
+ Player* p = ObjectAccessor::FindPlayer((*itr).guid);
+ const char* onlineState = (p && p->IsInWorld()) ? "online" : "offline";
+
+ handler->PSendSysMessage(LANG_GROUP_PLAYER_NAME_GUID, slot.name.c_str(), onlineState,
+ GUID_LOPART(slot.guid), flags.c_str(), lfg::GetRolesString(slot.roles).c_str());
+ }
+ }
+ else
+ handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, nameTarget.c_str());
+
+ return true;
+ }
+
static bool HandlePlayAllCommand(ChatHandler* handler, char const* args)
{
if (!*args)
diff --git a/src/server/scripts/Commands/cs_mmaps.cpp b/src/server/scripts/Commands/cs_mmaps.cpp
new file mode 100644
index 00000000000..79cd0deb75e
--- /dev/null
+++ b/src/server/scripts/Commands/cs_mmaps.cpp
@@ -0,0 +1,294 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+* @file cs_mmaps.cpp
+* @brief .mmap related commands
+*
+* This file contains the CommandScripts for all
+* mmap sub-commands
+*/
+
+#include "ScriptMgr.h"
+#include "Chat.h"
+#include "ObjectMgr.h"
+#include "Player.h"
+#include "PointMovementGenerator.h"
+#include "PathGenerator.h"
+#include "MMapFactory.h"
+#include "Map.h"
+#include "TargetedMovementGenerator.h"
+#include "GridNotifiers.h"
+#include "GridNotifiersImpl.h"
+#include "CellImpl.h"
+
+class mmaps_commandscript : public CommandScript
+{
+public:
+ mmaps_commandscript() : CommandScript("mmaps_commandscript") { }
+
+ ChatCommand* GetCommands() const
+ {
+ static ChatCommand mmapCommandTable[] =
+ {
+ { "path", SEC_ADMINISTRATOR, false, &HandleMmapPathCommand, "", NULL },
+ { "loc", SEC_ADMINISTRATOR, false, &HandleMmapLocCommand, "", NULL },
+ { "loadedtiles", SEC_ADMINISTRATOR, false, &HandleMmapLoadedTilesCommand, "", NULL },
+ { "stats", SEC_ADMINISTRATOR, false, &HandleMmapStatsCommand, "", NULL },
+ { "testarea", SEC_ADMINISTRATOR, false, &HandleMmapTestArea, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+
+ static ChatCommand commandTable[] =
+ {
+ { "mmap", SEC_ADMINISTRATOR, true, NULL, "", mmapCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+ return commandTable;
+ }
+
+ static bool HandleMmapPathCommand(ChatHandler* handler, char const* args)
+ {
+ if (!MMAP::MMapFactory::createOrGetMMapManager()->GetNavMesh(handler->GetSession()->GetPlayer()->GetMapId()))
+ {
+ handler->PSendSysMessage("NavMesh not loaded for current map.");
+ return true;
+ }
+
+ handler->PSendSysMessage("mmap path:");
+
+ // units
+ Player* player = handler->GetSession()->GetPlayer();
+ Unit* target = handler->getSelectedUnit();
+ if (!player || !target)
+ {
+ handler->PSendSysMessage("Invalid target/source selection.");
+ return true;
+ }
+
+ char* para = strtok((char*)args, " ");
+
+ bool useStraightPath = false;
+ if (para && strcmp(para, "true") == 0)
+ useStraightPath = true;
+
+ // unit locations
+ float x, y, z;
+ player->GetPosition(x, y, z);
+
+ // path
+ PathGenerator path(target);
+ path.SetUseStraightPath(useStraightPath);
+ bool result = path.CalculatePath(x, y, z);
+
+ PointsArray const& pointPath = path.GetPath();
+ handler->PSendSysMessage("%s's path to %s:", target->GetName().c_str(), player->GetName().c_str());
+ handler->PSendSysMessage("Building: %s", useStraightPath ? "StraightPath" : "SmoothPath");
+ handler->PSendSysMessage("Result: %s - Length: "SIZEFMTD" - Type: %u", (result ? "true" : "false"), pointPath.size(), path.GetPathType());
+
+ Vector3 start = path.GetStartPosition();
+ Vector3 end = path.GetEndPosition();
+ Vector3 actualEnd = path.GetActualEndPosition();
+
+ handler->PSendSysMessage("StartPosition (%.3f, %.3f, %.3f)", start.x, start.y, start.z);
+ handler->PSendSysMessage("EndPosition (%.3f, %.3f, %.3f)", end.x, end.y, end.z);
+ handler->PSendSysMessage("ActualEndPosition (%.3f, %.3f, %.3f)", actualEnd.x, actualEnd.y, actualEnd.z);
+
+ if (!player->isGameMaster())
+ handler->PSendSysMessage("Enable GM mode to see the path points.");
+
+ for (uint32 i = 0; i < pointPath.size(); ++i)
+ player->SummonCreature(VISUAL_WAYPOINT, pointPath[i].x, pointPath[i].y, pointPath[i].z, 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
+
+ return true;
+ }
+
+ static bool HandleMmapLocCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ handler->PSendSysMessage("mmap tileloc:");
+
+ // grid tile location
+ Player* player = handler->GetSession()->GetPlayer();
+
+ int32 gx = 32 - player->GetPositionX() / SIZE_OF_GRIDS;
+ int32 gy = 32 - player->GetPositionY() / SIZE_OF_GRIDS;
+
+ handler->PSendSysMessage("%03u%02i%02i.mmtile", player->GetMapId(), gy, gx);
+ handler->PSendSysMessage("gridloc [%i,%i]", gx, gy);
+
+ // calculate navmesh tile location
+ dtNavMesh const* navmesh = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMesh(handler->GetSession()->GetPlayer()->GetMapId());
+ dtNavMeshQuery const* navmeshquery = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMeshQuery(handler->GetSession()->GetPlayer()->GetMapId(), player->GetInstanceId());
+ if (!navmesh || !navmeshquery)
+ {
+ handler->PSendSysMessage("NavMesh not loaded for current map.");
+ return true;
+ }
+
+ float const* min = navmesh->getParams()->orig;
+ float x, y, z;
+ player->GetPosition(x, y, z);
+ float location[VERTEX_SIZE] = {y, z, x};
+ float extents[VERTEX_SIZE] = {3.0f, 5.0f, 3.0f};
+
+ int32 tilex = int32((y - min[0]) / SIZE_OF_GRIDS);
+ int32 tiley = int32((x - min[2]) / SIZE_OF_GRIDS);
+
+ handler->PSendSysMessage("Calc [%02i,%02i]", tilex, tiley);
+
+ // navmesh poly -> navmesh tile location
+ dtQueryFilter filter = dtQueryFilter();
+ dtPolyRef polyRef = INVALID_POLYREF;
+ navmeshquery->findNearestPoly(location, extents, &filter, &polyRef, NULL);
+
+ if (polyRef == INVALID_POLYREF)
+ handler->PSendSysMessage("Dt [??,??] (invalid poly, probably no tile loaded)");
+ else
+ {
+ dtMeshTile const* tile;
+ dtPoly const* poly;
+ navmesh->getTileAndPolyByRef(polyRef, &tile, &poly);
+ if (tile)
+ handler->PSendSysMessage("Dt [%02i,%02i]", tile->header->x, tile->header->y);
+ else
+ handler->PSendSysMessage("Dt [??,??] (no tile loaded)");
+ }
+
+ return true;
+ }
+
+ static bool HandleMmapLoadedTilesCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ uint32 mapid = handler->GetSession()->GetPlayer()->GetMapId();
+ dtNavMesh const* navmesh = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMesh(mapid);
+ dtNavMeshQuery const* navmeshquery = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMeshQuery(mapid, handler->GetSession()->GetPlayer()->GetInstanceId());
+ if (!navmesh || !navmeshquery)
+ {
+ handler->PSendSysMessage("NavMesh not loaded for current map.");
+ return true;
+ }
+
+ handler->PSendSysMessage("mmap loadedtiles:");
+
+ for (int32 i = 0; i < navmesh->getMaxTiles(); ++i)
+ {
+ dtMeshTile const* tile = navmesh->getTile(i);
+ if (!tile || !tile->header)
+ continue;
+
+ handler->PSendSysMessage("[%02i,%02i]", tile->header->x, tile->header->y);
+ }
+
+ return true;
+ }
+
+ static bool HandleMmapStatsCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ uint32 mapId = handler->GetSession()->GetPlayer()->GetMapId();
+ handler->PSendSysMessage("mmap stats:");
+ handler->PSendSysMessage(" global mmap pathfinding is %sabled", MMAP::MMapFactory::IsPathfindingEnabled(mapId) ? "en" : "dis");
+
+ MMAP::MMapManager* manager = MMAP::MMapFactory::createOrGetMMapManager();
+ handler->PSendSysMessage(" %u maps loaded with %u tiles overall", manager->getLoadedMapsCount(), manager->getLoadedTilesCount());
+
+ dtNavMesh const* navmesh = manager->GetNavMesh(handler->GetSession()->GetPlayer()->GetMapId());
+ if (!navmesh)
+ {
+ handler->PSendSysMessage("NavMesh not loaded for current map.");
+ return true;
+ }
+
+ uint32 tileCount = 0;
+ uint32 nodeCount = 0;
+ uint32 polyCount = 0;
+ uint32 vertCount = 0;
+ uint32 triCount = 0;
+ uint32 triVertCount = 0;
+ uint32 dataSize = 0;
+ for (int32 i = 0; i < navmesh->getMaxTiles(); ++i)
+ {
+ dtMeshTile const* tile = navmesh->getTile(i);
+ if (!tile || !tile->header)
+ continue;
+
+ tileCount++;
+ nodeCount += tile->header->bvNodeCount;
+ polyCount += tile->header->polyCount;
+ vertCount += tile->header->vertCount;
+ triCount += tile->header->detailTriCount;
+ triVertCount += tile->header->detailVertCount;
+ dataSize += tile->dataSize;
+ }
+
+ handler->PSendSysMessage("Navmesh stats:");
+ handler->PSendSysMessage(" %u tiles loaded", tileCount);
+ handler->PSendSysMessage(" %u BVTree nodes", nodeCount);
+ handler->PSendSysMessage(" %u polygons (%u vertices)", polyCount, vertCount);
+ handler->PSendSysMessage(" %u triangles (%u vertices)", triCount, triVertCount);
+ handler->PSendSysMessage(" %.2f MB of data (not including pointers)", ((float)dataSize / sizeof(unsigned char)) / 1048576);
+
+ return true;
+ }
+
+ static bool HandleMmapTestArea(ChatHandler* handler, char const* /*args*/)
+ {
+ float radius = 40.0f;
+ WorldObject* object = handler->GetSession()->GetPlayer();
+
+ CellCoord pair(Trinity::ComputeCellCoord(object->GetPositionX(), object->GetPositionY()));
+ Cell cell(pair);
+ cell.SetNoCreate();
+
+ std::list<Creature*> creatureList;
+
+ Trinity::AnyUnitInObjectRangeCheck go_check(object, radius);
+ Trinity::CreatureListSearcher<Trinity::AnyUnitInObjectRangeCheck> go_search(object, creatureList, go_check);
+ TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AnyUnitInObjectRangeCheck>, GridTypeMapContainer> go_visit(go_search);
+
+ // Get Creatures
+ cell.Visit(pair, go_visit, *(object->GetMap()), *object, radius);
+
+ if (!creatureList.empty())
+ {
+ handler->PSendSysMessage("Found "SIZEFMTD" Creatures.", creatureList.size());
+
+ uint32 paths = 0;
+ uint32 uStartTime = getMSTime();
+
+ float gx, gy, gz;
+ object->GetPosition(gx, gy, gz);
+ for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
+ {
+ PathGenerator path(*itr);
+ path.CalculatePath(gx, gy, gz);
+ ++paths;
+ }
+
+ uint32 uPathLoadTime = getMSTimeDiff(uStartTime, getMSTime());
+ handler->PSendSysMessage("Generated %i paths in %i ms", paths, uPathLoadTime);
+ }
+ else
+ handler->PSendSysMessage("No creatures in %f yard range.", radius);
+
+ return true;
+ }
+};
+
+void AddSC_mmaps_commandscript()
+{
+ new mmaps_commandscript();
+}
diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp
index 01648f25cff..7219615736e 100644
--- a/src/server/scripts/Commands/cs_modify.cpp
+++ b/src/server/scripts/Commands/cs_modify.cpp
@@ -1046,9 +1046,12 @@ public:
ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, handler->GetNameLink().c_str(), moneyToAdd);
if (moneyToAdd >= MAX_MONEY_AMOUNT)
- target->SetMoney(MAX_MONEY_AMOUNT);
- else
- target->ModifyMoney(moneyToAdd);
+ moneyToAdd = MAX_MONEY_AMOUNT;
+
+ if (targetMoney >= uint32(MAX_MONEY_AMOUNT) - moneyToAdd)
+ moneyToAdd -= targetMoney;
+
+ target->ModifyMoney(moneyToAdd);
}
sLog->outDebug(LOG_FILTER_GENERAL, handler->GetTrinityString(LANG_NEW_MONEY), targetMoney, moneyToAdd, target->GetMoney());
@@ -1246,6 +1249,7 @@ public:
}
target->GetReputationMgr().SetOneFactionReputation(factionEntry, amount, false);
+ target->GetReputationMgr().SendState(target->GetReputationMgr().GetState(factionEntry));
handler->PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->name[handler->GetSessionDbcLocale()], factionId,
handler->GetNameLink(target).c_str(), target->GetReputationMgr().GetReputation(factionEntry));
return true;
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index 8679e288282..79a74b0823d 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -33,6 +33,42 @@ EndScriptData */
#include "Player.h"
#include "Pet.h"
+struct NpcFlagText
+{
+ uint32 flag;
+ int32 text;
+};
+
+#define NPCFLAG_COUNT 24
+
+const NpcFlagText npcFlagTexts[NPCFLAG_COUNT] =
+{
+ { UNIT_NPC_FLAG_AUCTIONEER, LANG_NPCINFO_AUCTIONEER },
+ { UNIT_NPC_FLAG_BANKER, LANG_NPCINFO_BANKER },
+ { UNIT_NPC_FLAG_BATTLEMASTER, LANG_NPCINFO_BATTLEMASTER },
+ { UNIT_NPC_FLAG_FLIGHTMASTER, LANG_NPCINFO_FLIGHTMASTER },
+ { UNIT_NPC_FLAG_GOSSIP, LANG_NPCINFO_GOSSIP },
+ { UNIT_NPC_FLAG_GUILD_BANKER, LANG_NPCINFO_GUILD_BANKER },
+ { UNIT_NPC_FLAG_INNKEEPER, LANG_NPCINFO_INNKEEPER },
+ { UNIT_NPC_FLAG_PETITIONER, LANG_NPCINFO_PETITIONER },
+ { UNIT_NPC_FLAG_PLAYER_VEHICLE, LANG_NPCINFO_PLAYER_VEHICLE },
+ { UNIT_NPC_FLAG_QUESTGIVER, LANG_NPCINFO_QUESTGIVER },
+ { UNIT_NPC_FLAG_REPAIR, LANG_NPCINFO_REPAIR },
+ { UNIT_NPC_FLAG_SPELLCLICK, LANG_NPCINFO_SPELLCLICK },
+ { UNIT_NPC_FLAG_SPIRITGUIDE, LANG_NPCINFO_SPIRITGUIDE },
+ { UNIT_NPC_FLAG_SPIRITHEALER, LANG_NPCINFO_SPIRITHEALER },
+ { UNIT_NPC_FLAG_STABLEMASTER, LANG_NPCINFO_STABLEMASTER },
+ { UNIT_NPC_FLAG_TABARDDESIGNER, LANG_NPCINFO_TABARDDESIGNER },
+ { UNIT_NPC_FLAG_TRAINER, LANG_NPCINFO_TRAINER },
+ { UNIT_NPC_FLAG_TRAINER_CLASS, LANG_NPCINFO_TRAINER_CLASS },
+ { UNIT_NPC_FLAG_TRAINER_PROFESSION, LANG_NPCINFO_TRAINER_PROFESSION },
+ { UNIT_NPC_FLAG_VENDOR, LANG_NPCINFO_VENDOR },
+ { UNIT_NPC_FLAG_VENDOR_AMMO, LANG_NPCINFO_VENDOR_AMMO },
+ { UNIT_NPC_FLAG_VENDOR_FOOD, LANG_NPCINFO_VENDOR_FOOD },
+ { UNIT_NPC_FLAG_VENDOR_POISON, LANG_NPCINFO_VENDOR_POISON },
+ { UNIT_NPC_FLAG_VENDOR_REAGENT, LANG_NPCINFO_VENDOR_REAGENT }
+};
+
class npc_commandscript : public CommandScript
{
public:
@@ -46,7 +82,7 @@ public:
{ "item", SEC_GAMEMASTER, false, &HandleNpcAddVendorItemCommand, "", NULL },
{ "move", SEC_GAMEMASTER, false, &HandleNpcAddMoveCommand, "", NULL },
{ "temp", SEC_GAMEMASTER, false, &HandleNpcAddTempSpawnCommand, "", NULL },
- //{ TODO: fix or remove this command
+ //{@todo fix or remove this command
{ "weapon", SEC_ADMINISTRATOR, false, &HandleNpcAddWeaponCommand, "", NULL },
//}
{ "", SEC_GAMEMASTER, false, &HandleNpcAddCommand, "", NULL },
@@ -78,7 +114,7 @@ public:
{ "spawndist", SEC_GAMEMASTER, false, &HandleNpcSetSpawnDistCommand, "", NULL },
{ "spawntime", SEC_GAMEMASTER, false, &HandleNpcSetSpawnTimeCommand, "", NULL },
{ "data", SEC_ADMINISTRATOR, false, &HandleNpcSetDataCommand, "", NULL },
- //{ TODO: fix or remove these commands
+ //{ @todo fix or remove these commands
{ "name", SEC_GAMEMASTER, false, &HandleNpcSetNameCommand, "", NULL },
{ "subname", SEC_GAMEMASTER, false, &HandleNpcSetSubNameCommand, "", NULL },
//}
@@ -609,21 +645,20 @@ public:
handler->PSendSysMessage(LANG_NPCINFO_CHAR, target->GetDBTableGUIDLow(), target->GetGUIDLow(), faction, npcflags, Entry, displayid, nativeid);
handler->PSendSysMessage(LANG_NPCINFO_LEVEL, target->getLevel());
+ handler->PSendSysMessage(LANG_NPCINFO_EQUIPMENT, target->GetCurrentEquipmentId(), target->GetOriginalEquipmentId());
handler->PSendSysMessage(LANG_NPCINFO_HEALTH, target->GetCreateHealth(), target->GetMaxHealth(), target->GetHealth());
- handler->PSendSysMessage(LANG_NPCINFO_FLAGS, target->GetUInt32Value(UNIT_FIELD_FLAGS), target->GetUInt32Value(UNIT_DYNAMIC_FLAGS), target->getFaction());
+ handler->PSendSysMessage(LANG_NPCINFO_FLAGS, target->GetUInt32Value(UNIT_FIELD_FLAGS), target->GetUInt32Value(UNIT_FIELD_FLAGS_2), target->GetUInt32Value(UNIT_DYNAMIC_FLAGS), target->getFaction());
handler->PSendSysMessage(LANG_COMMAND_RAWPAWNTIMES, defRespawnDelayStr.c_str(), curRespawnDelayStr.c_str());
handler->PSendSysMessage(LANG_NPCINFO_LOOT, cInfo->lootid, cInfo->pickpocketLootId, cInfo->SkinLootId);
handler->PSendSysMessage(LANG_NPCINFO_DUNGEON_ID, target->GetInstanceId());
handler->PSendSysMessage(LANG_NPCINFO_PHASEMASK, target->GetPhaseMask());
handler->PSendSysMessage(LANG_NPCINFO_ARMOR, target->GetArmor());
- handler->PSendSysMessage(LANG_NPCINFO_POSITION, float(target->GetPositionX()), float(target->GetPositionY()), float(target->GetPositionZ()));
+ handler->PSendSysMessage(LANG_NPCINFO_POSITION, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ());
handler->PSendSysMessage(LANG_NPCINFO_AIINFO, target->GetAIName().c_str(), target->GetScriptName().c_str());
- if (npcflags & UNIT_NPC_FLAG_VENDOR)
- handler->SendSysMessage(LANG_NPCINFO_VENDOR);
-
- if (npcflags & UNIT_NPC_FLAG_TRAINER)
- handler->SendSysMessage(LANG_NPCINFO_TRAINER);
+ for (uint8 i = 0; i < NPCFLAG_COUNT; i++)
+ if (npcflags & npcFlagTexts[i].flag)
+ handler->PSendSysMessage(npcFlagTexts[i].text, npcFlagTexts[i].flag);
return true;
}
@@ -1386,7 +1421,7 @@ public:
return true;
}
- //TODO: NpcCommands that need to be fixed :
+ /// @todo NpcCommands that need to be fixed :
static bool HandleNpcAddWeaponCommand(ChatHandler* /*handler*/, char const* /*args*/)
{
/*if (!*args)
diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp
index a8748bc1adf..e0d67b55989 100644
--- a/src/server/scripts/Commands/cs_quest.cpp
+++ b/src/server/scripts/Commands/cs_quest.cpp
@@ -80,7 +80,7 @@ public:
// check item starting quest (it can work incorrectly if added without item in inventory)
ItemTemplateContainer const* itc = sObjectMgr->GetItemTemplateStore();
- ItemTemplateContainer::const_iterator result = find_if(itc->begin(), itc->end(), Finder<uint32, ItemTemplate>(entry, &ItemTemplate::StartQuest));
+ ItemTemplateContainer::const_iterator result = find_if (itc->begin(), itc->end(), Finder<uint32, ItemTemplate>(entry, &ItemTemplate::StartQuest));
if (result != itc->end())
{
@@ -138,6 +138,12 @@ public:
// we ignore unequippable quest items in this case, its' still be equipped
player->TakeQuestSourceItem(logQuest, false);
+
+ if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
+ {
+ player->pvpInfo.IsHostile = player->pvpInfo.IsInHostileArea || player->HasPvPForcingQuest();
+ player->UpdatePvPState();
+ }
}
}
diff --git a/src/server/scripts/Commands/cs_rbac.cpp b/src/server/scripts/Commands/cs_rbac.cpp
new file mode 100644
index 00000000000..604218c2e68
--- /dev/null
+++ b/src/server/scripts/Commands/cs_rbac.cpp
@@ -0,0 +1,780 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* ScriptData
+Name: rbac_commandscript
+%Complete: 100
+Comment: All role based access control related commands (including account related)
+Category: commandscripts
+EndScriptData */
+
+#include "AccountMgr.h"
+#include "Config.h"
+#include "Chat.h"
+#include "Language.h"
+#include "Player.h"
+#include "ScriptMgr.h"
+
+struct RBACCommandData
+{
+ RBACCommandData(): id(0), realmId(0), rbac(NULL), needDelete(false) { }
+ uint32 id;
+ int32 realmId;
+ RBACData* rbac;
+ bool needDelete;
+};
+
+class rbac_commandscript : public CommandScript
+{
+public:
+ rbac_commandscript() : CommandScript("rbac_commandscript") { }
+
+ ChatCommand* GetCommands() const
+ {
+ static ChatCommand rbacGroupsCommandTable[] =
+ {
+ { "add", SEC_ADMINISTRATOR, true, &HandleRBACGroupAddCommand, "", NULL },
+ { "remove", SEC_ADMINISTRATOR, true, &HandleRBACGroupRemoveCommand, "", NULL },
+ { "", SEC_ADMINISTRATOR, true, &HandleRBACGroupListCommand, "", NULL },
+ { NULL, SEC_ADMINISTRATOR, false, NULL, "", NULL }
+ };
+
+ static ChatCommand rbacRolesCommandTable[] =
+ {
+ { "grant", SEC_ADMINISTRATOR, true, &HandleRBACRoleGrantCommand, "", NULL },
+ { "deny", SEC_ADMINISTRATOR, true, &HandleRBACRoleDenyCommand, "", NULL },
+ { "revoke", SEC_ADMINISTRATOR, true, &HandleRBACRoleRevokeCommand, "", NULL },
+ { "", SEC_ADMINISTRATOR, true, &HandleRBACRoleListCommand, "", NULL },
+ { NULL, SEC_ADMINISTRATOR, false, NULL, "", NULL }
+ };
+
+ static ChatCommand rbacPermsCommandTable[] =
+ {
+ { "grant", SEC_ADMINISTRATOR, true, &HandleRBACPermGrantCommand, "", NULL },
+ { "deny", SEC_ADMINISTRATOR, true, &HandleRBACPermDenyCommand, "", NULL },
+ { "revoke", SEC_ADMINISTRATOR, true, &HandleRBACPermRevokeCommand, "", NULL },
+ { "", SEC_ADMINISTRATOR, true, &HandleRBACPermListCommand, "", NULL },
+ { NULL, SEC_ADMINISTRATOR, false, NULL, "", NULL }
+ };
+
+ static ChatCommand rbacListCommandTable[] =
+ {
+ { "groups", SEC_ADMINISTRATOR, true, &HandleRBACListGroupsCommand, "", NULL },
+ { "roles", SEC_ADMINISTRATOR, true, &HandleRBACListRolesCommand, "", NULL },
+ { "permissions", SEC_ADMINISTRATOR, true, &HandleRBACListPermissionsCommand, "", NULL },
+ { NULL, SEC_ADMINISTRATOR, false, NULL, "", NULL }
+ };
+
+ static ChatCommand rbacAccountCommandTable[] =
+ {
+ { "group", SEC_ADMINISTRATOR, true, NULL, "", rbacGroupsCommandTable },
+ { "role", SEC_ADMINISTRATOR, true, NULL, "", rbacRolesCommandTable },
+ { "permission", SEC_ADMINISTRATOR, true, NULL, "", rbacPermsCommandTable },
+ { "", SEC_ADMINISTRATOR, true, &HandleRBACAccountPermissionCommand, "", NULL },
+ { NULL, SEC_ADMINISTRATOR, false, NULL, "", NULL }
+ };
+
+ static ChatCommand rbacCommandTable[] =
+ {
+ { "account", SEC_ADMINISTRATOR, true, NULL, "", rbacAccountCommandTable },
+ { "list", SEC_ADMINISTRATOR, true, NULL, "", rbacListCommandTable },
+ { NULL, SEC_ADMINISTRATOR, false, NULL, "", NULL }
+ };
+
+ static ChatCommand commandTable[] =
+ {
+ { "rbac", SEC_ADMINISTRATOR, true, NULL, "", rbacCommandTable },
+ { NULL, SEC_ADMINISTRATOR, false, NULL, "", NULL }
+ };
+
+ return commandTable;
+ }
+
+ static RBACCommandData* ReadParams(ChatHandler* handler, char const* args, bool checkParams = true)
+ {
+ if (!args)
+ return NULL;
+
+ char* param1 = strtok((char*)args, " ");
+ char* param2 = strtok(NULL, " ");
+ char* param3 = strtok(NULL, " ");
+
+ int32 realmId = -1;
+ uint32 accountId = 0;
+ std::string accountName;
+ uint32 id = 0;
+ RBACCommandData* data = NULL;
+ RBACData* rdata = NULL;
+ bool useSelectedPlayer = false;
+
+ if (checkParams)
+ {
+ if (!param3)
+ {
+ if (param2)
+ realmId = atoi(param2);
+
+ if (param1)
+ id = atoi(param1);
+
+ useSelectedPlayer = true;
+ }
+ else
+ {
+ id = atoi(param2);
+ realmId = atoi(param3);
+ }
+
+ if (!id)
+ {
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, id);
+ handler->SetSentErrorMessage(true);
+ return NULL;
+ }
+
+ if (realmId < -1 || !realmId)
+ {
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_REALM, realmId);
+ handler->SetSentErrorMessage(true);
+ return NULL;
+ }
+ }
+ else if (!param1)
+ useSelectedPlayer = true;
+
+ if (useSelectedPlayer)
+ {
+ Player* player = handler->getSelectedPlayer();
+ if (!player)
+ return NULL;
+
+ rdata = player->GetSession()->GetRBACData();
+ accountId = rdata->GetId();
+ AccountMgr::GetName(accountId, accountName);
+ }
+ else
+ {
+ accountName = param1;
+
+ if (AccountMgr::normalizeString(accountName))
+ accountId = AccountMgr::GetId(accountName);
+
+ if (!accountId)
+ {
+ handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());
+ handler->SetSentErrorMessage(true);
+ return NULL;
+ }
+ }
+
+ if (checkParams && handler->HasLowerSecurityAccount(NULL, accountId, true))
+ return NULL;
+
+ data = new RBACCommandData();
+
+ if (!rdata)
+ {
+ data->rbac = new RBACData(accountId, accountName, realmID);
+ data->rbac->LoadFromDB();
+ data->needDelete = true;
+ }
+ else
+ data->rbac = rdata;
+
+ data->id = id;
+ data->realmId = realmId;
+ return data;
+ }
+
+ static bool HandleRBACGroupAddCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ RBACCommandResult result = command->rbac->AddGroup(command->id, command->realmId);
+ RBACGroup const* group = sAccountMgr->GetRBACGroup(command->id);
+
+ switch (result)
+ {
+ case RBAC_CANT_ADD_ALREADY_ADDED:
+ handler->PSendSysMessage(LANG_RBAC_GROUP_IN_LIST, command->id, group->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_GROUP_ADDED, command->id, group->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACGroupRemoveCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ RBACCommandResult result = command->rbac->RemoveGroup(command->id, command->realmId);
+ RBACGroup const* group = sAccountMgr->GetRBACGroup(command->id);
+
+ switch (result)
+ {
+ case RBAC_CANT_REVOKE_NOT_IN_LIST:
+ handler->PSendSysMessage(LANG_RBAC_GROUP_NOT_IN_LIST, command->id, group->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_GROUP_REMOVED, command->id, group->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACGroupListCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args, false);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage(LANG_RBAC_GROUP_LIST_HEADER, command->rbac->GetId(), command->rbac->GetName().c_str());
+ RBACGroupContainer const& groups = command->rbac->GetGroups();
+ if (groups.empty())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (RBACGroupContainer::const_iterator it = groups.begin(); it != groups.end(); ++it)
+ {
+ RBACGroup const* group = sAccountMgr->GetRBACGroup(*it);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, group->GetId(), group->GetName().c_str());
+ }
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACRoleGrantCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ RBACCommandResult result = command->rbac->GrantRole(command->id, command->realmId);
+ RBACRole const* role = sAccountMgr->GetRBACRole(command->id);
+
+ switch (result)
+ {
+ case RBAC_CANT_ADD_ALREADY_ADDED:
+ handler->PSendSysMessage(LANG_RBAC_ROLE_GRANTED_IN_LIST, command->id, role->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_IN_DENIED_LIST:
+ handler->PSendSysMessage(LANG_RBAC_ROLE_GRANTED_IN_DENIED_LIST, command->id, role->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_ROLE_GRANTED, command->id, role->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACRoleDenyCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ RBACCommandResult result = command->rbac->DenyRole(command->id, command->realmId);
+ RBACRole const* role = sAccountMgr->GetRBACRole(command->id);
+
+ switch (result)
+ {
+ case RBAC_CANT_ADD_ALREADY_ADDED:
+ handler->PSendSysMessage(LANG_RBAC_ROLE_DENIED_IN_LIST, command->id, role->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_IN_GRANTED_LIST:
+ handler->PSendSysMessage(LANG_RBAC_ROLE_DENIED_IN_GRANTED_LIST, command->id, role->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_ROLE_DENIED, command->id, role->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACRoleRevokeCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ RBACCommandResult result = command->rbac->RevokeRole(command->id, command->realmId);
+ RBACRole const* role = sAccountMgr->GetRBACRole(command->id);
+
+ switch (result)
+ {
+ case RBAC_CANT_REVOKE_NOT_IN_LIST:
+ handler->PSendSysMessage(LANG_RBAC_ROLE_REVOKED_NOT_IN_LIST, command->id, role->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_ROLE_REVOKED, command->id, role->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACRoleListCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args, false);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage(LANG_RBAC_ROLE_LIST_HEADER_GRANTED, command->rbac->GetId(), command->rbac->GetName().c_str());
+ RBACGroupContainer const& granted = command->rbac->GetGrantedRoles();
+ if (granted.empty())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (RBACRoleContainer::const_iterator it = granted.begin(); it != granted.end(); ++it)
+ {
+ RBACRole const* role = sAccountMgr->GetRBACRole(*it);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, role->GetId(), role->GetName().c_str());
+ }
+ }
+
+ handler->PSendSysMessage(LANG_RBAC_ROLE_LIST_HEADER_DENIED, command->rbac->GetId(), command->rbac->GetName().c_str());
+ RBACGroupContainer const& denied = command->rbac->GetDeniedRoles();
+ if (denied.empty())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (RBACRoleContainer::const_iterator it = denied.begin(); it != denied.end(); ++it)
+ {
+ RBACRole const* role = sAccountMgr->GetRBACRole(*it);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, role->GetId(), role->GetName().c_str());
+ }
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACPermGrantCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ RBACCommandResult result = command->rbac->GrantPermission(command->id, command->realmId);
+ RBACPermission const* permission = sAccountMgr->GetRBACPermission(command->id);
+
+ switch (result)
+ {
+ case RBAC_CANT_ADD_ALREADY_ADDED:
+ handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED_IN_LIST, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_IN_DENIED_LIST:
+ handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED_IN_DENIED_LIST, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACPermDenyCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ RBACCommandResult result = command->rbac->DenyPermission(command->id, command->realmId);
+ RBACPermission const* permission = sAccountMgr->GetRBACPermission(command->id);
+
+ switch (result)
+ {
+ case RBAC_CANT_ADD_ALREADY_ADDED:
+ handler->PSendSysMessage(LANG_RBAC_PERM_DENIED_IN_LIST, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_IN_GRANTED_LIST:
+ handler->PSendSysMessage(LANG_RBAC_PERM_DENIED_IN_GRANTED_LIST, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_PERM_DENIED, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACPermRevokeCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ RBACCommandResult result = command->rbac->RevokePermission(command->id, command->realmId);
+ RBACPermission const* permission = sAccountMgr->GetRBACPermission(command->id);
+
+ switch (result)
+ {
+ case RBAC_CANT_REVOKE_NOT_IN_LIST:
+ handler->PSendSysMessage(LANG_RBAC_PERM_REVOKED_NOT_IN_LIST, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_PERM_REVOKED, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACPermListCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args, false);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage(LANG_RBAC_PERM_LIST_HEADER_GRANTED, command->rbac->GetId(), command->rbac->GetName().c_str());
+ RBACPermissionContainer const& granted = command->rbac->GetGrantedPermissions();
+ if (!granted.any())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (uint32 i = 0; i < RBAC_PERM_MAX; ++i)
+ if (granted.test(i))
+ {
+ RBACPermission const* permission = sAccountMgr->GetRBACPermission(i);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
+ }
+ }
+
+ handler->PSendSysMessage(LANG_RBAC_PERM_LIST_HEADER_DENIED, command->rbac->GetId(), command->rbac->GetName().c_str());
+ RBACPermissionContainer const& denied = command->rbac->GetDeniedPermissions();
+ if (!denied.any())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (uint32 i = 0; i < RBAC_PERM_MAX; ++i)
+ if (denied.test(i))
+ {
+ RBACPermission const* permission = sAccountMgr->GetRBACPermission(i);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
+ }
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACAccountPermissionCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args, false);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage(LANG_RBAC_PERM_LIST_GLOBAL, command->rbac->GetId(), command->rbac->GetName().c_str());
+ RBACPermissionContainer const& permissions = command->rbac->GetPermissions();
+ if (!permissions.any())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (uint32 i = 0; i < RBAC_PERM_MAX; ++i)
+ if (permissions.test(i))
+ {
+ RBACPermission const* permission = sAccountMgr->GetRBACPermission(i);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
+ }
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACListGroupsCommand(ChatHandler* handler, char const* args)
+ {
+ uint32 id = 0;
+ if (char* param1 = strtok((char*)args, " "))
+ id = atoi(param1);
+
+ if (!id)
+ {
+ RBACGroupsContainer const& groups = sAccountMgr->GetRBACGroupList();
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_GROUPS_HEADER));
+ for (RBACGroupsContainer::const_iterator it = groups.begin(); it != groups.end(); ++it)
+ {
+ RBACGroup const* group = it->second;
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, group->GetId(), group->GetName().c_str());
+ }
+ }
+ else
+ {
+ RBACGroup const* group = sAccountMgr->GetRBACGroup(id);
+ if (!group)
+ {
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, id);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_GROUPS_HEADER));
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, group->GetId(), group->GetName().c_str());
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_ROLES_HEADER));
+ RBACRoleContainer const& roles = group->GetRoles();
+ if (roles.empty())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (RBACRoleContainer::const_iterator it = roles.begin(); it != roles.end(); ++it)
+ {
+ RBACRole const* role = sAccountMgr->GetRBACRole(*it);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, role->GetId(), role->GetName().c_str());
+ }
+ }
+ }
+
+ return true;
+ }
+
+ static bool HandleRBACListRolesCommand(ChatHandler* handler, char const* args)
+ {
+ uint32 id = 0;
+ if (char* param1 = strtok((char*)args, " "))
+ id = atoi(param1);
+
+ if (!id)
+ {
+ RBACRolesContainer const& roles = sAccountMgr->GetRBACRoleList();
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_ROLES_HEADER));
+ for (RBACRolesContainer::const_iterator it = roles.begin(); it != roles.end(); ++it)
+ {
+ RBACRole const* role = it->second;
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, role->GetId(), role->GetName().c_str());
+ }
+ }
+ else
+ {
+ RBACRole const* role = sAccountMgr->GetRBACRole(id);
+ if (!role)
+ {
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, id);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_ROLES_HEADER));
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, role->GetId(), role->GetName().c_str());
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_PERMISSIONS_HEADER));
+ RBACPermissionContainer const& permissions = role->GetPermissions();
+ if (!permissions.any())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (uint32 i = 0; i < RBAC_PERM_MAX; ++i)
+ if (permissions.test(i))
+ {
+ RBACPermission const* permission = sAccountMgr->GetRBACPermission(i);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
+ }
+ }
+ }
+
+ return true;
+ }
+
+ static bool HandleRBACListPermissionsCommand(ChatHandler* handler, char const* args)
+ {
+ uint32 id = 0;
+ if (char* param1 = strtok((char*)args, " "))
+ id = atoi(param1);
+
+ if (!id)
+ {
+ RBACPermissionsContainer const& permissions = sAccountMgr->GetRBACPermissionList();
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_PERMISSIONS_HEADER));
+ for (RBACPermissionsContainer::const_iterator it = permissions.begin(); it != permissions.end(); ++it)
+ {
+ RBACPermission const* permission = it->second;
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
+ }
+ }
+ else
+ {
+ RBACPermission const* permission = sAccountMgr->GetRBACPermission(id);
+ if (!permission)
+ {
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, id);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_PERMISSIONS_HEADER));
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
+ }
+
+ return true;
+ }
+};
+
+void AddSC_rbac_commandscript()
+{
+ new rbac_commandscript();
+}
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index 43c2001fbf7..7aee1139868 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -22,6 +22,7 @@ Comment: All reload related commands
Category: commandscripts
EndScriptData */
+#include "AccountMgr.h"
#include "AchievementMgr.h"
#include "AuctionHouseMgr.h"
#include "Chat.h"
@@ -86,6 +87,7 @@ public:
{ "creature_loot_template", SEC_ADMINISTRATOR, true, &HandleReloadLootTemplatesCreatureCommand, "", NULL },
{ "creature_onkill_reputation", SEC_ADMINISTRATOR, true, &HandleReloadOnKillReputationCommand, "", NULL },
{ "creature_questrelation", SEC_ADMINISTRATOR, true, &HandleReloadCreatureQuestRelationsCommand, "", NULL },
+ { "creature_summon_groups", SEC_ADMINISTRATOR, true, &HandleReloadCreatureSummonGroupsCommand, "", NULL },
{ "creature_template", SEC_ADMINISTRATOR, true, &HandleReloadCreatureTemplateCommand, "", NULL },
//{ "db_script_string", SEC_ADMINISTRATOR, true, &HandleReloadDbScriptStringCommand, "", NULL },
{ "disables", SEC_ADMINISTRATOR, true, &HandleReloadDisablesCommand, "", NULL },
@@ -127,6 +129,7 @@ public:
{ "prospecting_loot_template", SEC_ADMINISTRATOR, true, &HandleReloadLootTemplatesProspectingCommand, "", NULL },
{ "quest_poi", SEC_ADMINISTRATOR, true, &HandleReloadQuestPOICommand, "", NULL },
{ "quest_template", SEC_ADMINISTRATOR, true, &HandleReloadQuestTemplateCommand, "", NULL },
+ { "rbac", SEC_ADMINISTRATOR, true, &HandleReloadRBACCommand, "", NULL },
{ "reference_loot_template", SEC_ADMINISTRATOR, true, &HandleReloadLootTemplatesReferenceCommand, "", NULL },
{ "reserved_name", SEC_ADMINISTRATOR, true, &HandleReloadReservedNameCommand, "", NULL },
{ "reputation_reward_rate", SEC_ADMINISTRATOR, true, &HandleReloadReputationRewardRateCommand, "", NULL },
@@ -195,6 +198,8 @@ public:
HandleReloadTrinityStringCommand(handler, "");
HandleReloadGameTeleCommand(handler, "");
+ HandleReloadCreatureSummonGroupsCommand(handler, "");
+
HandleReloadVehicleAccessoryCommand(handler, "");
HandleReloadVehicleTemplateAccessoryCommand(handler, "");
@@ -397,6 +402,14 @@ public:
return true;
}
+ static bool HandleReloadCreatureSummonGroupsCommand(ChatHandler* handler, const char* /*args*/)
+ {
+ sLog->outInfo(LOG_FILTER_GENERAL, "Reloading creature summon groups...");
+ sObjectMgr->LoadTempSummons();
+ handler->SendGlobalGMSysMessage("DB table `creature_summon_groups` reloaded.");
+ return true;
+ }
+
static bool HandleReloadCreatureTemplateCommand(ChatHandler* handler, const char* args)
{
if (!*args)
@@ -508,10 +521,9 @@ public:
cInfo->questItems[5] = fields[78].GetUInt32();
cInfo->movementId = fields[79].GetUInt32();
cInfo->RegenHealth = fields[80].GetBool();
- cInfo->equipmentId = fields[81].GetUInt32();
- cInfo->MechanicImmuneMask = fields[82].GetUInt32();
- cInfo->flags_extra = fields[83].GetUInt32();
- cInfo->ScriptID = sObjectMgr->GetScriptId(fields[84].GetCString());
+ cInfo->MechanicImmuneMask = fields[81].GetUInt32();
+ cInfo->flags_extra = fields[82].GetUInt32();
+ cInfo->ScriptID = sObjectMgr->GetScriptId(fields[83].GetCString());
sObjectMgr->CheckCreatureTemplate(cInfo);
}
@@ -1232,6 +1244,15 @@ public:
handler->SendGlobalGMSysMessage("Vehicle template accessories reloaded.");
return true;
}
+
+ static bool HandleReloadRBACCommand(ChatHandler* handler, const char* /*args*/)
+ {
+ sLog->outInfo(LOG_FILTER_GENERAL, "Reloading RBAC tables...");
+ sAccountMgr->LoadRBAC();
+ sWorld->ReloadRBAC();
+ handler->SendGlobalGMSysMessage("RBAC data reloaded.");
+ return true;
+ }
};
void AddSC_reload_commandscript()
diff --git a/src/server/scripts/Commands/cs_ticket.cpp b/src/server/scripts/Commands/cs_ticket.cpp
index 3215b533bce..95cbf70e1f8 100644
--- a/src/server/scripts/Commands/cs_ticket.cpp
+++ b/src/server/scripts/Commands/cs_ticket.cpp
@@ -95,13 +95,10 @@ public:
return true;
}
- // Get target information
- uint64 targetGuid = sObjectMgr->GetPlayerGUIDByName(target.c_str());
- uint64 targetAccountId = sObjectMgr->GetPlayerAccountIdByGUID(targetGuid);
- uint32 targetGmLevel = AccountMgr::GetSecurity(targetAccountId, realmID);
-
+ uint64 targetGuid = sObjectMgr->GetPlayerGUIDByName(target);
+ uint32 accountId = sObjectMgr->GetPlayerAccountIdByGUID(targetGuid);
// Target must exist and have administrative rights
- if (!targetGuid || AccountMgr::IsPlayerAccount(targetGmLevel))
+ if (!AccountMgr::HasPermission(accountId, RBAC_PERM_COMMANDS_BE_ASSIGNED_TICKET, realmID))
{
handler->SendSysMessage(LANG_COMMAND_TICKETASSIGNERROR_A);
return true;
@@ -125,7 +122,7 @@ public:
// Assign ticket
SQLTransaction trans = SQLTransaction(NULL);
- ticket->SetAssignedTo(targetGuid, AccountMgr::IsAdminAccount(targetGmLevel));
+ ticket->SetAssignedTo(targetGuid, AccountMgr::IsAdminAccount(AccountMgr::GetSecurity(accountId, realmID)));
ticket->SaveToDB(trans);
sTicketMgr->UpdateLastChange();
@@ -386,12 +383,13 @@ public:
return true;
}
+ std::string assignedTo = ticket->GetAssignedToName(); // copy assignedto name because we need it after the ticket has been unnassigned
SQLTransaction trans = SQLTransaction(NULL);
ticket->SetUnassigned();
ticket->SaveToDB(trans);
sTicketMgr->UpdateLastChange();
- std::string msg = ticket->FormatMessageString(*handler, NULL, ticket->GetAssignedToName().c_str(),
+ std::string msg = ticket->FormatMessageString(*handler, NULL, assignedTo.c_str(),
handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", NULL);
handler->SendGlobalGMSysMessage(msg.c_str());
diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp
index 87b12021212..bb48e94f744 100644
--- a/src/server/scripts/Commands/cs_wp.cpp
+++ b/src/server/scripts/Commands/cs_wp.cpp
@@ -700,7 +700,7 @@ public:
wpCreature2->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
// To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells();
- //TODO: Should we first use "Create" then use "LoadFromDB"?
+ /// @todo Should we first use "Create" then use "LoadFromDB"?
if (!wpCreature2->LoadCreatureFromDB(wpCreature2->GetDBTableGUIDLow(), map))
{
handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT);
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp
index 809bd2440d7..d301e702174 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp
@@ -104,7 +104,7 @@ class mob_av_marshal_or_warmaster : public CreatureScript
Reset();
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
// I have a feeling this isn't blizzlike, but owell, I'm only passing by and cleaning up.
if (!_hasAura)
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
index 5622e91cd73..6dec1796500 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
@@ -62,7 +62,7 @@ public:
resetTimer = 5 * IN_MILLISECONDS;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -145,7 +145,7 @@ public:
summons.DespawnAll();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp
index 6e2738d79ca..745c310d35c 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp
@@ -75,7 +75,7 @@ public:
Talk(YELL_RESPAWN);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp
index fea8573d6f8..2cf7d7cafef 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp
@@ -69,7 +69,7 @@ public:
Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp
index 732bbc6f1ba..6939890a702 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp
@@ -64,7 +64,7 @@ public:
Talk(YELL_AGGRO);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp
index 071e0c4dd19..0cbeec50f98 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp
@@ -109,7 +109,7 @@ enum GrimstoneTexts
SAY_TEXT6 = 5
};
-//TODO: implement quest part of event (different end boss)
+/// @todo implement quest part of event (different end boss)
class npc_grimstone : public CreatureScript
{
public:
@@ -160,7 +160,7 @@ public:
CanWalk = false;
}
- //TODO: move them to center
+ /// @todo move them to center
void SummonRingMob()
{
if (Creature* tmp = me->SummonCreature(RingMob[MobSpawnId], 608.960f, -235.322f, -53.907f, 1.857f, TEMPSUMMON_DEAD_DESPAWN, 0))
@@ -172,7 +172,7 @@ public:
MobDeath_Timer = 2500;
}
- //TODO: move them to center
+ /// @todo move them to center
void SummonRingBoss()
{
if (Creature* tmp = me->SummonCreature(RingBoss[rand()%6], 644.300f, -175.989f, -53.739f, 3.418f, TEMPSUMMON_DEAD_DESPAWN, 0))
@@ -222,7 +222,7 @@ public:
instance->HandleGameObject(instance->GetData64(id), open);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!instance)
return;
@@ -372,7 +372,7 @@ public:
MightyBlow_Timer = 15000;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -648,7 +648,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) return;
if ((instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_FAILED || instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_ENDED)&& instance->GetData(DATA_DUGHAL) == ENCOUNTER_STATE_ENDED)
@@ -807,7 +807,7 @@ public:
instance->SetData(DATA_QUEST_JAIL_BREAK, ENCOUNTER_STATE_FAILED);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED)
return;
@@ -1017,7 +1017,7 @@ public:
instance->SetData(DATA_QUEST_JAIL_BREAK, ENCOUNTER_STATE_FAILED);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED)
return;
@@ -1151,7 +1151,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (instance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED)
return;
@@ -1284,7 +1284,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!instance)
return;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_ambassador_flamelash.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_ambassador_flamelash.cpp
index 99619a89bf3..c5d93ad0c85 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_ambassador_flamelash.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_ambassador_flamelash.cpp
@@ -55,7 +55,7 @@ public:
Spirit->AI()->AttackStart(victim);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_anubshiah.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_anubshiah.cpp
index 424489fc703..bb4de5b347a 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_anubshiah.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_anubshiah.cpp
@@ -59,7 +59,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp
index 3a7baff0196..aaf0adc57c4 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp
@@ -81,7 +81,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_general_angerforge.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_general_angerforge.cpp
index 8c2c590e3e5..bd5a06bf46c 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_general_angerforge.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_general_angerforge.cpp
@@ -69,7 +69,7 @@ public:
SummonedMedic->AI()->AttackStart(victim);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_gorosh_the_dervish.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_gorosh_the_dervish.cpp
index 4f876f41907..02c00b4958c 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_gorosh_the_dervish.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_gorosh_the_dervish.cpp
@@ -52,7 +52,7 @@ public:
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_grizzle.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_grizzle.cpp
index 51fddc0f71f..a0ab6f9939c 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_grizzle.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_grizzle.cpp
@@ -51,7 +51,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_high_interrogator_gerstahn.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_high_interrogator_gerstahn.cpp
index 0631a4308df..a901bc3d5e3 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_high_interrogator_gerstahn.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_high_interrogator_gerstahn.cpp
@@ -56,7 +56,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_magmus.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_magmus.cpp
index fa8a13f1bfd..5c496ed597b 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_magmus.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_magmus.cpp
@@ -55,7 +55,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_moira_bronzebeard.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_moira_bronzebeard.cpp
index 3142610b346..bb528de9dca 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_moira_bronzebeard.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_moira_bronzebeard.cpp
@@ -58,7 +58,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_tomb_of_seven.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_tomb_of_seven.cpp
index f4e9d561b5e..2767c76a69e 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_tomb_of_seven.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/boss_tomb_of_seven.cpp
@@ -202,7 +202,7 @@ public:
instance->SetData(DATA_GHOSTKILL, 1);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp
index fa1f79d82e7..7081974195f 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp
@@ -69,7 +69,7 @@ public:
_JustDied();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp
index cef633ac2d8..667265cdba0 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp
@@ -30,7 +30,7 @@ enum Spells
enum Adds
{
- MODEL_REND_ON_DRAKE = 9723, // TODO: use creature_template 10459 instead of its modelid
+ MODEL_REND_ON_DRAKE = 9723, /// @todo use creature_template 10459 instead of its modelid
NPC_RAGE_TALON_FIRE_TONG = 10372,
NPC_CHROMATIC_WHELP = 10442,
NPC_CHROMATIC_DRAGONSPAWN = 10447,
@@ -92,7 +92,7 @@ public:
Summoned->AddThreat(target, 250.0f);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_halycon.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_halycon.cpp
index 2f9d39152e3..af0e5110523 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_halycon.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_halycon.cpp
@@ -68,7 +68,7 @@ public:
_JustDied();
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp
index afb6ab75649..082e1f8e79b 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp
@@ -78,7 +78,7 @@ public:
_JustDied();
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp
index d67fa7c5caa..fc6d3f7d4db 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_mother_smolderweb.cpp
@@ -70,7 +70,7 @@ public:
DoCast(me, SPELL_SUMMON_SPIRE_SPIDERLING, true);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp
index ff68462ffb5..09d85a680b8 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_overlord_wyrmthalak.cpp
@@ -81,7 +81,7 @@ public:
_JustDied();
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp
index 047ad3f7096..44a27e6938f 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp
@@ -66,7 +66,6 @@ public:
{
if (instance->GetBossState(DATA_PYROGAURD_EMBERSEER) == IN_PROGRESS)
OpenDoors(false);
- instance->SetBossState(DATA_PYROGAURD_EMBERSEER,NOT_STARTED);
// respawn any dead Blackhand Incarcerators
DoCast(me, SPELL_ENCAGED_EMBERSEER);
//DoCast(me, SPELL_FIRE_SHIELD_TRIGGER);
@@ -83,7 +82,6 @@ public:
void JustDied(Unit* /*killer*/)
{
- instance->SetBossState(DATA_PYROGAURD_EMBERSEER,DONE);
OpenDoors(true);
_JustDied();
}
@@ -99,10 +97,9 @@ public:
door3->SetGoState(GO_STATE_ACTIVE);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
-
return;
events.Update(diff);
@@ -115,11 +112,11 @@ public:
switch (eventId)
{
case EVENT_FIRENOVA:
- DoCast(me->getVictim(), SPELL_FIRENOVA);
+ DoCastVictim(SPELL_FIRENOVA);
events.ScheduleEvent(EVENT_FIRENOVA, 6 * IN_MILLISECONDS);
break;
case EVENT_FLAMEBUFFET:
- DoCast(me->getVictim(), SPELL_FLAMEBUFFET);
+ DoCastVictim(SPELL_FLAMEBUFFET);
events.ScheduleEvent(EVENT_FLAMEBUFFET, 14 * IN_MILLISECONDS);
break;
case EVENT_PYROBLAST:
@@ -129,6 +126,7 @@ public:
break;
}
}
+
DoMeleeAttackIfReady();
}
};
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp
index 2f86c009d56..8828fcfe753 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_quartermaster_zigris.cpp
@@ -65,7 +65,7 @@ public:
_JustDied();
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp
index b881f94dda9..b8d9377d7c4 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp
@@ -66,7 +66,7 @@ public:
_JustDied();
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp
index 69ebf33248f..c429931d42b 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp
@@ -67,7 +67,7 @@ public:
_JustDied();
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_the_beast.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_the_beast.cpp
index f8f4f64b618..a32fefeca40 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_the_beast.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_the_beast.cpp
@@ -66,7 +66,7 @@ public:
_JustDied();
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp
index 7d4c7a40d61..056448854dc 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp
@@ -75,7 +75,7 @@ public:
_JustDied();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp
index 72a5712181e..06ba0036ef3 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp
@@ -215,7 +215,8 @@ public:
switch (eventId)
{
case EVENT_PYROGUARD_EMBERSEER:
- SetBossState(DATA_PYROGAURD_EMBERSEER,IN_PROGRESS);
+ if (GetBossState(DATA_PYROGAURD_EMBERSEER) == NOT_STARTED)
+ SetBossState(DATA_PYROGAURD_EMBERSEER, IN_PROGRESS);
break;
default:
break;
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp
index 0aeba151385..73afebfa9f3 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp
@@ -32,12 +32,20 @@ enum Say
SAY_LEASH = 1,
};
+enum Events
+{
+ EVENT_CLEAVE = 1,
+ EVENT_MORTAL_STRIKE = 2,
+ EVENT_BLAST_WAVE = 3,
+ EVENT_KNOCK_BACK = 4,
+};
+
enum Spells
{
SPELL_CLEAVE = 26350,
- SPELL_BLASTWAVE = 23331,
- SPELL_MORTALSTRIKE = 24573,
- SPELL_KNOCKBACK = 25778
+ SPELL_BLAST_WAVE = 23331,
+ SPELL_MORTAL_STRIKE = 24573,
+ SPELL_KNOCK_BACK = 25778
};
class boss_broodlord : public CreatureScript
@@ -54,17 +62,13 @@ public:
{
boss_broodlordAI(Creature* creature) : ScriptedAI(creature) {}
- uint32 Cleave_Timer;
- uint32 BlastWave_Timer;
- uint32 MortalStrike_Timer;
- uint32 KnockBack_Timer;
-
void Reset()
{
- Cleave_Timer = 8000; // These times are probably wrong
- BlastWave_Timer = 12000;
- MortalStrike_Timer = 20000;
- KnockBack_Timer = 30000;
+ // These timers are probably wrong
+ events.ScheduleEvent(EVENT_CLEAVE, 8000);
+ events.ScheduleEvent(EVENT_BLAST_WAVE, 12000);
+ events.ScheduleEvent(EVENT_MORTAL_STRIKE, 20000);
+ events.ScheduleEvent(EVENT_KNOCK_BACK, 30000);
}
void EnterCombat(Unit* /*who*/)
@@ -73,47 +77,56 @@ public:
DoZoneInCombat();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
- //Cleave_Timer
- if (Cleave_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_CLEAVE);
- Cleave_Timer = 7000;
- } else Cleave_Timer -= diff;
-
- // BlastWave
- if (BlastWave_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_BLASTWAVE);
- BlastWave_Timer = urand(8000, 16000);
- } else BlastWave_Timer -= diff;
+ if (EnterEvadeIfOutOfCombatArea(diff))
+ Talk(SAY_LEASH);
- //MortalStrike_Timer
- if (MortalStrike_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_MORTALSTRIKE);
- MortalStrike_Timer = urand(25000, 35000);
- } else MortalStrike_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- if (KnockBack_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- DoCast(me->getVictim(), SPELL_KNOCKBACK);
- //Drop 50% aggro
- if (DoGetThreat(me->getVictim()))
- DoModifyThreatPercent(me->getVictim(), -50);
-
- KnockBack_Timer = urand(15000, 30000);
- } else KnockBack_Timer -= diff;
+ switch (eventId)
+ {
+ case EVENT_CLEAVE:
+ DoCastVictim(SPELL_CLEAVE);
+ events.ScheduleEvent(EVENT_CLEAVE, 8000);
+ break;
+ case EVENT_MORTAL_STRIKE:
+ DoCastVictim(SPELL_MORTAL_STRIKE);
+ events.ScheduleEvent(EVENT_MORTAL_STRIKE, 20000);
+ break;
+ case EVENT_BLAST_WAVE:
+ DoCastVictim(SPELL_BLAST_WAVE);
+ events.ScheduleEvent(EVENT_BLAST_WAVE, 12000);
+ break;
+ case EVENT_KNOCK_BACK:
+ if (Unit* target = me->getVictim())
+ {
+ DoCast(target, SPELL_BLAST_WAVE);
+ // Drop 50% of threat
+ if (DoGetThreat(target))
+ DoModifyThreatPercent(target, -50);
+ }
+ events.ScheduleEvent(EVENT_KNOCK_BACK, 30000);
+ break;
+ default:
+ break;
+ }
+ }
if (EnterEvadeIfOutOfCombatArea(diff))
Talk(SAY_LEASH);
DoMeleeAttackIfReady();
}
+
+ private:
+ EventMap events; /// @todo: change BWL to instance script and bosses to BossAI
};
};
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_chromaggus.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_chromaggus.cpp
index 14e4e90337c..c7459ed2f7d 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_chromaggus.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_chromaggus.cpp
@@ -200,7 +200,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_ebonroc.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_ebonroc.cpp
index 54c1ba99e8d..d1670171d67 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_ebonroc.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_ebonroc.cpp
@@ -27,9 +27,10 @@ EndScriptData */
#include "ScriptedCreature.h"
#define SPELL_SHADOWFLAME 22539
-#define SPELL_WINGBUFFET 18500
+#define SPELL_WINGBUFFET 23339
#define SPELL_SHADOWOFEBONROC 23340
-#define SPELL_HEAL 41386 //Thea Heal spell of his Shadow
+#define SPELL_HEAL 41386 //The Heal spell of his Shadow
+#define SPELL_THRASH 3391
class boss_ebonroc : public CreatureScript
{
@@ -49,6 +50,7 @@ public:
uint32 WingBuffet_Timer;
uint32 ShadowOfEbonroc_Timer;
uint32 Heal_Timer;
+ uint32 Thrash_Timer;
void Reset()
{
@@ -56,6 +58,7 @@ public:
WingBuffet_Timer = 30000;
ShadowOfEbonroc_Timer = 45000;
Heal_Timer = 1000;
+ Thrash_Timer = 10000;
}
void EnterCombat(Unit* /*who*/)
@@ -63,7 +66,7 @@ public:
DoZoneInCombat();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -71,25 +74,32 @@ public:
//Shadowflame Timer
if (ShadowFlame_Timer <= diff)
{
- DoCast(me->getVictim(), SPELL_SHADOWFLAME);
+ DoCastVictim(SPELL_SHADOWFLAME);
ShadowFlame_Timer = urand(12000, 15000);
} else ShadowFlame_Timer -= diff;
+ //Thrash Timer
+ if (Thrash_Timer <= diff)
+ {
+ DoCastVictim(SPELL_THRASH);
+ Thrash_Timer = urand(10000, 15000);
+ } else Thrash_Timer -= diff;
+
//Wing Buffet Timer
if (WingBuffet_Timer <= diff)
{
- DoCast(me->getVictim(), SPELL_WINGBUFFET);
+ DoCastVictim(SPELL_WINGBUFFET);
WingBuffet_Timer = 25000;
} else WingBuffet_Timer -= diff;
//Shadow of Ebonroc Timer
if (ShadowOfEbonroc_Timer <= diff)
{
- DoCast(me->getVictim(), SPELL_SHADOWOFEBONROC);
+ DoCastVictim(SPELL_SHADOWOFEBONROC);
ShadowOfEbonroc_Timer = urand(25000, 350000);
} else ShadowOfEbonroc_Timer -= diff;
- if (me->getVictim()->HasAura(SPELL_SHADOWOFEBONROC))
+ if (me->getVictim() && me->getVictim()->HasAura(SPELL_SHADOWOFEBONROC))
{
if (Heal_Timer <= diff)
{
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_firemaw.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_firemaw.cpp
index 7ca74f4ed4f..3b63d67814e 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_firemaw.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_firemaw.cpp
@@ -60,7 +60,7 @@ public:
DoZoneInCombat();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -68,24 +68,26 @@ public:
//ShadowFlame_Timer
if (ShadowFlame_Timer <= diff)
{
- DoCast(me->getVictim(), SPELL_SHADOWFLAME);
+ DoCastVictim(SPELL_SHADOWFLAME);
ShadowFlame_Timer = urand(15000, 18000);
} else ShadowFlame_Timer -= diff;
//WingBuffet_Timer
if (WingBuffet_Timer <= diff)
{
- DoCast(me->getVictim(), SPELL_WINGBUFFET);
- if (DoGetThreat(me->getVictim()))
- DoModifyThreatPercent(me->getVictim(), -75);
-
+ if (Unit* target = me->getVictim())
+ {
+ DoCast(target, SPELL_WINGBUFFET);
+ if (DoGetThreat(target))
+ DoModifyThreatPercent(target, -75);
+ }
WingBuffet_Timer = 25000;
} else WingBuffet_Timer -= diff;
//FlameBuffet_Timer
if (FlameBuffet_Timer <= diff)
{
- DoCast(me->getVictim(), SPELL_FLAMEBUFFET);
+ DoCastVictim(SPELL_FLAMEBUFFET);
FlameBuffet_Timer = 5000;
} else FlameBuffet_Timer -= diff;
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp
index a1659330a6f..f90389bc4eb 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp
@@ -68,7 +68,7 @@ public:
DoZoneInCombat();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -76,17 +76,19 @@ public:
//ShadowFlame_Timer
if (ShadowFlame_Timer <= diff)
{
- DoCast(me->getVictim(), SPELL_SHADOWFLAME);
+ DoCastVictim(SPELL_SHADOWFLAME);
ShadowFlame_Timer = urand(15000, 22000);
} else ShadowFlame_Timer -= diff;
//WingBuffet_Timer
if (WingBuffet_Timer <= diff)
{
- DoCast(me->getVictim(), SPELL_WINGBUFFET);
- if (DoGetThreat(me->getVictim()))
- DoModifyThreatPercent(me->getVictim(), -75);
-
+ if (Unit* target = me->getVictim())
+ {
+ DoCast(target, SPELL_WINGBUFFET);
+ if (DoGetThreat(target))
+ DoModifyThreatPercent(target, -75);
+ }
WingBuffet_Timer = 25000;
} else WingBuffet_Timer -= diff;
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp
index 5594d826fdf..f96d6c4a562 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp
@@ -123,7 +123,7 @@ public:
DoZoneInCombat();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (DespawnTimer <= diff)
{
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_razorgore.cpp
index b8361da5eb8..ebf6298b79d 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_razorgore.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_razorgore.cpp
@@ -81,7 +81,7 @@ public:
Talk(SAY_DEATH);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_vaelastrasz.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_vaelastrasz.cpp
index 45a9eb397eb..e07da353e90 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_vaelastrasz.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_vaelastrasz.cpp
@@ -156,7 +156,7 @@ public:
me->ResetPlayerDamageReq();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Speech
if (DoingSpeech)
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_victor_nefarius.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_victor_nefarius.cpp
index 86709e5e6b5..8a781b48e90 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_victor_nefarius.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_victor_nefarius.cpp
@@ -270,7 +270,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp
index eb8fc77717c..060c2e0506f 100644
--- a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp
+++ b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp
@@ -94,7 +94,7 @@ public:
return true;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
index 6b0d39d7223..558ffaf7135 100644
--- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
+++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
@@ -572,7 +572,7 @@ public:
CAST_CRE(summon)->AI()->SetData(2, 1);
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp
index bcdd1a9671a..9dab7439136 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp
@@ -95,7 +95,7 @@ public:
Talk(SAY_AGGRO);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp
index a431a3e10e7..52d9c697452 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp
@@ -89,7 +89,7 @@ public:
Talk(SAY_AGGRO);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp
index 8347e1c114d..19023f70c80 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp
@@ -44,7 +44,7 @@ enum Midnight
MOUNTED_DISPLAYID = 16040,
- //Attumen (TODO: Use the summoning spell instead of Creature id. It works, but is not convenient for us)
+ //Attumen (@todo Use the summoning spell instead of Creature id. It works, but is not convenient for us)
SUMMON_ATTUMEN = 15550,
};
@@ -104,7 +104,7 @@ public:
midnight->Kill(midnight);
}
- void UpdateAI(const uint32 diff);
+ void UpdateAI(uint32 diff);
void SpellHit(Unit* /*source*/, const SpellInfo* spell)
{
@@ -153,7 +153,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -234,7 +234,7 @@ public:
};
};
-void boss_attumen::boss_attumenAI::UpdateAI(const uint32 diff)
+void boss_attumen::boss_attumenAI::UpdateAI(uint32 diff)
{
if (ResetTimer)
{
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp
index 5c7c39e3725..f3bc733e722 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp
@@ -228,7 +228,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -354,7 +354,7 @@ struct boss_moroes_guestAI : public ScriptedAI
return me;
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (instance && !instance->GetData(TYPE_MOROES))
EnterEvadeMode();
@@ -421,7 +421,7 @@ public:
boss_moroes_guestAI::Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -482,7 +482,7 @@ public:
boss_moroes_guestAI::Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -543,7 +543,7 @@ public:
boss_moroes_guestAI::Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -613,7 +613,7 @@ public:
boss_moroes_guestAI::Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -683,7 +683,7 @@ public:
boss_moroes_guestAI::Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -741,7 +741,7 @@ public:
boss_moroes_guestAI::Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp
index dd9b97386b4..305e37a72d3 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp
@@ -269,7 +269,7 @@ public:
DestroyPortals();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
index 6d9a1f98e93..8165ba5c53b 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
@@ -260,7 +260,7 @@ public:
Skeletons = false;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
/* The timer for this was never setup apparently, not sure if the code works properly:
if (WaitTimer <= diff)
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp
index 3a026d23faa..4ef91b93b43 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp
@@ -121,7 +121,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (HellfireTimer)
{
@@ -386,7 +386,7 @@ public:
Talk(SAY_SUMMON);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -603,7 +603,7 @@ public:
void netherspite_infernal::netherspite_infernalAI::Cleanup()
{
- Creature *pMalchezaar = Unit::GetCreature(*me, malchezaar);
+ Creature* pMalchezaar = Unit::GetCreature(*me, malchezaar);
if (pMalchezaar && pMalchezaar->isAlive())
CAST_AI(boss_malchezaar::boss_malchezaarAI, pMalchezaar->AI())->Cleanup(me, point);
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp
index 5bd9e8a0bae..2a349297860 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp
@@ -217,7 +217,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -531,7 +531,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp
index 75a8c8cf662..fe773a1e3a2 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp
@@ -111,7 +111,7 @@ public:
} else ERROR_INST_DATA(me);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -228,7 +228,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -362,7 +362,7 @@ public:
instance->SetData(TYPE_TERESTIAN, DONE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp
index 6cb4e70ee7a..06389fbbf25 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp
@@ -187,7 +187,7 @@ public:
ScriptedAI::MoveInLineOfSight(who);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (AggroTimer)
{
@@ -263,7 +263,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -373,7 +373,7 @@ public:
Talk(SAY_STRAWMAN_SLAY);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (AggroTimer)
{
@@ -478,7 +478,7 @@ public:
Talk(SAY_TINHEAD_SLAY);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (AggroTimer)
{
@@ -585,7 +585,7 @@ public:
Talk(SAY_ROAR_SLAY);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (AggroTimer)
{
@@ -682,7 +682,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -735,7 +735,7 @@ public:
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!me->HasAura(SPELL_KNOCKBACK))
DoCast(me, SPELL_KNOCKBACK, true);
@@ -871,7 +871,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1121,7 +1121,7 @@ public:
Talk(SAY_JULIANNE_SLAY);
}
- void UpdateAI(const uint32 diff);
+ void UpdateAI(uint32 diff);
};
};
@@ -1276,7 +1276,7 @@ public:
Talk(SAY_ROMULO_SLAY);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || IsFakingDeath)
return;
@@ -1331,7 +1331,7 @@ public:
};
};
-void boss_julianne::boss_julianneAI::UpdateAI(const uint32 diff)
+void boss_julianne::boss_julianneAI::UpdateAI(uint32 diff)
{
if (EntryYellTimer)
{
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp
index 28bb17055f9..412fcae76b1 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp
@@ -19,7 +19,7 @@
/* ScriptData
SDName: Instance_Karazhan
SD%Complete: 70
-SDComment: Instance Script for Karazhan to help in various encounters. TODO: GameObject visibility for Opera event.
+SDComment: Instance Script for Karazhan to help in various encounters. @todo GameObject visibility for Opera event.
SDCategory: Karazhan
EndScriptData */
@@ -224,7 +224,7 @@ public:
switch (m_uiOperaEvent)
{
- //TODO: Set Object visibilities for Opera based on performance
+ /// @todo Set Object visibilities for Opera based on performance
case EVENT_OZ:
break;
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
index 7d3b63acb6a..b8525dd0181 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
@@ -266,7 +266,7 @@ public:
RaidWiped = false;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
npc_escortAI::UpdateAI(diff);
@@ -613,7 +613,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (YellTimer <= diff)
{
diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp
index 5d132cbd34e..308ff45fac5 100644
--- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp
@@ -134,7 +134,7 @@ public:
void Reset()
{
- // TODO: Timers
+ /// @todo Timers
FireballTimer = 0;
PhoenixTimer = 10000;
FlameStrikeTimer = 25000;
@@ -280,7 +280,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -462,7 +462,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (FlameStrikeTimer <= diff)
{
@@ -548,7 +548,7 @@ public:
me->SummonCreature(CREATURE_PHOENIX_EGG, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//If we are fake death, we cast revbirth and after that we kill the phoenix to spawn the egg.
if (FakeDeath)
@@ -610,7 +610,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (HatchTimer <= diff)
{
@@ -651,7 +651,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (DespawnTimer <= diff)
me->Kill(me);
diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp
index 3ed4c50fab4..36324e6b042 100644
--- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp
@@ -238,7 +238,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -456,7 +456,7 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UsedPotion && HealthBelowPct(25))
{
@@ -517,7 +517,7 @@ public:
boss_priestess_lackey_commonAI::Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -623,7 +623,7 @@ public:
DoCast(me, SPELL_SUMMON_IMP);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -703,7 +703,7 @@ public:
boss_priestess_lackey_commonAI::Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -780,7 +780,7 @@ public:
boss_priestess_lackey_commonAI::Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -907,7 +907,7 @@ public:
DoCast(me, SPELL_BATTLE_SHOUT);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1036,7 +1036,7 @@ public:
m_uiPetGUID = summoned->GetGUID();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1144,7 +1144,7 @@ public:
boss_priestess_lackey_commonAI::Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1240,7 +1240,7 @@ public:
boss_priestess_lackey_commonAI::Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp
index a18dbe79d40..bd5f57f8af0 100644
--- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp
@@ -242,7 +242,7 @@ public:
ShatterRemainingCrystals();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -338,7 +338,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
void AttackStart(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 /*diff*/) {}
+ void UpdateAI(uint32 /*diff*/) {}
void JustDied(Unit* /*killer*/)
{
diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp
index 85a113ec495..8958246f1cf 100644
--- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp
@@ -127,7 +127,7 @@ public:
summoned->CastSpell(summoned, SPELL_ENERGY_BOLT, false, 0, 0, me->GetGUID());
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp
index da1423ed0e9..daaa7d94d18 100644
--- a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp
@@ -154,7 +154,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (m_uiTransformTimer)
{
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_baron_geddon.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_baron_geddon.cpp
index cc8f2b41fbb..645322768e3 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_baron_geddon.cpp
+++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_baron_geddon.cpp
@@ -67,7 +67,7 @@ class boss_baron_geddon : public CreatureScript
events.ScheduleEvent(EVENT_LIVING_BOMB, 35000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_garr.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_garr.cpp
index 824fcca4714..aa563bf3180 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_garr.cpp
+++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_garr.cpp
@@ -64,7 +64,7 @@ class boss_garr : public CreatureScript
events.ScheduleEvent(EVENT_MAGMA_SHACKLES, 15000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -129,7 +129,7 @@ class mob_firesworn : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_gehennas.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_gehennas.cpp
index 6e9d9b00523..9007d16d2f9 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_gehennas.cpp
+++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_gehennas.cpp
@@ -61,7 +61,7 @@ class boss_gehennas : public CreatureScript
events.ScheduleEvent(EVENT_SHADOW_BOLT, 6000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_golemagg.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_golemagg.cpp
index 65c82610cc2..a21ca66543e 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_golemagg.cpp
+++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_golemagg.cpp
@@ -84,7 +84,7 @@ class boss_golemagg : public CreatureScript
events.ScheduleEvent(EVENT_EARTHQUAKE, 3000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -155,7 +155,7 @@ class mob_core_rager : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_lucifron.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_lucifron.cpp
index 1bb93b2e038..cb91cfc3cae 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_lucifron.cpp
+++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_lucifron.cpp
@@ -61,7 +61,7 @@ class boss_lucifron : public CreatureScript
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 6000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_magmadar.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_magmadar.cpp
index c18e9db1ab7..c4b338d635d 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_magmadar.cpp
+++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_magmadar.cpp
@@ -73,7 +73,7 @@ class boss_magmadar : public CreatureScript
events.ScheduleEvent(EVENT_LAVA_BOMB, 12000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp
index 26788e10302..a221e2829dd 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp
+++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp
@@ -94,7 +94,7 @@ class boss_majordomo : public CreatureScript
events.ScheduleEvent(EVENT_TELEPORT, 20000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (instance && instance->GetBossState(BOSS_MAJORDOMO_EXECUTUS) != DONE)
{
@@ -174,7 +174,7 @@ class boss_majordomo : public CreatureScript
}
}
- void DoAction(const int32 action)
+ void DoAction(int32 action)
{
if (action == ACTION_START_RAGNAROS)
{
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_ragnaros.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_ragnaros.cpp
index eecd9ae65f4..63764b5de01 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_ragnaros.cpp
+++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_ragnaros.cpp
@@ -115,7 +115,7 @@ class boss_ragnaros : public CreatureScript
Talk(SAY_KILL);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (_introState != 2)
{
@@ -328,7 +328,7 @@ class mob_son_of_flame : public CreatureScript
instance->SetData(DATA_RAGNAROS_ADDS, 1);
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_shazzrah.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_shazzrah.cpp
index 778a8012269..435082b5a98 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_shazzrah.cpp
+++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_shazzrah.cpp
@@ -66,7 +66,7 @@ class boss_shazzrah : public CreatureScript
events.ScheduleEvent(EVENT_BLINK, 30000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp
index 1ad0c5dfa2d..b4c2372a015 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp
+++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_sulfuron_harbinger.cpp
@@ -77,7 +77,7 @@ class boss_sulfuron : public CreatureScript
events.ScheduleEvent(EVENT_FLAMESPEAR, 2000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -162,7 +162,7 @@ class mob_flamewaker_priest : public CreatureScript
events.ScheduleEvent(EVENT_IMMOLATE, 8000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
index 97fe57c5434..d3cb21c75f0 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
@@ -102,10 +102,8 @@ public:
npc_unworthy_initiateAI(Creature* creature) : ScriptedAI(creature)
{
me->SetReactState(REACT_PASSIVE);
- if (!me->GetEquipmentId())
- if (const CreatureTemplate* info = sObjectMgr->GetCreatureTemplate(28406))
- if (info->equipmentId)
- const_cast<CreatureTemplate*>(me->GetCreatureTemplate())->equipmentId = info->equipmentId;
+ if (!me->GetCurrentEquipmentId())
+ me->SetCurrentEquipmentId(me->GetOriginalEquipmentId());
}
uint64 playerGUID;
@@ -146,7 +144,7 @@ public:
me->CastSpell(me, SPELL_DK_INITIATE_VISUAL, true);
if (Player* starter = Unit::GetPlayer(*me, playerGUID))
- Talk(SAY_EVENT_ATTACK);
+ sCreatureTextMgr->SendChat(me, SAY_EVENT_ATTACK, 0, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, starter);
phase = PHASE_TO_ATTACK;
}
@@ -168,7 +166,7 @@ public:
Talk(SAY_EVENT_START);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
switch (phase)
{
@@ -459,7 +457,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
{
@@ -495,7 +493,7 @@ public:
}
}
- // TODO: spells
+ /// @todo spells
CombatAI::UpdateAI(uiDiff);
}
@@ -544,7 +542,7 @@ public:
TargetGUID = 0;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!Intro || !TargetGUID)
return;
@@ -760,7 +758,7 @@ public:
if (CAST_PLR(owner)->GetQuestStatus(12698) == QUEST_STATUS_INCOMPLETE)
CAST_CRE(who)->CastSpell(owner, 52517, true);
- //Todo: Creatures must not be removed, but, must instead
+ /// @todo Creatures must not be removed, but, must instead
// stand next to Gothik and be commanded into the pit
// and dig into the ground.
CAST_CRE(who)->DespawnOrUnsummon();
@@ -816,7 +814,7 @@ public:
}
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!me->isInCombat())
{
@@ -890,7 +888,7 @@ public:
minerGUID = guid;
}
- void DoAction(const int32 /*param*/)
+ void DoAction(int32 /*param*/)
{
if (Creature* miner = Unit::GetCreature(*me, minerGUID))
{
@@ -1024,7 +1022,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (IntroPhase)
{
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
index 6985ad2c4ad..1f87d6f65cc 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
@@ -90,7 +90,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (speechCounter)
{
@@ -160,7 +160,7 @@ public:
## npc_koltira_deathweaver
######*/
-enum eKoltira
+enum Koltira
{
SAY_BREAKOUT1 = 0,
SAY_BREAKOUT2 = 1,
@@ -180,10 +180,9 @@ enum eKoltira
NPC_CRIMSON_ACOLYTE = 29007,
NPC_HIGH_INQUISITOR_VALROTH = 29001,
- NPC_KOLTIRA_ALT = 28447,
//not sure about this id
- //NPC_DEATH_KNIGHT_MOUNT = 29201,
+ //NPC_DEATH_KNIGHT_MOUNT = 29201,
MODEL_DEATH_KNIGHT_MOUNT = 25278
};
@@ -198,17 +197,12 @@ public:
{
creature->SetStandState(UNIT_STAND_STATE_STAND);
- if (npc_escortAI* pEscortAI = CAST_AI(npc_koltira_deathweaver::npc_koltira_deathweaverAI, creature->AI()))
- pEscortAI->Start(false, false, player->GetGUID());
+ if (npc_escortAI* escortAI = CAST_AI(npc_koltira_deathweaver::npc_koltira_deathweaverAI, creature->AI()))
+ escortAI->Start(false, false, player->GetGUID());
}
return true;
}
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_koltira_deathweaverAI(creature);
- }
-
struct npc_koltira_deathweaverAI : public npc_escortAI
{
npc_koltira_deathweaverAI(Creature* creature) : npc_escortAI(creature)
@@ -216,20 +210,17 @@ public:
me->SetReactState(REACT_DEFENSIVE);
}
- uint32 m_uiWave;
- uint32 m_uiWave_Timer;
- uint64 m_uiValrothGUID;
-
void Reset()
{
if (!HasEscortState(STATE_ESCORT_ESCORTING))
{
- m_uiWave = 0;
- m_uiWave_Timer = 3000;
- m_uiValrothGUID = 0;
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ wave = 0;
+ waveTimer = 3000;
+ valrothGUID = 0;
me->LoadEquipment(0, true);
- me->RemoveAura(SPELL_ANTI_MAGIC_ZONE);
+ me->RemoveAurasDueToSpell(SPELL_ANTI_MAGIC_ZONE);
+ me->RemoveAurasDueToSpell(SPELL_KOLTIRA_TRANSFORM);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
}
@@ -239,22 +230,21 @@ public:
{
case 0:
Talk(SAY_BREAKOUT1);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
break;
case 1:
me->SetStandState(UNIT_STAND_STATE_KNEEL);
break;
case 2:
me->SetStandState(UNIT_STAND_STATE_STAND);
- //me->UpdateEntry(NPC_KOLTIRA_ALT); //unclear if we must update or not
DoCast(me, SPELL_KOLTIRA_TRANSFORM);
- me->LoadEquipment(me->GetEquipmentId());
+ me->LoadEquipment();
break;
case 3:
SetEscortPaused(true);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetStandState(UNIT_STAND_STATE_KNEEL);
Talk(SAY_BREAKOUT2);
- DoCast(me, SPELL_ANTI_MAGIC_ZONE); // cast again that makes bubble up
+ DoCast(me, SPELL_ANTI_MAGIC_ZONE);
break;
case 4:
SetRun(true);
@@ -274,9 +264,8 @@ public:
summoned->AI()->AttackStart(player);
if (summoned->GetEntry() == NPC_HIGH_INQUISITOR_VALROTH)
- m_uiValrothGUID = summoned->GetGUID();
+ valrothGUID = summoned->GetGUID();
- summoned->AddThreat(me, 0.0f);
summoned->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
}
@@ -286,57 +275,57 @@ public:
me->SummonCreature(NPC_CRIMSON_ACOLYTE, 1642.329f, -6045.818f, 127.583f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
if (HasEscortState(STATE_ESCORT_PAUSED))
{
- if (m_uiWave_Timer <= uiDiff)
+ if (waveTimer <= uiDiff)
{
- switch (m_uiWave)
+ switch (wave)
{
case 0:
Talk(SAY_BREAKOUT3);
SummonAcolyte(3);
- m_uiWave_Timer = 20000;
+ waveTimer = 20000;
break;
case 1:
Talk(SAY_BREAKOUT4);
SummonAcolyte(3);
- m_uiWave_Timer = 20000;
+ waveTimer = 20000;
break;
case 2:
Talk(SAY_BREAKOUT5);
SummonAcolyte(4);
- m_uiWave_Timer = 20000;
+ waveTimer = 20000;
break;
case 3:
Talk(SAY_BREAKOUT6);
me->SummonCreature(NPC_HIGH_INQUISITOR_VALROTH, 1642.329f, -6045.818f, 127.583f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);
- m_uiWave_Timer = 1000;
+ waveTimer = 1000;
break;
case 4:
{
- Creature* temp = Unit::GetCreature(*me, m_uiValrothGUID);
+ Creature* temp = Unit::GetCreature(*me, valrothGUID);
if (!temp || !temp->isAlive())
{
Talk(SAY_BREAKOUT8);
- m_uiWave_Timer = 5000;
+ waveTimer = 5000;
}
else
{
- m_uiWave_Timer = 2500;
- return; //return, we don't want m_uiWave to increment now
+ waveTimer = 2500;
+ return;
}
break;
}
case 5:
Talk(SAY_BREAKOUT9);
me->RemoveAurasDueToSpell(SPELL_ANTI_MAGIC_ZONE);
- // i do not know why the armor will also be removed
- m_uiWave_Timer = 2500;
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ waveTimer = 2500;
break;
case 6:
Talk(SAY_BREAKOUT10);
@@ -344,14 +333,24 @@ public:
break;
}
- ++m_uiWave;
+ ++wave;
}
else
- m_uiWave_Timer -= uiDiff;
+ waveTimer -= uiDiff;
}
}
+
+ private:
+ uint8 wave;
+ uint32 waveTimer;
+ uint64 valrothGUID;
+
};
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_koltira_deathweaverAI(creature);
+ }
};
//Scarlet courier
@@ -404,7 +403,7 @@ public:
uiStage = 2;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (uiStage && !me->isInCombat())
{
@@ -487,7 +486,7 @@ public:
DoCast(who, SPELL_VALROTH_SMITE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (uiRenew_timer <= diff)
{
@@ -677,7 +676,7 @@ public:
PlayerGUID = who->GetGUID();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (PlayerGUID && !me->getVictim() && me->isAlive())
{
@@ -691,7 +690,7 @@ public:
return;
}
- //TODO: simplify text's selection
+ /// @todo simplify text's selection
switch (player->getRace())
{
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
index ff92710d5b2..3d91e81644e 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
@@ -606,7 +606,7 @@ public:
npc_escortAI::EnterEvadeMode();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
npc_escortAI::UpdateAI(diff);
@@ -1662,7 +1662,7 @@ public:
npc_the_lich_king_tirion_dawnAI(Creature* creature) : ScriptedAI(creature) { Reset(); }
void Reset() {}
void AttackStart(Unit* /*who*/) {} // very sample, just don't make them aggreesive
- void UpdateAI(const uint32 /*diff*/) {}
+ void UpdateAI(uint32 /*diff*/) {}
void JustDied(Unit* /*killer*/) {}
};
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp
index 32ce484f715..16e6554d1f4 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp
@@ -69,7 +69,7 @@ public:
me->SetPosition(x, y, z, 0.0f);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (FlyBackTimer <= diff)
{
@@ -104,7 +104,7 @@ public:
{
me->HandleEmoteCommand(EMOTE_ONESHOT_CUSTOM_SPELL_01);
DoCast(player, SPELL_REVIVE, true);
- Talk(WHISPER_REVIVE,player->GetGUID());
+ Talk(WHISPER_REVIVE, player->GetGUID());
}
FlyBackTimer = 5000;
break;
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp
index 1ede8a871d9..db08df50148 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp
@@ -72,7 +72,7 @@ public:
Talk(SAY_AGGRO);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_azshir_the_sleepless.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_azshir_the_sleepless.cpp
index 23480154c22..384ffeb6bf3 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_azshir_the_sleepless.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_azshir_the_sleepless.cpp
@@ -60,7 +60,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_bloodmage_thalnos.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_bloodmage_thalnos.cpp
index 7540a1eefb3..cae033f2a30 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_bloodmage_thalnos.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_bloodmage_thalnos.cpp
@@ -77,7 +77,7 @@ public:
Talk(SAY_KILL);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
index 4927666073b..32e8af3821b 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
@@ -204,7 +204,7 @@ public:
DoCast(who, SPELL_SQUASH_SOUL);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (delay)
{
@@ -325,7 +325,7 @@ public:
}
void Disappear();
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!withbody)
{
@@ -639,7 +639,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (withhead)
{
@@ -858,7 +858,7 @@ public:
DoStartMovement(who);
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (sprouted && UpdateVictim())
DoMeleeAttackIfReady();
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp
index 6e24dd81bbe..4929e0fbb3d 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_herod.cpp
@@ -93,7 +93,7 @@ public:
me->SummonCreature(ENTRY_SCARLET_TRAINEE, 1939.18f, -431.58f, 17.09f, 6.22f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -152,7 +152,7 @@ public:
void WaypointReached(uint32 /*waypointId*/) {}
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (Start_Timer)
{
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp
index 2c64ba693d0..235add380de 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp
@@ -19,7 +19,7 @@
/* ScriptData
SDName: Boss_High_Inquisitor_Fairbanks
SD%Complete: 100
-SDComment: TODO: if this guy not involved in some special event, remove (and let ACID script)
+SDComment: @todo if this guy not involved in some special event, remove (and let ACID script)
SDCategory: Scarlet Monastery
EndScriptData */
@@ -77,7 +77,7 @@ public:
me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_houndmaster_loksey.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_houndmaster_loksey.cpp
index 1b2679538b0..6bdf1a16b03 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_houndmaster_loksey.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_houndmaster_loksey.cpp
@@ -59,7 +59,7 @@ public:
Talk(SAY_AGGRO);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp
index 76673b7a632..4206e958f3c 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp
@@ -89,7 +89,7 @@ public:
vorrel->AI()->Talk(SAY_TRIGGER_VORREL);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp
index 70af355a4c7..c6fdc6e651b 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp
@@ -175,7 +175,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -290,7 +290,7 @@ public:
damage = me->GetHealth() - 1;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_scorn.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_scorn.cpp
index f6b6118f701..639db4571cb 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_scorn.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_scorn.cpp
@@ -63,7 +63,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp
index 471f28835cd..dccb7ccbaa0 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -16,216 +15,347 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Darkmaster_Gandling
-SD%Complete: 75
-SDComment: Doors missing in instance script.
-SDCategory: Scholomance
-EndScriptData */
+/*
+Name: Boss_Darkmaster_Gandling
+%Complete: 90
+Comment: Doors Not yet reopening.
+Category: Scholomance
+*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "scholomance.h"
+#include "SpellScript.h"
-#define SPELL_ARCANEMISSILES 22272
-#define SPELL_SHADOWSHIELD 22417 //Not right ID. But 12040 is wrong either.
-#define SPELL_CURSE 18702
-
-#define ADD_1X 170.205f
-#define ADD_1Y 99.413f
-#define ADD_1Z 104.733f
-#define ADD_1O 3.16f
-
-#define ADD_2X 170.813f
-#define ADD_2Y 97.857f
-#define ADD_2Z 104.713f
-#define ADD_2O 3.16f
+enum Says
+{
+ YELL_SUMMONED = 0
+};
-#define ADD_3X 170.720f
-#define ADD_3Y 100.900f
-#define ADD_3Z 104.739f
-#define ADD_3O 3.16f
+enum Spells
+{
+ SPELL_ARCANEMISSILES = 15790,
+ SPELL_SHADOWSHIELD = 12040,
+ SPELL_CURSE = 18702,
+ SPELL_SHADOW_PORTAL = 17950
+};
-#define ADD_4X 171.866f
-#define ADD_4Y 99.373f
-#define ADD_4Z 104.732f
-#define ADD_4O 3.16f
+enum Events
+{
+ EVENT_ARCANEMISSILES = 1,
+ EVENT_SHADOWSHIELD = 2,
+ EVENT_CURSE = 3,
+ EVENT_SHADOW_PORTAL = 4
+};
class boss_darkmaster_gandling : public CreatureScript
{
-public:
- boss_darkmaster_gandling() : CreatureScript("boss_darkmaster_gandling") { }
+ public: boss_darkmaster_gandling() : CreatureScript("boss_darkmaster_gandling") { }
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_darkmaster_gandlingAI (creature);
- }
-
- struct boss_darkmaster_gandlingAI : public ScriptedAI
- {
- boss_darkmaster_gandlingAI(Creature* creature) : ScriptedAI(creature)
+ struct boss_darkmaster_gandlingAI : public BossAI
{
- instance = me->GetInstanceScript();
- }
+ boss_darkmaster_gandlingAI(Creature* creature) : BossAI(creature, DATA_DARKMASTERGANDLING) {}
+
+ void Reset()
+ {
+ _Reset();
+ if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_GANDLING)))
+ gate->SetGoState(GO_STATE_ACTIVE);
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ _JustDied();
+ if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_GANDLING)))
+ gate->SetGoState(GO_STATE_ACTIVE);
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_ARCANEMISSILES, 4500);
+ events.ScheduleEvent(EVENT_SHADOWSHIELD, 12000);
+ events.ScheduleEvent(EVENT_CURSE, 2000);
+ events.ScheduleEvent(EVENT_SHADOW_PORTAL, 16000);
+
+ if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_GANDLING)))
+ gate->SetGoState(GO_STATE_READY);
+ }
- InstanceScript* instance;
+ void IsSummonedBy(Unit* /*summoner*/)
+ {
+ Talk(YELL_SUMMONED);
+ me->GetMotionMaster()->MoveRandom(5);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
- uint32 ArcaneMissiles_Timer;
- uint32 ShadowShield_Timer;
- uint32 Curse_Timer;
- uint32 Teleport_Timer;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- void Reset()
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_ARCANEMISSILES:
+ DoCastVictim(SPELL_ARCANEMISSILES, true);
+ events.ScheduleEvent(EVENT_ARCANEMISSILES, 8000);
+ break;
+ case EVENT_SHADOWSHIELD:
+ DoCast(me, SPELL_SHADOWSHIELD);
+ events.ScheduleEvent(EVENT_SHADOWSHIELD, urand(14000, 28000));
+ break;
+ case EVENT_CURSE:
+ DoCastVictim(SPELL_CURSE, true);
+ events.ScheduleEvent(EVENT_CURSE, urand(15000, 27000));
+ break;
+ case EVENT_SHADOW_PORTAL:
+ if (HealthAbovePct(3))
+ {
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_SHADOW_PORTAL, true);
+ events.ScheduleEvent(EVENT_SHADOW_PORTAL, urand(17000, 27000));
+ }
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
{
- ArcaneMissiles_Timer = 4500;
- ShadowShield_Timer = 12000;
- Curse_Timer = 2000;
- Teleport_Timer = 16000;
+ return new boss_darkmaster_gandlingAI (creature);
}
+};
- void EnterCombat(Unit* /*who*/)
+// Script for Shadow Portal spell 17950
+enum Rooms
+{
+ ROOM_HALL_OF_SECRETS = 0,
+ ROOM_HALL_OF_THE_DAMNED = 1,
+ ROOM_THE_COVEN = 2,
+ ROOM_THE_SHADOW_VAULT = 3,
+ ROOM_BAROV_FAMILY_VAULT = 4,
+ ROOM_VAULT_OF_THE_RAVENIAN = 5
+};
+
+enum SPSpells
+{
+ SPELL_SHADOW_PORTAL_HALLOFSECRETS = 17863,
+ SPELL_SHADOW_PORTAL_HALLOFTHEDAMNED = 17939,
+ SPELL_SHADOW_PORTAL_THECOVEN = 17943,
+ SPELL_SHADOW_PORTAL_THESHADOWVAULT = 17944,
+ SPELL_SHADOW_PORTAL_BAROVFAMILYVAULT = 17946,
+ SPELL_SHADOW_PORTAL_VAULTOFTHERAVENIAN = 17948
+};
+
+class spell_shadow_portal : public SpellScriptLoader
+{
+ public:
+ spell_shadow_portal() : SpellScriptLoader("spell_shadow_portal") { }
+
+ class spell_shadow_portal_SpellScript : public SpellScript
{
- }
+ PrepareSpellScript(spell_shadow_portal_SpellScript);
- void JustDied(Unit* /*killer*/)
+ void HandleCast(SpellEffIndex /*effIndex*/)
+ {
+ Creature* caster = GetCaster()->ToCreature();
+ int8 attempts = 0;
+ int32 spell_to_cast =0;
+
+ while (!spell_to_cast)
+ {
+ if (attempts++ >= 6) break;
+
+ switch (urand(0, 5))
+ {
+ case ROOM_HALL_OF_SECRETS:
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_RAVENIAN))->GetGoState() == GO_STATE_ACTIVE)
+ spell_to_cast = SPELL_SHADOW_PORTAL_HALLOFSECRETS;
+ break;
+ case ROOM_HALL_OF_THE_DAMNED:
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_THEOLEN))->GetGoState() == GO_STATE_ACTIVE)
+ spell_to_cast = SPELL_SHADOW_PORTAL_HALLOFTHEDAMNED;
+ break;
+ case ROOM_THE_COVEN:
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_MALICIA))->GetGoState() == GO_STATE_ACTIVE)
+ spell_to_cast = SPELL_SHADOW_PORTAL_THECOVEN;
+ break;
+ case ROOM_THE_SHADOW_VAULT:
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_ILLUCIA))->GetGoState() == GO_STATE_ACTIVE)
+ spell_to_cast = SPELL_SHADOW_PORTAL_THESHADOWVAULT;
+ break;
+ case ROOM_BAROV_FAMILY_VAULT:
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_BAROV))->GetGoState() == GO_STATE_ACTIVE)
+ spell_to_cast = SPELL_SHADOW_PORTAL_BAROVFAMILYVAULT;
+ break;
+ case ROOM_VAULT_OF_THE_RAVENIAN:
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_POLKELT))->GetGoState() == GO_STATE_ACTIVE)
+ spell_to_cast = SPELL_SHADOW_PORTAL_VAULTOFTHERAVENIAN;
+ break;
+ }
+
+ if (spell_to_cast)
+ GetHitUnit()->CastSpell(GetHitUnit(), spell_to_cast);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_shadow_portal_SpellScript::HandleCast, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
{
- if (instance)
- instance->SetData(TYPE_GANDLING, DONE);
+ return new spell_shadow_portal_SpellScript();
}
+};
+
+// Script for Shadow Portal spells 17863, 17939, 17943, 17944, 17946, 17948
+Position const SummonPos[18] =
+{
+ // Hall of Secrects
+
+
+
+ // The Hall of the damned
+ { 177.9624f, -68.23893f, 84.95197f, 3.228859f },
+ { 183.7705f, -61.43489f, 84.92424f, 5.148721f },
+ { 184.7035f, -77.74805f, 84.92424f, 4.660029f },
+ // The Coven
+ { 111.7203f, -1.105035f, 85.45985f, 3.961897f },
+ { 118.0079f, 6.430664f, 85.31169f, 2.408554f },
+ { 120.0276f, -7.496636f, 85.31169f, 2.984513f },
+ // The Shadow Vault
+ { 245.3716f, 0.628038f, 72.73877f, 0.01745329f },
+ { 240.9920f, 3.405653f, 72.73877f, 6.143559f },
+ { 240.9543f, -3.182943f, 72.73877f, 0.2268928f },
+ // Barov Family Vault
+ { 181.8245f, -42.58117f, 75.4812f, 4.660029f },
+ { 177.7456f, -42.74745f, 75.4812f, 4.886922f },
+ { 185.6157f, -42.91200f, 75.4812f, 4.45059f },
+ // Vault of the Ravenian
+
+
+
+};
- void UpdateAI(const uint32 diff)
+enum Creatures
+{
+ NPC_RISEN_GUARDIAN = 11598
+};
+
+enum ScriptEventId
+{
+ SPELL_EVENT_HALLOFSECRETS = 5618,
+ SPELL_EVENT_HALLOFTHEDAMNED = 5619,
+ SPELL_EVENT_THECOVEN = 5620,
+ SPELL_EVENT_THESHADOWVAULT = 5621,
+ SPELL_EVENT_BAROVFAMILYVAULT = 5622,
+ SPELL_EVENT_VAULTOFTHERAVENIAN = 5623
+};
+
+class spell_shadow_portal_rooms : public SpellScriptLoader
+{
+ public:
+ spell_shadow_portal_rooms() : SpellScriptLoader("spell_shadow_portal_rooms") { }
+
+ class spell_shadow_portal_rooms_SpellScript : public SpellScript
{
- if (!UpdateVictim())
- return;
+ PrepareSpellScript(spell_shadow_portal_rooms_SpellScript);
- //ArcaneMissiles_Timer
- if (ArcaneMissiles_Timer <= diff)
+ void HandleSendEvent(SpellEffIndex effIndex)
{
- DoCast(me->getVictim(), SPELL_ARCANEMISSILES);
- ArcaneMissiles_Timer = 8000;
- } else ArcaneMissiles_Timer -= diff;
+ // If only one player in threat list fail spell
- //ShadowShield_Timer
- if (ShadowShield_Timer <= diff)
- {
- DoCast(me, SPELL_SHADOWSHIELD);
- ShadowShield_Timer = urand(14000, 28000);
- } else ShadowShield_Timer -= diff;
+ Creature* Summoned = NULL;
+ Creature* caster = GetCaster()->ToCreature();
- //Curse_Timer
- if (Curse_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_CURSE);
- Curse_Timer = urand(15000, 27000);
- } else Curse_Timer -= diff;
+ int8 pos_to_summon = 0;
+ int8 phase_to_set = 0;
+ int32 gate_to_close = 0;
- //Teleporting Random Target to one of the six pre boss rooms and spawn 3-4 skeletons near the gamer.
- //We will only telport if gandling has more than 3% of hp so teleported gamers can always loot.
- if (HealthAbovePct(3))
- {
- if (Teleport_Timer <= diff)
+ switch (GetSpellInfo()->Effects[effIndex].MiscValue)
{
- Unit* target = NULL;
- target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target && target->GetTypeId() == TYPEID_PLAYER)
- {
- if (DoGetThreat(target))
- DoModifyThreatPercent(target, -100);
+ case SPELL_EVENT_HALLOFSECRETS:
+ pos_to_summon = 0; // Not yet spawned
+ phase_to_set = 1;
+ gate_to_close = GO_GATE_RAVENIAN;
+ break;
+ case SPELL_EVENT_HALLOFTHEDAMNED:
+ pos_to_summon = 0;
+ phase_to_set = 2;
+ gate_to_close = GO_GATE_THEOLEN;
+ break;
+ case SPELL_EVENT_THECOVEN:
+ pos_to_summon = 3;
+ phase_to_set = 3;
+ gate_to_close = GO_GATE_MALICIA;
+ break;
+ case SPELL_EVENT_THESHADOWVAULT:
+ pos_to_summon = 6;
+ phase_to_set = 4;
+ gate_to_close = GO_GATE_ILLUCIA;
+ break;
+ case SPELL_EVENT_BAROVFAMILYVAULT:
+ pos_to_summon = 9;
+ phase_to_set = 5;
+ gate_to_close = GO_GATE_BAROV;
+ break;
+ case SPELL_EVENT_VAULTOFTHERAVENIAN:
+ pos_to_summon = 0; // Not yet spawned
+ phase_to_set = 6;
+ gate_to_close = GO_GATE_POLKELT;
+ break;
+ default:
+ break;
+ }
- Creature* Summoned = NULL;
- switch (rand()%6)
+ if (gate_to_close && (GetCaster()->GetMap()->GetId() == 289))
+ {
+ for (uint8 i = 0; i < 3; ++i)
+ {
+ Summoned = GetCaster()->SummonCreature(NPC_RISEN_GUARDIAN, SummonPos[pos_to_summon++], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
+ if (Summoned)
{
- case 0:
- DoTeleportPlayer(target, 250.0696f, 0.3921f, 84.8408f, 3.149f);
- Summoned = me->SummonCreature(16119, 254.2325f, 0.3417f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 257.7133f, 4.0226f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 258.6702f, -2.60656f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- break;
- case 1:
- DoTeleportPlayer(target, 181.4220f, -91.9481f, 84.8410f, 1.608f);
- Summoned = me->SummonCreature(16119, 184.0519f, -73.5649f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 179.5951f, -73.7045f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 180.6452f, -78.2143f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 283.2274f, -78.1518f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- break;
- case 2:
- DoTeleportPlayer(target, 95.1547f, -1.8173f, 85.2289f, 0.043f);
- Summoned = me->SummonCreature(16119, 100.9404f, -1.8016f, 85.2289f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 101.3729f, 0.4882f, 85.2289f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 101.4596f, -4.4740f, 85.2289f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- break;
- case 3:
- DoTeleportPlayer(target, 250.0696f, 0.3921f, 72.6722f, 3.149f);
- Summoned = me->SummonCreature(16119, 240.34481f, 0.7368f, 72.6722f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 240.3633f, -2.9520f, 72.6722f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 240.6702f, 3.34949f, 72.6722f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- break;
- case 4:
- DoTeleportPlayer(target, 181.4220f, -91.9481f, 70.7734f, 1.608f);
- Summoned = me->SummonCreature(16119, 184.0519f, -73.5649f, 70.7734f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 179.5951f, -73.7045f, 70.7734f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 180.6452f, -78.2143f, 70.7734f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 283.2274f, -78.1518f, 70.7734f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- break;
- case 5:
- DoTeleportPlayer(target, 106.1541f, -1.8994f, 75.3663f, 0.043f);
- Summoned = me->SummonCreature(16119, 115.3945f, -1.5555f, 75.3663f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 257.7133f, 1.8066f, 75.3663f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 258.6702f, -5.1001f, 75.3663f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- break;
+ Summoned->GetMotionMaster()->MoveRandom(5);
+ Summoned->AI()->SetData(0, phase_to_set);
}
}
- Teleport_Timer = urand(20000, 35000);
- } else Teleport_Timer -= diff;
+
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ if (GameObject* gate = GameObject::GetGameObject(*caster, instance->GetData64(gate_to_close)))
+ gate->SetGoState(GO_STATE_READY);
+ }
}
- DoMeleeAttackIfReady();
- }
- };
+ void Register()
+ {
+ OnEffectHit += SpellEffectFn(spell_shadow_portal_rooms_SpellScript::HandleSendEvent, EFFECT_1, SPELL_EFFECT_SEND_EVENT);
+ }
+ };
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_shadow_portal_rooms_SpellScript();
+ }
};
void AddSC_boss_darkmaster_gandling()
{
new boss_darkmaster_gandling();
+ new spell_shadow_portal();
+ new spell_shadow_portal_rooms();
}
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp
index ea60b0ce333..0f1999b112f 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -16,12 +15,12 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Doctor_Theolen_Krastinov
-SD%Complete: 100
-SDComment:
-SDCategory: Scholomance
-EndScriptData */
+/*
+Name: Boss_Doctor_Theolen_Krastinov
+%Complete: 100
+Comment:
+Category: Scholomance
+*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
@@ -54,31 +53,15 @@ class boss_doctor_theolen_krastinov : public CreatureScript
{
boss_theolenkrastinovAI(Creature* creature) : BossAI(creature, DATA_DOCTORTHEOLENKRASTINOV) {}
- void Reset() {}
-
- void JustDied(Unit* /*killer*/)
- {
- InstanceScript* instance = me->GetInstanceScript();
- if (instance)
- {
- instance->SetData(DATA_DOCTORTHEOLENKRASTINOV, DONE);
-
- if (instance->GetData(TYPE_GANDLING) == IN_PROGRESS)
- {
- instance->SetData(TYPE_GANDLING, IN_PROGRESS);
- me->SummonCreature(1853, 180.73f, -9.43856f, 75.507f, 1.61399f, TEMPSUMMON_DEAD_DESPAWN, 0);
- }
- }
- }
-
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
events.ScheduleEvent(EVENT_REND, 8000);
events.ScheduleEvent(EVENT_BACKHAND, 9000);
events.ScheduleEvent(EVENT_FRENZY, 1000);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp
index 54fc9e4a17e..5ea6c86d23e 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -16,12 +15,12 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Illucia_Barov
-SD%Complete: 100
-SDComment:
-SDCategory: Scholomance
-EndScriptData */
+/*
+Name: Boss_Illucia_Barov
+%Complete: 100
+Comment:
+Category: Scholomance
+*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
@@ -49,34 +48,18 @@ class boss_illucia_barov : public CreatureScript
struct boss_illuciabarovAI : public BossAI
{
- boss_illuciabarovAI(Creature* creature) : BossAI(creature,DATA_LADYILLUCIABAROV) {}
-
- void Reset() {}
-
- void JustDied(Unit* /*killer*/)
- {
- InstanceScript* instance = me->GetInstanceScript();
- if (instance)
- {
- instance->SetData(DATA_LADYILLUCIABAROV, DONE);
-
- if (instance->GetData(TYPE_GANDLING) == IN_PROGRESS)
- {
- instance->SetData(TYPE_GANDLING, IN_PROGRESS);
- me->SummonCreature(1853, 180.73f, -9.43856f, 75.507f, 1.61399f, TEMPSUMMON_DEAD_DESPAWN, 0);
- }
- }
- }
+ boss_illuciabarovAI(Creature* creature) : BossAI(creature, DATA_LADYILLUCIABAROV) {}
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
events.ScheduleEvent(EVENT_CURSEOFAGONY, 18000);
events.ScheduleEvent(EVENT_SHADOWSHOCK, 9000);
events.ScheduleEvent(EVENT_SILENCE, 5000);
events.ScheduleEvent(EVENT_FEAR, 30000);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -95,7 +78,7 @@ class boss_illucia_barov : public CreatureScript
events.ScheduleEvent(EVENT_CURSEOFAGONY, 30000);
break;
case EVENT_SHADOWSHOCK:
- DoCast(SelectTarget(SELECT_TARGET_RANDOM,0, 100, true),SPELL_SHADOWSHOCK,true);
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_SHADOWSHOCK, true);
events.ScheduleEvent(EVENT_SHADOWSHOCK, 12000);
break;
case EVENT_SILENCE:
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp
index daf03f41db5..1d311a7bd2c 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -58,27 +57,14 @@ class boss_instructor_malicia : public CreatureScript
void Reset()
{
+ _Reset();
FlashCounter = 0;
TouchCounter = 0;
}
- void JustDied(Unit* /*killer*/)
- {
- InstanceScript* instance = me->GetInstanceScript();
- if (instance)
- {
- instance->SetData(DATA_INSTRUCTORMALICIA, DONE);
-
- if (instance->GetData(TYPE_GANDLING) == IN_PROGRESS)
- {
- instance->SetData(TYPE_GANDLING, IN_PROGRESS);
- me->SummonCreature(1853, 180.73f, -9.43856f, 75.507f, 1.61399f, TEMPSUMMON_DEAD_DESPAWN, 0);
- }
- }
- }
-
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
events.ScheduleEvent(EVENT_CALLOFGRAVES, 4000);
events.ScheduleEvent(EVENT_CORRUPTION, 8000);
events.ScheduleEvent(EVENT_RENEW, 32000);
@@ -86,7 +72,7 @@ class boss_instructor_malicia : public CreatureScript
events.ScheduleEvent(EVENT_HEALINGTOUCH, 45000);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -105,7 +91,7 @@ class boss_instructor_malicia : public CreatureScript
events.ScheduleEvent(EVENT_CALLOFGRAVES, 65000);
break;
case EVENT_CORRUPTION:
- DoCast(SelectTarget(SELECT_TARGET_RANDOM,0, 100, true),SPELL_CORRUPTION,true);
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_CORRUPTION, true);
events.ScheduleEvent(EVENT_CORRUPTION, 24000);
break;
case EVENT_RENEW:
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp
index c9cf4aa9020..3f083a30987 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp
@@ -70,7 +70,7 @@ public:
Illusion->AI()->AttackStart(victim);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (Invisible && Invisible_Timer <= diff)
{
@@ -180,7 +180,7 @@ public:
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
index 68d7dcdebe8..97b8e0334ee 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
@@ -57,32 +57,34 @@ enum Events
EVENT_KIRTONOS_TRANSFORM = 14
};
-enum Misc
+enum eMisc
{
WEAPON_KIRTONOS_STAFF = 11365,
POINT_KIRTONOS_LAND = 13,
KIRTONOS_PATH = 105061
};
+Position const PosMove[2] =
+{
+ { 299.4884f, 92.76137f, 105.6335f, 0.0f },
+ { 314.8673f, 90.30210f, 101.6459f, 0.0f }
+};
+
class boss_kirtonos_the_herald : public CreatureScript
{
public: boss_kirtonos_the_herald() : CreatureScript("boss_kirtonos_the_herald") { }
struct boss_kirtonos_the_heraldAI : public BossAI
{
- boss_kirtonos_the_heraldAI(Creature* creature) : BossAI(creature, TYPE_KIRTONOS) { }
+ boss_kirtonos_the_heraldAI(Creature* creature) : BossAI(creature, DATA_KIRTONOS) { }
void Reset()
{
- _introEvent = 0;
- _introTimer = 0;
_Reset();
}
void EnterCombat(Unit* /*who*/)
{
- _introTimer = 0;
- _introEvent = 0;
events.ScheduleEvent(EVENT_SWOOP, urand(8000, 8000));
events.ScheduleEvent(EVENT_WING_FLAP, urand(15000, 15000));
events.ScheduleEvent(EVENT_PIERCE_ARMOR, urand(18000, 18000));
@@ -103,8 +105,7 @@ class boss_kirtonos_the_herald : public CreatureScript
brazier->ResetDoorOrButton();
brazier->SetGoState(GO_STATE_READY);
}
- if (instance)
- instance->SetData(TYPE_KIRTONOS, DONE);
+ _JustDied();
}
void EnterEvadeMode()
@@ -121,12 +122,10 @@ class boss_kirtonos_the_herald : public CreatureScript
void IsSummonedBy(Unit* /*summoner*/)
{
+ events.ScheduleEvent(INTRO_1, 500);
me->SetDisableGravity(true);
me->SetReactState(REACT_PASSIVE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
- _introEvent = INTRO_1;
- _introTimer = 1;
- _currentPoint = 0;
Talk(EMOTE_SUMMONED);
}
@@ -139,68 +138,58 @@ class boss_kirtonos_the_herald : public CreatureScript
{
if (type == WAYPOINT_MOTION_TYPE && id == POINT_KIRTONOS_LAND)
{
- _introTimer = 1500;
- _introEvent = INTRO_2;
+ events.ScheduleEvent(INTRO_2, 1500);
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
- if (_introEvent)
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent() && !UpdateVictim())
{
- if (_introTimer <= diff)
+ switch (eventId)
{
- switch (_introEvent)
- {
- case INTRO_1:
- me->GetMotionMaster()->MovePath(KIRTONOS_PATH,false);
- _introEvent = 0;
- break;
- case INTRO_2:
- me->GetMotionMaster()->MovePoint(0, 299.4884f, 92.76137f, 105.6335f);
- _introTimer = 1000;
- _introEvent = INTRO_3;
- break;
- case INTRO_3:
- if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS)))
- gate->SetGoState(GO_STATE_READY);
- me->SetFacingTo(0.01745329f);
- _introTimer = 3000;
- _introEvent = INTRO_4;
- break;
- case INTRO_4:
- if (GameObject* brazier = me->GetMap()->GetGameObject(instance->GetData64(GO_BRAZIER_OF_THE_HERALD)))
- brazier->SetGoState(GO_STATE_READY);
- me->SetWalk(true);
- me->SetDisableGravity(false);
- DoCast(me, SPELL_KIRTONOS_TRANSFORM);
- me->SetCanFly(false);
- _introTimer = 1000;
- _introEvent = INTRO_5;
- break;
- case INTRO_5:
- me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_KIRTONOS_STAFF));
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
- me->SetReactState(REACT_AGGRESSIVE);
- _introTimer = 5000;
- _introEvent = INTRO_6;
- case INTRO_6:
- me->GetMotionMaster()->MovePoint(0, 314.8673f, 90.3021f, 101.6459f);
- _introTimer = 0;
- _introEvent = 0;
+ case INTRO_1:
+ me->GetMotionMaster()->MovePath(KIRTONOS_PATH, false);
+ break;
+ case INTRO_2:
+ me->GetMotionMaster()->MovePoint(0, PosMove[0]);
+ events.ScheduleEvent(INTRO_3, 1000);
+ break;
+ case INTRO_3:
+ if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS)))
+ gate->SetGoState(GO_STATE_READY);
+ me->SetFacingTo(0.01745329f);
+ events.ScheduleEvent(INTRO_4, 3000);
+ break;
+ case INTRO_4:
+ if (GameObject* brazier = me->GetMap()->GetGameObject(instance->GetData64(GO_BRAZIER_OF_THE_HERALD)))
+ brazier->SetGoState(GO_STATE_READY);
+ me->SetWalk(true);
+ me->SetDisableGravity(false);
+ DoCast(me, SPELL_KIRTONOS_TRANSFORM);
+ me->SetCanFly(false);
+ events.ScheduleEvent(INTRO_5, 1000);
+ break;
+ case INTRO_5:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_KIRTONOS_STAFF));
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
+ me->SetReactState(REACT_AGGRESSIVE);
+ events.ScheduleEvent(INTRO_6, 5000);
+ break;
+ case INTRO_6:
+ me->GetMotionMaster()->MovePoint(0, PosMove[1]);
+ break;
+ default:
break;
- }
}
- else
- _introTimer -= diff;
}
if (!UpdateVictim())
return;
- events.Update(diff);
-
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
@@ -258,11 +247,6 @@ class boss_kirtonos_the_herald : public CreatureScript
DoMeleeAttackIfReady();
}
-
- private:
- uint8 _introEvent;
- uint32 _introTimer;
- uint32 _currentPoint;
};
CreatureAI* GetAI(Creature* creature) const
@@ -281,6 +265,11 @@ enum Brazier_Of_The_Herald
SOUND_SCREECH = 557
};
+Position const PosSummon[1] =
+{
+ { 315.028f, 70.53845f, 102.1496f, 0.3859715f }
+};
+
class go_brazier_of_the_herald : public GameObjectScript
{
public:
@@ -290,7 +279,7 @@ class go_brazier_of_the_herald : public GameObjectScript
{
go->UseDoorOrButton();
go->PlayDirectSound(SOUND_SCREECH, 0);
- player->SummonCreature(NPC_KIRTONOS, 315.028f, 70.53845f, 102.1496f, 0.3859715f, TEMPSUMMON_DEAD_DESPAWN, 900000);
+ player->SummonCreature(NPC_KIRTONOS, PosSummon[0], TEMPSUMMON_DEAD_DESPAWN, 900000);
return true;
}
};
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp
index a0dc31c4dff..1167a945992 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp
@@ -74,7 +74,7 @@ public:
SummonedMage->AI()->AttackStart(victim);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp
index 55ef0605c31..d0028894067 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -49,31 +48,18 @@ class boss_lord_alexei_barov : public CreatureScript
void Reset()
{
+ _Reset();
me->LoadCreaturesAddon();
}
- void JustDied(Unit* /*killer*/)
- {
- InstanceScript* instance = me->GetInstanceScript();
- if (instance)
- {
- instance->SetData(DATA_LORDALEXEIBAROV, DONE);
-
- if (instance->GetData(TYPE_GANDLING) == IN_PROGRESS)
- {
- instance->SetData(TYPE_GANDLING, IN_PROGRESS);
- me->SummonCreature(1853, 180.73f, -9.43856f, 75.507f, 1.61399f, TEMPSUMMON_DEAD_DESPAWN, 0);
- }
- }
- }
-
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
events.ScheduleEvent(EVENT_IMMOLATE, 7000);
events.ScheduleEvent(EVENT_VEILOFSHADOW, 15000);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -88,7 +74,7 @@ class boss_lord_alexei_barov : public CreatureScript
switch (eventId)
{
case EVENT_IMMOLATE:
- DoCast(SelectTarget(SELECT_TARGET_RANDOM,0, 100, true),SPELL_IMMOLATE,true);
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_IMMOLATE, true);
events.ScheduleEvent(EVENT_IMMOLATE, 12000);
break;
case EVENT_VEILOFSHADOW:
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp
index cc9180ded76..f7170a0618f 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -16,12 +15,12 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Lorekeeper_Polkelt
-SD%Complete: 100
-SDComment:
-SDCategory: Scholomance
-EndScriptData */
+/*
+Name: Boss_Lorekeeper_Polkelt
+%Complete: 100
+Comment:
+Category: Scholomance
+*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
@@ -51,32 +50,16 @@ class boss_lorekeeper_polkelt : public CreatureScript
{
boss_lorekeeperpolkeltAI(Creature* creature) : BossAI(creature, DATA_LOREKEEPERPOLKELT) {}
- void Reset() {}
-
- void JustDied(Unit* /*killer*/)
- {
- InstanceScript* instance = me->GetInstanceScript();
- if (instance)
- {
- instance->SetData(DATA_LOREKEEPERPOLKELT, DONE);
-
- if (instance->GetData(TYPE_GANDLING) == IN_PROGRESS)
- {
- instance->SetData(TYPE_GANDLING, IN_PROGRESS);
- me->SummonCreature(1853, 180.73f, -9.43856f, 75.507f, 1.61399f, TEMPSUMMON_DEAD_DESPAWN, 0);
- }
- }
- }
-
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
events.ScheduleEvent(EVENT_VOLATILEINFECTION, 38000);
events.ScheduleEvent(EVENT_DARKPLAGUE, 8000);
events.ScheduleEvent(EVENT_CORROSIVEACID, 45000);
events.ScheduleEvent(EVENT_NOXIOUSCATALYST, 35000);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp
index 99f01ee96c3..4483d5332d7 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp
@@ -71,7 +71,7 @@ public:
void EnterCombat(Unit* /*who*/){}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp
index 5a6f5d436c4..14caccb8b00 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -16,12 +15,12 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_the_ravenian
-SD%Complete: 100
-SDComment:
-SDCategory: Scholomance
-EndScriptData */
+/*
+Name: Boss_the_ravenian
+%Complete: 100
+Comment:
+Category: Scholomance
+*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
@@ -43,7 +42,6 @@ enum Events
EVENT_KNOCKAWAY = 4
};
-
class boss_the_ravenian : public CreatureScript
{
public: boss_the_ravenian() : CreatureScript("boss_the_ravenian") { }
@@ -52,32 +50,16 @@ class boss_the_ravenian : public CreatureScript
{
boss_theravenianAI(Creature* creature) : BossAI(creature, DATA_THERAVENIAN) {}
- void Reset() {}
-
- void JustDied(Unit* /*killer*/)
- {
- InstanceScript* instance = me->GetInstanceScript();
- if (instance)
- {
- instance->SetData(DATA_THERAVENIAN, DONE);
-
- if (instance->GetData(TYPE_GANDLING) == IN_PROGRESS)
- {
- instance->SetData(TYPE_GANDLING, IN_PROGRESS);
- me->SummonCreature(1853, 180.73f, -9.43856f, 75.507f, 1.61399f, TEMPSUMMON_DEAD_DESPAWN, 0);
- }
- }
- }
-
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
events.ScheduleEvent(EVENT_TRAMPLE, 24000);
events.ScheduleEvent(EVENT_CLEAVE, 15000);
events.ScheduleEvent(EVENT_SUNDERINCLEAVE, 40000);
events.ScheduleEvent(EVENT_KNOCKAWAY, 32000);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp
index 054760981d2..85ae16499cf 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp
@@ -60,7 +60,7 @@ public:
m_uiFrenzy_Timer = 0;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
index 04a12ae2bd2..0da31fbe428 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -16,131 +15,215 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Instance_Scholomance
-SD%Complete: 100
-SDComment:
-SDCategory: Scholomance
-EndScriptData */
-
#include "ScriptMgr.h"
#include "InstanceScript.h"
+#include "Player.h"
#include "scholomance.h"
+Position const GandlingLoc = { 180.7712f, -5.428603f, 75.57024f, 1.291544f };
+
class instance_scholomance : public InstanceMapScript
{
-public:
- instance_scholomance() : InstanceMapScript("instance_scholomance", 289) { }
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const
- {
- return new instance_scholomance_InstanceMapScript(map);
- }
-
- struct instance_scholomance_InstanceMapScript : public InstanceScript
- {
- instance_scholomance_InstanceMapScript(Map* map) : InstanceScript(map) {}
-
- //Lord Alexei Barov, Doctor Theolen Krastinov, The Ravenian, Lorekeeper Polkelt, Instructor Malicia and the Lady Illucia Barov.
- bool IsBossDied[6];
- uint32 m_auiEncounter[MAX_ENCOUNTER];
-
- uint64 GateKirtonosGUID;
- uint64 GateGandlingGUID;
- uint64 GateMiliciaGUID;
- uint64 GateTheolenGUID;
- uint64 GatePolkeltGUID;
- uint64 GateRavenianGUID;
- uint64 GateBarovGUID;
- uint64 GateIlluciaGUID;
- uint64 BrazierOfTheHeraldGUID;
-
- void Initialize()
+ public:
+ instance_scholomance() : InstanceMapScript("instance_scholomance", 289) { }
+
+ InstanceScript* GetInstanceScript(InstanceMap* map) const
{
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
-
- GateKirtonosGUID = 0;
- GateGandlingGUID = 0;
- GateMiliciaGUID = 0;
- GateTheolenGUID = 0;
- GatePolkeltGUID = 0;
- GateRavenianGUID = 0;
- GateBarovGUID = 0;
- GateIlluciaGUID = 0;
- BrazierOfTheHeraldGUID = 0;
-
- for (uint8 i = 0; i < 6; ++i)
- IsBossDied[i] = false;
+ return new instance_scholomance_InstanceMapScript(map);
}
- void OnGameObjectCreate(GameObject* go)
+ struct instance_scholomance_InstanceMapScript : public InstanceScript
{
- switch (go->GetEntry())
+ instance_scholomance_InstanceMapScript(Map* map) : InstanceScript(map)
{
- case GO_GATE_KIRTONOS: GateKirtonosGUID = go->GetGUID(); break;
- case GO_GATE_GANDLING: GateGandlingGUID = go->GetGUID(); break;
- case GO_GATE_MALICIA: GateMiliciaGUID = go->GetGUID(); break;
- case GO_GATE_THEOLEN: GateTheolenGUID = go->GetGUID(); break;
- case GO_GATE_POLKELT: GatePolkeltGUID = go->GetGUID(); break;
- case GO_GATE_RAVENIAN: GateRavenianGUID = go->GetGUID(); break;
- case GO_GATE_BAROV: GateBarovGUID = go->GetGUID(); break;
- case GO_GATE_ILLUCIA: GateIlluciaGUID = go->GetGUID(); break;
- case GO_BRAZIER_OF_THE_HERALD: BrazierOfTheHeraldGUID = go->GetGUID(); break;
+ SetBossNumber(EncounterCount);
+ GateKirtonosGUID = 0;
+ GateGandlingGUID = 0;
+ GateMiliciaGUID = 0;
+ GateTheolenGUID = 0;
+ GatePolkeltGUID = 0;
+ GateRavenianGUID = 0;
+ GateBarovGUID = 0;
+ GateIlluciaGUID = 0;
+ BrazierOfTheHeraldGUID = 0;
}
- }
- void SetData(uint32 type, uint32 data)
- {
- switch (type)
+ void OnGameObjectCreate(GameObject* go)
{
- case DATA_LORDALEXEIBAROV:
- IsBossDied[0] = true;
- break;
- case DATA_DOCTORTHEOLENKRASTINOV:
- IsBossDied[1] = true;
- break;
- case DATA_THERAVENIAN:
- IsBossDied[2] = true;
- break;
- case DATA_LOREKEEPERPOLKELT:
- IsBossDied[3] = true;
- break;
- case DATA_INSTRUCTORMALICIA:
- IsBossDied[4] = true;
- break;
- case DATA_LADYILLUCIABAROV:
- IsBossDied[5] = true;
- break;
- case TYPE_GANDLING:
- m_auiEncounter[0] = data;
- break;
- case TYPE_KIRTONOS:
- m_auiEncounter[1] = data;
- break;
+ switch (go->GetEntry())
+ {
+ case GO_GATE_KIRTONOS:
+ GateKirtonosGUID = go->GetGUID();
+ break;
+ case GO_GATE_GANDLING:
+ GateGandlingGUID = go->GetGUID();
+ break;
+ case GO_GATE_MALICIA:
+ GateMiliciaGUID = go->GetGUID();
+ break;
+ case GO_GATE_THEOLEN:
+ GateTheolenGUID = go->GetGUID();
+ break;
+ case GO_GATE_POLKELT:
+ GatePolkeltGUID = go->GetGUID();
+ break;
+ case GO_GATE_RAVENIAN:
+ GateRavenianGUID = go->GetGUID();
+ break;
+ case GO_GATE_BAROV:
+ GateBarovGUID = go->GetGUID();
+ break;
+ case GO_GATE_ILLUCIA:
+ GateIlluciaGUID = go->GetGUID();
+ break;
+ case GO_BRAZIER_OF_THE_HERALD:
+ BrazierOfTheHeraldGUID = go->GetGUID();
+ break;
+ default:
+ break;
+ }
}
- }
- uint32 GetData(uint32 type) const
- {
- return (type == TYPE_GANDLING &&
- IsBossDied[0] && IsBossDied[1] && IsBossDied[2] &&
- IsBossDied[3] && IsBossDied[4] && IsBossDied[5])
- ? IN_PROGRESS : 0;
- }
+ bool SetBossState(uint32 type, EncounterState state)
+ {
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
+ switch (type)
+ {
+ case DATA_LORDALEXEIBAROV:
+ case DATA_DOCTORTHEOLENKRASTINOV:
+ case DATA_THERAVENIAN:
+ case DATA_LOREKEEPERPOLKELT:
+ case DATA_INSTRUCTORMALICIA:
+ case DATA_LADYILLUCIABAROV:
+ CheckToSpawnGandling();
+ break;
+ default:
+ break;
+ }
+
+ return true;
+ }
- uint64 GetData64(uint32 type) const
- {
- switch (type)
+ uint64 GetData64(uint32 type) const
{
- case GO_GATE_KIRTONOS:
- return GateKirtonosGUID;
- case GO_BRAZIER_OF_THE_HERALD:
- return BrazierOfTheHeraldGUID;
+ switch (type)
+ {
+ case GO_GATE_KIRTONOS:
+ return GateKirtonosGUID;
+ case GO_GATE_GANDLING:
+ return GateGandlingGUID;
+ case GO_GATE_MALICIA:
+ return GateMiliciaGUID;
+ case GO_GATE_THEOLEN:
+ return GateTheolenGUID;
+ case GO_GATE_POLKELT:
+ return GatePolkeltGUID;
+ case GO_GATE_RAVENIAN:
+ return GateRavenianGUID;
+ case GO_GATE_BAROV:
+ return GateBarovGUID;
+ case GO_GATE_ILLUCIA:
+ return GateIlluciaGUID;
+ case GO_BRAZIER_OF_THE_HERALD:
+ return BrazierOfTheHeraldGUID;
+ default:
+ break;
+ }
+
+ return 0;
}
- return 0;
- }
- };
+ bool CheckPreBosses(uint32 bossId) const
+ {
+ switch (bossId)
+ {
+ case DATA_DARKMASTERGANDLING:
+ if (GetBossState(DATA_LORDALEXEIBAROV) != DONE)
+ return false;
+ if (GetBossState(DATA_DOCTORTHEOLENKRASTINOV) != DONE)
+ return false;
+ if (GetBossState(DATA_THERAVENIAN) != DONE)
+ return false;
+ if (GetBossState(DATA_LOREKEEPERPOLKELT) != DONE)
+ return false;
+ if (GetBossState(DATA_INSTRUCTORMALICIA) != DONE)
+ return false;
+ if (GetBossState(DATA_LADYILLUCIABAROV) != DONE)
+ return false;
+ if (GetBossState(DATA_DARKMASTERGANDLING) == DONE)
+ return false;
+ break;
+ default:
+ break;
+ }
+
+ return true;
+ }
+
+ void CheckToSpawnGandling()
+ {
+ if (CheckPreBosses(DATA_DARKMASTERGANDLING))
+ instance->SummonCreature(NPC_DARKMASTER_GANDLING, GandlingLoc);
+ }
+
+ std::string GetSaveData()
+ {
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << "S O " << GetBossSaveData();
+
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
+
+ void Load(const char* str)
+ {
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
+
+ OUT_LOAD_INST_DATA(str);
+
+ char dataHead1, dataHead2;
+
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
+
+ if (dataHead1 == 'S' && dataHead2 == 'O')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
+
+ CheckToSpawnGandling();
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
+
+ protected:
+ uint64 GateKirtonosGUID;
+ uint64 GateGandlingGUID;
+ uint64 GateMiliciaGUID;
+ uint64 GateTheolenGUID;
+ uint64 GatePolkeltGUID;
+ uint64 GateRavenianGUID;
+ uint64 GateBarovGUID;
+ uint64 GateIlluciaGUID;
+ uint64 BrazierOfTheHeraldGUID;
+ };
};
void AddSC_instance_scholomance()
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h
index f89f36d91e5..5c38cc39e3d 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h
+++ b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -19,30 +18,35 @@
#ifndef DEF_SCHOLOMANCE_H
#define DEF_SCHOLOMANCE_H
-uint32 const MAX_ENCOUNTER = 2;
+uint32 const EncounterCount = 8;
enum DataTypes
{
- TYPE_GANDLING = 1,
- DATA_DOCTORTHEOLENKRASTINOV = 2,
- DATA_INSTRUCTORMALICIA = 3,
- DATA_LADYILLUCIABAROV = 4,
- DATA_LORDALEXEIBAROV = 5,
- DATA_LOREKEEPERPOLKELT = 6,
- DATA_THERAVENIAN = 7,
- TYPE_KIRTONOS = 8
+ DATA_DOCTORTHEOLENKRASTINOV = 0,
+ DATA_INSTRUCTORMALICIA = 1,
+ DATA_LADYILLUCIABAROV = 2,
+ DATA_LORDALEXEIBAROV = 3,
+ DATA_LOREKEEPERPOLKELT = 4,
+ DATA_THERAVENIAN = 5,
+ DATA_DARKMASTERGANDLING = 6,
+ DATA_KIRTONOS = 7
+};
+
+enum CreatureIds
+{
+ NPC_DARKMASTER_GANDLING = 1853
};
enum GameobjectIds
{
GO_GATE_KIRTONOS = 175570,
GO_GATE_GANDLING = 177374,
- GO_GATE_MALICIA = 177375,
- GO_GATE_THEOLEN = 177377,
- GO_GATE_POLKELT = 177376,
GO_GATE_RAVENIAN = 177372,
- GO_GATE_BAROV = 177373,
+ GO_GATE_THEOLEN = 177377,
GO_GATE_ILLUCIA = 177371,
+ GO_GATE_MALICIA = 177375,
+ GO_GATE_BAROV = 177373,
+ GO_GATE_POLKELT = 177376,
GO_BRAZIER_OF_THE_HERALD = 175564
};
diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp
index f9bd7d89216..7af7e1e78bc 100644
--- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp
+++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp
@@ -172,7 +172,7 @@ public:
uiDarkOffering = urand(200, 1000);
}
- void UpdateAI(uint32 const uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp
index 2357f59b65d..8b49df5ca84 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp
@@ -116,7 +116,7 @@ public:
instance->SetData(TYPE_BARON, DONE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp
index d72e226d2e2..b2adbecbe63 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp
@@ -74,7 +74,7 @@ public:
instance->SetData(TYPE_BARONESS, IN_PROGRESS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp
index 909609baecc..74819269415 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp
@@ -119,7 +119,7 @@ public:
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp
index 2cb00df38db..f75a0c4a3dc 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp
@@ -120,7 +120,7 @@ public:
{
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp
index 5d75ce4fa16..5f4d1cbc0b9 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp
@@ -85,7 +85,7 @@ public:
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp
index 0a7bdfad583..2812c1dd39b 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp
@@ -72,7 +72,7 @@ public:
instance->SetData(TYPE_PALLID, IN_PROGRESS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp
index 75bdd2b06de..2cc16bc2972 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp
@@ -84,7 +84,7 @@ public:
pUndeadScarab->AI()->AttackStart(victim);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp
index e52fd3402e7..7c6ea86dfa5 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp
@@ -136,7 +136,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_postmaster_malown.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_postmaster_malown.cpp
index 5b0b39c1de2..3d0eaba9022 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_postmaster_malown.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_postmaster_malown.cpp
@@ -77,7 +77,7 @@ class boss_postmaster_malown : public CreatureScript
Talk(SAY_KILL);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp
index 6d83093d13c..5cd69f561d6 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp
@@ -82,7 +82,7 @@ public:
instance->SetData(TYPE_RAMSTEIN, DONE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp
index bd7c3519926..27249e84892 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp
@@ -68,7 +68,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp
index 0798fe2e3b0..7208bbbee03 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp
@@ -172,7 +172,7 @@ public:
me->SummonCreature(ENTRY_FREED, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 300000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (Tagged)
{
@@ -244,7 +244,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (Tagged)
{
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
index dab612828f8..d81c001889a 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
@@ -277,7 +277,7 @@ public:
ScriptedAI::MoveInLineOfSight(who);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (IsIntro)
{
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
index 6e3f024ac1d..eb2e4f1ae8b 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
@@ -114,7 +114,7 @@ public:
if (instance)
{
- if (Creature *temp = Unit::GetCreature(*me, instance->GetData64(DATA_ALYTHESS)))
+ if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ALYTHESS)))
{
if (temp->isDead())
temp->Respawn();
@@ -145,7 +145,7 @@ public:
if (instance)
{
- Creature *temp = Unit::GetCreature(*me, instance->GetData64(DATA_ALYTHESS));
+ Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ALYTHESS));
if (temp && temp->isAlive() && !temp->getVictim())
temp->AI()->AttackStart(who);
}
@@ -217,7 +217,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!SisterDeath)
{
@@ -345,10 +345,12 @@ public:
return new boss_alythessAI (creature);
};
- struct boss_alythessAI : public Scripted_NoMovementAI
+ struct boss_alythessAI : public ScriptedAI
{
- boss_alythessAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ boss_alythessAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
+
instance = creature->GetInstanceScript();
IntroStepCounter = 10;
}
@@ -374,7 +376,7 @@ public:
if (instance)
{
- if (Creature *temp = Unit::GetCreature((*me), instance->GetData64(DATA_SACROLASH)))
+ if (Creature* temp = Unit::GetCreature((*me), instance->GetData64(DATA_SACROLASH)))
{
if (temp->isDead())
temp->Respawn();
@@ -406,7 +408,7 @@ public:
if (instance)
{
- Creature *temp = Unit::GetCreature(*me, instance->GetData64(DATA_SACROLASH));
+ Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_SACROLASH));
if (temp && temp->isAlive() && !temp->getVictim())
temp->AI()->AttackStart(who);
}
@@ -418,9 +420,7 @@ public:
void AttackStart(Unit* who)
{
if (!me->isInCombat())
- {
- Scripted_NoMovementAI::AttackStart(who);
- }
+ ScriptedAI::AttackStart(who);
}
void MoveInLineOfSight(Unit* who)
@@ -542,7 +542,7 @@ public:
return 10000;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (IntroStepCounter < 9)
{
@@ -707,7 +707,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!me->HasAura(SPELL_IMAGE_VISUAL))
DoCast(me, SPELL_IMAGE_VISUAL);
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
index 7f72da805ce..6ac6b9a4812 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
@@ -404,7 +404,7 @@ public:
++uiFlightCount;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
{
@@ -536,7 +536,7 @@ public:
DoZoneInCombat();
//DoCast(me, SPELL_VAPOR_FORCE, true); core bug
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!me->getVictim())
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
@@ -568,7 +568,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
void AttackStart(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 /*diff*/) {}
+ void UpdateAI(uint32 /*diff*/) {}
};
};
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
index a8755c16418..f6c9b79bbc1 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
@@ -182,7 +182,7 @@ public:
ScriptedAI::EnterEvadeMode();
}
- void DoAction(const int32 param)
+ void DoAction(int32 param)
{
switch (param)
{
@@ -197,7 +197,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (TalkTimer)
{
@@ -485,7 +485,7 @@ public:
damage *= 3;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!me->HasAura(AURA_SPECTRAL_INVISIBILITY))
me->CastSpell(me, AURA_SPECTRAL_INVISIBILITY, true);
@@ -691,7 +691,7 @@ public:
}
}
- void DoAction(const int32 param)
+ void DoAction(int32 param)
{
switch (param)
{
@@ -706,7 +706,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!me->HasAura(AURA_SPECTRAL_INVISIBILITY))
me->CastSpell(me, AURA_SPECTRAL_INVISIBILITY, true);
@@ -780,8 +780,9 @@ public:
if (AgonyCurseTimer <= diff)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (!target) target = me->getVictim();
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1);
+ if (!target)
+ target = me->getVictim();
DoCast(target, SPELL_AGONY_CURSE);
AgonyCurseTimer = 20000;
} else AgonyCurseTimer -= diff;
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
index 59face32389..9b95f4bb7c5 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
@@ -22,7 +22,7 @@ SDComment: Sinister Reflection Model, Armageddon Visual, SAY_KJ_SHADOWSPIKE3, Em
SDCategory: Sunwell_Plateau
EndScriptData */
-//TODO rewrite Armageddon
+/// @todo rewrite Armageddon
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
@@ -105,7 +105,7 @@ enum Spells
SPELL_ARMAGEDDON_DAMAGE = 45915, // This does the area damage
/* Shield Orb Spells*/
- SPELL_SHADOW_BOLT = 45680, //45679 would be correct but triggers to often //TODO fix console error
+ SPELL_SHADOW_BOLT = 45680, //45679 would be correct but triggers to often /// @todo fix console error
/* Anveena's spells and cosmetics (Or, generally, everything that has "Anveena" in name) */
SPELL_ANVEENA_PRISON = 46367, // She hovers locked within a bubble
@@ -335,7 +335,7 @@ public:
}
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
}
@@ -392,11 +392,13 @@ public:
return new mob_kiljaeden_controllerAI (creature);
}
- struct mob_kiljaeden_controllerAI : public Scripted_NoMovementAI
+ struct mob_kiljaeden_controllerAI : public ScriptedAI
{
- mob_kiljaeden_controllerAI(Creature* creature) : Scripted_NoMovementAI(creature), summons(me)
+ mob_kiljaeden_controllerAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
instance = creature->GetInstanceScript();
+
+ SetCombatMovement(false);
}
InstanceScript* instance;
@@ -452,7 +454,7 @@ public:
summons.Summon(summoned);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (uiRandomSayTimer < diff)
{
@@ -492,11 +494,13 @@ public:
return new boss_kiljaedenAI (creature);
}
- struct boss_kiljaedenAI : public Scripted_NoMovementAI
+ struct boss_kiljaedenAI : public ScriptedAI
{
- boss_kiljaedenAI(Creature* creature) : Scripted_NoMovementAI(creature), summons(me)
+ boss_kiljaedenAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
instance = creature->GetInstanceScript();
+
+ SetCombatMovement(false);
}
InstanceScript* instance;
@@ -520,7 +524,7 @@ public:
void InitializeAI()
{
- Scripted_NoMovementAI::InitializeAI();
+ // Scripted_NoMovementAI::InitializeAI();
}
void Reset()
@@ -615,7 +619,8 @@ public:
void EnterEvadeMode()
{
- Scripted_NoMovementAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode();
+
summons.DespawnAll();
// Reset the controller
@@ -661,7 +666,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || Phase < PHASE_NORMAL)
return;
@@ -779,7 +784,7 @@ public:
break;
case TIMER_FLAME_DART: //Phase 3
DoCastAOE(SPELL_FLAME_DART, false);
- Timer[TIMER_FLAME_DART] = 3000; //TODO Timer
+ Timer[TIMER_FLAME_DART] = 3000; /// @todo Timer
break;
case TIMER_DARKNESS: //Phase 3
if (!me->IsNonMeleeSpellCasted(false))
@@ -913,7 +918,7 @@ public:
void Reset()
{
- // TODO: Timers!
+ /// @todo Timers!
ShadowBoltVolleyTimer = urand(8000, 14000); // So they don't all cast it in the same moment.
FelfirePortalTimer = 20000;
if (instance)
@@ -946,7 +951,7 @@ public:
++(CAST_AI(mob_kiljaeden_controller::mob_kiljaeden_controllerAI, pControl->AI())->deceiverDeathCount);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!me->isInCombat())
DoCast(me, SPELL_SHADOW_CHANNELING);
@@ -999,9 +1004,12 @@ public:
return new mob_felfire_portalAI (creature);
}
- struct mob_felfire_portalAI : public Scripted_NoMovementAI
+ struct mob_felfire_portalAI : public ScriptedAI
{
- mob_felfire_portalAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ mob_felfire_portalAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
uint32 uiSpawnFiendTimer;
@@ -1017,7 +1025,7 @@ public:
summoned->SetLevel(me->getLevel());
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1063,7 +1071,7 @@ public:
DoCast(me, SPELL_FELFIRE_FISSION, true);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1100,9 +1108,12 @@ public:
return new mob_armageddonAI (creature);
}
- struct mob_armageddonAI : public Scripted_NoMovementAI
+ struct mob_armageddonAI : public ScriptedAI
{
- mob_armageddonAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ mob_armageddonAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
uint8 spell;
uint32 uiTimer;
@@ -1113,7 +1124,7 @@ public:
uiTimer = 0;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (uiTimer <= diff)
{
@@ -1182,7 +1193,7 @@ public:
bClockwise = urand(0, 1);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (bPointReached)
{
@@ -1256,7 +1267,7 @@ public:
victimClass = 0;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
index 5eb79258005..aa4acc24bfd 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
@@ -172,7 +172,7 @@ public:
instance->SetData(DATA_MURU_EVENT, DONE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -213,10 +213,11 @@ public:
return new boss_muruAI (creature);
}
- struct boss_muruAI : public Scripted_NoMovementAI
+ struct boss_muruAI : public ScriptedAI
{
- boss_muruAI(Creature* creature) : Scripted_NoMovementAI(creature), Summons(me)
+ boss_muruAI(Creature* creature) : ScriptedAI(creature), Summons(creature)
{
+ SetCombatMovement(false);
instance = creature->GetInstanceScript();
}
@@ -285,7 +286,7 @@ public:
Summons.Summon(summoned);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -377,10 +378,11 @@ public:
return new npc_muru_portalAI (creature);
}
- struct npc_muru_portalAI : public Scripted_NoMovementAI
+ struct npc_muru_portalAI : public ScriptedAI
{
- npc_muru_portalAI(Creature* creature) : Scripted_NoMovementAI(creature), Summons(me)
+ npc_muru_portalAI(Creature* creature) : ScriptedAI(creature), Summons(creature)
{
+ SetCombatMovement(false);
instance = creature->GetInstanceScript();
}
@@ -432,7 +434,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!SummonSentinel)
{
@@ -482,7 +484,7 @@ public:
me->DisappearAndDie();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -544,7 +546,7 @@ public:
me->SummonCreature(CREATURE_VOID_SPAWN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), float(rand()%6), TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 180000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -600,7 +602,7 @@ public:
DoCastAOE(SPELL_BLACKHOLE_SPAWN, true);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (SpellTimer <= diff)
{
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp
index d575b7633cb..57699a34e17 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp
@@ -122,7 +122,7 @@ public:
return false;
}
- Player const * GetPlayerInMap() const
+ Player const* GetPlayerInMap() const
{
Map::PlayerList const& players = instance->GetPlayers();
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
index 87301f43745..ec9409af69f 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
@@ -102,7 +102,7 @@ class boss_archaedas : public CreatureScript
DoCast(minion, SPELL_AWAKEN_VAULT_WALKER, flag);
minion->CastSpell(minion, SPELL_ARCHAEDAS_AWAKEN, true);
minion->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- minion->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_MOVE);
+ minion->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
minion->setFaction(14);
}
}
@@ -130,7 +130,7 @@ class boss_archaedas : public CreatureScript
Talk(SAY_KILL);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!instance)
return;
@@ -278,7 +278,7 @@ class mob_archaedas_minions : public CreatureScript
ScriptedAI::MoveInLineOfSight(who);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
// we're still in the awaken animation
if (bWakingUp && iAwakenTimer >= 0)
@@ -347,7 +347,7 @@ class mob_stonekeepers : public CreatureScript
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
//Return since we have no target
if (!UpdateVictim())
@@ -399,35 +399,6 @@ class go_altar_of_archaedas : public GameObjectScript
}
};
-/* ScriptData
-SDName: go_altar_of_the_keepers
-SD%Complete: 100
-SDComment: Need 1 person to activate to open the altar. One by one the StoneKeepers will activate. After all four are dead than the door will open.
-SDCategory: Uldaman
-EndScriptData */
-
-class go_altar_of_the_keepers : public GameObjectScript
-{
- public:
-
- go_altar_of_the_keepers()
- : GameObjectScript("go_altar_of_the_keepers")
- {
- }
-
- bool OnGossipHello(Player* player, GameObject* /*go*/)
- {
- InstanceScript* instance = player->GetInstanceScript();
- if (!instance)
- return false;
-
- player->CastSpell (player, SPELL_BOSS_OBJECT_VISUAL, false);
-
- instance->SetData(DATA_STONE_KEEPERS, IN_PROGRESS); // activate the Stone Keepers
- return false;
- }
-};
-
//This is the actual function called only once durring InitScripts()
//It must define all handled functions that are to be run in this script
void AddSC_boss_archaedas()
@@ -436,6 +407,5 @@ void AddSC_boss_archaedas()
new mob_archaedas_minions();
new mob_stonekeepers();
new go_altar_of_archaedas();
- new go_altar_of_the_keepers();
}
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp b/src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp
index 6f521060541..f40570d4130 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp
@@ -63,7 +63,7 @@ class boss_ironaya : public CreatureScript
Talk(SAY_AGGRO);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp
index 138243a9ce2..df87eaca5a8 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp
@@ -33,38 +33,38 @@ enum eSpells
SPELL_AWAKEN_VAULT_WALKER = 10258,
};
+enum Events
+{
+ EVENT_SUB_BOSS_AGGRO = 2228
+};
+
class instance_uldaman : public InstanceMapScript
{
public:
- instance_uldaman()
- : InstanceMapScript("instance_uldaman", 70)
- {
- }
+ instance_uldaman() : InstanceMapScript("instance_uldaman", 70) {}
struct instance_uldaman_InstanceMapScript : public InstanceScript
{
- instance_uldaman_InstanceMapScript(Map* map) : InstanceScript(map)
- {
- }
+ instance_uldaman_InstanceMapScript(Map* map) : InstanceScript(map) {}
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
- uiArchaedasGUID = 0;
- uiIronayaGUID = 0;
- uiWhoWokeuiArchaedasGUID = 0;
+ archaedasGUID = 0;
+ ironayaGUID = 0;
+ whoWokeuiArchaedasGUID = 0;
- uiAltarOfTheKeeperTempleDoor = 0;
- uiArchaedasTempleDoor = 0;
- uiAncientVaultDoor = 0;
+ altarOfTheKeeperTempleDoor = 0;
+ archaedasTempleDoor = 0;
+ ancientVaultDoor = 0;
- uiIronayaSealDoor = 0;
+ ironayaSealDoor = 0;
- uiKeystoneGUID = 0;
+ keystoneGUID = 0;
- uiIronayaSealDoorTimer = 27000; //animation time
- bKeystoneCheck = false;
+ ironayaSealDoorTimer = 27000; //animation time
+ keystoneCheck = false;
}
bool IsEncounterInProgress() const
@@ -76,25 +76,25 @@ class instance_uldaman : public InstanceMapScript
return false;
}
- uint64 uiArchaedasGUID;
- uint64 uiIronayaGUID;
- uint64 uiWhoWokeuiArchaedasGUID;
+ uint64 archaedasGUID;
+ uint64 ironayaGUID;
+ uint64 whoWokeuiArchaedasGUID;
- uint64 uiAltarOfTheKeeperTempleDoor;
- uint64 uiArchaedasTempleDoor;
- uint64 uiAncientVaultDoor;
- uint64 uiIronayaSealDoor;
+ uint64 altarOfTheKeeperTempleDoor;
+ uint64 archaedasTempleDoor;
+ uint64 ancientVaultDoor;
+ uint64 ironayaSealDoor;
- uint64 uiKeystoneGUID;
+ uint64 keystoneGUID;
- uint32 uiIronayaSealDoorTimer;
- bool bKeystoneCheck;
+ uint32 ironayaSealDoorTimer;
+ bool keystoneCheck;
- std::vector<uint64> vStoneKeeper;
- std::vector<uint64> vAltarOfTheKeeperCount;
- std::vector<uint64> vVaultWalker;
- std::vector<uint64> vEarthenGuardian;
- std::vector<uint64> vArchaedasWallMinions; // minions lined up around the wall
+ std::vector<uint64> stoneKeepers;
+ std::vector<uint64> altarOfTheKeeperCounts;
+ std::vector<uint64> vaultWalkers;
+ std::vector<uint64> earthenGuardians;
+ std::vector<uint64> archaedasWallMinions; // minions lined up around the wall
uint32 m_auiEncounter[MAX_ENCOUNTER];
std::string str_data;
@@ -104,14 +104,14 @@ class instance_uldaman : public InstanceMapScript
switch (go->GetEntry())
{
case GO_ALTAR_OF_THE_KEEPER_TEMPLE_DOOR: // lock the door
- uiAltarOfTheKeeperTempleDoor = go->GetGUID();
+ altarOfTheKeeperTempleDoor = go->GetGUID();
if (m_auiEncounter[0] == DONE)
HandleGameObject(0, true, go);
break;
case GO_ARCHAEDAS_TEMPLE_DOOR:
- uiArchaedasTempleDoor = go->GetGUID();
+ archaedasTempleDoor = go->GetGUID();
if (m_auiEncounter[0] == DONE)
HandleGameObject(0, true, go);
@@ -120,21 +120,21 @@ class instance_uldaman : public InstanceMapScript
case GO_ANCIENT_VAULT_DOOR:
go->SetGoState(GO_STATE_READY);
go->SetUInt32Value(GAMEOBJECT_FLAGS, 33);
- uiAncientVaultDoor = go->GetGUID();
+ ancientVaultDoor = go->GetGUID();
if (m_auiEncounter[1] == DONE)
HandleGameObject(0, true, go);
break;
case GO_IRONAYA_SEAL_DOOR:
- uiIronayaSealDoor = go->GetGUID();
+ ironayaSealDoor = go->GetGUID();
if (m_auiEncounter[2] == DONE)
HandleGameObject(0, true, go);
break;
case GO_KEYSTONE:
- uiKeystoneGUID = go->GetGUID();
+ keystoneGUID = go->GetGUID();
if (m_auiEncounter[2] == DONE)
{
@@ -174,35 +174,38 @@ class instance_uldaman : public InstanceMapScript
void ActivateStoneKeepers()
{
- for (std::vector<uint64>::const_iterator i = vStoneKeeper.begin(); i != vStoneKeeper.end(); ++i)
+ if (GetData(DATA_ALTAR_DOORS) != DONE)
{
- Creature* target = instance->GetCreature(*i);
- if (!target || !target->isAlive() || target->getFaction() == 14)
- continue;
- target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
- target->setFaction(14);
- target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- return; // only want the first one we find
+ for (std::vector<uint64>::const_iterator i = stoneKeepers.begin(); i != stoneKeepers.end(); ++i)
+ {
+ Creature* target = instance->GetCreature(*i);
+ if (!target || !target->isAlive())
+ continue;
+ target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
+ target->setFaction(14);
+ target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ return; // only want the first one we find
+ }
+ // if we get this far than all four are dead so open the door
+ SetData(DATA_ALTAR_DOORS, DONE);
+ SetDoor(archaedasTempleDoor, true); //open next the door too
}
- // if we get this far than all four are dead so open the door
- SetData(DATA_ALTAR_DOORS, DONE);
- SetDoor(uiArchaedasTempleDoor, true); //open next the door too
}
void ActivateWallMinions()
{
- Creature* archaedas = instance->GetCreature(uiArchaedasGUID);
+ Creature* archaedas = instance->GetCreature(archaedasGUID);
if (!archaedas)
return;
- for (std::vector<uint64>::const_iterator i = vArchaedasWallMinions.begin(); i != vArchaedasWallMinions.end(); ++i)
+ for (std::vector<uint64>::const_iterator i = archaedasWallMinions.begin(); i != archaedasWallMinions.end(); ++i)
{
Creature* target = instance->GetCreature(*i);
if (!target || !target->isAlive() || target->getFaction() == 14)
continue;
archaedas->CastSpell(target, SPELL_AWAKEN_VAULT_WALKER, true);
target->CastSpell(target, SPELL_ARCHAEDAS_AWAKEN, true);
- target->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_MOVE);
+ target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
target->setFaction(14);
return; // only want the first one we find
@@ -213,7 +216,7 @@ class instance_uldaman : public InstanceMapScript
void DeActivateMinions()
{
// first despawn any aggroed wall minions
- for (std::vector<uint64>::const_iterator i = vArchaedasWallMinions.begin(); i != vArchaedasWallMinions.end(); ++i)
+ for (std::vector<uint64>::const_iterator i = archaedasWallMinions.begin(); i != archaedasWallMinions.end(); ++i)
{
Creature* target = instance->GetCreature(*i);
if (!target || target->isDead() || target->getFaction() != 14)
@@ -223,7 +226,7 @@ class instance_uldaman : public InstanceMapScript
}
// Vault Walkers
- for (std::vector<uint64>::const_iterator i = vVaultWalker.begin(); i != vVaultWalker.end(); ++i)
+ for (std::vector<uint64>::const_iterator i = vaultWalkers.begin(); i != vaultWalkers.end(); ++i)
{
Creature* target = instance->GetCreature(*i);
if (!target || target->isDead() || target->getFaction() != 14)
@@ -233,7 +236,7 @@ class instance_uldaman : public InstanceMapScript
}
// Earthen Guardians
- for (std::vector<uint64>::const_iterator i = vEarthenGuardian.begin(); i != vEarthenGuardian.end(); ++i)
+ for (std::vector<uint64>::const_iterator i = earthenGuardians.begin(); i != earthenGuardians.end(); ++i)
{
Creature* target = instance->GetCreature(*i);
if (!target || target->isDead() || target->getFaction() != 14)
@@ -245,20 +248,20 @@ class instance_uldaman : public InstanceMapScript
void ActivateArchaedas(uint64 target)
{
- Creature* archaedas = instance->GetCreature(uiArchaedasGUID);
+ Creature* archaedas = instance->GetCreature(archaedasGUID);
if (!archaedas)
return;
if (Unit::GetUnit(*archaedas, target))
{
archaedas->CastSpell(archaedas, SPELL_ARCHAEDAS_AWAKEN, false);
- uiWhoWokeuiArchaedasGUID = target;
+ whoWokeuiArchaedasGUID = target;
}
}
void ActivateIronaya()
{
- Creature* ironaya = instance->GetCreature(uiIronayaGUID);
+ Creature* ironaya = instance->GetCreature(ironayaGUID);
if (!ironaya)
return;
@@ -270,7 +273,7 @@ class instance_uldaman : public InstanceMapScript
void RespawnMinions()
{
// first respawn any aggroed wall minions
- for (std::vector<uint64>::const_iterator i = vArchaedasWallMinions.begin(); i != vArchaedasWallMinions.end(); ++i)
+ for (std::vector<uint64>::const_iterator i = archaedasWallMinions.begin(); i != archaedasWallMinions.end(); ++i)
{
Creature* target = instance->GetCreature(*i);
if (target && target->isDead())
@@ -282,7 +285,7 @@ class instance_uldaman : public InstanceMapScript
}
// Vault Walkers
- for (std::vector<uint64>::const_iterator i = vVaultWalker.begin(); i != vVaultWalker.end(); ++i)
+ for (std::vector<uint64>::const_iterator i = vaultWalkers.begin(); i != vaultWalkers.end(); ++i)
{
Creature* target = instance->GetCreature(*i);
if (target && target->isDead())
@@ -294,7 +297,7 @@ class instance_uldaman : public InstanceMapScript
}
// Earthen Guardians
- for (std::vector<uint64>::const_iterator i = vEarthenGuardian.begin(); i != vEarthenGuardian.end(); ++i)
+ for (std::vector<uint64>::const_iterator i = earthenGuardians.begin(); i != earthenGuardians.end(); ++i)
{
Creature* target = instance->GetCreature(*i);
if (target && target->isDead())
@@ -307,21 +310,21 @@ class instance_uldaman : public InstanceMapScript
}
void Update(uint32 diff)
{
- if (!bKeystoneCheck)
+ if (!keystoneCheck)
return;
- if (uiIronayaSealDoorTimer <= diff)
+ if (ironayaSealDoorTimer <= diff)
{
ActivateIronaya();
- SetDoor(uiIronayaSealDoor, true);
- BlockGO(uiKeystoneGUID);
+ SetDoor(ironayaSealDoor, true);
+ BlockGO(keystoneGUID);
SetData(DATA_IRONAYA_DOOR, DONE); //save state
- bKeystoneCheck = false;
+ keystoneCheck = false;
}
else
- uiIronayaSealDoorTimer -= diff;
+ ironayaSealDoorTimer -= diff;
}
void SetData(uint32 type, uint32 data)
@@ -331,15 +334,15 @@ class instance_uldaman : public InstanceMapScript
case DATA_ALTAR_DOORS:
m_auiEncounter[0] = data;
if (data == DONE)
- SetDoor(uiAltarOfTheKeeperTempleDoor, true);
+ SetDoor(altarOfTheKeeperTempleDoor, true);
break;
case DATA_ANCIENT_DOOR:
m_auiEncounter[1] = data;
if (data == DONE) //archeadas defeat
{
- SetDoor(uiArchaedasTempleDoor, true); //re open enter door
- SetDoor(uiAncientVaultDoor, true);
+ SetDoor(archaedasTempleDoor, true); //re open enter door
+ SetDoor(ancientVaultDoor, true);
}
break;
@@ -356,7 +359,7 @@ class instance_uldaman : public InstanceMapScript
{
case NOT_STARTED:
if (m_auiEncounter[0] == DONE) //if players opened the doors
- SetDoor(uiArchaedasTempleDoor, true);
+ SetDoor(archaedasTempleDoor, true);
RespawnMinions();
break;
@@ -372,7 +375,7 @@ class instance_uldaman : public InstanceMapScript
break;
case DATA_IRONAYA_SEAL:
- bKeystoneCheck = true;
+ keystoneCheck = true;
break;
}
@@ -396,7 +399,7 @@ class instance_uldaman : public InstanceMapScript
if (type == 0)
{
ActivateArchaedas (data);
- SetDoor(uiArchaedasTempleDoor, false); //close when event is started
+ SetDoor(archaedasTempleDoor, false); //close when event is started
}
}
@@ -433,34 +436,34 @@ class instance_uldaman : public InstanceMapScript
{
case 4857: // Stone Keeper
SetFrozenState (creature);
- vStoneKeeper.push_back(creature->GetGUID());
+ stoneKeepers.push_back(creature->GetGUID());
break;
case 7309: // Earthen Custodian
- vArchaedasWallMinions.push_back(creature->GetGUID());
+ archaedasWallMinions.push_back(creature->GetGUID());
break;
case 7077: // Earthen Hallshaper
- vArchaedasWallMinions.push_back(creature->GetGUID());
+ archaedasWallMinions.push_back(creature->GetGUID());
break;
case 7076: // Earthen Guardian
- vEarthenGuardian.push_back(creature->GetGUID());
+ earthenGuardians.push_back(creature->GetGUID());
break;
case 7228: // Ironaya
- uiIronayaGUID = creature->GetGUID();
+ ironayaGUID = creature->GetGUID();
if (m_auiEncounter[2] != DONE)
SetFrozenState (creature);
break;
case 10120: // Vault Walker
- vVaultWalker.push_back(creature->GetGUID());
+ vaultWalkers.push_back(creature->GetGUID());
break;
case 2748: // Archaedas
- uiArchaedasGUID = creature->GetGUID();
+ archaedasGUID = creature->GetGUID();
break;
}
@@ -471,25 +474,37 @@ class instance_uldaman : public InstanceMapScript
switch (identifier)
{
case 0:
- return uiWhoWokeuiArchaedasGUID;
+ return whoWokeuiArchaedasGUID;
case 1:
case 2:
case 3:
case 4:
- return vVaultWalker.at(identifier - 1);
+ return vaultWalkers.at(identifier - 1);
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
- return vEarthenGuardian.at(identifier - 5);
+ return earthenGuardians.at(identifier - 5);
default:
break;
}
return 0;
} // end GetData64
+
+ void ProcessEvent(WorldObject* /*gameObject*/, uint32 eventId)
+ {
+ switch (eventId)
+ {
+ case EVENT_SUB_BOSS_AGGRO:
+ SetData(DATA_STONE_KEEPERS, IN_PROGRESS); // activate the Stone Keepers
+ break;
+ default:
+ break;
+ }
+ }
};
InstanceScript* GetInstanceScript(InstanceMap* map) const
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
index 0cd59951590..9fdc2f26d9f 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
@@ -68,7 +68,7 @@ class mob_jadespine_basilisk : public CreatureScript
{
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
index 1b2512ccf63..ce526fb0ddc 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
@@ -201,8 +201,11 @@ class boss_akilzon : public CreatureScript
//dealdamege
for (std::list<Unit*>::const_iterator i = tempUnitMap.begin(); i != tempUnitMap.end(); ++i)
{
- if (!Cloud->IsWithinDist(*i, 6, false))
- Cloud->CastCustomSpell(*i, 43137, &bp0, NULL, NULL, true, 0, 0, me->GetGUID());
+ if (Unit* target = (*i))
+ {
+ if (!Cloud->IsWithinDist(target, 6, false))
+ Cloud->CastCustomSpell(target, 43137, &bp0, NULL, NULL, true, 0, 0, me->GetGUID());
+ }
}
// visual
float x, y, z;
@@ -237,7 +240,7 @@ class boss_akilzon : public CreatureScript
StormSequenceTimer = 1000;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -418,7 +421,7 @@ class mob_akilzon_eagle : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (EagleSwoop_Timer <= diff)
EagleSwoop_Timer = 0;
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp
index 935e54eae0c..21392fda660 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp
@@ -45,32 +45,37 @@ EndScriptData */
#define YELL_BERSERK "Whatch you be doing? Pissin' yourselves..."
#define SOUND_BERSERK 12025
-#define SPELL_DUAL_WIELD 29651
-#define SPELL_SABER_LASH 43267
-#define SPELL_FRENZY 43139
-#define SPELL_FLAMESHOCK 43303
-#define SPELL_EARTHSHOCK 43305
-#define SPELL_TRANSFORM_SPLIT 43142
-#define SPELL_TRANSFORM_SPLIT2 43573
-#define SPELL_TRANSFORM_MERGE 43271
-#define SPELL_SUMMON_LYNX 43143
-#define SPELL_SUMMON_TOTEM 43302
-#define SPELL_BERSERK 45078
-
-#define MOB_SPIRIT_LYNX 24143
-#define SPELL_LYNX_FRENZY 43290
-#define SPELL_SHRED_ARMOR 43243
-
-#define MOB_TOTEM 24224
+enum Spells
+{
+ SPELL_DUAL_WIELD = 29651,
+ SPELL_SABER_LASH = 43267,
+ SPELL_FRENZY = 43139,
+ SPELL_FLAMESHOCK = 43303,
+ SPELL_EARTHSHOCK = 43305,
+ SPELL_TRANSFORM_SPLIT = 43142,
+ SPELL_TRANSFORM_SPLIT2 = 43573,
+ SPELL_TRANSFORM_MERGE = 43271,
+ SPELL_SUMMON_LYNX = 43143,
+ SPELL_SUMMON_TOTEM = 43302,
+ SPELL_BERSERK = 45078,
+ SPELL_LYNX_FRENZY = 43290, // Used by Spirit Lynx
+ SPELL_SHRED_ARMOR = 43243 // Used by Spirit Lynx
+};
+
+enum Hal_CreatureIds
+{
+ NPC_SPIRIT_LYNX = 24143,
+ NPC_TOTEM = 24224
+};
enum PhaseHalazzi
{
- PHASE_NONE = 0,
- PHASE_LYNX = 1,
- PHASE_SPLIT = 2,
- PHASE_HUMAN = 3,
- PHASE_MERGE = 4,
- PHASE_ENRAGE = 5
+ PHASE_NONE = 0,
+ PHASE_LYNX = 1,
+ PHASE_SPLIT = 2,
+ PHASE_HUMAN = 3,
+ PHASE_MERGE = 4,
+ PHASE_ENRAGE = 5
};
class boss_halazzi : public CreatureScript
@@ -134,7 +139,7 @@ class boss_halazzi : public CreatureScript
void JustSummoned(Creature* summon)
{
summon->AI()->AttackStart(me->getVictim());
- if (summon->GetEntry() == MOB_SPIRIT_LYNX)
+ if (summon->GetEntry() == NPC_SPIRIT_LYNX)
LynxGUID = summon->GetGUID();
}
@@ -183,7 +188,7 @@ class boss_halazzi : public CreatureScript
break;
case PHASE_HUMAN:
//DoCast(me, SPELL_SUMMON_LYNX, true);
- DoSpawnCreature(MOB_SPIRIT_LYNX, 5, 5, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
+ DoSpawnCreature(NPC_SPIRIT_LYNX, 5, 5, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
me->SetMaxHealth(400000);
me->SetHealth(400000);
ShockTimer = 10000;
@@ -208,7 +213,7 @@ class boss_halazzi : public CreatureScript
Phase = NextPhase;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -379,7 +384,7 @@ class mob_halazzi_lynx : public CreatureScript
void EnterCombat(Unit* /*who*/) {/*DoZoneInCombat();*/}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -413,3 +418,4 @@ void AddSC_boss_halazzi()
new mob_halazzi_lynx();
}
+
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
index d3d7bd390ca..332baa29b51 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
@@ -198,7 +198,7 @@ struct boss_hexlord_addAI : public ScriptedAI
DoZoneInCombat();
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (instance && instance->GetData(DATA_HEXLORDEVENT) != IN_PROGRESS)
{
@@ -351,7 +351,7 @@ class boss_hexlord_malacrass : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -511,7 +511,7 @@ class boss_thurg : public CreatureScript
boss_hexlord_addAI::Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -588,7 +588,7 @@ class boss_alyson_antille : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -672,7 +672,7 @@ struct boss_gazakrothAI : public boss_hexlord_addAI
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -714,7 +714,7 @@ class boss_lord_raadan : public CreatureScript
boss_hexlord_addAI::Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -763,7 +763,7 @@ class boss_darkheart : public CreatureScript
psychicwail_timer = 8000;
boss_hexlord_addAI::Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -822,7 +822,7 @@ class boss_slither : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -867,7 +867,7 @@ class boss_fenstalker : public CreatureScript
boss_hexlord_addAI::Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -916,7 +916,7 @@ class boss_koragg : public CreatureScript
boss_hexlord_addAI::Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
index eced8dd6830..75e044a3c5e 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
@@ -315,7 +315,7 @@ class boss_janalai : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (isFlameBreathing)
{
@@ -468,7 +468,7 @@ class mob_janalai_firebomb : public CreatureScript
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 /*diff*/) {}
+ void UpdateAI(uint32 /*diff*/) {}
};
CreatureAI* GetAI(Creature* creature) const
@@ -560,7 +560,7 @@ class mob_janalai_hatcher : public CreatureScript
WaitTimer = 1;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!instance || !(instance->GetData(DATA_JANALAIEVENT) == IN_PROGRESS))
{
@@ -641,7 +641,7 @@ class mob_janalai_hatchling : public CreatureScript
void EnterCombat(Unit* /*who*/) {/*DoZoneInCombat();*/}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!instance || !(instance->GetData(DATA_JANALAIEVENT) == IN_PROGRESS))
{
@@ -684,7 +684,7 @@ public:
void Reset() {}
- void UpdateAI(uint32 const /*diff*/) {}
+ void UpdateAI(uint32 /*diff*/) {}
void SpellHit(Unit* /*caster*/, const SpellInfo* spell)
{
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
index 8fd9da930ae..6c8b1cd8aba 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
@@ -155,7 +155,7 @@ class boss_nalorakk : public CreatureScript
Berserk_Timer = 600000;
inBearForm = false;
- // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122); // TODO: find the correct equipment id
+ // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122); /// @todo find the correct equipment id
}
void SendAttacker(Unit* target)
@@ -343,7 +343,7 @@ class boss_nalorakk : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (waitTimer && inMove)
{
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
index 2305c360fd2..be88e67386b 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
@@ -363,7 +363,7 @@ class boss_zuljin : public CreatureScript
Phase = NextPhase;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!TankGUID)
{
@@ -582,7 +582,7 @@ class mob_zuljin_vortex : public CreatureScript
DoCast(caster, SPELL_ZAP_DAMAGE, true);
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
//if the vortex reach the target, it change his target to another player
if (me->IsWithinMeleeRange(me->getVictim()))
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
index 59997ebaa31..ff6d434fa40 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
@@ -148,7 +148,7 @@ class npc_zulaman_hostage : public CreatureScript
player->SendLoot(me->GetGUID(), LOOT_CORPSE);
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (IsLoot)
DoCast(me, 7, false);
@@ -314,14 +314,14 @@ class npc_harrison_jones : public CreatureScript
me->SetEntry(NPC_HARRISON_JONES_2);
me->SetDisplayId(MODEL_HARRISON_JONES_2);
me->SetTarget(0);
- me->SetByteValue(UNIT_FIELD_BYTES_1,0,UNIT_STAND_STATE_DEAD);
+ me->SetByteValue(UNIT_FIELD_BYTES_1, 0, UNIT_STAND_STATE_DEAD);
me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
if (instance)
instance->SetData(DATA_GONGEVENT, DONE);
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (_gongEvent)
{
@@ -330,7 +330,7 @@ class npc_harrison_jones : public CreatureScript
switch (_gongEvent)
{
case GONG_EVENT_1:
- me->GetMotionMaster()->MovePath(HARRISON_MOVE_1,false);
+ me->GetMotionMaster()->MovePath(HARRISON_MOVE_1, false);
_gongEvent = GONG_EVENT_2;
_gongTimer = 12000;
break;
@@ -345,14 +345,14 @@ class npc_harrison_jones : public CreatureScript
break;
case GONG_EVENT_3:
if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetData64(GO_STRANGE_GONG)))
- gong->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_NOT_SELECTABLE);
+ gong->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
_gongEvent = GONG_EVENT_4;
_gongTimer = 105000;
break;
case GONG_EVENT_4:
me->RemoveAura(SPELL_BANGING_THE_GONG);
if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetData64(GO_STRANGE_GONG)))
- gong->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_NOT_SELECTABLE);
+ gong->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
// trigger or gong will need to be scripted to set IN_PROGRESS after enough hits.
// This is temp workaround.
@@ -362,7 +362,7 @@ class npc_harrison_jones : public CreatureScript
if (instance->GetData(DATA_GONGEVENT) == IN_PROGRESS)
{
// Players are Now Saved to instance at SPECIAL (Player should be notified?)
- me->GetMotionMaster()->MovePath(HARRISON_MOVE_2,false);
+ me->GetMotionMaster()->MovePath(HARRISON_MOVE_2, false);
_gongEvent = GONG_EVENT_5;
_gongTimer = 5000;
}
@@ -401,12 +401,12 @@ class npc_harrison_jones : public CreatureScript
ptarget->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_SPEAR));
ptarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
ptarget->SetReactState(REACT_PASSIVE);
- ptarget->AI()->SetData(0,1);
+ ptarget->AI()->SetData(0, 1);
}
else
ptarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
ptarget->SetReactState(REACT_PASSIVE);
- ptarget->AI()->SetData(0,2);
+ ptarget->AI()->SetData(0, 2);
}
}
}
@@ -421,7 +421,7 @@ class npc_harrison_jones : public CreatureScript
DoCast(me, SPELL_STEALTH);
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0));
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
- me->GetMotionMaster()->MovePath(HARRISON_MOVE_3,false);
+ me->GetMotionMaster()->MovePath(HARRISON_MOVE_3, false);
_gongTimer = 1000;
_gongEvent = 0;
break;
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
index 54a5f5c706c..97eeb385e15 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -17,270 +16,433 @@
*/
/* ScriptData
-SDName: Boss_Arlokk
-SD%Complete: 95
-SDComment: Wrong cleave and red aura is missing.
-SDCategory: Zul'Gurub
+TCName: Boss_Arlokk
+TC%Complete: 95
+TCComment: Wrong cleave and red aura is missing not yet added.
+TCComment: Prowlers moving through wall hopefully mmaps will fix.
+TCComment: Can't test LOS until mmaps.
+TCCategory: Zul'Gurub
EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "SpellInfo.h"
#include "zulgurub.h"
-enum eYells
+enum Says
{
SAY_AGGRO = 0,
- SAY_FEAST_PANTHER = 1,
- SAY_DEATH = 2,
+ SAY_FEAST_PROWLER = 1,
+ SAY_DEATH = 2
};
-enum eSpells
+enum Spells
{
- SPELL_SHADOWWORDPAIN = 23952,
- SPELL_GOUGE = 24698,
- SPELL_MARK = 24210,
- SPELL_CLEAVE = 26350, //Perhaps not right. Not a red aura...
- SPELL_PANTHER_TRANSFORM = 24190,
-
- MODEL_ID_NORMAL = 15218,
- MODEL_ID_PANTHER = 15215,
- MODEL_ID_BLANK = 11686,
-
- NPC_ZULIAN_PROWLER = 15101
+ SPELL_SHADOW_WORD_PAIN = 24212, // Corrected
+ SPELL_GOUGE = 12540, // Corrected
+ SPELL_MARK_OF_ARLOKK = 24210, // triggered spell 24211 Added to spell_dbc
+ SPELL_RAVAGE = 24213, // Corrected
+ SPELL_CLEAVE = 25174, // Searching for right spell
+ SPELL_PANTHER_TRANSFORM = 24190, // Transform to panther now used
+ SPELL_SUMMON_PROWLER = 24246, // Added to Spell_dbc
+ SPELL_VANISH_VISUAL = 24222, // Added
+ SPELL_VANISH = 24223, // Added
+ SPELL_SUPER_INVIS = 24235 // Added to Spell_dbc
};
-class boss_arlokk : public CreatureScript
+enum Events
{
- public:
-
- boss_arlokk()
- : CreatureScript("boss_arlokk")
- {
- }
+ EVENT_SHADOW_WORD_PAIN = 1,
+ EVENT_GOUGE = 2,
+ EVENT_MARK_OF_ARLOKK = 3,
+ EVENT_RAVAGE = 4,
+ EVENT_TRANSFORM = 5,
+ EVENT_VANISH = 6,
+ EVENT_VANISH_2 = 7,
+ EVENT_TRANSFORM_BACK = 8,
+ EVENT_VISIBLE = 9,
+ EVENT_SUMMON_PROWLERS = 10
+};
- struct boss_arlokkAI : public ScriptedAI
- {
- boss_arlokkAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
+enum Phases
+{
+ PHASE_ALL = 0,
+ PHASE_ONE = 1,
+ PHASE_TWO = 2
+};
- InstanceScript* instance;
+enum Weapon
+{
+ WEAPON_DAGGER = 10616
+};
- uint32 m_uiShadowWordPain_Timer;
- uint32 m_uiGouge_Timer;
- uint32 m_uiMark_Timer;
- uint32 m_uiCleave_Timer;
- uint32 m_uiVanish_Timer;
- uint32 m_uiVisible_Timer;
+enum Misc
+{
+ MAX_PROWLERS_PER_SIDE = 15
+};
- uint32 m_uiSummon_Timer;
- uint32 m_uiSummonCount;
+Position const PosMoveOnSpawn[1] =
+{
+ { -11561.9f, -1627.868f, 41.29941f, 0.0f }
+};
- Unit* m_pMarkedTarget;
- uint64 MarkedTargetGUID;
+class boss_arlokk : public CreatureScript
+{
+ public: boss_arlokk() : CreatureScript("boss_arlokk") {}
- bool m_bIsPhaseTwo;
- bool m_bIsVanished;
+ struct boss_arlokkAI : public BossAI
+ {
+ boss_arlokkAI(Creature* creature) : BossAI(creature, DATA_ARLOKK) { }
void Reset()
{
- m_uiShadowWordPain_Timer = 8000;
- m_uiGouge_Timer = 14000;
- m_uiMark_Timer = 35000;
- m_uiCleave_Timer = 4000;
- m_uiVanish_Timer = 60000;
- m_uiVisible_Timer = 6000;
-
- m_uiSummon_Timer = 5000;
- m_uiSummonCount = 0;
-
- m_bIsPhaseTwo = false;
- m_bIsVanished = false;
-
- MarkedTargetGUID = 0;
-
- me->SetDisplayId(MODEL_ID_NORMAL);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ _summonCountA = 0;
+ _summonCountB = 0;
+ me->RemoveAllAuras();
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER));
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER));
+ if (instance)
+ {
+ if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_FORCEFIELD)))
+ gate->SetGoState(GO_STATE_READY);
+ me->SetWalk(false);
+ me->GetMotionMaster()->MovePoint(0, PosMoveOnSpawn[0]);
+ }
}
- void EnterCombat(Unit* /*who*/)
+ void JustDied(Unit* /*killer*/)
{
- Talk(SAY_AGGRO);
+ Talk(SAY_DEATH);
+ me->RemoveAllAuras();
+ if (instance)
+ {
+ if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_FORCEFIELD)))
+ gate->SetGoState(GO_STATE_ACTIVE);
+ instance->SetBossState(DATA_ARLOKK, DONE);
+ }
}
- void JustReachedHome()
+ void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(7000, 9000), 0, PHASE_ONE);
+ events.ScheduleEvent(EVENT_GOUGE, urand(12000, 15000), 0, PHASE_ONE);
if (instance)
- instance->SetData(DATA_ARLOKK, NOT_STARTED);
+ events.ScheduleEvent(EVENT_SUMMON_PROWLERS, 6000, 0, PHASE_ALL);
+ events.ScheduleEvent(EVENT_MARK_OF_ARLOKK, urand(9000, 11000), 0, PHASE_ALL);
+ events.ScheduleEvent(EVENT_TRANSFORM, urand(15000, 20000), 0, PHASE_ONE);
+ Talk(SAY_AGGRO);
- //we should be summoned, so despawn
- me->DespawnOrUnsummon();
+ // Sets up list of Panther spawners to cast on
+ std::list<Creature*> triggerList;
+ GetCreatureListWithEntryInGrid(triggerList, me, NPC_PANTHER_TRIGGER, 100.0f);
+ if (!triggerList.empty())
+ {
+ uint8 sideA = 0;
+ uint8 sideB = 0;
+ for (std::list<Creature*>::const_iterator itr = triggerList.begin(); itr != triggerList.end(); ++itr)
+ {
+ if (Creature* trigger = *itr)
+ {
+ if (trigger->GetPositionY() < -1625.0f)
+ {
+ _triggersSideAGUID[sideA] = trigger->GetGUID();
+ ++sideA;
+ }
+ else
+ {
+ _triggersSideBGUID[sideB] = trigger->GetGUID();
+ ++sideB;
+ }
+ }
+ }
+ }
}
- void JustDied(Unit* /*killer*/)
+ void EnterEvadeMode()
{
- Talk(SAY_DEATH);
-
- me->SetDisplayId(MODEL_ID_NORMAL);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
-
if (instance)
- instance->SetData(DATA_ARLOKK, DONE);
+ {
+ if (GameObject* object = me->GetMap()->GetGameObject(instance->GetData64(GO_FORCEFIELD)))
+ object->SetGoState(GO_STATE_ACTIVE);
+ if (GameObject* object = me->GetMap()->GetGameObject(instance->GetData64(GO_GONG_OF_BETHEKK)))
+ object->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ instance->SetBossState(DATA_ARLOKK, NOT_STARTED);
+ }
+ me->DespawnOrUnsummon(4000);
}
- void DoSummonPhanters()
+ void SetData(uint32 id, uint32 /*value*/)
{
- if (MarkedTargetGUID)
- Talk(SAY_FEAST_PANTHER, MarkedTargetGUID);
-
- me->SummonCreature(NPC_ZULIAN_PROWLER, -11532.7998f, -1649.6734f, 41.4800f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- me->SummonCreature(NPC_ZULIAN_PROWLER, -11532.9970f, -1606.4840f, 41.2979f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ if (id == 1)
+ --_summonCountA;
+ else if (id == 2)
+ --_summonCountB;
}
- void JustSummoned(Creature* summoned)
+ void UpdateAI(uint32 diff)
{
- if (Unit* pMarkedTarget = Unit::GetUnit(*me, MarkedTargetGUID))
- summoned->AI()->AttackStart(pMarkedTarget);
+ if (!UpdateVictim())
+ return;
- ++m_uiSummonCount;
- }
+ events.Update(diff);
- void UpdateAI(const uint32 uiDiff)
- {
- if (!UpdateVictim())
+ if (me->HasUnitState(UNIT_STATE_CASTING))
return;
- if (!m_bIsPhaseTwo)
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (m_uiShadowWordPain_Timer <= uiDiff)
- {
- DoCast(me->getVictim(), SPELL_SHADOWWORDPAIN);
- m_uiShadowWordPain_Timer = 15000;
- }
- else
- m_uiShadowWordPain_Timer -= uiDiff;
-
- if (m_uiMark_Timer <= uiDiff)
+ switch (eventId)
{
- Unit* pMarkedTarget = SelectTarget(SELECT_TARGET_RANDOM, 0);
-
- if (pMarkedTarget)
+ case EVENT_SHADOW_WORD_PAIN:
+ DoCastVictim(SPELL_SHADOW_WORD_PAIN, true);
+ events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(5000, 7000), 0, PHASE_ONE);
+ break;
+ case EVENT_GOUGE:
+ DoCastVictim(SPELL_GOUGE, true);
+ break;
+ case EVENT_SUMMON_PROWLERS:
+ if (_summonCountA < MAX_PROWLERS_PER_SIDE)
+ {
+ if (Unit* trigger = me->GetUnit(*me, _triggersSideAGUID[urand(0, 4)]))
+ {
+ trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER);
+ ++_summonCountA;
+ }
+ }
+ if (_summonCountB < MAX_PROWLERS_PER_SIDE)
+ {
+ if (Unit* trigger = me->GetUnit(*me, _triggersSideBGUID[urand(0, 4)]))
+ {
+ trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER);
+ ++_summonCountB;
+ }
+ }
+ events.ScheduleEvent(EVENT_SUMMON_PROWLERS, 6000, 0, PHASE_ALL);
+ break;
+ case EVENT_MARK_OF_ARLOKK:
{
- DoCast(pMarkedTarget, SPELL_MARK);
- MarkedTargetGUID = pMarkedTarget->GetGUID();
+ Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, urand(1,3), 0.0f, false, -SPELL_MARK_OF_ARLOKK);
+ if (!target)
+ target = me->getVictim();
+ if (target)
+ {
+ DoCast(target, SPELL_MARK_OF_ARLOKK, true);
+ Talk(SAY_FEAST_PROWLER, target->GetGUID());
+ }
+ events.ScheduleEvent(EVENT_MARK_OF_ARLOKK, urand(120000, 130000));
+ break;
}
- else
- sLog->outError(LOG_FILTER_TSCR, "boss_arlokk could not accuire pMarkedTarget.");
-
- m_uiMark_Timer = 15000;
+ case EVENT_TRANSFORM:
+ {
+ DoCast(me, SPELL_PANTHER_TRANSFORM);
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(EQUIP_UNEQUIP));
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(EQUIP_UNEQUIP));
+ const CreatureTemplate* cinfo = me->GetCreatureTemplate();
+ me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35)));
+ me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
+ me->UpdateDamagePhysical(BASE_ATTACK);
+ me->AttackStop();
+ DoResetThreat();
+ me->SetReactState(REACT_PASSIVE);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
+ DoCast(me, SPELL_VANISH_VISUAL);
+ DoCast(me, SPELL_VANISH);
+ events.ScheduleEvent(EVENT_VANISH, 1000, 0, PHASE_ONE);
+ break;
+ }
+ case EVENT_VANISH:
+ DoCast(me, SPELL_SUPER_INVIS);
+ me->SetWalk(false);
+ if (instance)
+ me->GetMotionMaster()->MovePoint(0, frand(-11551.0f, -11508.0f), frand(-1638.0f, -1617.0f), me->GetPositionZ());
+ events.ScheduleEvent(EVENT_VANISH_2, 9000, 0, PHASE_ONE);
+ break;
+ case EVENT_VANISH_2:
+ DoCast(me, SPELL_VANISH);
+ DoCast(me, SPELL_SUPER_INVIS);
+ events.ScheduleEvent(EVENT_VISIBLE, urand(7000, 10000), 0, PHASE_ONE);
+ break;
+ case EVENT_VISIBLE:
+ me->SetReactState(REACT_AGGRESSIVE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ AttackStart(target);
+ me->RemoveAura(SPELL_SUPER_INVIS);
+ me->RemoveAura(SPELL_VANISH);
+ events.ScheduleEvent(EVENT_RAVAGE, urand(10000, 14000), 0, PHASE_TWO);
+ events.ScheduleEvent(EVENT_TRANSFORM_BACK, urand(15000, 18000), 0, PHASE_TWO);
+ events.SetPhase(PHASE_TWO);
+ break;
+ case EVENT_RAVAGE:
+ DoCastVictim(SPELL_RAVAGE, true);
+ events.ScheduleEvent(EVENT_RAVAGE, urand(10000, 14000), 0, PHASE_TWO);
+ break;
+ case EVENT_TRANSFORM_BACK:
+ {
+ me->RemoveAura(SPELL_PANTHER_TRANSFORM);
+ DoCast(me, SPELL_VANISH_VISUAL);
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER));
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER));
+ const CreatureTemplate* cinfo = me->GetCreatureTemplate();
+ me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg));
+ me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg));
+ me->UpdateDamagePhysical(BASE_ATTACK);
+ events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(4000, 7000), 0, PHASE_ONE);
+ events.ScheduleEvent(EVENT_GOUGE, urand(12000, 15000), 0, PHASE_ONE);
+ events.ScheduleEvent(EVENT_TRANSFORM, urand(16000, 20000), 0, PHASE_ONE);
+ events.SetPhase(PHASE_ONE);
+ break;
+ }
+ default:
+ break;
}
- else
- m_uiMark_Timer -= uiDiff;
}
- else
- {
- //Cleave_Timer
- if (m_uiCleave_Timer <= uiDiff)
- {
- DoCast(me->getVictim(), SPELL_CLEAVE);
- m_uiCleave_Timer = 16000;
- }
- else
- m_uiCleave_Timer -= uiDiff;
- //Gouge_Timer
- if (m_uiGouge_Timer <= uiDiff)
- {
- DoCast(me->getVictim(), SPELL_GOUGE);
+ DoMeleeAttackIfReady();
+ }
- DoModifyThreatPercent(me->getVictim(), -80);
+ private:
+ uint8 _summonCountA;
+ uint8 _summonCountB;
+ uint64 _triggersSideAGUID[5];
+ uint64 _triggersSideBGUID[5];
+ };
- m_uiGouge_Timer = 17000+rand()%10000;
- }
- else
- m_uiGouge_Timer -= uiDiff;
- }
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetZulGurubAI<boss_arlokkAI>(creature);
+ }
+};
- if (m_uiSummonCount <= 30)
- {
- if (m_uiSummon_Timer <= uiDiff)
- {
- DoSummonPhanters();
- m_uiSummon_Timer = 5000;
- }
- else
- m_uiSummon_Timer -= uiDiff;
- }
+/*######
+## npc_zulian_prowler
+######*/
- if (m_uiVanish_Timer <= uiDiff)
- {
- //Invisble Model
- me->SetDisplayId(MODEL_ID_BLANK);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+enum ZulianProwlerSpells
+{
+ SPELL_SNEAK_RANK_1_1 = 22766,
+ SPELL_SNEAK_RANK_1_2 = 7939, // Added to Spell_dbc
+ SPELL_MARK_OF_ARLOKK_TRIGGER = 24211 // Added to Spell_dbc
+};
- me->AttackStop();
- DoResetThreat();
+enum ZulianProwlerEvents
+{
+ EVENT_ATTACK = 1
+};
- m_bIsVanished = true;
+Position const PosProwlerCenter[1] =
+{
+ { -11556.7f, -1631.344f, 41.2994f, 0.0f }
+};
- m_uiVanish_Timer = 45000;
- m_uiVisible_Timer = 6000;
- }
+class npc_zulian_prowler : public CreatureScript
+{
+ public: npc_zulian_prowler() : CreatureScript("npc_zulian_prowler") {}
+
+ struct npc_zulian_prowlerAI : public ScriptedAI
+ {
+ npc_zulian_prowlerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
+
+ void Reset()
+ {
+ if (me->GetPositionY() < -1625.0f)
+ _sideData = 1;
else
- m_uiVanish_Timer -= uiDiff;
+ _sideData = 2;
+
+ DoCast(me, SPELL_SNEAK_RANK_1_1);
+ DoCast(me, SPELL_SNEAK_RANK_1_2);
+
+ if (_instance)
+ if (Unit* arlokk = me->GetUnit(*me, _instance->GetData64(NPC_ARLOKK)))
+ me->GetMotionMaster()->MovePoint(0, arlokk->GetPositionX(), arlokk->GetPositionY(), arlokk->GetPositionZ());
+ _events.ScheduleEvent(EVENT_ATTACK, 6000);
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ me->GetMotionMaster()->Clear(false);
+ me->RemoveAura(SPELL_SNEAK_RANK_1_1);
+ me->RemoveAura(SPELL_SNEAK_RANK_1_2);
+ }
+
+ void SpellHit(Unit* caster, SpellInfo const* spell)
+ {
+ if (spell->Id == SPELL_MARK_OF_ARLOKK_TRIGGER) // Should only hit if line of sight
+ me->Attack(caster, true);
+ }
- if (m_bIsVanished)
+ void JustDied(Unit* /*killer*/)
+ {
+ if (_instance)
{
- if (m_uiVisible_Timer <= uiDiff)
+ if (Unit* arlokk = me->GetUnit(*me, _instance->GetData64(NPC_ARLOKK)))
{
- //The Panther Model
- me->SetDisplayId(MODEL_ID_PANTHER);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ if (arlokk->isAlive())
+ arlokk->GetAI()->SetData(_sideData, 0);
+ }
+ }
+ me->DespawnOrUnsummon(4000);
+ }
- const CreatureTemplate* cinfo = me->GetCreatureTemplate();
- me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35)));
- me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
- me->UpdateDamagePhysical(BASE_ATTACK);
+ void UpdateAI(uint32 diff)
+ {
+ if (UpdateVictim())
+ {
+ DoMeleeAttackIfReady();
+ return;
+ }
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- AttackStart(target);
+ _events.Update(diff);
- m_bIsPhaseTwo = true;
- m_bIsVanished = false;
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_ATTACK:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0.0f, 100, false))
+ me->Attack(target, true);
+ break;
+ default:
+ break;
}
- else
- m_uiVisible_Timer -= uiDiff;
}
- else
- DoMeleeAttackIfReady();
}
+
+ private:
+ int32 _sideData;
+ EventMap _events;
+ InstanceScript* _instance;
};
CreatureAI* GetAI(Creature* creature) const
{
- return new boss_arlokkAI(creature);
+ return GetZulGurubAI<npc_zulian_prowlerAI>(creature);
}
};
+/*######
+## go_gong_of_bethekk
+######*/
+
+Position const PosSummonArlokk[1] =
+{
+ { -11507.22f, -1628.062f, 41.38264f, 3.159046f }
+};
+
class go_gong_of_bethekk : public GameObjectScript
{
- public:
- go_gong_of_bethekk() : GameObjectScript("go_gong_of_bethekk")
- {
- }
+ public: go_gong_of_bethekk() : GameObjectScript("go_gong_of_bethekk") {}
bool OnGossipHello(Player* /*player*/, GameObject* go)
{
- if (InstanceScript* instance = go->GetInstanceScript())
+ if (go->GetInstanceScript())
{
- if (instance->GetData(DATA_ARLOKK) == DONE || instance->GetData(DATA_ARLOKK) == IN_PROGRESS)
- return true;
-
- instance->SetData(DATA_ARLOKK, IN_PROGRESS);
- return true;
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ go->SendCustomAnim(0);
+ go->SummonCreature(NPC_ARLOKK, PosSummonArlokk[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 600000);
}
-
return true;
}
};
@@ -288,6 +450,6 @@ class go_gong_of_bethekk : public GameObjectScript
void AddSC_boss_arlokk()
{
new boss_arlokk();
+ new npc_zulian_prowler();
new go_gong_of_bethekk();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp
index e7d54aecb31..e930d864940 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp
@@ -25,62 +25,78 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "zulgurub.h"
-#define SPELL_FROSTBREATH 16099
-#define SPELL_MASSIVEGEYSER 22421 //Not working. Cause its a summon...
-#define SPELL_SLAM 24326
+enum Spells
+{
+ SPELL_FROSTBREATH = 16099,
+ SPELL_MASSIVEGEYSER = 22421, // Not working. (summon)
+ SPELL_SLAM = 24326
+};
-class boss_gahzranka : public CreatureScript
+enum Events
{
- public:
- boss_gahzranka() : CreatureScript("boss_gahzranka") { }
+ EVENT_FROSTBREATH = 0,
+ EVENT_MASSIVEGEYSER = 1,
+ EVENT_SLAM = 2
+};
- struct boss_gahzrankaAI : public ScriptedAI
+class boss_gahzranka : public CreatureScript // gahzranka
+{
+ public: boss_gahzranka() : CreatureScript("boss_gahzranka") {}
+
+ struct boss_gahzrankaAI : public BossAI
{
- boss_gahzrankaAI(Creature* creature) : ScriptedAI(creature) { }
- uint32 Frostbreath_Timer;
- uint32 MassiveGeyser_Timer;
- uint32 Slam_Timer;
+ boss_gahzrankaAI(Creature* creature) : BossAI(creature, DATA_GAHZRANKA) {}
void Reset()
{
- Frostbreath_Timer = 8000;
- MassiveGeyser_Timer = 25000;
- Slam_Timer = 17000;
+ _Reset();
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ _JustDied();
}
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_FROSTBREATH, 8000);
+ events.ScheduleEvent(EVENT_MASSIVEGEYSER, 25000);
+ events.ScheduleEvent(EVENT_SLAM, 17000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
- //Return since we have no target
if (!UpdateVictim())
return;
- //Frostbreath_Timer
- if (Frostbreath_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_FROSTBREATH);
- Frostbreath_Timer = urand(7000, 11000);
- } else Frostbreath_Timer -= diff;
-
- //MassiveGeyser_Timer
- if (MassiveGeyser_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_MASSIVEGEYSER);
- DoResetThreat();
+ events.Update(diff);
- MassiveGeyser_Timer = urand(22000, 32000);
- } else MassiveGeyser_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- //Slam_Timer
- if (Slam_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- DoCast(me->getVictim(), SPELL_SLAM);
- Slam_Timer = urand(12000, 20000);
- } else Slam_Timer -= diff;
+ switch (eventId)
+ {
+ case EVENT_FROSTBREATH:
+ DoCastVictim(SPELL_FROSTBREATH, true);
+ events.ScheduleEvent(EVENT_FROSTBREATH, urand(7000, 11000));
+ break;
+ case EVENT_MASSIVEGEYSER:
+ DoCastVictim(SPELL_MASSIVEGEYSER, true);
+ events.ScheduleEvent(EVENT_MASSIVEGEYSER, urand(22000, 32000));
+ break;
+ case EVENT_SLAM:
+ DoCastVictim(SPELL_SLAM, true);
+ events.ScheduleEvent(EVENT_SLAM, urand(12000, 20000));
+ break;
+ default:
+ break;
+ }
+ }
DoMeleeAttackIfReady();
}
@@ -96,4 +112,3 @@ void AddSC_boss_gahzranka()
{
new boss_gahzranka();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp
index 4ccdbceb466..af8303e63e4 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp
@@ -27,60 +27,77 @@ EndScriptData */
#include "ScriptedCreature.h"
#include "zulgurub.h"
-#define SPELL_AVARTAR 24646 //The Enrage Spell
-#define SPELL_GROUNDTREMOR 6524
+enum Spells
+{
+ SPELL_AVATAR = 24646, // Enrage Spell
+ SPELL_GROUND_TREMOR = 6524
+};
-class boss_grilek : public CreatureScript
+enum Events
{
- public:
- boss_grilek() : CreatureScript("boss_grilek") { }
+ EVENT_AVATAR = 0,
+ EVENT_GROUND_TREMOR = 1
+};
- struct boss_grilekAI : public ScriptedAI
- {
- boss_grilekAI(Creature* creature) : ScriptedAI(creature) { }
+class boss_grilek : public CreatureScript // grilek
+{
+ public: boss_grilek() : CreatureScript("boss_grilek") {}
- uint32 Avartar_Timer;
- uint32 GroundTremor_Timer;
+ struct boss_grilekAI : public BossAI
+ {
+ boss_grilekAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) {}
void Reset()
{
- Avartar_Timer = urand(15000, 25000);
- GroundTremor_Timer = urand(8000, 16000);
+ _Reset();
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ _JustDied();
}
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_AVATAR, urand(15000, 25000));
+ events.ScheduleEvent(EVENT_GROUND_TREMOR, urand(15000, 25000));
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
- //Return since we have no target
if (!UpdateVictim())
return;
- //Avartar_Timer
- if (Avartar_Timer <= diff)
- {
-
- DoCast(me, SPELL_AVARTAR);
- Unit* target = NULL;
+ events.Update(diff);
- target = SelectTarget(SELECT_TARGET_RANDOM, 1);
-
- if (DoGetThreat(me->getVictim()))
- DoModifyThreatPercent(me->getVictim(), -50);
- if (target)
- AttackStart(target);
-
- Avartar_Timer = urand(25000, 35000);
- } else Avartar_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- //GroundTremor_Timer
- if (GroundTremor_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- DoCast(me->getVictim(), SPELL_GROUNDTREMOR);
- GroundTremor_Timer = urand(12000, 16000);
- } else GroundTremor_Timer -= diff;
+ switch (eventId)
+ {
+ case EVENT_AVATAR:
+ DoCast(me, SPELL_AVATAR);
+ if (Unit* victim = me->getVictim())
+ {
+ if (DoGetThreat(victim))
+ DoModifyThreatPercent(victim, -50);
+ }
+
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
+ AttackStart(target);
+ events.ScheduleEvent(EVENT_AVATAR, urand(25000, 35000));
+ break;
+ case EVENT_GROUND_TREMOR:
+ DoCastVictim(SPELL_GROUND_TREMOR, true);
+ events.ScheduleEvent(EVENT_GROUND_TREMOR, urand(12000, 16000));
+ break;
+ default:
+ break;
+ }
+ }
DoMeleeAttackIfReady();
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp
index 781b68bfcb0..f9fe338d918 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -16,31 +15,33 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Hakkar
-SD%Complete: 95
-SDComment: Blood siphon spell buggy cause of Core Issue.
-SDCategory: Zul'Gurub
-EndScriptData */
+/*
+Name: Boss_Hakkar
+%Complete: 95
+Comment: Blood siphon spell buggy cause of Core Issue.
+Category: Zul'Gurub
+*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "zulgurub.h"
-enum Hakkar
+enum Says
{
SAY_AGGRO = 0,
SAY_FLEEING = 1,
- SAY_MINION_DESTROY = 2, //where does it belong?
- SAY_PROTECT_ALTAR = 3, //where does it belong?
+ SAY_MINION_DESTROY = 2, // Where does it belong?
+ SAY_PROTECT_ALTAR = 3 // Where does it belong?
+};
- SPELL_BLOODSIPHON = 24322,
- SPELL_CORRUPTEDBLOOD = 24328,
- SPELL_CAUSEINSANITY = 24327, //Not working disabled.
- SPELL_WILLOFHAKKAR = 24178,
+enum Spells
+{
+ SPELL_BLOOD_SIPHON = 24322, // Buggy ?
+ SPELL_CORRUPTED_BLOOD = 24328,
+ SPELL_CAUSE_INSANITY = 24327, // Spell needs scripting.
+ SPELL_WILL_OF_HAKKAR = 24178,
SPELL_ENRAGE = 24318,
-
-// The Aspects of all High Priests
+ // The Aspects of all High Priests spells
SPELL_ASPECT_OF_JEKLIK = 24687,
SPELL_ASPECT_OF_VENOXIS = 24688,
SPELL_ASPECT_OF_MARLI = 24686,
@@ -48,202 +49,119 @@ enum Hakkar
SPELL_ASPECT_OF_ARLOKK = 24690
};
+enum Events
+{
+ EVENT_BLOOD_SIPHON = 0,
+ EVENT_CORRUPTED_BLOOD = 1,
+ EVENT_CAUSE_INSANITY = 2, // Spell needs scripting. Event disabled
+ EVENT_WILL_OF_HAKKAR = 3,
+ EVENT_ENRAGE = 4,
+ // The Aspects of all High Priests events
+ EVENT_ASPECT_OF_JEKLIK = 5,
+ EVENT_ASPECT_OF_VENOXIS = 6,
+ EVENT_ASPECT_OF_MARLI = 7,
+ EVENT_ASPECT_OF_THEKAL = 8,
+ EVENT_ASPECT_OF_ARLOKK = 9
+};
+
class boss_hakkar : public CreatureScript
{
- public:
+ public: boss_hakkar() : CreatureScript("boss_hakkar") {}
- boss_hakkar()
- : CreatureScript("boss_hakkar")
+ struct boss_hakkarAI : public BossAI
{
- }
+ boss_hakkarAI(Creature* creature) : BossAI(creature, DATA_HAKKAR) {}
- struct boss_hakkarAI : public ScriptedAI
- {
- boss_hakkarAI(Creature* creature) : ScriptedAI(creature)
+ void Reset()
{
- instance = creature->GetInstanceScript();
+ _Reset();
}
- InstanceScript* instance;
-
- uint32 BloodSiphon_Timer;
- uint32 CorruptedBlood_Timer;
- uint32 CauseInsanity_Timer;
- uint32 WillOfHakkar_Timer;
- uint32 Enrage_Timer;
-
- uint32 CheckJeklik_Timer;
- uint32 CheckVenoxis_Timer;
- uint32 CheckMarli_Timer;
- uint32 CheckThekal_Timer;
- uint32 CheckArlokk_Timer;
-
- uint32 AspectOfJeklik_Timer;
- uint32 AspectOfVenoxis_Timer;
- uint32 AspectOfMarli_Timer;
- uint32 AspectOfThekal_Timer;
- uint32 AspectOfArlokk_Timer;
-
- bool Enraged;
-
- void Reset()
+ void JustDied(Unit* /*killer*/)
{
- BloodSiphon_Timer = 90000;
- CorruptedBlood_Timer = 25000;
- CauseInsanity_Timer = 17000;
- WillOfHakkar_Timer = 17000;
- Enrage_Timer = 600000;
-
- CheckJeklik_Timer = 1000;
- CheckVenoxis_Timer = 2000;
- CheckMarli_Timer = 3000;
- CheckThekal_Timer = 4000;
- CheckArlokk_Timer = 5000;
-
- AspectOfJeklik_Timer = 4000;
- AspectOfVenoxis_Timer = 7000;
- AspectOfMarli_Timer = 12000;
- AspectOfThekal_Timer = 8000;
- AspectOfArlokk_Timer = 18000;
-
- Enraged = false;
+ _JustDied();
}
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_BLOOD_SIPHON, 90000);
+ events.ScheduleEvent(EVENT_CORRUPTED_BLOOD, 25000);
+ events.ScheduleEvent(EVENT_CAUSE_INSANITY, 17000);
+ events.ScheduleEvent(EVENT_WILL_OF_HAKKAR, 17000);
+ events.ScheduleEvent(EVENT_ENRAGE, 600000);
+ if (instance->GetBossState(DATA_JEKLIK) != DONE)
+ events.ScheduleEvent(EVENT_ASPECT_OF_JEKLIK, 4000);
+ if (instance->GetBossState(DATA_VENOXIS) != DONE)
+ events.ScheduleEvent(EVENT_ASPECT_OF_VENOXIS, 7000);
+ if (instance->GetBossState(DATA_MARLI) != DONE)
+ events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12000);
+ if (instance->GetBossState(DATA_THEKAL) != DONE)
+ events.ScheduleEvent(EVENT_ASPECT_OF_THEKAL, 8000);
+ if (instance->GetBossState(DATA_ARLOKK) != DONE)
+ events.ScheduleEvent(EVENT_ASPECT_OF_ARLOKK, 18000);
Talk(SAY_AGGRO);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
- //BloodSiphon_Timer
- if (BloodSiphon_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_BLOODSIPHON);
- BloodSiphon_Timer = 90000;
- } else BloodSiphon_Timer -= diff;
-
- //CorruptedBlood_Timer
- if (CorruptedBlood_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_CORRUPTEDBLOOD);
- CorruptedBlood_Timer = urand(30000, 45000);
- } else CorruptedBlood_Timer -= diff;
-
- //CauseInsanity_Timer
- /*if (CauseInsanity_Timer <= diff)
- {
- if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_CAUSEINSANITY);
-
- CauseInsanity_Timer = urand(35000, 43000);
- } else CauseInsanity_Timer -= diff;*/
-
- //WillOfHakkar_Timer
- if (WillOfHakkar_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_WILLOFHAKKAR);
-
- WillOfHakkar_Timer = urand(25000, 35000);
- } else WillOfHakkar_Timer -= diff;
-
- if (!Enraged && Enrage_Timer <= diff)
- {
- DoCast(me, SPELL_ENRAGE);
- Enraged = true;
- } else Enrage_Timer -= diff;
-
- //Checking if Jeklik is dead. If not we cast her Aspect
- if (CheckJeklik_Timer <= diff)
- {
- if (instance)
- {
- if (instance->GetData(DATA_JEKLIK) != DONE)
- {
- if (AspectOfJeklik_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_ASPECT_OF_JEKLIK);
- AspectOfJeklik_Timer = urand(10000, 14000);
- } else AspectOfJeklik_Timer -= diff;
- }
- }
- CheckJeklik_Timer = 1000;
- } else CheckJeklik_Timer -= diff;
-
- //Checking if Venoxis is dead. If not we cast his Aspect
- if (CheckVenoxis_Timer <= diff)
- {
- if (instance)
- {
- if (instance->GetData(DATA_VENOXIS) != DONE)
- {
- if (AspectOfVenoxis_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_ASPECT_OF_VENOXIS);
- AspectOfVenoxis_Timer = 8000;
- } else AspectOfVenoxis_Timer -= diff;
- }
- }
- CheckVenoxis_Timer = 1000;
- } else CheckVenoxis_Timer -= diff;
-
- //Checking if Marli is dead. If not we cast her Aspect
- if (CheckMarli_Timer <= diff)
- {
- if (instance)
- {
- if (instance->GetData(DATA_MARLI) != DONE)
- {
- if (AspectOfMarli_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_ASPECT_OF_MARLI);
- AspectOfMarli_Timer = 10000;
- } else AspectOfMarli_Timer -= diff;
-
- }
- }
- CheckMarli_Timer = 1000;
- } else CheckMarli_Timer -= diff;
+ events.Update(diff);
- //Checking if Thekal is dead. If not we cast his Aspect
- if (CheckThekal_Timer <= diff)
- {
- if (instance)
- {
- if (instance->GetData(DATA_THEKAL) != DONE)
- {
- if (AspectOfThekal_Timer <= diff)
- {
- DoCast(me, SPELL_ASPECT_OF_THEKAL);
- AspectOfThekal_Timer = 15000;
- } else AspectOfThekal_Timer -= diff;
- }
- }
- CheckThekal_Timer = 1000;
- } else CheckThekal_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- //Checking if Arlokk is dead. If yes we cast her Aspect
- if (CheckArlokk_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (instance)
+ switch (eventId)
{
- if (instance->GetData(DATA_ARLOKK) != DONE)
- {
- if (AspectOfArlokk_Timer <= diff)
- {
- DoCast(me, SPELL_ASPECT_OF_ARLOKK);
- DoResetThreat();
-
- AspectOfArlokk_Timer = urand(10000, 15000);
- } else AspectOfArlokk_Timer -= diff;
- }
+ case EVENT_BLOOD_SIPHON:
+ DoCastVictim(SPELL_BLOOD_SIPHON, true);
+ events.ScheduleEvent(EVENT_BLOOD_SIPHON, 90000);
+ break;
+ case EVENT_CORRUPTED_BLOOD:
+ DoCastVictim(SPELL_CORRUPTED_BLOOD, true);
+ events.ScheduleEvent(EVENT_CORRUPTED_BLOOD, urand(30000, 45000));
+ break;
+ case EVENT_CAUSE_INSANITY:
+ // DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_CAUSE_INSANITY);
+ // events.ScheduleEvent(EVENT_CAUSE_INSANITY, urand(35000, 45000));
+ break;
+ case EVENT_WILL_OF_HAKKAR:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_WILL_OF_HAKKAR);
+ events.ScheduleEvent(EVENT_WILL_OF_HAKKAR, urand(25000, 35000));
+ break;
+ case EVENT_ENRAGE:
+ if (!me->HasAura(SPELL_ENRAGE))
+ DoCast(me, SPELL_ENRAGE);
+ events.ScheduleEvent(EVENT_ENRAGE, 90000);
+ break;
+ case EVENT_ASPECT_OF_JEKLIK:
+ DoCastVictim(SPELL_ASPECT_OF_JEKLIK, true);
+ events.ScheduleEvent(EVENT_ASPECT_OF_JEKLIK, urand(10000, 14000));
+ break;
+ case EVENT_ASPECT_OF_VENOXIS:
+ DoCastVictim(SPELL_ASPECT_OF_VENOXIS, true);
+ events.ScheduleEvent(EVENT_ASPECT_OF_VENOXIS, 8000);
+ break;
+ case EVENT_ASPECT_OF_MARLI:
+ DoCastVictim(SPELL_ASPECT_OF_MARLI, true);
+ events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 10000);
+ break;
+ case EVENT_ASPECT_OF_THEKAL:
+ DoCastVictim(SPELL_ASPECT_OF_THEKAL, true);
+ events.ScheduleEvent(EVENT_ASPECT_OF_THEKAL, 15000);
+ break;
+ case EVENT_ASPECT_OF_ARLOKK:
+ DoCastVictim(SPELL_ASPECT_OF_ARLOKK, true);
+ events.ScheduleEvent(EVENT_ASPECT_OF_ARLOKK, urand(10000, 15000));
+ break;
+ default:
+ break;
}
- CheckArlokk_Timer = 1000;
- } else CheckArlokk_Timer -= diff;
+ }
DoMeleeAttackIfReady();
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp
index bbdc2905874..b2282ba85da 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp
@@ -27,75 +27,85 @@ EndScriptData */
#include "ScriptedCreature.h"
#include "zulgurub.h"
-#define SPELL_MANABURN 26046
-#define SPELL_SLEEP 24664
+enum Spells
+{
+ SPELL_MANABURN = 26046,
+ SPELL_SLEEP = 24664
+};
-class boss_hazzarah : public CreatureScript
+enum Events
{
- public:
+ EVENT_MANABURN = 0,
+ EVENT_SLEEP = 1,
+ EVENT_ILLUSIONS = 2
+};
- boss_hazzarah()
- : CreatureScript("boss_hazzarah")
- {
- }
+class boss_hazzarah : public CreatureScript
+{
+ public: boss_hazzarah() : CreatureScript("boss_hazzarah") {}
- struct boss_hazzarahAI : public ScriptedAI
+ struct boss_hazzarahAI : public BossAI
{
- boss_hazzarahAI(Creature* creature) : ScriptedAI(creature) {}
-
- uint32 ManaBurn_Timer;
- uint32 Sleep_Timer;
- uint32 Illusions_Timer;
+ boss_hazzarahAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) {}
void Reset()
{
- ManaBurn_Timer = urand(4000, 10000);
- Sleep_Timer = urand(10000, 18000);
- Illusions_Timer = urand(10000, 18000);
+ _Reset();
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ _JustDied();
}
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_MANABURN, urand(4000, 10000));
+ events.ScheduleEvent(EVENT_SLEEP, urand(10000, 18000));
+ events.ScheduleEvent(EVENT_ILLUSIONS, urand(10000, 18000));
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
- //ManaBurn_Timer
- if (ManaBurn_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_MANABURN);
- ManaBurn_Timer = urand(8000, 16000);
- } else ManaBurn_Timer -= diff;
+ events.Update(diff);
- //Sleep_Timer
- if (Sleep_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_SLEEP);
- Sleep_Timer = urand(12000, 20000);
- } else Sleep_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- //Illusions_Timer
- if (Illusions_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- //We will summon 3 illusions that will spawn on a random gamer and attack this gamer
- //We will just use one model for the beginning
- Unit* target = NULL;
- for (uint8 i = 0; i < 3; ++i)
+ switch (eventId)
{
- target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (!target)
- return;
-
- Creature* Illusion = me->SummonCreature(15163, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000);
- if (Illusion)
- Illusion->AI()->AttackStart(target);
+ case EVENT_MANABURN:
+ DoCastVictim(SPELL_MANABURN, true);
+ events.ScheduleEvent(EVENT_MANABURN, urand(8000, 16000));
+ break;
+ case EVENT_SLEEP:
+ DoCastVictim(SPELL_SLEEP, true);
+ events.ScheduleEvent(EVENT_SLEEP, urand(12000, 20000));
+ break;
+ case EVENT_ILLUSIONS:
+ // We will summon 3 illusions that will spawn on a random gamer and attack this gamer
+ // We will just use one model for the beginning
+ for (uint8 i = 0; i < 3; ++i)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ {
+ Creature* Illusion = me->SummonCreature(NPC_NIGHTMARE_ILLUSION, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000);
+ if (Illusion)
+ Illusion->AI()->AttackStart(target);
+ }
+ }
+ events.ScheduleEvent(EVENT_ILLUSIONS, urand(15000, 25000));
+ break;
+ default:
+ break;
}
-
- Illusions_Timer = urand(15000, 25000);
- } else Illusions_Timer -= diff;
+ }
DoMeleeAttackIfReady();
}
@@ -111,4 +121,3 @@ void AddSC_boss_hazzarah()
{
new boss_hazzarah();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp
index 10431ec84bd..73d2982aee6 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp
@@ -27,42 +27,34 @@ EndScriptData */
#include "ScriptedCreature.h"
#include "zulgurub.h"
-enum Jeklik
+enum Says
{
SAY_AGGRO = 0,
SAY_RAIN_FIRE = 1,
- SAY_DEATH = 2,
+ SAY_DEATH = 2
+};
+enum Spells
+{
SPELL_CHARGE = 22911,
SPELL_SONICBURST = 23918,
SPELL_SCREECH = 6605,
SPELL_SHADOW_WORD_PAIN = 23952,
SPELL_MIND_FLAY = 23953,
- SPELL_CHAIN_MIND_FLAY = 26044, //Right ID unknown. So disabled
+ SPELL_CHAIN_MIND_FLAY = 26044, // Right ID unknown. So disabled
SPELL_GREATERHEAL = 23954,
SPELL_BAT_FORM = 23966,
-
// Batriders Spell
- SPELL_BOMB = 40332 //Wrong ID but Magmadars bomb is not working...
+ SPELL_BOMB = 40332 // Wrong ID but Magmadars bomb is not working...
};
-class boss_jeklik : public CreatureScript
+class boss_jeklik : public CreatureScript //jeklik
{
- public:
-
- boss_jeklik()
- : CreatureScript("boss_jeklik")
- {
- }
+ public: boss_jeklik() : CreatureScript("boss_jeklik") {}
- struct boss_jeklikAI : public ScriptedAI
+ struct boss_jeklikAI : public BossAI
{
- boss_jeklikAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
+ boss_jeklikAI(Creature* creature) : BossAI(creature, DATA_JEKLIK) {}
uint32 Charge_Timer;
uint32 SonicBurst_Timer;
@@ -78,6 +70,7 @@ class boss_jeklik : public CreatureScript
void Reset()
{
+ _Reset();
Charge_Timer = 20000;
SonicBurst_Timer = 8000;
Screech_Timer = 13000;
@@ -91,21 +84,20 @@ class boss_jeklik : public CreatureScript
PhaseTwo = false;
}
- void EnterCombat(Unit* /*who*/)
- {
- Talk(SAY_AGGRO);
- DoCast(me, SPELL_BAT_FORM);
- }
-
void JustDied(Unit* /*killer*/)
{
+ _JustDied();
Talk(SAY_DEATH);
+ }
- if (instance)
- instance->SetData(DATA_JEKLIK, DONE);
+ void EnterCombat(Unit* /*who*/)
+ {
+ _EnterCombat();
+ Talk(SAY_AGGRO);
+ DoCast(me, SPELL_BAT_FORM);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -166,7 +158,7 @@ class boss_jeklik : public CreatureScript
{
if (PhaseTwo)
{
- if (PhaseTwo && ShadowWordPain_Timer <= diff)
+ if (ShadowWordPain_Timer <= diff)
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
{
@@ -197,13 +189,11 @@ class boss_jeklik : public CreatureScript
if (SpawnFlyingBats_Timer <= diff)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (!target)
- return;
-
- Creature* FlyingBat = me->SummonCreature(14965, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()+15, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (FlyingBat)
- FlyingBat->AI()->AttackStart(target);
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ {
+ if (Creature* FlyingBat = me->SummonCreature(14965, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()+15, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000))
+ FlyingBat->AI()->AttackStart(target);
+ }
SpawnFlyingBats_Timer = urand(10000, 15000);
} else SpawnFlyingBats_Timer -=diff;
@@ -259,7 +249,7 @@ class mob_batrider : public CreatureScript
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI (const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -279,7 +269,7 @@ class mob_batrider : public CreatureScript
{
if (instance)
{
- if (instance->GetData(DATA_JEKLIK) == DONE)
+ if (instance->GetBossState(DATA_JEKLIK) == DONE)
{
me->setDeathState(JUST_DIED);
me->RemoveCorpse();
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp
index 7c4c9626f9a..166acc13f58 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp
@@ -27,147 +27,150 @@ EndScriptData */
#include "ScriptedCreature.h"
#include "zulgurub.h"
-enum Jindo
+enum Say
{
- SAY_AGGRO = 1,
+ SAY_AGGRO = 1
+};
+enum Spells
+{
SPELL_BRAINWASHTOTEM = 24262,
- SPELL_POWERFULLHEALINGWARD = 24309, //We will not use this spell. We will summon a totem by script cause the spell totems will not cast.
+ SPELL_POWERFULLHEALINGWARD = 24309, // HACKED Totem summoned by script because the spell totems will not cast.
SPELL_HEX = 24053,
SPELL_DELUSIONSOFJINDO = 24306,
- SPELL_SHADEOFJINDO = 24308, //We will not use this spell. We will summon a shade by script.
-
+ SPELL_SHADEOFJINDO = 24308, // HACKED
//Healing Ward Spell
- SPELL_HEAL = 38588, //Totems are not working right. Right heal spell ID is 24311 but this spell is not casting...
-
+ SPELL_HEAL = 38588, // HACKED Totems are not working right. Right heal spell ID is 24311 but this spell is not casting...
//Shade of Jindo Spell
SPELL_SHADOWSHOCK = 19460,
SPELL_INVISIBLE = 24699
};
-class boss_jindo : public CreatureScript
+enum Events
{
- public:
+ EVENT_BRAINWASHTOTEM = 0,
+ EVENT_POWERFULLHEALINGWARD = 1,
+ EVENT_HEX = 2,
+ EVENT_DELUSIONSOFJINDO = 3,
+ EVENT_TELEPORT = 4
+};
- boss_jindo()
- : CreatureScript("boss_jindo")
- {
- }
+Position const TeleportLoc = {-11583.7783f, -1249.4278f, 77.5471f, 4.745f};
- struct boss_jindoAI : public ScriptedAI
- {
- boss_jindoAI(Creature* creature) : ScriptedAI(creature) {}
+class boss_jindo : public CreatureScript
+{
+ public: boss_jindo() : CreatureScript("boss_jindo") {}
- uint32 BrainWashTotem_Timer;
- uint32 HealingWard_Timer;
- uint32 Hex_Timer;
- uint32 Delusions_Timer;
- uint32 Teleport_Timer;
+ struct boss_jindoAI : public BossAI
+ {
+ boss_jindoAI(Creature* creature) : BossAI(creature, DATA_JINDO) {}
void Reset()
{
- BrainWashTotem_Timer = 20000;
- HealingWard_Timer = 16000;
- Hex_Timer = 8000;
- Delusions_Timer = 10000;
- Teleport_Timer = 5000;
+ _Reset();
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ _JustDied();
}
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_BRAINWASHTOTEM, 20000);
+ events.ScheduleEvent(EVENT_POWERFULLHEALINGWARD, 16000);
+ events.ScheduleEvent(EVENT_HEX, 8000);
+ events.ScheduleEvent(EVENT_DELUSIONSOFJINDO, 10000);
+ events.ScheduleEvent(EVENT_TELEPORT, 5000);
Talk(SAY_AGGRO);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
- //BrainWashTotem_Timer
- if (BrainWashTotem_Timer <= diff)
- {
- DoCast(me, SPELL_BRAINWASHTOTEM);
- BrainWashTotem_Timer = urand(18000, 26000);
- } else BrainWashTotem_Timer -= diff;
-
- //HealingWard_Timer
- if (HealingWard_Timer <= diff)
- {
- //DoCast(me, SPELL_POWERFULLHEALINGWARD);
- me->SummonCreature(14987, me->GetPositionX()+3, me->GetPositionY()-2, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30000);
- HealingWard_Timer = urand(14000, 20000);
- } else HealingWard_Timer -= diff;
-
- //Hex_Timer
- if (Hex_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_HEX);
-
- if (DoGetThreat(me->getVictim()))
- DoModifyThreatPercent(me->getVictim(), -80);
+ events.Update(diff);
- Hex_Timer = urand(12000, 20000);
- } else Hex_Timer -= diff;
-
- //Casting the delusion curse with a shade. So shade will attack the same target with the curse.
- if (Delusions_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- DoCast(target, SPELL_DELUSIONSOFJINDO);
-
- Creature* Shade = me->SummonCreature(14986, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Shade)
- Shade->AI()->AttackStart(target);
- }
-
- Delusions_Timer = urand(4000, 12000);
- } else Delusions_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- //Teleporting a random gamer and spawning 9 skeletons that will attack this gamer
- if (Teleport_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- Unit* target = NULL;
- target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target && target->GetTypeId() == TYPEID_PLAYER)
+ switch (eventId)
{
- DoTeleportPlayer(target, -11583.7783f, -1249.4278f, 77.5471f, 4.745f);
-
- if (DoGetThreat(me->getVictim()))
- DoModifyThreatPercent(target, -100);
-
- Creature* Skeletons;
- Skeletons = me->SummonCreature(14826, target->GetPositionX()+2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Skeletons)
- Skeletons->AI()->AttackStart(target);
- Skeletons = me->SummonCreature(14826, target->GetPositionX()-2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Skeletons)
- Skeletons->AI()->AttackStart(target);
- Skeletons = me->SummonCreature(14826, target->GetPositionX()+4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Skeletons)
- Skeletons->AI()->AttackStart(target);
- Skeletons = me->SummonCreature(14826, target->GetPositionX()-4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Skeletons)
- Skeletons->AI()->AttackStart(target);
- Skeletons = me->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()+2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Skeletons)
- Skeletons->AI()->AttackStart(target);
- Skeletons = me->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()-2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Skeletons)
- Skeletons->AI()->AttackStart(target);
- Skeletons = me->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()+4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Skeletons)
- Skeletons->AI()->AttackStart(target);
- Skeletons = me->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()-4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Skeletons)
- Skeletons->AI()->AttackStart(target);
- Skeletons = me->SummonCreature(14826, target->GetPositionX()+3, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Skeletons)
- Skeletons->AI()->AttackStart(target);
+ case EVENT_BRAINWASHTOTEM:
+ DoCast(me, SPELL_BRAINWASHTOTEM);
+ events.ScheduleEvent(EVENT_BRAINWASHTOTEM, urand(18000, 26000));
+ break;
+ case EVENT_POWERFULLHEALINGWARD: // HACK
+ //DoCast(me, SPELL_POWERFULLHEALINGWARD);
+ me->SummonCreature(14987, me->GetPositionX()+3, me->GetPositionY()-2, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30000);
+ events.ScheduleEvent(EVENT_POWERFULLHEALINGWARD, urand(14000, 20000));
+ break;
+ case EVENT_HEX:
+ if (Unit* target = me->getVictim())
+ {
+ DoCast(target, SPELL_HEX, true);
+ if (DoGetThreat(target))
+ DoModifyThreatPercent(target, -80);
+ }
+ events.ScheduleEvent(EVENT_HEX, urand(12000, 20000));
+ break;
+ case EVENT_DELUSIONSOFJINDO: // HACK
+ // Casting the delusion curse with a shade so shade will attack the same target with the curse.
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ {
+ DoCast(target, SPELL_DELUSIONSOFJINDO);
+ Creature* Shade = me->SummonCreature(NPC_SHADE_OF_JINDO, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ if (Shade)
+ Shade->AI()->AttackStart(target);
+ }
+ events.ScheduleEvent(EVENT_DELUSIONSOFJINDO, urand(4000, 12000));
+ break;
+ case EVENT_TELEPORT: // Possible HACK
+ // Teleports a random player and spawns 9 Sacrificed Trolls to attack player
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ {
+ DoTeleportPlayer(target, TeleportLoc.m_positionX, TeleportLoc.m_positionY, TeleportLoc.m_positionZ, TeleportLoc.m_orientation);
+ if (DoGetThreat(me->getVictim()))
+ DoModifyThreatPercent(target, -100);
+ Creature* SacrificedTroll;
+ SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX()+2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ if (SacrificedTroll)
+ SacrificedTroll->AI()->AttackStart(target);
+ SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX()-2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ if (SacrificedTroll)
+ SacrificedTroll->AI()->AttackStart(target);
+ SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX()+4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ if (SacrificedTroll)
+ SacrificedTroll->AI()->AttackStart(target);
+ SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX()-4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ if (SacrificedTroll)
+ SacrificedTroll->AI()->AttackStart(target);
+ SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX(), target->GetPositionY()+2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ if (SacrificedTroll)
+ SacrificedTroll->AI()->AttackStart(target);
+ SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX(), target->GetPositionY()-2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ if (SacrificedTroll)
+ SacrificedTroll->AI()->AttackStart(target);
+ SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX(), target->GetPositionY()+4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ if (SacrificedTroll)
+ SacrificedTroll->AI()->AttackStart(target);
+ SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX(), target->GetPositionY()-4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ if (SacrificedTroll)
+ SacrificedTroll->AI()->AttackStart(target);
+ SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, target->GetPositionX()+3, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ if (SacrificedTroll)
+ SacrificedTroll->AI()->AttackStart(target);
+ }
+ events.ScheduleEvent(EVENT_TELEPORT, urand(15000, 23000));
+ break;
+ default:
+ break;
}
-
- Teleport_Timer = urand(15000, 23000);
- } else Teleport_Timer -= diff;
+ }
DoMeleeAttackIfReady();
}
@@ -209,7 +212,7 @@ class mob_healing_ward : public CreatureScript
{
}
- void UpdateAI (const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Heal_Timer
if (Heal_Timer <= diff)
@@ -257,7 +260,7 @@ class mob_shade_of_jindo : public CreatureScript
void EnterCombat(Unit* /*who*/){}
- void UpdateAI (const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//ShadowShock_Timer
@@ -283,4 +286,3 @@ void AddSC_boss_jindo()
new mob_healing_ward();
new mob_shade_of_jindo();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
index bcc080bb8a5..bd7b7a8798c 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
@@ -25,336 +25,404 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "Spell.h"
+#include "SpellAuras.h"
+#include "SpellScript.h"
#include "zulgurub.h"
-enum Mandokir
+enum Says
{
- SAY_AGGRO = 0,
- SAY_DING_KILL = 1,
- SAY_WATCH = 2,
- SAY_WATCH_WHISPER = 3, //is this text for real? easter egg?
- SAY_GRATS_JINDO = 0,
-
- SPELL_CHARGE = 24408,
- SPELL_CLEAVE = 7160,
- SPELL_FEAR = 29321,
- SPELL_WHIRLWIND = 15589,
- SPELL_MORTAL_STRIKE = 16856,
- SPELL_ENRAGE = 24318,
- SPELL_WATCH = 24314,
- SPELL_LEVEL_UP = 24312,
-
-//Ohgans Spells
- SPELL_SUNDERARMOR = 24317,
-
- NPC_SPEAKER = 11391
+ SAY_AGGRO = 0,
+ SAY_DING_KILL = 1,
+ SAY_WATCH = 2,
+ SAY_WATCH_WHISPER = 3,
+ SAY_OHGAN_DEAD = 4,
+ SAY_GRATS_JINDO = 0,
};
-class boss_mandokir : public CreatureScript
+enum Spells
{
- public:
+ SPELL_CHARGE = 24408, // seen
+ SPELL_OVERPOWER = 24407, // Seen
+ SPELL_FEAR = 29321,
+ SPELL_WHIRLWIND = 13736, // Triggers 15589
+ SPELL_MORTAL_STRIKE = 16856, // Seen
+ SPELL_FRENZY = 24318, // seen
+ SPELL_WATCH = 24314, // seen 24315, 24316
+ SPELL_WATCH_CHARGE = 24315, // Triggers 24316
+ SPELL_LEVEL_UP = 24312 //
+};
- boss_mandokir()
- : CreatureScript("boss_mandokir")
- {
- }
+enum Events
+{
+ EVENT_CHECK_SPEAKER = 1,
+ EVENT_CHECK_START = 2,
+ EVENT_STARTED = 3,
+ EVENT_OVERPOWER = 4,
+ EVENT_MORTAL_STRIKE = 5,
+ EVENT_WHIRLWIND = 6,
+ EVENT_CHECK_OHGAN = 7,
+ EVENT_WATCH_PLAYER = 8,
+ EVENT_CHARGE_PLAYER = 9
+};
- struct boss_mandokirAI : public ScriptedAI
- {
- boss_mandokirAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
+enum Misc
+{
+ MODEL_OHGAN_MOUNT = 15271,
+ PATH_MANDOKIR = 492861,
+ POINT_MANDOKIR_END = 24,
+ CHAINED_SPIRT_COUNT = 20
+};
- uint32 KillCount;
- uint32 Watch_Timer;
- uint32 TargetInRange;
- uint32 Cleave_Timer;
- uint32 Whirlwind_Timer;
- uint32 Fear_Timer;
- uint32 MortalStrike_Timer;
- uint32 Check_Timer;
- float targetX;
- float targetY;
- float targetZ;
+Position const PosSummonChainedSpirits[CHAINED_SPIRT_COUNT] =
+{
+ { -12167.17f, -1979.330f, 133.0992f, 2.268928f },
+ { -12262.74f, -1953.394f, 133.5496f, 0.593412f },
+ { -12176.89f, -1983.068f, 133.7841f, 2.129302f },
+ { -12226.45f, -1977.933f, 132.7982f, 1.466077f },
+ { -12204.74f, -1890.431f, 135.7569f, 4.415683f },
+ { -12216.70f, -1891.806f, 136.3496f, 4.677482f },
+ { -12236.19f, -1892.034f, 134.1041f, 5.044002f },
+ { -12248.24f, -1893.424f, 134.1182f, 5.270895f },
+ { -12257.36f, -1897.663f, 133.1484f, 5.462881f },
+ { -12265.84f, -1903.077f, 133.1649f, 5.654867f },
+ { -12158.69f, -1972.707f, 133.8751f, 2.408554f },
+ { -12178.82f, -1891.974f, 134.1786f, 3.944444f },
+ { -12193.36f, -1890.039f, 135.1441f, 4.188790f },
+ { -12275.59f, -1932.845f, 134.9017f, 0.174533f },
+ { -12273.51f, -1941.539f, 136.1262f, 0.314159f },
+ { -12247.02f, -1963.497f, 133.9476f, 0.872665f },
+ { -12238.68f, -1969.574f, 133.6273f, 1.134464f },
+ { -12192.78f, -1982.116f, 132.6966f, 1.919862f },
+ { -12210.81f, -1979.316f, 133.8700f, 1.797689f },
+ { -12283.51f, -1924.839f, 133.5170f, 0.069813f }
+};
- InstanceScript* instance;
+Position const PosMandokir[2] =
+{
+ { -12167.8f, -1927.25f, 153.73f, 3.76991f },
+ { -12197.86f, -1949.392f, 130.2745f, 0.0f }
+};
- bool endWatch;
- bool someWatched;
- bool RaptorDead;
- bool CombatStart;
- bool SpeakerDead;
+class boss_mandokir : public CreatureScript
+{
+ public: boss_mandokir() : CreatureScript("boss_mandokir") {}
- uint64 WatchTarget;
+ struct boss_mandokirAI : public BossAI
+ {
+ boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR) { }
void Reset()
{
- KillCount = 0;
- Watch_Timer = 33000;
- Cleave_Timer = 7000;
- Whirlwind_Timer = 20000;
- Fear_Timer = 1000;
- MortalStrike_Timer = 1000;
- Check_Timer = 1000;
-
- targetX = 0.0f;
- targetY = 0.0f;
- targetZ = 0.0f;
- TargetInRange = 0;
-
- WatchTarget = 0;
-
- someWatched = false;
- endWatch = false;
- RaptorDead = false;
- CombatStart = false;
- SpeakerDead = false;
-
- DoCast(me, 23243);
+ if (me->GetPositionZ() > 140.0f)
+ {
+ _Reset();
+ killCount = 0;
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
+ events.ScheduleEvent(EVENT_CHECK_START, 1000);
+ if (Creature* speaker = Creature::GetCreature(*me, instance->GetData64(NPC_VILEBRANCH_SPEAKER)))
+ if (!speaker->isAlive())
+ speaker->Respawn(true);
+ }
+ summons.DespawnAll();
+ me->Mount(MODEL_OHGAN_MOUNT);
}
- void KilledUnit(Unit* victim)
+ void JustDied(Unit* /*killer*/)
{
- if (victim->GetTypeId() == TYPEID_PLAYER)
- {
- ++KillCount;
-
- if (KillCount == 3)
- {
- Talk(SAY_DING_KILL);
-
- if (instance)
- {
- uint64 JindoGUID = instance->GetData64(DATA_JINDO);
- if (JindoGUID)
- {
- if (Creature* jTemp = Creature::GetCreature(*me, JindoGUID))
- {
- if (jTemp->isAlive())
- jTemp->AI()->Talk(SAY_GRATS_JINDO);
- }
- }
- }
- DoCast(me, SPELL_LEVEL_UP, true);
- KillCount = 0;
- }
- }
+ // Do not want to unsummon Ohgan
+ for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i)
+ if (Creature* unsummon = Creature::GetCreature(*me, chainedSpirtGUIDs[i]))
+ unsummon->DespawnOrUnsummon();
+ instance->SetBossState(DATA_MANDOKIR, DONE);
+ instance->SaveToDB();
}
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_OVERPOWER, urand(7000, 9000));
+ events.ScheduleEvent(EVENT_MORTAL_STRIKE, urand(12000, 18000));
+ events.ScheduleEvent(EVENT_WHIRLWIND, urand(24000, 30000));
+ events.ScheduleEvent(EVENT_CHECK_OHGAN, 1000);
+ events.ScheduleEvent(EVENT_WATCH_PLAYER, urand(13000, 15000));
+ events.ScheduleEvent(EVENT_CHARGE_PLAYER, urand(33000, 38000));
+ me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
Talk(SAY_AGGRO);
+ me->Dismount();
+ // Summon Ohgan (Spell missing) TEMP HACK
+ me->SummonCreature(NPC_OHGAN, me->GetPositionX()-3, me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 35000);
+ // Summon Chained Spirits
+ for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i)
+ {
+ Creature* chainedSpirt = me->SummonCreature(NPC_CHAINED_SPIRT, PosSummonChainedSpirits[i], TEMPSUMMON_CORPSE_DESPAWN);
+ chainedSpirtGUIDs[i] = chainedSpirt->GetGUID();
+ }
+ DoZoneInCombat();
}
- void UpdateAI(const uint32 diff)
+ void KilledUnit(Unit* victim)
{
- if (!SpeakerDead)
+ if (victim->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ if (++killCount == 3)
{
- if (!me->FindNearestCreature(NPC_SPEAKER, 100.0f, true))
+ Talk(SAY_DING_KILL);
+ if (Creature* jindo = Creature::GetCreature(*me, instance->GetData64(DATA_JINDO)))
+ if (jindo->isAlive())
+ jindo->AI()->Talk(SAY_GRATS_JINDO);
+ DoCast(me, SPELL_LEVEL_UP, true);
+ killCount = 0;
+ }
+ }
+
+ void MovementInform(uint32 type, uint32 id)
+ {
+ if (type == WAYPOINT_MOTION_TYPE)
+ {
+ me->SetWalk(false);
+ if (id == POINT_MANDOKIR_END)
{
- me->GetMotionMaster()->MovePoint(0, -12196.3f, -1948.37f, 130.36f);
- SpeakerDead = true;
+ me->SetHomePosition(PosMandokir[0]);
+ instance->SetBossState(DATA_MANDOKIR, NOT_STARTED);
+ me->DespawnOrUnsummon(6000); // No idea how to respawn on wipe.
}
}
+ }
- if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE && SpeakerDead)
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ void UpdateAI(uint32 diff)
+ {
+ events.Update(diff);
if (!UpdateVictim())
- return;
-
- if (me->getVictim() && me->isAlive())
{
- if (!CombatStart)
+ if (instance->GetBossState(DATA_MANDOKIR) == NOT_STARTED || instance->GetBossState(DATA_MANDOKIR) == SPECIAL)
{
- //At combat Start Mandokir is mounted so we must unmount it first
- me->Dismount();
-
- //And summon his raptor
- me->SummonCreature(14988, me->getVictim()->GetPositionX(), me->getVictim()->GetPositionY(), me->getVictim()->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 35000);
- CombatStart = true;
- }
-
- if (Watch_Timer <= diff) //Every 20 Sec Mandokir will check this
- {
- if (WatchTarget) //If someone is watched and If the Position of the watched target is different from the one stored, or are attacking, mandokir will charge him
+ while (uint32 eventId = events.ExecuteEvent())
{
- Unit* unit = Unit::GetUnit(*me, WatchTarget);
-
- if (unit && (
- targetX != unit->GetPositionX() ||
- targetY != unit->GetPositionY() ||
- targetZ != unit->GetPositionZ() ||
- unit->isInCombat()))
+ switch (eventId)
{
- if (me->IsWithinMeleeRange(unit))
- {
- DoCast(unit, 24316);
- }
- else
- {
- DoCast(unit, SPELL_CHARGE);
- //me->SendMonsterMove(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), 0, true, 1);
- AttackStart(unit);
- }
+ case EVENT_CHECK_START:
+ if (instance->GetBossState(DATA_MANDOKIR) == SPECIAL)
+ {
+ me->GetMotionMaster()->MovePoint(0, PosMandokir[1].m_positionX, PosMandokir[1].m_positionY, PosMandokir[1].m_positionZ);
+ events.ScheduleEvent(EVENT_STARTED, 6000);
+ }
+ else
+ events.ScheduleEvent(EVENT_CHECK_START, 1000);
+ break;
+ case EVENT_STARTED:
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
+ me->GetMotionMaster()->MovePath(PATH_MANDOKIR, false);
+ break;
+ default:
+ break;
}
}
- someWatched = false;
- Watch_Timer = 20000;
- } else Watch_Timer -= diff;
-
- if ((Watch_Timer < 8000) && !someWatched) //8 sec(cast time + expire time) before the check for the watch effect mandokir will cast watch debuff on a random target
- {
- if (Unit* p = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- Talk(SAY_WATCH, p->GetGUID());
- DoCast(p, SPELL_WATCH);
- WatchTarget = p->GetGUID();
- someWatched = true;
- endWatch = true;
- }
}
+ return;
+ }
- if ((Watch_Timer < 1000) && endWatch) //1 sec before the debuf expire, store the target position
- {
- Unit* unit = Unit::GetUnit(*me, WatchTarget);
- if (unit)
- {
- targetX = unit->GetPositionX();
- targetY = unit->GetPositionY();
- targetZ = unit->GetPositionZ();
- }
- endWatch = false;
- }
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- if (!someWatched)
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- //Cleave
- if (Cleave_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_CLEAVE);
- Cleave_Timer = 7000;
- } else Cleave_Timer -= diff;
-
- //Whirlwind
- if (Whirlwind_Timer <= diff)
- {
+ case EVENT_OVERPOWER:
+ DoCastVictim(SPELL_OVERPOWER, true);
+ events.ScheduleEvent(EVENT_OVERPOWER, urand(6000, 12000));
+ break;
+ case EVENT_MORTAL_STRIKE:
+ if (me->getVictim() && me->getVictim()->HealthBelowPct(50))
+ DoCastVictim(SPELL_MORTAL_STRIKE, true);
+ events.ScheduleEvent(EVENT_MORTAL_STRIKE, urand(12000, 18000));
+ break;
+ case EVENT_WHIRLWIND:
DoCast(me, SPELL_WHIRLWIND);
- Whirlwind_Timer = 18000;
- } else Whirlwind_Timer -= diff;
-
- //If more then 3 targets in melee range mandokir will cast fear
- if (Fear_Timer <= diff)
- {
- TargetInRange = 0;
-
- std::list<HostileReference*>::const_iterator i = me->getThreatManager().getThreatList().begin();
- for (; i != me->getThreatManager().getThreatList().end(); ++i)
+ events.ScheduleEvent(EVENT_WHIRLWIND, urand(22000, 26000));
+ break;
+ case EVENT_CHECK_OHGAN:
+ if (instance->GetBossState(DATA_OHGAN) == DONE)
{
- Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid());
- if (unit && me->IsWithinMeleeRange(unit))
- ++TargetInRange;
+ DoCast(me, SPELL_FRENZY);
+ Talk(SAY_OHGAN_DEAD);
}
-
- if (TargetInRange > 3)
- DoCast(me->getVictim(), SPELL_FEAR);
-
- Fear_Timer = 4000;
- } else Fear_Timer -=diff;
-
- //Mortal Strike if target below 50% hp
- if (me->getVictim() && me->getVictim()->HealthBelowPct(50))
- {
- if (MortalStrike_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_MORTAL_STRIKE);
- MortalStrike_Timer = 15000;
- } else MortalStrike_Timer -= diff;
- }
- }
- //Checking if Ohgan is dead. If yes Mandokir will enrage.
- if (Check_Timer <= diff)
- {
- if (instance)
- {
- if (instance->GetData(DATA_OHGAN) == DONE)
+ else
+ events.ScheduleEvent(EVENT_CHECK_OHGAN, 1000);
+ break;
+ case EVENT_WATCH_PLAYER:
+ if (Unit* player = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{
- if (!RaptorDead)
- {
- DoCast(me, SPELL_ENRAGE);
- RaptorDead = true;
- }
+ DoCast(player, SPELL_WATCH);
+ Talk(SAY_WATCH, player->GetGUID());
}
- }
-
- Check_Timer = 1000;
- } else Check_Timer -= diff;
-
- DoMeleeAttackIfReady();
+ events.ScheduleEvent(EVENT_WATCH_PLAYER, urand(12000, 15000));
+ break;
+ case EVENT_CHARGE_PLAYER:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true), SPELL_CHARGE);
+ events.ScheduleEvent(EVENT_CHARGE_PLAYER, urand(22000, 30000));
+ break;
+ default:
+ break;
+ }
}
+
+ DoMeleeAttackIfReady();
}
+
+ private:
+ uint8 killCount;
+ uint64 chainedSpirtGUIDs[CHAINED_SPIRT_COUNT];
};
CreatureAI* GetAI(Creature* creature) const
{
- return new boss_mandokirAI(creature);
+ return GetZulGurubAI<boss_mandokirAI>(creature);
}
};
-//Ohgan
-class mob_ohgan : public CreatureScript
+// Ohgan
+
+enum OhganSpells
{
- public:
+ SPELL_SUNDERARMOR = 24317
+};
- mob_ohgan()
- : CreatureScript("mob_ohgan")
- {
- }
+class mob_ohgan : public CreatureScript
+{
+ public: mob_ohgan() : CreatureScript("mob_ohgan") {}
struct mob_ohganAI : public ScriptedAI
{
- mob_ohganAI(Creature* creature) : ScriptedAI(creature)
+ mob_ohganAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
+
+ void Reset()
{
- instance = creature->GetInstanceScript();
+ SunderArmor_Timer = 5000;
+ }
+
+ void EnterCombat(Unit* /*who*/) {}
+
+ void JustDied(Unit* /*killer*/)
+ {
+ instance->SetBossState(DATA_OHGAN, DONE);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ // Return since we have no target
+ if (!UpdateVictim())
+ return;
+
+ if (SunderArmor_Timer <= diff)
+ {
+ DoCastVictim(SPELL_SUNDERARMOR, true);
+ SunderArmor_Timer = urand(10000, 15000);
+ } else SunderArmor_Timer -= diff;
+
+ DoMeleeAttackIfReady();
}
+ private:
uint32 SunderArmor_Timer;
InstanceScript* instance;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return GetZulGurubAI<mob_ohganAI>(creature);
+ }
+};
+
+enum VilebranchSpells
+{
+ SPELL_DEMORALIZING_SHOUT = 13730,
+ SPELL_CLEAVE = 15284
+};
+
+class mob_vilebranch_speaker : public CreatureScript
+{
+ public: mob_vilebranch_speaker() : CreatureScript("mob_vilebranch_speaker") {}
+
+ struct mob_vilebranch_speakerAI : public ScriptedAI
+ {
+ mob_vilebranch_speakerAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
void Reset()
{
- SunderArmor_Timer = 5000;
+ demoralizing_Shout_Timer = urand (2000, 4000);
+ cleave_Timer = urand (5000, 8000);
}
void EnterCombat(Unit* /*who*/) {}
void JustDied(Unit* /*killer*/)
{
- if (instance)
- instance->SetData(DATA_OHGAN, DONE);
+ instance->SetBossState(DATA_MANDOKIR, SPECIAL);
}
- void UpdateAI (const uint32 diff)
+ void UpdateAI(uint32 diff)
{
- //Return since we have no target
+ // Return since we have no target
if (!UpdateVictim())
return;
- //SunderArmor_Timer
- if (SunderArmor_Timer <= diff)
+ if (demoralizing_Shout_Timer <= diff)
{
- DoCast(me->getVictim(), SPELL_SUNDERARMOR);
- SunderArmor_Timer = urand(10000, 15000);
- } else SunderArmor_Timer -= diff;
+ DoCast(me, SPELL_DEMORALIZING_SHOUT);
+ demoralizing_Shout_Timer = urand(22000, 30000);
+ } else demoralizing_Shout_Timer -= diff;
+
+ if (cleave_Timer <= diff)
+ {
+ DoCastVictim(SPELL_CLEAVE, true);
+ cleave_Timer = urand(6000, 9000);
+ } else cleave_Timer -= diff;
DoMeleeAttackIfReady();
}
+
+ private:
+ uint32 demoralizing_Shout_Timer;
+ uint32 cleave_Timer;
+ InstanceScript* instance;
};
CreatureAI* GetAI(Creature* creature) const
{
- return new mob_ohganAI(creature);
+ return new mob_vilebranch_speakerAI(creature);
+ }
+};
+
+class spell_threatening_gaze : public SpellScriptLoader
+{
+ public:
+ spell_threatening_gaze() : SpellScriptLoader("spell_threatening_gaze") { }
+
+ class spell_threatening_gaze_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_threatening_gaze_AuraScript);
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Unit* caster = GetCaster())
+ if(Unit* target = GetTarget())
+ if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH)
+ caster->CastSpell(target, SPELL_WATCH_CHARGE);
+ }
+
+ void Register()
+ {
+ OnEffectRemove += AuraEffectRemoveFn(spell_threatening_gaze_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_threatening_gaze_AuraScript();
}
};
@@ -362,5 +430,6 @@ void AddSC_boss_mandokir()
{
new boss_mandokir();
new mob_ohgan();
+ new mob_vilebranch_speaker();
+ new spell_threatening_gaze();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
index 56aeee93ee2..b1200c2899e 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
@@ -27,192 +27,189 @@ EndScriptData */
#include "ScriptedCreature.h"
#include "zulgurub.h"
-enum Marli
+enum Says
{
SAY_AGGRO = 0,
SAY_TRANSFORM = 1,
SAY_SPIDER_SPAWN = 2,
- SAY_DEATH = 3,
+ SAY_DEATH = 3
+};
+
+enum Spells
+{
+ SPELL_CHARGE = 22911,
+ SPELL_ASPECT_OF_MARLI = 24686, // A stun spell
+ SPELL_ENVOLWINGWEB = 24110,
+ SPELL_POISON_VOLLEY = 24099,
+ SPELL_SPIDER_FORM = 24084,
+ // The Spider Spell
+ SPELL_LEVELUP = 24312 // Not right Spell.
+};
- SPELL_CHARGE = 22911,
- SPELL_ASPECT_OF_MARLI = 24686, // A stun spell
- SPELL_ENVOLWINGWEB = 24110,
- SPELL_POISONVOLLEY = 24099,
- SPELL_SPIDER_FORM = 24084,
+enum Events
+{
+ EVENT_SPAWN_START_SPIDERS = 0, // Phase 1
+ EVENT_POISON_VOLLEY = 1, // Phase All
+ EVENT_SPAWN_SPIDER = 2, // Phase All
+ EVENT_CHARGE_PLAYER = 3, // Phase 3
+ EVENT_ASPECT_OF_MARLI = 4, // Phase 2
+ EVENT_TRANSFORM = 5, // Phase 2
+ EVENT_TRANSFORM_BACK = 6 // Phase 3
+};
-//The Spider Spells
- SPELL_LEVELUP = 24312 //Not right Spell.
+enum Phases
+{
+ PHASE_ONE = 1,
+ PHASE_TWO = 2,
+ PHASE_THREE = 3
+};
+
+enum ModelId
+{
+ MODEL_MARLI = 15220
};
class boss_marli : public CreatureScript
{
- public:
+ public: boss_marli() : CreatureScript("boss_marli") {}
- boss_marli()
- : CreatureScript("boss_marli")
+ struct boss_marliAI : public BossAI
{
- }
+ boss_marliAI(Creature* creature) : BossAI(creature, DATA_MARLI) {}
- struct boss_marliAI : public ScriptedAI
- {
- boss_marliAI(Creature* creature) : ScriptedAI(creature)
+ void Reset()
{
- instance = creature->GetInstanceScript();
+ _Reset();
}
- InstanceScript* instance;
-
- uint32 SpawnStartSpiders_Timer;
- uint32 PoisonVolley_Timer;
- uint32 SpawnSpider_Timer;
- uint32 Charge_Timer;
- uint32 Aspect_Timer;
- uint32 Transform_Timer;
- uint32 TransformBack_Timer;
-
- bool Spawned;
- bool PhaseTwo;
-
- void Reset()
+ void JustDied(Unit* /*killer*/)
{
- SpawnStartSpiders_Timer = 1000;
- PoisonVolley_Timer = 15000;
- SpawnSpider_Timer = 30000;
- Charge_Timer = 1500;
- Aspect_Timer = 12000;
- Transform_Timer = 45000;
- TransformBack_Timer = 25000;
-
- Spawned = false;
- PhaseTwo = false;
+ _JustDied();
+ Talk(SAY_DEATH);
}
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_SPAWN_START_SPIDERS, 1000, 0, PHASE_ONE);
Talk(SAY_AGGRO);
}
- void JustDied(Unit* /*killer*/)
- {
- Talk(SAY_DEATH);
- if (instance)
- instance->SetData(DATA_MARLI, DONE);
- }
-
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
- if (me->getVictim() && me->isAlive())
- {
- if (PoisonVolley_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_POISONVOLLEY);
- PoisonVolley_Timer = urand(10000, 20000);
- } else PoisonVolley_Timer -= diff;
+ events.Update(diff);
- if (!PhaseTwo && Aspect_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_ASPECT_OF_MARLI);
- Aspect_Timer = urand(13000, 18000);
- } else Aspect_Timer -= diff;
-
- if (!Spawned && SpawnStartSpiders_Timer <= diff)
- {
- Talk(SAY_SPIDER_SPAWN);
-
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (!target)
- return;
-
- Creature* Spider = NULL;
-
- Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Spider)
- Spider->AI()->AttackStart(target);
- Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Spider)
- Spider->AI()->AttackStart(target);
- Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Spider)
- Spider->AI()->AttackStart(target);
- Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Spider)
- Spider->AI()->AttackStart(target);
-
- Spawned = true;
- } else SpawnStartSpiders_Timer -= diff;
-
- if (SpawnSpider_Timer <= diff)
- {
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (!target)
- return;
-
- Creature* Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- if (Spider)
- Spider->AI()->AttackStart(target);
- SpawnSpider_Timer = urand(12000, 17000);
- } else SpawnSpider_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- if (!PhaseTwo && Transform_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- Talk(SAY_TRANSFORM);
- DoCast(me, SPELL_SPIDER_FORM);
- const CreatureTemplate* cinfo = me->GetCreatureTemplate();
- me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35)));
- me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
- me->UpdateDamagePhysical(BASE_ATTACK);
- DoCast(me->getVictim(), SPELL_ENVOLWINGWEB);
-
- if (DoGetThreat(me->getVictim()))
- DoModifyThreatPercent(me->getVictim(), -100);
+ case EVENT_SPAWN_START_SPIDERS:
- PhaseTwo = true;
- Transform_Timer = urand(35000, 60000);
- } else Transform_Timer -= diff;
-
- if (PhaseTwo)
- {
- if (Charge_Timer <= diff)
- {
- Unit* target = NULL;
- int i = 0;
- while (i < 3) // max 3 tries to get a random target with power_mana
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
{
- ++i;
- target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true); // not aggro leader
- if (target && target->getPowerType() == POWER_MANA)
+ Talk(SAY_SPIDER_SPAWN);
+ Creature* Spider = NULL;
+ Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ if (Spider)
+ Spider->AI()->AttackStart(target);
+ Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ if (Spider)
+ Spider->AI()->AttackStart(target);
+ Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ if (Spider)
+ Spider->AI()->AttackStart(target);
+ Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ if (Spider)
+ Spider->AI()->AttackStart(target);
+ }
+ events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12000, 0, PHASE_TWO);
+ events.ScheduleEvent(EVENT_TRANSFORM, 45000, 0, PHASE_TWO);
+ events.ScheduleEvent(EVENT_POISON_VOLLEY, 15000);
+ events.ScheduleEvent(EVENT_SPAWN_SPIDER, 30000);
+ events.ScheduleEvent(EVENT_TRANSFORM, 45000, 0, PHASE_TWO);
+ events.SetPhase(PHASE_TWO);
+ break;
+ case EVENT_POISON_VOLLEY:
+ DoCastVictim(SPELL_POISON_VOLLEY, true);
+ events.ScheduleEvent(EVENT_POISON_VOLLEY, urand(10000, 20000));
+ break;
+ case EVENT_ASPECT_OF_MARLI:
+ DoCastVictim(SPELL_ASPECT_OF_MARLI, true);
+ events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, urand(13000, 18000), 0, PHASE_TWO);
+ break;
+ case EVENT_SPAWN_SPIDER:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ {
+ Creature* Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ if (Spider)
+ Spider->AI()->AttackStart(target);
+ }
+ events.ScheduleEvent(EVENT_SPAWN_SPIDER, urand(12000, 17000));
+ break;
+ case EVENT_TRANSFORM:
+ {
+ Talk(SAY_TRANSFORM);
+ DoCast(me, SPELL_SPIDER_FORM);
+ const CreatureTemplate* cinfo = me->GetCreatureTemplate();
+ me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35)));
+ me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
+ me->UpdateDamagePhysical(BASE_ATTACK);
+ DoCast(me->getVictim(), SPELL_ENVOLWINGWEB);
+ if (DoGetThreat(me->getVictim()))
+ DoModifyThreatPercent(me->getVictim(), -100);
+ events.ScheduleEvent(EVENT_CHARGE_PLAYER, 1500, 0, PHASE_THREE);
+ events.ScheduleEvent(EVENT_TRANSFORM_BACK, 25000, 0, PHASE_THREE);
+ events.SetPhase(PHASE_THREE);
+ break;
+ }
+ case EVENT_CHARGE_PLAYER:
+ {
+ Unit* target = NULL;
+ int i = 0;
+ while (i < 3) // max 3 tries to get a random target with power_mana
+ {
+ ++i;
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true); // not aggro leader
+ if (target && target->getPowerType() == POWER_MANA)
i = 3;
+ }
+ if (target)
+ {
+ DoCast(target, SPELL_CHARGE);
+ //me->SetPosition(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0);
+ //me->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, true, 1);
+ AttackStart(target);
+ }
+ events.ScheduleEvent(EVENT_CHARGE_PLAYER, 8000, 0, PHASE_THREE);
+ break;
}
- if (target)
+ case EVENT_TRANSFORM_BACK:
{
- DoCast(target, SPELL_CHARGE);
- //me->SetPosition(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0);
- //me->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, true, 1);
- AttackStart(target);
+ me->SetDisplayId(MODEL_MARLI);
+ const CreatureTemplate* cinfo = me->GetCreatureTemplate();
+ me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 1)));
+ me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 1)));
+ me->UpdateDamagePhysical(BASE_ATTACK);
+ events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12000, 0, PHASE_TWO);
+ events.ScheduleEvent(EVENT_TRANSFORM, 45000, 0, PHASE_TWO);
+ events.ScheduleEvent(EVENT_POISON_VOLLEY, 15000);
+ events.ScheduleEvent(EVENT_SPAWN_SPIDER, 30000);
+ events.ScheduleEvent(EVENT_TRANSFORM, urand(35000, 60000), 0, PHASE_TWO);
+ events.SetPhase(PHASE_TWO);
+ break;
}
-
- Charge_Timer = 8000;
- } else Charge_Timer -= diff;
-
- if (TransformBack_Timer <= diff)
- {
- me->SetDisplayId(15220);
- const CreatureTemplate* cinfo = me->GetCreatureTemplate();
- me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 1)));
- me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 1)));
- me->UpdateDamagePhysical(BASE_ATTACK);
-
- PhaseTwo = false;
- TransformBack_Timer = urand(25000, 40000);
- } else TransformBack_Timer -= diff;
-
+ default:
+ break;
}
-
- DoMeleeAttackIfReady();
}
+
+ DoMeleeAttackIfReady();
}
};
@@ -222,15 +219,10 @@ class boss_marli : public CreatureScript
}
};
-//Spawn of Marli
+// Spawn of Marli
class mob_spawn_of_marli : public CreatureScript
{
- public:
-
- mob_spawn_of_marli()
- : CreatureScript("mob_spawn_of_marli")
- {
- }
+ public: mob_spawn_of_marli() : CreatureScript("mob_spawn_of_marli") {}
struct mob_spawn_of_marliAI : public ScriptedAI
{
@@ -247,7 +239,7 @@ class mob_spawn_of_marli : public CreatureScript
{
}
- void UpdateAI (const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -275,4 +267,3 @@ void AddSC_boss_marli()
new boss_marli();
new mob_spawn_of_marli();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
index d562b7cdf9b..7e8c7dca7b4 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
@@ -40,16 +40,11 @@ enum Misc
class boss_renataki : public CreatureScript
{
- public:
+ public: boss_renataki() : CreatureScript("boss_renataki") {}
- boss_renataki()
- : CreatureScript("boss_renataki")
+ struct boss_renatakiAI : public BossAI
{
- }
-
- struct boss_renatakiAI : public ScriptedAI
- {
- boss_renatakiAI(Creature* creature) : ScriptedAI(creature) {}
+ boss_renatakiAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) {}
uint32 Invisible_Timer;
uint32 Ambush_Timer;
@@ -62,6 +57,7 @@ class boss_renataki : public CreatureScript
void Reset()
{
+ _Reset();
Invisible_Timer = urand(8000, 18000);
Ambush_Timer = 3000;
Visible_Timer = 4000;
@@ -72,11 +68,17 @@ class boss_renataki : public CreatureScript
Ambushed = false;
}
+ void JustDied(Unit* /*killer*/)
+ {
+ _JustDied();
+ }
+
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp
index d91b8f0b483..f115daf0fb0 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp
@@ -27,28 +27,29 @@ EndScriptData */
#include "ScriptedCreature.h"
#include "zulgurub.h"
-enum Thekal
+enum Says
{
SAY_AGGRO = 0,
- SAY_DEATH = 1,
-
- SPELL_MORTALCLEAVE = 22859,
- SPELL_SILENCE = 22666,
- SPELL_FRENZY = 8269,
- SPELL_FORCEPUNCH = 24189,
- SPELL_CHARGE = 24193,
- SPELL_ENRAGE = 8269,
- SPELL_SUMMONTIGERS = 24183,
- SPELL_TIGER_FORM = 24169,
- SPELL_RESURRECT = 24173, //We will not use this spell.
-
-//Zealot Lor'Khan Spells
+ SAY_DEATH = 1
+};
+
+enum Spells
+{
+ SPELL_MORTALCLEAVE = 22859, // Phase 1
+ SPELL_SILENCE = 22666, // Phase 1
+ SPELL_TIGER_FORM = 24169, // Phase 1
+ SPELL_RESURRECT = 24173, // Phase 1 // Not used in script.
+ SPELL_FRENZY = 8269, // Phase 2
+ SPELL_FORCEPUNCH = 24189, // Phase 2
+ SPELL_CHARGE = 24193, // Phase 2
+ SPELL_ENRAGE = 8269, // Phase 2
+ SPELL_SUMMONTIGERS = 24183, // Phase 2
+ // Zealot Lor'Khan Spells
SPELL_SHIELD = 20545,
SPELL_BLOODLUST = 24185,
SPELL_GREATERHEAL = 24208,
SPELL_DISARM = 6713,
-
-//Zealot Zath Spells
+ // Zealot Zath Spells
SPELL_SWEEPINGSTRIKES = 18765,
SPELL_SINISTERSTRIKE = 15581,
SPELL_GOUGE = 12540,
@@ -56,128 +57,182 @@ enum Thekal
SPELL_BLIND = 21060
};
-class boss_thekal : public CreatureScript
+enum Events
{
- public:
+ EVENT_MORTALCLEAVE = 0, // Phase 1
+ EVENT_SILENCE = 1, // Phase 1
+ EVENT_CHECK_TIMER = 2, // Phase 1
+ EVENT_RESURRECT_TIMER = 3, // Phase 1
+ EVENT_FRENZY = 4, // Phase 2
+ EVENT_FORCEPUNCH = 5, // Phase 2
+ EVENT_SPELL_CHARGE = 6, // Phase 2
+ EVENT_ENRAGE = 7, // Phase 2
+ EVENT_SUMMONTIGERS = 8 // Phase 2
+};
- boss_thekal()
- : CreatureScript("boss_thekal")
- {
- }
+enum Phases
+{
+ PHASE_ONE = 1,
+ PHASE_TWO = 2
+};
- struct boss_thekalAI : public ScriptedAI
- {
- boss_thekalAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
+class boss_thekal : public CreatureScript
+{
+ public: boss_thekal() : CreatureScript("boss_thekal") {}
- uint32 MortalCleave_Timer;
- uint32 Silence_Timer;
- uint32 Frenzy_Timer;
- uint32 ForcePunch_Timer;
- uint32 Charge_Timer;
- uint32 Enrage_Timer;
- uint32 SummonTigers_Timer;
- uint32 Check_Timer;
- uint32 Resurrect_Timer;
+ struct boss_thekalAI : public BossAI
+ {
+ boss_thekalAI(Creature* creature) : BossAI(creature, DATA_THEKAL) {}
- InstanceScript* instance;
bool Enraged;
- bool PhaseTwo;
bool WasDead;
void Reset()
{
- MortalCleave_Timer = 4000;
- Silence_Timer = 9000;
- Frenzy_Timer = 30000;
- ForcePunch_Timer = 4000;
- Charge_Timer = 12000;
- Enrage_Timer = 32000;
- SummonTigers_Timer = 25000;
- Check_Timer = 10000;
- Resurrect_Timer = 10000;
-
+ _Reset();
Enraged = false;
- PhaseTwo = false;
WasDead = false;
}
- void EnterCombat(Unit* /*who*/)
+ void JustDied(Unit* /*killer*/)
{
- Talk(SAY_AGGRO);
+ _JustDied();
+ Talk(SAY_DEATH);
}
- void JustDied(Unit* /*killer*/)
+ void EnterCombat(Unit* /*who*/)
{
- Talk(SAY_DEATH);
- if (instance)
- instance->SetData(DATA_THEKAL, DONE);
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_MORTALCLEAVE, 4000, 0, PHASE_ONE); // Phase 1
+ events.ScheduleEvent(EVENT_SILENCE, 9000, 0, PHASE_ONE); // Phase 1
+ events.ScheduleEvent(EVENT_CHECK_TIMER, 10000, 0, PHASE_ONE); // Phase 1
+ events.ScheduleEvent(EVENT_RESURRECT_TIMER, 10000, 0, PHASE_ONE); // Phase 1
+ Talk(SAY_AGGRO);
}
void JustReachedHome()
{
if (instance)
- instance->SetData(DATA_THEKAL, NOT_STARTED);
+ instance->SetBossState(DATA_THEKAL, NOT_STARTED);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
- //Check_Timer for the death of LorKhan and Zath.
- if (!WasDead && Check_Timer <= diff)
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- if (instance)
- {
- if (instance->GetData(DATA_LORKHAN) == SPECIAL)
+ case EVENT_MORTALCLEAVE:
+ DoCastVictim(SPELL_MORTALCLEAVE, true);
+ events.ScheduleEvent(EVENT_MORTALCLEAVE, urand(15000, 20000), 0, PHASE_ONE);
+ break;
+ case EVENT_SILENCE:
+ DoCastVictim(SPELL_SILENCE, true);
+ events.ScheduleEvent(EVENT_SILENCE, urand(20000, 25000), 0, PHASE_ONE);
+ break;
+ case EVENT_RESURRECT_TIMER:
+ //Thekal will transform to Tiger if he died and was not resurrected after 10 seconds.
+ if (WasDead)
{
- //Resurrect LorKhan
- if (Unit* pLorKhan = Unit::GetUnit(*me, instance->GetData64(DATA_LORKHAN)))
- {
- pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
- pLorKhan->setFaction(14);
- pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- pLorKhan->SetFullHealth();
-
- instance->SetData(DATA_LORKHAN, DONE);
- }
+ DoCast(me, SPELL_TIGER_FORM);
+ me->SetObjectScale(2.00f);
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetFullHealth();
+ const CreatureTemplate* cinfo = me->GetCreatureTemplate();
+ me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 40)));
+ me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 40)));
+ me->UpdateDamagePhysical(BASE_ATTACK);
+ DoResetThreat();
+ events.ScheduleEvent(EVENT_FRENZY, 30000, 0, PHASE_TWO); // Phase 2
+ events.ScheduleEvent(EVENT_FORCEPUNCH, 4000, 0, PHASE_TWO); // Phase 2
+ events.ScheduleEvent(EVENT_SPELL_CHARGE, 12000, 0, PHASE_TWO); // Phase 2
+ events.ScheduleEvent(EVENT_ENRAGE, 32000, 0, PHASE_TWO); // Phase 2
+ events.ScheduleEvent(EVENT_SUMMONTIGERS, 25000, 0, PHASE_TWO); // Phase 2
+ events.SetPhase(PHASE_TWO);
}
-
- if (instance->GetData(DATA_ZATH) == SPECIAL)
+ events.ScheduleEvent(EVENT_RESURRECT_TIMER, 10000, 0, PHASE_ONE);
+ break;
+ case EVENT_CHECK_TIMER:
+ //Check_Timer for the death of LorKhan and Zath.
+ if (!WasDead)
{
- //Resurrect Zath
- Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH));
- if (pZath)
+ if (instance)
{
- pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
- pZath->setFaction(14);
- pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- pZath->SetFullHealth();
-
- instance->SetData(DATA_ZATH, DONE);
+ if (instance->GetBossState(DATA_LORKHAN) == SPECIAL)
+ {
+ //Resurrect LorKhan
+ if (Unit* pLorKhan = Unit::GetUnit(*me, instance->GetData64(DATA_LORKHAN)))
+ {
+ pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ pLorKhan->setFaction(14);
+ pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ pLorKhan->SetFullHealth();
+ instance->SetData(DATA_LORKHAN, DONE);
+ }
+ }
+
+ if (instance->GetBossState(DATA_ZATH) == SPECIAL)
+ {
+ //Resurrect Zath
+ if (Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH)))
+ {
+ pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ pZath->setFaction(14);
+ pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ pZath->SetFullHealth();
+ instance->SetBossState(DATA_ZATH, DONE);
+ }
+ }
}
}
- }
-
- Check_Timer = 5000;
- } else Check_Timer -= diff;
-
- if (!PhaseTwo && MortalCleave_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_MORTALCLEAVE);
- MortalCleave_Timer = urand(15000, 20000);
- } else MortalCleave_Timer -= diff;
+ events.ScheduleEvent(EVENT_CHECK_TIMER, 5000, 0, PHASE_ONE);
+ break;
+ case EVENT_FRENZY:
+ DoCast(me, SPELL_FRENZY);
+ events.ScheduleEvent(EVENT_FRENZY, 30000, 0, PHASE_TWO);
+ break;
+ case EVENT_FORCEPUNCH:
+ DoCastVictim(SPELL_FORCEPUNCH, true);
+ events.ScheduleEvent(EVENT_FORCEPUNCH, urand(16000, 21000), 0, PHASE_TWO);
+ break;
+ case EVENT_CHARGE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ {
+ DoCast(target, SPELL_CHARGE);
+ DoResetThreat();
+ AttackStart(target);
+ }
+ events.ScheduleEvent(EVENT_CHARGE, urand(15000, 22000), 0, PHASE_TWO);
+ break;
+ case EVENT_ENRAGE:
+ if (HealthBelowPct(11) && !Enraged)
+ {
+ DoCast(me, SPELL_ENRAGE);
+ Enraged = true;
+ }
+ events.ScheduleEvent(EVENT_ENRAGE, 30000);
+ break;
+ case EVENT_SUMMONTIGERS:
+ DoCastVictim(SPELL_SUMMONTIGERS, true);
+ events.ScheduleEvent(EVENT_SUMMONTIGERS, urand(10000, 14000), 0, PHASE_TWO);
+ break;
+ default:
+ break;
+ }
- if (!PhaseTwo && Silence_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_SILENCE);
- Silence_Timer = urand(20000, 25000);
- } else Silence_Timer -= diff;
+ if (me->IsFullHealth() && WasDead)
+ WasDead = false;
- if (!PhaseTwo && !WasDead && !HealthAbovePct(5))
+ if ((events.IsInPhase(PHASE_ONE)) && !WasDead && !HealthAbovePct(5))
{
me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT);
me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
@@ -185,78 +240,12 @@ class boss_thekal : public CreatureScript
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetStandState(UNIT_STAND_STATE_SLEEP);
me->AttackStop();
-
if (instance)
- instance->SetData(DATA_THEKAL, SPECIAL);
-
+ instance->SetBossState(DATA_THEKAL, SPECIAL);
WasDead=true;
}
-
- //Thekal will transform to Tiger if he died and was not resurrected after 10 seconds.
- if (!PhaseTwo && WasDead)
- {
- if (Resurrect_Timer <= diff)
- {
- DoCast(me, SPELL_TIGER_FORM);
- me->SetObjectScale(2.00f);
- me->SetStandState(UNIT_STAND_STATE_STAND);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->SetFullHealth();
- const CreatureTemplate* cinfo = me->GetCreatureTemplate();
- me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 40)));
- me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 40)));
- me->UpdateDamagePhysical(BASE_ATTACK);
- DoResetThreat();
- PhaseTwo = true;
- } else Resurrect_Timer -= diff;
- }
-
- if (me->IsFullHealth() && WasDead)
- {
- WasDead = false;
- }
-
- if (PhaseTwo)
- {
- if (Charge_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- DoCast(target, SPELL_CHARGE);
- DoResetThreat();
- AttackStart(target);
- }
-
- Charge_Timer = urand(15000, 22000);
- } else Charge_Timer -= diff;
-
- if (Frenzy_Timer <= diff)
- {
- DoCast(me, SPELL_FRENZY);
- Frenzy_Timer = 30000;
- } else Frenzy_Timer -= diff;
-
- if (ForcePunch_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_SILENCE);
- ForcePunch_Timer = urand(16000, 21000);
- } else ForcePunch_Timer -= diff;
-
- if (SummonTigers_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_SUMMONTIGERS);
- SummonTigers_Timer = urand(10000, 14000);
- } else SummonTigers_Timer -= diff;
-
- if (HealthBelowPct(11) && !Enraged)
- {
- DoCast(me, SPELL_ENRAGE);
- Enraged = true;
- }
- }
-
- DoMeleeAttackIfReady();
-
+ }
+ DoMeleeAttackIfReady();
}
};
@@ -269,12 +258,7 @@ class boss_thekal : public CreatureScript
//Zealot Lor'Khan
class mob_zealot_lorkhan : public CreatureScript
{
- public:
-
- mob_zealot_lorkhan()
- : CreatureScript("mob_zealot_lorkhan")
- {
- }
+ public: mob_zealot_lorkhan() : CreatureScript("mob_zealot_lorkhan") {}
struct mob_zealot_lorkhanAI : public ScriptedAI
{
@@ -304,7 +288,7 @@ class mob_zealot_lorkhan : public CreatureScript
FakeDeath = false;
if (instance)
- instance->SetData(DATA_LORKHAN, NOT_STARTED);
+ instance->SetBossState(DATA_LORKHAN, NOT_STARTED);
me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -314,7 +298,7 @@ class mob_zealot_lorkhan : public CreatureScript
{
}
- void UpdateAI (const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -372,7 +356,7 @@ class mob_zealot_lorkhan : public CreatureScript
{
if (instance)
{
- if (instance->GetData(DATA_THEKAL) == SPECIAL)
+ if (instance->GetBossState(DATA_THEKAL) == SPECIAL)
{
//Resurrect Thekal
if (Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL)))
@@ -384,7 +368,7 @@ class mob_zealot_lorkhan : public CreatureScript
}
}
- if (instance->GetData(DATA_ZATH) == SPECIAL)
+ if (instance->GetBossState(DATA_ZATH) == SPECIAL)
{
//Resurrect Zath
if (Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH)))
@@ -411,7 +395,7 @@ class mob_zealot_lorkhan : public CreatureScript
me->AttackStop();
if (instance)
- instance->SetData(DATA_LORKHAN, SPECIAL);
+ instance->SetBossState(DATA_LORKHAN, SPECIAL);
FakeDeath = true;
}
@@ -466,7 +450,7 @@ class mob_zealot_zath : public CreatureScript
FakeDeath = false;
if (instance)
- instance->SetData(DATA_ZATH, NOT_STARTED);
+ instance->SetBossState(DATA_ZATH, NOT_STARTED);
me->SetStandState(UNIT_STAND_STATE_STAND);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -476,7 +460,7 @@ class mob_zealot_zath : public CreatureScript
{
}
- void UpdateAI (const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -525,7 +509,7 @@ class mob_zealot_zath : public CreatureScript
{
if (instance)
{
- if (instance->GetData(DATA_LORKHAN) == SPECIAL)
+ if (instance->GetBossState(DATA_LORKHAN) == SPECIAL)
{
//Resurrect LorKhan
if (Unit* pLorKhan = Unit::GetUnit(*me, instance->GetData64(DATA_LORKHAN)))
@@ -537,7 +521,7 @@ class mob_zealot_zath : public CreatureScript
}
}
- if (instance->GetData(DATA_THEKAL) == SPECIAL)
+ if (instance->GetBossState(DATA_THEKAL) == SPECIAL)
{
//Resurrect Thekal
if (Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL)))
@@ -564,7 +548,7 @@ class mob_zealot_zath : public CreatureScript
me->AttackStop();
if (instance)
- instance->SetData(DATA_ZATH, SPECIAL);
+ instance->SetBossState(DATA_ZATH, SPECIAL);
FakeDeath = true;
}
@@ -585,4 +569,3 @@ void AddSC_boss_thekal()
new mob_zealot_lorkhan();
new mob_zealot_zath();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp
index ff63e4a8adb..884e5bfad10 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp
@@ -23,14 +23,14 @@
#include "zulgurub.h"
/*
- * TODO:
+ * @todo
* - Fix timers (research some more)
*/
-enum Texts
+enum Says
{
SAY_VENOXIS_TRANSFORM = 1, // Let the coils of hate unfurl!
- SAY_VENOXIS_DEATH = 2, // Ssserenity.. at lassst!
+ SAY_VENOXIS_DEATH = 2 // Ssserenity.. at lassst!
};
enum Spells
@@ -42,7 +42,6 @@ enum Spells
SPELL_HOLY_NOVA = 23858,
SPELL_HOLY_FIRE = 23860,
SPELL_HOLY_WRATH = 23979,
-
// snake form
SPELL_POISON_CLOUD = 23861,
SPELL_VENOM_SPIT = 23862,
@@ -50,15 +49,9 @@ enum Spells
SPELL_PARASITIC_SERPENT = 23865,
SPELL_SUMMON_PARASITIC_SERPENT = 23866,
SPELL_PARASITIC_SERPENT_TRIGGER = 23867,
-
// used when swapping event-stages
SPELL_VENOXIS_TRANSFORM = 23849, // 50% health - shapechange to cobra
- SPELL_FRENZY = 8269, // 20% health - frenzy
-};
-
-enum NPCs
-{
- NPC_PARASITIC_SERPENT = 14884,
+ SPELL_FRENZY = 8269 // 20% health - frenzy
};
enum Events
@@ -70,10 +63,8 @@ enum Events
EVENT_HOLY_NOVA = 4,
EVENT_HOLY_FIRE = 5,
EVENT_HOLY_WRATH = 6,
-
// phase-changing
EVENT_TRANSFORM = 7,
-
// snake form events
EVENT_POISON_CLOUD = 8,
EVENT_VENOM_SPIT = 9,
@@ -84,49 +75,48 @@ enum Events
enum Phases
{
PHASE_ONE = 1, // troll form
- PHASE_TWO = 2, // snake form
+ PHASE_TWO = 2 // snake form
+};
+
+enum NPCs
+{
+ NPC_PARASITIC_SERPENT = 14884
};
class boss_venoxis : public CreatureScript
{
- public:
- boss_venoxis() : CreatureScript("boss_venoxis") {}
+ public: boss_venoxis() : CreatureScript("boss_venoxis") {}
struct boss_venoxisAI : public BossAI
{
- boss_venoxisAI(Creature* creature) : BossAI(creature, DATA_VENOXIS)
- {
- }
+ boss_venoxisAI(Creature* creature) : BossAI(creature, DATA_VENOXIS) {}
void Reset()
{
- events.Reset();
- summons.DespawnAll();
-
- // make sure this boss is properly reset
- instance->SetBossState(DATA_VENOXIS, NOT_STARTED);
-
+ _Reset();
// remove all spells and auras from previous attempts
me->RemoveAllAuras();
me->SetReactState(REACT_PASSIVE);
-
// set some internally used variables to their defaults
_inMeleeRange = 0;
_transformed = false;
_frenzied = false;
-
events.SetPhase(PHASE_ONE);
}
+ void JustDied(Unit* /*killer*/)
+ {
+ _JustDied();
+ Talk(SAY_VENOXIS_DEATH);
+ me->RemoveAllAuras();
+ }
+
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
me->SetReactState(REACT_AGGRESSIVE);
-
- instance->SetBossState(DATA_VENOXIS, IN_PROGRESS);
-
// Always running events
events.ScheduleEvent(EVENT_THRASH, 5000);
-
// Phase one events (regular form)
events.ScheduleEvent(EVENT_HOLY_NOVA, 5000, 0, PHASE_ONE);
events.ScheduleEvent(EVENT_DISPEL_MAGIC, 35000, 0, PHASE_ONE);
@@ -157,15 +147,7 @@ class boss_venoxis : public CreatureScript
}
}
- void JustDied(Unit* /*killer*/)
- {
- Talk(SAY_VENOXIS_DEATH);
- // venoxis is dead, mark him as such for the instance
- instance->SetBossState(DATA_VENOXIS, DONE);
- me->RemoveAllAuras();
- }
-
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp
index 810ee5e900e..945303f3d10 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp
@@ -33,53 +33,63 @@ enum Spells
SPELL_LIGHTNINGWAVE = 24819
};
-class boss_wushoolay : public CreatureScript
+enum Events
{
- public:
+ EVENT_LIGHTNINGCLOUD = 0,
+ EVENT_LIGHTNINGWAVE = 1
+};
- boss_wushoolay()
- : CreatureScript("boss_wushoolay")
- {
- }
+class boss_wushoolay : public CreatureScript
+{
+ public: boss_wushoolay() : CreatureScript("boss_wushoolay") {}
- struct boss_wushoolayAI : public ScriptedAI
+ struct boss_wushoolayAI : public BossAI
{
- boss_wushoolayAI(Creature* creature) : ScriptedAI(creature) {}
-
- uint32 LightningCloud_Timer;
- uint32 LightningWave_Timer;
+ boss_wushoolayAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) {}
void Reset()
{
- LightningCloud_Timer = urand(5000, 10000);
- LightningWave_Timer = urand(8000, 16000);
+ _Reset();
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ _JustDied();
}
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_LIGHTNINGCLOUD, urand(5000, 10000));
+ events.ScheduleEvent(EVENT_LIGHTNINGWAVE, urand(8000, 16000));
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
- //LightningCloud_Timer
- if (LightningCloud_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_LIGHTNINGCLOUD);
- LightningCloud_Timer = urand(15000, 20000);
- } else LightningCloud_Timer -= diff;
+ events.Update(diff);
- //LightningWave_Timer
- if (LightningWave_Timer <= diff)
- {
- Unit* target = NULL;
- target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target) DoCast(target, SPELL_LIGHTNINGWAVE);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- LightningWave_Timer = urand(12000, 16000);
- } else LightningWave_Timer -= diff;
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_LIGHTNINGCLOUD:
+ DoCastVictim(SPELL_LIGHTNINGCLOUD, true);
+ events.ScheduleEvent(EVENT_LIGHTNINGCLOUD, urand(15000, 20000));
+ break;
+ case EVENT_LIGHTNINGWAVE:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_LIGHTNINGWAVE);
+ events.ScheduleEvent(EVENT_LIGHTNINGWAVE, urand(12000, 16000));
+ break;
+ default:
+ break;
+ }
+ }
DoMeleeAttackIfReady();
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
index cfaf19642f2..01c5ef998f5 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
@@ -29,38 +29,30 @@ EndScriptData */
class instance_zulgurub : public InstanceMapScript
{
- public:
- instance_zulgurub()
- : InstanceMapScript("instance_zulgurub", 309)
- {
- }
+ public: instance_zulgurub(): InstanceMapScript(ZGScriptName, 309) {}
struct instance_zulgurub_InstanceMapScript : public InstanceScript
{
- instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map) {}
-
- //If all High Priest bosses were killed. Lorkhan, Zath and Ohgan are added too.
- uint32 m_auiEncounter[MAX_ENCOUNTERS];
-
- //Storing Lorkhan, Zath and Thekal because we need to cast on them later. Jindo is needed for healfunction too.
- uint64 m_uiLorKhanGUID;
- uint64 m_uiZathGUID;
- uint64 m_uiThekalGUID;
- uint64 m_uiJindoGUID;
+ instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map)
+ {
+ SetBossNumber(EncounterCount);
+ }
void Initialize()
{
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
-
- m_uiLorKhanGUID = 0;
- m_uiZathGUID = 0;
- m_uiThekalGUID = 0;
- m_uiJindoGUID = 0;
+ _zealotLorkhanGUID = 0;
+ _zealotZathGUID = 0;
+ _highPriestTekalGUID = 0;
+ _jindoTheHexxerGUID = 0;
+ _vilebranchSpeakerGUID = 0;
+ _arlokkGUID = 0;
+ _goForcefieldGUID = 0;
+ _goGongOfBethekkGUID = 0;
}
bool IsEncounterInProgress() const
{
- //not active in Zul'Gurub
+ // not active in Zul'Gurub
return false;
}
@@ -68,73 +60,44 @@ class instance_zulgurub : public InstanceMapScript
{
switch (creature->GetEntry())
{
- case 11347: m_uiLorKhanGUID = creature->GetGUID(); break;
- case 11348: m_uiZathGUID = creature->GetGUID(); break;
- case 14509: m_uiThekalGUID = creature->GetGUID(); break;
- case 11380: m_uiJindoGUID = creature->GetGUID(); break;
- }
- }
-
- void SetData(uint32 uiType, uint32 uiData)
- {
- switch (uiType)
- {
- case DATA_ARLOKK:
- m_auiEncounter[0] = uiData;
- break;
-
- case DATA_JEKLIK:
- m_auiEncounter[1] = uiData;
+ case NPC_ZEALOT_LORKHAN:
+ _zealotLorkhanGUID = creature->GetGUID();
break;
-
- case DATA_VENOXIS:
- m_auiEncounter[2] = uiData;
+ case NPC_ZEALOT_ZATH:
+ _zealotZathGUID = creature->GetGUID();
break;
-
- case DATA_MARLI:
- m_auiEncounter[3] = uiData;
+ case NPC_HIGH_PRIEST_THEKAL:
+ _highPriestTekalGUID = creature->GetGUID();
break;
-
- case DATA_THEKAL:
- m_auiEncounter[4] = uiData;
+ case NPC_JINDO_THE_HEXXER:
+ _jindoTheHexxerGUID = creature->GetGUID();
break;
-
- case DATA_LORKHAN:
- m_auiEncounter[5] = uiData;
+ case NPC_VILEBRANCH_SPEAKER:
+ _vilebranchSpeakerGUID = creature->GetGUID();
break;
-
- case DATA_ZATH:
- m_auiEncounter[6] = uiData;
- break;
-
- case DATA_OHGAN:
- m_auiEncounter[7] = uiData;
+ case NPC_ARLOKK:
+ _arlokkGUID = creature->GetGUID();
break;
}
}
- uint32 GetData(uint32 uiType) const
+ void OnGameObjectCreate(GameObject* go)
{
- switch (uiType)
+ switch (go->GetEntry())
{
- case DATA_ARLOKK:
- return m_auiEncounter[0];
- case DATA_JEKLIK:
- return m_auiEncounter[1];
- case DATA_VENOXIS:
- return m_auiEncounter[2];
- case DATA_MARLI:
- return m_auiEncounter[3];
- case DATA_THEKAL:
- return m_auiEncounter[4];
- case DATA_LORKHAN:
- return m_auiEncounter[5];
- case DATA_ZATH:
- return m_auiEncounter[6];
- case DATA_OHGAN:
- return m_auiEncounter[7];
+ case GO_FORCEFIELD:
+ _goForcefieldGUID = go->GetGUID();
+ break;
+ case GO_GONG_OF_BETHEKK:
+ _goGongOfBethekkGUID = go->GetGUID();
+ if (GetBossState(DATA_ARLOKK) == DONE)
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ else
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ break;
+ default:
+ break;
}
- return 0;
}
uint64 GetData64(uint32 uiData) const
@@ -142,16 +105,84 @@ class instance_zulgurub : public InstanceMapScript
switch (uiData)
{
case DATA_LORKHAN:
- return m_uiLorKhanGUID;
+ return _zealotLorkhanGUID;
+ break;
case DATA_ZATH:
- return m_uiZathGUID;
+ return _zealotZathGUID;
+ break;
case DATA_THEKAL:
- return m_uiThekalGUID;
+ return _highPriestTekalGUID;
+ break;
case DATA_JINDO:
- return m_uiJindoGUID;
+ return _jindoTheHexxerGUID;
+ break;
+ case NPC_ARLOKK:
+ return _arlokkGUID;
+ break;
+ case GO_FORCEFIELD:
+ return _goForcefieldGUID;
+ break;
+ case GO_GONG_OF_BETHEKK:
+ return _goGongOfBethekkGUID;
+ break;
}
return 0;
}
+
+ std::string GetSaveData()
+ {
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << "Z G " << GetBossSaveData();
+
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
+
+ void Load(const char* str)
+ {
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
+
+ OUT_LOAD_INST_DATA(str);
+
+ char dataHead1, dataHead2;
+
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
+
+ if (dataHead1 == 'Z' && dataHead2 == 'G')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
+ private:
+ //If all High Priest bosses were killed. Lorkhan, Zath and Ohgan are added too.
+ //Storing Lorkhan, Zath and Thekal because we need to cast on them later. Jindo is needed for healfunction too.
+
+ uint64 _zealotLorkhanGUID;
+ uint64 _zealotZathGUID;
+ uint64 _highPriestTekalGUID;
+ uint64 _jindoTheHexxerGUID;
+ uint64 _vilebranchSpeakerGUID;
+ uint64 _arlokkGUID;
+ uint64 _goForcefieldGUID;
+ uint64 _goGongOfBethekkGUID;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
index 22637315066..77767153a96 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -19,20 +18,61 @@
#ifndef DEF_ZULGURUB_H
#define DEF_ZULGURUB_H
+uint32 const EncounterCount = 13;
+
+#define ZGScriptName "instance_zulgurub"
+
enum DataTypes
{
- MAX_ENCOUNTERS = 8,
-
- DATA_ARLOKK = 1,
- DATA_JEKLIK = 2,
- DATA_VENOXIS = 3,
- DATA_MARLI = 4,
- DATA_OHGAN = 5,
- DATA_THEKAL = 6,
- DATA_ZATH = 7,
- DATA_LORKHAN = 8,
- DATA_JINDO = 10,
+ DATA_JEKLIK = 0, // Main boss
+ DATA_VENOXIS = 1, // Main boss
+ DATA_MARLI = 2, // Main boss
+ DATA_ARLOKK = 3, // Main boss
+ DATA_THEKAL = 4, // Main boss
+ DATA_HAKKAR = 5, // End boss
+ DATA_MANDOKIR = 6, // Optional boss
+ DATA_JINDO = 7, // Optional boss
+ DATA_GAHZRANKA = 8, // Optional boss
+ DATA_EDGE_OF_MADNESS = 9, // Optional Event Edge of Madness - one of: Gri'lek, Renataki, Hazza'rah, or Wushoolay
+ DATA_LORKHAN = 10, // Zealot Lor'Khan add to High priest Thekal!
+ DATA_ZATH = 11, // Zealot Zath add to High priest Thekal!
+ DATA_OHGAN = 12, // Bloodlord Mandokir's raptor mount
+ TYPE_EDGE_OF_MADNESS = 13 // Boss storage
};
-#endif
+enum CreatureIds
+{
+ NPC_ARLOKK = 14515, // Arlokk Event
+ NPC_PANTHER_TRIGGER = 15091, // Arlokk Event
+ NPC_ZULIAN_PROWLER = 15101, // Arlokk Event
+ NPC_ZEALOT_LORKHAN = 11347,
+ NPC_ZEALOT_ZATH = 11348,
+ NPC_HIGH_PRIEST_THEKAL = 14509,
+ NPC_JINDO_THE_HEXXER = 11380,
+ NPC_NIGHTMARE_ILLUSION = 15163,
+ NPC_SHADE_OF_JINDO = 14986,
+ NPC_SACRIFICED_TROLL = 14826,
+ NPC_MANDOKIR = 11382, // Mandokir Event
+ NPC_OHGAN = 14988, // Mandokir Event
+ NPC_VILEBRANCH_SPEAKER = 11391, // Mandokir Event
+ NPC_CHAINED_SPIRT = 15117 // Mandokir Event
+
+};
+enum GameobjectIds
+{
+ GO_FORCEFIELD = 180497, // Arlokk Event
+ GO_GONG_OF_BETHEKK = 180526 // Arlokk Event
+};
+
+template<class AI>
+CreatureAI* GetZulGurubAI(Creature* creature)
+{
+ if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
+ if (instance->GetInstanceScript())
+ if (instance->GetScriptId() == sObjectMgr->GetScriptId(ZGScriptName))
+ return new AI(creature);
+ return NULL;
+}
+
+#endif
diff --git a/src/server/scripts/EasternKingdoms/boss_kruul.cpp b/src/server/scripts/EasternKingdoms/boss_kruul.cpp
index 226ff794a9f..997417714e8 100644
--- a/src/server/scripts/EasternKingdoms/boss_kruul.cpp
+++ b/src/server/scripts/EasternKingdoms/boss_kruul.cpp
@@ -26,13 +26,16 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
-#define SPELL_SHADOWVOLLEY 21341
-#define SPELL_CLEAVE 20677
-#define SPELL_THUNDERCLAP 23931
-#define SPELL_TWISTEDREFLECTION 21063
-#define SPELL_VOIDBOLT 21066
-#define SPELL_RAGE 21340
-#define SPELL_CAPTURESOUL 21054
+enum Spells
+{
+ SPELL_SHADOWVOLLEY = 21341,
+ SPELL_CLEAVE = 20677,
+ SPELL_THUNDERCLAP = 23931,
+ SPELL_TWISTEDREFLECTION = 21063,
+ SPELL_VOIDBOLT = 21066,
+ SPELL_RAGE = 21340,
+ SPELL_CAPTURESOUL = 21054
+};
class boss_kruul : public CreatureScript
{
@@ -83,7 +86,7 @@ public:
Hound->AI()->AttackStart(victim);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp
index d638a435936..74344f28a9b 100644
--- a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp
@@ -115,7 +115,7 @@ class npc_professor_phizzlethorpe : public CreatureScript
Talk(SAY_AGGRO);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
diff --git a/src/server/scripts/EasternKingdoms/zone_duskwood.cpp b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp
index 1ce83d31a63..5bfb5edadc1 100644
--- a/src/server/scripts/EasternKingdoms/zone_duskwood.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp
@@ -116,7 +116,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
index 432768a51de..ce62de8b368 100644
--- a/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
@@ -166,7 +166,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (questPhase == 1)
{
@@ -315,7 +315,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
// Quest accepted but object not activated, object despawned (if in sync 1 minute!)
if (questPhase == 1)
@@ -496,7 +496,7 @@ public:
player->FailQuest(QUEST_UNEXPECTED_RESULT);
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (KillCount >= 3 && PlayerGUID)
if (Player* player = Unit::GetPlayer(*me, PlayerGUID))
@@ -551,9 +551,12 @@ public:
return new npc_infused_crystalAI (creature);
}
- struct npc_infused_crystalAI : public Scripted_NoMovementAI
+ struct npc_infused_crystalAI : public ScriptedAI
{
- npc_infused_crystalAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ npc_infused_crystalAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
uint32 EndTimer;
uint32 WaveTimer;
@@ -596,7 +599,7 @@ public:
CAST_PLR(player)->FailQuest(QUEST_POWERING_OUR_DEFENSES);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (EndTimer < diff && Progress)
{
diff --git a/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp b/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp
index bfd4d24cec6..45f5e17095f 100644
--- a/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp
@@ -71,7 +71,7 @@ public:
void MoveInLineOfSight(Unit* /*who*/) {}
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!Credit)
{
@@ -145,7 +145,7 @@ public:
}
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
DoMeleeAttackIfReady();
}
diff --git a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
index 5ff95f83f25..fc5ee94a55f 100644
--- a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
@@ -105,7 +105,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (HasEscortState(STATE_ESCORT_NONE))
return;
diff --git a/src/server/scripts/EasternKingdoms/zone_silvermoon_city.cpp b/src/server/scripts/EasternKingdoms/zone_silvermoon_city.cpp
index e750faefbf5..fd36a02b8a5 100644
--- a/src/server/scripts/EasternKingdoms/zone_silvermoon_city.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_silvermoon_city.cpp
@@ -77,7 +77,7 @@ public:
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (me->IsStandState())
{
diff --git a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
index 290f7fa6882..80e47dbbf08 100644
--- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
@@ -253,7 +253,7 @@ public:
player->FailQuest(QUEST_PYREWOOD_AMBUSH);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//sLog->outInfo(LOG_FILTER_TSCR, "DEBUG: p(%i) k(%i) d(%u) W(%i)", Phase, KillCount, diff, WaitTimer);
diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
index e81567a1a7a..b9c9c8ff15b 100644
--- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
@@ -308,7 +308,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (uiPhase)
{
@@ -448,7 +448,7 @@ public:
}
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!UpdateVictim())
return;
@@ -524,7 +524,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (uiPhase)
{
diff --git a/src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp b/src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp
index 6e14ef840a3..c11e850cbc8 100644
--- a/src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp
@@ -83,7 +83,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (bReset)
{
diff --git a/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp
index f686de5d88f..c7780bb0065 100644
--- a/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp
@@ -128,7 +128,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
diff --git a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
index f36220dec0f..9a496fadb1e 100644
--- a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
@@ -113,7 +113,7 @@ public:
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (m_uiPhase)
{
diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp
index 2c3017a2f1a..43ee012ef40 100644
--- a/src/server/scripts/EasternKingdoms/zone_undercity.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp
@@ -142,7 +142,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (LamentEvent)
{
@@ -248,7 +248,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (EventMove)
{
diff --git a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
index ee22b766154..1831d9f7ff1 100644
--- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
@@ -254,9 +254,12 @@ public:
return new npc_andorhal_towerAI (creature);
}
- struct npc_andorhal_towerAI : public Scripted_NoMovementAI
+ struct npc_andorhal_towerAI : public ScriptedAI
{
- npc_andorhal_towerAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ npc_andorhal_towerAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
void MoveInLineOfSight(Unit* who)
{
@@ -395,7 +398,7 @@ public:
player->FailQuest(QUEST_TOMB_LIGHTBRINGER);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
DoMeleeAttackIfReady();
diff --git a/src/server/scripts/Events/childrens_week.cpp b/src/server/scripts/Events/childrens_week.cpp
index 26f83922f87..2ec5e1190c8 100644
--- a/src/server/scripts/Events/childrens_week.cpp
+++ b/src/server/scripts/Events/childrens_week.cpp
@@ -173,7 +173,7 @@ class npc_winterfin_playmate : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!phase)
return;
@@ -189,10 +189,10 @@ class npc_winterfin_playmate : public CreatureScript
return;
}
- switch(phase)
+ switch (phase)
{
case 1:
- orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5,me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ());
+ orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ());
orphan->AI()->Talk(TEXT_ORACLE_ORPHAN_1);
timer = 3000;
break;
@@ -271,7 +271,7 @@ class npc_snowfall_glade_playmate : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!phase)
return;
@@ -290,7 +290,7 @@ class npc_snowfall_glade_playmate : public CreatureScript
switch (phase)
{
case 1:
- orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5,me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ());
+ orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ());
orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_1);
timer = 5000;
break;
@@ -371,7 +371,7 @@ class npc_the_biggest_tree : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!phase)
return;
@@ -457,7 +457,7 @@ class npc_high_oracle_soo_roo : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!phase)
return;
@@ -545,7 +545,7 @@ class npc_elder_kekek : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!phase)
return;
@@ -601,7 +601,7 @@ class npc_elder_kekek : public CreatureScript
/*######
## npc_the_etymidian
-## TODO: A red crystal as a gift for the great one should be spawned during the event.
+## @todo A red crystal as a gift for the great one should be spawned during the event.
######*/
class npc_the_etymidian : public CreatureScript
{
@@ -633,7 +633,7 @@ class npc_the_etymidian : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!phase)
return;
@@ -755,7 +755,7 @@ class npc_alexstraza_the_lifebinder : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!phase)
return;
@@ -810,7 +810,7 @@ class npc_alexstraza_the_lifebinder : public CreatureScript
timer = 5000;
break;
case 8:
- if(Creature* krasus = me->FindNearestCreature(NPC_KRASUS, 10.0f))
+ if (Creature* krasus = me->FindNearestCreature(NPC_KRASUS, 10.0f))
{
orphan->SetFacingToObject(krasus);
krasus->AI()->Talk(TEXT_KRASUS_8);
@@ -974,7 +974,7 @@ class npc_cw_area_trigger : public CreatureScript
if (Creature* samuro = me->FindNearestCreature(25151, 20.0f))
{
uint32 emote = 0;
- switch(urand(1,5))
+ switch (urand(1, 5))
{
case 1:
emote = EMOTE_ONESHOT_WAVE;
diff --git a/src/server/scripts/Examples/example_creature.cpp b/src/server/scripts/Examples/example_creature.cpp
index f82782448ea..d4e1b8d8ce2 100644
--- a/src/server/scripts/Examples/example_creature.cpp
+++ b/src/server/scripts/Examples/example_creature.cpp
@@ -165,7 +165,7 @@ class example_creature : public CreatureScript
// *** HANDLED FUNCTION ***
//Update AI is called Every single map update (roughly once every 50ms if a player is within the grid)
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//Out of combat timers
if (!me->getVictim())
diff --git a/src/server/scripts/Examples/example_escort.cpp b/src/server/scripts/Examples/example_escort.cpp
index a7906c4359a..e911736036c 100644
--- a/src/server/scripts/Examples/example_escort.cpp
+++ b/src/server/scripts/Examples/example_escort.cpp
@@ -136,7 +136,7 @@ class example_escort : public CreatureScript
Talk(SAY_DEATH_3);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//Must update npc_escortAI
npc_escortAI::UpdateAI(uiDiff);
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp
index 27a442f302e..0f52daba991 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp
@@ -132,7 +132,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp
index e3fdc633382..535d9a4425b 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp
@@ -67,7 +67,7 @@ public:
instance->SetData(TYPE_AKU_MAI, DONE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp
index ee87dfa3cf8..4fa9edd40c6 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp
@@ -64,7 +64,7 @@ public:
instance->SetData(TYPE_GELIHAST, DONE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp
index 61f933d0893..72992c477a8 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp
@@ -73,7 +73,7 @@ public:
instance->SetData(TYPE_KELRIS, DONE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt
index 5c44cd7ef27..536824e7a63 100644
--- a/src/server/scripts/Kalimdor/CMakeLists.txt
+++ b/src/server/scripts/Kalimdor/CMakeLists.txt
@@ -38,11 +38,11 @@ set(scripts_STAT_SRCS
Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h
Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp
Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp
- Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp
- Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp
+ Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp
+ Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
- Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp
+ Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp
index 075d54937c7..6a697c3cc9c 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp
@@ -106,7 +106,7 @@ public:
Talk(SAY_ONDEATH);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (IsEvent)
{
@@ -221,7 +221,7 @@ public:
AttackStart(who);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (CheckTimer <= diff)
{
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp
index e278b3009a0..dcf9605f101 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp
@@ -115,7 +115,7 @@ public:
damage = 0;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (CheckTimer <= diff)
{
@@ -200,7 +200,7 @@ public:
damage = 0;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (ChangeTargetTimer <= diff)
{
@@ -465,7 +465,7 @@ public:
SoulChargeTimer = urand(2000, 30000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!me->isInCombat())
{
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp
index 180aeb0962d..15470716ea7 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp
@@ -112,7 +112,7 @@ public:
Talk(SAY_ONDEATH);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (IsEvent)
{
@@ -234,7 +234,7 @@ public:
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (CheckTimer <= diff)
{
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp
index 2432be2c31a..0780b3dcf0d 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp
@@ -108,7 +108,7 @@ public:
DoPlaySoundToSet(me, SOUND_ONDEATH);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (IsEvent)
{
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp
index 84ef05779ee..b35826c9d87 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp
@@ -103,7 +103,7 @@ public:
Talk(SAY_ONDEATH);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (IsEvent)
{
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
index aa17fcf6af4..3f186c96d40 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
@@ -708,7 +708,7 @@ void hyjalAI::DeSpawnVeins()
}
}
-void hyjalAI::UpdateAI(const uint32 diff)
+void hyjalAI::UpdateAI(uint32 diff)
{
if (IsDummy)
{
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h
index 0833dc2bf07..f40c868a96b 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h
@@ -153,7 +153,7 @@ struct hyjalAI : public npc_escortAI
void EnterCombat(Unit* /*who*/); // Used to reset cooldowns for our spells and to inform the raid that we're under attack
- void UpdateAI(const uint32 diff); // Called to summon waves, check for boss deaths and to cast our spells.
+ void UpdateAI(uint32 diff); // Called to summon waves, check for boss deaths and to cast our spells.
void JustDied(Unit* /*killer*/); // Called on death, informs the raid that they have failed.
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
index 36f6f94b324..adb89ba5a69 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
@@ -199,7 +199,7 @@ void hyjal_trashAI::DamageTaken(Unit* done_by, uint32 &damage)
}
}
-void hyjal_trashAI::UpdateAI(const uint32 /*diff*/)
+void hyjal_trashAI::UpdateAI(uint32 /*diff*/)
{
if (IsOverrun && !SetupOverrun)
{
@@ -458,7 +458,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (Delay <= diff)
{
@@ -596,7 +596,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
hyjal_trashAI::UpdateAI(diff);
if (IsEvent || IsOverrun)
@@ -699,7 +699,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
hyjal_trashAI::UpdateAI(diff);
if (IsEvent || IsOverrun)
@@ -822,7 +822,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
hyjal_trashAI::UpdateAI(diff);
@@ -920,7 +920,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
hyjal_trashAI::UpdateAI(diff);
if (IsEvent || IsOverrun)
@@ -1019,7 +1019,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
hyjal_trashAI::UpdateAI(diff);
if (IsEvent || IsOverrun)
@@ -1109,7 +1109,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
hyjal_trashAI::UpdateAI(diff);
if (IsEvent || IsOverrun)
@@ -1208,7 +1208,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
hyjal_trashAI::UpdateAI(diff);
if (IsEvent || IsOverrun)
@@ -1321,7 +1321,7 @@ public:
hyjal_trashAI::JustDied(killer);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
hyjal_trashAI::UpdateAI(diff);
if (IsEvent || IsOverrun)
@@ -1369,8 +1369,7 @@ public:
forcemove = false;
if (forcemove)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
me->Attack(target, false);
}
if (MoveTimer <= diff)
@@ -1409,11 +1408,11 @@ public:
return new alliance_riflemanAI(creature);
}
- struct alliance_riflemanAI : public Scripted_NoMovementAI
+ struct alliance_riflemanAI : public ScriptedAI
{
- alliance_riflemanAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ alliance_riflemanAI(Creature* creature) : ScriptedAI(creature)
{
- Reset();
+ SetCombatMovement(false);
}
uint32 ExplodeTimer;
@@ -1444,7 +1443,7 @@ public:
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Check if we have a target
if (!UpdateVictim())
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h
index 1a9a4394a3d..01ae6244b4a 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h
@@ -27,7 +27,7 @@ struct hyjal_trashAI : public npc_escortAI
{
hyjal_trashAI(Creature* creature);
- void UpdateAI(const uint32 diff);
+ void UpdateAI(uint32 diff);
void JustDied(Unit* /*killer*/);
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
index fad5736e18f..2259cc84e15 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
@@ -19,7 +19,7 @@
SDName: Boss epoch
SDAuthor: Tartalo
SD%Complete: 80
-SDComment: TODO: Intro, consecutive attacks to a random target durin time wrap, adjust timers
+SDComment: @todo Intro, consecutive attacks to a random target durin time wrap, adjust timers
SDCategory:
Script Data End */
@@ -93,7 +93,7 @@ public:
instance->SetData(DATA_EPOCH_EVENT, IN_PROGRESS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp
index 8c2861db299..262f8a76509 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp
@@ -64,7 +64,7 @@ public:
instance->SetData(DATA_INFINITE_EVENT, IN_PROGRESS);
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
index 5aacaf736e0..8020d606532 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
@@ -19,7 +19,7 @@
SDName: Boss mal_ganis
SDAuthor: Tartalo
SD%Complete: 80
-SDComment: TODO: Intro & outro
+SDComment: @todo Intro & outro
SDCategory:
Script Data End */
@@ -119,7 +119,7 @@ public:
damage = me->GetHealth()-1;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
switch (Phase)
{
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
index c7b819dd243..7cf095d176c 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
@@ -87,7 +87,7 @@ public:
instance->SetData(DATA_MEATHOOK_EVENT, IN_PROGRESS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
index d7d9beaedd4..cda2175a22d 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
@@ -19,7 +19,7 @@
SDName: Boss salramm
SDAuthor: Tartalo
SD%Complete: 80
-SDComment: TODO: Intro
+SDComment: @todo Intro
SDCategory:
Script Data End */
@@ -96,7 +96,7 @@ public:
instance->SetData(DATA_SALRAMM_EVENT, IN_PROGRESS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
index d5d5416f093..d8df5d56888 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
@@ -589,7 +589,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
npc_escortAI::UpdateAI(diff);
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_aeonus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_aeonus.cpp
index 7643131edf7..7a18210791c 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_aeonus.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_aeonus.cpp
@@ -109,7 +109,7 @@ public:
Talk(SAY_SLAY);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp
index ea372621026..ef0d7b1f418 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp
@@ -108,7 +108,7 @@ public:
instance->SetData(TYPE_RIFT, SPECIAL);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -124,8 +124,8 @@ public:
//Arcane Discharge
if (ArcaneDischarge_Timer <= diff)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- DoCast(target, SPELL_ARCANE_DISCHARGE);
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_ARCANE_DISCHARGE);
ArcaneDischarge_Timer = 20000+rand()%10000;
} else ArcaneDischarge_Timer -= diff;
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_temporus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_temporus.cpp
index 6e78e4dae7b..e224094b1f9 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_temporus.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_temporus.cpp
@@ -108,7 +108,7 @@ public:
ScriptedAI::MoveInLineOfSight(who);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp
index 4c80bc017b7..69054727e4a 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/dark_portal.cpp
@@ -168,7 +168,7 @@ public:
Talk(SAY_DEATH);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!instance)
return;
@@ -229,7 +229,7 @@ public:
if (me->HasAura(SPELL_CHANNEL))
me->RemoveAura(SPELL_CHANNEL);
- //TODO: start the post-event here
+ /// @todo start the post-event here
instance->SetData(TYPE_MEDIVH, DONE);
}
} else Check_Timer -= diff;
@@ -342,7 +342,7 @@ public:
} else DoSummonAtRift(entry);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!instance)
return;
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp
index 9c17ed10d9c..78b655bb73b 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp
@@ -122,7 +122,7 @@ public:
bool IsEncounterInProgress() const
{
- if (const_cast<instance_dark_portal_InstanceMapScript*>(this)->GetData(TYPE_MEDIVH) == IN_PROGRESS)
+ if (GetData(TYPE_MEDIVH) == IN_PROGRESS)
return true;
return false;
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp
index 5e7fc6e66e8..adbc7a14745 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp
@@ -103,7 +103,7 @@ public:
instance->SetData(TYPE_THRALL_PART1, DONE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp
index ad3e6979dfb..b48e0b376ea 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp
@@ -95,7 +95,7 @@ public:
instance->SetData(TYPE_THRALL_PART4, DONE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp
index 65f496a579f..a4de0409573 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp
@@ -150,9 +150,9 @@ public:
Talk(SAY_DEATH);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
- //TODO: make this work
+ /// @todo make this work
if (CanPatrol && wpId == 0)
{
me->GetMotionMaster()->MovePoint(DrakeWP[0].wpId, DrakeWP[0].x, DrakeWP[0].y, DrakeWP[0].z);
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
index 4a4ba4f3ce2..b9820790d47 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
@@ -507,7 +507,7 @@ public:
{
switch (summoned->GetEntry())
{
- //TODO: make Scarloc start into event instead, and not start attack directly
+ /// @todo make Scarloc start into event instead, and not start attack directly
case MOB_ENTRY_BARN_GUARDSMAN:
case MOB_ENTRY_BARN_PROTECTOR:
case MOB_ENTRY_BARN_LOOKOUT:
@@ -536,14 +536,14 @@ public:
Talk(SAY_TH_RANDOM_DIE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
npc_escortAI::UpdateAI(diff);
if (!UpdateVictim())
return;
- //TODO: add his abilities'n-crap here
+ /// @todo add his abilities'n-crap here
if (!LowHp && HealthBelowPct(20))
{
Talk(SAY_TH_RANDOM_LOW_HP);
@@ -642,7 +642,7 @@ public:
void Reset() {}
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
diff --git a/src/server/scripts/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp b/src/server/scripts/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp
index 222937621a8..695f9d2973e 100644
--- a/src/server/scripts/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp
+++ b/src/server/scripts/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp
@@ -65,7 +65,7 @@ public:
me->SummonCreature(13716, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 600000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Kalimdor/Maraudon/boss_landslide.cpp b/src/server/scripts/Kalimdor/Maraudon/boss_landslide.cpp
index c6c0387026c..eea34e1949f 100644
--- a/src/server/scripts/Kalimdor/Maraudon/boss_landslide.cpp
+++ b/src/server/scripts/Kalimdor/Maraudon/boss_landslide.cpp
@@ -62,7 +62,7 @@ public:
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Kalimdor/Maraudon/boss_noxxion.cpp b/src/server/scripts/Kalimdor/Maraudon/boss_noxxion.cpp
index 3fcd840077f..96c3c4a6c45 100644
--- a/src/server/scripts/Kalimdor/Maraudon/boss_noxxion.cpp
+++ b/src/server/scripts/Kalimdor/Maraudon/boss_noxxion.cpp
@@ -69,7 +69,7 @@ public:
Add->AI()->AttackStart(victim);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (Invisible && InvisibleTimer <= diff)
{
diff --git a/src/server/scripts/Kalimdor/Maraudon/boss_princess_theradras.cpp b/src/server/scripts/Kalimdor/Maraudon/boss_princess_theradras.cpp
index eda5f125b00..ddce2f658e7 100644
--- a/src/server/scripts/Kalimdor/Maraudon/boss_princess_theradras.cpp
+++ b/src/server/scripts/Kalimdor/Maraudon/boss_princess_theradras.cpp
@@ -69,7 +69,7 @@ public:
me->SummonCreature(12238, 28.067f, 61.875f, -123.405f, 4.67f, TEMPSUMMON_TIMED_DESPAWN, 600000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
index 4724794d03b..e01f2b097b0 100644
--- a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
+++ b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
@@ -341,7 +341,7 @@ public:
MovePoint = iTemp;
}
- void UpdateAI(const uint32 Diff)
+ void UpdateAI(uint32 Diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp
index d272b3cc84c..374652ee91d 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp
@@ -81,7 +81,7 @@ public:
Talk(SAY_KILL);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
index b90d5a760d3..78535b7c3b0 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
@@ -142,7 +142,7 @@ public:
uiWebTimer = urand(5000, 8000);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp
index e72e6dff9cf..aec78581514 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp
@@ -16,25 +16,59 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "ObjectMgr.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "Player.h"
#include "ruins_of_ahnqiraj.h"
enum Spells
{
- SPELL_STINGERSPRAY = 25749,
- SPELL_POISONSTINGER = 25748, // Only used in phase 1
+ SPELL_STINGER_SPRAY = 25749,
+ SPELL_POISON_STINGER = 25748,
SPELL_PARALYZE = 25725,
SPELL_TRASH = 3391,
- SPELL_FRENZY = 8269, // Not used
+ SPELL_FRENZY = 8269,
SPELL_LASH = 25852,
- SPELL_FEED = 25721,
+ SPELL_FEED = 25721
};
-enum Says
+enum Events
{
- EMOTE_FRENZY = 0 // Not used
+ EVENT_STINGER_SPRAY = 0,
+ EVENT_POISON_STINGER = 1,
+ EVENT_SUMMON_SWARMER = 2,
+ EVENT_SWARMER_ATTACK = 3,
+ EVENT_PARALYZE = 4,
+ EVENT_LASH = 5,
+ EVENT_TRASH = 6
+};
+
+enum Emotes
+{
+ EMOTE_FRENZY = 0
+};
+
+enum Phases
+{
+ PHASE_AIR = 0,
+ PHASE_GROUND = 1
+};
+
+enum Points
+{
+ POINT_AIR = 0,
+ POINT_GROUND = 1,
+ POINT_PARALYZE = 2
+};
+
+const Position AyamissAirPos = { -9689.292f, 1547.912f, 48.02729f, 0.0f };
+const Position AltarPos = { -9717.18f, 1517.72f, 27.4677f, 0.0f };
+/// @todo These below are probably incorrect, taken from SD2
+const Position SwarmerPos = { -9647.352f, 1578.062f, 55.32f, 0.0f };
+const Position LarvaPos[2] =
+{
+ { -9674.4707f, 1528.4133f, 22.457f, 0.0f },
+ { -9701.6005f, 1566.9993f, 24.118f, 0.0f }
};
class boss_ayamiss : public CreatureScript
@@ -42,65 +76,221 @@ class boss_ayamiss : public CreatureScript
public:
boss_ayamiss() : CreatureScript("boss_ayamiss") { }
- struct boss_ayamissAI : public ScriptedAI
+ struct boss_ayamissAI : public BossAI
{
- boss_ayamissAI(Creature* creature) : ScriptedAI(creature)
+ boss_ayamissAI(Creature* creature) : BossAI(creature, DATA_AYAMISS)
{
- instance = creature->GetInstanceScript();
}
- uint32 STINGERSPRAY_Timer;
- uint32 POISONSTINGER_Timer;
- uint32 SUMMONSWARMER_Timer;
- uint32 phase;
+ void Reset()
+ {
+ _Reset();
+ _phase = PHASE_AIR;
+ _enraged = false;
+ SetCombatMovement(false);
+ }
- InstanceScript* instance;
+ void JustSummoned(Creature* who)
+ {
+ switch (who->GetEntry())
+ {
+ case NPC_SWARMER:
+ _swarmers.push_back(who->GetGUID());
+ break;
+ case NPC_LARVA:
+ who->GetMotionMaster()->MovePoint(POINT_PARALYZE, AltarPos);
+ break;
+ case NPC_HORNET:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
+ who->AI()->AttackStart(target);
+ break;
+ }
+ }
- void Reset()
+ void MovementInform(uint32 type, uint32 id)
+ {
+ if (type == POINT_MOTION_TYPE)
+ {
+ switch (id)
+ {
+ case POINT_AIR:
+ me->AddUnitState(UNIT_STATE_ROOT);
+ break;
+ case POINT_GROUND:
+ me->ClearUnitState(UNIT_STATE_ROOT);
+ break;
+ }
+ }
+ }
+
+ void EnterEvadeMode()
{
- STINGERSPRAY_Timer = 30000;
- POISONSTINGER_Timer = 30000;
- SUMMONSWARMER_Timer = 60000;
- phase = 1;
+ me->ClearUnitState(UNIT_STATE_ROOT);
+ BossAI::EnterEvadeMode();
+ }
+
+ void EnterCombat(Unit* attacker)
+ {
+ BossAI::EnterCombat(attacker);
+
+ events.ScheduleEvent(EVENT_STINGER_SPRAY, urand(20000, 30000));
+ events.ScheduleEvent(EVENT_POISON_STINGER, 5000);
+ events.ScheduleEvent(EVENT_SUMMON_SWARMER, 5000);
+ events.ScheduleEvent(EVENT_SWARMER_ATTACK, 60000);
+ events.ScheduleEvent(EVENT_PARALYZE, 15000);
+ me->SetCanFly(true);
+ me->SetDisableGravity(true);
+ me->GetMotionMaster()->MovePoint(POINT_AIR, AyamissAirPos);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
- //If he is 70% start phase 2
- if (phase == 1 && !HealthAbovePct(70) && !me->IsNonMeleeSpellCasted(false))
+ events.Update(diff);
+
+ if (_phase == PHASE_AIR && me->GetHealthPct() < 70.0f)
+ {
+ _phase = PHASE_GROUND;
+ SetCombatMovement(true);
+ me->SetCanFly(false);
+ Position VictimPos;
+ me->getVictim()->GetPosition(&VictimPos);
+ me->GetMotionMaster()->MovePoint(POINT_GROUND, VictimPos);
+ DoResetThreat();
+ events.ScheduleEvent(EVENT_LASH, urand(5000, 8000));
+ events.ScheduleEvent(EVENT_TRASH, urand(3000, 6000));
+ events.CancelEvent(EVENT_POISON_STINGER);
+ }
+ else
{
- phase=2;
+ DoMeleeAttackIfReady();
}
- //STINGERSPRAY_Timer (only in phase2)
- if (phase == 2 && STINGERSPRAY_Timer <= diff)
+ if (!_enraged && me->GetHealthPct() < 20.0f)
{
- DoCast(me->getVictim(), SPELL_STINGERSPRAY);
- STINGERSPRAY_Timer = 30000;
- } else STINGERSPRAY_Timer -= diff;
+ DoCast(me, SPELL_FRENZY);
+ Talk(EMOTE_FRENZY);
+ _enraged = true;
+ }
- //POISONSTINGER_Timer (only in phase1)
- if (phase == 1 && POISONSTINGER_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- DoCast(me->getVictim(), SPELL_POISONSTINGER);
- POISONSTINGER_Timer = 30000;
- } else POISONSTINGER_Timer -= diff;
+ switch (eventId)
+ {
+ case EVENT_STINGER_SPRAY:
+ DoCast(me, SPELL_STINGER_SPRAY);
+ events.ScheduleEvent(EVENT_STINGER_SPRAY, urand(15000, 20000));
+ break;
+ case EVENT_POISON_STINGER:
+ DoCastVictim(SPELL_POISON_STINGER);
+ events.ScheduleEvent(EVENT_POISON_STINGER, urand(2000, 3000));
+ break;
+ case EVENT_PARALYZE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true))
+ {
+ DoCast(target, SPELL_PARALYZE);
+ instance->SetData64(DATA_PARALYZED, target->GetGUID());
+ uint8 Index = urand(0, 1);
+ me->SummonCreature(NPC_LARVA, LarvaPos[Index], TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000);
+ }
+ events.ScheduleEvent(EVENT_PARALYZE, 15000);
+ break;
+ case EVENT_SWARMER_ATTACK:
+ for (std::list<uint64>::iterator i = _swarmers.begin(); i != _swarmers.end(); ++i)
+ if (Creature* swarmer = me->GetMap()->GetCreature(*i))
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
+ swarmer->AI()->AttackStart(target);
+
+ _swarmers.clear();
+ events.ScheduleEvent(EVENT_SWARMER_ATTACK, 60000);
+ break;
+ case EVENT_SUMMON_SWARMER:
+ Position Pos;
+ me->GetRandomPoint(SwarmerPos, 80.0f, Pos);
+ me->SummonCreature(NPC_SWARMER, Pos);
+ events.ScheduleEvent(EVENT_SUMMON_SWARMER, 5000);
+ break;
+ case EVENT_TRASH:
+ DoCastVictim(SPELL_TRASH);
+ events.ScheduleEvent(EVENT_TRASH, urand(5000, 7000));
+ break;
+ case EVENT_LASH:
+ DoCastVictim(SPELL_LASH);
+ events.ScheduleEvent(EVENT_LASH, urand(8000, 15000));
+ break;
+ }
+ }
+ }
+ private:
+ std::list<uint64> _swarmers;
+ uint8 _phase;
+ bool _enraged;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_ayamissAI(creature);
+ }
+};
+
+class npc_hive_zara_larva : public CreatureScript
+{
+ public:
+ npc_hive_zara_larva() : CreatureScript("npc_hive_zara_larva") { }
+
+ struct npc_hive_zara_larvaAI : public ScriptedAI
+ {
+ npc_hive_zara_larvaAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = me->GetInstanceScript();
+ }
+
+ void MovementInform(uint32 type, uint32 id)
+ {
+ if (type == POINT_MOTION_TYPE)
+ if (id == POINT_PARALYZE)
+ if (Player* target = ObjectAccessor::GetPlayer(*me, _instance->GetData64(DATA_PARALYZED)))
+ DoCast(target, SPELL_FEED); // Omnomnom
+ }
+
+ void MoveInLineOfSight(Unit* who)
+ {
+ if (_instance->GetBossState(DATA_AYAMISS) == IN_PROGRESS)
+ return;
+
+ ScriptedAI::MoveInLineOfSight(who);
+ }
+
+ void AttackStart(Unit* victim)
+ {
+ if (_instance->GetBossState(DATA_AYAMISS) == IN_PROGRESS)
+ return;
+
+ ScriptedAI::AttackStart(victim);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (_instance->GetBossState(DATA_AYAMISS) == IN_PROGRESS)
+ return;
- DoMeleeAttackIfReady();
+ ScriptedAI::UpdateAI(diff);
}
+ private:
+ InstanceScript* _instance;
};
CreatureAI* GetAI(Creature* creature) const
{
- return new boss_ayamissAI (creature);
+ return new npc_hive_zara_larvaAI(creature);
}
};
void AddSC_boss_ayamiss()
{
new boss_ayamiss();
+ new npc_hive_zara_larva();
}
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp
index e26cba9cb6e..0ad077aaa4e 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp
@@ -70,11 +70,11 @@ class boss_buru : public CreatureScript
boss_buruAI(Creature* creature) : BossAI(creature, DATA_BURU)
{
}
-
+
void EnterEvadeMode()
{
BossAI::EnterEvadeMode();
-
+
for (std::list<uint64>::iterator i = Eggs.begin(); i != Eggs.end(); ++i)
if (Creature* egg = me->GetMap()->GetCreature(*Eggs.begin()))
egg->Respawn();
@@ -95,13 +95,13 @@ class boss_buru : public CreatureScript
_phase = PHASE_EGG;
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_EXPLODE)
if (_phase == PHASE_EGG)
me->DealDamage(me, 45000);
}
-
+
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() == TYPEID_PLAYER)
@@ -112,12 +112,12 @@ class boss_buru : public CreatureScript
{
if (_phase != PHASE_EGG)
return;
-
+
me->RemoveAurasDueToSpell(SPELL_FULL_SPEED);
me->RemoveAurasDueToSpell(SPELL_GATHERING_SPEED);
events.ScheduleEvent(EVENT_GATHERING_SPEED, 9000);
events.ScheduleEvent(EVENT_FULL_SPEED, 60000);
-
+
if (Unit* victim = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
{
DoResetThreat();
@@ -125,21 +125,21 @@ class boss_buru : public CreatureScript
Talk(EMOTE_TARGET, victim->GetGUID());
}
}
-
+
void ManageRespawn(uint64 EggGUID)
{
ChaseNewVictim();
Eggs.push_back(EggGUID);
events.ScheduleEvent(EVENT_RESPAWN_EGG, 100000);
}
-
- void UpdateAI(uint32 const diff)
+
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
-
+
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
@@ -170,7 +170,7 @@ class boss_buru : public CreatureScript
break;
}
}
-
+
if (me->GetHealthPct() < 20.0f && _phase == PHASE_EGG)
{
DoCast(me, SPELL_BURU_TRANSFORM); // Enrage
@@ -178,7 +178,7 @@ class boss_buru : public CreatureScript
me->RemoveAurasDueToSpell(SPELL_THORNS);
_phase = PHASE_TRANSFORM;
}
-
+
DoMeleeAttackIfReady();
}
private:
@@ -197,20 +197,21 @@ class npc_buru_egg : public CreatureScript
public:
npc_buru_egg() : CreatureScript("npc_buru_egg") { }
- struct npc_buru_eggAI : public Scripted_NoMovementAI
+ struct npc_buru_eggAI : public ScriptedAI
{
- npc_buru_eggAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_buru_eggAI(Creature* creature) : ScriptedAI(creature)
{
_instance = me->GetInstanceScript();
+ SetCombatMovement(false);
}
-
+
void EnterCombat(Unit* attacker)
{
if (Creature* buru = me->GetMap()->GetCreature(_instance->GetData64(DATA_BURU)))
if (!buru->isInCombat())
buru->AI()->AttackStart(attacker);
}
-
+
void JustSummoned(Creature* who)
{
if (who->GetEntry() == NPC_HATCHLING)
@@ -218,7 +219,7 @@ class npc_buru_egg : public CreatureScript
if (Unit* target = buru->AI()->SelectTarget(SELECT_TARGET_RANDOM))
who->AI()->AttackStart(target);
}
-
+
void JustDied(Unit* /*killer*/)
{
DoCastAOE(SPELL_EXPLODE, true);
@@ -247,13 +248,13 @@ class spell_egg_explosion : public SpellScriptLoader
class spell_egg_explosion_SpellScript : public SpellScript
{
PrepareSpellScript(spell_egg_explosion_SpellScript);
-
+
void HandleAfterCast()
{
if (Creature* buru = GetCaster()->FindNearestCreature(NPC_BURU, 5.f))
buru->AI()->DoAction(ACTION_EXPLODE);
}
-
+
void HandleDummyHitTarget(SpellEffIndex /*effIndex*/)
{
if (Unit* target = GetHitUnit())
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp
index ddb9017f3dd..033980d746b 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp
@@ -81,7 +81,7 @@ class boss_kurinnaxx : public CreatureScript
sCreatureTextMgr->SendChat(Ossirian, SAY_KURINAXX_DEATH, 0, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_ZONE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp
index 70db1213394..dd52872e1da 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp
@@ -80,7 +80,7 @@ class boss_moam : public CreatureScript
}
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -105,7 +105,7 @@ class boss_moam : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp
index fcb6364244e..bd010849045 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp
@@ -74,7 +74,7 @@ Position CrystalCoordinates[NUM_CRYSTALS] =
};
float RoomRadius = 165.0f;
-uint8 const NUM_TORNADOS = 5; // TODO: This number is completly random!
+uint8 const NUM_TORNADOS = 5; /// @todo This number is completly random!
uint8 const NUM_WEAKNESS = 5;
uint32 const SpellWeakness[NUM_WEAKNESS] = { 25177, 25178, 25180, 25181, 25183 };
Position const RoomCenter = { -9343.041992f, 1923.278198f, 85.555984f, 0.0 };
@@ -89,7 +89,6 @@ class boss_ossirian : public CreatureScript
boss_ossirianAI(Creature* creature) : BossAI(creature, DATA_OSSIRIAN)
{
SaidIntro = false;
- Reset();
}
uint64 TriggerGUID;
@@ -118,16 +117,12 @@ class boss_ossirian : public CreatureScript
}
}
- void DoAction(const int32 action)
+ void DoAction(int32 action)
{
if (action == ACTION_TRIGGER_WEAKNESS)
- {
if (Creature* Trigger = me->GetMap()->GetCreature(TriggerGUID))
- {
if (!Trigger->HasUnitState(UNIT_STATE_CASTING))
Trigger->CastSpell(Trigger, SpellWeakness[urand(0, 4)], false);
- }
- }
}
void EnterCombat(Unit* /*who*/)
@@ -172,7 +167,7 @@ class boss_ossirian : public CreatureScript
{
Cleanup();
summons.DespawnAll();
- ScriptedAI::EnterEvadeMode();
+ BossAI::EnterEvadeMode();
}
void JustDied(Unit* /*killer*/)
@@ -207,16 +202,17 @@ class boss_ossirian : public CreatureScript
}
}
- void MoveInLineOfSight(Unit* /*who*/)
+ void MoveInLineOfSight(Unit* who)
{
if (!SaidIntro)
{
Talk(SAY_INTRO);
SaidIntro = true;
}
+ BossAI::MoveInLineOfSight(who);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp
index dae447e43d2..a7151ec7c05 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp
@@ -86,7 +86,7 @@ class boss_rajaxx : public CreatureScript
_EnterCombat();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp
index 6dbeaed9e5d..658528f1fb4 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp
@@ -36,6 +36,7 @@ class instance_ruins_of_ahnqiraj : public InstanceMapScript
_buruGUID = 0;
_ayamissGUID = 0;
_ossirianGUID = 0;
+ _paralyzedGUID = 0;
}
void OnCreatureCreate(Creature* creature)
@@ -71,6 +72,12 @@ class instance_ruins_of_ahnqiraj : public InstanceMapScript
return true;
}
+ void SetData64(uint32 type, uint64 data)
+ {
+ if (type == DATA_PARALYZED)
+ _paralyzedGUID = data;
+ }
+
uint64 GetData64(uint32 type) const
{
switch (type)
@@ -87,6 +94,8 @@ class instance_ruins_of_ahnqiraj : public InstanceMapScript
return _ayamissGUID;
case DATA_OSSIRIAN:
return _ossirianGUID;
+ case DATA_PARALYZED:
+ return _paralyzedGUID;
}
return 0;
@@ -142,6 +151,7 @@ class instance_ruins_of_ahnqiraj : public InstanceMapScript
uint64 _buruGUID;
uint64 _ayamissGUID;
uint64 _ossirianGUID;
+ uint64 _paralyzedGUID;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h
index 6ece21f627b..419aaf1c303 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h
@@ -26,7 +26,9 @@ enum DataTypes
DATA_BURU = 3,
DATA_AYAMISS = 4,
DATA_OSSIRIAN = 5,
- NUM_ENCOUNTER = 6
+ NUM_ENCOUNTER = 6,
+
+ DATA_PARALYZED = 7
};
enum Creatures
@@ -42,12 +44,15 @@ enum Creatures
NPC_HIVEZARA_LARVA = 15555,
NPC_SAND_VORTEX = 15428,
NPC_OSSIRIAN_TRIGGER = 15590,
- NPC_HATCHLING = 15521
+ NPC_HATCHLING = 15521,
+ NPC_LARVA = 15555,
+ NPC_SWARMER = 15546,
+ NPC_HORNET = 15934
};
enum GameObjects
{
- GO_OSSIRIAN_CRYSTAL = 180619,
+ GO_OSSIRIAN_CRYSTAL = 180619
};
#endif
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp
index 2a9ea4ba4fc..becbd126d9b 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp
@@ -89,7 +89,7 @@ public:
instance->SetData(DATA_BUG_TRIO_DEATH, 1);
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -185,7 +185,7 @@ public:
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -274,10 +274,11 @@ public:
for (uint8 i = 0; i < 10; ++i)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- Creature* Summoned = me->SummonCreature(15621, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 90000);
- if (Summoned && target)
- Summoned->AI()->AttackStart(target);
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ {
+ if (Creature* Summoned = me->SummonCreature(15621, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 90000))
+ Summoned->AI()->AttackStart(target);
+ }
}
}
@@ -285,7 +286,7 @@ public:
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp
index 3da1fc1dc5c..e6460c00ab6 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp
@@ -156,13 +156,15 @@ public:
return new eye_of_cthunAI (creature);
}
- struct eye_of_cthunAI : public Scripted_NoMovementAI
+ struct eye_of_cthunAI : public ScriptedAI
{
- eye_of_cthunAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ eye_of_cthunAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
if (!instance)
sLog->outError(LOG_FILTER_TSCR, "No Instance eye_of_cthunAI");
+
+ SetCombatMovement(false);
}
InstanceScript* instance;
@@ -228,7 +230,7 @@ public:
Spawned->AI()->AttackStart(target);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Check if we have a target
if (!UpdateVictim())
@@ -460,9 +462,9 @@ public:
return new cthunAI (creature);
}
- struct cthunAI : public Scripted_NoMovementAI
+ struct cthunAI : public ScriptedAI
{
- cthunAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ cthunAI(Creature* creature) : ScriptedAI(creature)
{
SetCombatMovement(false);
@@ -579,7 +581,7 @@ public:
return (*j);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Check if we have a target
if (!UpdateVictim())
@@ -893,7 +895,7 @@ public:
}
}
- void DoAction(const int32 param)
+ void DoAction(int32 param)
{
switch (param)
{
@@ -916,15 +918,17 @@ public:
return new eye_tentacleAI (creature);
}
- struct eye_tentacleAI : public Scripted_NoMovementAI
+ struct eye_tentacleAI : public ScriptedAI
{
- eye_tentacleAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ eye_tentacleAI(Creature* creature) : ScriptedAI(creature)
{
if (Creature* pPortal = me->SummonCreature(MOB_SMALL_PORTAL, *me, TEMPSUMMON_CORPSE_DESPAWN))
{
pPortal->SetReactState(REACT_PASSIVE);
Portal = pPortal->GetGUID();
}
+
+ SetCombatMovement(false);
}
uint32 MindflayTimer;
@@ -951,7 +955,7 @@ public:
DoZoneInCombat();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Check if we have a target
if (!UpdateVictim())
@@ -989,9 +993,9 @@ public:
return new claw_tentacleAI (creature);
}
- struct claw_tentacleAI : public Scripted_NoMovementAI
+ struct claw_tentacleAI : public ScriptedAI
{
- claw_tentacleAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ claw_tentacleAI(Creature* creature) : ScriptedAI(creature)
{
SetCombatMovement(false);
@@ -1026,7 +1030,7 @@ public:
DoZoneInCombat();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Check if we have a target
if (!UpdateVictim())
@@ -1099,9 +1103,9 @@ public:
return new giant_claw_tentacleAI (creature);
}
- struct giant_claw_tentacleAI : public Scripted_NoMovementAI
+ struct giant_claw_tentacleAI : public ScriptedAI
{
- giant_claw_tentacleAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ giant_claw_tentacleAI(Creature* creature) : ScriptedAI(creature)
{
SetCombatMovement(false);
@@ -1138,7 +1142,7 @@ public:
DoZoneInCombat();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Check if we have a target
if (!UpdateVictim())
@@ -1218,9 +1222,9 @@ public:
return new giant_eye_tentacleAI (creature);
}
- struct giant_eye_tentacleAI : public Scripted_NoMovementAI
+ struct giant_eye_tentacleAI : public ScriptedAI
{
- giant_eye_tentacleAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ giant_eye_tentacleAI(Creature* creature) : ScriptedAI(creature)
{
SetCombatMovement(false);
@@ -1251,7 +1255,7 @@ public:
DoZoneInCombat();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Check if we have a target
if (!UpdateVictim())
@@ -1282,9 +1286,9 @@ public:
return new flesh_tentacleAI (creature);
}
- struct flesh_tentacleAI : public Scripted_NoMovementAI
+ struct flesh_tentacleAI : public ScriptedAI
{
- flesh_tentacleAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ flesh_tentacleAI(Creature* creature) : ScriptedAI(creature)
{
SetCombatMovement(false);
}
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp
index 80fdc111911..de941ec266f 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp
@@ -97,7 +97,7 @@ public:
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -137,9 +137,7 @@ public:
{
if (SpawnHatchlings_Timer <= diff)
{
- Unit* target = NULL;
- target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target && target->GetTypeId() == TYPEID_PLAYER)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
{
DoCast(target, SPELL_ROOT);
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp
index 5493e9d76b0..f8cf0917c37 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp
@@ -80,7 +80,7 @@ public:
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp
index 53242d4cdc6..9b095b0100a 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp
@@ -78,7 +78,7 @@ public:
DoCast(me->getVictim(), SPELL_BIRTH);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp
index 3915a7655c5..d4bb5416a4e 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp
@@ -98,7 +98,7 @@ public:
Talk(SAY_SLAY);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -225,7 +225,7 @@ public:
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
index 1186459218c..79bc0c5accf 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
@@ -68,7 +68,7 @@ class boss_skeram : public CreatureScript
{
Talk(SAY_SLAY);
}
-
+
void EnterEvadeMode()
{
ScriptedAI::EnterEvadeMode();
@@ -93,10 +93,10 @@ class boss_skeram : public CreatureScript
rand = urand(0, 2);
creature->CastSpell(creature, BlinkSpells[rand]);
_flag |= (1 << rand);
-
+
if (_flag & (1 << 7))
_flag = 0;
-
+
if (Unit* Target = SelectTarget(SELECT_TARGET_RANDOM))
creature->AI()->AttackStart(Target);
@@ -134,7 +134,7 @@ class boss_skeram : public CreatureScript
Talk(SAY_AGGRO);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -150,7 +150,7 @@ class boss_skeram : public CreatureScript
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(8000, 18000));
break;
case EVENT_FULLFILMENT:
- // TODO: For some weird reason boss does not cast this
+ /// @todo For some weird reason boss does not cast this
// Spell actually works, tested in duel
DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true), SPELL_TRUE_FULFILLMENT, true);
events.ScheduleEvent(EVENT_FULLFILMENT, urand(20000, 30000));
@@ -183,12 +183,12 @@ class boss_skeram : public CreatureScript
DoMeleeAttackIfReady();
}
}
-
+
private:
float _hpct;
uint8 _flag;
};
-
+
CreatureAI* GetAI(Creature* creature) const
{
return new boss_skeramAI(creature);
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp
index d623963e929..5f677eedcf1 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp
@@ -151,7 +151,7 @@ struct boss_twinemperorsAI : public ScriptedAI
Creature* pOtherBoss = GetOtherBoss();
if (pOtherBoss)
{
- // TODO: we should activate the other boss location so he can start attackning even if nobody
+ /// @todo we should activate the other boss location so he can start attackning even if nobody
// is near I dont know how to do that
ScriptedAI* otherAI = CAST_AI(ScriptedAI, pOtherBoss->AI());
if (!pOtherBoss->isInCombat())
@@ -429,7 +429,7 @@ public:
target->SetFullHealth();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -518,7 +518,7 @@ public:
target->SetFullHealth();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp
index fcbe3a84d62..ba93c3c2640 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp
@@ -81,8 +81,8 @@ enum MovePoints
ROOM_CENTER = 1
};
-Position const ViscidusCoord = { -7992.36f, 908.19f, -52.62f, 1.68f }; // TODO: Visci isn't in room middle
-float const RoomRadius = 40.0f; // TODO: Not sure if its correct
+Position const ViscidusCoord = { -7992.36f, 908.19f, -52.62f, 1.68f }; /// @todo Visci isn't in room middle
+float const RoomRadius = 40.0f; /// @todo Not sure if its correct
class boss_viscidus : public CreatureScript
{
@@ -194,7 +194,7 @@ class boss_viscidus : public CreatureScript
summons.DespawnAll();
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp
index 7189abcc4fa..a4a5e0d94be 100644
--- a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp
+++ b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp
@@ -208,7 +208,7 @@ public:
summoned->AI()->AttackStart(me);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (currentEvent != TYPE_NARALEX_PART3)
npc_escortAI::UpdateAI(diff);
diff --git a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp
index ee89c9b6cad..f3a74c620ae 100644
--- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp
+++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp
@@ -124,7 +124,7 @@ public:
me->setFaction(FACTION_FRIENDLY);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (postGossipStep>0 && postGossipStep<4)
{
@@ -182,7 +182,7 @@ public:
DoMeleeAttackIfReady();
}
- void DoAction(const int32 /*param*/)
+ void DoAction(int32 /*param*/)
{
postGossipStep=1;
Text_Timer = 0;
@@ -331,7 +331,7 @@ public:
instance->SetData(0, DONE);*/
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -370,13 +370,13 @@ public:
if (destroyingDoor)
{
instance->DoUseDoorOrButton(instance->GetData64(GO_END_DOOR));
- //TODO: leave the area...
+ /// @todo leave the area...
me->DespawnOrUnsummon();
};
}
}
- void DoAction(const int32 /*param*/)
+ void DoAction(int32 /*param*/)
{
DestroyDoor();
}
diff --git a/src/server/scripts/Kalimdor/boss_azuregos.cpp b/src/server/scripts/Kalimdor/boss_azuregos.cpp
index 4f37cacac02..dd202247aaa 100644
--- a/src/server/scripts/Kalimdor/boss_azuregos.cpp
+++ b/src/server/scripts/Kalimdor/boss_azuregos.cpp
@@ -81,7 +81,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Kalimdor/zone_ashenvale.cpp b/src/server/scripts/Kalimdor/zone_ashenvale.cpp
index 94c68a1d3ec..4d7ded57501 100644
--- a/src/server/scripts/Kalimdor/zone_ashenvale.cpp
+++ b/src/server/scripts/Kalimdor/zone_ashenvale.cpp
@@ -91,7 +91,7 @@ class npc_torek : public CreatureScript
Talk(SAY_PREPARE, player->GetGUID());
break;
case 19:
- //TODO: verify location and creatures amount.
+ /// @todo verify location and creatures amount.
me->SummonCreature(ENTRY_DURIEL, 1776.73f, -2049.06f, 109.83f, 1.54f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
me->SummonCreature(ENTRY_SILVERWING_SENTINEL, 1774.64f, -2049.41f, 109.83f, 1.40f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
me->SummonCreature(ENTRY_SILVERWING_WARRIOR, 1778.73f, -2049.50f, 109.83f, 1.67f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
@@ -124,7 +124,7 @@ class npc_torek : public CreatureScript
summoned->AI()->AttackStart(me);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
npc_escortAI::UpdateAI(diff);
@@ -154,7 +154,7 @@ class npc_torek : public CreatureScript
{
if (quest->GetQuestId() == QUEST_TOREK_ASSULT)
{
- //TODO: find companions, make them follow Torek, at any time (possibly done by core/database in future?)
+ /// @todo find companions, make them follow Torek, at any time (possibly done by core/database in future?)
creature->AI()->Talk(SAY_READY, player->GetGUID());
creature->setFaction(113);
@@ -242,7 +242,7 @@ class npc_ruul_snowhoof : public CreatureScript
summoned->AI()->AttackStart(me);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
@@ -411,7 +411,7 @@ class npc_muglash : public CreatureScript
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
diff --git a/src/server/scripts/Kalimdor/zone_azshara.cpp b/src/server/scripts/Kalimdor/zone_azshara.cpp
index 44f7e1e8172..40af9e522ea 100644
--- a/src/server/scripts/Kalimdor/zone_azshara.cpp
+++ b/src/server/scripts/Kalimdor/zone_azshara.cpp
@@ -78,7 +78,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
// we mustn't remove the Creature in the same round in which we cast the summon spell, otherwise there will be no summons
if (spellhit && morphtimer >= 5000)
@@ -99,7 +99,7 @@ public:
if (!UpdateVictim())
return;
- //TODO: add abilities for the different creatures
+ /// @todo add abilities for the different creatures
DoMeleeAttackIfReady();
}
};
@@ -332,7 +332,7 @@ public:
Reached = false;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (MustDie)
{
@@ -485,7 +485,7 @@ public:
WeMustDieTimer = 1000;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (WeMustDie)
{
diff --git a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
index 4b03cd65cad..5b6993dfef0 100644
--- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
+++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
@@ -39,6 +39,7 @@ EndContentData */
#include "ScriptedGossip.h"
#include "Cell.h"
#include "CellImpl.h"
+#include "GridNotifiersImpl.h"
#include "GridNotifiers.h"
/*######
@@ -124,7 +125,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (SayThanksTimer)
{
@@ -254,7 +255,7 @@ public:
Talk(ATTACK_YELL, who->GetGUID());
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!me->isInCombat() && !IsTreeEvent)
{
@@ -321,7 +322,7 @@ public:
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 /*diff*/) {}
+ void UpdateAI(uint32 /*diff*/) {}
};
};
@@ -555,7 +556,7 @@ public:
sLog->outError(LOG_FILTER_TSCR, "SD2 ERROR: FlagList is empty!");
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (SayTimer <= diff)
{
@@ -626,7 +627,7 @@ public:
me->SetReactState(REACT_PASSIVE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -712,7 +713,7 @@ class npc_stillpine_capitive : public CreatureScript
_events.ScheduleEvent(EVENT_DESPAWN, 3500);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!_movementComplete)
return;
diff --git a/src/server/scripts/Kalimdor/zone_darkshore.cpp b/src/server/scripts/Kalimdor/zone_darkshore.cpp
index 09f061148d3..c7115a9098b 100644
--- a/src/server/scripts/Kalimdor/zone_darkshore.cpp
+++ b/src/server/scripts/Kalimdor/zone_darkshore.cpp
@@ -57,7 +57,7 @@ enum Kerlonian
FACTION_KER_ESCORTEE = 113
};
-//TODO: make concept similar as "ringo" -escort. Find a way to run the scripted attacks, _if_ player are choosing road.
+/// @todo make concept similar as "ringo" -escort. Find a way to run the scripted attacks, _if_ player are choosing road.
class npc_kerlonian : public CreatureScript
{
public:
@@ -143,7 +143,7 @@ public:
SetFollowPaused(false);
}
- void UpdateFollowerAI(const uint32 Diff)
+ void UpdateFollowerAI(uint32 Diff)
{
if (!UpdateVictim())
{
diff --git a/src/server/scripts/Kalimdor/zone_desolace.cpp b/src/server/scripts/Kalimdor/zone_desolace.cpp
index 8f55bb6102c..b21cb28e0d5 100644
--- a/src/server/scripts/Kalimdor/zone_desolace.cpp
+++ b/src/server/scripts/Kalimdor/zone_desolace.cpp
@@ -39,7 +39,6 @@ EndContentData */
enum DyingKodo
{
- // signed for 9999
SAY_SMEED_HOME = 0,
QUEST_KODO = 5561,
@@ -51,7 +50,7 @@ enum DyingKodo
NPC_TAMED_KODO = 11627,
SPELL_KODO_KOMBO_ITEM = 18153,
- SPELL_KODO_KOMBO_PLAYER_BUFF = 18172, //spells here have unclear function, but using them at least for visual parts and checks
+ SPELL_KODO_KOMBO_PLAYER_BUFF = 18172,
SPELL_KODO_KOMBO_DESPAWN_BUFF = 18377,
SPELL_KODO_KOMBO_GOSSIP = 18362
@@ -66,111 +65,56 @@ public:
{
if (player->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) && creature->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF))
{
- //the expected quest objective
- player->TalkedToCreature(creature->GetEntry(), creature->GetGUID());
-
+ player->TalkedToCreature(creature->GetEntry(), 0);
player->RemoveAurasDueToSpell(SPELL_KODO_KOMBO_PLAYER_BUFF);
- creature->GetMotionMaster()->MoveIdle();
}
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
return true;
}
- bool EffectDummyCreature(Unit* pCaster, uint32 spellId, uint32 effIndex, Creature* creatureTarget)
- {
- //always check spellid and effectindex
- if (spellId == SPELL_KODO_KOMBO_ITEM && effIndex == 0)
- {
- //no effect if player/creature already have aura from spells
- if (pCaster->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) || creatureTarget->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF))
- return true;
-
- if (creatureTarget->GetEntry() == NPC_AGED_KODO ||
- creatureTarget->GetEntry() == NPC_DYING_KODO ||
- creatureTarget->GetEntry() == NPC_ANCIENT_KODO)
- {
- pCaster->CastSpell(pCaster, SPELL_KODO_KOMBO_PLAYER_BUFF, true);
-
- creatureTarget->UpdateEntry(NPC_TAMED_KODO);
- creatureTarget->CastSpell(creatureTarget, SPELL_KODO_KOMBO_DESPAWN_BUFF, false);
-
- if (creatureTarget->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE)
- creatureTarget->GetMotionMaster()->MoveIdle();
-
- creatureTarget->GetMotionMaster()->MoveFollow(pCaster, PET_FOLLOW_DIST, creatureTarget->GetFollowAngle());
- }
-
- //always return true when we are handling this spell and effect
- return true;
- }
- return false;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_aged_dying_ancient_kodoAI(creature);
- }
-
struct npc_aged_dying_ancient_kodoAI : public ScriptedAI
{
- npc_aged_dying_ancient_kodoAI(Creature* creature) : ScriptedAI(creature) { Reset(); }
-
- uint32 DespawnTimer;
+ npc_aged_dying_ancient_kodoAI(Creature* creature) : ScriptedAI(creature) {}
- void Reset()
+ void MoveInLineOfSight(Unit* who)
{
- DespawnTimer = 0;
+ if (who->GetEntry() == NPC_SMEED && me->IsWithinDistInMap(who, 10.0f) && !me->HasAura(SPELL_KODO_KOMBO_GOSSIP))
+ {
+ me->GetMotionMaster()->Clear();
+ DoCast(me, SPELL_KODO_KOMBO_GOSSIP, true);
+ if (Creature* smeed = who->ToCreature())
+ smeed->AI()->Talk(SAY_SMEED_HOME);
+ }
}
- void MoveInLineOfSight(Unit* who)
+ void SpellHit(Unit* caster, SpellInfo const* spell)
{
- if (who->GetEntry() == NPC_SMEED)
+ if (spell->Id == SPELL_KODO_KOMBO_ITEM)
{
- if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
- return;
-
- if (me->IsWithinDistInMap(who, 10.0f))
+ if (!(caster->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) || me->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF))
+ && (me->GetEntry() == NPC_AGED_KODO || me->GetEntry() == NPC_DYING_KODO || me->GetEntry() == NPC_ANCIENT_KODO))
{
- if (Creature* talker = who->ToCreature())
- talker->AI()->Talk(SAY_SMEED_HOME);
+ caster->CastSpell(caster, SPELL_KODO_KOMBO_PLAYER_BUFF, true);
+ DoCast(me, SPELL_KODO_KOMBO_DESPAWN_BUFF, true);
- //spell have no implemented effect (dummy), so useful to notify spellHit
- DoCast(me, SPELL_KODO_KOMBO_GOSSIP, true);
+ me->UpdateEntry(NPC_TAMED_KODO);
+ me->GetMotionMaster()->MoveFollow(caster, PET_FOLLOW_DIST, me->GetFollowAngle());
}
}
- }
-
- void SpellHit(Unit* /*pCaster*/, SpellInfo const* pSpell)
- {
- if (pSpell->Id == SPELL_KODO_KOMBO_GOSSIP)
+ else if (spell->Id == SPELL_KODO_KOMBO_GOSSIP)
{
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- DespawnTimer = 60000;
+ me->DespawnOrUnsummon(60000);
}
}
-
- void UpdateAI(const uint32 diff)
- {
- //timer should always be == 0 unless we already updated entry of creature. Then not expect this updated to ever be in combat.
- if (DespawnTimer && DespawnTimer <= diff)
- {
- if (!me->getVictim() && me->isAlive())
- {
- Reset();
- me->setDeathState(JUST_DIED);
- me->Respawn();
- return;
- }
- } else DespawnTimer -= diff;
-
- if (!UpdateVictim())
- return;
-
- DoMeleeAttackIfReady();
- }
};
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_aged_dying_ancient_kodoAI(creature);
+ }
+
};
/*######
@@ -261,7 +205,7 @@ public:
return;
}
- void UpdateAI(const uint32 Diff)
+ void UpdateAI(uint32 Diff)
{
npc_escortAI::UpdateAI(Diff);
if (!UpdateVictim())
diff --git a/src/server/scripts/Kalimdor/zone_durotar.cpp b/src/server/scripts/Kalimdor/zone_durotar.cpp
index fa6b830c1ae..7bb59e9828b 100644
--- a/src/server/scripts/Kalimdor/zone_durotar.cpp
+++ b/src/server/scripts/Kalimdor/zone_durotar.cpp
@@ -84,7 +84,7 @@ public:
}
}
- void UpdateAI(const uint32 Diff)
+ void UpdateAI(uint32 Diff)
{
if (work == true)
me->HandleEmoteCommand(EMOTE_ONESHOT_WORK_CHOPWOOD);
@@ -175,14 +175,15 @@ class npc_tiger_matriarch_credit : public CreatureScript
public:
npc_tiger_matriarch_credit() : CreatureScript("npc_tiger_matriarch_credit") { }
- struct npc_tiger_matriarch_creditAI : public Scripted_NoMovementAI
+ struct npc_tiger_matriarch_creditAI : public ScriptedAI
{
- npc_tiger_matriarch_creditAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_tiger_matriarch_creditAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
events.ScheduleEvent(EVENT_CHECK_SUMMON_AURA, 2000);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
events.Update(diff);
@@ -294,7 +295,7 @@ class npc_tiger_matriarch : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -341,7 +342,7 @@ class npc_tiger_matriarch : public CreatureScript
};
// These models was found in sniff.
-// TODO: generalize these models with race from dbc
+/// @todo generalize these models with race from dbc
uint32 const trollmodel[] =
{11665, 11734, 11750, 12037, 12038, 12042, 12049, 12849, 13529, 14759, 15570, 15701,
15702, 1882, 1897, 1976, 2025, 27286, 2734, 2735, 4084, 4085, 4087, 4089, 4231, 4357,
diff --git a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
index 37941227c78..0e858c20d26 100644
--- a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
+++ b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
@@ -95,7 +95,7 @@ class mobs_risen_husk_spirit : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -204,7 +204,7 @@ public:
Step = 0;
}
- void UpdateAI(const uint32 Diff)
+ void UpdateAI(uint32 Diff)
{
if (!me->HasAura(SPELL_PROPAGANDIZED))
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
@@ -336,7 +336,7 @@ enum Hendel
NPC_TERVOSH = 4967
};
-//TODO: develop this further, end event not created
+/// @todo develop this further, end event not created
class npc_private_hendel : public CreatureScript
{
public:
@@ -458,7 +458,7 @@ public:
Talk(SAY_ZELFRAX2);
}
- void UpdateAI(uint32 const /*Diff*/)
+ void UpdateAI(uint32 /*Diff*/)
{
if (!UpdateVictim())
return;
@@ -583,7 +583,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
diff --git a/src/server/scripts/Kalimdor/zone_feralas.cpp b/src/server/scripts/Kalimdor/zone_feralas.cpp
index b2326de86ab..2d5b383cefc 100644
--- a/src/server/scripts/Kalimdor/zone_feralas.cpp
+++ b/src/server/scripts/Kalimdor/zone_feralas.cpp
@@ -221,7 +221,10 @@ class spell_gordunni_trap : public SpellScriptLoader
{
if (Unit* caster = GetCaster())
if (GameObject* chest = caster->SummonGameObject(GO_GORDUNNI_DIRT_MOUND, caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0))
+ {
chest->SetSpellId(GetSpellInfo()->Id);
+ caster->RemoveGameObject(chest, false);
+ }
}
void Register()
diff --git a/src/server/scripts/Kalimdor/zone_moonglade.cpp b/src/server/scripts/Kalimdor/zone_moonglade.cpp
index e41ffae03e6..b6a0c1e9d1e 100644
--- a/src/server/scripts/Kalimdor/zone_moonglade.cpp
+++ b/src/server/scripts/Kalimdor/zone_moonglade.cpp
@@ -37,9 +37,10 @@ EndContentData */
#include "ScriptedGossip.h"
#include "Player.h"
#include "SpellInfo.h"
+#include "GridNotifiers.h"
+#include "GridNotifiersImpl.h"
#include "Cell.h"
#include "CellImpl.h"
-#include "GridNotifiers.h"
/*######
## npc_bunthen_plainswind
@@ -383,7 +384,7 @@ public:
return;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
npc_escortAI::UpdateAI(diff);
@@ -630,7 +631,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -677,7 +678,7 @@ public:
events.ScheduleEvent(EVENT_DESPAWN, 5*MINUTE*IN_MILLISECONDS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
events.Update(diff);
diff --git a/src/server/scripts/Kalimdor/zone_mulgore.cpp b/src/server/scripts/Kalimdor/zone_mulgore.cpp
index aca55284b67..b81b8eb9eb7 100644
--- a/src/server/scripts/Kalimdor/zone_mulgore.cpp
+++ b/src/server/scripts/Kalimdor/zone_mulgore.cpp
@@ -147,7 +147,7 @@ public:
IsMovingToLunch = false;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (EventActive)
{
@@ -303,7 +303,7 @@ public:
}
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (newWaypoint)
{
diff --git a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
index 42ef9843a4e..bae229b1161 100644
--- a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
+++ b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
@@ -83,7 +83,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (CanEmote)
{
@@ -149,7 +149,7 @@ enum ThrallWarchief
#define GOSSIP_STW5 "I live only to serve, Warchief! My life is empty and meaningless without your guidance."
#define GOSSIP_STW6 "Of course, Warchief!"
-//TODO: verify abilities/timers
+/// @todo verify abilities/timers
class npc_thrall_warchief : public CreatureScript
{
public:
@@ -224,7 +224,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp
index 58665224bdd..70e7f731fc4 100644
--- a/src/server/scripts/Kalimdor/zone_silithus.cpp
+++ b/src/server/scripts/Kalimdor/zone_silithus.cpp
@@ -544,7 +544,7 @@ public:
switch (AnimationCount)
{
case 0:
- Talk(ANACHRONOS_SAY_1,Fandral->GetGUID());
+ Talk(ANACHRONOS_SAY_1, Fandral->GetGUID());
break;
case 1:
Fandral->SetTarget(me->GetGUID());
@@ -791,7 +791,7 @@ public:
}
++AnimationCount;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (AnimationTimer)
{
@@ -843,7 +843,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
void JustDied(Unit* /*slayer*/);
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!Timers)
{
@@ -1045,7 +1045,7 @@ public:
Announced = false;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!PlayerGUID || !EventStarted)
return;
diff --git a/src/server/scripts/Kalimdor/zone_tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp
index 0648e40416d..9d257790ab8 100644
--- a/src/server/scripts/Kalimdor/zone_tanaris.cpp
+++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp
@@ -104,7 +104,7 @@ public:
Talk(AGGRO_YELL_AQUE, who->GetGUID());
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (isFriendly)
{
@@ -270,7 +270,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
void Reset() {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
@@ -603,7 +603,7 @@ public:
SetFollowComplete();
}
- void UpdateFollowerAI(const uint32 Diff)
+ void UpdateFollowerAI(uint32 Diff)
{
if (!UpdateVictim())
{
diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp
index 8f7ab09260b..ff52af97c11 100644
--- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp
+++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp
@@ -146,7 +146,7 @@ public:
Talk(SAY_GIL_FREEBOOTERS, player->GetGUID());
break;
case 37:
- Talk(SAY_GIL_ALMOST,player->GetGUID());
+ Talk(SAY_GIL_ALMOST, player->GetGUID());
break;
case 47:
Talk(SAY_GIL_SWEET, player->GetGUID());
@@ -278,7 +278,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (IsFriend)
{
@@ -397,7 +397,7 @@ public:
void KilledUnit(Unit* /*victim*/) { }
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (EventInProgress) {
Player* pWarrior = NULL;
diff --git a/src/server/scripts/Kalimdor/zone_thousand_needles.cpp b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp
index 9c47991a5d5..02e64421ecb 100644
--- a/src/server/scripts/Kalimdor/zone_thousand_needles.cpp
+++ b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp
@@ -368,7 +368,7 @@ public:
}
}
- void UpdateAI(const uint32 Diff)
+ void UpdateAI(uint32 Diff)
{
if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
{
@@ -441,7 +441,7 @@ public:
me->SetReactState(REACT_PASSIVE);
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
index 0d915dc7c44..c949a551118 100644
--- a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
+++ b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
@@ -42,7 +42,7 @@ enum CairneBloodhoof
};
#define GOSSIP_HCB "I know this is rather silly but a young ward who is a bit shy would like your hoofprint."
-//TODO: verify abilities/timers
+/// @todo verify abilities/timers
class npc_cairne_bloodhoof : public CreatureScript
{
public:
@@ -98,15 +98,14 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
if (BerserkerChargeTimer <= diff)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_BERSERKER_CHARGE);
BerserkerChargeTimer = 25000;
} else BerserkerChargeTimer -= diff;
diff --git a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp
index e72c82bee97..9c89ad6d53a 100644
--- a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp
+++ b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp
@@ -126,7 +126,7 @@ public:
player->FailQuest(QUEST_CHASING_AME);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
npc_escortAI::UpdateAI(diff);
if (!UpdateVictim())
@@ -261,7 +261,7 @@ public:
SetFollowPaused(false);
}
- void UpdateFollowerAI(const uint32 Diff)
+ void UpdateFollowerAI(uint32 Diff)
{
if (!UpdateVictim())
{
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp
index 02245c92efd..24335c0e469 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp
@@ -89,11 +89,11 @@ public:
{
_EnterCombat();
- events.ScheduleEvent(EVENT_ROOT, urand(5,9)*IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_BASH, urand(10,14)*IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_BOLT, urand(15,20)*IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_MINI, urand(12,18)*IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_SPAWN, 5 *IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_ROOT, urand(5, 9) * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_BASH, urand(10, 14) * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_BOLT, urand(15, 20) * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_MINI, urand(12, 18) * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SPAWN, 5 * IN_MILLISECONDS);
me->SetInCombatWithZone();
if (instance)
@@ -123,13 +123,13 @@ public:
{
u = 1 - u;
trigger->DisappearAndDie();
- me->SummonCreature(u > 0 ? NPC_POISONOUS_MUSHROOM : NPC_HEALTHY_MUSHROOM, pos, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60*IN_MILLISECONDS);
+ me->SummonCreature(u > 0 ? NPC_POISONOUS_MUSHROOM : NPC_HEALTHY_MUSHROOM, pos, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60 * IN_MILLISECONDS);
}
}
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -145,23 +145,23 @@ public:
{
case EVENT_SPAWN:
SpawnAdds();
- events.ScheduleEvent(EVENT_SPAWN, 20*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SPAWN, 20 * IN_MILLISECONDS);
break;
case EVENT_MINI:
DoCast(SPELL_MINI);
- events.ScheduleEvent(EVENT_MINI, urand(25,30)*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_MINI, urand(25, 30) * IN_MILLISECONDS);
break;
case EVENT_ROOT:
- DoCast(SelectTarget(SELECT_TARGET_RANDOM,0, 100, true),SPELL_ENTANGLING_ROOTS,true);
- events.ScheduleEvent(EVENT_ROOT, urand(10,15)*IN_MILLISECONDS);
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_ENTANGLING_ROOTS, true);
+ events.ScheduleEvent(EVENT_ROOT, urand(10, 15) * IN_MILLISECONDS);
break;
case EVENT_BASH:
DoCastVictim(SPELL_BASH);
- events.ScheduleEvent(EVENT_BASH, urand(7,12)*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_BASH, urand(7, 12) * IN_MILLISECONDS);
break;
case EVENT_BOLT:
- DoCast(SelectTarget(SELECT_TARGET_RANDOM,0, 100, true),SPELL_VENOM_BOLT_VOLLEY,true);
- events.ScheduleEvent(EVENT_BOLT, urand(18,22)*IN_MILLISECONDS);
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_VENOM_BOLT_VOLLEY, true);
+ events.ScheduleEvent(EVENT_BOLT, urand(18, 22) * IN_MILLISECONDS);
break;
default:
break;
@@ -182,16 +182,16 @@ class mob_amanitar_mushrooms : public CreatureScript
public:
mob_amanitar_mushrooms() : CreatureScript("mob_amanitar_mushrooms") { }
- struct mob_amanitar_mushroomsAI : public Scripted_NoMovementAI
+ struct mob_amanitar_mushroomsAI : public ScriptedAI
{
- mob_amanitar_mushroomsAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ mob_amanitar_mushroomsAI(Creature* creature) : ScriptedAI(creature) {}
EventMap events;
void Reset()
{
events.Reset();
- events.ScheduleEvent(EVENT_AURA, 1*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_AURA, 1 * IN_MILLISECONDS);
me->SetDisplayId(me->GetCreatureTemplate()->Modelid2);
DoCast(SPELL_PUTRID_MUSHROOM);
@@ -211,7 +211,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
void AttackStart(Unit* /*victim*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -231,7 +231,7 @@ public:
DoCast(me, SPELL_POISONOUS_MUSHROOM_VISUAL_AREA, true);
DoCast(me, SPELL_POISONOUS_MUSHROOM_POISON_CLOUD);
}
- events.ScheduleEvent(EVENT_AURA, 7*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_AURA, 7 * IN_MILLISECONDS);
break;
default:
break;
@@ -250,4 +250,4 @@ void AddSC_boss_amanitar()
{
new boss_amanitar();
new mob_amanitar_mushrooms();
-} \ No newline at end of file
+}
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
index cd583603734..a9fad9c5451 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
@@ -94,13 +94,13 @@ class boss_elder_nadox : public CreatureScript
if (instance)
instance->SetData(DATA_ELDER_NADOX_EVENT, IN_PROGRESS);
- events.ScheduleEvent(EVENT_PLAGUE, 13*IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_SUMMON_SWARMER, 10*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_PLAGUE, 13 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SUMMON_SWARMER, 10 * IN_MILLISECONDS);
if (IsHeroic())
{
- events.ScheduleEvent(EVENT_RAGE, 12*IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_CHECK_ENRAGE, 5*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_RAGE, 12 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_CHECK_ENRAGE, 5 * IN_MILLISECONDS);
}
}
@@ -139,7 +139,7 @@ class boss_elder_nadox : public CreatureScript
instance->SetData(DATA_ELDER_NADOX_EVENT, DONE);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -151,25 +151,25 @@ class boss_elder_nadox : public CreatureScript
switch (eventId)
{
case EVENT_PLAGUE:
- DoCast(SelectTarget(SELECT_TARGET_RANDOM,0, 100, true),SPELL_BROOD_PLAGUE,true);
- events.ScheduleEvent(EVENT_PLAGUE, 15*IN_MILLISECONDS);
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_BROOD_PLAGUE, true);
+ events.ScheduleEvent(EVENT_PLAGUE, 15 * IN_MILLISECONDS);
break;
case EVENT_RAGE:
DoCast(H_SPELL_BROOD_RAGE);
- events.ScheduleEvent(EVENT_RAGE, urand(10*IN_MILLISECONDS, 50*IN_MILLISECONDS));
+ events.ScheduleEvent(EVENT_RAGE, urand(10 * IN_MILLISECONDS, 50 * IN_MILLISECONDS));
break;
case EVENT_SUMMON_SWARMER:
DoCast(me, SPELL_SUMMON_SWARMERS);
if (urand(1, 3) == 3) // 33% chance of dialog
Talk(SAY_EGG_SAC);
- events.ScheduleEvent(EVENT_SUMMON_SWARMER, 10*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SUMMON_SWARMER, 10 * IN_MILLISECONDS);
break;
case EVENT_CHECK_ENRAGE:
if (me->HasAura(SPELL_ENRAGE))
return;
if (me->GetPositionZ() < 24.0f)
DoCast(me, SPELL_ENRAGE, true);
- events.ScheduleEvent(EVENT_CHECK_ENRAGE, 5*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_CHECK_ENRAGE, 5 * IN_MILLISECONDS);
break;
default:
break;
@@ -209,7 +209,7 @@ class mob_ahnkahar_nerubian : public CreatureScript
if (me->GetEntry() == NPC_AHNKAHAR_GUARDIAN)
DoCast(me, SPELL_GUARDIAN_AURA, true);
- events.ScheduleEvent(EVENT_SPRINT, 13*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SPRINT, 13 * IN_MILLISECONDS);
}
void JustDied(Unit* /*killer*/)
@@ -218,7 +218,7 @@ class mob_ahnkahar_nerubian : public CreatureScript
me->RemoveAurasDueToSpell(SPELL_GUARDIAN_AURA);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -234,7 +234,7 @@ class mob_ahnkahar_nerubian : public CreatureScript
{
case EVENT_SPRINT:
DoCast(me, SPELL_SPRINT);
- events.ScheduleEvent(EVENT_SPRINT, 20*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SPRINT, 20 * IN_MILLISECONDS);
break;
}
}
@@ -254,9 +254,9 @@ class mob_nadox_eggs : public CreatureScript
public:
mob_nadox_eggs() : CreatureScript("mob_nadox_eggs") { }
- struct mob_nadox_eggsAI : public Scripted_NoMovementAI
+ struct mob_nadox_eggsAI : public ScriptedAI
{
- mob_nadox_eggsAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ mob_nadox_eggsAI(Creature* creature) : ScriptedAI(creature)
{
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
creature->UpdateAllStats();
@@ -266,7 +266,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
void AttackStart(Unit* /*victim*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 /*diff*/) {}
+ void UpdateAI(uint32 /*diff*/) {}
};
CreatureAI* GetAI(Creature* creature) const
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp
index 7f6709b34fa..82ac2e8387c 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp
@@ -258,7 +258,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -322,5 +322,5 @@ public:
void AddSC_boss_volazj()
{
- new boss_volazj;
+ new boss_volazj();
}
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp
index c36bcf9708f..e8b17224179 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp
@@ -150,7 +150,7 @@ public:
instance->SetData(DATA_JEDOGA_SHADOWSEEKER_EVENT, DONE);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_INITIAND_KILLED)
volunteerWork = false;
@@ -280,7 +280,7 @@ public:
bCanDown = true;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!instance)
return;
@@ -451,7 +451,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (instance && bCheckTimer <= diff)
{
@@ -523,15 +523,17 @@ class npc_jedogas_aufseher_trigger : public CreatureScript
public:
npc_jedogas_aufseher_trigger() : CreatureScript("npc_jedogas_aufseher_trigger") { }
- struct npc_jedogas_aufseher_triggerAI : public Scripted_NoMovementAI
+ struct npc_jedogas_aufseher_triggerAI : public ScriptedAI
{
- npc_jedogas_aufseher_triggerAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_jedogas_aufseher_triggerAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
bRemoved = false;
bRemoved2 = false;
bCasted = false;
bCasted2 = false;
+
+ SetCombatMovement(false);
}
InstanceScript* instance;
@@ -546,7 +548,7 @@ public:
void AttackStart(Unit* /*victim*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!instance)
return;
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
index 8f77cc7ec6f..a68cbcb7ee6 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
@@ -121,7 +121,7 @@ public:
Talk(SAY_AGGRO);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -370,7 +370,7 @@ public:
DoCast(me, SPELL_FLAME_SPHERE_DEATH_EFFECT);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (uiDespawnTimer <= diff)
me->DisappearAndDie();
@@ -424,7 +424,7 @@ public:
void AddSC_boss_taldaram()
{
- new boss_taldaram;
- new mob_taldaram_flamesphere;
- new prince_taldaram_sphere;
+ new boss_taldaram();
+ new mob_taldaram_flamesphere();
+ new prince_taldaram_sphere();
}
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
index db4959ae670..26a4aeeca01 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
@@ -336,5 +336,5 @@ public:
void AddSC_instance_ahnkahet()
{
- new instance_ahnkahet;
+ new instance_ahnkahet();
}
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
index 1442ff265f4..1ec61488c1b 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
@@ -168,7 +168,7 @@ public:
instance->SetData(DATA_ANUBARAK_EVENT, IN_PROGRESS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -360,5 +360,5 @@ public:
void AddSC_boss_anub_arak()
{
- new boss_anub_arak;
+ new boss_anub_arak();
}
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp
index 6c707a8388f..eec7959f56f 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp
@@ -134,7 +134,7 @@ public:
EnterEvadeMode();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -198,5 +198,5 @@ public:
void AddSC_boss_hadronox()
{
- new boss_hadronox;
+ new boss_hadronox();
}
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp
index aa329f12f6a..295f38658e2 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp
@@ -138,7 +138,7 @@ public:
me->SummonCreature(MOB_SKITTERING_SWARMER, SpawnPoint[7], TEMPSUMMON_TIMED_DESPAWN, 25*IN_MILLISECONDS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -239,7 +239,7 @@ public:
uiBackstabTimer = 7*IN_MILLISECONDS;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -290,7 +290,7 @@ public:
uiShadowNovaTimer = 15*IN_MILLISECONDS;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -336,7 +336,7 @@ public:
uiStrikeTimer = 6*IN_MILLISECONDS;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -386,7 +386,7 @@ public:
DoCast(me, SPELL_ENRAGE, true);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -434,7 +434,7 @@ public:
uiBindingWebsTimer = 17*IN_MILLISECONDS;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -488,7 +488,7 @@ public:
uiPoisonSprayTimer = 15*IN_MILLISECONDS;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
index 7873cadd096..875aafe9826 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
@@ -213,5 +213,5 @@ public:
void AddSC_instance_azjol_nerub()
{
- new instance_azjol_nerub;
+ new instance_azjol_nerub();
}
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
index f5864fe7b8f..bbec79ea43d 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
@@ -547,7 +547,7 @@ public:
(*itr)->CastSpell(target, SPELL_LAVA_STRIKE, true);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -954,7 +954,7 @@ struct dummy_dragonAI : public ScriptedAI
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (m_bCanMoveFree && m_uiMoveNextTimer)
{
@@ -1017,7 +1017,7 @@ public:
Talk(SAY_TENEBRON_SLAY);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//if no target, update dummy and return
if (!UpdateVictim())
@@ -1112,7 +1112,7 @@ public:
Talk(SAY_SHADRON_SLAY);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//if no target, update dummy and return
if (!UpdateVictim())
@@ -1210,7 +1210,7 @@ public:
Talk(SAY_VESPERON_SLAY);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//if no target, update dummy and return
if (!UpdateVictim())
@@ -1352,7 +1352,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (uiDespawnTimer < uiDiff)
{
@@ -1447,7 +1447,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (uiDespawnTimer < uiDiff)
{
@@ -1480,10 +1480,11 @@ public:
return new mob_twilight_eggsAI(creature);
}
- struct mob_twilight_eggsAI : public Scripted_NoMovementAI
+ struct mob_twilight_eggsAI : public ScriptedAI
{
- mob_twilight_eggsAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ mob_twilight_eggsAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
instance = creature->GetInstanceScript();
}
@@ -1518,7 +1519,7 @@ public:
who->SetInCombatWithZone();
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (m_uiHatchEggTimer <= uiDiff)
{
@@ -1572,7 +1573,7 @@ public:
entry = 0;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (Tsunami_Timer <= diff)
{
@@ -1602,11 +1603,11 @@ public:
return new npc_twilight_fissureAI(creature);
}
- struct npc_twilight_fissureAI : public Scripted_NoMovementAI
+ struct npc_twilight_fissureAI : public ScriptedAI
{
- npc_twilight_fissureAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_twilight_fissureAI(Creature* creature) : ScriptedAI(creature)
{
- Reset();
+ SetCombatMovement(false);
}
uint32 VoidBlast_Timer;
@@ -1620,7 +1621,7 @@ public:
VoidBlast_Timer = 5000;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (VoidBlast_Timer <= diff)
{
@@ -1667,7 +1668,7 @@ public:
m_uiFadeArmorTimer = 1000;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
index 205a0b10d69..d3a685bc6ba 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
@@ -61,9 +61,7 @@ enum Phases
{
PHASE_ALL = 0,
PHASE_INTRO = 1,
- PHASE_COMBAT = 2,
-
- PHASE_INTRO_MASK = 1 << PHASE_INTRO,
+ PHASE_COMBAT = 2
};
class boss_baltharus_the_warborn : public CreatureScript
@@ -87,7 +85,7 @@ class boss_baltharus_the_warborn : public CreatureScript
instance->SetData(DATA_BALTHARUS_SHARED_HEALTH, me->GetMaxHealth());
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -164,17 +162,18 @@ class boss_baltharus_the_warborn : public CreatureScript
instance->SetData(DATA_BALTHARUS_SHARED_HEALTH, me->GetHealth() - damage);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
- if (!UpdateVictim() && !(events.GetPhaseMask() & PHASE_INTRO_MASK))
+ bool introPhase = events.IsInPhase(PHASE_INTRO);
+ if (!UpdateVictim() && !introPhase)
return;
- if (!(events.GetPhaseMask() & PHASE_INTRO_MASK))
+ if (!introPhase)
me->SetHealth(instance->GetData(DATA_BALTHARUS_SHARED_HEALTH));
events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING) && !(events.GetPhaseMask() & PHASE_INTRO_MASK))
+ if (me->HasUnitState(UNIT_STATE_CASTING) && !introPhase)
return;
while (uint32 eventId = events.ExecuteEvent())
@@ -258,7 +257,7 @@ class npc_baltharus_the_warborn_clone : public CreatureScript
killer->Kill(baltharus);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
index ab53351cd6b..c616d44816c 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
@@ -135,13 +135,18 @@ class boss_general_zarithrian : public CreatureScript
Talk(SAY_KILL);
}
- void UpdateAI(uint32 const diff)
+ bool CanAIAttack(Unit const* /*target*/) const
+ {
+ return (instance->GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && instance->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE);
+ }
+
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
// Can't use room boundary here, the gameobject is spawned at the same position as the boss. This is just as good anyway.
- if (me->GetPositionX() > 3060.0f)
+ if (me->GetPositionX() > 3058.0f)
{
EnterEvadeMode();
return;
@@ -159,9 +164,11 @@ class boss_general_zarithrian : public CreatureScript
case EVENT_SUMMON_ADDS:
{
if (Creature* stalker1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_1)))
- stalker1->AI()->DoCast(stalker1, SPELL_SUMMON_FLAMECALLER);
+ stalker1->CastSpell(stalker1, SPELL_SUMMON_FLAMECALLER, false);
+
if (Creature* stalker2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ZARITHRIAN_SPAWN_STALKER_2)))
- stalker2->AI()->DoCast(stalker2, SPELL_SUMMON_FLAMECALLER);
+ stalker2->CastSpell(stalker2, SPELL_SUMMON_FLAMECALLER, false);
+
Talk(SAY_ADDS);
events.ScheduleEvent(EVENT_SUMMON_ADDS, 42000);
break;
@@ -195,9 +202,8 @@ class npc_onyx_flamecaller : public CreatureScript
struct npc_onyx_flamecallerAI : public npc_escortAI
{
- npc_onyx_flamecallerAI(Creature* creature) : npc_escortAI(creature)
+ npc_onyx_flamecallerAI(Creature* creature) : npc_escortAI(creature), _instance(creature->GetInstanceScript())
{
- _instance = creature->GetInstanceScript();
npc_escortAI::SetDespawnAtEnd(false);
}
@@ -289,7 +295,6 @@ class npc_onyx_flamecaller : public CreatureScript
}
private:
EventMap _events;
- bool _movementComplete;
InstanceScript* _instance;
uint8 _lavaGoutCount;
};
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
index 781dd86cb86..48bc162c82c 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
@@ -165,12 +165,7 @@ enum Phases
PHASE_INTRO = 1,
PHASE_ONE = 2,
PHASE_TWO = 3,
- PHASE_THREE = 4,
-
- PHASE_INTRO_MASK = 1 << PHASE_INTRO,
- PHASE_ONE_MASK = 1 << PHASE_ONE,
- PHASE_TWO_MASK = 1 << PHASE_TWO,
- PHASE_THREE_MASK = 1 << PHASE_THREE
+ PHASE_THREE = 4
};
enum Misc
@@ -226,9 +221,9 @@ struct generic_halionAI : public BossAI
{
generic_halionAI(Creature* creature, uint32 bossId) : BossAI(creature, bossId), _canEvade(false) { }
- void EnterCombat(Unit* who)
+ void EnterCombat(Unit* /*who*/)
{
- BossAI::EnterCombat(who);
+ _EnterCombat();
me->AddAura(SPELL_TWILIGHT_PRECISION, me);
_canEvade = false;
events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000));
@@ -239,16 +234,16 @@ struct generic_halionAI : public BossAI
void Reset()
{
_canEvade = false;
- BossAI::Reset();
+ _Reset();
}
- void EnterEvadeMode()
+ void JustReachedHome()
{
- BossAI::EnterEvadeMode();
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+ _JustReachedHome();
}
- void ExecuteEvent(uint32 const eventId)
+ void ExecuteEvent(uint32 eventId)
{
switch (eventId)
{
@@ -267,7 +262,7 @@ struct generic_halionAI : public BossAI
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING))
return;
@@ -325,7 +320,7 @@ class boss_halion : public CreatureScript
void EnterEvadeMode()
{
// Phase 1: We always can evade. Phase 2 & 3: We can evade if and only if the controller tells us to.
- if ((events.GetPhaseMask() & PHASE_ONE_MASK) || _canEvade)
+ if (events.IsInPhase(PHASE_ONE) || _canEvade)
generic_halionAI::EnterEvadeMode();
}
@@ -349,22 +344,27 @@ class boss_halion : public CreatureScript
controller->AI()->SetData(DATA_FIGHT_PHASE, PHASE_ONE);
}
- void JustDied(Unit* killer)
+ void JustDied(Unit* /*killer*/)
{
- BossAI::JustDied(killer);
+ _JustDied();
Talk(SAY_DEATH);
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+ if (Creature* twilightHalion = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_TWILIGHT_HALION)))
+ if (twilightHalion->isAlive())
+ twilightHalion->Kill(twilightHalion);
+
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HALION_CONTROLLER)))
- me->Kill(controller);
+ if (controller->isAlive())
+ controller->Kill(controller);
}
Position const* GetMeteorStrikePosition() const { return &_meteorStrikePos; }
void DamageTaken(Unit* attacker, uint32& damage)
{
- if (me->HealthBelowPctDamaged(75, damage) && (events.GetPhaseMask() & PHASE_ONE_MASK))
+ if (me->HealthBelowPctDamaged(75, damage) && events.IsInPhase(PHASE_ONE))
{
events.SetPhase(PHASE_TWO);
Talk(SAY_PHASE_TWO);
@@ -378,7 +378,7 @@ class boss_halion : public CreatureScript
return;
}
- if (events.GetPhaseMask() & PHASE_THREE_MASK)
+ if (events.IsInPhase(PHASE_THREE))
{
// Don't consider copied damage.
if (!me->InSamePhase(attacker))
@@ -389,15 +389,15 @@ class boss_halion : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
- if (events.GetPhaseMask() & PHASE_TWO_MASK)
+ if (events.IsInPhase(PHASE_TWO))
return;
generic_halionAI::UpdateAI(diff);
}
- void ExecuteEvent(uint32 const eventId)
+ void ExecuteEvent(uint32 eventId)
{
switch (eventId)
{
@@ -515,14 +515,15 @@ class boss_twilight_halion : public CreatureScript
}
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HALION_CONTROLLER)))
- controller->Kill(controller);
+ if (controller->isAlive())
+ controller->Kill(controller);
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
}
void DamageTaken(Unit* attacker, uint32& damage)
{
- if (me->HealthBelowPctDamaged(50, damage) && (events.GetPhaseMask() & PHASE_TWO_MASK))
+ if (me->HealthBelowPctDamaged(50, damage) && events.IsInPhase(PHASE_TWO))
{
events.SetPhase(PHASE_THREE);
me->CastStop();
@@ -531,7 +532,7 @@ class boss_twilight_halion : public CreatureScript
return;
}
- if (events.GetPhaseMask() & PHASE_THREE_MASK)
+ if (events.IsInPhase(PHASE_THREE))
{
// Don't consider copied damage.
if (!me->InSamePhase(attacker))
@@ -556,7 +557,7 @@ class boss_twilight_halion : public CreatureScript
}
}
- void ExecuteEvent(uint32 const eventId)
+ void ExecuteEvent(uint32 eventId)
{
switch (eventId)
{
@@ -592,7 +593,6 @@ class npc_halion_controller : public CreatureScript
_instance(creature->GetInstanceScript()), _summons(me)
{
me->SetPhaseMask(me->GetPhaseMask() | 0x20, true);
- _events.SetPhase(PHASE_INTRO);
}
void Reset()
@@ -641,7 +641,7 @@ class npc_halion_controller : public CreatureScript
_instance->SetBossState(DATA_HALION, FAIL);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -683,12 +683,12 @@ class npc_halion_controller : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
// The isInCombat() check is needed because that check should be false when Halion is
// not engaged, while it would return true without as UpdateVictim() checks for
// combat state.
- if (!(_events.GetPhaseMask() & PHASE_INTRO_MASK) && me->isInCombat() && !UpdateVictim())
+ if (!(_events.IsInPhase(PHASE_INTRO)) && me->isInCombat() && !UpdateVictim())
{
EnterEvadeMode();
return;
@@ -780,7 +780,7 @@ class npc_halion_controller : public CreatureScript
}
private:
- /// TODO: Find out a better scaling, if any.
+ //// @todo Find out a better scaling, if any.
// [0 , 0.98[: Corporeality goes down
// [0.98, 0.99]: Do nothing
// ]0.99, 1.01[: Twilight Mending
@@ -912,7 +912,7 @@ class npc_orb_carrier : public CreatureScript
ASSERT(creature->GetVehicleKit());
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
/// According to sniffs this spell is cast every 1 or 2 seconds.
/// However, refreshing it looks bad, so just cast the spell if
@@ -928,7 +928,7 @@ class npc_orb_carrier : public CreatureScript
me->SetFacingToObject(rotationFocus); // setInFront
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_SHOOT)
{
@@ -973,13 +973,15 @@ class npc_meteor_strike_initial : public CreatureScript
public:
npc_meteor_strike_initial() : CreatureScript("npc_meteor_strike_initial") { }
- struct npc_meteor_strike_initialAI : public Scripted_NoMovementAI
+ struct npc_meteor_strike_initialAI : public ScriptedAI
{
- npc_meteor_strike_initialAI(Creature* creature) : Scripted_NoMovementAI(creature),
+ npc_meteor_strike_initialAI(Creature* creature) : ScriptedAI(creature),
_instance(creature->GetInstanceScript())
- { }
+ {
+ SetCombatMovement(false);
+ }
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -1027,7 +1029,7 @@ class npc_meteor_strike_initial : public CreatureScript
}
}
- void UpdateAI(uint32 const /*diff*/) { }
+ void UpdateAI(uint32 /*diff*/) { }
void EnterEvadeMode() { }
private:
InstanceScript* _instance;
@@ -1045,16 +1047,18 @@ class npc_meteor_strike : public CreatureScript
public:
npc_meteor_strike() : CreatureScript("npc_meteor_strike") { }
- struct npc_meteor_strikeAI : public Scripted_NoMovementAI
+ struct npc_meteor_strikeAI : public ScriptedAI
{
- npc_meteor_strikeAI(Creature* creature) : Scripted_NoMovementAI(creature),
+ npc_meteor_strikeAI(Creature* creature) : ScriptedAI(creature),
_instance(creature->GetInstanceScript())
{
_range = 5.0f;
_spawnCount = 0;
+
+ SetCombatMovement(false);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_METEOR_STRIKE_BURN)
{
@@ -1071,7 +1075,7 @@ class npc_meteor_strike : public CreatureScript
controller->AI()->JustSummoned(me);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (_spawnCount > 5)
return;
@@ -1114,11 +1118,13 @@ class npc_combustion_consumption : public CreatureScript
public:
npc_combustion_consumption() : CreatureScript("npc_combustion_consumption") { }
- struct npc_combustion_consumptionAI : public Scripted_NoMovementAI
+ struct npc_combustion_consumptionAI : public ScriptedAI
{
- npc_combustion_consumptionAI(Creature* creature) : Scripted_NoMovementAI(creature),
+ npc_combustion_consumptionAI(Creature* creature) : ScriptedAI(creature),
_instance(creature->GetInstanceScript()), _summonerGuid(0)
{
+ SetCombatMovement(false);
+
switch (me->GetEntry())
{
case NPC_COMBUSTION:
@@ -1164,7 +1170,7 @@ class npc_combustion_consumption : public CreatureScript
summoner->CastCustomSpell(_explosionSpell, SPELLVALUE_BASE_POINT0, damage, summoner);
}
- void UpdateAI(uint32 const /*diff*/) { }
+ void UpdateAI(uint32 /*diff*/) { }
private:
InstanceScript* _instance;
@@ -1243,7 +1249,7 @@ class npc_living_ember : public CreatureScript
me->DespawnOrUnsummon(1);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING))
return;
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
index 06743858ec0..d391abb0d4d 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
@@ -141,7 +141,7 @@ class boss_saviana_ragefire : public CreatureScript
Talk(SAY_KILL);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp
index c373c2340ff..abfa2df5c97 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp
@@ -60,8 +60,11 @@ class instance_ruby_sanctum : public InstanceMapScript
void OnPlayerEnter(Player* /*player*/)
{
if (!GetData64(DATA_HALION_CONTROLLER) && GetBossState(DATA_HALION) != DONE && GetBossState(DATA_GENERAL_ZARITHRIAN) == DONE)
+ {
+ instance->LoadGrid(HalionControllerSpawnPos.GetPositionX(), HalionControllerSpawnPos.GetPositionY());
if (Creature* halionController = instance->SummonCreature(NPC_HALION_CONTROLLER, HalionControllerSpawnPos))
halionController->AI()->DoAction(ACTION_INTRO_HALION);
+ }
}
void OnCreatureCreate(Creature* creature)
@@ -164,6 +167,20 @@ class instance_ruby_sanctum : public InstanceMapScript
}
}
+ void OnUnitDeath(Unit* unit)
+ {
+ Creature* creature = unit->ToCreature();
+ if (!creature)
+ return;
+
+ if (creature->GetEntry() == NPC_GENERAL_ZARITHRIAN && GetBossState(DATA_HALION) != DONE)
+ {
+ instance->LoadGrid(HalionControllerSpawnPos.GetPositionX(), HalionControllerSpawnPos.GetPositionY());
+ if (Creature* halionController = instance->SummonCreature(NPC_HALION_CONTROLLER, HalionControllerSpawnPos))
+ halionController->AI()->DoAction(ACTION_INTRO_HALION);
+ }
+ }
+
uint64 GetData64(uint32 type) const
{
switch (type)
@@ -238,11 +255,6 @@ class instance_ruby_sanctum : public InstanceMapScript
{
if (GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE)
HandleGameObject(FlameWallsGUID, state != IN_PROGRESS);
-
- // Not called at instance loading, no big deal.
- if (state == DONE && GetBossState(DATA_HALION) != DONE)
- if (Creature* halionController = instance->SummonCreature(NPC_HALION_CONTROLLER, HalionControllerSpawnPos))
- halionController->AI()->DoAction(ACTION_INTRO_HALION);
break;
}
case DATA_HALION:
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp
index 5baae66e65b..2623b2c542a 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp
@@ -66,7 +66,7 @@ class npc_xerestrasza : public CreatureScript
me->RemoveFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_BALTHARUS_DEATH)
{
@@ -92,7 +92,7 @@ class npc_xerestrasza : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (_isIntro)
return;
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp
index fb0f0fbaee1..553b836da8f 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp
@@ -175,7 +175,7 @@ public:
me->DisappearAndDie();
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (bDone && uiResetTimer <= uiDiff)
{
@@ -299,7 +299,7 @@ public:
me->DisappearAndDie();
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (bDone && uiResetTimer <= uiDiff)
{
@@ -403,7 +403,7 @@ public:
uiWakingNightmare = 7000;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
@@ -545,7 +545,7 @@ public:
uiWaypoint = uiType;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp
index ceb9724a078..b253d15773d 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp
@@ -153,7 +153,7 @@ public:
summon->AI()->AttackStart(me->getVictim());
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -320,7 +320,7 @@ public:
uiAttackTimer = 3500;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
@@ -362,7 +362,7 @@ public:
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp
index 9299630b3d2..e637de75b4d 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp
@@ -233,7 +233,7 @@ public:
DoCast(me, SPELL_SHIELD, true);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
@@ -360,7 +360,7 @@ public:
bHome = false;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!bDone && GrandChampionsOutVehicle(me))
{
@@ -494,7 +494,7 @@ public:
bHome = false;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!bDone && GrandChampionsOutVehicle(me))
{
@@ -639,7 +639,7 @@ public:
bHome = false;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!bDone && GrandChampionsOutVehicle(me))
{
@@ -785,7 +785,7 @@ public:
bHome = false;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!bDone && GrandChampionsOutVehicle(me))
{
@@ -933,7 +933,7 @@ public:
bHome = false;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!bDone && GrandChampionsOutVehicle(me))
{
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp
index 7e4a740cb13..472048501a5 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp
@@ -412,7 +412,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
ScriptedAI::UpdateAI(uiDiff);
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
index e44f5fba1b8..9c6d481c207 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
@@ -154,9 +154,7 @@ enum Phases
{
// Anub'arak
PHASE_MELEE = 1,
- PHASE_SUBMERGED = 2,
-
- PHASE_MASK_MELEE = 1 << PHASE_MELEE
+ PHASE_SUBMERGED = 2
};
class boss_anubarak_trial : public CreatureScript
@@ -286,7 +284,7 @@ class boss_anubarak_trial : public CreatureScript
_sphereGUID[i] = summoned->GetGUID();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -403,7 +401,7 @@ class boss_anubarak_trial : public CreatureScript
}
- if (HealthBelowPct(30) && events.GetPhaseMask() & PHASE_MASK_MELEE && !_reachedPhase3)
+ if (HealthBelowPct(30) && events.IsInPhase(PHASE_MELEE) && !_reachedPhase3)
{
_reachedPhase3 = true;
DoCastAOE(SPELL_LEECHING_SWARM);
@@ -411,7 +409,7 @@ class boss_anubarak_trial : public CreatureScript
Talk(SAY_LEECHING_SWARM);
}
- if (events.GetPhaseMask() & PHASE_MASK_MELEE)
+ if (events.IsInPhase(PHASE_MELEE))
DoMeleeAttackIfReady();
}
@@ -453,7 +451,7 @@ class mob_swarm_scarab : public CreatureScript
Anubarak->AI()->JustSummoned(me);
}
- void DoAction(const int32 actionId)
+ void DoAction(int32 actionId)
{
switch (actionId)
{
@@ -471,7 +469,7 @@ class mob_swarm_scarab : public CreatureScript
DoCast(killer, RAID_MODE(SPELL_TRAITOR_KING_10, SPELL_TRAITOR_KING_25));
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (_instance && _instance->GetBossState(BOSS_ANUBARAK) != IN_PROGRESS)
me->DisappearAndDie();
@@ -527,7 +525,7 @@ class mob_nerubian_burrower : public CreatureScript
Anubarak->AI()->JustSummoned(me);
}
- void DoAction(const int32 actionId)
+ void DoAction(int32 actionId)
{
switch (actionId)
{
@@ -541,7 +539,7 @@ class mob_nerubian_burrower : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (_instance && _instance->GetBossState(BOSS_ANUBARAK) != IN_PROGRESS)
me->DisappearAndDie();
@@ -702,7 +700,7 @@ class mob_anubarak_spike : public CreatureScript
uiDamage = 0;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
{
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp
index ba554c3703d..f1bf0579187 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp
@@ -710,7 +710,7 @@ struct boss_faction_championsAI : public BossAI
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
_events.Update(diff);
@@ -773,7 +773,7 @@ class mob_toc_druid : public CreatureScript
SetEquipmentSlots(false, 51799, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -865,7 +865,7 @@ class mob_toc_shaman : public CreatureScript
SetEquipmentSlots(false, 49992, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -959,7 +959,7 @@ class mob_toc_paladin : public CreatureScript
SetEquipmentSlots(false, 50771, 47079, EQUIP_NO_CHANGE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1062,7 +1062,7 @@ class mob_toc_priest : public CreatureScript
SetEquipmentSlots(false, 49992, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1152,7 +1152,7 @@ class mob_toc_shadow_priest : public CreatureScript
DoCast(me, SPELL_SHADOWFORM);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1251,7 +1251,7 @@ class mob_toc_warlock : public CreatureScript
DoCast(SPELL_SUMMON_FELHUNTER);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1337,7 +1337,7 @@ class mob_toc_mage : public CreatureScript
SetEquipmentSlots(false, 47524, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1437,7 +1437,7 @@ class mob_toc_hunter : public CreatureScript
DoCast(SPELL_CALL_PET);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1534,7 +1534,7 @@ class mob_toc_boomkin : public CreatureScript
SetEquipmentSlots(false, 50966, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1629,7 +1629,7 @@ class mob_toc_warrior : public CreatureScript
SetEquipmentSlots(false, 47427, 46964, EQUIP_NO_CHANGE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1728,7 +1728,7 @@ class mob_toc_dk : public CreatureScript
SetEquipmentSlots(false, 47518, 51021, EQUIP_NO_CHANGE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1827,7 +1827,7 @@ class mob_toc_rogue : public CreatureScript
me->SetMaxPower(POWER_ENERGY, 100);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1967,7 +1967,7 @@ class mob_toc_enh_shaman : public CreatureScript
summons.DespawnAll();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -2062,7 +2062,7 @@ class mob_toc_retro_paladin : public CreatureScript
DoCast(SPELL_SEAL_OF_COMMAND);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -2155,7 +2155,7 @@ class mob_toc_pet_warlock : public CreatureScript
events.ScheduleEvent(EVENT_SPELL_LOCK, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS));
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -2206,7 +2206,7 @@ class mob_toc_pet_hunter : public CreatureScript
_clawTimer = urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp
index ac520968db8..74324d6c515 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp
@@ -18,8 +18,9 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
-#include "trial_of_the_crusader.h"
#include "SpellScript.h"
+#include "Player.h"
+#include "trial_of_the_crusader.h"
enum Yells
{
@@ -69,7 +70,6 @@ enum BossSpells
SPELL_FEL_INFERNO = 67047,
SPELL_FEL_STREAK = 66494,
SPELL_LORD_HITTIN = 66326, // special effect preventing more specific spells be cast on the same player within 10 seconds
- SPELL_MISTRESS_KISS_DEBUFF = 66334,
SPELL_MISTRESS_KISS_DAMAGE_SILENCE = 66359
};
@@ -149,7 +149,7 @@ class boss_jaraxxus : public CreatureScript
Talk(SAY_AGGRO);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -182,7 +182,7 @@ class boss_jaraxxus : public CreatureScript
events.ScheduleEvent(EVENT_INCINERATE_FLESH, urand(20*IN_MILLISECONDS, 25*IN_MILLISECONDS));
return;
case EVENT_NETHER_POWER:
- me->CastCustomSpell(SPELL_NETHER_POWER, SPELLVALUE_AURA_STACK, RAID_MODE<uint32>(5, 10, 5,10), me, true);
+ me->CastCustomSpell(SPELL_NETHER_POWER, SPELLVALUE_AURA_STACK, RAID_MODE<uint32>(5, 10, 5, 10), me, true);
events.ScheduleEvent(EVENT_NETHER_POWER, 40*IN_MILLISECONDS);
return;
case EVENT_LEGION_FLAME:
@@ -223,10 +223,11 @@ class mob_legion_flame : public CreatureScript
public:
mob_legion_flame() : CreatureScript("mob_legion_flame") { }
- struct mob_legion_flameAI : public Scripted_NoMovementAI
+ struct mob_legion_flameAI : public ScriptedAI
{
- mob_legion_flameAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ mob_legion_flameAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
_instance = creature->GetInstanceScript();
}
@@ -237,7 +238,7 @@ class mob_legion_flame : public CreatureScript
DoCast(SPELL_LEGION_FLAME_EFFECT);
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
UpdateVictim();
if (_instance && _instance->GetBossState(BOSS_JARAXXUS) != IN_PROGRESS)
@@ -258,10 +259,11 @@ class mob_infernal_volcano : public CreatureScript
public:
mob_infernal_volcano() : CreatureScript("mob_infernal_volcano") { }
- struct mob_infernal_volcanoAI : public Scripted_NoMovementAI
+ struct mob_infernal_volcanoAI : public ScriptedAI
{
- mob_infernal_volcanoAI(Creature* creature) : Scripted_NoMovementAI(creature), _summons(me)
+ mob_infernal_volcanoAI(Creature* creature) : ScriptedAI(creature), _summons(me)
{
+ SetCombatMovement(false);
}
void Reset()
@@ -294,7 +296,7 @@ class mob_infernal_volcano : public CreatureScript
me->DespawnOrUnsummon();
}
- void UpdateAI(uint32 const /*diff*/) {}
+ void UpdateAI(uint32 /*diff*/) {}
private:
SummonList _summons;
@@ -324,7 +326,7 @@ class mob_fel_infernal : public CreatureScript
me->SetInCombatWithZone();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (_instance && _instance->GetBossState(BOSS_JARAXXUS) != IN_PROGRESS)
{
@@ -398,7 +400,7 @@ class mob_nether_portal : public CreatureScript
me->DespawnOrUnsummon();
}
- void UpdateAI(uint32 const /*diff*/) {}
+ void UpdateAI(uint32 /*diff*/) {}
private:
SummonList _summons;
@@ -439,7 +441,7 @@ class mob_mistress_of_pain : public CreatureScript
_instance->SetData(DATA_MISTRESS_OF_PAIN_COUNT, DECREASE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (_instance && _instance->GetBossState(BOSS_JARAXXUS) != IN_PROGRESS)
{
@@ -533,6 +535,21 @@ class spell_mistress_kiss : public SpellScriptLoader
}
};
+class MistressKissTargetSelector
+{
+ public:
+ MistressKissTargetSelector() { }
+
+ bool operator()(WorldObject* unit) const
+ {
+ if (unit->GetTypeId() == TYPEID_PLAYER)
+ if (unit->ToPlayer()->getPowerType() == POWER_MANA)
+ return false;
+
+ return true;
+ }
+};
+
class spell_mistress_kiss_area : public SpellScriptLoader
{
public:
@@ -542,44 +559,27 @@ class spell_mistress_kiss_area : public SpellScriptLoader
{
PrepareSpellScript(spell_mistress_kiss_area_SpellScript)
- bool Load()
+ void FilterTargets(std::list<WorldObject*>& targets)
{
- if (GetCaster())
- if (sSpellMgr->GetSpellIdForDifficulty(SPELL_MISTRESS_KISS_DEBUFF, GetCaster()))
- return true;
- return false;
- }
+ // get a list of players with mana
+ targets.remove_if(MistressKissTargetSelector());
+ if (targets.empty())
+ return;
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
- Unit* target = GetHitUnit();
- if (caster && target)
- caster->CastSpell(target, SPELL_MISTRESS_KISS_DEBUFF, true);
+ WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
+ targets.clear();
+ targets.push_back(target);
}
- void FilterTargets(std::list<WorldObject*>& targets)
+ void HandleScript(SpellEffIndex /*effIndex*/)
{
- // get a list of players with mana
- std::list<WorldObject*> _targets;
- for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end(); ++itr)
- if ((*itr)->ToUnit()->getPowerType() == POWER_MANA)
- _targets.push_back(*itr);
-
- // pick a random target and kiss him
- if (WorldObject* _target = Trinity::Containers::SelectRandomContainerElement(_targets))
- {
- // correctly fill "targets" for the visual effect
- targets.clear();
- targets.push_back(_target);
- if (Unit* caster = GetCaster())
- caster->CastSpell(_target->ToUnit(), SPELL_MISTRESS_KISS_DEBUFF, true);
- }
+ GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true);
}
void Register()
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mistress_kiss_area_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnEffectHitTarget += SpellEffectFn(spell_mistress_kiss_area_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
index 03a305356c4..c39b8403474 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
@@ -146,10 +146,7 @@ enum Phases
{
PHASE_MOBILE = 1,
PHASE_STATIONARY = 2,
- PHASE_SUBMERGED = 3,
-
- PHASE_MASK_MOBILE = 1 << PHASE_MOBILE,
- PHASE_MASK_STATIONARY = 1 << PHASE_STATIONARY
+ PHASE_SUBMERGED = 3
};
class boss_gormok : public CreatureScript
@@ -238,7 +235,7 @@ class boss_gormok : public CreatureScript
pSnobold->ToCreature()->DespawnOrUnsummon();
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -362,7 +359,7 @@ class mob_snobold_vassal : public CreatureScript
_instance->SetData(DATA_SNOBOLD_COUNT, DECREASE);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -377,7 +374,7 @@ class mob_snobold_vassal : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || _targetDied)
return;
@@ -484,7 +481,7 @@ class npc_firebomb : public CreatureScript
me->SetDisplayId(me->GetCreatureTemplate()->Modelid2);
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (_instance->GetData(TYPE_NORTHREND_BEASTS) != GORMOK_IN_PROGRESS)
me->DespawnOrUnsummon();
@@ -561,7 +558,7 @@ struct boss_jormungarAI : public BossAI
instance->SetData(TYPE_NORTHREND_BEASTS, SNAKES_IN_PROGRESS);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -624,9 +621,9 @@ struct boss_jormungarAI : public BossAI
return;
}
}
- if (events.GetPhaseMask() & PHASE_MASK_MOBILE)
+ if (events.IsInPhase(PHASE_MOBILE))
DoMeleeAttackIfReady();
- if (events.GetPhaseMask() & PHASE_MASK_STATIONARY)
+ if (events.IsInPhase(PHASE_STATIONARY))
DoSpellAttackIfReady(SpitSpell);
}
@@ -807,7 +804,7 @@ class mob_slime_pool : public CreatureScript
me->SetReactState(REACT_PASSIVE);
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!_cast)
{
@@ -975,7 +972,7 @@ class boss_icehowl : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
index 9b6f4a6a0da..b41e986741b 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
@@ -270,7 +270,7 @@ struct boss_twin_baseAI : public BossAI
DoCast(me, SurgeSpellId);
}
- void DoAction(const int32 action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -292,7 +292,7 @@ struct boss_twin_baseAI : public BossAI
me->UpdateDamagePhysical(mode ? OFF_ATTACK : BASE_ATTACK);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!instance || !UpdateVictim())
return;
@@ -594,7 +594,7 @@ class mob_unleashed_dark : public CreatureScript
{
mob_unleashed_darkAI(Creature* creature) : mob_unleashed_ballAI(creature) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (RangeCheckTimer < diff)
{
@@ -626,7 +626,7 @@ class mob_unleashed_light : public CreatureScript
{
mob_unleashed_lightAI(Creature* creature) : mob_unleashed_ballAI(creature) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (RangeCheckTimer < diff)
{
@@ -654,11 +654,11 @@ class mob_bullet_controller : public CreatureScript
public:
mob_bullet_controller() : CreatureScript("mob_bullet_controller") { }
- struct mob_bullet_controllerAI : public Scripted_NoMovementAI
+ struct mob_bullet_controllerAI : public ScriptedAI
{
- mob_bullet_controllerAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ mob_bullet_controllerAI(Creature* creature) : ScriptedAI(creature)
{
- Reset();
+ SetCombatMovement(false);
}
void Reset()
@@ -666,7 +666,7 @@ class mob_bullet_controller : public CreatureScript
DoCastAOE(SPELL_CONTROLLER_PERIODIC);
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
UpdateVictim();
}
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
index 8d2d9f8b4c1..172423187e1 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
@@ -263,6 +263,8 @@ class instance_trial_of_the_crusader : public InstanceMapScript
if (ResilienceWillFixItTimer > 0)
DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_CHAMPIONS_KILLED_IN_MINUTE);
DoRespawnGameObject(CrusadersCacheGUID, 7*DAY);
+ if (GameObject* cache = instance->GetGameObject(CrusadersCacheGUID))
+ cache->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
EventStage = 3100;
break;
default:
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
index 3e3fbf51cd0..a68ea1025d5 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
@@ -267,7 +267,7 @@ class boss_lich_king_toc : public CreatureScript
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!_instance)
return;
@@ -415,7 +415,7 @@ class npc_fizzlebang_toc : public CreatureScript
_summons.Summon(summoned);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!_instance)
return;
@@ -548,7 +548,7 @@ class npc_tirion_toc : public CreatureScript
void AttackStart(Unit* /*who*/) {}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!_instance)
return;
@@ -836,7 +836,7 @@ class npc_garrosh_toc : public CreatureScript
void AttackStart(Unit* /*who*/) {}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!_instance)
return;
@@ -920,7 +920,7 @@ class npc_varian_toc : public CreatureScript
void AttackStart(Unit* /*who*/) {}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!_instance)
return;
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h
index 70fe03c5e0f..f42c985d3e5 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h
@@ -136,8 +136,8 @@ const Position AnubarakLoc[]=
const Position EndSpawnLoc[]=
{
{648.9167f, 131.0208f, 141.6161f, 0}, // 0 - Highlord Tirion Fordring
- {649.1614f, 142.0399f, 141.3057f ,0}, // 1 - Argent Mage
- {644.6250f, 149.2743f, 140.6015f ,0} // 2 - Portal to Dalaran
+ {649.1614f, 142.0399f, 141.3057f, 0}, // 1 - Argent Mage
+ {644.6250f, 149.2743f, 140.6015f, 0} // 2 - Portal to Dalaran
};
enum euiWorldStates
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp
index 6cb970f6ab7..923f8a23d6f 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp
@@ -86,7 +86,7 @@ class boss_dred : public CreatureScript
instance->SetData(DATA_DRED_EVENT, IN_PROGRESS);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -148,7 +148,7 @@ class boss_dred : public CreatureScript
DoMeleeAttackIfReady();
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_RAPTOR_KILLED)
++raptorsKilled;
@@ -196,7 +196,7 @@ class npc_drakkari_gutripper : public CreatureScript
GutRipTimer = urand(10000, 15000);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -246,7 +246,7 @@ class npc_drakkari_scytheclaw : public CreatureScript
uiRendTimer = urand(10000, 15000);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
index e99128fbbf9..6eedfb357db 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
@@ -112,7 +112,7 @@ public:
DoStartNoMovement(target);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || _bubbled)
return;
@@ -141,7 +141,7 @@ public:
}
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_CRYSTAL_HANDLER_DIED)
CrystalHandlerDied();
@@ -279,7 +279,7 @@ public:
_temp = 0;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (_spell)
{
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp
index 1f30b805f8a..0ca7ccd196a 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp
@@ -107,7 +107,7 @@ public:
instance->SetData(DATA_THARON_JA_EVENT, IN_PROGRESS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
index bcec5fc1547..3dcac3f68dc 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
@@ -16,7 +16,7 @@
*/
/*
- * Comment: TODO: spawn troll waves
+ * Comment: @todo spawn troll waves
*/
#include "ScriptMgr.h"
@@ -108,7 +108,7 @@ public:
instance->SetData(DATA_TROLLGORE_EVENT, IN_PROGRESS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
index 261eb854aa3..516a3e0f7c9 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
@@ -118,7 +118,7 @@ class boss_bronjahm : public CreatureScript
void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
{
- if (events.GetPhaseMask() & (1 << PHASE_1) && !HealthAbovePct(30))
+ if (events.IsInPhase(PHASE_1) && !HealthAbovePct(30))
{
events.SetPhase(PHASE_2);
DoCast(me, SPELL_TELEPORT);
@@ -136,7 +136,7 @@ class boss_bronjahm : public CreatureScript
summon->CastSpell(summon, SPELL_PURPLE_BANISH_VISUAL, true);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp
index caf38fd2418..61a654ec2bb 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp
@@ -22,7 +22,7 @@
#include "SpellInfo.h"
/*
- * TODO:
+ * @todo
* - Fix model id during unleash soul -> seems DB issue 36503 is missing (likewise 36504 is also missing).
* - Fix outro npc movement
*/
@@ -109,7 +109,7 @@ struct outroPosition
{ { 0, 0 }, { 0.0f, 0.0f, 0.0f, 0.0f } }
};
-Position const CrucibleSummonPos = {5672.294f,2520.686f, 713.4386f, 0.9599311f};
+Position const CrucibleSummonPos = {5672.294f, 2520.686f, 713.4386f, 0.9599311f};
#define DATA_THREE_FACED 1
@@ -247,7 +247,7 @@ class boss_devourer_of_souls : public CreatureScript
return 0;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
// Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp
index b5d95dfb0f6..efc687eb409 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp
@@ -95,7 +95,7 @@ public:
phase = PHASE_NORMAL;
}
- void DoAction(const int32 actionId)
+ void DoAction(int32 actionId)
{
switch (actionId)
{
@@ -109,7 +109,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (phase == PHASE_INTRO)
{
@@ -221,7 +221,7 @@ public:
phase = PHASE_NORMAL;
}
- void DoAction(const int32 actionId)
+ void DoAction(int32 actionId)
{
switch (actionId)
{
@@ -235,7 +235,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (phase == PHASE_INTRO)
{
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp
index 2278bfe409a..58dc74d0f0a 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp
@@ -34,7 +34,7 @@ enum Spells
SPELL_IMPENDING_DESPAIR = 72426,
SPELL_DEFILING_HORROR = 72435,
SPELL_HOPELESSNESS = 72395,
- H_SPELL_HOPELESSNESS = 72390, // TODO: not in dbc. Add in DB.
+ H_SPELL_HOPELESSNESS = 72390, /// @todo not in dbc. Add in DB.
};
enum Events
@@ -79,7 +79,7 @@ public:
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 23000);
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 9000);
- events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(25000, 45000)); // TODO adjust timer.
+ events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(25000, 45000)); /// @todo adjust timer.
}
void JustDied(Unit* /*killer*/)
@@ -95,7 +95,7 @@ public:
Talk(SAY_SLAY);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
// Return since we have no target
if (!UpdateVictim())
@@ -122,7 +122,7 @@ public:
break;
case EVENT_DEFILING_HORROR:
DoCast(SPELL_DEFILING_HORROR);
- events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(25000, 45000)); // TODO adjust timer.
+ events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(25000, 45000)); /// @todo adjust timer.
break;
}
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp
index 1d7e405585f..08d5cf70ee1 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp
@@ -72,10 +72,10 @@ public:
if (instance)
instance->SetData(DATA_MARWYN_EVENT, IN_PROGRESS);
- events.ScheduleEvent(EVENT_OBLITERATE, 30000); // TODO Check timer
+ 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
+ events.ScheduleEvent(EVENT_SHARED_SUFFERING, 20000); /// @todo Check timer
}
void JustDied(Unit* /*killer*/)
@@ -91,7 +91,7 @@ public:
Talk(SAY_SLAY);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
// Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
index e0a2f90b082..b140801d8f1 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
@@ -233,7 +233,7 @@ public:
me->SetVisible(true);
}
- void DoAction(const int32 actionId)
+ void DoAction(int32 actionId)
{
switch (actionId)
{
@@ -246,7 +246,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
events.Update(diff);
switch (events.ExecuteEvent())
@@ -270,7 +270,7 @@ public:
events.ScheduleEvent(EVENT_INTRO_A2_3, 10000);
break;
case EVENT_INTRO_A2_3:
- // TODO: she's doing some kind of spell casting emote
+ /// @todo she's doing some kind of spell casting emote
instance->HandleGameObject(instance->GetData64(DATA_FROSTMOURNE), true);
events.ScheduleEvent(EVENT_INTRO_A2_4, 10000);
break;
@@ -367,7 +367,7 @@ public:
break;
case EVENT_INTRO_H2_3:
Talk(SAY_SYLVANAS_INTRO_3);
- // TODO: she's doing some kind of spell casting emote
+ /// @todo she's doing some kind of spell casting emote
events.ScheduleEvent(EVENT_INTRO_H2_4, 6000);
break;
case EVENT_INTRO_H2_4:
@@ -524,7 +524,7 @@ public:
Talk(SAY_SYLVANAS_INTRO_END);
me->GetMotionMaster()->MovePoint(0, LichKingSpawnPos);
- // TODO: Loralen/Koreln shall run also
+ /// @todo Loralen/Koreln shall run also
events.ScheduleEvent(EVENT_INTRO_END, 10000);
break;
@@ -537,7 +537,7 @@ public:
break;
case EVENT_SKIP_INTRO:
- // TODO: implement
+ /// @todo implement
if (Creature* pFalric = me->GetCreature(*me, instance->GetData64(DATA_FALRIC)))
pFalric->SetVisible(true);
@@ -545,7 +545,7 @@ public:
pMarwyn->SetVisible(true);
me->GetMotionMaster()->MovePoint(0, LichKingSpawnPos);
- // TODO: Loralen/Koreln shall run also
+ /// @todo Loralen/Koreln shall run also
events.ScheduleEvent(EVENT_INTRO_END, 15000);
break;
@@ -651,13 +651,13 @@ public:
void EnterCombat(Unit* /*who*/)
{
- events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 8000); // TODO: adjust timers
+ events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 8000); /// @todo adjust timers
events.ScheduleEvent(EVENT_CIRCLE_OF_DESTRUCTION, 12000);
events.ScheduleEvent(EVENT_COWER_IN_FEAR, 10000);
events.ScheduleEvent(EVENT_DARK_MENDING, 20000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -733,14 +733,14 @@ public:
void EnterCombat(Unit* /*who*/)
{
- events.ScheduleEvent(EVENT_FIREBALL, 3000); // TODO: adjust timers
+ events.ScheduleEvent(EVENT_FIREBALL, 3000); /// @todo adjust timers
events.ScheduleEvent(EVENT_FLAMESTRIKE, 6000);
events.ScheduleEvent(EVENT_FROSTBOLT, 9000);
events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 12000);
events.ScheduleEvent(EVENT_HALLUCINATION, 40000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -834,13 +834,13 @@ public:
void EnterCombat(Unit* /*who*/)
{
- events.ScheduleEvent(EVENT_SHADOW_STEP, 8000); // TODO: adjust timers
+ events.ScheduleEvent(EVENT_SHADOW_STEP, 8000); /// @todo adjust timers
events.ScheduleEvent(EVENT_DEADLY_POISON, 5000);
events.ScheduleEvent(EVENT_ENVENOMED_DAGGER_THROW, 10000);
events.ScheduleEvent(EVENT_KIDNEY_SHOT, 12000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -905,12 +905,12 @@ public:
void EnterCombat(Unit* /*who*/)
{
- events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000); // TODO: adjust timers
+ events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000); /// @todo adjust timers
events.ScheduleEvent(EVENT_SHIELD_BASH, 10000);
events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -970,13 +970,13 @@ public:
void EnterCombat(Unit* /*who*/)
{
- events.ScheduleEvent(EVENT_SHOOT, 2000); // TODO: adjust timers
+ events.ScheduleEvent(EVENT_SHOOT, 2000); /// @todo adjust timers
events.ScheduleEvent(EVENT_CURSED_ARROW, 10000);
events.ScheduleEvent(EVENT_FROST_TRAP, 1000);
events.ScheduleEvent(EVENT_ICE_SHOT, 15000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
index a8bd92cc070..2cab1cca214 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
@@ -102,7 +102,7 @@ struct boss_horAI : ScriptedAI
uiDamage = 0;
}
- void DoAction(const int32 actionID)
+ void DoAction(int32 actionID)
{
switch (actionID)
{
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
index 3b910c39e38..dde3f7acc67 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
@@ -182,7 +182,7 @@ public:
void OnGameObjectCreate(GameObject* go)
{
- // TODO: init state depending on encounters
+ /// @todo init state depending on encounters
switch (go->GetEntry())
{
case GO_FROSTMOURNE:
@@ -364,7 +364,7 @@ public:
DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, uiWaveCount);
HandleGameObject(uiFrontDoor, true);
- // TODO
+ /// @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))
@@ -385,7 +385,7 @@ public:
summoner->SetVisible(true);
- // TODO: do composition at random. # of spawn also depends on uiWaveCount
+ /// @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);
summoner->SummonCreature(NPC_WAVE_MERCENARY, MercenarySpawnPos[index], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0);
@@ -417,7 +417,7 @@ public:
AddWave();
break;
case EVENT_START_LICH_KING:
- // TODO
+ /// @todo
break;
}
}
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
index 160d45f5140..822adbb9201 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
@@ -52,11 +52,7 @@ enum Phases
{
PHASE_ONE = 1,
PHASE_TWO = 2,
- PHASE_THREE = 3,
-
- PHASE_ONE_MASK = 1 << PHASE_ONE,
- PHASE_TWO_MASK = 1 << PHASE_TWO,
- PHASE_THREE_MASK = 1 << PHASE_THREE,
+ PHASE_THREE = 3
};
enum MiscData
@@ -136,7 +132,7 @@ enum Events
void DamageTaken(Unit* /*attacker*/, uint32& /*uiDamage*/)
{
- if (events.GetPhaseMask() & PHASE_ONE_MASK && !HealthAbovePct(66))
+ if (events.IsInPhase(PHASE_ONE) && !HealthAbovePct(66))
{
events.SetPhase(PHASE_TWO);
Talk(SAY_PHASE2);
@@ -146,7 +142,7 @@ enum Events
return;
}
- if (events.GetPhaseMask() & PHASE_TWO_MASK && !HealthAbovePct(33))
+ if (events.IsInPhase(PHASE_TWO) && !HealthAbovePct(33))
{
events.SetPhase(PHASE_THREE);
Talk(SAY_PHASE3);
@@ -162,12 +158,12 @@ enum Events
if (type != EFFECT_MOTION_TYPE || id != POINT_FORGE)
return;
- if (events.GetPhaseMask() & PHASE_TWO_MASK)
+ if (events.IsInPhase(PHASE_TWO))
{
DoCast(me, SPELL_FORGE_BLADE);
SetEquipmentSlots(false, EQUIP_ID_SWORD);
}
- if (events.GetPhaseMask() & PHASE_THREE_MASK)
+ if (events.IsInPhase(PHASE_THREE))
{
me->RemoveAurasDueToSpell(SPELL_FORGE_BLADE_HELPER);
DoCast(me, SPELL_FORGE_MACE);
@@ -190,7 +186,7 @@ enum Events
return _permafrostStack;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -226,15 +222,15 @@ enum Events
break;
case EVENT_JUMP:
me->AttackStop();
- if (events.GetPhaseMask() & PHASE_TWO_MASK)
+ if (events.IsInPhase(PHASE_TWO))
me->GetMotionMaster()->MoveJump(northForgePos.GetPositionX(), northForgePos.GetPositionY(), northForgePos.GetPositionZ(), 25.0f, 15.0f);
- else if (events.GetPhaseMask() & PHASE_THREE_MASK)
+ else if (events.IsInPhase(PHASE_THREE))
me->GetMotionMaster()->MoveJump(southForgePos.GetPositionX(), southForgePos.GetPositionY(), southForgePos.GetPositionZ(), 25.0f, 15.0f);
break;
case EVENT_RESUME_ATTACK:
- if (events.GetPhaseMask() & PHASE_TWO_MASK)
+ if (events.IsInPhase(PHASE_THREE))
events.ScheduleEvent(EVENT_CHILLING_WAVE, 5000, 0, PHASE_TWO);
- else if (events.GetPhaseMask() & PHASE_THREE_MASK)
+ else if (events.IsInPhase(PHASE_THREE))
events.ScheduleEvent(EVENT_DEEP_FREEZE, 10000, 0, PHASE_THREE);
AttackStart(me->getVictim());
break;
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
index f657c8e19b5..31a1e94357e 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
@@ -203,7 +203,7 @@ class boss_ick : public CreatureScript
me->AddThreat(target, _tempThreat);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!me->isInCombat())
return;
@@ -338,7 +338,7 @@ class boss_krick : public CreatureScript
}
}
- void DoAction(const int32 actionId)
+ void DoAction(int32 actionId)
{
if (actionId == ACTION_OUTRO)
{
@@ -365,7 +365,7 @@ class boss_krick : public CreatureScript
_events.ScheduleEvent(EVENT_OUTRO_1, 1000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (_phase != PHASE_OUTRO)
return;
@@ -448,7 +448,7 @@ class boss_krick : public CreatureScript
break;
case EVENT_OUTRO_9:
Talk(SAY_KRICK_OUTRO_8);
- // TODO: Tyrannus starts killing Krick.
+ /// @todo Tyrannus starts killing Krick.
// there shall be some visual spell effect
if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _tyrannusGUID))
tyrannus->CastSpell(me, SPELL_NECROMANTIC_POWER, true); //not sure if it's the right spell :/
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
index 783cc266509..3d22bac4376 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
@@ -54,7 +54,7 @@ enum Yells
SAY_SYLVANAS_OUTRO_4 = 4
};
-enum Spelsl
+enum Spells
{
SPELL_OVERLORD_BRAND = 69172,
SPELL_OVERLORD_BRAND_HEAL = 69190,
@@ -94,7 +94,7 @@ enum Phases
PHASE_NONE = 0,
PHASE_INTRO = 1,
PHASE_COMBAT = 2,
- PHASE_OUTRO = 3,
+ PHASE_OUTRO = 3
};
enum Actions
@@ -168,7 +168,7 @@ class boss_tyrannus : public CreatureScript
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
return;
- if (victim && me->Attack(victim, true) && !(events.GetPhaseMask() & (1 << PHASE_INTRO)))
+ if (victim && me->Attack(victim, true) && !events.IsInPhase(PHASE_INTRO))
me->GetMotionMaster()->MoveChase(victim);
}
@@ -201,7 +201,7 @@ class boss_tyrannus : public CreatureScript
rimefang->AI()->DoAction(ACTION_END_COMBAT);
}
- void DoAction(const int32 actionId)
+ void DoAction(int32 actionId)
{
if (actionId == ACTION_START_INTRO)
{
@@ -215,9 +215,9 @@ class boss_tyrannus : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
- if (!UpdateVictim() && !(events.GetPhaseMask() & (1 << PHASE_INTRO)))
+ if (!UpdateVictim() && !events.IsInPhase(PHASE_INTRO))
return;
events.Update(diff);
@@ -313,7 +313,7 @@ class boss_rimefang : public CreatureScript
_vehicle->InstallAllAccessories(false);
}
- void DoAction(const int32 actionId)
+ void DoAction(int32 actionId)
{
if (actionId == ACTION_START_RIMEFANG)
{
@@ -335,9 +335,9 @@ class boss_rimefang : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
- if (!UpdateVictim() && !(_events.GetPhaseMask() & (1 << PHASE_COMBAT)))
+ if (!UpdateVictim() && !_events.IsInPhase(PHASE_COMBAT))
return;
_events.Update(diff);
@@ -409,7 +409,7 @@ class player_overlord_brandAI : public PlayerAI
me->CastCustomSpell(SPELL_OVERLORD_BRAND_HEAL, SPELLVALUE_BASE_POINT0, int32(addHealth*5.5f), tyrannus, true, NULL, NULL, tyrannus->GetGUID());
}
- void UpdateAI(const uint32 /*diff*/) { }
+ void UpdateAI(uint32 /*diff*/) { }
private:
Creature* tyrannus;
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp
index 246d389e0e7..42d912e2bd2 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp
@@ -60,7 +60,7 @@ class mob_ymirjar_flamebearer : public CreatureScript
_events.ScheduleEvent(EVENT_TACTICAL_BLINK, 15000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -125,7 +125,7 @@ class mob_iceborn_protodrake : public CreatureScript
_vehicle->RemoveAllPassengers();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -178,7 +178,7 @@ class mob_geist_ambusher : public CreatureScript
DoCast(who, SPELL_LEAPING_FACE_MAUL);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp
index 58301df4ca2..1ec29224763 100644
--- a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp
@@ -140,7 +140,7 @@ class boss_drakkari_colossus : public CreatureScript
instance->SetData(DATA_DRAKKARI_COLOSSUS_EVENT, FAIL);
}
- void DoAction(const int32 action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -148,6 +148,7 @@ class boss_drakkari_colossus : public CreatureScript
DoCast(SPELL_EMERGE);
break;
case ACTION_FREEZE_COLOSSUS:
+ me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MoveIdle();
me->SetReactState(REACT_PASSIVE);
@@ -207,7 +208,7 @@ class boss_drakkari_colossus : public CreatureScript
introDone = data;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -284,7 +285,7 @@ class boss_drakkari_elemental : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -310,7 +311,7 @@ class boss_drakkari_elemental : public CreatureScript
DoMeleeAttackIfReady();
}
- void DoAction(const int32 action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -465,7 +466,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp
index d169fb163b2..df949c7a962 100644
--- a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp
@@ -75,7 +75,7 @@ public:
instance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, IN_PROGRESS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp
index baba9d5396b..e4cdf89c165 100644
--- a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp
@@ -127,7 +127,7 @@ public:
instance->SetData(DATA_GAL_DARAH_EVENT, IN_PROGRESS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp
index 8f325dafc82..97c75b5f391 100644
--- a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp
@@ -91,7 +91,7 @@ public:
instance->SetData(DATA_MOORABI_EVENT, IN_PROGRESS);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp
index 4acabc3b2b3..6deb0c20676 100644
--- a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp
@@ -122,7 +122,7 @@ public:
instance->SetData(DATA_SLAD_RAN_EVENT, IN_PROGRESS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -231,7 +231,7 @@ public:
uiGripOfSladRanTimer = 1*IN_MILLISECONDS;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -251,7 +251,7 @@ public:
if (TempSummon* _me = me->ToTempSummon())
if (Creature* sladran = _me->GetSummoner()->ToCreature())
- sladran->AI()->SetGUID(target->GetGUID() ,DATA_SNAKES_WHYD_IT_HAVE_TO_BE_SNAKES);
+ sladran->AI()->SetGUID(target->GetGUID(), DATA_SNAKES_WHYD_IT_HAVE_TO_BE_SNAKES);
me->DespawnOrUnsummon();
}
@@ -286,7 +286,7 @@ public:
uiVenomousBiteTimer = 2*IN_MILLISECONDS;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
index cb073b1c569..833649b576d 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
@@ -282,7 +282,7 @@ class boss_blood_council_controller : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -477,7 +477,7 @@ class boss_prince_keleseth_icc : public CreatureScript
Talk(SAY_KELESETH_KILL);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -522,7 +522,7 @@ class boss_prince_keleseth_icc : public CreatureScript
return true;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || !CheckRoom())
return;
@@ -695,7 +695,7 @@ class boss_prince_taldaram_icc : public CreatureScript
Talk(SAY_TALDARAM_KILL);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -740,7 +740,7 @@ class boss_prince_taldaram_icc : public CreatureScript
return true;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || !CheckRoom())
return;
@@ -933,7 +933,7 @@ class boss_prince_valanar_icc : public CreatureScript
Talk(SAY_VALANAR_KILL);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -978,7 +978,7 @@ class boss_prince_valanar_icc : public CreatureScript
return true;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || !CheckRoom())
return;
@@ -1090,7 +1090,7 @@ class npc_blood_queen_lana_thel : public CreatureScript
me->SetVisible(false);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!_events.GetPhaseMask())
return;
@@ -1168,7 +1168,7 @@ class npc_ball_of_flame : public CreatureScript
_chaseGUID = guid;
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_FLAME_BALL_CHASE)
if (Player* target = ObjectAccessor::GetPlayer(*me, _chaseGUID))
@@ -1189,7 +1189,7 @@ class npc_ball_of_flame : public CreatureScript
_instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, uint32(false));
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!_despawnTimer)
return;
@@ -1236,7 +1236,7 @@ class npc_kinetic_bomb : public CreatureScript
_groundZ = me->GetMap()->GetHeight(me->GetPhaseMask(), _x, _y, _groundZ, true, 500.0f);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == SPELL_KINETIC_BOMB_EXPLOSION)
_events.ScheduleEvent(EVENT_BOMB_DESPAWN, 1000);
@@ -1248,7 +1248,7 @@ class npc_kinetic_bomb : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
_events.Update(diff);
@@ -1328,7 +1328,7 @@ class npc_dark_nucleus : public CreatureScript
me->AddThreat(attacker, 500000000.0f);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
index c8caa3976e4..f4df90c49e8 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
@@ -45,10 +45,13 @@ enum Spells
SPELL_SHROUD_OF_SORROW = 70986,
SPELL_FRENZIED_BLOODTHIRST_VISUAL = 71949,
SPELL_VAMPIRIC_BITE = 71726,
+ SPELL_VAMPIRIC_BITE_DUMMY = 71837,
SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_PLR = 70879,
+ SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_HEAL = 70872,
SPELL_FRENZIED_BLOODTHIRST = 70877,
SPELL_UNCONTROLLABLE_FRENZY = 70923,
- SPELL_PRESENCE_OF_THE_DARKFALLEN = 71952,
+ SPELL_PRESENCE_OF_THE_DARKFALLEN = 70994,
+ SPELL_PRESENCE_OF_THE_DARKFALLEN_2 = 71952,
SPELL_BLOOD_MIRROR_DAMAGE = 70821,
SPELL_BLOOD_MIRROR_VISUAL = 71510,
SPELL_BLOOD_MIRROR_DUMMY = 70838,
@@ -87,6 +90,7 @@ uint32 const vampireAuras[3][MAX_DIFFICULTY] =
#define ESSENCE_OF_BLOOD_QUEEN_PLR RAID_MODE<uint32>(70879, 71525, 71530, 71531)
#define FRENZIED_BLOODTHIRST RAID_MODE<uint32>(70877, 71474, 70877, 71474)
#define DELIRIOUS_SLASH RAID_MODE<uint32>(71623, 71624, 71625, 71626)
+#define PRESENCE_OF_THE_DARKFALLEN RAID_MODE<uint32>(70994, 71962, 71963, 71964)
enum Events
{
@@ -219,9 +223,10 @@ class boss_blood_queen_lana_thel : public CreatureScript
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DUMMY);
instance->DoRemoveAurasDueToSpellOnPlayers(DELIRIOUS_SLASH);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN);
+ instance->DoRemoveAurasDueToSpellOnPlayers(PRESENCE_OF_THE_DARKFALLEN);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action != ACTION_KILL_MINCHAR)
return;
@@ -329,7 +334,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || !CheckInRoom())
return;
@@ -356,8 +361,11 @@ class boss_blood_queen_lana_thel : public CreatureScript
{
Unit* target = targets.front();
DoCast(target, SPELL_VAMPIRIC_BITE);
+ DoCastAOE(SPELL_VAMPIRIC_BITE_DUMMY, true);
Talk(SAY_VAMPIRIC_BITE);
_vampires.insert(target->GetGUID());
+ target->CastSpell(target, SPELL_PRESENCE_OF_THE_DARKFALLEN, TRIGGERED_FULL_MASK);
+ target->CastSpell(target, SPELL_PRESENCE_OF_THE_DARKFALLEN_2, TRIGGERED_FULL_MASK);
}
break;
}
@@ -376,9 +384,10 @@ class boss_blood_queen_lana_thel : public CreatureScript
_offtank->CastSpell(me->getVictim(), SPELL_BLOOD_MIRROR_DAMAGE, true);
me->getVictim()->CastSpell(_offtank, SPELL_BLOOD_MIRROR_DUMMY, true);
DoCastVictim(SPELL_BLOOD_MIRROR_VISUAL);
- if (Item* shadowsEdge = _offtank->GetWeaponForAttack(BASE_ATTACK, true))
- if (!_offtank->HasAura(SPELL_THIRST_QUENCHED) && shadowsEdge->GetEntry() == ITEM_SHADOW_S_EDGE && !_offtank->HasAura(SPELL_GUSHING_WOUND))
- _offtank->CastSpell(_offtank, SPELL_GUSHING_WOUND, true);
+ if (Is25ManRaid() && _offtank->GetQuestStatus(QUEST_BLOOD_INFUSION) == QUEST_STATUS_INCOMPLETE &&
+ _offtank->HasAura(SPELL_UNSATED_CRAVING) && !_offtank->HasAura(SPELL_THIRST_QUENCHED) &&
+ !_offtank->HasAura(SPELL_GUSHING_WOUND))
+ _offtank->CastSpell(_offtank, SPELL_GUSHING_WOUND, TRIGGERED_FULL_MASK);
}
}
@@ -395,13 +404,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
{
std::list<Player*> targets;
SelectRandomTarget(false, &targets);
- uint32 targetCount = 2;
- // do not combine these checks! we want it incremented TWICE when both conditions are met
- if (IsHeroic())
- ++targetCount;
- if (Is25ManRaid())
- ++targetCount;
- Trinity::Containers::RandomResizeList<Player*>(targets, targetCount);
+ Trinity::Containers::RandomResizeList(targets, Is25ManRaid() ? 3 : 2);
if (targets.size() > 1)
{
Talk(SAY_PACT_OF_THE_DARKFALLEN);
@@ -478,7 +481,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
for (std::list<HostileReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
if (Unit* refTarget = (*itr)->getTarget())
- if (refTarget != me->getVictim() && refTarget->GetTypeId() == TYPEID_PLAYER && (includeOfftank ? true : (refTarget != _offtank)))
+ if (refTarget != me->getVictim() && refTarget->GetTypeId() == TYPEID_PLAYER && (includeOfftank || (refTarget != _offtank)))
tempTargets.push_back(refTarget->ToPlayer());
if (tempTargets.empty())
@@ -553,33 +556,36 @@ class spell_blood_queen_vampiric_bite : public SpellScriptLoader
uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_FRENZIED_BLOODTHIRST, GetCaster());
GetCaster()->RemoveAura(spellId, 0, 0, AURA_REMOVE_BY_ENEMY_SPELL);
- GetCaster()->CastSpell(GetCaster(), SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_PLR, true);
- // Presence of the Darkfallen buff on Blood-Queen
- if (GetCaster()->GetMap()->IsHeroic())
- GetCaster()->CastSpell(GetCaster(), SPELL_PRESENCE_OF_THE_DARKFALLEN, true);
+ GetCaster()->CastSpell(GetCaster(), SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_PLR, TRIGGERED_FULL_MASK);
+
// Shadowmourne questline
- if (GetCaster()->ToPlayer()->GetQuestStatus(QUEST_BLOOD_INFUSION) == QUEST_STATUS_INCOMPLETE)
+ if (Aura* aura = GetCaster()->GetAura(SPELL_GUSHING_WOUND))
{
- if (Aura* aura = GetCaster()->GetAura(SPELL_GUSHING_WOUND))
+ if (aura->GetStackAmount() == 3)
{
- if (aura->GetStackAmount() == 3)
- {
- GetCaster()->CastSpell(GetCaster(), SPELL_THIRST_QUENCHED, true);
- GetCaster()->RemoveAura(aura);
- }
- else
- GetCaster()->CastSpell(GetCaster(), SPELL_GUSHING_WOUND, true);
+ GetCaster()->CastSpell(GetCaster(), SPELL_THIRST_QUENCHED, TRIGGERED_FULL_MASK);
+ GetCaster()->RemoveAura(aura);
}
+ else
+ GetCaster()->CastSpell(GetCaster(), SPELL_GUSHING_WOUND, TRIGGERED_FULL_MASK);
}
+
if (InstanceScript* instance = GetCaster()->GetInstanceScript())
if (Creature* bloodQueen = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(DATA_BLOOD_QUEEN_LANA_THEL)))
bloodQueen->AI()->SetGUID(GetHitUnit()->GetGUID(), GUID_VAMPIRE);
}
+ void HandlePresence(SpellEffIndex /*effIndex*/)
+ {
+ GetHitUnit()->CastSpell(GetHitUnit(), SPELL_PRESENCE_OF_THE_DARKFALLEN, TRIGGERED_FULL_MASK);
+ GetHitUnit()->CastSpell(GetHitUnit(), SPELL_PRESENCE_OF_THE_DARKFALLEN_2, TRIGGERED_FULL_MASK);
+ }
+
void Register()
{
OnCheckCast += SpellCheckCastFn(spell_blood_queen_vampiric_bite_SpellScript::CheckTarget);
BeforeHit += SpellHitFn(spell_blood_queen_vampiric_bite_SpellScript::OnCast);
+ OnEffectHitTarget += SpellEffectFn(spell_blood_queen_vampiric_bite_SpellScript::HandlePresence, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL);
}
};
@@ -698,6 +704,42 @@ class spell_blood_queen_bloodbolt : public SpellScriptLoader
}
};
+// 70871 - Essence of the Blood Queen
+class spell_blood_queen_essence_of_the_blood_queen : public SpellScriptLoader
+{
+ public:
+ spell_blood_queen_essence_of_the_blood_queen() : SpellScriptLoader("spell_blood_queen_essence_of_the_blood_queen") { }
+
+ class spell_blood_queen_essence_of_the_blood_queen_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_blood_queen_essence_of_the_blood_queen_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_HEAL))
+ return false;
+ return true;
+ }
+
+ void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 heal = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount());
+ GetTarget()->CastCustomSpell(SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_HEAL, SPELLVALUE_BASE_POINT0, heal, GetTarget(), TRIGGERED_FULL_MASK, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_blood_queen_essence_of_the_blood_queen_AuraScript::OnProc, EFFECT_1, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_blood_queen_essence_of_the_blood_queen_AuraScript();
+ }
+};
+
class spell_blood_queen_pact_of_the_darkfallen : public SpellScriptLoader
{
public:
@@ -849,6 +891,7 @@ void AddSC_boss_blood_queen_lana_thel()
new spell_blood_queen_vampiric_bite();
new spell_blood_queen_frenzied_bloodthirst();
new spell_blood_queen_bloodbolt();
+ new spell_blood_queen_essence_of_the_blood_queen();
new spell_blood_queen_pact_of_the_darkfallen();
new spell_blood_queen_pact_of_the_darkfallen_dmg();
new spell_blood_queen_pact_of_the_darkfallen_dmg_target();
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
index 23e4fc19dd2..f01c28766f9 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
@@ -63,7 +63,7 @@ enum ScriptTexts
SAY_INTRO_ALLIANCE_1 = 0,
SAY_INTRO_ALLIANCE_4 = 1,
SAY_INTRO_ALLIANCE_5 = 2,
- SAY_OUTRO_ALLIANCE_1 = 3, // TODO ALLIANCE OUTRO
+ SAY_OUTRO_ALLIANCE_1 = 3, /// @todo ALLIANCE OUTRO
SAY_OUTRO_ALLIANCE_2 = 4,
SAY_OUTRO_ALLIANCE_3 = 5,
SAY_OUTRO_ALLIANCE_4 = 6,
@@ -185,9 +185,7 @@ enum Phases
{
PHASE_INTRO_A = 1,
PHASE_INTRO_H = 2,
- PHASE_COMBAT = 3,
-
- PHASE_INTRO_MASK = (1 << PHASE_INTRO_A) | (1 << PHASE_INTRO_H),
+ PHASE_COMBAT = 3
};
enum Actions
@@ -415,9 +413,16 @@ class boss_deathbringer_saurfang : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void SpellHit(Unit* /*caster*/, SpellInfo const* spell)
+ {
+ if (spell->Id == SPELL_BLOOD_LINK_POWER)
+ if (Aura* bloodPower = me->GetAura(SPELL_BLOOD_POWER))
+ bloodPower->RecalculateAmountOfEffects();
+ }
+
+ void UpdateAI(uint32 diff)
{
- if (!UpdateVictim() && !(events.GetPhaseMask() & PHASE_INTRO_MASK))
+ if (!UpdateVictim() && !(events.IsInPhase(PHASE_INTRO_A) || events.IsInPhase(PHASE_INTRO_H)))
return;
events.Update(diff);
@@ -507,7 +512,7 @@ class boss_deathbringer_saurfang : public CreatureScript
}
// intro setup
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -598,14 +603,14 @@ class npc_high_overlord_saurfang_icc : public CreatureScript
_events.Reset();
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
case ACTION_START_EVENT:
{
// Prevent crashes
- if (_events.GetPhaseMask() & PHASE_INTRO_MASK)
+ if (_events.IsInPhase(PHASE_INTRO_A) || _events.IsInPhase(PHASE_INTRO_H))
return;
GetCreatureListWithEntryInGrid(_guardList, me, NPC_SE_KOR_KRON_REAVER, 20.0f);
@@ -703,7 +708,7 @@ class npc_high_overlord_saurfang_icc : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
@@ -807,14 +812,14 @@ class npc_muradin_bronzebeard_icc : public CreatureScript
_events.Reset();
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
case ACTION_START_EVENT:
{
// Prevent crashes
- if (_events.GetPhaseMask() & PHASE_INTRO_MASK)
+ if (_events.IsInPhase(PHASE_INTRO_A) || _events.IsInPhase(PHASE_INTRO_H))
return;
_events.SetPhase(PHASE_INTRO_A);
@@ -883,7 +888,7 @@ class npc_muradin_bronzebeard_icc : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
@@ -965,7 +970,7 @@ class npc_saurfang_event : public CreatureScript
}
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_CHARGE && _index)
me->GetMotionMaster()->MoveCharge(chargePos[_index].GetPositionX(), chargePos[_index].GetPositionY(), chargePos[_index].GetPositionZ(), 13.0f, POINT_CHARGE);
@@ -1004,8 +1009,6 @@ class spell_deathbringer_blood_link : public SpellScriptLoader
void HandleDummy(SpellEffIndex /*effIndex*/)
{
GetHitUnit()->CastCustomSpell(SPELL_BLOOD_LINK_POWER, SPELLVALUE_BASE_POINT0, GetEffectValue(), GetHitUnit(), true);
- if (Aura* bloodPower = GetHitUnit()->GetAura(SPELL_BLOOD_POWER))
- bloodPower->RecalculateAmountOfEffects();
PreventHitDefaultEffect(EFFECT_0);
}
@@ -1093,13 +1096,6 @@ class spell_deathbringer_blood_power : public SpellScriptLoader
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_deathbringer_blood_power_AuraScript::RecalculateHook, EFFECT_0, SPELL_AURA_MOD_SCALE);
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_deathbringer_blood_power_AuraScript::RecalculateHook, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
}
-
- bool Load()
- {
- if (GetUnitOwner()->getPowerType() != POWER_ENERGY)
- return false;
- return true;
- }
};
SpellScript* GetSpellScript() const
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp
index 70cb585422d..4ec945fcb77 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp
@@ -162,7 +162,7 @@ class boss_festergut : public CreatureScript
target->RemoveAurasDueToSpell(INOCULATED_HELPER);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || !CheckInRoom())
return;
@@ -298,7 +298,7 @@ class npc_stinky_icc : public CreatureScript
DoCast(me, SPELL_PLAGUE_STENCH);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
index 4e677bf5b0e..59c9393c934 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
@@ -160,10 +160,7 @@ enum Phases
PHASE_ALL = 0,
PHASE_INTRO = 1,
PHASE_ONE = 2,
- PHASE_TWO = 3,
-
- PHASE_INTRO_MASK = 1 << PHASE_INTRO,
- PHASE_ONE_MASK = 1 << PHASE_ONE,
+ PHASE_TWO = 3
};
enum DeprogrammingData
@@ -259,7 +256,7 @@ class boss_lady_deathwhisper : public CreatureScript
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
return;
- if (victim && me->Attack(victim, true) && !(events.GetPhaseMask() & PHASE_ONE_MASK))
+ if (victim && me->Attack(victim, true) && !events.IsInPhase(PHASE_ONE))
me->GetMotionMaster()->MoveChase(victim);
}
@@ -358,7 +355,7 @@ class boss_lady_deathwhisper : public CreatureScript
void DamageTaken(Unit* /*damageDealer*/, uint32& damage)
{
// phase transition
- if (events.GetPhaseMask() & PHASE_ONE_MASK && damage > me->GetPower(POWER_MANA))
+ if (events.IsInPhase(PHASE_ONE) && damage > me->GetPower(POWER_MANA))
{
Talk(SAY_PHASE_2);
Talk(EMOTE_PHASE_2);
@@ -404,14 +401,14 @@ class boss_lady_deathwhisper : public CreatureScript
summon->CastSpell(summon, SPELL_ADHERENT_S_DETERMINATION, true);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
- if ((!UpdateVictim() && !(events.GetPhaseMask() & PHASE_INTRO_MASK)) || !CheckInRoom())
+ if ((!UpdateVictim() && !events.IsInPhase(PHASE_INTRO)) || !CheckInRoom())
return;
events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING) && !(events.GetPhaseMask() & PHASE_INTRO_MASK))
+ if (me->HasUnitState(UNIT_STATE_CASTING) && !events.IsInPhase(PHASE_INTRO))
return;
while (uint32 eventId = events.ExecuteEvent())
@@ -659,7 +656,7 @@ class npc_cult_fanatic : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -737,7 +734,7 @@ class npc_cult_adherent : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -882,7 +879,7 @@ class npc_darnavan : public CreatureScript
Talk(SAY_DARNAVAN_AGGRO);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
index e751ec2bd7b..7e72ad00a3c 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
@@ -20,8 +20,9 @@
#include "ScriptedCreature.h"
#include "SpellAuras.h"
#include "MapManager.h"
-#include "icecrown_citadel.h"
+#include "MoveSplineInit.h"
#include "Player.h"
+#include "icecrown_citadel.h"
enum ScriptTexts
{
@@ -53,7 +54,7 @@ enum Spells
SPELL_COLDFLAME_SUMMON = 69147,
};
-uint32 const boneSpikeSummonId[3] = {69062, 72669, 72670};
+uint32 const BoneSpikeSummonId[3] = {69062, 72669, 72670};
enum Events
{
@@ -78,7 +79,46 @@ enum MovementPoints
POINT_TARGET_COLDFLAME = 36672631,
};
-#define DATA_COLDFLAME_GUID 0
+enum MiscInfo
+{
+ DATA_COLDFLAME_GUID = 0,
+
+ // Manual marking for targets hit by Bone Slice as no aura exists for this purpose
+ // These units are the tanks in this encounter
+ // and should be immune to Bone Spike Graveyard
+ DATA_SPIKE_IMMUNE = 1,
+ //DATA_SPIKE_IMMUNE_1, = 2, // Reserved & used
+ //DATA_SPIKE_IMMUNE_2, = 3, // Reserved & used
+
+ ACTION_CLEAR_SPIKE_IMMUNITIES = 1,
+
+ MAX_BONE_SPIKE_IMMUNE = 3,
+};
+
+class BoneSpikeTargetSelector : public std::unary_function<Unit*, bool>
+{
+ public:
+ BoneSpikeTargetSelector(UnitAI* ai) : _ai(ai) { }
+
+ bool operator()(Unit* unit) const
+ {
+ if (unit->GetTypeId() != TYPEID_PLAYER)
+ return false;
+
+ if (unit->HasAura(SPELL_IMPALED))
+ return false;
+
+ // Check if it is one of the tanks soaking Bone Slice
+ for (uint32 i = 0; i < MAX_BONE_SPIKE_IMMUNE; ++i)
+ if (unit->GetGUID() == _ai->GetGUID(DATA_SPIKE_IMMUNE + i))
+ return false;
+
+ return true;
+ }
+
+ private:
+ UnitAI* _ai;
+};
class boss_lord_marrowgar : public CreatureScript
{
@@ -103,11 +143,12 @@ class boss_lord_marrowgar : public CreatureScript
me->RemoveAurasDueToSpell(SPELL_BONE_STORM);
me->RemoveAurasDueToSpell(SPELL_BERSERK);
events.ScheduleEvent(EVENT_ENABLE_BONE_SLICE, 10000);
- events.ScheduleEvent(EVENT_BONE_SPIKE_GRAVEYARD, urand(10000, 15000), EVENT_GROUP_SPECIAL);
+ events.ScheduleEvent(EVENT_BONE_SPIKE_GRAVEYARD, 15000, EVENT_GROUP_SPECIAL);
events.ScheduleEvent(EVENT_COLDFLAME, 5000, EVENT_GROUP_SPECIAL);
events.ScheduleEvent(EVENT_WARN_BONE_STORM, urand(45000, 50000));
events.ScheduleEvent(EVENT_ENRAGE, 600000);
_boneSlice = false;
+ _boneSpikeImmune.clear();
}
void EnterCombat(Unit* /*who*/)
@@ -148,7 +189,7 @@ class boss_lord_marrowgar : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || !CheckInRoom())
return;
@@ -199,18 +240,18 @@ class boss_lord_marrowgar : public CreatureScript
if (!unit)
unit = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true);
if (unit)
- me->GetMotionMaster()->MovePoint(POINT_TARGET_BONESTORM_PLAYER, unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ());
+ me->GetMotionMaster()->MovePoint(POINT_TARGET_BONESTORM_PLAYER, *unit);
break;
}
case EVENT_BONE_STORM_END:
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE)
me->GetMotionMaster()->MovementExpired();
- DoStartMovement(me->getVictim());
+ me->GetMotionMaster()->MoveChase(me->getVictim());
me->SetSpeed(MOVE_RUN, _baseSpeed, true);
events.CancelEvent(EVENT_BONE_STORM_MOVE);
events.ScheduleEvent(EVENT_ENABLE_BONE_SLICE, 10000);
if (!IsHeroic())
- events.RescheduleEvent(EVENT_BONE_SPIKE_GRAVEYARD, urand(15000, 20000), EVENT_GROUP_SPECIAL);
+ events.RescheduleEvent(EVENT_BONE_SPIKE_GRAVEYARD, 15000, EVENT_GROUP_SPECIAL);
break;
case EVENT_ENABLE_BONE_SLICE:
_boneSlice = true;
@@ -239,7 +280,7 @@ class boss_lord_marrowgar : public CreatureScript
return;
// lock movement
- DoStartNoMovement(me->getVictim());
+ me->GetMotionMaster()->MoveIdle();
}
Position const* GetLastColdflamePosition() const
@@ -247,23 +288,51 @@ class boss_lord_marrowgar : public CreatureScript
return &_coldflameLastPos;
}
- uint64 GetGUID(int32 type/* = 0 */) const
+ uint64 GetGUID(int32 type /*= 0 */) const
{
- if (type == DATA_COLDFLAME_GUID)
- return _coldflameTarget;
+ switch (type)
+ {
+ case DATA_COLDFLAME_GUID:
+ return _coldflameTarget;
+ case DATA_SPIKE_IMMUNE + 0:
+ case DATA_SPIKE_IMMUNE + 1:
+ case DATA_SPIKE_IMMUNE + 2:
+ {
+ uint32 index = uint32(type - DATA_SPIKE_IMMUNE);
+ if (index < _boneSpikeImmune.size())
+ return _boneSpikeImmune[index];
+
+ break;
+ }
+ }
+
return 0LL;
}
- void SetGUID(uint64 guid, int32 type/* = 0 */)
+ void SetGUID(uint64 guid, int32 type /*= 0 */)
{
- if (type != DATA_COLDFLAME_GUID)
+ switch (type)
+ {
+ case DATA_COLDFLAME_GUID:
+ _coldflameTarget = guid;
+ break;
+ case DATA_SPIKE_IMMUNE:
+ _boneSpikeImmune.push_back(guid);
+ break;
+ }
+ }
+
+ void DoAction(int32 action)
+ {
+ if (action != ACTION_CLEAR_SPIKE_IMMUNITIES)
return;
- _coldflameTarget = guid;
+ _boneSpikeImmune.clear();
}
private:
Position _coldflameLastPos;
+ std::vector<uint64> _boneSpikeImmune;
uint64 _coldflameTarget;
uint32 _boneStormDuration;
float _baseSpeed;
@@ -295,19 +364,17 @@ class npc_coldflame : public CreatureScript
if (owner->GetTypeId() != TYPEID_UNIT)
return;
- Creature* creOwner = owner->ToCreature();
Position pos;
- // random target case
+ if (MarrowgarAI* marrowgarAI = CAST_AI(MarrowgarAI, owner->GetAI()))
+ pos.Relocate(marrowgarAI->GetLastColdflamePosition());
+ else
+ pos.Relocate(owner);
+
if (owner->HasAura(SPELL_BONE_STORM))
{
- if (MarrowgarAI* marrowgarAI = CAST_AI(MarrowgarAI, creOwner->AI()))
- {
- Position const* ownerPos = marrowgarAI->GetLastColdflamePosition();
- float ang = me->GetAngle(ownerPos) - static_cast<float>(M_PI);
- MapManager::NormalizeOrientation(ang);
- me->SetOrientation(ang);
- owner->GetNearPosition(pos, 2.5f, 0.0f);
- }
+ float ang = MapManager::NormalizeOrientation(pos.GetAngle(me));
+ me->SetOrientation(ang);
+ owner->GetNearPoint2D(pos.m_positionX, pos.m_positionY, 5.0f - owner->GetObjectSize(), ang);
}
else
{
@@ -318,25 +385,27 @@ class npc_coldflame : public CreatureScript
return;
}
- me->SetOrientation(owner->GetAngle(target));
- owner->GetNearPosition(pos, owner->GetObjectSize() / 2.0f, 0.0f);
+ float ang = MapManager::NormalizeOrientation(pos.GetAngle(target));
+ me->SetOrientation(ang);
+ owner->GetNearPoint2D(pos.m_positionX, pos.m_positionY, 15.0f - owner->GetObjectSize(), ang);
}
me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), me->GetPositionZ(), me->GetOrientation());
- _events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 450);
+ DoCast(SPELL_COLDFLAME_SUMMON);
+ _events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 500);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
_events.Update(diff);
if (_events.ExecuteEvent() == EVENT_COLDFLAME_TRIGGER)
{
Position newPos;
- me->GetNearPosition(newPos, 5.5f, 0.0f);
+ me->GetNearPosition(newPos, 5.0f, 0.0f);
me->NearTeleportTo(newPos.GetPositionX(), newPos.GetPositionY(), me->GetPositionZ(), me->GetOrientation());
DoCast(SPELL_COLDFLAME_SUMMON);
- _events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 450);
+ _events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 500);
}
}
@@ -355,11 +424,13 @@ class npc_bone_spike : public CreatureScript
public:
npc_bone_spike() : CreatureScript("npc_bone_spike") { }
- struct npc_bone_spikeAI : public Scripted_NoMovementAI
+ struct npc_bone_spikeAI : public ScriptedAI
{
- npc_bone_spikeAI(Creature* creature) : Scripted_NoMovementAI(creature), _hasTrappedUnit(false)
+ npc_bone_spikeAI(Creature* creature) : ScriptedAI(creature), _hasTrappedUnit(false)
{
ASSERT(creature->GetVehicleKit());
+
+ SetCombatMovement(false);
}
void JustDied(Unit* /*killer*/)
@@ -385,7 +456,25 @@ class npc_bone_spike : public CreatureScript
_hasTrappedUnit = true;
}
- void UpdateAI(uint32 const diff)
+ void PassengerBoarded(Unit* passenger, int8 /*seat*/, bool apply)
+ {
+ if (!apply)
+ return;
+
+ /// @HACK - Change passenger offset to the one taken directly from sniffs
+ /// Remove this when proper calculations are implemented.
+ /// This fixes healing spiked people
+ Movement::MoveSplineInit init(passenger);
+ init.DisableTransportPathTransformations();
+ init.MoveTo(-0.02206125f, -0.02132235f, 5.514783f, false);
+ init.Launch();
+
+ /// @WORKAROUND - Clear ON VEHICLE state to allow healing (Invalid target errors)
+ /// Current rule for applying this state is questionable (seatFlags & VEHICLE_SEAT_FLAG_ALLOW_TURNING ???)
+ passenger->ClearUnitState(UNIT_STATE_ONVEHICLE);
+ }
+
+ void UpdateAI(uint32 diff)
{
if (!_hasTrappedUnit)
return;
@@ -487,16 +576,24 @@ class spell_marrowgar_coldflame_damage : public SpellScriptLoader
{
PrepareAuraScript(spell_marrowgar_coldflame_damage_AuraScript);
- void OnPeriodic(AuraEffect const* /*aurEff*/)
+ bool CanBeAppliedOn(Unit* target)
{
- if (DynamicObject* owner = GetDynobjOwner())
- if (GetTarget()->GetExactDist2d(owner) >= owner->GetRadius() || GetTarget()->HasAura(SPELL_IMPALED))
- PreventDefaultAction();
+ if (target->HasAura(SPELL_IMPALED))
+ return false;
+
+ if (target->GetExactDist2d(GetOwner()) > GetSpellInfo()->Effects[EFFECT_0].CalcRadius())
+ return false;
+
+ if (Aura* aur = target->GetAura(GetId()))
+ if (aur->GetOwner() != GetOwner())
+ return false;
+
+ return true;
}
void Register()
{
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_marrowgar_coldflame_damage_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
+ DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_marrowgar_coldflame_damage_AuraScript::CanBeAppliedOn);
}
};
@@ -515,9 +612,23 @@ class spell_marrowgar_bone_spike_graveyard : public SpellScriptLoader
{
PrepareSpellScript(spell_marrowgar_bone_spike_graveyard_SpellScript);
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ for (uint32 i = 0; i < 3; ++i)
+ if (!sSpellMgr->GetSpellInfo(BoneSpikeSummonId[i]))
+ return false;
+
+ return true;
+ }
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT && GetCaster()->IsAIEnabled;
+ }
+
SpellCastResult CheckCast()
{
- return GetCaster()->GetAI()->SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 0.0f, true, -SPELL_IMPALED) ? SPELL_CAST_OK : SPELL_FAILED_NO_VALID_TARGETS;
+ return GetCaster()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, BoneSpikeTargetSelector(GetCaster()->GetAI())) ? SPELL_CAST_OK : SPELL_FAILED_NO_VALID_TARGETS;
}
void HandleSpikes(SpellEffIndex effIndex)
@@ -525,22 +636,22 @@ class spell_marrowgar_bone_spike_graveyard : public SpellScriptLoader
PreventHitDefaultEffect(effIndex);
if (Creature* marrowgar = GetCaster()->ToCreature())
{
- bool didHit = false;
CreatureAI* marrowgarAI = marrowgar->AI();
uint8 boneSpikeCount = uint8(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 3 : 1);
- for (uint8 i = 0; i < boneSpikeCount; ++i)
- {
- // select any unit but not the tank
- Unit* target = marrowgarAI->SelectTarget(SELECT_TARGET_RANDOM, 1, 150.0f, true, -SPELL_IMPALED);
- if (!target)
- break;
- didHit = true;
- target->CastCustomSpell(boneSpikeSummonId[i], SPELLVALUE_BASE_POINT0, 0, target, true);
+ std::list<Unit*> targets;
+ marrowgarAI->SelectTargetList(targets, BoneSpikeTargetSelector(marrowgarAI), boneSpikeCount, SELECT_TARGET_RANDOM);
+ if (targets.empty())
+ return;
+
+ uint32 i = 0;
+ for (std::list<Unit*>::const_iterator itr = targets.begin(); itr != targets.end(); ++itr, ++i)
+ {
+ Unit* target = *itr;
+ target->CastCustomSpell(BoneSpikeSummonId[i], SPELLVALUE_BASE_POINT0, 0, target, true);
}
- if (didHit)
- marrowgarAI->Talk(SAY_BONESPIKE);
+ marrowgarAI->Talk(SAY_BONESPIKE);
}
}
@@ -583,6 +694,58 @@ class spell_marrowgar_bone_storm : public SpellScriptLoader
}
};
+class spell_marrowgar_bone_slice : public SpellScriptLoader
+{
+ public:
+ spell_marrowgar_bone_slice() : SpellScriptLoader("spell_marrowgar_bone_slice") { }
+
+ class spell_marrowgar_bone_slice_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_marrowgar_bone_slice_SpellScript);
+
+ bool Load()
+ {
+ _targetCount = 0;
+ return true;
+ }
+
+ void ClearSpikeImmunities()
+ {
+ GetCaster()->GetAI()->DoAction(ACTION_CLEAR_SPIKE_IMMUNITIES);
+ }
+
+ void CountTargets(std::list<WorldObject*>& targets)
+ {
+ _targetCount = std::min<uint32>(targets.size(), GetSpellInfo()->MaxAffectedTargets);
+ }
+
+ void SplitDamage()
+ {
+ // Mark the unit as hit, even if the spell missed or was dodged/parried
+ GetCaster()->GetAI()->SetGUID(GetHitUnit()->GetGUID(), DATA_SPIKE_IMMUNE);
+
+ if (!_targetCount)
+ return; // This spell can miss all targets
+
+ SetHitDamage(GetHitDamage() / _targetCount);
+ }
+
+ void Register()
+ {
+ BeforeCast += SpellCastFn(spell_marrowgar_bone_slice_SpellScript::ClearSpikeImmunities);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_marrowgar_bone_slice_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
+ OnHit += SpellHitFn(spell_marrowgar_bone_slice_SpellScript::SplitDamage);
+ }
+
+ uint32 _targetCount;
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_marrowgar_bone_slice_SpellScript();
+ }
+};
+
void AddSC_boss_lord_marrowgar()
{
new boss_lord_marrowgar();
@@ -593,4 +756,5 @@ void AddSC_boss_lord_marrowgar()
new spell_marrowgar_coldflame_damage();
new spell_marrowgar_bone_spike_graveyard();
new spell_marrowgar_bone_storm();
+ new spell_marrowgar_bone_slice();
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
index 05bf7b9794a..e377f5f8d07 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
@@ -145,10 +145,7 @@ enum Phases
PHASE_ROTFACE = 2,
PHASE_COMBAT_1 = 4,
PHASE_COMBAT_2 = 5,
- PHASE_COMBAT_3 = 6,
-
- PHASE_MASK_COMBAT = (1 << PHASE_COMBAT_1) | (1 << PHASE_COMBAT_2) | (1 << PHASE_COMBAT_3),
- PHASE_MASK_NOT_SELF = (1 << PHASE_FESTERGUT) | (1 << PHASE_ROTFACE)
+ PHASE_COMBAT_3 = 6
};
enum Points
@@ -233,7 +230,7 @@ class boss_professor_putricide : public CreatureScript
void Reset()
{
- if (!(events.GetPhaseMask() & PHASE_MASK_NOT_SELF))
+ if (!(events.IsInPhase(PHASE_ROTFACE) || events.IsInPhase(PHASE_FESTERGUT)))
instance->SetBossState(DATA_PROFESSOR_PUTRICIDE, NOT_STARTED);
instance->SetData(DATA_NAUSEA_ACHIEVEMENT, uint32(true));
@@ -252,7 +249,7 @@ class boss_professor_putricide : public CreatureScript
void EnterCombat(Unit* who)
{
- if (events.GetPhaseMask() & PHASE_MASK_NOT_SELF)
+ if (events.IsInPhase(PHASE_ROTFACE) || events.IsInPhase(PHASE_FESTERGUT))
return;
if (!instance->CheckRequiredBosses(DATA_PROFESSOR_PUTRICIDE, who->ToPlayer()))
@@ -282,7 +279,7 @@ class boss_professor_putricide : public CreatureScript
{
_JustReachedHome();
me->SetWalk(false);
- if (events.GetPhaseMask() & PHASE_MASK_COMBAT)
+ if (events.IsInPhase(PHASE_COMBAT_1) || events.IsInPhase(PHASE_COMBAT_2) || events.IsInPhase(PHASE_COMBAT_3))
instance->SetBossState(DATA_PROFESSOR_PUTRICIDE, FAIL);
}
@@ -416,7 +413,7 @@ class boss_professor_putricide : public CreatureScript
}
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -566,9 +563,9 @@ class boss_professor_putricide : public CreatureScript
_experimentState = bool(data);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
- if ((!(events.GetPhaseMask() & PHASE_MASK_NOT_SELF) && !UpdateVictim()) || !CheckInRoom())
+ if ((!(events.IsInPhase(PHASE_ROTFACE) || events.IsInPhase(PHASE_FESTERGUT)) && !UpdateVictim()) || !CheckInRoom())
return;
events.Update(diff);
@@ -745,7 +742,7 @@ class npc_putricide_oozeAI : public ScriptedAI
_newTargetSelectTimer = 1000;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() && !_newTargetSelectTimer)
return;
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
index db5f373a753..f398ad55603 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
@@ -162,7 +162,7 @@ class boss_rotface : public CreatureScript
// don't enter combat
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || !CheckInRoom())
return;
@@ -239,7 +239,7 @@ class npc_little_ooze : public CreatureScript
me->DespawnOrUnsummon();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -296,13 +296,13 @@ class npc_big_ooze : public CreatureScript
me->DespawnOrUnsummon();
}
- void DoAction(const int32 action)
+ void DoAction(int32 action)
{
if (action == EVENT_STICKY_OOZE)
events.CancelEvent(EVENT_STICKY_OOZE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -377,7 +377,7 @@ class npc_precious_icc : public CreatureScript
rotface->AI()->Talk(SAY_PRECIOUS_DIES);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index 45c5302bfe8..ea74d8ec61c 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -84,7 +84,9 @@ enum Spells
SPELL_CONCUSSIVE_SHOCK = 71337,
// Frost Infusion
- SPELL_FROST_INFUSION_CREDIT = 72289
+ SPELL_FROST_INFUSION_CREDIT = 72289,
+ SPELL_FROST_IMBUED_BLADE = 72290,
+ SPELL_FROST_INFUSION = 72292,
};
enum Events
@@ -147,11 +149,7 @@ enum MovementPoints
enum Shadowmourne
{
- QUEST_FROST_INFUSION = 24757,
- ITEM_SHADOW_S_EDGE = 49888,
-
- SPELL_FROST_INFUSION = 72292,
- SPELL_FROST_IMBUED_BLADE = 72290,
+ QUEST_FROST_INFUSION = 24757
};
Position const RimefangFlyPos = {4413.309f, 2456.421f, 233.3795f, 2.890186f};
@@ -271,7 +269,7 @@ class boss_sindragosa : public CreatureScript
Talk(SAY_KILL);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_START_FROSTWYRM)
{
@@ -390,50 +388,13 @@ class boss_sindragosa : public CreatureScript
void SpellHitTarget(Unit* target, SpellInfo const* spell)
{
if (uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(70127, me))
- {
if (spellId == spell->Id)
- {
if (Aura const* mysticBuffet = target->GetAura(spell->Id))
_mysticBuffetStack = std::max<uint8>(_mysticBuffetStack, mysticBuffet->GetStackAmount());
- return;
- }
- }
-
- // Frost Infusion
- if (Player* player = target->ToPlayer())
- {
- if (uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(_isThirdPhase ? SPELL_FROST_BREATH_P2 : SPELL_FROST_BREATH_P1, me))
- {
- if (spellId == spell->Id)
- {
- Item* shadowsEdge = player->GetWeaponForAttack(BASE_ATTACK, true);
- if (player->GetQuestStatus(QUEST_FROST_INFUSION) == QUEST_STATUS_INCOMPLETE && shadowsEdge)
- {
- if (!player->HasAura(SPELL_FROST_IMBUED_BLADE) && shadowsEdge->GetEntry() == ITEM_SHADOW_S_EDGE)
- {
- if (Aura* infusion = player->GetAura(SPELL_FROST_INFUSION))
- {
- if (infusion->GetStackAmount() == 3)
- {
- player->CastSpell(player, SPELL_FROST_IMBUED_BLADE, true);
- player->RemoveAura(infusion);
- }
- else
- player->CastSpell(player, SPELL_FROST_INFUSION, true);
- }
- else
- player->CastSpell(player, SPELL_FROST_INFUSION, true);
- }
- }
-
- return;
- }
- }
- }
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || !CheckInRoom())
return;
@@ -576,11 +537,12 @@ class npc_ice_tomb : public CreatureScript
public:
npc_ice_tomb() : CreatureScript("npc_ice_tomb") { }
- struct npc_ice_tombAI : public Scripted_NoMovementAI
+ struct npc_ice_tombAI : public ScriptedAI
{
- npc_ice_tombAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_ice_tombAI(Creature* creature) : ScriptedAI(creature)
{
_trappedPlayerGUID = 0;
+ SetCombatMovement(false);
}
void Reset()
@@ -597,7 +559,7 @@ class npc_ice_tomb : public CreatureScript
}
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_TRIGGER_ASPHYXIATION)
if (Player* player = ObjectAccessor::GetPlayer(*me, _trappedPlayerGUID))
@@ -616,7 +578,7 @@ class npc_ice_tomb : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!_trappedPlayerGUID)
return;
@@ -695,7 +657,7 @@ class npc_spinestalker : public CreatureScript
_events.Reset();
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_START_FROSTWYRM)
{
@@ -732,7 +694,7 @@ class npc_spinestalker : public CreatureScript
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -825,7 +787,7 @@ class npc_rimefang : public CreatureScript
_events.Reset();
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_START_FROSTWYRM)
{
@@ -867,7 +829,7 @@ class npc_rimefang : public CreatureScript
DoCast(me, SPELL_FROST_AURA_RIMEFANG, true);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -995,7 +957,7 @@ class npc_sindragosa_trash : public CreatureScript
return 0;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1154,6 +1116,50 @@ class spell_sindragosa_unchained_magic : public SpellScriptLoader
}
};
+class spell_sindragosa_frost_breath : public SpellScriptLoader
+{
+ public:
+ spell_sindragosa_frost_breath() : SpellScriptLoader("spell_sindragosa_frost_breath") { }
+
+ class spell_sindragosa_frost_breath_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_sindragosa_frost_breath_SpellScript);
+
+ void HandleInfusion()
+ {
+ Player* target = GetHitPlayer();
+ if (!target)
+ return;
+
+ if (target->GetQuestStatus(QUEST_FROST_INFUSION) != QUEST_STATUS_INCOMPLETE)
+ return;
+
+ // Check if player has Shadow's Edge equipped and not ready for infusion
+ if (!target->HasAura(SPELL_UNSATED_CRAVING) || target->HasAura(SPELL_FROST_IMBUED_BLADE))
+ return;
+
+ Aura* infusion = target->GetAura(SPELL_FROST_INFUSION, target->GetGUID());
+ if (infusion && infusion->GetStackAmount() >= 3)
+ {
+ target->RemoveAura(infusion);
+ target->CastSpell(target, SPELL_FROST_IMBUED_BLADE, TRIGGERED_FULL_MASK);
+ }
+ else
+ target->CastSpell(target, SPELL_FROST_INFUSION, TRIGGERED_FULL_MASK);
+ }
+
+ void Register()
+ {
+ AfterHit += SpellHitFn(spell_sindragosa_frost_breath_SpellScript::HandleInfusion);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_sindragosa_frost_breath_SpellScript();
+ }
+};
+
class spell_sindragosa_instability : public SpellScriptLoader
{
public:
@@ -1576,6 +1582,7 @@ void AddSC_boss_sindragosa()
new npc_sindragosa_trash();
new spell_sindragosa_s_fury();
new spell_sindragosa_unchained_magic();
+ new spell_sindragosa_frost_breath();
new spell_sindragosa_instability();
new spell_sindragosa_frost_beacon();
new spell_sindragosa_ice_tomb();
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
index 452d09cf65f..033674767e6 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
@@ -138,13 +138,14 @@ enum Spells
SPELL_IN_FROSTMOURNE_ROOM = 74276,
SPELL_KILL_FROSTMOURNE_PLAYERS = 75127,
SPELL_HARVESTED_SOUL = 72679,
- SPELL_TRIGGER_VILE_SPIRIT_HEROIC = 73582, // TODO: Cast every 3 seconds during Frostmourne phase, targets a Wicked Spirit amd activates it
+ SPELL_TRIGGER_VILE_SPIRIT_HEROIC = 73582, /// @todo Cast every 3 seconds during Frostmourne phase, targets a Wicked Spirit amd activates it
// Frostmourne
SPELL_LIGHTS_FAVOR = 69382,
SPELL_RESTORE_SOUL = 72595,
SPELL_RESTORE_SOULS = 73650, // Heroic
SPELL_DARK_HUNGER = 69383, // Passive proc healing
+ SPELL_DARK_HUNGER_HEAL = 69384,
SPELL_DESTROY_SOUL = 74086, // Used when Terenas Menethil dies
SPELL_SOUL_RIP = 69397, // Deals increasing damage
SPELL_SOUL_RIP_DAMAGE = 69398,
@@ -278,20 +279,10 @@ enum Phases
PHASE_THREE = 4,
PHASE_TRANSITION = 5,
PHASE_FROSTMOURNE = 6, // only set on heroic mode when all players are sent into frostmourne
- PHASE_OUTRO = 7,
-
- PHASE_MASK_INTRO = 1 << PHASE_INTRO,
- PHASE_MASK_ONE = 1 << PHASE_ONE,
- PHASE_MASK_TWO = 1 << PHASE_TWO,
- PHASE_MASK_THREE = 1 << PHASE_THREE,
- PHASE_MASK_TRANSITION = 1 << PHASE_TRANSITION,
- PHASE_MASK_NO_CAST_CHECK = (1 << PHASE_TRANSITION) | (1 << PHASE_FROSTMOURNE) | (1 << PHASE_OUTRO),
- PHASE_MASK_FROSTMOURNE = 1 << PHASE_FROSTMOURNE,
- PHASE_MASK_OUTRO = 1 << PHASE_OUTRO,
- PHASE_MASK_NO_VICTIM = (1 << PHASE_INTRO) | (1 << PHASE_OUTRO) | (1 << PHASE_FROSTMOURNE),
+ PHASE_OUTRO = 7
};
-#define PHASE_TWO_THREE (events.GetPhaseMask() & PHASE_MASK_TWO ? PHASE_TWO : PHASE_THREE)
+#define PHASE_TWO_THREE (events.IsInPhase(PHASE_TWO) ? PHASE_TWO : PHASE_THREE)
Position const CenterPosition = {503.6282f, -2124.655f, 840.8569f, 0.0f};
Position const TirionIntro = {489.2970f, -2124.840f, 840.8569f, 0.0f};
@@ -588,11 +579,11 @@ class boss_the_lich_king : public CreatureScript
void KilledUnit(Unit* victim)
{
- if (victim->GetTypeId() == TYPEID_PLAYER && !me->IsInEvadeMode() && !(events.GetPhaseMask() & PHASE_MASK_OUTRO))
+ if (victim->GetTypeId() == TYPEID_PLAYER && !me->IsInEvadeMode() && !events.IsInPhase(PHASE_OUTRO))
Talk(SAY_LK_KILL);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -668,7 +659,7 @@ class boss_the_lich_king : public CreatureScript
void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
{
- if (events.GetPhaseMask() & PHASE_MASK_ONE && !HealthAbovePct(70))
+ if (events.IsInPhase(PHASE_ONE) && !HealthAbovePct(70))
{
events.SetPhase(PHASE_TRANSITION);
me->SetReactState(REACT_PASSIVE);
@@ -677,7 +668,7 @@ class boss_the_lich_king : public CreatureScript
return;
}
- if (events.GetPhaseMask() & PHASE_MASK_TWO && !HealthAbovePct(40))
+ if (events.IsInPhase(PHASE_TWO) && !HealthAbovePct(40))
{
events.SetPhase(PHASE_TRANSITION);
me->SetReactState(REACT_PASSIVE);
@@ -686,7 +677,7 @@ class boss_the_lich_king : public CreatureScript
return;
}
- if (events.GetPhaseMask() & PHASE_MASK_THREE && !HealthAbovePct(10))
+ if (events.IsInPhase(PHASE_THREE) && !HealthAbovePct(10))
{
me->SetReactState(REACT_PASSIVE);
me->AttackStop();
@@ -757,7 +748,7 @@ class boss_the_lich_king : public CreatureScript
summon->SetReactState(REACT_PASSIVE);
summon->SetSpeed(MOVE_FLIGHT, 0.5f);
summon->GetMotionMaster()->MoveRandom(10.0f);
- if (!(events.GetPhaseMask() & PHASE_MASK_FROSTMOURNE))
+ if (!events.IsInPhase(PHASE_FROSTMOURNE))
summon->m_Events.AddEvent(new VileSpiritActivateEvent(summon), summon->m_Events.CalculateTime(15000));
return;
}
@@ -869,17 +860,17 @@ class boss_the_lich_king : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
// check phase first to prevent updating victim and entering evade mode when not wanted
- if (!(events.GetPhaseMask() & PHASE_MASK_NO_VICTIM))
+ if (!(events.IsInPhase(PHASE_OUTRO) || events.IsInPhase(PHASE_INTRO) || events.IsInPhase(PHASE_FROSTMOURNE)))
if (!UpdateVictim())
return;
events.Update(diff);
// during Remorseless Winter phases The Lich King is channeling a spell, but we must continue casting other spells
- if (me->HasUnitState(UNIT_STATE_CASTING) && !(events.GetPhaseMask() & PHASE_MASK_NO_CAST_CHECK))
+ if (me->HasUnitState(UNIT_STATE_CASTING) && !(events.IsInPhase(PHASE_TRANSITION) || events.IsInPhase(PHASE_OUTRO) || events.IsInPhase(PHASE_FROSTMOURNE)))
return;
while (uint32 eventId = events.ExecuteEvent())
@@ -935,7 +926,7 @@ class boss_the_lich_king : public CreatureScript
break;
case EVENT_INFEST:
DoCast(me, SPELL_INFEST);
- events.ScheduleEvent(EVENT_INFEST, urand(21000, 24000), 0, (events.GetPhaseMask() & PHASE_MASK_ONE) ? PHASE_ONE : PHASE_TWO);
+ events.ScheduleEvent(EVENT_INFEST, urand(21000, 24000), 0, events.IsInPhase(PHASE_ONE) ? PHASE_ONE : PHASE_TWO);
break;
case EVENT_NECROTIC_PLAGUE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, NecroticPlagueTargetCheck(me, NECROTIC_PLAGUE_LK, NECROTIC_PLAGUE_PLR)))
@@ -1004,7 +995,7 @@ class boss_the_lich_king : public CreatureScript
break;
case EVENT_START_ATTACK:
me->SetReactState(REACT_AGGRESSIVE);
- if (events.GetPhaseMask() & PHASE_MASK_FROSTMOURNE)
+ if (events.IsInPhase(PHASE_FROSTMOURNE))
events.SetPhase(PHASE_THREE);
break;
case EVENT_VILE_SPIRITS:
@@ -1203,7 +1194,7 @@ class npc_tirion_fordring_tft : public CreatureScript
}
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -1250,9 +1241,9 @@ class npc_tirion_fordring_tft : public CreatureScript
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
- if (!UpdateVictim() && !(_events.GetPhaseMask() & (PHASE_MASK_INTRO | PHASE_MASK_OUTRO)))
+ if (!UpdateVictim() && !(_events.IsInPhase(PHASE_OUTRO) || _events.IsInPhase(PHASE_INTRO)))
return;
_events.Update(diff);
@@ -1344,7 +1335,7 @@ class npc_shambling_horror_icc : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1424,7 +1415,7 @@ class npc_raging_spirit : public CreatureScript
summon->SetTempSummonType(TEMPSUMMON_CORPSE_DESPAWN);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1559,7 +1550,7 @@ class npc_valkyr_shadowguard : public CreatureScript
_grabbedPlayer = guid;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1634,7 +1625,7 @@ class npc_strangulate_vehicle : public CreatureScript
lichKing->AI()->JustSummoned(me);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action != ACTION_TELEPORT_BACK)
return;
@@ -1652,7 +1643,7 @@ class npc_strangulate_vehicle : public CreatureScript
lichKing->AI()->SummonedCreatureDespawn(me);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
UpdateVictim();
@@ -1733,7 +1724,7 @@ class npc_terenas_menethil : public CreatureScript
return target->GetEntry() != NPC_THE_LICH_KING;
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -1802,7 +1793,7 @@ class npc_terenas_menethil : public CreatureScript
_events.ScheduleEvent(EVENT_OUTRO_TERENAS_TALK_2, 14000, 0, PHASE_OUTRO);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
UpdateVictim();
@@ -1894,7 +1885,7 @@ class npc_spirit_warden : public CreatureScript
terenas->AI()->DoAction(ACTION_TELEPORT_BACK);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1962,7 +1953,7 @@ class npc_spirit_bomb : public CreatureScript
{
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
UpdateVictim();
// no melee attacks
@@ -1997,7 +1988,7 @@ class npc_broken_frostmourne : public CreatureScript
_events.ScheduleEvent(EVENT_OUTRO_KNOCK_BACK, 3000, 0, PHASE_OUTRO);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_SUMMON_TERENAS)
_events.ScheduleEvent(EVENT_OUTRO_SUMMON_TERENAS, 6000, 0, PHASE_OUTRO);
@@ -2007,7 +1998,7 @@ class npc_broken_frostmourne : public CreatureScript
{
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
UpdateVictim();
@@ -2187,7 +2178,8 @@ class spell_the_lich_king_necrotic_plague_jump : public SpellScriptLoader
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Unit* caster = GetCaster())
- caster->GetAI()->SetData(DATA_PLAGUE_STACK, GetStackAmount());
+ if (caster->GetAI())
+ caster->GetAI()->SetData(DATA_PLAGUE_STACK, GetStackAmount());
}
void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
@@ -2846,8 +2838,6 @@ class spell_the_lich_king_vile_spirit_damage_target_search : public SpellScriptL
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_vile_spirit_damage_target_search_SpellScript::CheckTargetCount, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
}
-
- Unit* _target;
};
SpellScript* GetSpellScript() const
@@ -3008,6 +2998,41 @@ class spell_the_lich_king_restore_soul : public SpellScriptLoader
}
};
+class spell_the_lich_king_dark_hunger : public SpellScriptLoader
+{
+ public:
+ spell_the_lich_king_dark_hunger() : SpellScriptLoader("spell_the_lich_king_dark_hunger") { }
+
+ class spell_the_lich_king_dark_hunger_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_the_lich_king_dark_hunger_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DARK_HUNGER_HEAL))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 heal = int32(eventInfo.GetDamageInfo()->GetDamage() / 2);
+ GetTarget()->CastCustomSpell(SPELL_DARK_HUNGER_HEAL, SPELLVALUE_BASE_POINT0, heal, GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_the_lich_king_dark_hunger_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_the_lich_king_dark_hunger_AuraScript();
+ }
+};
+
class spell_the_lich_king_in_frostmourne_room : public SpellScriptLoader
{
public:
@@ -3253,6 +3278,7 @@ void AddSC_boss_the_lich_king()
new spell_the_lich_king_lights_favor();
new spell_the_lich_king_soul_rip();
new spell_the_lich_king_restore_soul();
+ new spell_the_lich_king_dark_hunger();
new spell_the_lich_king_in_frostmourne_room();
new spell_the_lich_king_summon_spirit_bomb();
new spell_the_lich_king_trigger_vile_spirit();
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
index df23abd8312..97a70f43c27 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
@@ -316,7 +316,7 @@ class boss_valithria_dreamwalker : public CreatureScript
{
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action != ACTION_ENTER_COMBAT)
return;
@@ -423,7 +423,7 @@ class boss_valithria_dreamwalker : public CreatureScript
++_missedPortals;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
// does not enter combat
if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) != IN_PROGRESS)
@@ -536,7 +536,7 @@ class npc_green_dragon_combat_trigger : public CreatureScript
DoAction(ACTION_DEATH);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_DEATH)
{
@@ -545,7 +545,7 @@ class npc_green_dragon_combat_trigger : public CreatureScript
}
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!me->isInCombat())
return;
@@ -624,7 +624,7 @@ class npc_the_lich_king_controller : public CreatureScript
summon->AI()->AttackStart(target);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -716,7 +716,7 @@ class npc_risen_archmage : public CreatureScript
}
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action != ACTION_ENTER_COMBAT)
return;
@@ -734,7 +734,7 @@ class npc_risen_archmage : public CreatureScript
summon->DespawnOrUnsummon(36000);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!me->isInCombat())
if (me->GetDBTableGUIDLow())
@@ -805,7 +805,7 @@ class npc_blazing_skeleton : public CreatureScript
_events.ScheduleEvent(EVENT_LEY_WASTE, urand(15000, 20000));
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -871,7 +871,7 @@ class npc_suppresser : public CreatureScript
AttackStart(valithria);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -928,7 +928,7 @@ class npc_blistering_zombie : public CreatureScript
DoCast(me, SPELL_ACID_BURST, true);
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!UpdateVictim())
return;
@@ -965,7 +965,7 @@ class npc_gluttonous_abomination : public CreatureScript
DoCast(me, SPELL_ROT_WORM_SPAWNER, true);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1024,7 +1024,7 @@ class npc_dream_portal : public CreatureScript
return (type == MISSED_PORTALS && _used) ? 0 : 1;
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
UpdateVictim();
}
@@ -1059,7 +1059,7 @@ class npc_dream_cloud : public CreatureScript
me->LoadCreaturesAddon(true);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
// trigger
if (_instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) != IN_PROGRESS)
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
index 12868094b2e..3ffa6a0c4be 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
@@ -460,7 +460,7 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (_damnedKills != 2)
return;
@@ -611,7 +611,7 @@ class npc_rotting_frost_giant : public CreatureScript
_events.Reset();
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -664,13 +664,14 @@ class npc_frost_freeze_trap : public CreatureScript
public:
npc_frost_freeze_trap() : CreatureScript("npc_frost_freeze_trap") { }
- struct npc_frost_freeze_trapAI: public Scripted_NoMovementAI
+ struct npc_frost_freeze_trapAI: public ScriptedAI
{
- npc_frost_freeze_trapAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_frost_freeze_trapAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -683,7 +684,7 @@ class npc_frost_freeze_trap : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
_events.Update(diff);
@@ -807,7 +808,7 @@ class boss_sister_svalna : public CreatureScript
me->SetHover(false);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -876,7 +877,7 @@ class boss_sister_svalna : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() && !_isEventInProgress)
return;
@@ -955,7 +956,7 @@ class npc_crok_scourgebane : public CreatureScript
_wipeCheckTimer = 1000;
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_START_GAUNTLET)
{
@@ -1237,7 +1238,7 @@ struct npc_argent_captainAI : public ScriptedAI
Talk(SAY_CAPTAIN_KILL);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_START_GAUNTLET)
{
@@ -1355,7 +1356,7 @@ class npc_captain_arnath : public CreatureScript
Events.ScheduleEvent(EVENT_ARNATH_DOMINATE_MIND, urand(22000, 27000));
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1436,7 +1437,7 @@ class npc_captain_brandon : public CreatureScript
Events.ScheduleEvent(EVENT_BRANDON_HAMMER_OF_BETRAYAL, urand(25000, 30000));
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1504,7 +1505,7 @@ class npc_captain_grondel : public CreatureScript
Events.ScheduleEvent(EVENT_GRONDEL_CONFLAGRATION, urand(12000, 17000));
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1569,7 +1570,7 @@ class npc_captain_rupert : public CreatureScript
Events.ScheduleEvent(EVENT_RUPERT_ROCKET_LAUNCH, urand(10000, 15000));
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1654,7 +1655,7 @@ class npc_impaling_spear : public CreatureScript
_vehicleCheckTimer = 500;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (_vehicleCheckTimer <= diff)
{
@@ -1695,7 +1696,7 @@ class npc_arthas_teleport_visual : public CreatureScript
_events.ScheduleEvent(EVENT_SOUL_MISSILE, urand(1000, 6000));
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (_events.Empty())
return;
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
index 1407568686f..887a31baf9a 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
@@ -56,6 +56,7 @@ enum SharedSpells
SPELL_FROSTMOURNE_TELEPORT_VISUAL = 73078,
// Shadowmourne questline
+ SPELL_UNSATED_CRAVING = 71168,
SPELL_SHADOWS_FATE = 71169
};
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp
index 1efee1b45ba..c528b8413af 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp
@@ -42,7 +42,7 @@ class icecrown_citadel_teleport : public GameObjectScript
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Deathbringer's Rise.", GOSSIP_SENDER_ICC_PORT, DEATHBRINGER_S_RISE_TELEPORT);
if (instance->GetData(DATA_COLDFLAME_JETS) == DONE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Upper Spire.", GOSSIP_SENDER_ICC_PORT, UPPER_SPIRE_TELEPORT);
- // TODO: Gauntlet event before Sindragosa
+ /// @todo Gauntlet event before Sindragosa
if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to Sindragosa's Lair", GOSSIP_SENDER_ICC_PORT, SINDRAGOSA_S_LAIR_TELEPORT);
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
index 462708360e3..db4ab2f32d2 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
@@ -435,7 +435,7 @@ class instance_icecrown_citadel : public InstanceMapScript
// these 2 gates are functional only on 25man modes
case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_01:
case GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_04:
- if (instance->GetSpawnMode() & 1)
+ if (instance->Is25ManRaid())
AddDoor(go, true);
break;
case GO_LADY_DEATHWHISPER_ELEVATOR:
@@ -954,7 +954,7 @@ class instance_icecrown_citadel : public InstanceMapScript
bool CheckRequiredBosses(uint32 bossId, Player const* player = NULL) const
{
- if (player && AccountMgr::IsGMAccount(player->GetSession()->GetSecurity()))
+ if (player && player->GetSession()->HasPermission(RBAC_PERM_SKIP_CHECK_INSTANCE_REQUIRED_BOSSES))
return true;
switch (bossId)
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
index 14e2d05a7c1..421dabf48ac 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
@@ -95,7 +95,7 @@ public:
void KilledUnit(Unit* victim)
{
- //Force the player to spawn corpse scarabs via spell, TODO: Check percent chance for scarabs, 20% at the moment
+ /// 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());
@@ -144,7 +144,7 @@ public:
summon->CastSpell(summon, SPELL_SUMMON_CORPSE_SCARABS_MOB, true, NULL, NULL, me->GetGUID());
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || !CheckInRoom())
return;
@@ -164,13 +164,13 @@ public:
events.ScheduleEvent(EVENT_IMPALE, urand(10000, 20000));
break;
case EVENT_LOCUST:
- // TODO : Add Text
+ /// @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
+ /// @todo Add Text
DoSummon(MOB_CRYPT_GUARD, GuardSummonPos, 0, TEMPSUMMON_CORPSE_DESPAWN);
break;
case EVENT_BERSERK:
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp
index 4d5efe4e89c..316ddee540c 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp
@@ -107,7 +107,7 @@ class boss_faerlina : public CreatureScript
{
if (spell->Id == SPELL_WIDOWS_EMBRACE || spell->Id == H_SPELL_WIDOWS_EMBRACE)
{
- // TODO : Add Text
+ /// @todo Add Text
++_frenzyDispels;
_delayFrenzy = true;
me->Kill(caster);
@@ -122,7 +122,7 @@ class boss_faerlina : public CreatureScript
return 0;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -153,7 +153,7 @@ class boss_faerlina : public CreatureScript
events.ScheduleEvent(EVENT_FIRE, urand(6000, 18000));
break;
case EVENT_FRENZY:
- // TODO : Add Text
+ /// @todo Add Text
if (!me->HasAura(SPELL_WIDOWS_EMBRACE_HELPER))
DoCast(me, RAID_MODE(SPELL_FRENZY, H_SPELL_FRENZY));
else
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp
index e037f627bee..9013b051b9a 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp
@@ -326,7 +326,7 @@ public:
events.ScheduleEvent(EVENT_BERSERK, 15*100*1000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (nextWP && movementStarted && !movementCompleted && !nextMovementStarted)
{
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp
index c735107968a..86ea9ce929a 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp
@@ -69,7 +69,7 @@ public:
if (who->GetEntry() == MOB_ZOMBIE && me->IsWithinDistInMap(who, 7))
{
SetGazeOn(who);
- // TODO: use a script text
+ /// @todo use a script text
me->MonsterTextEmote(EMOTE_NEARBY, 0, true);
}
else
@@ -93,7 +93,7 @@ public:
summons.Summon(summon);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictimWithGaze() || !CheckInRoom())
return;
@@ -109,12 +109,12 @@ public:
events.ScheduleEvent(EVENT_WOUND, 10000);
break;
case EVENT_ENRAGE:
- // TODO : Add missing text
+ /// @todo Add missing text
DoCast(me, SPELL_ENRAGE);
events.ScheduleEvent(EVENT_ENRAGE, 15000);
break;
case EVENT_DECIMATE:
- // TODO : Add missing text
+ /// @todo Add missing text
DoCastAOE(SPELL_DECIMATE);
events.ScheduleEvent(EVENT_DECIMATE, 105000);
break;
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
index 21f3141393a..451992b1d91 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
@@ -393,7 +393,7 @@ class boss_gothik : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || !CheckInRoom())
return;
@@ -524,7 +524,7 @@ class mob_gothik_minion : public CreatureScript
return (liveSide == IN_LIVE_SIDE(who));
}
- void DoAction(int32 const param)
+ void DoAction(int32 param)
{
gateClose = param;
}
@@ -574,7 +574,7 @@ class mob_gothik_minion : public CreatureScript
Reset();
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (gateClose && (!isOnSameSide(me) || (me->getVictim() && !isOnSameSide(me->getVictim()))))
{
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp
index f3f2e587178..3e44fe9eba4 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp
@@ -20,25 +20,33 @@
#include "naxxramas.h"
#include "SpellInfo.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
+enum Spells
+{
+ SPELL_BOMBARD_SLIME = 28280,
+ SPELL_POISON_CLOUD = 28240,
+ SPELL_MUTATING_INJECTION = 28169,
+ SPELL_SLIME_SPRAY = 28157,
+ H_SPELL_SLIME_SPRAY = 54364,
+ SPELL_BERSERK = 26662,
+ SPELL_POISON_CLOUD_ADD = 59116
+};
-#define EVENT_BERSERK 1
-#define EVENT_CLOUD 2
-#define EVENT_INJECT 3
-#define EVENT_SPRAY 4
+enum Events
+{
+ EVENT_BERSERK = 0,
+ EVENT_CLOUD = 1,
+ EVENT_INJECT = 2,
+ EVENT_SPRAY = 3
+};
-#define MOB_FALLOUT_SLIME 16290
+enum CreatureId
+{
+ MOB_FALLOUT_SLIME = 16290
+};
class boss_grobbulus : public CreatureScript
{
-public:
- boss_grobbulus() : CreatureScript("boss_grobbulus") { }
+public: boss_grobbulus() : CreatureScript("boss_grobbulus") { }
CreatureAI* GetAI(Creature* creature) const
{
@@ -70,7 +78,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -117,11 +125,11 @@ public:
return new npc_grobbulus_poison_cloudAI(creature);
}
- struct npc_grobbulus_poison_cloudAI : public Scripted_NoMovementAI
+ struct npc_grobbulus_poison_cloudAI : public ScriptedAI
{
- npc_grobbulus_poison_cloudAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_grobbulus_poison_cloudAI(Creature* creature) : ScriptedAI(creature)
{
- Reset();
+ SetCombatMovement(false);
}
uint32 Cloud_Timer;
@@ -132,7 +140,7 @@ public:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (Cloud_Timer <= diff)
{
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp
index c88ac807421..61640f1d225 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp
@@ -133,7 +133,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || !CheckInRoom())
return;
@@ -153,7 +153,7 @@ public:
events.ScheduleEvent(EVENT_FEVER, urand(20000, 25000));
break;
case EVENT_PHASE:
- // TODO : Add missing texts for both phase switches
+ /// @todo Add missing texts for both phase switches
EnterPhase(phase == PHASE_FIGHT ? PHASE_DANCE : PHASE_FIGHT);
break;
case EVENT_ERUPT:
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
index 35f703e0563..9b5b26dd4f5 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
@@ -382,7 +382,7 @@ public:
KTTriggerGUID = instance ? instance->GetData64(DATA_KELTHUZAD_TRIGGER) : 0;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -474,7 +474,7 @@ public:
{
if (uiGuardiansOfIcecrownTimer <= diff)
{
- // TODO : Add missing text
+ /// @todo Add missing text
if (Creature* pGuardian = DoSummon(NPC_ICECROWN, Pos[RAND(2, 5, 8, 11)]))
pGuardian->SetFloatValue(UNIT_FIELD_COMBATREACH, 2);
++nGuardiansOfIcecrownCount;
@@ -603,7 +603,7 @@ public:
ThreatContainer::StorageType const &threatList = me->getThreatManager().getThreatList();
for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
{
- Unit * const target = (*itr)->getTarget();
+ Unit* const target = (*itr)->getTarget();
if (target->GetTypeId() == TYPEID_PLAYER
&& target->getPowerType() == POWER_MANA
@@ -735,7 +735,7 @@ class npc_kelthuzad_abomination : public CreatureScript
DoCast(me, SPELL_FRENZY, true);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp
index 75fe66b9faf..3664a166a9f 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp
@@ -93,7 +93,7 @@ class boss_loatheb : public CreatureScript
return uint32(_sporeLoserData);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
index 28def13a0d2..f1b2d9aeaed 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
@@ -85,7 +85,7 @@ public:
events.ScheduleEvent(EVENT_SUMMON, 30000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || !CheckInRoom())
return;
@@ -103,7 +103,7 @@ public:
switch (eventId)
{
case EVENT_WRAP:
- // TODO : Add missing text
+ /// @todo Add missing text
for (uint8 i = 0; i < RAID_MODE(1, 2); ++i)
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0, true, -SPELL_WEB_WRAP))
@@ -134,7 +134,7 @@ public:
events.ScheduleEvent(EVENT_FRENZY, 600000);
break;
case EVENT_SUMMON:
- // TODO : Add missing text
+ /// @todo Add missing text
uint8 amount = urand(8, 10);
for (uint8 i = 0; i < amount; ++i)
DoSummon(MOB_SPIDERLING, me, 0, TEMPSUMMON_CORPSE_DESPAWN);
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp
index 89b65615a2e..d0034628424 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp
@@ -145,7 +145,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || !CheckInRoom())
return;
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
index e77a9708ba5..13a5340fa8e 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
@@ -98,7 +98,7 @@ public:
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp
index 52dfd60f5f8..c78f7d0a757 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp
@@ -86,7 +86,7 @@ public:
{
_JustDied();
DoPlaySoundToSet(me, SOUND_DEATH);
- me->CastSpell(me, SPELL_HOPELESS, true); // TODO: this may affect other creatures
+ me->CastSpell(me, SPELL_HOPELESS, true); /// @todo this may affect other creatures
}
void EnterCombat(Unit* /*who*/)
@@ -99,7 +99,7 @@ public:
events.ScheduleEvent(EVENT_KNIFE, 10000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
index cd68d7ecac3..878107ab35d 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
@@ -159,7 +159,7 @@ class boss_sapphiron : public CreatureScript
events.ScheduleEvent(EVENT_LIFTOFF, 0);
}
- void DoAction(int32 const param)
+ void DoAction(int32 param)
{
if (param == DATA_SAPPHIRON_BIRTH)
{
@@ -217,7 +217,7 @@ class boss_sapphiron : public CreatureScript
return 0;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!_phase)
return;
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
index 6c09e7156fe..ea50c67ad1c 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
@@ -159,7 +159,7 @@ public:
Talk(SAY_DEATH);
}
- void DoAction(const int32 action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -218,7 +218,7 @@ public:
return uint32(polaritySwitch);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (checkFeugenAlive && checkStalaggAlive)
uiAddsTimer = 0;
@@ -331,7 +331,7 @@ public:
pThaddius->AI()->DoAction(ACTION_STALAGG_DIED);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
@@ -423,7 +423,7 @@ public:
pThaddius->AI()->DoAction(ACTION_FEUGEN_DIED);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
index 952363c6dcf..47e39574690 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
@@ -16,143 +16,207 @@
*/
/* Script Data Start
-SDName: Boss malygos
+SDName: Boss Malygos
Script Data End */
-// TO-DOs:
-// Implement a better pathing for Malygos.
-// Find sniffed spawn position for chest
-// Implement a better way to disappear the gameobjects
-// Implement achievements
-// Remove hack that re-adds targets to the aggro list after they enter to a vehicle when it works as expected
-// Improve whatever can be improved :)
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
-#include "PassiveAI.h"
#include "eye_of_eternity.h"
-#include "ScriptedEscortAI.h"
#include "Player.h"
#include "Vehicle.h"
#include "CombatAI.h"
+#include "GameObjectAI.h"
#include "CreatureTextMgr.h"
-
-enum Achievements
-{
- ACHIEV_TIMED_START_EVENT = 20387,
-};
+#include "MoveSplineInit.h"
enum Events
{
- // =========== PHASE ONE ===============
- EVENT_ARCANE_BREATH = 1,
- EVENT_ARCANE_STORM = 2,
- EVENT_VORTEX = 3,
- EVENT_POWER_SPARKS = 4,
+ // =========== INTRO BEFORE WE START ENCOUNTER ===============
+ EVENT_STOP_PORTAL_BEAM = 1,
+ EVENT_RANDOM_PORTAL = 2,
+ EVENT_SAY_INTRO = 3,
+ EVENT_LAND_START_ENCOUNTER = 4,
- // =========== PHASE TWO ===============
- EVENT_SURGE_POWER = 5, // wowhead is wrong, Surge of Power is casted instead of Arcane Pulse (source sniffs!)
- EVENT_SUMMON_ARCANE = 6,
+ // =========== PHASE ONE ===============
+ EVENT_ARCANE_BREATH = 5,
+ EVENT_ARCANE_STORM = 6,
+ EVENT_VORTEX = 7,
+ EVENT_POWER_SPARKS = 8,
// =========== PHASE TWO ===============
- EVENT_SURGE_POWER_PHASE_3 = 7,
- EVENT_STATIC_FIELD = 8,
-
- // =============== YELLS ===============
- EVENT_YELL_0 = 9,
- EVENT_YELL_1 = 10,
- EVENT_YELL_2 = 11,
- EVENT_YELL_3 = 12,
- EVENT_YELL_4 = 13,
+ EVENT_FLY_OUT_OF_PLATFORM = 9,
+ EVENT_DELAYED_REINFORCEMENTS = 10,
+ EVENT_PATHING_AROUND_PLATFORM = 11,
+ EVENT_SURGE_OF_POWER_P_TWO = 12,
+ EVENT_SUMMON_ARCANE_BOMB = 13,
+ EVENT_MOVE_TO_POINT_SURGE_P_TWO = 14,
+ EVENT_LIGHT_DIMENSION_CHANGE = 15,
+ EVENT_MOVE_TO_P_THREE_POINT = 16,
+ EVENT_START_P_THREE = 17,
+
+ // =========== PHASE THREE =============
+ EVENT_ARCANE_PULSE = 18,
+ EVENT_SURGE_OF_POWER_P_THREE = 19,
+ EVENT_STATIC_FIELD = 20,
+
+ // ========== MISC MECHANICS ===========
+ EVENT_PREVENT_SAY_SPAM_ON_KILL = 21,
+ EVENT_MOVE_TO_VORTEX_POINT = 22, // This should be fixed someday in core, we can't call new movement from MovementInform
+ EVENT_START_FIRST_RANDOM_PORTAL = 23, // There is something that is still loading when we first enter instance and it breaks
+ // first visual cast of intro portal beam mechanic, so we need short delay from the event.
+ EVENT_DELAY_MOVE_TO_DESTROY_P = 24, // If Malygos is too close to destroy platform point and transition from II to III is hit,
+ // this event will be sheduled to start after 5 seconds so there is enough time for "dimension change".
+
+ // ============ NEXUS LORDS ============
+ EVENT_ARCANE_SHOCK = 1,
+ EVENT_HASTE_BUFF = 2,
+ EVENT_NUKE_DUMMY = 3,
+
+ // ======== SCIONS OF ETERNITY =========
+ EVENT_ARCANE_BARRAGE = 1,
+
+ // ======== WYRMREST SKYTALON ==========
+ EVENT_CAST_RIDE_SPELL = 1
};
enum Phases
{
- PHASE_ONE = 1,
- PHASE_TWO = 2,
- PHASE_THREE = 3
+ PHASE_NOT_STARTED = 1,
+ PHASE_ONE = 2,
+ PHASE_TWO = 3,
+ PHASE_THREE = 4
};
enum Spells
{
- SPELL_ARCANE_BREATH = 56272,
- SPELL_ARCANE_STORM = 57459,
- SPELL_BERSEKER = 60670,
-
- SPELL_VORTEX_1 = 56237, // seems that frezze object animation
- SPELL_VORTEX_2 = 55873, // visual effect
- SPELL_VORTEX_3 = 56105, // this spell must handle all the script - casted by the boss and to himself
- //SPELL_VORTEX_4 = 55853, // damage | used to enter to the vehicle - defined in eye_of_eternity.h
- //SPELL_VORTEX_5 = 56263, // damage | used to enter to the vehicle - defined in eye_of_eternity.h
- SPELL_VORTEX_6 = 73040, // teleport - (casted to all raid) | caster 30090 | target player
-
- SPELL_PORTAL_VISUAL_CLOSED = 55949,
- SPELL_SUMMON_POWER_PARK = 56142,
- SPELL_POWER_SPARK_DEATH = 55852,
- SPELL_POWER_SPARK_MALYGOS = 56152,
-
- SPELL_SURGE_POWER = 56505, // used in phase 2
- SPELL_SUMMON_ARCANE_BOMB = 56429,
- SPELL_ARCANE_OVERLOAD = 56432,
- SPELL_SUMMOM_RED_DRAGON = 56070,
- SPELL_SURGE_POWER_PHASE_3 = 57407,
- SPELL_STATIC_FIELD = 57430
+ // Intro
+ SPELL_RANDOM_PORTAL = 56047,
+ SPELL_PORTAL_BEAM = 56046, // Malygos cast on portal to activate it during PHASE_NOT_STARTED
+
+ //Phase I
+ SPELL_BERSEKER = 60670,
+ SPELL_MALYGOS_BERSERK = 47008, // it's the berserk spell that will hit only Malygos after 10 min of 60670
+ SPELL_PORTAL_VISUAL_CLOSED = 55949,
+ SPELL_SUMMON_POWER_PARK = 56142,
+ SPELL_POWER_SPARK_DEATH = 55852,
+ SPELL_POWER_SPARK_MALYGOS = 56152,
+ SPELL_ARCANE_BREATH = 56272,
+ SPELL_ARCANE_STORM_P_I = 61693,
+ SPELL_VORTEX_1 = 56237, // seems that frezze object animation
+ SPELL_VORTEX_2 = 55873, // visual effect
+ SPELL_VORTEX_3 = 56105, // this spell must handle all the script - casted by the boss and to himself
+ SPELL_VORTEX_6 = 73040, // teleport - (casted to all raid), caster vortex bunnies, targets players.
+
+ // Phase II
+ SPELL_TELEPORT_VISUAL_ONLY = 41232, // Light blue animation cast by arcane NPCs when spawned on Hover Disks
+ SPELL_RIDE_HOVER_DISK = 61421,
+ SPELL_ALIGN_DISK_AGGRO = 61210,
+ SPELL_DUMMY_NUKE = 61215,
+ SPELL_SUMMON_ARCANE_BOMB = 56429,
+ SPELL_ARCANE_BOMB_TRIGGER = 56430,
+ SPELL_ARCANE_BOMB_KNOCKBACK_DAMAGE = 56431,
+ SPELL_ARCANE_OVERLOAD_1 = 56432, // casted by npc Arcane Overload ID: 30282
+ // SPELL_ARCANE_OVERLOAD_2 = 56435, // Triggered by 56432 - resizing target
+ // SPELL_ARCANE_OVERLOAD_3 = 56438, // Triggered by 56432 - damage reduction
+ SPELL_SURGE_OF_POWER_P_II = 56505,
+ // SPELL_SURGE_OF_POWER_TRIGGERED = 56548,
+ SPELL_ARCANE_SHOCK = 57058, // used by Nexus Lords
+ SPELL_HASTE = 57060, // used by Nexus Lords
+ SPELL_ARCANE_BARRAGE = 56397, // used by Scions of Eternity
+ SPELL_ARCANE_BARRAGE_DAMAGE = 63934, // the actual damage - cast by affected player by script spell
+
+ // Transition /II-III/
+ SPELL_SUMMOM_RED_DRAGON_BUDYY = 56070,
+ SPELL_RIDE_RED_DRAGON_BUDDY = 56071,
+ SPELL_SUMMON_RED_DRAGON_BUDDY_F_CAST = 58846, // After implicitly hit player targets they will force cast 56070 on self
+ SPELL_DESTROY_PLATFORM_CHANNEL = 58842,
+ SPELL_DESTROY_PLATFORM_BOOM_VISUAL = 59084,
+ SPELL_DESTROY_PLATFORM_EVENT = 59099,
+
+ // Phase III
+ SPELL_CLEAR_ALL_DEBUFFS = 34098,
+ SPELL_IMMUNE_CURSES = 64515,
+ SPELL_STATIC_FIELD_MISSLE = 57430,
+ SPELL_ARCANE_PULSE = 57432,
+ SPELL_SURGE_OF_POWER_PHASE_3_10 = 57407,
+ SPELL_SURGE_OF_POWER_PHASE_3_25 = 60936,
+ SPELL_SURGE_OF_POWER_WARNING_SELECTOR_25 = 60939, // used in 25 player mode for selecting targets for warnings and then sends to actual spell
+ SPELL_ARCANE_STORM_P_III = 57459,
+
+ // Phase I and III
+ SPELL_ARCANE_STORM_EXTRA_VISUAL = 57473,
+
+ // Outro
+ SPELL_ALEXSTRASZAS_GIFT_BEAM_VISUAL = 61023
};
enum Movements
{
- MOVE_VORTEX = 1,
- MOVE_PHASE_TWO,
- MOVE_DEEP_BREATH_ROTATION,
- MOVE_INIT_PHASE_ONE,
- MOVE_CENTER_PLATFORM
+ POINT_NEAR_RANDOM_PORTAL_P_NONE = 1,
+ POINT_LAND_P_ONE,
+ POINT_VORTEX_P_ONE,
+ POINT_LAND_AFTER_VORTEX_P_ONE,
+ POINT_LIFT_IN_AIR_P_ONE,
+ POINT_PHASE_ONE_TO_TWO_TRANSITION,
+ POINT_FLY_OUT_OF_PLATFORM_P_TWO,
+ POINT_SURGE_OF_POWER_P_TWO,
+ POINT_DESTROY_PLATFORM_P_TWO,
+ POINT_IDLE_P_THREE,
};
enum Seats
{
- SEAT_0 = 0,
+ SEAT_0 = 0
};
enum Factions
{
- FACTION_FRIENDLY = 35,
- FACTION_HOSTILE = 14
+ // Needed for melee hover disks /when Nexus Lords die/
+ FACTION_FRIENDLY = 35
};
enum Actions
{
- ACTION_HOVER_DISK_START_WP_1,
- ACTION_HOVER_DISK_START_WP_2
-};
-
-enum MalygosEvents
-{
- DATA_SUMMON_DEATHS, // phase 2
- DATA_PHASE
+ // Malygos
+ ACTION_LAND_ENCOUNTER_START = 0,
+ ACTION_EXECUTE_VORTEX = 1,
+ ACTION_HANDLE_P_THREE_INTRO = 2,
+ ACTION_LIFT_IN_AIR = 3,
+ ACTION_HANDLE_RESPAWN = 4,
+ ACTION_CYCLIC_MOVEMENT = 5,
+
+ // Caster hover disk despawn action
+ ACTION_DELAYED_DESPAWN = 8,
+
+ // Nexus Lord's action used to shedule casting spell that determine disk's target to chase
+ ACTION_SET_DISK_VICTIM_CHASE = 0
};
-#define TEN_MINUTES 600000
-
enum Texts
{
// Malygos
- SAY_AGGRO_P_ONE = 0,
- SAY_KILLED_PLAYER_P_ONE = 1,
- SAY_END_P_ONE = 2,
- SAY_AGGRO_P_TWO = 3,
- SAY_ANTI_MAGIC_SHELL = 4, // not sure when execute it
- SAY_MAGIC_BLAST = 5, // not sure when execute it
- SAY_KILLED_PLAYER_P_TWO = 6,
- SAY_END_P_TWO = 7,
- SAY_INTRO_P_THREE = 8,
- SAY_AGGRO_P_THREE = 9,
- SAY_SURGE_POWER = 10, // not sure when execute it
- SAY_BUFF_SPARK = 11,
- SAY_KILLED_PLAYER_P_THREE = 12,
- SAY_SPELL_CASTING_P_THREE = 13,
- SAY_DEATH,
+ SAY_INTRO_EVENT = 0,
+ SAY_START_P_ONE = 1,
+ SAY_DEEP_BREATH = 2,
+ SAY_KILLED_PLAYER_P_ONE = 3,
+ SAY_END_P_ONE = 4,
+ // SAY_START_P_TWO = 5, // Unused by Blizzard for some reason on any version
+ SAY_ANTI_MAGIC_SHELL = 6,
+ SAY_MAGIC_BLAST = 7,
+ SAY_KILLED_PLAYER_P_TWO = 8,
+ SAY_END_P_TWO = 9,
+ SAY_START_P_THREE = 10,
+ // SAY_START_P_THREE = 11, // Unused by Blizzard for some reason on any version
+ EMOTE_SURGE_OF_POWER_WARNING_P2 = 12,
+ SAY_SURGE_OF_POWER = 13,
+ SAY_BUFF_SPARK = 14,
+ SAY_KILLED_PLAYER_P_THREE = 15,
+ SAY_SPELL_CASTING_P_THREE = 16,
+ SAY_DEATH = 17,
+ EMOTE_SURGE_OF_POWER_WARNING_P3 = 18,
+ EMOTE_HIT_BERSERKER_TIMER = 19,
// Alexstrasza
SAY_ONE = 0,
@@ -161,252 +225,442 @@ enum Texts
SAY_FOUR = 3,
// Power Sparks
- EMOTE_POWER_SPARK_SUMMONED = 0
+ EMOTE_POWER_SPARK_SUMMONED = 0
};
+#define MAX_SUMMONS_PHASE_TWO_10MAN 6
+#define MAX_SUMMONS_PHASE_TWO_25MAN 12
-#define MAX_HOVER_DISK_WAYPOINTS 18
+#define MAX_RANGE_HOVER_DISK_SPAWNPOINTS 8
+Position const RangeHoverDisksSpawnPositions[MAX_RANGE_HOVER_DISK_SPAWNPOINTS] =
+{
+ { 782.9821f, 1296.652f, 282.1114f, 0.0f },
+ { 764.3126f, 1328.871f, 282.3091f, 0.0f },
+ { 725.8506f, 1306.749f, 282.2698f, 0.0f },
+ { 744.5175f, 1274.396f, 282.3402f, 0.0f },
+ { 764.3936f, 1274.371f, 282.6011f, 0.0f },
+ { 779.3761f, 1316.166f, 282.1653f, 0.0f },
+ { 744.4915f, 1328.901f, 282.2112f, 0.0f },
+ { 729.2364f, 1287.328f, 282.4173f, 0.0f }
+};
-// Sniffed data (x, y,z)
-const Position HoverDiskWaypoints[MAX_HOVER_DISK_WAYPOINTS] =
+#define MAX_MELEE_HOVER_DISK_SPAWNPOINTS 4
+Position const MeleeHoverDisksSpawnPositions[MAX_RANGE_HOVER_DISK_SPAWNPOINTS] =
{
- {782.9821f, 1296.652f, 282.1114f, 0.0f},
- {779.5459f, 1287.228f, 282.1393f, 0.0f},
- {773.0028f, 1279.52f, 282.4164f, 0.0f},
- {764.3626f, 1274.476f, 282.4731f, 0.0f},
- {754.3961f, 1272.639f, 282.4171f, 0.0f},
- {744.4422f, 1274.412f, 282.222f, 0.0f},
- {735.575f, 1279.742f, 281.9674f, 0.0f},
- {729.2788f, 1287.187f, 281.9943f, 0.0f},
- {726.1191f, 1296.688f, 282.2997f, 0.0f},
- {725.9396f, 1306.531f, 282.2448f, 0.0f},
- {729.3045f, 1316.122f, 281.9108f, 0.0f},
- {735.8322f, 1323.633f, 282.1887f, 0.0f},
- {744.4616f, 1328.999f, 281.9948f, 0.0f},
- {754.4739f, 1330.666f, 282.049f, 0.0f},
- {764.074f, 1329.053f, 281.9949f, 0.0f},
- {772.8409f, 1323.951f, 282.077f, 0.0f},
- {779.5085f, 1316.412f, 281.9145f, 0.0f},
- {782.8365f, 1306.778f, 282.3035f, 0.0f},
+ { 754.4617f, 1283.859f, 285.0522f, 0.0f },
+ { 771.7864f, 1301.853f, 285.0522f, 0.0f },
+ { 753.9635f, 1319.003f, 285.0522f, 0.0f },
+ { 736.4914f, 1301.683f, 285.0522f, 0.0f }
};
-#define GROUND_Z 268
+#define MAX_MELEE_HOVER_DISK_WAYPOINTS 16
+Position const MeleeHoverDisksWaypoints[MAX_MELEE_HOVER_DISK_WAYPOINTS] =
+{
+ // First melee hover disk wps
+ { 766.2931f, 1312.904f, 277.0551f, 0.0f },
+ { 754.3397f, 1319.759f, 274.0536f, 0.0f },
+ { 742.1018f, 1312.714f, 270.1367f, 0.0f },
+ { 735.6851f, 1301.422f, 266.7208f, 0.0f },
+ // Second melee hover disk wps
+ { 742.6257f, 1313.471f, 275.9713f, 0.0f },
+ { 736.8845f, 1301.921f, 274.0264f, 0.0f },
+ { 742.6632f, 1289.951f, 269.8603f, 0.0f },
+ { 754.3682f, 1283.942f, 266.6098f, 0.0f },
+ // Third melee hover disk wps
+ { 742.2078f, 1290.518f, 276.2484f, 0.0f },
+ { 754.5398f, 1284.311f, 273.5815f, 0.0f },
+ { 766.5588f, 1290.345f, 269.6655f, 0.0f },
+ { 773.4768f, 1301.474f, 266.5821f, 0.0f },
+ // Forth melee hover disk wps
+ { 766.1189f, 1290.197f, 276.9436f, 0.0f },
+ { 771.9507f, 1301.602f, 273.9712f, 0.0f },
+ { 766.1253f, 1313.451f, 270.4991f, 0.0f },
+ { 754.5378f, 1319.399f, 266.6653f, 0.0f }
+};
-// Source: Sniffs (x,y,z)
-#define MALYGOS_MAX_WAYPOINTS 16
-const Position MalygosPhaseTwoWaypoints[MALYGOS_MAX_WAYPOINTS] =
+#define MAX_MALYGOS_POS 10
+Position const MalygosPositions[MAX_MALYGOS_POS] =
{
- {812.7299f, 1391.672f, 283.2763f, 0.0f},
- {848.2912f, 1358.61f, 283.2763f, 0.0f},
- {853.9227f, 1307.911f, 283.2763f, 0.0f},
- {847.1437f, 1265.538f, 283.2763f, 0.0f},
- {839.9229f, 1245.245f, 283.2763f, 0.0f},
- {827.3463f, 1221.818f, 283.2763f, 0.0f},
- {803.2727f, 1203.851f, 283.2763f, 0.0f},
- {772.9372f, 1197.981f, 283.2763f, 0.0f},
- {732.1138f, 1200.647f, 283.2763f, 0.0f},
- {693.8761f, 1217.995f, 283.2763f, 0.0f},
- {664.5038f, 1256.539f, 283.2763f, 0.0f},
- {650.1497f, 1303.485f, 283.2763f, 0.0f},
- {662.9109f, 1350.291f, 283.2763f, 0.0f},
- {677.6391f, 1377.607f, 283.2763f, 0.0f},
- {704.8198f, 1401.162f, 283.2763f, 0.0f},
- {755.2642f, 1417.1f, 283.2763f, 0.0f},
+ { 754.544f, 1301.71f, 320.01f, 0.0f }, // Point destroy platform
+ { 754.393f, 1301.27f, 292.91f, 0.0f }, // Point Vortex
+ { 754.362f, 1301.61f, 266.17f, 0.0f }, // Point land after Vortex
+ { 754.695f, 1301.66f, 316.65f, 0.0f }, // Point Surge of Power phase II
+ { 755.681f, 1298.41f, 220.06f, 0.0f } // Point idle phase III
};
-#define MAX_SUMMONS_PHASE_TWO 4
+Position const AlexstraszaSpawnPos = { 854.551f, 1225.31f, 300.901f, 0.0f }; // Alexstrasza's spawn position
+Position const HeartOfMagicSpawnPos = { 755.351f, 1298.31f, 223.909f, 0.0f }; // Heart of Magic spawn position
+
+#define TEN_MINUTES (10*MINUTE*IN_MILLISECONDS)
-#define MAX_MALYGOS_POS 2
-const Position MalygosPositions[MAX_MALYGOS_POS] =
+enum Achievements
{
- {754.544f, 1301.71f, 320.0f, 0.0f},
- {754.39f, 1301.27f, 292.91f, 0.0f},
+ ACHIEV_TIMED_START_EVENT = 20387
+};
+
+enum AreaIds
+{
+ AREA_EYE_OF_ETERNITY = 4500
+};
+
+enum MiscData
+{
+ // Lights
+ LIGHT_GET_DEFAULT_FOR_MAP = 0,
+ LIGHT_OBSCURE_SPACE = 1822,
+ LIGHT_CHANGE_DIMENSIONS = 1823,
+ LIGHT_ARCANE_RUNES = 1824,
+ LIGHT_OBSCURE_ARCANE_RUNES = 1825,
+
+ // Data (setters/getters)
+ DATA_SUMMON_DEATHS = 0, // phase 2
+ DATA_PHASE = 1,
+
+ // Target guids
+ DATA_LAST_OVERLOAD_GUID = 13, // used to store last Arcane Overload guid
+ DATA_FIRST_SURGE_TARGET_GUID = 14,
+ // DATA_SECOND_SURGE_TARGET_GUID = 15,
+ // DATA_THIRD_SURGE_TARGET_GUID = 16,
+ DATA_LAST_TARGET_BARRAGE_GUID = 17,
+
+ NUM_MAX_SURGE_TARGETS = 3,
+};
+
+// Used to check if summons guids come from vehicles
+class VehicleCheckPredicate
+{
+ public:
+ bool operator()(uint64 guid) { return IS_VEHICLE_GUID(guid); }
};
class boss_malygos : public CreatureScript
{
public:
- boss_malygos() : CreatureScript("boss_malygos") {}
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_malygosAI(creature);
- }
+ boss_malygos() : CreatureScript("boss_malygos") { }
struct boss_malygosAI : public BossAI
{
boss_malygosAI(Creature* creature) : BossAI(creature, DATA_MALYGOS_EVENT)
{
- // If we enter in combat when MovePoint generator is active, it overrwrites our homeposition
- _homePosition = creature->GetHomePosition();
+ _despawned = false; // We determine if Malygos will be realocated to spawning position on reset triggered by boss despawn on evade
+ _flySpeed = me->GetSpeed(MOVE_FLIGHT); // Get initial fly speed, otherwise on each wipe fly speed would add up if we get it
}
void Reset()
{
- _Reset();
-
- _bersekerTimer = 0;
- _currentPos = 0;
-
- SetPhase(PHASE_ONE, true);
-
- _delayedMovementTimer = 8000;
- _delayedMovement = false;
+ // EnterEvadeMode and Reset() links are cut for the sake of properly functioning despawner.
+ if (!_despawned)
+ _Reset();
_summonDeaths = 0;
+ _preparingPulsesChecker = 0;
+ _arcaneOverloadGUID = 0;
+ _lastHitByArcaneBarrageGUID = 0;
+ memset(_surgeTargetGUID, 0, sizeof(_surgeTargetGUID));
+
+ _killSpamFilter = false;
+ _canAttack = false;
+ _executingVortex = false;
+ _arcaneReinforcements = true;
+ _flyingOutOfPlatform = false;
+ _firstCyclicMovementStarted = false;
+ _performingSurgeOfPower = false;
+ _performingDestroyPlatform = false;
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
-
- _cannotMove = true;
-
- me->SetCanFly(true);
-
+ me->SetDisableGravity(true);
+ me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
+ // TO DO: find what in core is making boss slower than in retail (when correct speed data) or find missing movement flag update or forced spline change
+ me->SetSpeed(MOVE_FLIGHT, _flySpeed * 0.25f);
+ if (_despawned)
+ DoAction(ACTION_HANDLE_RESPAWN);
+
+ SetPhase(PHASE_NOT_STARTED, true);
+ me->SetReactState(REACT_PASSIVE);
if (instance)
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
uint32 GetData(uint32 data) const
{
- if (data == DATA_SUMMON_DEATHS)
- return _summonDeaths;
- else if (data == DATA_PHASE)
- return _phase;
+ switch (data)
+ {
+ case DATA_SUMMON_DEATHS:
+ return _summonDeaths;
+ case DATA_PHASE:
+ return _phase;
+ }
return 0;
}
void SetData(uint32 data, uint32 value)
{
- if (data == DATA_SUMMON_DEATHS && _phase == PHASE_TWO)
+ if (data == DATA_SUMMON_DEATHS && _phase == PHASE_TWO && !_despawned)
{
_summonDeaths = value;
- if (_summonDeaths >= MAX_SUMMONS_PHASE_TWO)
- StartPhaseThree();
+ if (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL)
+ {
+ if (_summonDeaths == MAX_SUMMONS_PHASE_TWO_10MAN)
+ {
+ _performingDestroyPlatform = true;
+ DoAction(ACTION_HANDLE_P_THREE_INTRO);
+ }
+ }
+ else if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)
+ {
+ if (_summonDeaths == MAX_SUMMONS_PHASE_TWO_25MAN)
+ {
+ _performingDestroyPlatform = true;
+ DoAction(ACTION_HANDLE_P_THREE_INTRO);
+ }
+ }
}
}
- void EnterEvadeMode()
+ uint64 GetGUID(int32 type) const
{
- me->SetHomePosition(_homePosition);
+ if (type >= DATA_FIRST_SURGE_TARGET_GUID && type < DATA_FIRST_SURGE_TARGET_GUID + NUM_MAX_SURGE_TARGETS)
+ return _surgeTargetGUID[type - DATA_FIRST_SURGE_TARGET_GUID];
+ else if (type == DATA_LAST_TARGET_BARRAGE_GUID)
+ return _lastHitByArcaneBarrageGUID;
- me->SetDisableGravity(true);
+ return 0;
+ }
- BossAI::EnterEvadeMode();
+ void SetGUID(uint64 guid, int32 type)
+ {
+ switch (type)
+ {
+ case DATA_LAST_OVERLOAD_GUID:
+ _arcaneOverloadGUID = guid;
+ break;
+ case DATA_FIRST_SURGE_TARGET_GUID:
+ case DATA_FIRST_SURGE_TARGET_GUID + 1:
+ case DATA_FIRST_SURGE_TARGET_GUID + 2:
+ _surgeTargetGUID[type - DATA_FIRST_SURGE_TARGET_GUID] = guid;
+ break;
+ case DATA_LAST_TARGET_BARRAGE_GUID:
+ _lastHitByArcaneBarrageGUID = guid;
+ }
+ }
- if (instance)
- instance->SetBossState(DATA_MALYGOS_EVENT, FAIL);
+ void DoAction(int32 action)
+ {
+ switch (action)
+ {
+ case ACTION_LAND_ENCOUNTER_START:
+ events.CancelEventGroup(1);
+ if (Creature* alexstraszaBunny = me->GetMap()->GetCreature(instance->GetData64(DATA_ALEXSTRASZA_BUNNY_GUID)))
+ {
+ Position pos;
+ pos.m_positionZ = alexstraszaBunny->GetPositionZ();
+ alexstraszaBunny->GetNearPoint2D(pos.m_positionX, pos.m_positionY, 30.0f, alexstraszaBunny->GetAngle(me));
+ me->GetMotionMaster()->MoveLand(POINT_LAND_P_ONE, pos);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
+ me->SetReactState(REACT_AGGRESSIVE);
+ me->SetInCombatWithZone();
+ events.ScheduleEvent(EVENT_LAND_START_ENCOUNTER, 7*IN_MILLISECONDS, 1, PHASE_NOT_STARTED);
+ }
+ break;
+ case ACTION_EXECUTE_VORTEX:
+ DoCast(me, SPELL_VORTEX_1, true);
+ DoCast(me, SPELL_VORTEX_2, true);
+ // the vortex execution continues in the dummy effect of this spell (see it's script)
+ DoCast(me, SPELL_VORTEX_3, true);
+ break;
+ case ACTION_LIFT_IN_AIR:
+ Position _zToLift;
+ me->GetPosition(&_zToLift);
+ if (_phase == PHASE_ONE)
+ {
+ _zToLift.m_positionZ += 20.0f;
+ me->GetMotionMaster()->MoveTakeoff(POINT_LIFT_IN_AIR_P_ONE, _zToLift);
+ }
+ else if (_phase == PHASE_TWO)
+ {
+ _zToLift.m_positionZ = 300.1f;
+ me->GetMotionMaster()->MoveTakeoff(POINT_PHASE_ONE_TO_TWO_TRANSITION, _zToLift);
+ }
+ break;
+ case ACTION_HANDLE_P_THREE_INTRO:
+ events.CancelEventGroup(0);
+ events.CancelEventGroup(1);
+ events.CancelEventGroup(2);
+ // Vehicles shouldn't be despawned with 0 delay if the call comes from virtual function that overrides PassengerBoarded.
+ // Aside from that he doesn't despawn both vehicles and arcane overloads right away, but with some delay.
+ DummyEntryCheckPredicate pred;
+ summons.DoAction(ACTION_DELAYED_DESPAWN, pred);
+ Talk(SAY_END_P_TWO);
+ me->GetMotionMaster()->Clear(false);
+ me->StopMoving();
+ if (me->GetPositionZ() > 300.0f)
+ events.ScheduleEvent(EVENT_DELAY_MOVE_TO_DESTROY_P, 5*IN_MILLISECONDS, 0, PHASE_TWO);
+ else
+ me->GetMotionMaster()->MovePoint(POINT_DESTROY_PLATFORM_P_TWO, MalygosPositions[0]);
+
+ events.ScheduleEvent(EVENT_LIGHT_DIMENSION_CHANGE, 1*IN_MILLISECONDS, 0, PHASE_TWO);
+ break;
+ case ACTION_HANDLE_RESPAWN:
+ // Teleport to spawn position, we can't use normal relocate
+ float x, y, z, o;
+ me->GetRespawnPosition(x, y, z, &o);
+ me->NearTeleportTo(x, y, z, o);
+ // Respawn Iris
+ instance->SetData(DATA_RESPAWN_IRIS, 0);
+ _despawned = false;
+ break;
+ case ACTION_CYCLIC_MOVEMENT:
+ Movement::MoveSplineInit init(me);
+ FillCirclePath(MalygosPositions[3], 120.0f, 283.2763f, init.Path(), true);
+ init.SetFly();
+ init.SetCyclic();
+ init.Launch();
+ break;
+ }
}
void SetPhase(uint8 phase, bool setEvents = false)
{
events.Reset();
-
events.SetPhase(phase);
_phase = phase;
-
if (setEvents)
SetPhaseEvents();
}
- void StartPhaseThree()
- {
- if (!instance)
- return;
-
- SetPhase(PHASE_THREE, true);
-
- // this despawns Hover Disks
- summons.DespawnAll();
- // players that used Hover Disk are no in the aggro list
- me->SetInCombatWithZone();
- ThreatContainer::StorageType const& m_threatlist = me->getThreatManager().getThreatList();
- for (ThreatContainer::StorageType::const_iterator itr = m_threatlist.begin(); itr!= m_threatlist.end(); ++itr)
- {
- if (Unit* target = (*itr)->getTarget())
- {
- if (target->GetTypeId() != TYPEID_PLAYER)
- continue;
-
- // The rest is handled in the AI of the vehicle.
- target->CastSpell(target, SPELL_SUMMOM_RED_DRAGON, true);
- me->Attack(target, false);
- }
- }
-
- if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_PLATFORM)))
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED); // In sniffs it has this flag, but i don't know how is applied.
-
- // pos sniffed
- me->GetMotionMaster()->MoveIdle();
- me->GetMotionMaster()->MovePoint(MOVE_CENTER_PLATFORM, MalygosPositions[0].GetPositionX(), MalygosPositions[0].GetPositionY(), MalygosPositions[0].GetPositionZ());
- }
-
void SetPhaseEvents()
{
switch (_phase)
{
+ case PHASE_NOT_STARTED:
+ events.ScheduleEvent(EVENT_SAY_INTRO, 1*IN_MILLISECONDS, 1, _phase);
+ events.ScheduleEvent(EVENT_START_FIRST_RANDOM_PORTAL, 2*IN_MILLISECONDS, 1, _phase);
+ break;
case PHASE_ONE:
- events.ScheduleEvent(EVENT_ARCANE_BREATH, urand(15, 20)*IN_MILLISECONDS, 0, _phase);
- events.ScheduleEvent(EVENT_ARCANE_STORM, urand(5, 10)*IN_MILLISECONDS, 0, _phase);
- events.ScheduleEvent(EVENT_VORTEX, urand(30, 40)*IN_MILLISECONDS, 0, _phase);
- events.ScheduleEvent(EVENT_POWER_SPARKS, urand(30, 35)*IN_MILLISECONDS, 0, _phase);
+ events.ScheduleEvent(EVENT_ARCANE_BREATH, urand(8, 10)*IN_MILLISECONDS, 0, _phase);
+ events.ScheduleEvent(EVENT_ARCANE_STORM, urand(3, 6)*IN_MILLISECONDS, 0, _phase);
+ events.ScheduleEvent(EVENT_VORTEX, urand(30, 35)*IN_MILLISECONDS, 0, _phase);
+ events.ScheduleEvent(EVENT_POWER_SPARKS, urand(20, 30)*IN_MILLISECONDS, 0, _phase);
break;
case PHASE_TWO:
- events.ScheduleEvent(EVENT_YELL_0, 0, 0, _phase);
- events.ScheduleEvent(EVENT_YELL_1, 24*IN_MILLISECONDS, 0, _phase);
- events.ScheduleEvent(EVENT_SURGE_POWER, urand(60, 70)*IN_MILLISECONDS, 0, _phase);
- events.ScheduleEvent(EVENT_SUMMON_ARCANE, urand(2, 5)*IN_MILLISECONDS, 0, _phase);
+ events.ScheduleEvent(EVENT_MOVE_TO_POINT_SURGE_P_TWO, 60*IN_MILLISECONDS, 0, _phase);
+ me->AI()->DoAction(ACTION_LIFT_IN_AIR);
break;
case PHASE_THREE:
- events.ScheduleEvent(EVENT_YELL_2, 0, 0, _phase);
- events.ScheduleEvent(EVENT_YELL_3, 8*IN_MILLISECONDS, 0, _phase);
- events.ScheduleEvent(EVENT_YELL_4, 16*IN_MILLISECONDS, 0, _phase);
- events.ScheduleEvent(EVENT_SURGE_POWER_PHASE_3, urand(7, 16)*IN_MILLISECONDS, 0, _phase);
+ events.ScheduleEvent(EVENT_ARCANE_PULSE, 7*IN_MILLISECONDS, 0, _phase);
+ events.ScheduleEvent(EVENT_ARCANE_STORM, 10*IN_MILLISECONDS, 0, _phase);
+ events.ScheduleEvent(EVENT_SURGE_OF_POWER_P_THREE, urand(4, 6)*IN_MILLISECONDS, 0, _phase);
events.ScheduleEvent(EVENT_STATIC_FIELD, urand(20, 30)*IN_MILLISECONDS, 0, _phase);
break;
- default:
- break;
}
}
+ // There are moments where boss will do nothing while being attacked
+ void AttackStart(Unit* target)
+ {
+ if (_canAttack)
+ BossAI::AttackStart(target);
+ }
+
void EnterCombat(Unit* /*who*/)
{
- _EnterCombat();
+ // We can't call full function here since it includes DoZoneInCombat(),
+ // if someone does it will be returned with a warning.
+ me->setActive(true);
+ if (instance)
+ {
+ if (!instance->CheckRequiredBosses(DATA_MALYGOS_EVENT))
+ {
+ EnterEvadeMode();
+ return;
+ }
+
+ instance->SetBossState(DATA_MALYGOS_EVENT, IN_PROGRESS);
+ }
+
+ Talk(SAY_START_P_ONE);
+ DoCast(SPELL_BERSEKER); // periodic aura, first tick in 10 minutes
+ if (instance)
+ instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
+ }
+
+ void EnterEvadeMode()
+ {
+ if (instance)
+ instance->SetBossState(DATA_MALYGOS_EVENT, FAIL);
- me->SetDisableGravity(false);
- me->SetCanFly(false);
+ SendLightOverride(LIGHT_GET_DEFAULT_FOR_MAP, 1*IN_MILLISECONDS);
+
+ if (_phase == PHASE_THREE)
+ me->SetControlled(false, UNIT_STATE_ROOT);
+ uint32 corpseDelay = me->GetCorpseDelay();
+ uint32 respawnDelay = me->GetRespawnDelay();
+ me->SetCorpseDelay(1);
+ me->SetRespawnDelay(29);
+ me->DespawnOrUnsummon();
+ me->SetCorpseDelay(corpseDelay);
+ me->SetRespawnDelay(respawnDelay);
+
+ // Set speed to normal value
+ me->SetSpeed(MOVE_FLIGHT, _flySpeed);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->RemoveAllAuras();
+ me->CombatStop(); // Sometimes threat can remain, so it's a safety measure
- Talk(SAY_AGGRO_P_ONE);
+ if (!_despawned)
+ _despawned = true;
- DoCast(SPELL_BERSEKER); // periodic aura, first tick in 10 minutes
+ me->ResetLootMode();
+ events.Reset();
+ if (!summons.empty())
+ {
+ if (_phase == PHASE_TWO)
+ {
+ VehicleCheckPredicate pred;
+ summons.DoAction(ACTION_DELAYED_DESPAWN, pred);
+ summons.remove_if(pred);
+ summons.DespawnAll();
+ }
+ else if (_phase == PHASE_THREE)
+ summons.DespawnAll();
+ }
if (instance)
- instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
+ instance->SetBossState(DATA_MALYGOS_EVENT, NOT_STARTED);
}
- void KilledUnit(Unit* who)
+ void KilledUnit(Unit* victim)
{
- if (who->GetTypeId() != TYPEID_PLAYER)
+ if (victim->GetTypeId() != TYPEID_PLAYER)
return;
- switch (_phase)
+ if (!_killSpamFilter)
{
- case PHASE_ONE:
- Talk(SAY_KILLED_PLAYER_P_ONE);
- break;
- case PHASE_TWO:
- Talk(SAY_KILLED_PLAYER_P_TWO);
- break;
- case PHASE_THREE:
- Talk(SAY_KILLED_PLAYER_P_THREE);
- break;
+ switch (_phase)
+ {
+ case PHASE_ONE:
+ Talk(SAY_KILLED_PLAYER_P_ONE);
+ events.ScheduleEvent(EVENT_PREVENT_SAY_SPAM_ON_KILL, 5*IN_MILLISECONDS, 0, _phase);
+ _killSpamFilter = true;
+ break;
+ case PHASE_TWO:
+ Talk(SAY_KILLED_PLAYER_P_TWO);
+ events.ScheduleEvent(EVENT_PREVENT_SAY_SPAM_ON_KILL, 5*IN_MILLISECONDS, 0, _phase);
+ _killSpamFilter = true;
+ break;
+ case PHASE_THREE:
+ Talk(SAY_KILLED_PLAYER_P_THREE);
+ events.ScheduleEvent(EVENT_PREVENT_SAY_SPAM_ON_KILL, 5*IN_MILLISECONDS, 0, _phase);
+ _killSpamFilter = true;
+ break;
+ }
}
}
- void SpellHit(Unit* caster, const SpellInfo* spell)
+ void SpellHit(Unit* caster, SpellInfo const* spell)
{
if (spell->Id == SPELL_POWER_SPARK_MALYGOS)
{
@@ -415,346 +669,418 @@ public:
Talk(SAY_BUFF_SPARK);
}
+ else if (spell->Id == SPELL_MALYGOS_BERSERK)
+ sCreatureTextMgr->SendChat(me, EMOTE_HIT_BERSERKER_TIMER, 0, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP);
}
void MoveInLineOfSight(Unit* who)
{
- if (!me->isInCombat())
+ if (!me->isInCombat() || _phase != PHASE_ONE)
return;
if (who->GetEntry() == NPC_POWER_SPARK)
- {
- // not sure about the distance | I think it is better check this here than in the UpdateAI function...
if (who->GetDistance(me) <= 2.5f)
who->CastSpell(me, SPELL_POWER_SPARK_MALYGOS, true);
- }
- }
-
- void PrepareForVortex()
- {
- me->SetDisableGravity(true);
- me->SetCanFly(true);
-
- me->GetMotionMaster()->MovementExpired();
- me->GetMotionMaster()->MovePoint(MOVE_VORTEX, MalygosPositions[1].GetPositionX(), MalygosPositions[1].GetPositionY(), MalygosPositions[1].GetPositionZ());
- // continues in MovementInform function.
- }
-
- void ExecuteVortex()
- {
- DoCast(me, SPELL_VORTEX_1, true);
- DoCast(me, SPELL_VORTEX_2, true);
-
- // the vortex execution continues in the dummy effect of this spell (see its script)
- DoCast(me, SPELL_VORTEX_3, true);
}
void MovementInform(uint32 type, uint32 id)
{
- if (type != POINT_MOTION_TYPE)
+ if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE)
return;
switch (id)
{
- case MOVE_VORTEX:
+ case POINT_NEAR_RANDOM_PORTAL_P_NONE:
+ if (Creature* portal = me->FindNearestCreature(NPC_PORTAL_TRIGGER, 31.0f, true))
+ {
+ events.ScheduleEvent(EVENT_STOP_PORTAL_BEAM, 10*IN_MILLISECONDS, 1, PHASE_NOT_STARTED);
+ events.ScheduleEvent(EVENT_RANDOM_PORTAL, 14*IN_MILLISECONDS, 1, PHASE_NOT_STARTED);
+ DoCast(portal, SPELL_PORTAL_BEAM);
+ }
+ break;
+ case POINT_LAND_P_ONE:
+ me->SetDisableGravity(false);
+ break;
+ case POINT_VORTEX_P_ONE:
me->GetMotionMaster()->MoveIdle();
- ExecuteVortex();
+ DoAction(ACTION_EXECUTE_VORTEX);
break;
- case MOVE_DEEP_BREATH_ROTATION:
- _currentPos = _currentPos == MALYGOS_MAX_WAYPOINTS - 1 ? 0 : _currentPos+1;
- me->GetMotionMaster()->MovementExpired();
- me->GetMotionMaster()->MovePoint(MOVE_DEEP_BREATH_ROTATION, MalygosPhaseTwoWaypoints[_currentPos]);
+ case POINT_LAND_AFTER_VORTEX_P_ONE:
+ me->SetDisableGravity(false);
+ _executingVortex = false;
+ _canAttack = true;
break;
- case MOVE_INIT_PHASE_ONE:
- me->SetInCombatWithZone();
+ case POINT_LIFT_IN_AIR_P_ONE:
+ me->SetDisableGravity(true);
+ events.ScheduleEvent(EVENT_MOVE_TO_VORTEX_POINT, 1, 0, PHASE_ONE);
break;
- case MOVE_CENTER_PLATFORM:
- // Malygos is already flying here, there is no need to set it again.
- _cannotMove = false;
- // malygos will move into center of platform and then he does not chase dragons, he just turns to his current target.
- me->GetMotionMaster()->MoveIdle();
+ case POINT_FLY_OUT_OF_PLATFORM_P_TWO:
+ if (!_firstCyclicMovementStarted)
+ {
+ _firstCyclicMovementStarted = true;
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetFacingToObject(me->GetMap()->GetCreature(instance->GetData64(DATA_ALEXSTRASZA_BUNNY_GUID)));
+ events.ScheduleEvent(EVENT_SUMMON_ARCANE_BOMB, 1*IN_MILLISECONDS, 0, PHASE_TWO);
+ }
+ _flyingOutOfPlatform = false;
+ _performingSurgeOfPower = false;
+ events.ScheduleEvent(EVENT_PATHING_AROUND_PLATFORM, 1*IN_MILLISECONDS, 0, PHASE_TWO);
+ break;
+ case POINT_PHASE_ONE_TO_TWO_TRANSITION:
+ me->SetDisableGravity(true);
+ me->SetFacingToObject(me->GetMap()->GetCreature(instance->GetData64(DATA_ALEXSTRASZA_BUNNY_GUID)));
+ SendLightOverride(LIGHT_ARCANE_RUNES, 5*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_FLY_OUT_OF_PLATFORM, 18*IN_MILLISECONDS, 0, PHASE_TWO);
+ break;
+ case POINT_SURGE_OF_POWER_P_TWO:
+ if (!_performingDestroyPlatform)
+ {
+ Talk(EMOTE_SURGE_OF_POWER_WARNING_P2);
+ DoCastAOE(SPELL_SURGE_OF_POWER_P_II, true);
+ events.ScheduleEvent(EVENT_FLY_OUT_OF_PLATFORM, 7*IN_MILLISECONDS, 0, PHASE_TWO);
+ }
+ break;
+ case POINT_DESTROY_PLATFORM_P_TWO:
+ SendLightOverride(LIGHT_OBSCURE_SPACE, 1*IN_MILLISECONDS);
+ DoCast(me, SPELL_DESTROY_PLATFORM_CHANNEL);
+ events.ScheduleEvent(EVENT_MOVE_TO_P_THREE_POINT, 11*IN_MILLISECONDS, 0, PHASE_TWO);
+ break;
+ case POINT_IDLE_P_THREE:
+ me->SetControlled(true, UNIT_STATE_ROOT);
+ events.ScheduleEvent(EVENT_START_P_THREE, 5*IN_MILLISECONDS, 0, PHASE_TWO);
break;
}
}
- void StartPhaseTwo()
- {
- SetPhase(PHASE_TWO, true);
-
- me->SetDisableGravity(true);
- me->SetCanFly(true);
-
- me->GetMotionMaster()->MoveIdle();
- me->GetMotionMaster()->MovePoint(MOVE_DEEP_BREATH_ROTATION, MalygosPhaseTwoWaypoints[0]);
-
- for (uint8 i = 0; i < 2; i++)
- {
- // Starting position. One starts from the first waypoint and another from the last.
- uint8 pos = !i ? MAX_HOVER_DISK_WAYPOINTS-1 : 0;
- if (Creature* summon = me->SummonCreature(NPC_HOVER_DISK_CASTER, HoverDiskWaypoints[pos]))
- if (summon->IsAIEnabled)
- summon->AI()->DoAction(ACTION_HOVER_DISK_START_WP_1+i);
-
- // not sure about its position.
- if (Creature* summon = me->SummonCreature(NPC_HOVER_DISK_MELEE, HoverDiskWaypoints[0]))
- summon->SetInCombatWithZone();
- }
- }
-
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
- if (!UpdateVictim())
+ if (!UpdateVictim() && _phase != PHASE_NOT_STARTED && _phase != PHASE_TWO)
return;
events.Update(diff);
- if (_phase == PHASE_THREE)
- {
- if (!_cannotMove)
- {
- // it can change if the player falls from the vehicle.
- if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != IDLE_MOTION_TYPE)
- {
- me->GetMotionMaster()->MovementExpired();
- me->GetMotionMaster()->MoveIdle();
- }
- } else
- {
- if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE)
- {
- me->GetMotionMaster()->MovementExpired();
- me->GetMotionMaster()->MovePoint(MOVE_CENTER_PLATFORM, MalygosPositions[0].GetPositionX(), MalygosPositions[0].GetPositionY(), MalygosPositions[0].GetPositionZ());
- }
- }
- }
+ // we can't cast if we are casting already unless in PHASE_NOT_STARTED channeling PORTAL_BEAM
+ if (me->HasUnitState(UNIT_STATE_CASTING) && _phase != PHASE_NOT_STARTED)
+ return;
- // we need a better way for pathing
- if (_delayedMovement)
+ // at 50% hp Malygos switchs to phase 2 and removes hovering until reset or end of encounter
+ if (_phase == PHASE_ONE && me->GetHealthPct() <= 50.0f)
{
- if (_delayedMovementTimer <= diff)
- {
- me->GetMotionMaster()->MovePoint(MOVE_DEEP_BREATH_ROTATION, MalygosPhaseTwoWaypoints[_currentPos]);
- _delayedMovementTimer = 8000;
- _delayedMovement = false;
- } _delayedMovementTimer -= diff;
+ SetPhase(PHASE_TWO, true);
+ _canAttack = false;
+ me->AttackStop();
+ Talk(SAY_END_P_ONE);
}
- // at 50 % health malygos switch to phase 2
- if (me->GetHealthPct() <= 50.0f && _phase == PHASE_ONE)
- StartPhaseTwo();
-
- // the boss is handling vortex
- if (me->HasAura(SPELL_VORTEX_2))
- return;
-
- // We can't cast if we are casting already.
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
- case EVENT_YELL_2:
- Talk(SAY_END_P_TWO);
+ case EVENT_START_FIRST_RANDOM_PORTAL:
+ me->CastCustomSpell(SPELL_RANDOM_PORTAL, SPELLVALUE_MAX_TARGETS, 1);
break;
- case EVENT_YELL_3:
- Talk(SAY_INTRO_P_THREE);
+ case EVENT_STOP_PORTAL_BEAM:
+ me->InterruptNonMeleeSpells(true);
break;
- case EVENT_YELL_4:
- Talk(SAY_AGGRO_P_THREE);
+ case EVENT_RANDOM_PORTAL:
+ me->CastCustomSpell(SPELL_RANDOM_PORTAL, SPELLVALUE_MAX_TARGETS, 1);
break;
- case EVENT_YELL_0:
- Talk(SAY_END_P_ONE);
+ case EVENT_LAND_START_ENCOUNTER:
+ if (GameObject* iris = me->GetMap()->GetGameObject(instance->GetData64(DATA_FOCUSING_IRIS_GUID)))
+ {
+ me->SetFacingToObject(iris);
+ iris->Delete(); // this is not the best way.
+ }
+ _canAttack = true;
+ SetPhase(PHASE_ONE, true);
break;
- case EVENT_YELL_1:
- Talk(SAY_AGGRO_P_TWO);
- break;
- case EVENT_ARCANE_BREATH:
- DoCast(me->getVictim(), SPELL_ARCANE_BREATH);
- events.ScheduleEvent(EVENT_ARCANE_BREATH, urand(35, 60)*IN_MILLISECONDS, 0, PHASE_ONE);
- break;
- case EVENT_ARCANE_STORM:
- DoCast(me->getVictim(), SPELL_ARCANE_STORM);
- events.ScheduleEvent(EVENT_ARCANE_STORM, urand(5, 10)*IN_MILLISECONDS, 0, PHASE_ONE);
+ case EVENT_SAY_INTRO:
+ Talk(SAY_INTRO_EVENT);
+ events.ScheduleEvent(EVENT_SAY_INTRO, urand(85, 95)*IN_MILLISECONDS, 1, PHASE_NOT_STARTED);
break;
case EVENT_VORTEX:
- PrepareForVortex();
+ _executingVortex = true;
+ DoAction(ACTION_LIFT_IN_AIR);
events.ScheduleEvent(EVENT_VORTEX, urand(60, 80)*IN_MILLISECONDS, 0, PHASE_ONE);
break;
+ case EVENT_MOVE_TO_VORTEX_POINT:
+ _canAttack = false;
+ me->AttackStop();
+ me->GetMotionMaster()->MovePoint(POINT_VORTEX_P_ONE, MalygosPositions[1]);
+ break;
case EVENT_POWER_SPARKS:
instance->SetData(DATA_POWER_SPARKS_HANDLING, 0);
events.ScheduleEvent(EVENT_POWER_SPARKS, urand(30, 35)*IN_MILLISECONDS, 0, PHASE_ONE);
break;
- case EVENT_SURGE_POWER:
- me->GetMotionMaster()->MoveIdle();
- _delayedMovement = true;
- DoCast(SPELL_SURGE_POWER);
- events.ScheduleEvent(EVENT_SURGE_POWER, urand(60, 70)*IN_MILLISECONDS, 0, PHASE_TWO);
+ case EVENT_ARCANE_BREATH:
+ if (_executingVortex)
+ {
+ events.ScheduleEvent(EVENT_ARCANE_BREATH, 20*IN_MILLISECONDS, 0, PHASE_ONE);
+ break;
+ }
+
+ me->CastSpell(me->getVictim(), SPELL_ARCANE_BREATH);
+ events.ScheduleEvent(EVENT_ARCANE_BREATH, 20*IN_MILLISECONDS, 0, PHASE_ONE);
+ break;
+ case EVENT_ARCANE_STORM:
+ if (_phase == PHASE_ONE)
+ {
+ if (_executingVortex)
+ {
+ events.ScheduleEvent(EVENT_ARCANE_STORM, 10*IN_MILLISECONDS, 0, PHASE_ONE);
+ break;
+ }
+
+ DoCastAOE(SPELL_ARCANE_STORM_P_I, true);
+ events.ScheduleEvent(EVENT_ARCANE_STORM, 10*IN_MILLISECONDS, 0, PHASE_ONE);
+ }
+ else if (_phase == PHASE_THREE)
+ {
+ DoCastAOE(SPELL_ARCANE_STORM_P_III, true);
+ events.ScheduleEvent(EVENT_ARCANE_STORM, urand(6, 12)*IN_MILLISECONDS, 0, PHASE_THREE);
+ }
+ break;
+ case EVENT_FLY_OUT_OF_PLATFORM:
+ if (!_performingDestroyPlatform)
+ {
+ if (Creature* alexstraszaBunny = me->GetMap()->GetCreature(instance->GetData64(DATA_ALEXSTRASZA_BUNNY_GUID)))
+ {
+ Position randomPosOnRadius;
+ // Hardcodded retail value, reason is Z getters can fail... (TO DO: Change to getter when height calculation works on 100%!)
+ randomPosOnRadius.m_positionZ = 283.0521f;
+ alexstraszaBunny->GetNearPoint2D(randomPosOnRadius.m_positionX, randomPosOnRadius.m_positionY, 120.0f, alexstraszaBunny->GetAngle(me));
+ me->GetMotionMaster()->MovePoint(POINT_FLY_OUT_OF_PLATFORM_P_TWO, randomPosOnRadius);
+ _flyingOutOfPlatform = true;
+ }
+ }
+
+ if (_arcaneReinforcements && instance)
+ {
+ for (uint8 rangeDisks = 0; rangeDisks < (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL ? 4 : 5); rangeDisks++)
+ {
+ Creature* casterDiskSummon = me->SummonCreature(NPC_HOVER_DISK_CASTER, RangeHoverDisksSpawnPositions[rangeDisks]);
+
+ if (casterDiskSummon->IsAIEnabled)
+ casterDiskSummon->AI()->DoAction(rangeDisks);
+ }
+
+ for (uint8 meleeDisks = 0; meleeDisks < 2; meleeDisks++)
+ {
+ Creature* meleeDiskSummon = me->SummonCreature(NPC_HOVER_DISK_MELEE, MeleeHoverDisksSpawnPositions[meleeDisks]);
+ meleeDiskSummon->GetMotionMaster()->MovePoint(meleeDisks * MAX_MELEE_HOVER_DISK_SPAWNPOINTS, MeleeHoverDisksWaypoints[meleeDisks * MAX_MELEE_HOVER_DISK_SPAWNPOINTS]);
+ }
+
+ _arcaneReinforcements = false;
+
+ if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)
+ events.ScheduleEvent(EVENT_DELAYED_REINFORCEMENTS, 1*IN_MILLISECONDS, 0, PHASE_TWO);
+ }
+ break;
+ case EVENT_DELAYED_REINFORCEMENTS:
+ for (uint8 rangeDisks = 5; rangeDisks < 8; rangeDisks++)
+ {
+ Creature* casterDiskSummon = me->SummonCreature(NPC_HOVER_DISK_CASTER, RangeHoverDisksSpawnPositions[rangeDisks]);
+
+ if (casterDiskSummon->IsAIEnabled)
+ casterDiskSummon->AI()->DoAction(rangeDisks);
+ }
+
+ for (uint8 meleeDisks = 2; meleeDisks < 4; meleeDisks++)
+ {
+ Creature* meleeDiskSummon = me->SummonCreature(NPC_HOVER_DISK_MELEE, MeleeHoverDisksSpawnPositions[meleeDisks]);
+ meleeDiskSummon->GetMotionMaster()->MovePoint(meleeDisks * MAX_MELEE_HOVER_DISK_SPAWNPOINTS, MeleeHoverDisksWaypoints[meleeDisks * MAX_MELEE_HOVER_DISK_SPAWNPOINTS]);
+ }
+ break;
+ case EVENT_PATHING_AROUND_PLATFORM:
+ if (!_performingSurgeOfPower && !_performingDestroyPlatform)
+ DoAction(ACTION_CYCLIC_MOVEMENT);
+ break;
+ case EVENT_MOVE_TO_POINT_SURGE_P_TWO:
+ if (!_performingDestroyPlatform)
+ {
+ _performingSurgeOfPower = true;
+ Talk(SAY_DEEP_BREATH);
+ me->GetMotionMaster()->MovePoint(POINT_SURGE_OF_POWER_P_TWO, MalygosPositions[3]);
+ events.ScheduleEvent(EVENT_MOVE_TO_POINT_SURGE_P_TWO, 60*IN_MILLISECONDS, 2, PHASE_TWO);
+ }
+ break;
+ case EVENT_SUMMON_ARCANE_BOMB:
+ if (!_performingSurgeOfPower && !_performingDestroyPlatform)
+ {
+ me->StopMoving();
+ events.ScheduleEvent(EVENT_PATHING_AROUND_PLATFORM, 3*IN_MILLISECONDS, 0, PHASE_TWO);
+ }
+
+ if (!_flyingOutOfPlatform)
+ {
+ DoCast(me, SPELL_SUMMON_ARCANE_BOMB, true);
+ if (Creature* lastArcaneOverloadBunny = me->GetMap()->GetCreature(_arcaneOverloadGUID))
+ DoCast(lastArcaneOverloadBunny, SPELL_ARCANE_BOMB_TRIGGER, true);
+ }
+ events.ScheduleEvent(EVENT_SUMMON_ARCANE_BOMB, urand(15, 16)*IN_MILLISECONDS, 2, PHASE_TWO);
+ break;
+ case EVENT_ARCANE_PULSE:
+ if (_preparingPulsesChecker < 2)
+ {
+ DoCastAOE(SPELL_ARCANE_PULSE, true);
+ events.ScheduleEvent(EVENT_ARCANE_PULSE, 7*IN_MILLISECONDS, 0, PHASE_THREE);
+ _preparingPulsesChecker++;
+ }
+ else
+ {
+ DoCastAOE(SPELL_ARCANE_PULSE, true);
+ events.ScheduleEvent(EVENT_ARCANE_PULSE, 2*IN_MILLISECONDS, 0, PHASE_THREE);
+ }
+ break;
+ case EVENT_LIGHT_DIMENSION_CHANGE:
+ SendLightOverride(LIGHT_CHANGE_DIMENSIONS, 2*IN_MILLISECONDS);
+ break;
+ case EVENT_DELAY_MOVE_TO_DESTROY_P:
+ me->GetMotionMaster()->MovePoint(POINT_DESTROY_PLATFORM_P_TWO, MalygosPositions[0]);
+ break;
+ case EVENT_MOVE_TO_P_THREE_POINT:
+ Talk(SAY_START_P_THREE);
+ me->GetMotionMaster()->MovePoint(POINT_IDLE_P_THREE, MalygosPositions[4]);
break;
- case EVENT_SUMMON_ARCANE:
- DoCast(SPELL_SUMMON_ARCANE_BOMB);
- events.ScheduleEvent(EVENT_SUMMON_ARCANE, urand(12, 15)*IN_MILLISECONDS, 0, PHASE_TWO);
+ case EVENT_START_P_THREE:
+ SendLightOverride(LIGHT_OBSCURE_ARCANE_RUNES, 1*IN_MILLISECONDS);
+ DoCast(me, SPELL_CLEAR_ALL_DEBUFFS);
+ DoCast(me, SPELL_IMMUNE_CURSES);
+ _canAttack = true;
+ UpdateVictim();
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ SetPhase(PHASE_THREE, true);
break;
- case EVENT_SURGE_POWER_PHASE_3:
- DoCast(GetTargetPhaseThree(), SPELL_SURGE_POWER_PHASE_3);
- events.ScheduleEvent(EVENT_SURGE_POWER_PHASE_3, urand(7, 16)*IN_MILLISECONDS, 0, PHASE_THREE);
+ case EVENT_SURGE_OF_POWER_P_THREE:
+ if (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL)
+ {
+ if (Unit* tempSurgeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, false, SPELL_RIDE_RED_DRAGON_BUDDY))
+ {
+ if (Vehicle* drakeVehicle = tempSurgeTarget->GetVehicleKit())
+ {
+ if (Unit* passenger = drakeVehicle->GetPassenger(0))
+ {
+ if (passenger->GetTypeId() == TYPEID_PLAYER)
+ {
+ Talk(EMOTE_SURGE_OF_POWER_WARNING_P3, passenger->GetGUID());
+ DoCast(tempSurgeTarget, SPELL_SURGE_OF_POWER_PHASE_3_10, true);
+ }
+ }
+ }
+ }
+ }
+ else if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)
+ {
+ memset(_surgeTargetGUID, 0, sizeof(_surgeTargetGUID));
+ DoCastAOE(SPELL_SURGE_OF_POWER_WARNING_SELECTOR_25, true);
+ }
+
+ events.ScheduleEvent(EVENT_SURGE_OF_POWER_P_THREE, urand(9, 18)*IN_MILLISECONDS, 0, PHASE_THREE);
break;
case EVENT_STATIC_FIELD:
- DoCast(GetTargetPhaseThree(), SPELL_STATIC_FIELD);
- events.ScheduleEvent(EVENT_STATIC_FIELD, urand(20, 30)*IN_MILLISECONDS, 0, PHASE_THREE);
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, false, SPELL_RIDE_RED_DRAGON_BUDDY))
+ DoCast(target, SPELL_STATIC_FIELD_MISSLE, true);
+
+ events.ScheduleEvent(EVENT_STATIC_FIELD, urand(15, 30)*IN_MILLISECONDS, 0, PHASE_THREE);
+ break;
+ case EVENT_PREVENT_SAY_SPAM_ON_KILL:
+ _killSpamFilter = false;
break;
default:
break;
}
}
- DoMeleeAttackIfReady();
+ if (_phase != PHASE_THREE)
+ DoMeleeAttackIfReady();
}
- Unit* GetTargetPhaseThree()
+ void JustDied(Unit* /*killer*/)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
-
- // we are a drake
- if (target->GetVehicleKit())
- return target;
-
- // we are a player using a drake (or at least you should)
- if (target->GetTypeId() == TYPEID_PLAYER)
+ _JustDied();
+ Talk(SAY_DEATH);
+ if (Creature* alexstraszaGiftBoxBunny = me->GetMap()->GetCreature(instance->GetData64(DATA_GIFT_BOX_BUNNY_GUID)))
{
- if (Unit* base = target->GetVehicleBase())
- return base;
+ if (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL)
+ alexstraszaGiftBoxBunny->SummonGameObject(GO_HEART_OF_MAGIC_10, HeartOfMagicSpawnPos.GetPositionX(), HeartOfMagicSpawnPos.GetPositionY(),
+ HeartOfMagicSpawnPos.GetPositionZ(), HeartOfMagicSpawnPos.GetOrientation(), 0.0f, 0.0f, 0.0f, 1.0f, 0);
+ else if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)
+ alexstraszaGiftBoxBunny->SummonGameObject(GO_HEART_OF_MAGIC_25, HeartOfMagicSpawnPos.GetPositionX(), HeartOfMagicSpawnPos.GetPositionY(),
+ HeartOfMagicSpawnPos.GetPositionZ(), HeartOfMagicSpawnPos.GetOrientation(), 0.0f, 0.0f, 0.0f, 1.0f, 0);
}
- // is a player falling from a vehicle?
- return NULL;
- }
-
- void JustDied(Unit* /*killer*/)
- {
- Talk(SAY_DEATH);
- _JustDied();
+ me->SummonCreature(NPC_ALEXSTRASZA, AlexstraszaSpawnPos, TEMPSUMMON_MANUAL_DESPAWN);
+ me->DespawnOrUnsummon(5*IN_MILLISECONDS);
}
private:
- uint8 _phase;
- uint32 _bersekerTimer;
- uint8 _currentPos; // used for phase 2 rotation...
- bool _delayedMovement; // used in phase 2.
- uint32 _delayedMovementTimer; // used in phase 2
- uint8 _summonDeaths;
- Position _homePosition; // it can get bugged because core thinks we are pathing
- bool _mustTalk;
- bool _cannotMove;
- };
-};
-
-class spell_malygos_vortex_dummy : public SpellScriptLoader
-{
-public:
- spell_malygos_vortex_dummy() : SpellScriptLoader("spell_malygos_vortex_dummy") {}
-
- class spell_malygos_vortex_dummy_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_malygos_vortex_dummy_SpellScript)
-
- void HandleScript(SpellEffIndex /*effIndex*/)
+ // Used to generate perfect cyclic movements (Enter Circle).
+ void FillCirclePath(Position const& centerPos, float radius, float z, Movement::PointsArray& path, bool clockwise)
{
- Unit* caster = GetCaster();
-
- if (!caster)
- return;
+ float step = clockwise ? -M_PI / 8.0f : M_PI / 8.0f;
+ float angle = centerPos.GetAngle(me->GetPositionX(), me->GetPositionY());
- // each player will enter to the trigger vehicle (entry 30090) already spawned (each one can hold up to 5 players, it has 5 seats)
- // the players enter to the vehicles casting SPELL_VORTEX_4 OR SPELL_VORTEX_5
- if (InstanceScript* instance = caster->GetInstanceScript())
- instance->SetData(DATA_VORTEX_HANDLING, 0);
+ for (uint8 i = 0; i < 16; angle += step, ++i)
+ {
+ G3D::Vector3 point;
+ point.x = centerPos.GetPositionX() + radius * cosf(angle);
+ point.y = centerPos.GetPositionY() + radius * sinf(angle);
+ point.z = z; // Don't use any height getters unless all bugs are fixed.
+ path.push_back(point);
+ }
+ }
- // the rest of the vortex execution continues when SPELL_VORTEX_2 is removed.
+ // Function that will change lights of map for all players on map.
+ void SendLightOverride(uint32 overrideId, uint32 fadeInTime) const
+ {
+ WorldPacket data(SMSG_OVERRIDE_LIGHT, 12);
+ data << uint32(1773); // Light.dbc entry (map default)
+ data << uint32(overrideId); // Light.dbc entry (override)
+ data << uint32(fadeInTime);
+ SendPacketToPlayers(&data);
}
- void Register()
+ // Send packet to all players in Eye of Eternity
+ void SendPacketToPlayers(WorldPacket const* data) const
{
- OnEffectHitTarget += SpellEffectFn(spell_malygos_vortex_dummy_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
+ Map::PlayerList const& players = me->GetMap()->GetPlayers();
+ if (!players.isEmpty())
+ for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
+ if (Player* player = itr->getSource())
+ if (player->GetAreaId() == AREA_EYE_OF_ETERNITY)
+ player->GetSession()->SendPacket(data);
}
+
+ uint8 _phase; // Counter for phases used with a getter.
+ uint8 _summonDeaths; // Keeps count of arcane trash.
+ uint8 _preparingPulsesChecker; // In retail they use 2 preparing pulses with 7 sec CD, after they pass 2 seconds.
+ uint64 _arcaneOverloadGUID; // Last Arcane Overload summoned to know to which should visual be cast to (the purple ball, not bubble).
+ uint64 _lastHitByArcaneBarrageGUID; // Last hit player by Arcane Barrage, will be removed if targets > 1.
+ uint64 _surgeTargetGUID[3]; // All these three are used to keep current tagets to which warning should be sent.
+
+ bool _killSpamFilter; // Prevent text spamming on killed player by helping implement a CD.
+ bool _canAttack; // Used to control attacking (Move Chase not being applied after Stop Attack, only few times should act like this).
+ bool _despawned; // Checks if boss pass through evade on reset.
+ bool _executingVortex; // Prevents some events being sheduled during Vortex takeoff/land.
+ bool _arcaneReinforcements; // Checks if 10 or 25 man arcane trash will be spawned.
+ bool _flyingOutOfPlatform; // Used to prevent Malygos casting Arcane Overload shields while leaving platform.
+ bool _firstCyclicMovementStarted; // At first movement start he throws one shield asap, so this check is needed for it only.
+ bool _performingSurgeOfPower; // Used to prevent starting Cyclic Movement called in Arcane Bomb event.
+ bool _performingDestroyPlatform; // Used to prevent starting some movements right when Destroy Platfrom event starts.
+
+ float _flySpeed; // Used to store base fly speed to prevent stacking on each evade.
};
- SpellScript* GetSpellScript() const
+ CreatureAI* GetAI(Creature* creature) const
{
- return new spell_malygos_vortex_dummy_SpellScript();
+ return new boss_malygosAI(creature);
}
};
-class spell_malygos_vortex_visual : public SpellScriptLoader
-{
- public:
- spell_malygos_vortex_visual() : SpellScriptLoader("spell_malygos_vortex_visual") { }
-
- class spell_malygos_vortex_visual_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_malygos_vortex_visual_AuraScript);
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (Unit* caster = GetCaster())
- {
- ThreatContainer::StorageType const& m_threatlist = caster->getThreatManager().getThreatList();
- for (ThreatContainer::StorageType::const_iterator itr = m_threatlist.begin(); itr!= m_threatlist.end(); ++itr)
- {
- if (Unit* target = (*itr)->getTarget())
- {
- Player* targetPlayer = target->ToPlayer();
-
- if (!targetPlayer || targetPlayer->isGameMaster())
- continue;
-
- if (InstanceScript* instance = caster->GetInstanceScript())
- {
- // teleport spell - i am not sure but might be it must be casted by each vehicle when its passenger leaves it
- if (Creature* trigger = caster->GetMap()->GetCreature(instance->GetData64(DATA_TRIGGER)))
- trigger->CastSpell(targetPlayer, SPELL_VORTEX_6, true);
- }
- }
- }
-
- if (Creature* malygos = caster->ToCreature())
- {
- // This is a hack, we have to re add players to the threat list because when they enter to the vehicles they are removed.
- // Anyway even with this issue, the boss does not enter in evade mode - this prevents iterate an empty list in the next vortex execution.
- malygos->SetInCombatWithZone();
-
- malygos->SetDisableGravity(false);
- malygos->SetCanFly(false);
-
- malygos->GetMotionMaster()->MoveChase(caster->getVictim());
- malygos->RemoveAura(SPELL_VORTEX_1);
- }
- }
-
- }
-
- void Register()
- {
- AfterEffectRemove += AuraEffectRemoveFn(spell_malygos_vortex_visual_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_malygos_vortex_visual_AuraScript();
- }
-};
-
class npc_portal_eoe: public CreatureScript
{
public:
- npc_portal_eoe() : CreatureScript("npc_portal_eoe") {}
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_portal_eoeAI(creature);
- }
+ npc_portal_eoe() : CreatureScript("npc_portal_eoe") { }
struct npc_portal_eoeAI : public ScriptedAI
{
@@ -763,27 +1089,29 @@ public:
_instance = creature->GetInstanceScript();
}
- void SpellHit(Unit* /*caster*/, const SpellInfo* spell)
+ void SpellHit(Unit* /*caster*/, SpellInfo const* spell)
{
if (spell->Id == SPELL_PORTAL_OPENED)
{
- DoCast(me, SPELL_SUMMON_POWER_PARK, true);
+ if (Creature* malygos = me->GetMap()->GetCreature(_instance->GetData64(DATA_MALYGOS)))
+ {
+ if (malygos->AI()->GetData(DATA_PHASE) == PHASE_ONE)
+ DoCast(me, SPELL_SUMMON_POWER_PARK, true);
+ }
}
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
- // When duration of oppened riff visual ends,
- // closed one should be cast
- if (!me->HasAura(SPELL_PORTAL_VISUAL_CLOSED) &&
- !me->HasAura(SPELL_PORTAL_OPENED))
+ // When duration of opened riff visual ends, closed one should be cast
+ if (!me->HasAura(SPELL_PORTAL_VISUAL_CLOSED) && !me->HasAura(SPELL_PORTAL_OPENED))
DoCast(me, SPELL_PORTAL_VISUAL_CLOSED, true);
if (_instance)
{
- if (Creature* malygos = Unit::GetCreature(*me, _instance->GetData64(DATA_MALYGOS)))
+ if (Creature* malygos = me->GetMap()->GetCreature(_instance->GetData64(DATA_MALYGOS)))
{
- if (malygos->AI()->GetData(DATA_PHASE) != PHASE_ONE)
+ if (malygos->AI()->GetData(DATA_PHASE) != PHASE_ONE && me->HasAura(SPELL_PORTAL_OPENED))
{
me->RemoveAura(SPELL_PORTAL_OPENED);
DoCast(me, SPELL_PORTAL_VISUAL_CLOSED, true);
@@ -792,42 +1120,29 @@ public:
}
}
- void JustSummoned(Creature* summon)
- {
- summon->SetInCombatWithZone();
- }
-
private:
- uint32 _summonTimer;
InstanceScript* _instance;
};
-};
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_portal_eoeAI(creature);
+ }
+};
class npc_power_spark: public CreatureScript
{
public:
- npc_power_spark() : CreatureScript("npc_power_spark") {}
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_power_sparkAI(creature);
- }
+ npc_power_spark() : CreatureScript("npc_power_spark") { }
struct npc_power_sparkAI : public ScriptedAI
{
npc_power_sparkAI(Creature* creature) : ScriptedAI(creature)
{
_instance = creature->GetInstanceScript();
-
- MoveToMalygos();
// Talk range was not enough for this encounter
sCreatureTextMgr->SendChat(me, EMOTE_POWER_SPARK_SUMMONED, 0, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP);
- }
-
- void EnterEvadeMode()
- {
- me->DespawnOrUnsummon();
+ MoveToMalygos();
}
void MoveToMalygos()
@@ -835,20 +1150,18 @@ public:
me->GetMotionMaster()->MoveIdle();
if (_instance)
- {
- if (Creature* malygos = Unit::GetCreature(*me, _instance->GetData64(DATA_MALYGOS)))
+ if (Creature* malygos = me->GetMap()->GetCreature(_instance->GetData64(DATA_MALYGOS)))
me->GetMotionMaster()->MoveFollow(malygos, 0.0f, 0.0f);
- }
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!_instance)
return;
- if (Creature* malygos = Unit::GetCreature(*me, _instance->GetData64(DATA_MALYGOS)))
+ if (Creature* malygos = me->GetMap()->GetCreature(_instance->GetData64(DATA_MALYGOS)))
{
- if (malygos->AI()->GetData(DATA_PHASE) != PHASE_ONE)
+ if (malygos->AI()->GetData(DATA_PHASE) != PHASE_ONE || _instance->GetBossState(DATA_MALYGOS_EVENT) == FAIL)
{
me->DespawnOrUnsummon();
return;
@@ -873,28 +1186,33 @@ public:
private:
InstanceScript* _instance;
};
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_power_sparkAI(creature);
+ }
};
-class npc_hover_disk : public CreatureScript
+class npc_melee_hover_disk : public CreatureScript
{
public:
- npc_hover_disk() : CreatureScript("npc_hover_disk") { }
+ npc_melee_hover_disk() : CreatureScript("npc_melee_hover_disk") { }
- CreatureAI* GetAI(Creature* creature) const
+ struct npc_melee_hover_diskAI : public VehicleAI
{
- return new npc_hover_diskAI(creature);
- }
+ npc_melee_hover_diskAI(Creature* creature) : VehicleAI(creature)
+ {
+ _instance = creature->GetInstanceScript();
+ me->SetReactState(REACT_PASSIVE);
+ // TO DO: These were a bit faster than what they should be. Not sure what is the reason.
+ me->SetSpeed(MOVE_FLIGHT, 1.25f);
+ }
- struct npc_hover_diskAI : public npc_escortAI
- {
- npc_hover_diskAI(Creature* creature) : npc_escortAI(creature)
+ void Reset()
{
- if (me->GetEntry() == NPC_HOVER_DISK_CASTER)
- me->SetReactState(REACT_PASSIVE);
- else
- me->SetInCombatWithZone();
+ VehicleAI::Reset();
- _instance = creature->GetInstanceScript();
+ _wpCount = 0;
}
void PassengerBoarded(Unit* unit, int8 /*seat*/, bool apply)
@@ -903,208 +1221,1323 @@ public:
{
if (unit->GetTypeId() == TYPEID_UNIT)
{
- me->setFaction(FACTION_HOSTILE);
+ unit->CastSpell(unit, SPELL_TELEPORT_VISUAL_ONLY);
unit->ToCreature()->SetInCombatWithZone();
}
+ else if (unit->GetTypeId() == TYPEID_PLAYER)
+ me->SetDisableGravity(true);
}
- else
+ else if (!apply)
{
- // Error found: This is not called if the passenger is a player
- if (unit->GetTypeId() == TYPEID_UNIT || unit->GetTypeId() == TYPEID_PLAYER)
+ if (unit->GetTypeId() != TYPEID_PLAYER)
{
- // This will only be called if the passenger dies
- if (_instance)
- {
- if (Creature* malygos = Unit::GetCreature(*me, _instance->GetData64(DATA_MALYGOS)))
- malygos->AI()->SetData(DATA_SUMMON_DEATHS, malygos->AI()->GetData(DATA_SUMMON_DEATHS)+1);
- }
+ me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetDisableGravity(false);
+ me->SetCanFly(false);
}
-
- me->GetMotionMaster()->MoveIdle();
-
- if (me->GetEntry() == NPC_HOVER_DISK_MELEE || me->GetEntry() == NPC_HOVER_DISK_CASTER)
+ else if (unit->GetTypeId() == TYPEID_PLAYER)
{
- // Hack: Fall ground function can fail (remember the platform is a gameobject), we will teleport the disk to the ground
- if (me->GetPositionZ() > GROUND_Z)
- me->NearTeleportTo(me->GetPositionX(), me->GetPositionY(), GROUND_Z, 0);
- me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
- me->setFaction(FACTION_FRIENDLY);
- me->AI()->EnterEvadeMode();
+ me->SetDisableGravity(false);
+ me->SetCanFly(false);
}
+
+ me->setFaction(FACTION_FRIENDLY);
+ me->RemoveAllAuras();
}
}
- void EnterEvadeMode()
+ void UpdateAI(uint32 diff)
{
- // we dont evade
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ me->GetMotionMaster()->MovePoint(eventId, MeleeHoverDisksWaypoints[eventId]);
}
- void DoAction(int32 const action)
+ void DoAction(int32 /*action*/)
{
- if (me->GetEntry() != NPC_HOVER_DISK_CASTER)
+ if (Vehicle* vehicleTemp = me->GetVehicleKit())
+ if (vehicleTemp->GetPassenger(0) && vehicleTemp->GetPassenger(0)->GetTypeId() == TYPEID_PLAYER)
+ {
+ vehicleTemp->RemoveAllPassengers();
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ }
+
+ me->DespawnOrUnsummon(3*IN_MILLISECONDS);
+ }
+
+ void MovementInform(uint32 type, uint32 id)
+ {
+ if (type != POINT_MOTION_TYPE)
return;
- switch (action)
+ if (_wpCount < 3)
{
- case ACTION_HOVER_DISK_START_WP_1:
- for (uint8 i = 0; i < MAX_HOVER_DISK_WAYPOINTS; i++)
- AddWaypoint(i, HoverDiskWaypoints[i].GetPositionX(), HoverDiskWaypoints[i].GetPositionY(), HoverDiskWaypoints[i].GetPositionZ());
- break;
- case ACTION_HOVER_DISK_START_WP_2:
- {
- uint8 count = 0;
- for (uint8 i = MAX_HOVER_DISK_WAYPOINTS-1; i > 0; i--)
- {
- AddWaypoint(count, HoverDiskWaypoints[i].GetPositionX(), HoverDiskWaypoints[i].GetPositionY(), HoverDiskWaypoints[i].GetPositionZ());
- count++;
- }
- break;
- }
- default:
- return;
+ _events.ScheduleEvent(id + 1, 1);
+ ++_wpCount;
}
+ else if (Vehicle* hoverDisk = me->GetVehicleKit())
+ if (Unit* lordPassenger = hoverDisk->GetPassenger(0))
+ lordPassenger->ToCreature()->AI()->DoAction(ACTION_SET_DISK_VICTIM_CHASE);
+ }
+
+ private:
+ uint8 _wpCount; // how many points are triggered
+ InstanceScript* _instance;
+ EventMap _events;
+ };
- Start(true, false, 0, 0, false, true);
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_melee_hover_diskAI(creature);
+ }
+};
+
+class npc_caster_hover_disk : public CreatureScript
+{
+public:
+ npc_caster_hover_disk() : CreatureScript("npc_caster_hover_disk") { }
+
+ struct npc_caster_hover_diskAI : public VehicleAI
+ {
+ npc_caster_hover_diskAI(Creature* creature) : VehicleAI(creature)
+ {
+ _instance = creature->GetInstanceScript();
+ me->SetReactState(REACT_PASSIVE);
+ // TO DO: Something is wrong with calculations for flying creatures that are on WP/Cyclic path.
+ // They should get the same difference as to when at ground from run creature switch to walk.
+ me->SetSpeed(MOVE_FLIGHT, 0.45f);
}
- void UpdateEscortAI(const uint32 /*diff*/)
+ void Reset()
{
- // we dont do melee damage!
+ VehicleAI::Reset();
}
- void WaypointReached(uint32 /*waypointId*/)
+ void EnterEvadeMode()
{
+ }
+
+ void PassengerBoarded(Unit* unit, int8 /*seat*/, bool apply)
+ {
+ if (apply)
+ {
+ if (unit->GetTypeId() == TYPEID_UNIT)
+ unit->CastSpell(unit, SPELL_TELEPORT_VISUAL_ONLY);
+ }
+ else if (!apply)
+ {
+ me->StopMoving();
+ me->SetDisableGravity(false);
+ me->SetCanFly(false);
+ me->RemoveAllAuras();
+ }
+ }
+ void DoAction(int32 action)
+ {
+ if (action < ACTION_DELAYED_DESPAWN)
+ {
+ Movement::MoveSplineInit init(me);
+ FillCirclePath(MalygosPositions[3], 35.0f, 282.3402f, init.Path(), true);
+ init.SetFly();
+ init.SetCyclic();
+ init.Launch();
+ }
+ else
+ {
+ me->DespawnOrUnsummon(3*IN_MILLISECONDS);
+ }
}
private:
+ void FillCirclePath(Position const& centerPos, float radius, float z, Movement::PointsArray& path, bool clockwise)
+ {
+ float step = clockwise ? -M_PI / 9.0f : M_PI / 9.0f;
+ float angle = centerPos.GetAngle(me->GetPositionX(), me->GetPositionY());
+
+ for (uint8 i = 0; i < 18; angle += step, ++i)
+ {
+ G3D::Vector3 point;
+ point.x = centerPos.GetPositionX() + radius * cosf(angle);
+ point.y = centerPos.GetPositionY() + radius * sinf(angle);
+ point.z = z; // Don't use any height getters unless all bugs are fixed.
+ path.push_back(point);
+ }
+ }
+
InstanceScript* _instance;
};
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_caster_hover_diskAI(creature);
+ }
};
+class npc_nexus_lord : public CreatureScript
+{
+ public:
+ npc_nexus_lord() : CreatureScript("npc_nexus_lord") { }
+
+ struct npc_nexus_lordAI : public ScriptedAI
+ {
+ npc_nexus_lordAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = creature->GetInstanceScript();
+ }
+
+ void Reset()
+ {
+ _events.Reset();
+ }
+
+ void EnterEvadeMode()
+ {
+ }
+
+ void DoAction(int32 /*action*/)
+ {
+ _events.ScheduleEvent(EVENT_NUKE_DUMMY, 1);
+ _events.ScheduleEvent(EVENT_ARCANE_SHOCK, 2*IN_MILLISECONDS);
+ _events.ScheduleEvent(EVENT_HASTE_BUFF, 12*IN_MILLISECONDS);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_ARCANE_SHOCK:
+ if (Unit* victim = SelectTarget(SELECT_TARGET_RANDOM, 0, 5.0f, true))
+ DoCast(victim, SPELL_ARCANE_SHOCK);
+ _events.ScheduleEvent(EVENT_ARCANE_SHOCK, urand(7, 15)*IN_MILLISECONDS);
+ break;
+ case EVENT_HASTE_BUFF:
+ DoCast(me, SPELL_HASTE);
+ _events.ScheduleEvent(EVENT_HASTE_BUFF, 15*IN_MILLISECONDS);
+ break;
+ case EVENT_NUKE_DUMMY:
+ DoCast(me->getVictim(), SPELL_DUMMY_NUKE, true);
+ DoCast(me, SPELL_ALIGN_DISK_AGGRO, true);
+ _events.ScheduleEvent(EVENT_NUKE_DUMMY, 1*IN_MILLISECONDS);
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ if (Creature* malygos = me->GetMap()->GetCreature(_instance->GetData64(DATA_MALYGOS)))
+ malygos->AI()->SetData(DATA_SUMMON_DEATHS, malygos->AI()->GetData(DATA_SUMMON_DEATHS) + 1);
+ }
+
+ private:
+ InstanceScript* _instance;
+ EventMap _events;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_nexus_lordAI(creature);
+ }
+};
+
+class npc_scion_of_eternity : public CreatureScript
+{
+ public:
+ npc_scion_of_eternity() : CreatureScript("npc_scion_of_eternity") { }
+
+ struct npc_scion_of_eternityAI : public ScriptedAI
+ {
+ npc_scion_of_eternityAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = creature->GetInstanceScript();
+ }
+
+ void Reset()
+ {
+ _events.Reset();
+ }
+
+ void IsSummonedBy(Unit* /*summoner*/)
+ {
+ _events.ScheduleEvent(EVENT_ARCANE_BARRAGE, urand(14, 29)*IN_MILLISECONDS);
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ }
+
+ void AttackStart(Unit* /*target*/)
+ {
+ }
+
+ void EnterEvadeMode()
+ {
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_ARCANE_BARRAGE:
+ DoCast(me, SPELL_ARCANE_BARRAGE);
+ _events.ScheduleEvent(EVENT_ARCANE_BARRAGE, urand(3, 15)*IN_MILLISECONDS);
+ break;
+ }
+ }
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ if (Creature* malygos = me->GetMap()->GetCreature(_instance->GetData64(DATA_MALYGOS)))
+ malygos->AI()->SetData(DATA_SUMMON_DEATHS, malygos->AI()->GetData(DATA_SUMMON_DEATHS) + 1);
+ }
+
+ private:
+ InstanceScript* _instance;
+ EventMap _events;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_scion_of_eternityAI(creature);
+ }
+};
-// The reason of this AI is to make the creature able to enter in combat otherwise the spell casting of SPELL_ARCANE_OVERLOAD fails.
class npc_arcane_overload : public CreatureScript
{
public:
- npc_arcane_overload() : CreatureScript("npc_arcane_overload") {}
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_arcane_overloadAI (creature);
- }
+ npc_arcane_overload() : CreatureScript("npc_arcane_overload") { }
struct npc_arcane_overloadAI : public ScriptedAI
{
- npc_arcane_overloadAI(Creature* creature) : ScriptedAI(creature) {}
+ npc_arcane_overloadAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = creature->GetInstanceScript();
+ me->SetReactState(REACT_PASSIVE);
+ }
- void AttackStart(Unit* who)
+ void IsSummonedBy(Unit* summoner)
{
- DoStartNoMovement(who);
+ if (Creature* creature = summoner->ToCreature())
+ {
+ _malygos = creature;
+ _malygos->AI()->SetGUID(me->GetGUID(), DATA_LAST_OVERLOAD_GUID);
+ }
}
- void Reset()
+ void UpdateAI (uint32 /*diff*/)
{
- DoCast(me, SPELL_ARCANE_OVERLOAD, false);
}
- void UpdateAI(uint32 const /*diff*/)
+ void DoAction(int32 /*action*/)
{
- // we dont do melee damage!
+ if (Creature* malygos = me->GetMap()->GetCreature(_instance->GetData64(DATA_MALYGOS)))
+ {
+ if (malygos->AI()->GetData(DATA_PHASE) == PHASE_TWO)
+ me->DespawnOrUnsummon(6*IN_MILLISECONDS);
+ // If evade is hit during phase II shields should disappear with no delay
+ else if (malygos->AI()->GetData(DATA_PHASE) == 0)
+ me->DespawnOrUnsummon();
+ }
}
+ void SpellHit(Unit* /*caster*/, SpellInfo const* spell)
+ {
+ if (spell->Id == SPELL_ARCANE_BOMB_TRIGGER)
+ {
+ DoCastAOE(SPELL_ARCANE_BOMB_KNOCKBACK_DAMAGE, true);
+ DoCast(me, SPELL_ARCANE_OVERLOAD_1, true);
+ }
+ }
+
+ private:
+ Creature* _malygos;
+ InstanceScript* _instance;
};
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_arcane_overloadAI (creature);
+ }
};
// SmartAI does not work correctly for vehicles
class npc_wyrmrest_skytalon : public CreatureScript
{
public:
- npc_wyrmrest_skytalon() : CreatureScript("npc_wyrmrest_skytalon") {}
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_wyrmrest_skytalonAI (creature);
- }
+ npc_wyrmrest_skytalon() : CreatureScript("npc_wyrmrest_skytalon") { }
struct npc_wyrmrest_skytalonAI : public VehicleAI
{
- npc_wyrmrest_skytalonAI(Creature* creature) : VehicleAI(creature) { }
+ npc_wyrmrest_skytalonAI(Creature* creature) : VehicleAI(creature)
+ {
+ }
void IsSummonedBy(Unit* summoner)
{
- summoner->CastSpell(me, SPELL_RIDE_RED_DRAGON, true);
+ _summoner = NULL;
+ if (Player* player = summoner->ToPlayer())
+ {
+ _summoner = player;
+ _events.ScheduleEvent(EVENT_CAST_RIDE_SPELL, 2*IN_MILLISECONDS);
+ }
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ VehicleAI::UpdateAI(diff);
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_CAST_RIDE_SPELL:
+ me->CastSpell(_summoner, SPELL_RIDE_RED_DRAGON_TRIGGERED, true);
+ break;
+ }
+ }
}
void PassengerBoarded(Unit* /*unit*/, int8 /*seat*/, bool apply)
{
if (!apply)
- me->DespawnOrUnsummon();
+ {
+ me->DespawnOrUnsummon(2050);
+ me->SetOrientation(2.5f);
+ me->SetSpeed(MOVE_FLIGHT, 1.0f, true);
+ Position pos;
+ me->GetPosition(&pos);
+ pos.m_positionX += 10.0f;
+ pos.m_positionY += 10.0f;
+ pos.m_positionZ += 12.0f;
+ me->GetMotionMaster()->MovePoint(1, pos);
+ }
}
+
+ private:
+ Player* _summoner;
+ EventMap _events;
};
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_wyrmrest_skytalonAI (creature);
+ }
+};
+
+// We shouldn't use SAI for stuff that aren't within boss main mechanic
+// and SAI type of despawn can cause problems here.
+class npc_static_field : public CreatureScript
+{
+ public:
+ npc_static_field() : CreatureScript("npc_static_field") { }
+
+ struct npc_static_fieldAI : public ScriptedAI
+ {
+ npc_static_fieldAI(Creature* creature) : ScriptedAI(creature)
+ {
+ }
+
+ void IsSummonedBy(Unit* /*summoner*/)
+ {
+ // For some great reason the spell doesn't time it...
+ me->DespawnOrUnsummon(30*IN_MILLISECONDS);
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_static_fieldAI (creature);
+ }
+};
+
+class spell_malygos_portal_beam : public SpellScriptLoader
+{
+ public:
+ spell_malygos_portal_beam() : SpellScriptLoader("spell_malygos_portal_beam") { }
+
+ class spell_malygos_portal_beam_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_malygos_portal_beam_AuraScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PORTAL_OPENED))
+ return false;
+
+ return true;
+ }
+
+ void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Creature* target = GetTarget()->ToCreature())
+ target->CastSpell(target, SPELL_PORTAL_OPENED);
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Creature* target = GetTarget()->ToCreature())
+ target->RemoveAura(SPELL_PORTAL_OPENED);
+ }
+
+ void Register()
+ {
+ OnEffectApply += AuraEffectApplyFn(spell_malygos_portal_beam_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_malygos_portal_beam_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_malygos_portal_beam_AuraScript();
+ }
+};
+
+class spell_malygos_random_portal : public SpellScriptLoader
+{
+ public:
+ spell_malygos_random_portal() : SpellScriptLoader("spell_malygos_random_portal") { }
+
+ class spell_malygos_random_portal_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_malygos_random_portal_SpellScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ Creature* malygos = GetCaster()->ToCreature();
+ if (Creature* target = GetHitCreature())
+ {
+ Position pos;
+ pos.m_positionZ = target->GetPositionZ();
+ target->GetNearPoint2D(pos.m_positionX, pos.m_positionY, frand(29.1f, 30.0f), target->GetAngle(malygos));
+ malygos->GetMotionMaster()->MovePoint(POINT_NEAR_RANDOM_PORTAL_P_NONE, pos);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_malygos_random_portal_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_malygos_random_portal_SpellScript();
+ }
+};
+
+class IsCreatureVehicleCheck
+{
+ public:
+ IsCreatureVehicleCheck(bool isVehicle) : _isVehicle(isVehicle) { }
+
+ bool operator()(WorldObject* obj)
+ {
+ if (Unit* unit = obj->ToUnit())
+ if (unit->GetTypeId() == TYPEID_UNIT && unit->GetVehicleKit())
+ return _isVehicle;
+
+ return !_isVehicle;
+ }
+
+ private:
+ bool _isVehicle;
};
-class npc_alexstrasza_eoe : public CreatureScript
+class spell_malygos_arcane_storm : public SpellScriptLoader
+{
+ public:
+ spell_malygos_arcane_storm() : SpellScriptLoader("spell_malygos_arcane_storm") { }
+
+ class spell_malygos_arcane_storm_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_malygos_arcane_storm_SpellScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ARCANE_STORM_EXTRA_VISUAL))
+ return false;
+
+ return true;
+ }
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ if (targets.empty())
+ return;
+
+ Creature* malygos = GetCaster()->ToCreature();
+ if (GetSpellInfo()->Id == SPELL_ARCANE_STORM_P_III)
+ {
+ // Resize list only to objects that are vehicles.
+ IsCreatureVehicleCheck check(true);
+ Trinity::Containers::RandomResizeList(targets, check, (malygos->GetMap()->GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL ? 4 : 10));
+ }
+ else
+ Trinity::Containers::RandomResizeList(targets, (malygos->GetMap()->GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL ? 4 : 10));
+ }
+
+ void HandleVisual(SpellEffIndex /*effIndex*/)
+ {
+ // Both missiles should start approx at same time (with SPELL_ARCANE_STORM_EXTRA_VISUAL having advantage - it should lead)
+ if (!GetHitUnit())
+ return;
+
+ GetCaster()->CastSpell(GetHitUnit(), SPELL_ARCANE_STORM_EXTRA_VISUAL, true);
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_malygos_arcane_storm_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnEffectLaunchTarget += SpellEffectFn(spell_malygos_arcane_storm_SpellScript::HandleVisual, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_malygos_arcane_storm_SpellScript();
+ }
+};
+
+class spell_malygos_vortex_dummy : public SpellScriptLoader
{
public:
- npc_alexstrasza_eoe() : CreatureScript("npc_alexstrasza_eoe") {}
+ spell_malygos_vortex_dummy() : SpellScriptLoader("spell_malygos_vortex_dummy") { }
- CreatureAI* GetAI(Creature* creature) const
+ class spell_malygos_vortex_dummy_SpellScript : public SpellScript
{
- return new npc_alexstrasza_eoeAI (creature);
- }
+ PrepareSpellScript(spell_malygos_vortex_dummy_SpellScript)
- struct npc_alexstrasza_eoeAI : public ScriptedAI
- {
- npc_alexstrasza_eoeAI(Creature* creature) : ScriptedAI(creature) {}
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
- void Reset()
+ void HandleScript(SpellEffIndex /*effIndex*/)
{
- _events.Reset();
- _events.ScheduleEvent(EVENT_YELL_1, 0);
+ Creature* caster = GetCaster()->ToCreature();
+ // Each player will enter to the trigger vehicle (entry 30090) which is already spawned (each one can hold up to 5 players, it has 5 seats,
+ // the players enter the vehicles casting SPELL_VORTEX_4 or SPELL_VORTEX_5.
+ if (InstanceScript* instance = caster->GetInstanceScript())
+ instance->SetData(DATA_VORTEX_HANDLING, 0);
+
+ // the rest of the vortex execution continues when SPELL_VORTEX_2 is removed.
}
- void UpdateAI(uint32 const /*diff*/)
+ void Register()
{
- while (uint32 eventId = _events.ExecuteEvent())
+ OnEffectHitTarget += SpellEffectFn(spell_malygos_vortex_dummy_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_malygos_vortex_dummy_SpellScript();
+ }
+};
+
+class spell_malygos_vortex_visual : public SpellScriptLoader
+{
+ public:
+ spell_malygos_vortex_visual() : SpellScriptLoader("spell_malygos_vortex_visual") { }
+
+ class spell_malygos_vortex_visual_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_malygos_vortex_visual_AuraScript);
+
+ bool Load()
{
- switch (eventId)
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_VORTEX_1) || !sSpellMgr->GetSpellInfo(SPELL_VORTEX_6))
+ return false;
+
+ return true;
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Creature* caster = GetCaster()->ToCreature())
{
- case EVENT_YELL_1:
- Talk(SAY_ONE);
- _events.ScheduleEvent(EVENT_YELL_2, 4*IN_MILLISECONDS);
- break;
- case EVENT_YELL_2:
- Talk(SAY_TWO);
- _events.ScheduleEvent(EVENT_YELL_3, 4*IN_MILLISECONDS);
- break;
- case EVENT_YELL_3:
- Talk(SAY_THREE);
- _events.ScheduleEvent(EVENT_YELL_4, 7*IN_MILLISECONDS);
- break;
- case EVENT_YELL_4:
- Talk(SAY_FOUR);
- break;
+ ThreatContainer::StorageType const& m_threatlist = caster->getThreatManager().getThreatList();
+ for (ThreatContainer::StorageType::const_iterator itr = m_threatlist.begin(); itr!= m_threatlist.end(); ++itr)
+ {
+ if (Unit* target = (*itr)->getTarget())
+ {
+ Player* targetPlayer = target->ToPlayer();
+ if (!targetPlayer || targetPlayer->isGameMaster())
+ continue;
+
+ if (InstanceScript* instance = caster->GetInstanceScript())
+ {
+ // Teleport spell - I'm not sure but might be it must be casted by each vehicle when it's passenger leaves it.
+ if (Creature* trigger = caster->GetMap()->GetCreature(instance->GetData64(DATA_TRIGGER)))
+ trigger->CastSpell(targetPlayer, SPELL_VORTEX_6, true);
+ }
+ }
+ }
+
+ if (Creature* malygos = caster->ToCreature())
+ {
+ malygos->GetMotionMaster()->MoveLand(POINT_LAND_AFTER_VORTEX_P_ONE, MalygosPositions[2]);
+ malygos->RemoveAura(SPELL_VORTEX_1);
+ }
}
}
+
+ void Register()
+ {
+ AfterEffectRemove += AuraEffectRemoveFn(spell_malygos_vortex_visual_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_malygos_vortex_visual_AuraScript();
}
+};
+
+class ExactDistanceCheck
+{
+ public:
+ ExactDistanceCheck(Unit* source, float dist) : _source(source), _dist(dist) { }
+
+ bool operator()(WorldObject* unit)
+ {
+ return _source->GetExactDist2d(unit) > _dist;
+ }
+
private:
- EventMap _events;
- };
+ Unit* _source;
+ float _dist;
+};
+
+class spell_arcane_overload : public SpellScriptLoader
+{
+ public:
+ spell_arcane_overload() : SpellScriptLoader("spell_arcane_overload") { }
+
+ class spell_arcane_overload_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_arcane_overload_SpellScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ void ResizeEffectRadiusTargetChecker(std::list<WorldObject*>& targets)
+ {
+ Creature* arcaneOverload = GetCaster()->ToCreature();
+ targets.remove_if(ExactDistanceCheck(arcaneOverload,
+ GetSpellInfo()->Effects[EFFECT_0].CalcRadius(arcaneOverload) * arcaneOverload->GetFloatValue(OBJECT_FIELD_SCALE_X)));
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_arcane_overload_SpellScript::ResizeEffectRadiusTargetChecker, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_arcane_overload_SpellScript();
+ }
+};
+
+class spell_nexus_lord_align_disk_aggro : public SpellScriptLoader
+{
+ public:
+ spell_nexus_lord_align_disk_aggro() : SpellScriptLoader("spell_nexus_lord_align_disk_aggro") { }
+
+ class spell_nexus_lord_align_disk_aggro_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_nexus_lord_align_disk_aggro_SpellScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ Creature* caster = GetCaster()->ToCreature();
+ if (Creature* target = GetHitCreature())
+ target->GetMotionMaster()->MoveChase(caster->getVictim());
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_nexus_lord_align_disk_aggro_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_nexus_lord_align_disk_aggro_SpellScript();
+ }
+};
+
+class IsPlayerOnHoverDisk
+{
+ public:
+ IsPlayerOnHoverDisk(bool isOnHoverDisk) : _isOnHoverDisk(isOnHoverDisk) { }
+
+ bool operator()(WorldObject* obj)
+ {
+ if (Unit* passenger = obj->ToUnit())
+ if (passenger->GetVehicleBase() && passenger->GetVehicleBase()->GetEntry() == NPC_HOVER_DISK_MELEE)
+ return _isOnHoverDisk;
+
+ return !_isOnHoverDisk;
+ }
+
+ private:
+ bool _isOnHoverDisk;
+};
+
+class spell_scion_of_eternity_arcane_barrage : public SpellScriptLoader
+{
+ public:
+ spell_scion_of_eternity_arcane_barrage() : SpellScriptLoader("spell_scion_of_eternity_arcane_barrage") { }
+
+ class spell_scion_of_eternity_arcane_barrage_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_scion_of_eternity_arcane_barrage_SpellScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT && GetCaster()->GetInstanceScript() != NULL;
+ }
+
+ void FilterMeleeHoverDiskPassangers(std::list<WorldObject*>& targets)
+ {
+ if (targets.empty())
+ return;
+
+ Creature* caster = GetCaster()->ToCreature();
+ InstanceScript* instance = caster->GetInstanceScript();
+ Creature* malygos = caster->GetMap()->GetCreature(instance->GetData64(DATA_MALYGOS));
+
+ // If max possible targets are more than 1 then Scions wouldn't select previosly selected target,
+ // in longer terms this means if spell picks target X then 2nd cast of this spell will pick smth else
+ // and if 3rd picks X again 4th will pick smth else (by not limiting the cast to certain caster).
+ if (targets.size() > 1)
+ if (malygos && malygos->AI()->GetGUID(DATA_LAST_TARGET_BARRAGE_GUID))
+ targets.remove_if(Trinity::ObjectGUIDCheck(malygos->AI()->GetGUID(DATA_LAST_TARGET_BARRAGE_GUID)));
+
+ // Remove players not on Hover Disk from second list
+ std::list<WorldObject*> playersWithoutDisk;
+ IsPlayerOnHoverDisk check(false);
+ for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end(); ++itr)
+ if (check(*itr))
+ playersWithoutDisk.push_back(*itr);
+
+ // if it's empty than we can have player on Hover disk as target.
+ if (!playersWithoutDisk.empty())
+ targets = playersWithoutDisk;
+
+ // Finally here we remove all targets that have been damaged by Arcane Barrage
+ // and have 2 seconds long aura still lasting. Used to give healers some time.
+ if (!targets.empty())
+ targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_ARCANE_BARRAGE_DAMAGE));
+
+ // Now we resize the list to max output targets which can be only 1
+ // to take it's guid and send/store it to DATA_LAST_TARGET_BARRAGE_GUID.
+ // Same target is never picked until next pick pass. This doesn't mean
+ // that it can't be hit more than once. In fact all is chance and raid speed.
+ if (!targets.empty())
+ {
+ if (targets.size() > 1)
+ Trinity::Containers::RandomResizeList(targets, 1);
+
+ if (WorldObject* filteredTarget = targets.front())
+ if (malygos)
+ malygos->AI()->SetGUID(filteredTarget->GetGUID(), DATA_LAST_TARGET_BARRAGE_GUID);
+ }
+ }
+
+ void TriggerDamageSpellFromPlayer()
+ {
+ if (Player* hitTarget = GetHitPlayer())
+ {
+ // There is some proc in this spell I have absolutely no idea of use, but just in case...
+ TriggerCastFlags triggerFlags = TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_DISALLOW_PROC_EVENTS);
+ hitTarget->CastSpell(hitTarget, SPELL_ARCANE_BARRAGE_DAMAGE, triggerFlags, NULL, NULL, GetCaster()->GetGUID());
+ }
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_scion_of_eternity_arcane_barrage_SpellScript::FilterMeleeHoverDiskPassangers, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnHit += SpellHitFn(spell_scion_of_eternity_arcane_barrage_SpellScript::TriggerDamageSpellFromPlayer);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_scion_of_eternity_arcane_barrage_SpellScript();
+ }
+};
+
+class spell_malygos_destroy_platform_channel : public SpellScriptLoader
+{
+ public:
+ spell_malygos_destroy_platform_channel() : SpellScriptLoader("spell_malygos_destroy_platform_channel") { }
+
+ class spell_malygos_destroy_platform_channel_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_malygos_destroy_platform_channel_AuraScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DESTROY_PLATFORM_BOOM_VISUAL))
+ return false;
+
+ return true;
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Creature* target = GetTarget()->ToCreature())
+ if (InstanceScript* instance = target->GetInstanceScript())
+ if (Creature* platformTrigger = target->GetMap()->GetCreature(instance->GetData64(DATA_ALEXSTRASZA_BUNNY_GUID)))
+ platformTrigger->CastSpell(platformTrigger, SPELL_DESTROY_PLATFORM_BOOM_VISUAL);
+ }
+
+ void Register()
+ {
+ AfterEffectRemove += AuraEffectRemoveFn(spell_malygos_destroy_platform_channel_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_malygos_destroy_platform_channel_AuraScript();
+ }
+};
+
+class spell_alexstrasza_bunny_destroy_platform_boom_visual : public SpellScriptLoader
+{
+ public:
+ spell_alexstrasza_bunny_destroy_platform_boom_visual() : SpellScriptLoader("spell_alexstrasza_bunny_destroy_platform_boom_visual") { }
+
+ class spell_alexstrasza_bunny_destroy_platform_boom_visual_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_alexstrasza_bunny_destroy_platform_boom_visual_SpellScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DESTROY_PLATFORM_EVENT))
+ return false;
+
+ return true;
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ if (Creature* target = GetHitCreature())
+ target->CastSpell(target, SPELL_DESTROY_PLATFORM_EVENT);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_alexstrasza_bunny_destroy_platform_boom_visual_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_alexstrasza_bunny_destroy_platform_boom_visual_SpellScript();
+ }
+};
+
+class spell_alexstrasza_bunny_destroy_platform_event : public SpellScriptLoader
+{
+ public:
+ spell_alexstrasza_bunny_destroy_platform_event() : SpellScriptLoader("spell_alexstrasza_bunny_destroy_platform_event") { }
+
+ class spell_alexstrasza_bunny_destroy_platform_event_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_alexstrasza_bunny_destroy_platform_event_SpellScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ void HandleSendEvent(SpellEffIndex /*effIndex*/)
+ {
+ Creature* caster = GetCaster()->ToCreature();
+ if (InstanceScript* instance = caster->GetInstanceScript())
+ if (GameObject* platform = caster->GetMap()->GetGameObject(instance->GetData64(DATA_PLATFORM)))
+ platform->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED);
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ GetCaster()->CastSpell((Unit*)NULL, SPELL_SUMMON_RED_DRAGON_BUDDY_F_CAST);
+ }
+
+ void Register()
+ {
+ OnEffectHit += SpellEffectFn(spell_alexstrasza_bunny_destroy_platform_event_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT);
+ OnEffectHit += SpellEffectFn(spell_alexstrasza_bunny_destroy_platform_event_SpellScript::HandleScript, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_alexstrasza_bunny_destroy_platform_event_SpellScript();
+ }
+};
+
+class spell_wyrmrest_skytalon_summon_red_dragon_buddy : public SpellScriptLoader
+{
+ public:
+ spell_wyrmrest_skytalon_summon_red_dragon_buddy() : SpellScriptLoader("spell_wyrmrest_skytalon_summon_red_dragon_buddy") { }
+
+ class spell_wyrmrest_skytalon_summon_red_dragon_buddy_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_wyrmrest_skytalon_summon_red_dragon_buddy_SpellScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_PLAYER;
+ }
+
+ void ChangeSummonPos(SpellEffIndex /*effIndex*/)
+ {
+ // Adjust effect summon position to lower Z
+ WorldLocation summonPos = *GetExplTargetDest();
+ Position offset = { 0.0f, 0.0f, -80.0f, 0.0f };
+ summonPos.RelocateOffset(offset);
+ SetExplTargetDest(summonPos);
+ GetHitDest()->RelocateOffset(offset);
+ }
+
+ void Register()
+ {
+ OnEffectHit += SpellEffectFn(spell_wyrmrest_skytalon_summon_red_dragon_buddy_SpellScript::ChangeSummonPos, EFFECT_0, SPELL_EFFECT_SUMMON);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_wyrmrest_skytalon_summon_red_dragon_buddy_SpellScript();
+ }
+};
+
+class spell_wyrmrest_skytalon_ride_red_dragon_buddy_trigger : public SpellScriptLoader
+{
+ public:
+ spell_wyrmrest_skytalon_ride_red_dragon_buddy_trigger() : SpellScriptLoader("spell_wyrmrest_skytalon_ride_red_dragon_buddy_trigger") { }
+
+ class spell_wyrmrest_skytalon_ride_red_dragon_buddy_trigger_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_wyrmrest_skytalon_ride_red_dragon_buddy_trigger_SpellScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ if (Unit* target = GetHitUnit())
+ target->CastSpell(GetCaster(), GetEffectValue(), true);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_wyrmrest_skytalon_ride_red_dragon_buddy_trigger_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_wyrmrest_skytalon_ride_red_dragon_buddy_trigger_SpellScript();
+ }
+};
+
+class spell_malygos_surge_of_power_warning_selector_25 : public SpellScriptLoader
+{
+ public:
+ spell_malygos_surge_of_power_warning_selector_25() : SpellScriptLoader("spell_malygos_surge_of_power_warning_selector_25") { }
+
+ class spell_malygos_surge_of_power_warning_selector_25_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_malygos_surge_of_power_warning_selector_25_SpellScript)
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SURGE_OF_POWER_PHASE_3_25))
+ return false;
+
+ return true;
+ }
+
+ void SendThreeTargets(std::list<WorldObject*>& targets)
+ {
+ // This spell hits only vehicles (SMSG_SPELL_GO target)
+ Creature* caster = GetCaster()->ToCreature();
+ // Remove all objects that aren't* vehicles.
+ targets.remove_if(IsCreatureVehicleCheck(false));
+ if (targets.empty())
+ return;
+
+ // But in fact it selects 3 targets (SMSG_SPELL_GO target are not filtered)
+ std::list<WorldObject*> selectedTargets = targets;
+
+ uint8 guidDataSlot = DATA_FIRST_SURGE_TARGET_GUID; // SetGuid in Malygos AI is reserved for 14th, 15th and 16th Id for the three targets
+ Trinity::Containers::RandomResizeList(selectedTargets, 3);
+ for (std::list<WorldObject*>::const_iterator itr = selectedTargets.begin(); itr != selectedTargets.end(); ++itr)
+ {
+ Creature* target = (*itr)->ToCreature();
+ caster->AI()->SetGUID(target->GetGUID(), guidDataSlot++);
+
+ if (Vehicle* vehicle = target->GetVehicleKit())
+ if (Unit* passenger = vehicle->GetPassenger(0))
+ if (passenger->GetTypeId() == TYPEID_PLAYER)
+ caster->AI()->Talk(EMOTE_SURGE_OF_POWER_WARNING_P3, passenger->GetGUID());
+ }
+ }
+
+ void ExecuteMainSpell()
+ {
+ GetCaster()->ToCreature()->AI()->DoCastAOE(SPELL_SURGE_OF_POWER_PHASE_3_25);
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_malygos_surge_of_power_warning_selector_25_SpellScript::SendThreeTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ AfterHit += SpellHitFn(spell_malygos_surge_of_power_warning_selector_25_SpellScript::ExecuteMainSpell);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_malygos_surge_of_power_warning_selector_25_SpellScript();
+ }
+};
+
+class spell_malygos_surge_of_power_25 : public SpellScriptLoader
+{
+ public:
+ spell_malygos_surge_of_power_25() : SpellScriptLoader("spell_malygos_surge_of_power_25") { }
+
+ class spell_malygos_surge_of_power_25_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_malygos_surge_of_power_25_SpellScript)
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ Creature* caster = GetCaster()->ToCreature();
+
+ for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end();)
+ {
+ bool found = false;
+ WorldObject* target = *itr;
+
+ for (uint32 guidSlot = DATA_FIRST_SURGE_TARGET_GUID; guidSlot < DATA_FIRST_SURGE_TARGET_GUID + NUM_MAX_SURGE_TARGETS; ++guidSlot)
+ {
+ if (target->GetGUID() == caster->AI()->GetGUID(guidSlot))
+ {
+ found = true;
+ break;
+ }
+ }
+
+ if (!found)
+ targets.erase(itr++);
+ else
+ ++itr;
+ }
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_malygos_surge_of_power_25_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_malygos_surge_of_power_25_SpellScript();
+ }
+};
+
+class spell_alexstrasza_gift_beam : public SpellScriptLoader
+{
+ public:
+ spell_alexstrasza_gift_beam() : SpellScriptLoader("spell_alexstrasza_gift_beam") { }
+
+ class spell_alexstrasza_gift_beam_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_alexstrasza_gift_beam_AuraScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ALEXSTRASZAS_GIFT_BEAM_VISUAL))
+ return false;
+
+ return true;
+ }
+
+ void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Creature* target = GetTarget()->ToCreature())
+ target->CastSpell(target, SPELL_ALEXSTRASZAS_GIFT_BEAM_VISUAL);
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Creature* target = GetTarget()->ToCreature())
+ target->RemoveAura(SPELL_ALEXSTRASZAS_GIFT_BEAM_VISUAL);
+ }
+
+ void Register()
+ {
+ OnEffectApply += AuraEffectApplyFn(spell_alexstrasza_gift_beam_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_alexstrasza_gift_beam_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_alexstrasza_gift_beam_AuraScript();
+ }
+};
+
+class spell_alexstrasza_gift_beam_visual : public SpellScriptLoader
+{
+ public:
+ spell_alexstrasza_gift_beam_visual() : SpellScriptLoader("spell_alexstrasza_gift_beam_visual") { }
+
+ class spell_alexstrasza_gift_beam_visual_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_alexstrasza_gift_beam_visual_AuraScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Creature* target = GetTarget()->ToCreature())
+ {
+ if (target->GetMap()->GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL)
+ _alexstraszaGift = target->SummonGameObject(GO_ALEXSTRASZA_S_GIFT_10, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0);
+ else if (target->GetMap()->GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)
+ _alexstraszaGift = target->SummonGameObject(GO_ALEXSTRASZA_S_GIFT_25, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0);
+ }
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Creature* target = GetTarget()->ToCreature())
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ {
+ _alexstraszaGift->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ if (GameObject* heartMagic = target->GetMap()->GetGameObject(instance->GetData64(DATA_HEART_OF_MAGIC_GUID)))
+ {
+ heartMagic->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ // TO DO: This is hack, core doesn't have support for these flags,
+ // remove line below if it ever gets supported otherwise object won't be accessible.
+ heartMagic->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnEffectApply += AuraEffectApplyFn(spell_alexstrasza_gift_beam_visual_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_alexstrasza_gift_beam_visual_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+
+ GameObject* _alexstraszaGift;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_alexstrasza_gift_beam_visual_AuraScript();
+ }
};
class achievement_denyin_the_scion : public AchievementCriteriaScript
{
public:
- achievement_denyin_the_scion() : AchievementCriteriaScript("achievement_denyin_the_scion") {}
+ achievement_denyin_the_scion() : AchievementCriteriaScript("achievement_denyin_the_scion") { }
bool OnCheck(Player* source, Unit* /*target*/)
{
+ // Only melee disks can be used
if (Unit* disk = source->GetVehicleBase())
- if (disk->GetEntry() == NPC_HOVER_DISK_CASTER || disk->GetEntry() == NPC_HOVER_DISK_MELEE)
+ if (disk->GetEntry() == NPC_HOVER_DISK_MELEE)
return true;
+
return false;
}
};
@@ -1114,11 +2547,29 @@ void AddSC_boss_malygos()
new boss_malygos();
new npc_portal_eoe();
new npc_power_spark();
- new npc_hover_disk();
+ new npc_melee_hover_disk();
+ new npc_caster_hover_disk();
+ new npc_nexus_lord();
+ new npc_scion_of_eternity();
new npc_arcane_overload();
new npc_wyrmrest_skytalon();
+ new npc_static_field();
+ new spell_malygos_portal_beam();
+ new spell_malygos_random_portal();
+ new spell_malygos_arcane_storm();
new spell_malygos_vortex_dummy();
new spell_malygos_vortex_visual();
- new npc_alexstrasza_eoe();
+ new spell_arcane_overload();
+ new spell_nexus_lord_align_disk_aggro();
+ new spell_scion_of_eternity_arcane_barrage();
+ new spell_malygos_destroy_platform_channel();
+ new spell_alexstrasza_bunny_destroy_platform_boom_visual();
+ new spell_alexstrasza_bunny_destroy_platform_event();
+ new spell_wyrmrest_skytalon_summon_red_dragon_buddy();
+ new spell_wyrmrest_skytalon_ride_red_dragon_buddy_trigger();
+ new spell_malygos_surge_of_power_warning_selector_25();
+ new spell_malygos_surge_of_power_25();
+ new spell_alexstrasza_gift_beam();
+ new spell_alexstrasza_gift_beam_visual();
new achievement_denyin_the_scion();
}
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h b/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h
index c25feaafaf8..db879eab6fb 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h
@@ -24,14 +24,19 @@ enum InstanceData
MAX_ENCOUNTER,
DATA_VORTEX_HANDLING,
- DATA_POWER_SPARKS_HANDLING
+ DATA_POWER_SPARKS_HANDLING,
+ DATA_RESPAWN_IRIS
};
enum InstanceData64
{
DATA_TRIGGER,
DATA_MALYGOS,
- DATA_PLATFORM
+ DATA_PLATFORM,
+ DATA_ALEXSTRASZA_BUNNY_GUID,
+ DATA_HEART_OF_MAGIC_GUID,
+ DATA_FOCUSING_IRIS_GUID,
+ DATA_GIFT_BOX_BUNNY_GUID
};
enum InstanceNpcs
@@ -44,16 +49,22 @@ enum InstanceNpcs
NPC_HOVER_DISK_CASTER = 30248,
NPC_ARCANE_OVERLOAD = 30282,
NPC_WYRMREST_SKYTALON = 30161,
- NPC_ALEXSTRASZA = 32295
+ NPC_ALEXSTRASZA = 32295,
+ NPC_ALEXSTRASZA_BUNNY = 31253,
+ NPC_ALEXSTRASZAS_GIFT = 32448,
+ NPC_SURGE_OF_POWER = 30334
};
enum InstanceGameObjects
{
GO_NEXUS_RAID_PLATFORM = 193070,
GO_EXIT_PORTAL = 193908,
- GO_FOCUSING_IRIS = 193958,
- GO_ALEXSTRASZA_S_GIFT = 193905,
- GO_ALEXSTRASZA_S_GIFT_2 = 193967
+ GO_FOCUSING_IRIS_10 = 193958,
+ GO_FOCUSING_IRIS_25 = 193960,
+ GO_ALEXSTRASZA_S_GIFT_10 = 193905,
+ GO_ALEXSTRASZA_S_GIFT_25 = 193967,
+ GO_HEART_OF_MAGIC_10 = 194158,
+ GO_HEART_OF_MAGIC_25 = 194159
};
enum InstanceEvents
@@ -63,10 +74,11 @@ enum InstanceEvents
enum InstanceSpells
{
- SPELL_VORTEX_4 = 55853, // damage | used to enter to the vehicle
- SPELL_VORTEX_5 = 56263, // damage | used to enter to the vehicle
- SPELL_PORTAL_OPENED = 61236,
- SPELL_RIDE_RED_DRAGON = 56071,
+ SPELL_VORTEX_4 = 55853, // damage | used to enter to the vehicle
+ SPELL_VORTEX_5 = 56263, // damage | used to enter to the vehicle
+ SPELL_PORTAL_OPENED = 61236,
+ SPELL_RIDE_RED_DRAGON_TRIGGERED = 56072,
+ SPELL_IRIS_OPENED = 61012 // visual when starting encounter
};
#endif
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
index 6b1be15f110..079732b0f14 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
@@ -24,7 +24,7 @@
class instance_eye_of_eternity : public InstanceMapScript
{
public:
- instance_eye_of_eternity() : InstanceMapScript("instance_eye_of_eternity", 616) {}
+ instance_eye_of_eternity() : InstanceMapScript("instance_eye_of_eternity", 616) { }
InstanceScript* GetInstanceScript(InstanceMap* map) const
{
@@ -41,9 +41,11 @@ public:
portalTriggers.clear();
malygosGUID = 0;
+ irisGUID = 0;
lastPortalGUID = 0;
platformGUID = 0;
exitPortalGUID = 0;
+ alexstraszaBunnyGUID = 0;
};
bool SetBossState(uint32 type, EncounterState state)
@@ -65,31 +67,18 @@ public:
}
}
- SpawnGameObject(GO_FOCUSING_IRIS, focusingIrisPosition);
SpawnGameObject(GO_EXIT_PORTAL, exitPortalPosition);
if (GameObject* platform = instance->GetGameObject(platformGUID))
platform->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED);
}
else if (state == DONE)
- {
- if (Creature* malygos = instance->GetCreature(malygosGUID))
- malygos->SummonCreature(NPC_ALEXSTRASZA, 829.0679f, 1244.77f, 279.7453f, 2.32f);
-
SpawnGameObject(GO_EXIT_PORTAL, exitPortalPosition);
-
- // we make the platform appear again because at the moment we don't support looting using a vehicle
- if (GameObject* platform = instance->GetGameObject(platformGUID))
- platform->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED);
-
- if (GameObject* chest = instance->GetGameObject(chestGUID))
- chest->SetRespawnTime(7*DAY);
- }
}
return true;
}
- //TODO: this should be handled in map, maybe add a summon function in map
+ /// @todo this should be handled in map, maybe add a summon function in map
// There is no other way afaik...
void SpawnGameObject(uint32 entry, Position& pos)
{
@@ -112,16 +101,31 @@ public:
case GO_NEXUS_RAID_PLATFORM:
platformGUID = go->GetGUID();
break;
- case GO_FOCUSING_IRIS:
- go->GetPosition(&focusingIrisPosition);
+ case GO_FOCUSING_IRIS_10:
+ if (instance->GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL)
+ {
+ irisGUID = go->GetGUID();
+ go->GetPosition(&focusingIrisPosition);
+ }
+ break;
+ case GO_FOCUSING_IRIS_25:
+ if (instance->GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)
+ {
+ irisGUID = go->GetGUID();
+ go->GetPosition(&focusingIrisPosition);
+ }
break;
case GO_EXIT_PORTAL:
exitPortalGUID = go->GetGUID();
go->GetPosition(&exitPortalPosition);
break;
- case GO_ALEXSTRASZA_S_GIFT:
- case GO_ALEXSTRASZA_S_GIFT_2:
- chestGUID = go->GetGUID();
+ case GO_HEART_OF_MAGIC_10:
+ if (instance->GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL)
+ heartOfMagicGUID = go->GetGUID();
+ break;
+ case GO_HEART_OF_MAGIC_25:
+ if (instance->GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)
+ heartOfMagicGUID = go->GetGUID();
break;
}
}
@@ -139,18 +143,40 @@ public:
case NPC_PORTAL_TRIGGER:
portalTriggers.push_back(creature->GetGUID());
break;
+ case NPC_ALEXSTRASZA_BUNNY:
+ alexstraszaBunnyGUID = creature->GetGUID();
+ break;
+ case NPC_ALEXSTRASZAS_GIFT:
+ giftBoxBunnyGUID = creature->GetGUID();
+ break;
}
}
- void ProcessEvent(WorldObject* obj, uint32 eventId)
+ void OnUnitDeath(Unit* unit)
+ {
+ if (unit->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ // Player continues to be moving after death no matter if spline will be cleared along with all movements,
+ // so on next world tick was all about delay if box will pop or not (when new movement will be registered)
+ // since in EoE you never stop falling. However root at this precise* moment works,
+ // it will get cleared on release. If by any chance some lag happen "Reload()" and "RepopMe()" works,
+ // last test I made now gave me 50/0 of this bug so I can't do more about it.
+ unit->SetControlled(true, UNIT_STATE_ROOT);
+ }
+
+ void ProcessEvent(WorldObject* /*obj*/, uint32 eventId)
{
if (eventId == EVENT_FOCUSING_IRIS)
{
- if (GameObject* go = obj->ToGameObject())
- go->Delete(); // this is not the best way.
+ if (Creature* alexstraszaBunny = instance->GetCreature(alexstraszaBunnyGUID))
+ {
+ alexstraszaBunny->CastSpell(alexstraszaBunny, SPELL_IRIS_OPENED);
+ instance->GetGameObject(irisGUID)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
+ }
if (Creature* malygos = instance->GetCreature(malygosGUID))
- malygos->GetMotionMaster()->MovePoint(4, 770.10f, 1275.33f, 267.23f); // MOVE_INIT_PHASE_ONE
+ malygos->AI()->DoAction(0); // ACTION_LAND_ENCOUNTER_START
if (GameObject* exitPortal = instance->GetGameObject(exitPortalGUID))
exitPortal->Delete();
@@ -194,7 +220,7 @@ public:
void PowerSparksHandling()
{
- bool next = (lastPortalGUID == portalTriggers.back() || !lastPortalGUID ? true : false);
+ bool next = (lastPortalGUID == portalTriggers.back() || !lastPortalGUID ? true : false);
for (std::list<uint64>::const_iterator itr_trigger = portalTriggers.begin(); itr_trigger != portalTriggers.end(); ++itr_trigger)
{
@@ -223,6 +249,9 @@ public:
case DATA_POWER_SPARKS_HANDLING:
PowerSparksHandling();
break;
+ case DATA_RESPAWN_IRIS:
+ SpawnGameObject(instance->GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL ? GO_FOCUSING_IRIS_10 : GO_FOCUSING_IRIS_25, focusingIrisPosition);
+ break;
}
}
@@ -236,6 +265,14 @@ public:
return malygosGUID;
case DATA_PLATFORM:
return platformGUID;
+ case DATA_ALEXSTRASZA_BUNNY_GUID:
+ return alexstraszaBunnyGUID;
+ case DATA_HEART_OF_MAGIC_GUID:
+ return heartOfMagicGUID;
+ case DATA_FOCUSING_IRIS_GUID:
+ return irisGUID;
+ case DATA_GIFT_BOX_BUNNY_GUID:
+ return giftBoxBunnyGUID;
}
return 0;
@@ -287,10 +324,13 @@ public:
std::list<uint64> vortexTriggers;
std::list<uint64> portalTriggers;
uint64 malygosGUID;
+ uint64 irisGUID;
uint64 lastPortalGUID;
uint64 platformGUID;
uint64 exitPortalGUID;
- uint64 chestGUID;
+ uint64 heartOfMagicGUID;
+ uint64 alexstraszaBunnyGUID;
+ uint64 giftBoxBunnyGUID;
Position focusingIrisPosition;
Position exitPortalPosition;
};
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp
index 955c6b801af..8d1420ce12e 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp
@@ -124,7 +124,7 @@ class boss_anomalus : public CreatureScript
chaosTheory = false;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -191,11 +191,12 @@ class mob_chaotic_rift : public CreatureScript
public:
mob_chaotic_rift() : CreatureScript("mob_chaotic_rift") { }
- struct mob_chaotic_riftAI : public Scripted_NoMovementAI
+ struct mob_chaotic_riftAI : public ScriptedAI
{
- mob_chaotic_riftAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ mob_chaotic_riftAI(Creature* creature) : ScriptedAI(creature)
{
instance = me->GetInstanceScript();
+ SetCombatMovement(false);
}
InstanceScript* instance;
@@ -211,7 +212,7 @@ class mob_chaotic_rift : public CreatureScript
DoCast(me, SPELL_ARCANEFORM, false);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_kolurg.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_kolurg.cpp
index fedb1f5cebc..7f32b2bc4a5 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_kolurg.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_kolurg.cpp
@@ -56,7 +56,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
void AttackStart(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp
index 39c93f15d6f..e257b898426 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp
@@ -53,7 +53,7 @@ public:
void Reset() {}
void AttackStart(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
index d1a9227c6fb..e84431a0788 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
@@ -167,7 +167,7 @@ public:
intenseColdList.push_back(guid);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -244,7 +244,7 @@ class spell_intense_cold : public SpellScriptLoader
if (aurEff->GetBase()->GetStackAmount() < 2)
return;
Unit* caster = GetCaster();
- //TODO: the caster should be boss but not the player
+ /// @todo the caster should be boss but not the player
if (!caster || !caster->GetAI())
return;
caster->GetAI()->SetGUID(GetTarget()->GetGUID(), DATA_INTENSE_COLD);
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
index 7679ae53c80..26bf80cb32e 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
@@ -140,7 +140,7 @@ public:
Talk(SAY_KILL);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_MAGUS_DEAD)
{
@@ -213,7 +213,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp
index c9cfe70b8de..0f480b1d101 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp
@@ -109,7 +109,7 @@ public:
Talk(SAY_KILL);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -219,7 +219,7 @@ public:
return type == DATA_COUNT ? _count : 0;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (_despawntimer <= diff)
{
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
index feb801450b1..1a820cd3727 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
@@ -81,7 +81,7 @@ public:
Talk(SAY_AGGRO);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -170,7 +170,7 @@ public:
deathTimer = 19000;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (pulseTimer <= diff)
{
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
index 0af498f24c6..d27909328a5 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
@@ -141,7 +141,7 @@ public:
return 0;
}
- void DoAction(const int32 action)
+ void DoAction(int32 action)
{
if (action != ACTION_SET_NORMAL_EVENTS)
return;
@@ -194,7 +194,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
index 07f19ce9760..57a9c9958df 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
@@ -240,7 +240,7 @@ public:
Talk(SAY_PLAYER_KILL);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
index ec240db0b69..a2b5d340410 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
@@ -96,7 +96,7 @@ public:
return coreEnergizeOrientation;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -187,7 +187,7 @@ class npc_azure_ring_captain : public CreatureScript
}
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!UpdateVictim())
return;
@@ -207,7 +207,7 @@ class npc_azure_ring_captain : public CreatureScript
DoCast(target, SPELL_ICE_BEAM);
}
- void DoAction(const int32 action)
+ void DoAction(int32 action)
{
switch (action)
{
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
index f152d0011aa..1f8ba3edade 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
@@ -355,7 +355,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!(instance->GetBossState(DATA_VAROS_EVENT) == DONE))
{
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
index 16e705e45ab..e7c6e920970 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
@@ -206,7 +206,7 @@ public:
instance->SetData(TYPE_BJARNGRIM, DONE);
}
- //TODO: remove when removal is done by the core
+ /// @todo remove when removal is done by the core
void DoRemoveStanceAura(uint8 uiStance)
{
switch (uiStance)
@@ -223,7 +223,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -412,7 +412,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
index 6f017884063..9ce8ea3c52c 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
@@ -198,8 +198,7 @@ public:
summoned->CastSpell(summoned, DUNGEON_MODE(SPELL_SPARK_VISUAL_TRIGGER, H_SPELL_SPARK_VISUAL_TRIGGER), true);
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
{
summoned->SetInCombatWith(target);
summoned->GetMotionMaster()->Clear();
@@ -214,7 +213,7 @@ public:
lSparkList.Despawn(summoned);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -336,7 +335,7 @@ public:
uiDamage = 0;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
// Despawn if the encounter is not running
if (instance && instance->GetData(TYPE_IONAR) != IN_PROGRESS)
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp
index df99ab33467..fe6c1c27155 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp
@@ -123,7 +123,7 @@ public:
Talk(SAY_SLAY);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
index 9b22003bb1c..1e41f346942 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
@@ -226,7 +226,7 @@ public:
return 0;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
@@ -427,7 +427,7 @@ public:
me->DespawnOrUnsummon();
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
// Return since we have no target or if we are frozen
if (!UpdateVictim() || m_bIsFrozen)
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp
index c9a4d2ba5bd..adbc8827212 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp
@@ -99,7 +99,7 @@ public:
instance->SetData(DATA_KRYSTALLUS_EVENT, IN_PROGRESS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -164,7 +164,7 @@ public:
//this part should be in the core
if (pSpell->Id == SPELL_SHATTER || pSpell->Id == H_SPELL_SHATTER)
{
- // todo: we need eventmap to kill this stuff
+ /// @todo we need eventmap to kill this stuff
//clear this, if we are still performing
if (bIsSlam)
{
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp
index 7fbf5f3ee79..71222aba88b 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp
@@ -107,7 +107,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -117,9 +117,7 @@ public:
{
if (PartingSorrowTimer <= diff)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
-
- if (target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_PARTING_SORROW);
PartingSorrowTimer = urand(30000, 40000);
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
index 9e4c97ea0fc..3b0faa08574 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
@@ -147,7 +147,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -228,7 +228,7 @@ public:
Talk(SAY_SLAY);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action == ACTION_OOZE_DEAD)
++abuseTheOoze;
@@ -266,7 +266,7 @@ public:
uiMergeTimer = 10000;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (uiMergeTimer <= diff)
{
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
index f1d690f32e0..0a9ae889588 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
@@ -204,7 +204,7 @@ public:
}*/
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (bKaddrakActivated)
{
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
index 1f96848fa0a..5a5efc36b3c 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
@@ -176,10 +176,7 @@ enum EncounterPhases
{
PHASE_NORMAL = 0,
PHASE_ROLE_PLAY = 1,
- PHASE_BIG_BANG = 2,
-
- PHASE_MASK_NO_UPDATE = (1 << PHASE_ROLE_PLAY) | (1 << PHASE_BIG_BANG),
- PHASE_MASK_NO_CAST_CHECK = 1 << PHASE_ROLE_PLAY,
+ PHASE_BIG_BANG = 2
};
enum AchievmentInfo
@@ -331,7 +328,7 @@ class boss_algalon_the_observer : public CreatureScript
}
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -343,8 +340,8 @@ class boss_algalon_the_observer : public CreatureScript
DoCast(me, SPELL_RIDE_THE_LIGHTNING, true);
me->GetMotionMaster()->MovePoint(POINT_ALGALON_LAND, AlgalonLandPos);
me->SetHomePosition(AlgalonLandPos);
- Movement::MoveSplineInit init(*me);
- init.MoveTo(AlgalonLandPos.GetPositionX(), AlgalonLandPos.GetPositionY(), AlgalonLandPos.GetPositionZ());
+ Movement::MoveSplineInit init(me);
+ init.MoveTo(AlgalonLandPos.GetPositionX(), AlgalonLandPos.GetPositionY(), AlgalonLandPos.GetPositionZ(), false);
init.SetOrientationFixed(true);
init.Launch();
events.Reset();
@@ -540,14 +537,14 @@ class boss_algalon_the_observer : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
- if ((!(events.GetPhaseMask() & PHASE_MASK_NO_UPDATE) && !UpdateVictim()) || !CheckInRoom())
+ if ((!(events.IsInPhase(PHASE_ROLE_PLAY) || events.IsInPhase(PHASE_BIG_BANG)) && !UpdateVictim()) || !CheckInRoom())
return;
events.Update(diff);
- if (!(events.GetPhaseMask() & PHASE_MASK_NO_CAST_CHECK))
+ if (!events.IsInPhase(PHASE_ROLE_PLAY))
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
@@ -733,7 +730,7 @@ class npc_living_constellation : public CreatureScript
return _isActive ? 1 : 0;
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -770,9 +767,9 @@ class npc_living_constellation : public CreatureScript
caster->ToCreature()->DespawnOrUnsummon(1);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
- if (!(_events.GetPhaseMask() & PHASE_MASK_NO_UPDATE) && !UpdateVictim())
+ if (!(_events.IsInPhase(PHASE_ROLE_PLAY) || _events.IsInPhase(PHASE_BIG_BANG)) && !UpdateVictim())
return;
_events.Update(diff);
@@ -864,7 +861,7 @@ class npc_brann_bronzebeard_algalon : public CreatureScript
{
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -915,7 +912,7 @@ class npc_brann_bronzebeard_algalon : public CreatureScript
_events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, delay);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
UpdateVictim();
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
index 451ad6ed915..6ad70d38635 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
@@ -158,7 +158,7 @@ class boss_steelbreaker : public CreatureScript
events.ScheduleEvent(EVENT_FUSION_PUNCH, 15000);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -212,7 +212,7 @@ class boss_steelbreaker : public CreatureScript
DoCast(me, SPELL_ELECTRICAL_CHARGE);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -287,7 +287,7 @@ class boss_runemaster_molgeim : public CreatureScript
events.ScheduleEvent(EVENT_RUNE_OF_POWER, 20000);
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -338,7 +338,7 @@ class boss_runemaster_molgeim : public CreatureScript
Talk(SAY_MOLGEIM_SLAY);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -440,7 +440,7 @@ class boss_stormcaller_brundir : public CreatureScript
events.ScheduleEvent(EVENT_OVERLOAD, urand(60000, 120000));
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -499,7 +499,7 @@ class boss_stormcaller_brundir : public CreatureScript
Talk(SAY_BRUNDIR_SLAY);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp
index aa8c7a96898..5faa2cc4628 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp
@@ -154,7 +154,7 @@ class boss_auriaya : public CreatureScript
}
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -207,7 +207,7 @@ class boss_auriaya : public CreatureScript
Talk(SAY_DEATH);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -299,7 +299,7 @@ class npc_auriaya_seeping_trigger : public CreatureScript
DoCast(me, SPELL_SEEPING_ESSENCE);
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (instance->GetBossState(BOSS_AURIAYA) != IN_PROGRESS)
me->DespawnOrUnsummon();
@@ -338,7 +338,7 @@ class npc_sanctum_sentry : public CreatureScript
DoCast(me, SPELL_STRENGHT_PACK, true);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -408,7 +408,7 @@ class npc_feral_defender : public CreatureScript
events.ScheduleEvent(EVENT_RUSH, 10000);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
index 89ddbb7ac38..f89112e3d67 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
@@ -362,7 +362,7 @@ class boss_flame_leviathan : public CreatureScript
Unbroken = data ? true : false;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || !CheckInRoom())
return;
@@ -467,7 +467,7 @@ class boss_flame_leviathan : public CreatureScript
_pursueTarget = target->GetGUID();
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (action && action <= 4) // Tower destruction, debuff leviathan loot and reduce active tower count
{
@@ -638,7 +638,7 @@ class boss_flame_leviathan_defense_cannon : public CreatureScript
DoCast(me, AURA_STEALTH_DETECTION);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -752,7 +752,7 @@ class boss_flame_leviathan_safety_container : public CreatureScript
me->SetPosition(x, y, z, 0);
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
}
};
@@ -802,7 +802,7 @@ class npc_mechanolift : public CreatureScript
container->EnterVehicle(me);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (MoveTimer <= diff)
{
@@ -851,7 +851,7 @@ class npc_pool_of_tar : public CreatureScript
me->CastSpell(me, SPELL_BLAZE, true);
}
- void UpdateAI(uint32 const /*diff*/) {}
+ void UpdateAI(uint32 /*diff*/) {}
};
CreatureAI* GetAI(Creature* creature) const
@@ -880,7 +880,7 @@ class npc_colossus : public CreatureScript
instance->SetData(DATA_COLOSSUS, instance->GetData(DATA_COLOSSUS)+1);
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!UpdateVictim())
return;
@@ -917,7 +917,7 @@ class npc_thorims_hammer : public CreatureScript
}
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!me->HasAura(AURA_DUMMY_BLUE))
me->CastSpell(me, AURA_DUMMY_BLUE, true);
@@ -963,7 +963,7 @@ public:
uint32 infernoTimer;
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
npc_escortAI::UpdateAI(diff);
@@ -1012,7 +1012,7 @@ class npc_hodirs_fury : public CreatureScript
}
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!me->HasAura(AURA_DUMMY_GREEN))
me->CastSpell(me, AURA_DUMMY_GREEN, true);
@@ -1046,7 +1046,7 @@ class npc_freyas_ward : public CreatureScript
summonTimer = 5000;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (summonTimer <= diff)
{
@@ -1089,7 +1089,7 @@ class npc_freya_ward_summon : public CreatureScript
lashTimer = 5000;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1127,7 +1127,7 @@ class npc_lorekeeper : public CreatureScript
{
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
// Start encounter
if (action == ACTION_SPAWN_VEHICLES)
@@ -1176,7 +1176,7 @@ class npc_lorekeeper : public CreatureScript
if (Creature* Branz = creature->FindNearestCreature(NPC_BRANZ_BRONZBEARD, 1000, true))
{
Delorah->GetMotionMaster()->MovePoint(0, Branz->GetPositionX()-4, Branz->GetPositionY(), Branz->GetPositionZ());
- //TODO Delorah->AI()->Talk(xxxx, Branz->GetGUID()); when reached at branz
+ /// @todo Delorah->AI()->Talk(xxxx, Branz->GetGUID()); when reached at branz
}
}
}
@@ -1608,7 +1608,7 @@ class FlameLeviathanPursuedTargetSelector
bool operator()(WorldObject* target) const
{
- //! No players, only vehicles (todo: check if blizzlike)
+ //! No players, only vehicles (@todo check if blizzlike)
Creature* creatureTarget = target->ToCreature();
if (!creatureTarget)
return true;
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
index 4db3b58c53f..33a14aaa3df 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
@@ -216,10 +216,12 @@ class npc_iron_roots : public CreatureScript
public:
npc_iron_roots() : CreatureScript("npc_iron_roots") { }
- struct npc_iron_rootsAI : public Scripted_NoMovementAI
+ struct npc_iron_rootsAI : public ScriptedAI
{
- npc_iron_rootsAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_iron_rootsAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
+
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
me->ApplySpellImmune(0, IMMUNITY_ID, 49560, true); // Death Grip
me->setFaction(14);
@@ -385,7 +387,7 @@ class boss_freya : public CreatureScript
return 0;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -720,7 +722,7 @@ class boss_elder_brightleaf : public CreatureScript
Talk(SAY_ELDER_AGGRO);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || me->HasAura(SPELL_DRAINED_OF_POWER))
return;
@@ -763,7 +765,7 @@ class boss_elder_brightleaf : public CreatureScript
DoMeleeAttackIfReady();
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -854,7 +856,7 @@ class boss_elder_stonebark : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || me->HasAura(SPELL_DRAINED_OF_POWER))
return;
@@ -890,7 +892,7 @@ class boss_elder_stonebark : public CreatureScript
DoMeleeAttackIfReady();
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -968,7 +970,7 @@ class boss_elder_ironbranch : public CreatureScript
Talk(SAY_ELDER_AGGRO);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || me->HasAura(SPELL_DRAINED_OF_POWER))
return;
@@ -1004,7 +1006,7 @@ class boss_elder_ironbranch : public CreatureScript
DoMeleeAttackIfReady();
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -1049,7 +1051,7 @@ class npc_detonating_lasher : public CreatureScript
changeTargetTimer = 7500;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1108,7 +1110,7 @@ class npc_ancient_water_spirit : public CreatureScript
tidalWaveTimer = 10000;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1169,7 +1171,7 @@ class npc_storm_lasher : public CreatureScript
stormboltTimer = 5000;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1230,7 +1232,7 @@ class npc_snaplasher : public CreatureScript
waveCount = CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount;
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!UpdateVictim())
return;
@@ -1295,7 +1297,7 @@ class npc_ancient_conservator : public CreatureScript
DoCast(who, SPELL_CONSERVATOR_GRIP, true);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1337,10 +1339,11 @@ class npc_sun_beam : public CreatureScript
public:
npc_sun_beam() : CreatureScript("npc_sun_beam") { }
- struct npc_sun_beamAI : public Scripted_NoMovementAI
+ struct npc_sun_beamAI : public ScriptedAI
{
- npc_sun_beamAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_sun_beamAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
me->SetReactState(REACT_PASSIVE);
DoCastAOE(SPELL_FREYA_UNSTABLE_ENERGY_VISUAL, true);
DoCast(SPELL_FREYA_UNSTABLE_ENERGY);
@@ -1358,10 +1361,11 @@ class npc_healthy_spore : public CreatureScript
public:
npc_healthy_spore() : CreatureScript("npc_healthy_spore") { }
- struct npc_healthy_sporeAI : public Scripted_NoMovementAI
+ struct npc_healthy_sporeAI : public ScriptedAI
{
- npc_healthy_sporeAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_healthy_sporeAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
me->SetReactState(REACT_PASSIVE);
DoCast(me, SPELL_HEALTHY_SPORE_VISUAL);
@@ -1370,7 +1374,7 @@ class npc_healthy_spore : public CreatureScript
lifeTimer = urand(22000, 30000);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (lifeTimer <= diff)
{
@@ -1397,17 +1401,19 @@ class npc_eonars_gift : public CreatureScript
public:
npc_eonars_gift() : CreatureScript("npc_eonars_gift") { }
- struct npc_eonars_giftAI : public Scripted_NoMovementAI
+ struct npc_eonars_giftAI : public ScriptedAI
{
- npc_eonars_giftAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_eonars_giftAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
+
lifeBindersGiftTimer = 12000;
DoCast(me, SPELL_GROW);
DoCast(me, SPELL_PHEROMONES, true);
DoCast(me, SPELL_EONAR_VISUAL, true);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (lifeBindersGiftTimer <= diff)
{
@@ -1435,15 +1441,17 @@ class npc_nature_bomb : public CreatureScript
public:
npc_nature_bomb() : CreatureScript("npc_nature_bomb") { }
- struct npc_nature_bombAI : public Scripted_NoMovementAI
+ struct npc_nature_bombAI : public ScriptedAI
{
- npc_nature_bombAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_nature_bombAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
+
bombTimer = urand(8000, 10000);
DoCast(SPELL_OBJECT_BOMB);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (bombTimer <= diff)
{
@@ -1475,10 +1483,12 @@ class npc_unstable_sun_beam : public CreatureScript
public:
npc_unstable_sun_beam() : CreatureScript("npc_unstable_sun_beam") { }
- struct npc_unstable_sun_beamAI : public Scripted_NoMovementAI
+ struct npc_unstable_sun_beamAI : public ScriptedAI
{
- npc_unstable_sun_beamAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_unstable_sun_beamAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
+
despawnTimer = urand(7000, 12000);
instance = me->GetInstanceScript();
DoCast(me, SPELL_PHOTOSYNTHESIS);
@@ -1486,7 +1496,7 @@ class npc_unstable_sun_beam : public CreatureScript
me->SetReactState(REACT_PASSIVE);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (despawnTimer <= diff)
{
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp
index 6fa2c7127e6..1642cc0483f 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp
@@ -135,7 +135,7 @@ class boss_general_vezax : public CreatureScript
events.ScheduleEvent(EVENT_BERSERK, 600000);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -250,7 +250,7 @@ class boss_general_vezax : public CreatureScript
return 0;
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -333,7 +333,7 @@ class boss_saronite_animus : public CreatureScript
Vezax->AI()->DoAction(ACTION_ANIMUS_DIE);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -392,7 +392,7 @@ class npc_saronite_vapors : public CreatureScript
events.ScheduleEvent(EVENT_RANDOM_MOVE, urand(5000, 7500));
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
events.Update(diff);
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp
index 26d15d78e59..b970dc6d7ab 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp
@@ -25,7 +25,7 @@
#include "GridNotifiersImpl.h"
#include "ulduar.h"
-/* #TODO: Achievements
+/* @todo Achievements
Storm Cloud (Shaman ability)
Destroying of Toasty Fires
*/
@@ -193,7 +193,7 @@ class npc_flash_freeze : public CreatureScript
checkDespawnTimer = 1000;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || me->getVictim()->HasAura(SPELL_BLOCK_OF_ICE) || me->getVictim()->HasAura(SPELL_FLASH_FREEZE_HELPER))
return;
@@ -381,7 +381,7 @@ class boss_hodir : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -460,7 +460,7 @@ class boss_hodir : public CreatureScript
DoMeleeAttackIfReady();
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -525,7 +525,7 @@ class npc_icicle : public CreatureScript
icicleTimer = 2500;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (icicleTimer <= diff)
{
@@ -573,7 +573,7 @@ class npc_snowpacked_icicle : public CreatureScript
despawnTimer = 12000;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (despawnTimer <= diff)
{
@@ -611,7 +611,7 @@ class npc_hodir_priest : public CreatureScript
events.ScheduleEvent(EVENT_DISPEL_MAGIC, urand(15000, 20000));
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED))
return;
@@ -687,7 +687,7 @@ class npc_hodir_shaman : public CreatureScript
events.ScheduleEvent(EVENT_STORM_CLOUD, urand(10000, 12500));
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED))
return;
@@ -749,7 +749,7 @@ class npc_hodir_druid : public CreatureScript
events.ScheduleEvent(EVENT_STARLIGHT, urand(15000, 17500));
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED))
return;
@@ -824,7 +824,7 @@ class npc_hodir_mage : public CreatureScript
summons.remove(summoned->GetGUID());
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_STUNNED) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED))
return;
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
index f525bc874f7..b040a64c75a 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
@@ -180,7 +180,7 @@ class boss_ignis : public CreatureScript
summons.Summon(summon);
}
- void DoAction(const int32 action)
+ void DoAction(int32 action)
{
if (action != ACTION_REMOVE_BUFF)
return;
@@ -193,7 +193,7 @@ class boss_ignis : public CreatureScript
_firstConstructKill = secondKill;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -319,7 +319,7 @@ class npc_iron_construct : public CreatureScript
}
}
- void UpdateAI(const uint32 /*uiDiff*/)
+ void UpdateAI(uint32 /*uiDiff*/)
{
if (!UpdateVictim())
return;
@@ -392,7 +392,7 @@ class npc_scorch_ground : public CreatureScript
_heatTimer = 0;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (_heat)
{
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp
index 24282340278..5e94fc2ee5d 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp
@@ -26,7 +26,7 @@
/* ScriptData
SDName: boss_kologarn
SD%Complete: 90
-SDComment: TODO: Achievements
+SDComment: @todo Achievements
SDCategory: Ulduar
EndScriptData */
@@ -242,7 +242,7 @@ class boss_kologarn : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
index 79edede01df..ac46fbc1227 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
@@ -15,7 +15,7 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-//TODO: Harpoon chain from 62505 should not get removed when other chain is applied
+/// @todo Harpoon chain from 62505 should not get removed when other chain is applied
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
@@ -224,7 +224,7 @@ class boss_razorscale_controller : public CreatureScript
_JustDied();
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
if (instance->GetBossState(BOSS_RAZORSCALE) != IN_PROGRESS)
return;
@@ -243,7 +243,7 @@ class boss_razorscale_controller : public CreatureScript
}
}
- void UpdateAI(uint32 const Diff)
+ void UpdateAI(uint32 Diff)
{
events.Update(Diff);
@@ -394,7 +394,7 @@ class boss_razorscale : public CreatureScript
return 0;
}
- void UpdateAI(uint32 const Diff)
+ void UpdateAI(uint32 Diff)
{
if (!UpdateVictim())
return;
@@ -562,7 +562,7 @@ class boss_razorscale : public CreatureScript
}
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -625,7 +625,7 @@ class npc_expedition_commander : public CreatureScript
summons.push_back(summoned->GetGUID());
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -639,7 +639,7 @@ class npc_expedition_commander : public CreatureScript
}
}
- void UpdateAI(uint32 const Diff)
+ void UpdateAI(uint32 Diff)
{
if (AttackStartTimer <= Diff)
{
@@ -739,10 +739,11 @@ class npc_mole_machine_trigger : public CreatureScript
public:
npc_mole_machine_trigger() : CreatureScript("npc_mole_machine_trigger") { }
- struct npc_mole_machine_triggerAI : public Scripted_NoMovementAI
+ struct npc_mole_machine_triggerAI : public ScriptedAI
{
- npc_mole_machine_triggerAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_mole_machine_triggerAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_PACIFIED);
}
@@ -761,7 +762,7 @@ class npc_mole_machine_trigger : public CreatureScript
NpcSummoned = false;
}
- void UpdateAI(uint32 const Diff)
+ void UpdateAI(uint32 Diff)
{
if (!GobSummoned && SummonGobTimer <= Diff)
{
@@ -818,10 +819,11 @@ class npc_devouring_flame : public CreatureScript
public:
npc_devouring_flame() : CreatureScript("npc_devouring_flame") { }
- struct npc_devouring_flameAI : public Scripted_NoMovementAI
+ struct npc_devouring_flameAI : public ScriptedAI
{
- npc_devouring_flameAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_devouring_flameAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_PACIFIED);
}
@@ -855,7 +857,7 @@ class npc_darkrune_watcher : public CreatureScript
LightTimer = urand(1000, 3000);
}
- void UpdateAI(uint32 const Diff)
+ void UpdateAI(uint32 Diff)
{
if (!UpdateVictim())
return;
@@ -915,7 +917,7 @@ class npc_darkrune_guardian : public CreatureScript
}
- void UpdateAI(uint32 const Diff)
+ void UpdateAI(uint32 Diff)
{
if (!UpdateVictim())
return;
@@ -961,7 +963,7 @@ class npc_darkrune_sentinel : public CreatureScript
ShoutTimer = urand(15000, 30000);
}
- void UpdateAI(uint32 const Diff)
+ void UpdateAI(uint32 Diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp
index 564087088d3..89ce6ab2733 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp
@@ -78,11 +78,11 @@ class boss_thorim : public CreatureScript
_EnterCombat();
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
- //SPELLS TODO:
+ //SPELLS @todo
//
DoMeleeAttackIfReady();
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
index 43d19d78f8a..76a60607f7e 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
@@ -16,7 +16,7 @@
*/
/*
- TODO:
+ @todo
Fix void zone damage
If the boss is to close to a scrap pile -> no summon -- Needs retail confirmation
make the life sparks visible... /? Need test
@@ -241,7 +241,7 @@ class boss_xt002 : public CreatureScript
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MUST_DECONSTRUCT_FASTER);
}
- void DoAction(const int32 action)
+ void DoAction(int32 action)
{
switch (action)
{
@@ -269,7 +269,7 @@ class boss_xt002 : public CreatureScript
ExposeHeart();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim() || !CheckInRoom())
return;
@@ -451,14 +451,15 @@ class mob_xt002_heart : public CreatureScript
public:
mob_xt002_heart() : CreatureScript("mob_xt002_heart") { }
- struct mob_xt002_heartAI : public Scripted_NoMovementAI
+ struct mob_xt002_heartAI : public ScriptedAI
{
- mob_xt002_heartAI(Creature* creature) : Scripted_NoMovementAI(creature),
+ mob_xt002_heartAI(Creature* creature) : ScriptedAI(creature),
_instance(creature->GetInstanceScript())
{
+ SetCombatMovement(false);
}
- void UpdateAI(uint32 const /*diff*/) { }
+ void UpdateAI(uint32 /*diff*/) { }
void JustDied(Unit* /*killer*/)
{
@@ -512,7 +513,7 @@ class mob_scrapbot : public CreatureScript
me->GetMotionMaster()->MoveFollow(pXT002, 0.0f, 0.0f);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (_rangeCheckTimer <= diff)
{
@@ -573,7 +574,7 @@ class mob_pummeller : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -673,7 +674,7 @@ class mob_boombot : public CreatureScript
me->SetFloatValue(UNIT_FIELD_MINDAMAGE, 15000.0f);
me->SetFloatValue(UNIT_FIELD_MAXDAMAGE, 18000.0f);
- // Todo: proper waypoints?
+ /// @todo proper waypoints?
if (Creature* pXT002 = me->GetCreature(*me, _instance->GetData64(BOSS_XT002)))
me->GetMotionMaster()->MoveFollow(pXT002, 0.0f, 0.0f);
}
@@ -703,7 +704,7 @@ class mob_boombot : public CreatureScript
}
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!UpdateVictim())
return;
@@ -745,7 +746,7 @@ class mob_life_spark : public CreatureScript
_shockTimer = 0; // first one is immediate.
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
index 7934f6fba72..125f66497bf 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
@@ -565,10 +565,6 @@ class instance_ulduar : public InstanceMapScript
}
HandleGameObject(KologarnBridgeGUID, false);
}
- if (state == IN_PROGRESS)
- HandleGameObject(KologarnDoorGUID, false);
- else
- HandleGameObject(KologarnDoorGUID, true);
break;
case BOSS_HODIR:
if (state == DONE)
@@ -787,7 +783,7 @@ class instance_ulduar : public InstanceMapScript
return 0;
}
- bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const* , Unit const* /* = NULL */, uint32 /* = 0 */)
+ bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const*, Unit const* /* = NULL */, uint32 /* = 0 */)
{
switch (criteriaId)
{
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
index 1fd84b6f6ce..215630ac5fa 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
@@ -124,10 +124,10 @@ public:
events.Reset();
events.SetPhase(PHASE_HUMAN);
- events.ScheduleEvent(EVENT_CLEAVE, urand(6,12)*IN_MILLISECONDS, 0, PHASE_HUMAN);
- events.ScheduleEvent(EVENT_STAGGERING_ROAR, urand(18,21)*IN_MILLISECONDS, 0, PHASE_HUMAN);
- events.ScheduleEvent(EVENT_ENRAGE, urand(7,14)*IN_MILLISECONDS, 0, PHASE_HUMAN);
- events.ScheduleEvent(EVENT_SMASH, urand(12,17)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ events.ScheduleEvent(EVENT_CLEAVE, urand(6, 12)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ events.ScheduleEvent(EVENT_STAGGERING_ROAR, urand(18, 21)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ events.ScheduleEvent(EVENT_ENRAGE, urand(7, 14)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ events.ScheduleEvent(EVENT_SMASH, urand(12, 17)*IN_MILLISECONDS, 0, PHASE_HUMAN);
if (instance)
instance->SetData(DATA_INGVAR_EVENT, NOT_STARTED);
@@ -154,7 +154,7 @@ public:
Talk(YELL_DEAD_1);
}
- if (events.GetPhaseMask() & (1 << PHASE_EVENT))
+ if (events.IsInPhase(PHASE_EVENT))
damage = 0;
}
@@ -193,9 +193,9 @@ public:
void ScheduleSecondPhase()
{
events.SetPhase(PHASE_UNDEAD);
- events.ScheduleEvent(EVENT_DARK_SMASH, urand(14,18)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- events.ScheduleEvent(EVENT_DREADFUL_ROAR, urand(18,22)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10,14)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ events.ScheduleEvent(EVENT_DARK_SMASH, urand(14, 18)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ events.ScheduleEvent(EVENT_DREADFUL_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10, 14)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
events.ScheduleEvent(EVENT_SHADOW_AXE, 30*IN_MILLISECONDS, 0, PHASE_UNDEAD);
}
@@ -204,9 +204,9 @@ public:
Talk(bIsUndead ? YELL_KILL_1 : YELL_KILL_2);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
- if (!UpdateVictim() && !(events.GetPhaseMask() & (1 << PHASE_EVENT)))
+ if (!UpdateVictim() && !events.IsInPhase(PHASE_EVENT))
return;
events.Update(diff);
@@ -221,19 +221,19 @@ public:
// PHASE ONE
case EVENT_CLEAVE:
DoCastVictim(SPELL_CLEAVE);
- events.ScheduleEvent(EVENT_CLEAVE, urand(6,12)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ events.ScheduleEvent(EVENT_CLEAVE, urand(6, 12)*IN_MILLISECONDS, 0, PHASE_HUMAN);
break;
case EVENT_STAGGERING_ROAR:
DoCast(me, SPELL_STAGGERING_ROAR);
- events.ScheduleEvent(EVENT_STAGGERING_ROAR, urand(18,22)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ events.ScheduleEvent(EVENT_STAGGERING_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_HUMAN);
break;
case EVENT_ENRAGE:
DoCast(me, SPELL_ENRAGE);
- events.ScheduleEvent(EVENT_ENRAGE, urand(7,14)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ events.ScheduleEvent(EVENT_ENRAGE, urand(7, 14)*IN_MILLISECONDS, 0, PHASE_HUMAN);
break;
case EVENT_SMASH:
DoCastAOE(SPELL_SMASH);
- events.ScheduleEvent(EVENT_SMASH, urand(12,16)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ events.ScheduleEvent(EVENT_SMASH, urand(12, 16)*IN_MILLISECONDS, 0, PHASE_HUMAN);
break;
case EVENT_JUST_TRANSFORMED:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -247,15 +247,15 @@ public:
// PHASE TWO
case EVENT_DARK_SMASH:
DoCastVictim(SPELL_DARK_SMASH);
- events.ScheduleEvent(EVENT_DARK_SMASH, urand(12,16)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ events.ScheduleEvent(EVENT_DARK_SMASH, urand(12, 16)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
break;
case EVENT_DREADFUL_ROAR:
DoCast(me, SPELL_DREADFUL_ROAR);
- events.ScheduleEvent(EVENT_DREADFUL_ROAR, urand(18,22)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ events.ScheduleEvent(EVENT_DREADFUL_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
break;
case EVENT_WOE_STRIKE:
DoCastVictim(SPELL_WOE_STRIKE);
- events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10,14)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10, 14)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
break;
case EVENT_SHADOW_AXE:
if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1))
@@ -358,7 +358,7 @@ public:
void AttackStart(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (uiResurectTimer)
{
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
index d709182bf04..896421909ad 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
@@ -94,7 +94,7 @@ public:
instance = creature->GetInstanceScript();
}
- void UpdateAI(const uint32 /*diff*/) {}
+ void UpdateAI(uint32 /*diff*/) {}
void JustDied(Unit* /*killer*/)
{
@@ -129,8 +129,8 @@ public:
instance->SetData(DATA_PRINCEKELESETH_EVENT, NOT_STARTED);
events.Reset();
- events.ScheduleEvent(EVENT_SHADOWBOLT, urand(2,3)*IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_FROST_TOMB, urand(14,19)*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SHADOWBOLT, urand(2, 3)*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_FROST_TOMB, urand(14, 19)*IN_MILLISECONDS);
events.ScheduleEvent(EVENT_SUMMON_SKELETONS, 6*IN_MILLISECONDS);
summons.DespawnAll();
@@ -193,7 +193,7 @@ public:
return 0;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -213,7 +213,7 @@ public:
break;
case EVENT_SHADOWBOLT:
DoCastVictim(SPELL_SHADOWBOLT);
- events.ScheduleEvent(EVENT_SHADOWBOLT, urand(2,3)*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SHADOWBOLT, urand(2, 3)*IN_MILLISECONDS);
break;
case EVENT_FROST_TOMB:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true, -SPELL_FROST_TOMB))
@@ -225,7 +225,7 @@ public:
// checked from sniffs - the player casts the spell
target->CastSpell(target, SPELL_FROST_TOMB_SUMMON, true);
}
- events.ScheduleEvent(EVENT_FROST_TOMB, urand(14,19)*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_FROST_TOMB, urand(14, 19)*IN_MILLISECONDS);
break;
}
}
@@ -261,7 +261,7 @@ public:
void Reset()
{
events.Reset();
- events.ScheduleEvent(EVENT_DECREPIFY, urand(4,6)*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_DECREPIFY, urand(4, 6)*IN_MILLISECONDS);
}
@@ -280,7 +280,7 @@ public:
me->SetFlag(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
events.Reset();
- events.ScheduleEvent(EVENT_RESURRECT, urand(18,22)*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_RESURRECT, urand(18, 22)*IN_MILLISECONDS);
me->GetMotionMaster()->MovementExpired(false);
me->GetMotionMaster()->MoveIdle();
@@ -288,7 +288,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -304,7 +304,7 @@ public:
{
case EVENT_DECREPIFY:
DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_DECREPIFY), SPELL_DECREPIFY);
- events.ScheduleEvent(EVENT_DECREPIFY, urand(1,5)*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_DECREPIFY, urand(1, 5)*IN_MILLISECONDS);
break;
case EVENT_RESURRECT:
events.ScheduleEvent(EVENT_FULL_HEAL, 1*IN_MILLISECONDS);
@@ -325,7 +325,7 @@ public:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->RemoveFlag(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
me->GetMotionMaster()->MoveChase(me->getVictim());
- events.ScheduleEvent(EVENT_DECREPIFY, urand(4,6)*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_DECREPIFY, urand(4, 6)*IN_MILLISECONDS);
break;
}
}
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp
index 05822aa2595..ef7ad659a24 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp
@@ -180,7 +180,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (ghost)
{
@@ -340,7 +340,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (ghost)
{
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
index 7103095b252..4f7f0e844bb 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
@@ -146,7 +146,7 @@ public:
return near_f > 0 && near_f < 4 ? near_f : 0;
}
- void UpdateAI(uint32 const /* diff */)
+ void UpdateAI(uint32 /* diff */)
{
if (fm_Type == 0)
fm_Type = GetForgeMasterType();
@@ -291,7 +291,7 @@ public:
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
index 36506227287..2b1d850ab25 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
@@ -174,7 +174,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (currentPhase != PHASE_GORTOK_PALEHOOF)
return;
@@ -325,7 +325,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -438,7 +438,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -554,7 +554,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -674,7 +674,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -771,7 +771,7 @@ public:
me->SetSpeed(MOVE_FLIGHT, 0.5f);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (currentPhase == PHASE_NONE)
return;
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
index 2514cb3de78..3a74eebd947 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
@@ -303,7 +303,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
switch (Phase)
{
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
index 9468a111db5..f2090f6a2e6 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
@@ -101,8 +101,8 @@ enum SvalaPhase
static const float spectatorWP[2][3] =
{
- {296.95f,-312.76f,86.36f},
- {297.69f,-275.81f,86.36f}
+ {296.95f, -312.76f, 86.36f},
+ {297.69f, -275.81f, 86.36f}
};
static Position ArthasPos = { 295.81f, -366.16f, 92.57f, 1.58f };
@@ -250,7 +250,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (Phase == IDLE)
return;
@@ -459,11 +459,13 @@ public:
return new npc_ritual_channelerAI(creature);
}
- struct npc_ritual_channelerAI : public Scripted_NoMovementAI
+ struct npc_ritual_channelerAI : public ScriptedAI
{
- npc_ritual_channelerAI(Creature* creature) :Scripted_NoMovementAI(creature)
+ npc_ritual_channelerAI(Creature* creature) :ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
+
+ SetCombatMovement(false);
}
InstanceScript* instance;
@@ -477,7 +479,7 @@ public:
DoCast(me, SPELL_SHADOWS_IN_THE_DARK);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
@@ -517,7 +519,7 @@ public:
if (motionType == POINT_MOTION_TYPE)
{
if (pointId == 1)
- me->GetMotionMaster()->MovePoint(2,spectatorWP[1][0],spectatorWP[1][1],spectatorWP[1][2]);
+ me->GetMotionMaster()->MovePoint(2, spectatorWP[1][0], spectatorWP[1][1], spectatorWP[1][2]);
else if (pointId == 2)
me->DespawnOrUnsummon(1000);
}
@@ -599,7 +601,7 @@ class npc_scourge_hulk : public CreatureScript
killedByRitualStrike = true;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
index 99d987e63a4..f4c65216f4a 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
@@ -207,7 +207,7 @@ public:
return 0;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (m_bIsWalking)
{
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp
index 33e0619c7e5..a4ea8649ff9 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp
@@ -76,7 +76,7 @@ class boss_archavon : public CreatureScript
}
// Below UpdateAI may need review/debug.
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -156,7 +156,7 @@ class mob_archavon_warder : public CreatureScript
DoZoneInCombat();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp
index b8b6acce54d..baed96453dc 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp
@@ -115,7 +115,7 @@ class boss_emalon : public CreatureScript
_EnterCombat();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -215,7 +215,7 @@ class mob_tempest_minion : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp
index fafeba6a570..d6db736b82c 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp
@@ -65,15 +65,15 @@ class boss_koralon : public CreatureScript
{
DoCast(me, SPELL_BURNING_FURY);
- events.ScheduleEvent(EVENT_BURNING_FURY, 20000); // TODO check timer
+ events.ScheduleEvent(EVENT_BURNING_FURY, 20000); /// @todo check timer
events.ScheduleEvent(EVENT_BURNING_BREATH, 15000); // 1st after 15sec, then every 45sec
events.ScheduleEvent(EVENT_METEOR_FISTS_A, 75000); // 1st after 75sec, then every 45sec
- events.ScheduleEvent(EVENT_FLAME_CINDER_A, 30000); // TODO check timer
+ events.ScheduleEvent(EVENT_FLAME_CINDER_A, 30000); /// @todo check timer
_EnterCombat();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -149,7 +149,7 @@ class mob_flame_warder : public CreatureScript
events.ScheduleEvent(EVENT_FW_METEOR_FISTS_A, 10000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
index 613b8ebf8dc..3068049e322 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
@@ -74,7 +74,7 @@ class boss_toravon : public CreatureScript
_EnterCombat();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -142,7 +142,7 @@ class mob_frost_warder : public CreatureScript
events.ScheduleEvent(EVENT_FROST_BLAST, 5000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -196,7 +196,7 @@ public:
DoZoneInCombat();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!done)
{
@@ -234,9 +234,9 @@ class mob_frozen_orb_stalker : public CreatureScript
public:
mob_frozen_orb_stalker() : CreatureScript("mob_frozen_orb_stalker") { }
- struct mob_frozen_orb_stalkerAI : public Scripted_NoMovementAI
+ struct mob_frozen_orb_stalkerAI : public ScriptedAI
{
- mob_frozen_orb_stalkerAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ mob_frozen_orb_stalkerAI(Creature* creature) : ScriptedAI(creature)
{
creature->SetVisible(false);
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE);
@@ -244,9 +244,11 @@ class mob_frozen_orb_stalker : public CreatureScript
instance = creature->GetInstanceScript();
spawned = false;
+
+ SetCombatMovement(false);
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (spawned)
return;
diff --git a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp
index 1f12685a4b0..d524e3fb708 100644
--- a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp
@@ -89,7 +89,7 @@ public:
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (instance && instance->GetData(DATA_REMOVE_NPC) == 1)
{
diff --git a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp
index 6c16bb98ff1..9dbb10be601 100644
--- a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp
@@ -144,7 +144,7 @@ public:
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -303,7 +303,7 @@ public:
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp
index fb4297f595f..cfb3c03b12c 100644
--- a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp
@@ -55,7 +55,7 @@ enum Actions
ACTION_WATER_ELEMENT_KILLED = 2,
};
-// TODO get those positions from spawn of creature 29326
+/// @todo get those positions from spawn of creature 29326
#define MAX_SPAWN_LOC 5
static Position SpawnLoc[MAX_SPAWN_LOC]=
{
@@ -151,7 +151,7 @@ public:
}
}
- void DoAction(const int32 param)
+ void DoAction(int32 param)
{
if (!me->isAlive())
return;
@@ -205,7 +205,7 @@ public:
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
@@ -362,7 +362,7 @@ public:
return;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (uiRangeCheck_Timer < uiDiff)
{
diff --git a/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp
index dc0b320b307..187cf5d6b30 100644
--- a/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp
@@ -102,7 +102,7 @@ public:
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp
index d40f3b14f87..d308c6c696b 100644
--- a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp
@@ -95,7 +95,7 @@ public:
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp
index 92ced3c702f..b14a9e0dec5 100644
--- a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp
@@ -28,7 +28,7 @@ enum Spells
SPELL_ARCANE_BUFFET_H = 59485,
SPELL_SUMMON_ETHEREAL_SPHERE_1 = 54102,
SPELL_SUMMON_ETHEREAL_SPHERE_2 = 54137,
- SPELL_SUMMON_ETHEREAL_SPHERE_3 = 54138,
+ SPELL_SUMMON_ETHEREAL_SPHERE_3 = 54138
};
enum NPCs
@@ -42,7 +42,7 @@ enum CreatureSpells
SPELL_ARCANE_POWER = 54160,
H_SPELL_ARCANE_POWER = 59474,
SPELL_SUMMON_PLAYERS = 54164,
- SPELL_POWER_BALL_VISUAL = 54141,
+ SPELL_POWER_BALL_VISUAL = 54141
};
enum Yells
@@ -154,7 +154,7 @@ public:
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -251,7 +251,7 @@ public:
uiRangeCheck_Timer = 1000;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp
index cf0ee82c01c..0f150fe88b8 100644
--- a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp
@@ -122,7 +122,7 @@ public:
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp
index 11887e732ed..df79366e6cd 100644
--- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp
+++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp
@@ -792,7 +792,7 @@ public:
void ActivateCrystal()
{
// Kill all mobs registered with SetData64(ADD_TRASH_MOB)
- // TODO: All visual, spells etc
+ /// @todo All visual, spells etc
for (std::set<uint64>::const_iterator itr = trashMobs.begin(); itr != trashMobs.end(); ++itr)
{
Creature* creature = instance->GetCreature(*itr);
diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp
index 5ebc2eaf973..fbbf3fa3df5 100644
--- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp
+++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp
@@ -342,7 +342,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
ScriptedAI::UpdateAI(uiDiff);
@@ -481,7 +481,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (instance && instance->GetData(DATA_MAIN_EVENT_PHASE) != IN_PROGRESS)
me->CastStop();
@@ -578,7 +578,7 @@ public:
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!instance) //Massive usage of instance, global check
return;
@@ -724,7 +724,7 @@ struct violet_hold_trashAI : public npc_escortAI
}
}
- void UpdateAI(const uint32)
+ void UpdateAI(uint32)
{
if (instance && instance->GetData(DATA_MAIN_EVENT_PHASE) != IN_PROGRESS)
me->CastStop();
@@ -832,7 +832,7 @@ public:
uiSunderArmorTimer = 4000;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
violet_hold_trashAI::UpdateAI(diff);
npc_escortAI::UpdateAI(diff);
@@ -910,7 +910,7 @@ public:
uiFrostboltTimer = 4000;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
violet_hold_trashAI::UpdateAI(diff);
npc_escortAI::UpdateAI(diff);
@@ -984,7 +984,7 @@ public:
uiSpellLockTimer = 5000;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
violet_hold_trashAI::UpdateAI(diff);
npc_escortAI::UpdateAI(diff);
@@ -1044,7 +1044,7 @@ public:
uiMagicReflectionTimer = 8000;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
violet_hold_trashAI::UpdateAI(diff);
npc_escortAI::UpdateAI(diff);
@@ -1097,7 +1097,7 @@ public:
TacticalBlinkCasted =false;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
violet_hold_trashAI::UpdateAI(diff);
npc_escortAI::UpdateAI(diff);
@@ -1159,7 +1159,7 @@ public:
uiConeOfColdTimer = 4000;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
violet_hold_trashAI::UpdateAI(diff);
npc_escortAI::UpdateAI(diff);
@@ -1239,7 +1239,7 @@ public:
uiWhirlwindTimer = 8000;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
violet_hold_trashAI::UpdateAI(diff);
npc_escortAI::UpdateAI(diff);
@@ -1293,7 +1293,7 @@ public:
uiManaDetonationTimer = 5000;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
violet_hold_trashAI::UpdateAI(diff);
npc_escortAI::UpdateAI(diff);
diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp
index 8e7507bce61..fef900e1dfd 100644
--- a/src/server/scripts/Northrend/zone_borean_tundra.cpp
+++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp
@@ -92,7 +92,7 @@ public:
void EnterCombat(Unit* /*who*/){}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!phase)
return;
@@ -436,7 +436,7 @@ public:
DoCast(me, SPELL_DROP_CRATE, true);
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (setCrateNumber)
{
@@ -576,7 +576,7 @@ public:
go_caribou->SetGoState(GO_STATE_READY);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (phaseTimer <= diff)
{
@@ -701,7 +701,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (IntroPhase)
{
@@ -867,7 +867,7 @@ public:
}
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (WithRedDragonBlood && HarpoonerGUID && !me->HasAura(SPELL_RED_DRAGONBLOOD))
{
@@ -1017,7 +1017,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
@@ -1360,7 +1360,7 @@ public:
CAST_AI(npc_thassarian::npc_thassarianAI, CAST_CRE(summoner)->AI())->talbotInPosition = true;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (bCheck)
{
@@ -1482,7 +1482,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
ScriptedAI::UpdateAI(uiDiff);
@@ -1622,7 +1622,7 @@ public:
}
}
- void UpdateAI(const uint32 /*uiDiff*/)
+ void UpdateAI(uint32 /*uiDiff*/)
{
if (!UpdateVictim())
return;
@@ -1674,7 +1674,7 @@ public:
rebuff = 0;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
UpdateVictim();
@@ -1990,7 +1990,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (bStarted)
{
@@ -2005,7 +2005,7 @@ public:
}
}
- void DoAction(const int32 param)
+ void DoAction(int32 param)
{
if (param == 1)
bStarted = true;
@@ -2105,7 +2105,7 @@ public:
uiExplosionTimer = urand(5000, 10000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (uiExplosionTimer < diff)
{
@@ -2160,7 +2160,7 @@ public:
uiTimer = urand(13000, 18000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (uiTimer <= diff)
{
@@ -2207,9 +2207,9 @@ class npc_warmage_coldarra : public CreatureScript
public:
npc_warmage_coldarra() : CreatureScript("npc_warmage_coldarra") { }
- struct npc_warmage_coldarraAI : public Scripted_NoMovementAI
+ struct npc_warmage_coldarraAI : public ScriptedAI
{
- npc_warmage_coldarraAI(Creature* creature) : Scripted_NoMovementAI(creature){}
+ npc_warmage_coldarraAI(Creature* creature) : ScriptedAI(creature) {}
uint32 m_uiTimer; //Timer until recast
@@ -2222,7 +2222,7 @@ public:
void AttackStart(Unit* /*who*/) {}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (m_uiTimer <= uiDiff)
{
@@ -2358,7 +2358,7 @@ public:
me->RestoreFaction();
}
- void DoAction(const int32 /*iParam*/)
+ void DoAction(int32 /*iParam*/)
{
me->StopMoving();
me->SetUInt32Value(UNIT_NPC_FLAGS, 0);
@@ -2383,7 +2383,7 @@ public:
me->AI()->AttackStart(player);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (uiEventTimer && uiEventTimer <= uiDiff)
{
diff --git a/src/server/scripts/Northrend/zone_crystalsong_forest.cpp b/src/server/scripts/Northrend/zone_crystalsong_forest.cpp
index d12b5176b15..d05e442b0f4 100644
--- a/src/server/scripts/Northrend/zone_crystalsong_forest.cpp
+++ b/src/server/scripts/Northrend/zone_crystalsong_forest.cpp
@@ -49,9 +49,12 @@ class npc_warmage_violetstand : public CreatureScript
public:
npc_warmage_violetstand() : CreatureScript("npc_warmage_violetstand") { }
- struct npc_warmage_violetstandAI : public Scripted_NoMovementAI
+ struct npc_warmage_violetstandAI : public ScriptedAI
{
- npc_warmage_violetstandAI(Creature* creature) : Scripted_NoMovementAI(creature){}
+ npc_warmage_violetstandAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
uint64 uiTargetGUID;
@@ -60,7 +63,7 @@ public:
uiTargetGUID = 0;
}
- void UpdateAI(const uint32 /*uiDiff*/)
+ void UpdateAI(uint32 /*uiDiff*/)
{
if (me->IsNonMeleeSpellCasted(false))
return;
diff --git a/src/server/scripts/Northrend/zone_dalaran.cpp b/src/server/scripts/Northrend/zone_dalaran.cpp
index d16b6fe4588..33440cad48b 100644
--- a/src/server/scripts/Northrend/zone_dalaran.cpp
+++ b/src/server/scripts/Northrend/zone_dalaran.cpp
@@ -55,9 +55,9 @@ class npc_mageguard_dalaran : public CreatureScript
public:
npc_mageguard_dalaran() : CreatureScript("npc_mageguard_dalaran") { }
- struct npc_mageguard_dalaranAI : public Scripted_NoMovementAI
+ struct npc_mageguard_dalaranAI : public ScriptedAI
{
- npc_mageguard_dalaranAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_mageguard_dalaranAI(Creature* creature) : ScriptedAI(creature)
{
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_NORMAL, true);
@@ -117,7 +117,7 @@ public:
return;
}
- void UpdateAI(const uint32 /*diff*/){}
+ void UpdateAI(uint32 /*diff*/){}
};
CreatureAI* GetAI(Creature* creature) const
diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp
index a8fb0215902..ed7354acb50 100644
--- a/src/server/scripts/Northrend/zone_dragonblight.cpp
+++ b/src/server/scripts/Northrend/zone_dragonblight.cpp
@@ -248,7 +248,7 @@ class npc_wyrmrest_defender : public CreatureScript
RenewRecoveryChecker = 0;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
// Check system for Health Warning should happen first time whenever get under 30%,
// after it should be able to happen only after recovery of last renew is fully done (20 sec),
diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp
index fe1f561071c..e8eddea6ef7 100644
--- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp
+++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp
@@ -192,7 +192,7 @@ public:
RWORGGUID = 0;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
@@ -264,7 +264,7 @@ public:
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!UpdateVictim())
return;
@@ -369,7 +369,7 @@ public:
m_uiPhase = 1;
}
- void UpdateAI(const uint32 /*uiDiff*/)
+ void UpdateAI(uint32 /*uiDiff*/)
{
if (m_uiPhase == 1)
{
@@ -416,7 +416,7 @@ public:
m_uiPhase = 1;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
// call this each update tick?
if (me->FindNearestCreature(TALLHORN_STAG, 0.2f))
@@ -510,7 +510,7 @@ public:
}
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!UpdateVictim())
return;
@@ -558,7 +558,7 @@ public:
uiChargedSentryTotem = urand(10000, 12000);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
@@ -624,7 +624,7 @@ class npc_venture_co_straggler : public CreatureScript
me->SetReactState(REACT_AGGRESSIVE);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (uiPlayerGUID && uiRunAwayTimer <= uiDiff)
{
diff --git a/src/server/scripts/Northrend/zone_howling_fjord.cpp b/src/server/scripts/Northrend/zone_howling_fjord.cpp
index ff4d8ec7a79..65d69e368b8 100644
--- a/src/server/scripts/Northrend/zone_howling_fjord.cpp
+++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp
@@ -362,7 +362,7 @@ public:
return true;
}
- // TODO: make prisoners help (unclear if summoned or using npc's from surrounding cages (summon inside small cages?))
+ /// @todo make prisoners help (unclear if summoned or using npc's from surrounding cages (summon inside small cages?))
struct npc_daegarnAI : public ScriptedAI
{
npc_daegarnAI(Creature* creature) : ScriptedAI(creature) { }
diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp
index 2ec5a3e8164..70b500166c9 100644
--- a/src/server/scripts/Northrend/zone_icecrown.cpp
+++ b/src/server/scripts/Northrend/zone_icecrown.cpp
@@ -32,6 +32,8 @@ EndContentData */
#include "ScriptedGossip.h"
#include "SpellAuras.h"
#include "Player.h"
+#include "TemporarySummon.h"
+#include "CombatAI.h"
/*######
## npc_arete
@@ -219,7 +221,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
@@ -264,9 +266,12 @@ class npc_guardian_pavilion : public CreatureScript
public:
npc_guardian_pavilion() : CreatureScript("npc_guardian_pavilion") { }
- struct npc_guardian_pavilionAI : public Scripted_NoMovementAI
+ struct npc_guardian_pavilionAI : public ScriptedAI
{
- npc_guardian_pavilionAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ npc_guardian_pavilionAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
void MoveInLineOfSight(Unit* who)
{
@@ -370,9 +375,12 @@ class npc_tournament_training_dummy : public CreatureScript
public:
npc_tournament_training_dummy(): CreatureScript("npc_tournament_training_dummy"){}
- struct npc_tournament_training_dummyAI : Scripted_NoMovementAI
+ struct npc_tournament_training_dummyAI : ScriptedAI
{
- npc_tournament_training_dummyAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ npc_tournament_training_dummyAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
EventMap events;
bool isVulnerable;
@@ -442,7 +450,7 @@ class npc_tournament_training_dummy : public CreatureScript
isVulnerable = true;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
events.Update(diff);
@@ -584,13 +592,15 @@ class npc_blessed_banner : public CreatureScript
public:
npc_blessed_banner() : CreatureScript("npc_blessed_banner") { }
- struct npc_blessed_bannerAI : public Scripted_NoMovementAI
+ struct npc_blessed_bannerAI : public ScriptedAI
{
- npc_blessed_bannerAI(Creature* creature) : Scripted_NoMovementAI(creature) , Summons(me)
+ npc_blessed_bannerAI(Creature* creature) : ScriptedAI(creature), Summons(me)
{
HalofSpawned = false;
PhaseCount = 0;
Summons.DespawnAll();
+
+ SetCombatMovement(false);
}
EventMap events;
@@ -611,7 +621,7 @@ public:
me->setRegeneratingHealth(false);
DoCast(SPELL_THREAT_PULSE);
me->AI()->Talk(BANNER_SAY);
- events.ScheduleEvent(EVENT_SPAWN,3000);
+ events.ScheduleEvent(EVENT_SPAWN, 3000);
}
void EnterCombat(Unit* /*who*/) {}
@@ -629,7 +639,7 @@ public:
me->DespawnOrUnsummon();
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
events.Update(diff);
@@ -672,167 +682,167 @@ public:
guidMason[2] = Mason3->GetGUID();
Mason3->GetMotionMaster()->MovePoint(0, Mason3Pos[1]);
}
- events.ScheduleEvent(EVENT_INTRO_1,15000);
+ events.ScheduleEvent(EVENT_INTRO_1, 15000);
}
break;
case EVENT_INTRO_1:
{
- if (Creature* Dalfors = me->GetCreature(*me,guidDalfors))
+ if (Creature* Dalfors = me->GetCreature(*me, guidDalfors))
Dalfors->AI()->Talk(DALFORS_SAY_PRE_1);
- events.ScheduleEvent(EVENT_INTRO_2,5000);
+ events.ScheduleEvent(EVENT_INTRO_2, 5000);
}
break;
case EVENT_INTRO_2:
{
- if (Creature* Dalfors = me->GetCreature(*me,guidDalfors))
+ if (Creature* Dalfors = me->GetCreature(*me, guidDalfors))
{
Dalfors->SetFacingTo(6.215f);
Dalfors->AI()->Talk(DALFORS_SAY_PRE_2);
}
- events.ScheduleEvent(EVENT_INTRO_3,5000);
+ events.ScheduleEvent(EVENT_INTRO_3, 5000);
}
break;
case EVENT_INTRO_3:
{
- if (Creature* Dalfors = me->GetCreature(*me,guidDalfors))
+ if (Creature* Dalfors = me->GetCreature(*me, guidDalfors))
{
Dalfors->GetMotionMaster()->MovePoint(0, DalforsPos[2]);
Dalfors->SetHomePosition(DalforsPos[2]);
}
- if (Creature* Priest1 = me->GetCreature(*me,guidPriest[0]))
+ if (Creature* Priest1 = me->GetCreature(*me, guidPriest[0]))
{
Priest1->SetFacingTo(5.7421f);
Priest1->SetHomePosition(Priest1Pos[1]);
}
- if (Creature* Priest2 = me->GetCreature(*me,guidPriest[1]))
+ if (Creature* Priest2 = me->GetCreature(*me, guidPriest[1]))
{
Priest2->SetFacingTo(5.7421f);
Priest2->SetHomePosition(Priest2Pos[1]);
}
- if (Creature* Priest3 = me->GetCreature(*me,guidPriest[2]))
+ if (Creature* Priest3 = me->GetCreature(*me, guidPriest[2]))
{
Priest3->SetFacingTo(5.7421f);
Priest3->SetHomePosition(Priest3Pos[1]);
}
- if (Creature* Mason1 = me->GetCreature(*me,guidMason[0]))
+ if (Creature* Mason1 = me->GetCreature(*me, guidMason[0]))
{
Mason1->GetMotionMaster()->MovePoint(0, Mason1Pos[2]);
Mason1->SetHomePosition(Mason1Pos[2]);
}
- if (Creature* Mason2 = me->GetCreature(*me,guidMason[1]))
+ if (Creature* Mason2 = me->GetCreature(*me, guidMason[1]))
{
Mason2->GetMotionMaster()->MovePoint(0, Mason2Pos[2]);
Mason2->SetHomePosition(Mason2Pos[2]);
}
- if (Creature* Mason3 = me->GetCreature(*me,guidMason[2]))
+ if (Creature* Mason3 = me->GetCreature(*me, guidMason[2]))
{
Mason3->GetMotionMaster()->MovePoint(0, Mason3Pos[2]);
Mason3->SetHomePosition(Mason3Pos[2]);
}
- events.ScheduleEvent(EVENT_START_FIGHT,5000);
- events.ScheduleEvent(EVENT_MASON_ACTION,15000);
+ events.ScheduleEvent(EVENT_START_FIGHT, 5000);
+ events.ScheduleEvent(EVENT_MASON_ACTION, 15000);
}
break;
case EVENT_MASON_ACTION:
{
- if (Creature* Mason1 = me->GetCreature(*me,guidMason[0]))
+ if (Creature* Mason1 = me->GetCreature(*me, guidMason[0]))
{
Mason1->SetFacingTo(2.8972f);
- Mason1->AI()->SetData(1,1); // triggers SAI actions on npc
+ Mason1->AI()->SetData(1, 1); // triggers SAI actions on npc
}
- if (Creature* Mason2 = me->GetCreature(*me,guidMason[1]))
+ if (Creature* Mason2 = me->GetCreature(*me, guidMason[1]))
{
Mason2->SetFacingTo(3.1241f);
- Mason2->AI()->SetData(1,1); // triggers SAI actions on npc
+ Mason2->AI()->SetData(1, 1); // triggers SAI actions on npc
}
- if (Creature* Mason3 = me->GetCreature(*me,guidMason[2]))
+ if (Creature* Mason3 = me->GetCreature(*me, guidMason[2]))
{
Mason3->SetFacingTo(3.6651f);
- Mason3->AI()->SetData(1,1); // triggers SAI actions on npc
+ Mason3->AI()->SetData(1, 1); // triggers SAI actions on npc
}
}
break;
case EVENT_START_FIGHT:
{
- if(Creature* LK = GetClosestCreatureWithEntry(me,NPC_LK,100))
+ if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100))
LK->AI()->Talk(LK_TALK_1);
- if (Creature* Dalfors = me->GetCreature(*me,guidDalfors))
+ if (Creature* Dalfors = me->GetCreature(*me, guidDalfors))
Dalfors->AI()->Talk(DALFORS_SAY_START);
- events.ScheduleEvent(EVENT_WAVE_SPAWN,1000);
+ events.ScheduleEvent(EVENT_WAVE_SPAWN, 1000);
}
break;
case EVENT_WAVE_SPAWN:
{
if (PhaseCount == 3)
{
- if (Creature* LK = GetClosestCreatureWithEntry(me,NPC_LK,100))
+ if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100))
LK->AI()->Talk(LK_TALK_2);
}
else if (PhaseCount == 6)
{
- if (Creature* LK = GetClosestCreatureWithEntry(me,NPC_LK,100))
+ if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100))
LK->AI()->Talk(LK_TALK_3);
}
- if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE,Mason3Pos[0]))
+ if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE, Mason3Pos[0]))
{
tempsum->SetHomePosition(DalforsPos[2]);
- tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me,NPC_BLESSED_BANNER,100));
+ tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100));
}
- if (urand(0,1) == 0)
+ if (urand(0, 1) == 0)
{
- if (Creature* tempsum = DoSummon(NPC_HIDEOUS_PLAGEBRINGER,Mason1Pos[0]))
+ if (Creature* tempsum = DoSummon(NPC_HIDEOUS_PLAGEBRINGER, Mason1Pos[0]))
{
tempsum->SetHomePosition(DalforsPos[2]);
- tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me,NPC_BLESSED_BANNER,100));
+ tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100));
}
- if (Creature* tempsum = DoSummon(NPC_HIDEOUS_PLAGEBRINGER,Mason2Pos[0]))
+ if (Creature* tempsum = DoSummon(NPC_HIDEOUS_PLAGEBRINGER, Mason2Pos[0]))
{
tempsum->SetHomePosition(DalforsPos[2]);
- tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me,NPC_BLESSED_BANNER,100));
+ tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100));
}
}
else
{
- if (Creature* tempsum = DoSummon(NPC_REANIMATED_CAPTAIN,Mason1Pos[0]))
+ if (Creature* tempsum = DoSummon(NPC_REANIMATED_CAPTAIN, Mason1Pos[0]))
{
tempsum->SetHomePosition(DalforsPos[2]);
- tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me,NPC_BLESSED_BANNER,100));
+ tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100));
}
- if (Creature* tempsum = DoSummon(NPC_REANIMATED_CAPTAIN,Mason2Pos[0]))
+ if (Creature* tempsum = DoSummon(NPC_REANIMATED_CAPTAIN, Mason2Pos[0]))
{
tempsum->SetHomePosition(DalforsPos[2]);
- tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me,NPC_BLESSED_BANNER,100));
+ tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100));
}
}
PhaseCount++;
if (PhaseCount < 8)
- events.ScheduleEvent(EVENT_WAVE_SPAWN,urand(10000,20000));
+ events.ScheduleEvent(EVENT_WAVE_SPAWN, urand(10000, 20000));
else
- events.ScheduleEvent(EVENT_HALOF,urand(10000,20000));
+ events.ScheduleEvent(EVENT_HALOF, urand(10000, 20000));
}
break;
case EVENT_HALOF:
{
- if (Creature* LK = GetClosestCreatureWithEntry(me,NPC_LK,100))
+ if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100))
LK->AI()->Talk(LK_TALK_4);
- if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE,Mason1Pos[0]))
+ if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE, Mason1Pos[0]))
{
tempsum->SetHomePosition(DalforsPos[2]);
- tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me,NPC_BLESSED_BANNER,100));
+ tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100));
}
- if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE,Mason2Pos[0]))
+ if (Creature* tempsum = DoSummon(NPC_SCOURGE_DRUDGE, Mason2Pos[0]))
{
tempsum->SetHomePosition(DalforsPos[2]);
- tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me,NPC_BLESSED_BANNER,100));
+ tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100));
}
- if (Creature* tempsum = DoSummon(NPC_HALOF_THE_DEATHBRINGER,DalforsPos[0]))
+ if (Creature* tempsum = DoSummon(NPC_HALOF_THE_DEATHBRINGER, DalforsPos[0]))
{
HalofSpawned = true;
guidHalof = tempsum->GetGUID();
tempsum->SetHomePosition(DalforsPos[2]);
- tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me,NPC_BLESSED_BANNER,100));
+ tempsum->AI()->AttackStart(GetClosestCreatureWithEntry(me, NPC_BLESSED_BANNER, 100));
}
}
break;
@@ -845,17 +855,17 @@ public:
}
if (PhaseCount == 8)
- if (Creature* Halof = me->GetCreature(*me,guidHalof))
+ if (Creature* Halof = me->GetCreature(*me, guidHalof))
if (Halof->isDead())
{
- DoCast(me,SPELL_CRUSADERS_SPIRE_VICTORY,true);
+ DoCast(me, SPELL_CRUSADERS_SPIRE_VICTORY, true);
Summons.DespawnEntry(NPC_HIDEOUS_PLAGEBRINGER);
Summons.DespawnEntry(NPC_REANIMATED_CAPTAIN);
Summons.DespawnEntry(NPC_SCOURGE_DRUDGE);
Summons.DespawnEntry(NPC_HALOF_THE_DEATHBRINGER);
- if (Creature* Dalfors = me->GetCreature(*me,guidDalfors))
+ if (Creature* Dalfors = me->GetCreature(*me, guidDalfors))
Dalfors->AI()->Talk(DALFORS_YELL_FINISHED);
- events.ScheduleEvent(EVENT_ENDED,10000);
+ events.ScheduleEvent(EVENT_ENDED, 10000);
}
}
};
@@ -866,6 +876,92 @@ public:
}
};
+/*######
+## Borrowed Technology - Id: 13291, The Solution Solution (daily) - Id: 13292, Volatility - Id: 13239, Volatiliy - Id: 13261 (daily)
+######*/
+
+enum BorrowedTechnologyAndVolatility
+{
+ // Spells
+ SPELL_GRAB = 59318,
+ SPELL_PING_BUNNY = 59375,
+ SPELL_IMMOLATION = 54690,
+ SPELL_EXPLOSION = 59335,
+ SPELL_RIDE = 56687,
+
+ // Points
+ POINT_GRAB_DECOY = 1,
+ POINT_FLY_AWAY = 2,
+
+ // Events
+ EVENT_FLY_AWAY = 1
+};
+
+class npc_frostbrood_skytalon : public CreatureScript
+{
+ public:
+ npc_frostbrood_skytalon() : CreatureScript("npc_frostbrood_skytalon") { }
+
+ struct npc_frostbrood_skytalonAI : public VehicleAI
+ {
+ npc_frostbrood_skytalonAI(Creature* creature) : VehicleAI(creature) { }
+
+ EventMap events;
+
+ void IsSummonedBy(Unit* summoner)
+ {
+ me->GetMotionMaster()->MovePoint(POINT_GRAB_DECOY, summoner->GetPositionX(), summoner->GetPositionY(), summoner->GetPositionZ());
+ }
+
+ void MovementInform(uint32 type, uint32 id)
+ {
+ if (type != POINT_MOTION_TYPE)
+ return;
+
+ if (id == POINT_GRAB_DECOY)
+ if (TempSummon* summon = me->ToTempSummon())
+ if (Unit* summoner = summon->GetSummoner())
+ DoCast(summoner, SPELL_GRAB);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ VehicleAI::UpdateAI(diff);
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ if (eventId == EVENT_FLY_AWAY)
+ {
+ Position randomPosOnRadius;
+ randomPosOnRadius.m_positionZ = (me->GetPositionZ() + 40.0f);
+ me->GetNearPoint2D(randomPosOnRadius.m_positionX, randomPosOnRadius.m_positionY, 40.0f, me->GetAngle(me));
+ me->GetMotionMaster()->MovePoint(POINT_FLY_AWAY, randomPosOnRadius);
+ }
+ }
+ }
+
+ void SpellHit(Unit* /*caster*/, SpellInfo const* spell)
+ {
+ switch (spell->Id)
+ {
+ case SPELL_EXPLOSION:
+ DoCast(me, SPELL_IMMOLATION);
+ break;
+ case SPELL_RIDE:
+ DoCastAOE(SPELL_PING_BUNNY);
+ events.ScheduleEvent(EVENT_FLY_AWAY, 100);
+ break;
+ }
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_frostbrood_skytalonAI(creature);
+ }
+};
+
void AddSC_icecrown()
{
new npc_arete;
@@ -875,4 +971,5 @@ void AddSC_icecrown()
new npc_vereth_the_cunning;
new npc_tournament_training_dummy;
new npc_blessed_banner();
+ new npc_frostbrood_skytalon();
}
diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
index 2aa355084a1..57228595b9b 100644
--- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp
+++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
@@ -321,7 +321,7 @@ public:
Reset();
}
- void UpdateAI(const uint32 /*uiDiff*/)
+ void UpdateAI(uint32 /*uiDiff*/)
{
if (!UpdateVictim())
return;
@@ -420,7 +420,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
@@ -540,13 +540,13 @@ public:
Player* player = Player::GetPlayer(*me, playerGUID);
Creature* orphan = Creature::GetCreature(*me, orphanGUID);
- if(!orphan || !player)
+ if (!orphan || !player)
{
Reset();
return;
}
- switch(phase)
+ switch (phase)
{
case 1:
orphan->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(me->GetOrientation()) * 5, me->GetPositionY() + sin(me->GetOrientation()) * 5, me->GetPositionZ());
@@ -582,7 +582,7 @@ public:
timer -= diff;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (phase)
proceedCwEvent(uiDiff);
@@ -948,7 +948,7 @@ public:
bird->Kill(bird);
crunchy->GetMotionMaster()->MovePoint(0, bird->GetPositionX(), bird->GetPositionY(),
bird->GetMap()->GetWaterOrGroundLevel(bird->GetPositionX(), bird->GetPositionY(), bird->GetPositionZ()));
- // TODO: Make crunchy perform emote eat when he reaches the bird
+ /// @todo Make crunchy perform emote eat when he reaches the bird
break;
}
@@ -1033,6 +1033,102 @@ public:
}
};
+/*######
+## Quest: Reconnaissance Flight (12671)
+######*/
+enum ReconnaissanceFlight
+{
+ NPC_PLANE = 28710, // Vic's Flying Machine
+ NPC_PILOT = 28646,
+
+ VIC_SAY_0 = 0,
+ VIC_SAY_1 = 1,
+ VIC_SAY_2 = 2,
+ VIC_SAY_3 = 3,
+ VIC_SAY_4 = 4,
+ VIC_SAY_5 = 5,
+ VIC_SAY_6 = 6,
+ PLANE_EMOTE = 0,
+
+ AURA_ENGINE = 52255, // Engine on Fire
+
+ SPELL_LAND = 52226, // Land Flying Machine
+ SPELL_CREDIT = 53328 // Land Flying Machine Credit
+};
+
+class npc_vics_flying_machine : public CreatureScript
+{
+public:
+ npc_vics_flying_machine() : CreatureScript("npc_vics_flying_machine") { }
+
+ struct npc_vics_flying_machineAI : public VehicleAI
+ {
+ npc_vics_flying_machineAI(Creature* creature) : VehicleAI(creature) {}
+
+ void PassengerBoarded(Unit* passenger, int8 /*seatId*/, bool apply)
+ {
+ if (apply && passenger->GetTypeId() == TYPEID_PLAYER)
+ me->GetMotionMaster()->MovePath(NPC_PLANE, false);
+ }
+
+ void MovementInform(uint32 type, uint32 id)
+ {
+ if (type != WAYPOINT_MOTION_TYPE)
+ return;
+
+ if (Creature* pilot = GetClosestCreatureWithEntry(me, NPC_PILOT, 10))
+ switch (id)
+ {
+ case 5:
+ pilot->AI()->Talk(VIC_SAY_0);
+ break;
+ case 11:
+ pilot->AI()->Talk(VIC_SAY_1);
+ break;
+ case 12:
+ pilot->AI()->Talk(VIC_SAY_2);
+ break;
+ case 14:
+ pilot->AI()->Talk(VIC_SAY_3);
+ break;
+ case 15:
+ pilot->AI()->Talk(VIC_SAY_4);
+ break;
+ case 17:
+ pilot->AI()->Talk(VIC_SAY_5);
+ break;
+ case 21:
+ pilot->AI()->Talk(VIC_SAY_6);
+ break;
+ case 25:
+ me->AI()->Talk(PLANE_EMOTE);
+ me->AI()->DoCast(AURA_ENGINE);
+ break;
+ }
+ }
+
+ void SpellHit(Unit* /*caster*/, SpellInfo const* spell)
+ {
+ if (spell->Id == SPELL_LAND)
+ {
+ Unit* passenger = me->GetVehicleKit()->GetPassenger(1); // player should be on seat 1
+ if (passenger && passenger->GetTypeId() == TYPEID_PLAYER)
+ {
+ passenger->CastSpell(passenger, SPELL_CREDIT, true);
+ passenger->ExitVehicle();
+ }
+ }
+ }
+
+ void UpdateAI(uint32 /*diff*/) {}
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_vics_flying_machineAI(creature);
+ }
+};
+
void AddSC_sholazar_basin()
{
new npc_injured_rainspeaker_oracle();
@@ -1045,4 +1141,5 @@ void AddSC_sholazar_basin()
new spell_q12620_the_lifewarden_wrath();
new spell_q12589_shoot_rjr();
new npc_haiphoon();
+ new npc_vics_flying_machine();
}
diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp
index 85ab1dc1127..ba725d2dda4 100644
--- a/src/server/scripts/Northrend/zone_storm_peaks.cpp
+++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp
@@ -186,7 +186,7 @@ public:
player->FailQuest(QUEST_BITTER_DEPARTURE);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
if (!UpdateVictim())
@@ -318,7 +318,7 @@ public:
Reset();
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!freed)
return;
@@ -356,34 +356,20 @@ public:
enum FreedProtoDrake
{
+ NPC_DRAKE = 29709,
+
AREA_VALLEY_OF_ANCIENT_WINTERS = 4437,
+
TEXT_EMOTE = 0,
+
SPELL_KILL_CREDIT_PRISONER = 55144,
SPELL_SUMMON_LIBERATED = 55073,
- SPELL_KILL_CREDIT_DRAKE = 55143
-};
+ SPELL_KILL_CREDIT_DRAKE = 55143,
-const Position FreedDrakeWaypoints[16] =
-{
- {7294.96f, -2418.733f, 823.869f, 0.0f},
- {7315.984f, -2331.46f, 826.3972f, 0.0f},
- {7271.826f, -2271.479f, 833.5917f, 0.0f},
- {7186.253f, -2218.475f, 847.5632f, 0.0f},
- {7113.195f, -2164.288f, 850.2301f, 0.0f},
- {7078.018f, -2063.106f, 854.7581f, 0.0f},
- {7073.221f, -1983.382f, 861.9246f, 0.0f},
- {7061.455f, -1885.899f, 865.119f, 0.0f},
- {7033.32f, -1826.775f, 876.2578f, 0.0f},
- {6999.902f, -1784.012f, 897.4521f, 0.0f},
- {6954.913f, -1747.043f, 897.4521f, 0.0f},
- {6933.856f, -1720.698f, 882.2022f, 0.0f},
- {6932.729f, -1687.306f, 866.1189f, 0.0f},
- {6952.458f, -1663.802f, 849.8133f, 0.0f},
- {7002.819f, -1651.681f, 831.397f, 0.0f},
- {7026.531f, -1649.239f, 828.8406f, 0.0f}
+ EVENT_CHECK_AREA = 1,
+ EVENT_REACHED_HOME = 2,
};
-
class npc_freed_protodrake : public CreatureScript
{
public:
@@ -393,74 +379,60 @@ public:
{
npc_freed_protodrakeAI(Creature* creature) : VehicleAI(creature) {}
- bool autoMove;
- bool wpReached;
- uint16 CheckTimer;
- uint16 countWP;
+ EventMap events;
void Reset()
{
- autoMove = false;
- wpReached = false;
- CheckTimer = 5000;
- countWP = 0;
+ events.ScheduleEvent(EVENT_CHECK_AREA, 5000);
}
void MovementInform(uint32 type, uint32 id)
{
- if (type != POINT_MOTION_TYPE)
+ if (type != WAYPOINT_MOTION_TYPE)
return;
- if (id < 15)
- {
- ++countWP;
- wpReached = true;
- }
- else
+ if (id == 15)
// drake reached village
- {
- // get player that rides drake (from seat 0)
- Unit* player = me->GetVehicleKit()->GetPassenger(0);
- if (player && player->GetTypeId() == TYPEID_PLAYER)
- {
- // for each prisoner on drake,give credit
- for (uint8 i = 1; i < 4; ++i)
- if (Unit* prisoner = me->GetVehicleKit()->GetPassenger(i))
- {
- if (prisoner->GetTypeId() != TYPEID_UNIT)
- return;
- prisoner->CastSpell(player, SPELL_KILL_CREDIT_PRISONER, true);
- prisoner->CastSpell(prisoner, SPELL_SUMMON_LIBERATED, true);
- prisoner->ExitVehicle();
- }
- me->CastSpell(me, SPELL_KILL_CREDIT_DRAKE, true);
- player->ExitVehicle();
- }
- }
+ events.ScheduleEvent(EVENT_REACHED_HOME, 2000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
- if (!autoMove)
+ events.Update(diff);
+
+ switch (events.ExecuteEvent())
{
- if (CheckTimer < diff)
- {
- CheckTimer = 5000;
+ case EVENT_CHECK_AREA:
if (me->GetAreaId() == AREA_VALLEY_OF_ANCIENT_WINTERS)
{
- Talk(TEXT_EMOTE, me->GetVehicleKit()->GetPassenger(0)->GetGUID());
- autoMove = true;
- wpReached = true;
+ if (Vehicle* vehicle = me->GetVehicleKit())
+ if (Unit* passenger = vehicle->GetPassenger(0))
+ {
+ Talk(TEXT_EMOTE, passenger->GetGUID());
+ me->GetMotionMaster()->MovePath(NPC_DRAKE, false);
+ }
}
- }
- else
- CheckTimer -= diff;
- }
-
- if (wpReached && autoMove)
- {
- wpReached = false;
- me->GetMotionMaster()->MovePoint(countWP, FreedDrakeWaypoints[countWP]);
+ else
+ events.ScheduleEvent(EVENT_CHECK_AREA, 5000);
+ break;
+ case EVENT_REACHED_HOME:
+ Unit* player = me->GetVehicleKit()->GetPassenger(0);
+ if (player && player->GetTypeId() == TYPEID_PLAYER)
+ {
+ // for each prisoner on drake, give credit
+ for (uint8 i = 1; i < 4; ++i)
+ if (Unit* prisoner = me->GetVehicleKit()->GetPassenger(i))
+ {
+ if (prisoner->GetTypeId() != TYPEID_UNIT)
+ return;
+ prisoner->CastSpell(player, SPELL_KILL_CREDIT_PRISONER, true);
+ prisoner->CastSpell(prisoner, SPELL_SUMMON_LIBERATED, true);
+ prisoner->ExitVehicle();
+ }
+ me->CastSpell(me, SPELL_KILL_CREDIT_DRAKE, true);
+ player->ExitVehicle();
+ }
+ break;
}
}
};
@@ -505,7 +477,7 @@ public:
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
npc_escortAI::UpdateAI(diff);
@@ -544,7 +516,7 @@ class npc_hyldsmeet_protodrake : public CreatureScript
_accessoryRespawnTimer = 5 * MINUTE * IN_MILLISECONDS;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
//! We need to manually reinstall accessories because the vehicle itself is friendly to players,
//! so EnterEvadeMode is never triggered. The accessory on the other hand is hostile and killable.
diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp
index 8935c77b30e..ce0eaefac90 100644
--- a/src/server/scripts/Northrend/zone_wintergrasp.cpp
+++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp
@@ -224,7 +224,7 @@ class npc_wg_spirit_guide : public CreatureScript
{
npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature) { }
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!me->HasUnitState(UNIT_STATE_CASTING))
DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL);
@@ -271,7 +271,7 @@ class npc_wg_queue : public CreatureScript
return true;
}
- bool OnGossipSelect(Player* player, Creature* /*creature*/ , uint32 /*sender*/ , uint32 /*action*/)
+ bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 /*action*/)
{
player->CLOSE_GOSSIP_MENU();
diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp
index 69e8d900435..33a573b9b35 100644
--- a/src/server/scripts/Northrend/zone_zuldrak.cpp
+++ b/src/server/scripts/Northrend/zone_zuldrak.cpp
@@ -170,7 +170,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (UpdateVictim())
{
@@ -409,7 +409,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
ScriptedAI::UpdateAI(uiDiff);
@@ -636,7 +636,7 @@ public:
DoCast(who, SPELL_IMPALE);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
@@ -761,7 +761,7 @@ public:
DoCast(me, SPELL_GROW);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
@@ -832,7 +832,7 @@ public:
uiCorrodeFleshTimer = 6000;
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
@@ -950,7 +950,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
@@ -1099,7 +1099,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
@@ -1213,7 +1213,7 @@ public:
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (!UpdateVictim())
return;
@@ -1309,7 +1309,7 @@ public:
m_heading = me->GetOrientation();
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (m_uiPhase)
{
diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h
index 04555c671bb..637f86591d4 100644
--- a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h
@@ -20,7 +20,7 @@
#include "OutdoorPvP.h"
-// TODO: "sometimes" set to neutral
+/// @todo "sometimes" set to neutral
enum OutdoorPvPNASpells
{
diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h
index bab537682ad..60dce43bc42 100644
--- a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h
@@ -267,5 +267,5 @@ class OutdoorPvPZM : public OutdoorPvP
uint32 m_HordeTowersControlled;
};
-// todo: flag carrier death/leave/mount/activitychange should give back the gossip options
+/// @todo flag carrier death/leave/mount/activitychange should give back the gossip options
#endif
diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp
index 040ca012902..0fb49dfc284 100644
--- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp
+++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp
@@ -72,7 +72,7 @@ public:
myClass = myclass;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -234,7 +234,7 @@ public:
me->SummonCreature(19412, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 600000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -322,7 +322,7 @@ public:
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp
index 7509f6331f7..00ec9b9fe4a 100644
--- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp
+++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp
@@ -94,7 +94,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Inhibitmagic_Timer
if (Inhibitmagic_Timer <= diff)
@@ -185,7 +185,7 @@ public:
void EnterCombat(Unit* /*who*/)
{ }
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp
index 7e1fa41c6da..f26760a82b7 100644
--- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp
@@ -149,7 +149,7 @@ public:
summons.DespawnAll();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -269,7 +269,7 @@ public:
summoned->AI()->AttackStart(me->getVictim());
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -335,7 +335,7 @@ public:
isFireboltTurn = true;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp
index c8bd6dbb069..e4d8d959941 100644
--- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp
@@ -82,7 +82,7 @@ public:
Talk(SAY_AGGRO);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp
index 1a53a140f28..371c94035ac 100644
--- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp
@@ -127,7 +127,7 @@ public:
DoCast(me, SPELL_SUMMON_SYTH_SHADOW, true); //right
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -220,7 +220,7 @@ public:
void EnterCombat(Unit* /*who*/) { }
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -279,7 +279,7 @@ public:
void EnterCombat(Unit* /*who*/) { }
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -333,7 +333,7 @@ public:
void EnterCombat(Unit* /*who*/) { }
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -388,7 +388,7 @@ public:
void EnterCombat(Unit* /*who*/) { }
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp
index 8a872039e37..4a9a98abcde 100644
--- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp
@@ -127,7 +127,7 @@ public:
Talk(SAY_SLAY);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp
index b9163c13413..cd7f8e120de 100644
--- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp
@@ -142,7 +142,7 @@ public:
instance->SetData(TYPE_HELLMAW, DONE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!Intro && !HasEscortState(STATE_ESCORT_ESCORTING))
{
diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp
index 4ae2d59799a..0c0bae17c5d 100644
--- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp
@@ -106,7 +106,7 @@ public:
instance->SetData(DATA_BLACKHEARTTHEINCITEREVENT, IN_PROGRESS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp
index 80eb7c03819..a067bbf92a0 100644
--- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp
@@ -93,7 +93,7 @@ public:
void EnterCombat(Unit* /*who*/){}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!VorpilGUID)
{
@@ -264,7 +264,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
index fbe62e2a003..e09371bca13 100644
--- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
@@ -111,7 +111,7 @@ public:
me->DealDamage(target, (target->GetHealth()*90)/100, NULL, SPELL_DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NATURE, spell);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target or casting
if (!UpdateVictim() || me->IsNonMeleeSpellCasted(false))
diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.cpp b/src/server/scripts/Outland/BlackTemple/black_temple.cpp
index ae0a17e1a8c..f8467b297cc 100644
--- a/src/server/scripts/Outland/BlackTemple/black_temple.cpp
+++ b/src/server/scripts/Outland/BlackTemple/black_temple.cpp
@@ -19,7 +19,7 @@
/* ScriptData
SDName: Black_Temple
SD%Complete: 95
-SDComment: Spirit of Olum: Player Teleporter to Seer Kanai Teleport after defeating Naj'entus and Supremus. TODO: Find proper gossip.
+SDComment: Spirit of Olum: Player Teleporter to Seer Kanai Teleport after defeating Naj'entus and Supremus. @todo Find proper gossip.
SDCategory: Black Temple
EndScriptData */
diff --git a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp
index 3a56a0bfed2..5a292d165cc 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp
@@ -187,9 +187,7 @@ public:
void RevertThreatOnTarget(uint64 guid)
{
- Unit* unit = NULL;
- unit = Unit::GetUnit(*me, guid);
- if (unit)
+ if (Unit* unit = Unit::GetUnit(*me, guid))
{
if (DoGetThreat(unit))
DoModifyThreatPercent(unit, -100);
@@ -198,7 +196,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -279,8 +277,7 @@ public:
{
if (Phase1)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target && target->isAlive())
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
{
Phase1 = false;
@@ -308,7 +305,8 @@ public:
AcidGeyserTimer = 1000;
PhaseChangeTimer = 30000;
}
- } else // Encounter is a loop pretty much. Phase 1 -> Phase 2 -> Phase 1 -> Phase 2 till death or enrage
+ }
+ else // Encounter is a loop pretty much. Phase 1 -> Phase 2 -> Phase 1 -> Phase 2 till death or enrage
{
if (TargetGUID)
RevertThreatOnTarget(TargetGUID);
diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
index b8003761cc7..e990a6f6825 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
@@ -422,8 +422,7 @@ public:
Glaive->InterruptNonMeleeSpells(true);
DoCast(me, SPELL_FLAME_ENRAGE, true);
DoResetThreat();
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target && target->isAlive())
+ if (SelectTarget(SELECT_TARGET_RANDOM, 0))
{
me->AddThreat(me->getVictim(), 5000000.0f);
AttackStart(me->getVictim());
@@ -442,7 +441,7 @@ public:
GlaiveGUID = guid;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -578,7 +577,7 @@ public:
if (victim == me)
return;
- // TODO: Find better way to handle emote
+ /// @todo Find better way to handle emote
switch (urand(0, 1))
{
case 0:
@@ -957,7 +956,7 @@ public:
++TransformCount;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if ((!UpdateVictim()) && Phase < PHASE_TALK_SEQUENCE)
return;
@@ -1231,7 +1230,7 @@ public:
ScriptedAI::AttackStart(who);
}
- void DoAction(const int32 param)
+ void DoAction(int32 param)
{
if (param > PHASE_ILLIDAN_NULL && param < PHASE_ILLIDAN_MAX)
EnterPhase(PhaseIllidan(param));
@@ -1303,7 +1302,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if ((!UpdateVictim())
&& !Timer[EVENT_MAIEV_STEALTH])
@@ -1733,7 +1732,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!me->IsVisible())
{
@@ -2079,7 +2078,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (DespawnTimer)
{
@@ -2092,7 +2091,7 @@ public:
// {
// if (Unit* Illidan = Unit::GetUnit(*me, IllidanGUID)
// {
- // // TODO: Find proper spells and properly apply 'caged' Illidan effect
+ // /// @todo Find proper spells and properly apply 'caged' Illidan effect
// }
// }
}
@@ -2150,7 +2149,7 @@ public:
target->RemoveAurasDueToSpell(SPELL_PARALYZE);
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!UpdateVictim())
return;
@@ -2248,7 +2247,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!me->getVictim())
{
diff --git a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp
index 11569c30f1e..dc56f7abe07 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp
@@ -45,7 +45,7 @@ enum MotherShahraz
SPELL_ATTRACTION = 40871,
SPELL_SILENCING_SHRIEK = 40823,
SPELL_ENRAGE = 23537,
- SPELL_SABER_LASH = 40810,//43267
+ SPELL_SABER_LASH = 40810, //43267
SPELL_SABER_LASH_IMM = 43690,
SPELL_TELEPORT_VISUAL = 40869,
SPELL_BERSERK = 45078
@@ -174,7 +174,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp
index f9c46aa3f77..a6432114ded 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp
@@ -248,7 +248,7 @@ public:
instance->SetData(DATA_RELIQUARYOFSOULSEVENT, DONE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!Phase)
return;
@@ -469,7 +469,7 @@ public:
me->AddThreat(target, 1000000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (me->isInCombat())
{
@@ -574,7 +574,7 @@ public:
Talk(DESI_SAY_SLAY);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -665,7 +665,7 @@ public:
Talk(ANGER_SAY_SLAY);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
index fe5af2a689e..9860cf0385a 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
@@ -139,7 +139,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
void AttackStart(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 /*diff*/) {}
+ void UpdateAI(uint32 /*diff*/) {}
};
};
@@ -175,7 +175,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
void AttackStart(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (StartBanishing)
return;
@@ -423,7 +423,7 @@ public:
void SetAkamaGUID(uint64 guid) { AkamaGUID = guid; }
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!me->isInCombat())
return;
@@ -725,7 +725,7 @@ public:
summons.DespawnAll();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!EventBegun)
return;
diff --git a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp
index 6bc6633e49e..114f83661b3 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp
@@ -203,7 +203,7 @@ public:
return target;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -272,9 +272,12 @@ public:
return new npc_volcanoAI (creature);
}
- struct npc_volcanoAI : public Scripted_NoMovementAI
+ struct npc_volcanoAI : public ScriptedAI
{
- npc_volcanoAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ npc_volcanoAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
void Reset()
{
@@ -290,12 +293,12 @@ public:
void MoveInLineOfSight(Unit* /*who*/) {}
- void DoAction(const int32 /*info*/)
+ void DoAction(int32 /*info*/)
{
me->RemoveAura(SPELL_VOLCANIC_ERUPTION);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (wait <= diff)//wait 3secs before casting
{
diff --git a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp
index 6c28b058cf7..5eb9ffcabc8 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp
@@ -86,7 +86,7 @@ public:
me->RemoveCorpse();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (CheckTeronTimer <= diff)
{
@@ -188,7 +188,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (CheckPlayerTimer <= diff)
{
@@ -378,7 +378,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (Intro && !Done)
{
@@ -468,8 +468,7 @@ public:
if (CrushingShadowsTimer <= diff)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target && target->isAlive())
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_CRUSHING_SHADOWS);
CrushingShadowsTimer = urand(10, 26) * 1000;
} else CrushingShadowsTimer -= diff;
diff --git a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
index 7a56734bc3b..127ca68ce39 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
@@ -146,7 +146,7 @@ public:
events.RescheduleEvent(EVENT_SHIELD, 60000 + inc);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp
index 03fa5235d18..d63e8ee20b0 100644
--- a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp
+++ b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp
@@ -169,7 +169,7 @@ public:
void AttackStart(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!EventStarted)
return;
@@ -315,7 +315,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!EventBegun)
return;
@@ -536,7 +536,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -641,7 +641,7 @@ public:
Talk(SAY_ZERE_DEATH);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -741,7 +741,7 @@ public:
Talk(SAY_MALA_DEATH);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -827,7 +827,7 @@ public:
Talk(SAY_VERA_DEATH);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp
index d9ad35f9552..b9df26d11c6 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp
@@ -222,14 +222,12 @@ public:
StartEvent(who);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Only if not incombat check if the event is started
if (!me->isInCombat() && instance && instance->GetData(DATA_KARATHRESSEVENT))
{
- Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER));
-
- if (target)
+ if (Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER)))
{
AttackStart(target);
GetAdvisors();
@@ -360,12 +358,8 @@ public:
{
if (instance)
{
- Creature* Karathress = NULL;
- Karathress = (Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS)));
-
- if (Karathress)
- if (!me->isAlive() && Karathress)
- CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventSharkkisDeath();
+ if (Creature* Karathress = (Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS))))
+ CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventSharkkisDeath();
}
}
@@ -378,17 +372,13 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Only if not incombat check if the event is started
if (!me->isInCombat() && instance && instance->GetData(DATA_KARATHRESSEVENT))
{
- Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER));
-
- if (target)
- {
+ if (Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER)))
AttackStart(target);
- }
}
//Return since we have no target
@@ -445,12 +435,13 @@ public:
pet_id = CREATURE_FATHOM_SPOREBAT;
}
//DoCast(me, spell_id, true);
- Creature* Pet = DoSpawnCreature(pet_id, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (Pet && target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
{
- Pet->AI()->AttackStart(target);
- SummonedPet = Pet->GetGUID();
+ if (Creature* Pet = DoSpawnCreature(pet_id, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000))
+ {
+ Pet->AI()->AttackStart(target);
+ SummonedPet = Pet->GetGUID();
+ }
}
} else Pet_Timer -= diff;
@@ -500,12 +491,8 @@ public:
{
if (instance)
{
- Creature* Karathress = NULL;
- Karathress = (Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS)));
-
- if (Karathress)
- if (!me->isAlive() && Karathress)
- CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventTidalvessDeath();
+ if (Creature* Karathress = Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS)))
+ CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventTidalvessDeath();
}
}
@@ -519,17 +506,13 @@ public:
DoCast(me, SPELL_WINDFURY_WEAPON);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Only if not incombat check if the event is started
if (!me->isInCombat() && instance && instance->GetData(DATA_KARATHRESSEVENT))
{
- Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER));
-
- if (target)
- {
+ if (Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER)))
AttackStart(target);
- }
}
//Return since we have no target
@@ -627,12 +610,8 @@ public:
{
if (instance)
{
- Creature* Karathress = NULL;
- Karathress = (Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS)));
-
- if (Karathress)
- if (!me->isAlive() && Karathress)
- CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventCaribdisDeath();
+ if (Creature* Karathress = Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS)))
+ CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventCaribdisDeath();
}
}
@@ -645,17 +624,13 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Only if not incombat check if the event is started
if (!me->isInCombat() && instance && instance->GetData(DATA_KARATHRESSEVENT))
{
- Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER));
-
- if (target)
- {
+ if (Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER)))
AttackStart(target);
- }
}
//Return since we have no target
@@ -697,11 +672,8 @@ public:
Cyclone->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Cyclone->setFaction(me->getFaction());
Cyclone->CastSpell(Cyclone, SPELL_CYCLONE_CYCLONE, true);
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
- {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
Cyclone->AI()->AttackStart(target);
- }
}
} else Cyclone_Timer -= diff;
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
index b31292c4b00..2f0d736d8ef 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
@@ -212,7 +212,7 @@ public:
Summons.DespawnAll();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!beam)
{
@@ -272,8 +272,7 @@ public:
//VileSludge_Timer
if (VileSludge_Timer <= diff)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_VILE_SLUDGE);
VileSludge_Timer = 15000;
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
index b0717d29228..19b57509093 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
@@ -310,7 +310,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!CanAttack && Intro)
{
@@ -599,7 +599,7 @@ public:
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!instance)
return;
@@ -677,7 +677,7 @@ public:
me->AddThreat(who, 0.1f);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
// PoisonBoltTimer
if (PoisonBoltTimer <= diff)
@@ -754,7 +754,7 @@ public:
MovementTimer = 0;
}
- void UpdateAI (const uint32 diff)
+ void UpdateAI(uint32 diff)
{
// Random movement
if (MovementTimer <= diff)
@@ -834,7 +834,7 @@ public:
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI (const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!instance)
return;
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp
index 2c8d067a865..f4e0c6cee2a 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp
@@ -132,7 +132,7 @@ public:
return;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -316,7 +316,7 @@ public:
me->SetDisplayId(MODEL_NIGHTELF);
// and reseting equipment
- me->LoadEquipment(me->GetEquipmentId());
+ me->LoadEquipment();
if (instance && instance->GetData64(DATA_LEOTHERAS_EVENT_STARTER))
{
@@ -410,10 +410,10 @@ public:
if (me->HasAura(AURA_BANISH))
return;
- me->LoadEquipment(me->GetEquipmentId());
+ me->LoadEquipment();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (me->HasAura(AURA_BANISH) || !UpdateVictim())
@@ -558,7 +558,7 @@ public:
{
//switch to nightelf form
me->SetDisplayId(MODEL_NIGHTELF);
- me->LoadEquipment(me->GetEquipmentId());
+ me->LoadEquipment();
CastConsumingMadness();
DespawnDemon();
@@ -589,7 +589,7 @@ public:
Talk(SAY_FINAL_FORM);
me->SetDisplayId(MODEL_NIGHTELF);
- me->LoadEquipment(me->GetEquipmentId());
+ me->LoadEquipment();
}
}
};
@@ -643,7 +643,7 @@ public:
StartEvent();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -737,7 +737,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (instance)
{
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
index 788de7753ff..18324822c4a 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
@@ -78,10 +78,11 @@ public:
return new boss_the_lurker_belowAI (creature);
}
- struct boss_the_lurker_belowAI : public Scripted_NoMovementAI
+ struct boss_the_lurker_belowAI : public ScriptedAI
{
- boss_the_lurker_belowAI(Creature* creature) : Scripted_NoMovementAI(creature), Summons(me)
+ boss_the_lurker_belowAI(Creature* creature) : ScriptedAI(creature), Summons(me)
{
+ SetCombatMovement(false);
instance = creature->GetInstanceScript();
}
@@ -152,11 +153,10 @@ public:
Summons.DespawnAll();
}
- void EnterCombat(Unit* who)
+ void EnterCombat(Unit* /*who*/)
{
if (instance)
instance->SetData(DATA_THELURKERBELOWEVENT, IN_PROGRESS);
- Scripted_NoMovementAI::EnterCombat(who);
}
void MoveInLineOfSight(Unit* who)
@@ -177,7 +177,7 @@ public:
me->SetReactState(REACT_AGGRESSIVE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!CanStartEvent) // boss is invisible, don't attack
{
@@ -368,10 +368,11 @@ public:
return new mob_coilfang_ambusherAI (creature);
}
- struct mob_coilfang_ambusherAI : public Scripted_NoMovementAI
+ struct mob_coilfang_ambusherAI : public ScriptedAI
{
- mob_coilfang_ambusherAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ mob_coilfang_ambusherAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
}
uint32 MultiShotTimer;
@@ -392,7 +393,7 @@ public:
AttackStart(who);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (MultiShotTimer <= diff)
{
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp
index 9476bb28f8e..592746742f5 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp
@@ -163,7 +163,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
@@ -184,10 +184,9 @@ public:
for (uint8 i = 0; i < 10; ++i)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- Creature* Murloc = me->SummonCreature(NPC_TIDEWALKER_LURKER, MurlocCords[i][0], MurlocCords[i][1], MurlocCords[i][2], MurlocCords[i][3], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (target && Murloc)
- Murloc->AI()->AttackStart(target);
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ if (Creature* Murloc = me->SummonCreature(NPC_TIDEWALKER_LURKER, MurlocCords[i][0], MurlocCords[i][1], MurlocCords[i][2], MurlocCords[i][3], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000))
+ Murloc->AI()->AttackStart(target);
}
Talk(EMOTE_EARTHQUAKE);
Earthquake = false;
@@ -321,7 +320,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp
index f2ed2560bbf..c9d394f6f2d 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp
@@ -101,7 +101,7 @@ public:
instance->SetData(TYPE_HYDROMANCER_THESPIA, IN_PROGRESS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -170,7 +170,7 @@ public:
void EnterCombat(Unit* /*who*/) { }
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp
index 3897f370b0c..12e4e3a496f 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp
@@ -122,7 +122,7 @@ public:
DoSpawnCreature(ENTRY_STREAMRIGGER_MECHANIC, 7, -5, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 240000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -223,7 +223,7 @@ public:
void EnterCombat(Unit* /*who*/) { }
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (Repair_Timer <= diff)
{
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp
index 23b25da91ea..914539b27c9 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp
@@ -167,7 +167,7 @@ public:
instance->SetData(TYPE_WARLORD_KALITHRESH, DONE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_hungarfen.cpp b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_hungarfen.cpp
index 9fa5a1a51f5..7e2c13483bd 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_hungarfen.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_hungarfen.cpp
@@ -26,8 +26,11 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
-#define SPELL_FOUL_SPORES 31673
-#define SPELL_ACID_GEYSER 38739
+enum Spells
+{
+ SPELL_FOUL_SPORES = 31673,
+ SPELL_ACID_GEYSER = 38739
+};
class boss_hungarfen : public CreatureScript
{
@@ -60,7 +63,7 @@ public:
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -135,7 +138,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (Stop)
return;
diff --git a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp
index 1e8fd8b2676..22f406c6c5b 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp
@@ -102,7 +102,7 @@ public:
strider->DisappearAndDie();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp
index 0a5c8b0c8b6..6c3e21aa5c0 100644
--- a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp
+++ b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp
@@ -142,7 +142,7 @@ public:
//this part should be in the core
if (pSpell->Id == SPELL_SHATTER)
{
- // todo: use eventmap to kill this stuff
+ /// @todo use eventmap to kill this stuff
//clear this, if we are still performing
if (m_bPerformingGroundSlam)
{
@@ -158,7 +158,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
index 83596c46936..3018c18383e 100644
--- a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
+++ b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
@@ -217,7 +217,7 @@ public:
DoZoneInCombat();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Only if not incombat check if the event is started
if (!me->isInCombat() && instance && instance->GetData(DATA_MAULGAREVENT))
@@ -377,7 +377,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Only if not incombat check if the event is started
if (!me->isInCombat() && instance && instance->GetData(DATA_MAULGAREVENT))
@@ -492,7 +492,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Only if not incombat check if the event is started
if (!me->isInCombat() && instance && instance->GetData(DATA_MAULGAREVENT))
@@ -519,8 +519,7 @@ public:
//GreaterPolymorph_Timer
if (GreaterPolymorph_Timer <= diff)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_GREATER_POLYMORPH);
GreaterPolymorph_Timer = urand(15000, 20000);
@@ -612,7 +611,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Only if not incombat check if the event is started
if (!me->isInCombat() && instance && instance->GetData(DATA_MAULGAREVENT))
@@ -722,7 +721,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Only if not incombat check if the event is started
if (!me->isInCombat() && instance && instance->GetData(DATA_MAULGAREVENT))
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
index 6d3ec669cd5..0e584686f9b 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
@@ -84,7 +84,7 @@ class boss_broggok : public CreatureScript
summoned->CastSpell(summoned, SPELL_POISON, false, 0, 0, me->GetGUID());
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -127,7 +127,7 @@ class boss_broggok : public CreatureScript
}
}
- void DoAction(int32 const action)
+ void DoAction(int32 action)
{
switch (action)
{
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp
index 7d8885ae0ae..d2096140ff4 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp
@@ -201,7 +201,7 @@ class boss_kelidan_the_breaker : public CreatureScript
instance->HandleGameObject(instance->GetData64(DATA_DOOR6), true);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
{
@@ -330,7 +330,7 @@ class mob_shadowmoon_channeler : public CreatureScript
CAST_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerDied(killer);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
{
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp
index bab49b95974..8014ee9f8e0 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp
@@ -105,7 +105,7 @@ class boss_the_maker : public CreatureScript
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
index 4eaf7cc2d6c..be51b7922a2 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
@@ -375,23 +375,23 @@ class instance_blood_furnace : public InstanceMapScript
switch (id)
{
case DATA_PRISON_CELL5:
- HandleGameObject(PrisonCell5GUID,true);
+ HandleGameObject(PrisonCell5GUID, true);
ActivatePrisoners(PrisonersCell5);
break;
case DATA_PRISON_CELL6:
- HandleGameObject(PrisonCell6GUID,true);
+ HandleGameObject(PrisonCell6GUID, true);
ActivatePrisoners(PrisonersCell6);
break;
case DATA_PRISON_CELL7:
- HandleGameObject(PrisonCell7GUID,true);
+ HandleGameObject(PrisonCell7GUID, true);
ActivatePrisoners(PrisonersCell7);
break;
case DATA_PRISON_CELL8:
- HandleGameObject(PrisonCell8GUID,true);
+ HandleGameObject(PrisonCell8GUID, true);
ActivatePrisoners(PrisonersCell8);
break;
case DATA_DOOR5:
- HandleGameObject(Door5GUID,true);
+ HandleGameObject(Door5GUID, true);
if (Creature* broggok = instance->GetCreature(BroggokGUID))
broggok->AI()->DoAction(ACTION_ACTIVATE_BROGGOK);
break;
diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp
index b83307d8dcc..0c5325f7172 100644
--- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp
@@ -118,7 +118,7 @@ class boss_omor_the_unscarred : public CreatureScript
Talk(SAY_DIE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
index 30a2813b286..e820e22d65a 100644
--- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
@@ -124,7 +124,7 @@ class boss_nazan : public CreatureScript
me->SummonCreature(ENTRY_LIQUID_FIRE, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 30000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -243,7 +243,7 @@ class boss_vazruden : public CreatureScript
Talk(SAY_DIE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
{
@@ -396,7 +396,7 @@ class boss_vazruden_the_herald : public CreatureScript
sentryDown = true;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
switch (phase)
{
@@ -487,7 +487,7 @@ class mob_hellfire_sentry : public CreatureScript
CAST_AI(boss_vazruden_the_herald::boss_vazruden_the_heraldAI, herald->AI())->SentryDownBy(killer);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
index 7aae6cebff9..8961c94ab31 100644
--- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
@@ -112,7 +112,7 @@ class boss_watchkeeper_gargolmar : public CreatureScript
Talk(SAY_DIE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp
index aeec7d14b26..777f24f779b 100644
--- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp
@@ -151,7 +151,7 @@ class mob_abyssal : public CreatureScript
ScriptedAI::MoveInLineOfSight(who);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (trigger)
{
@@ -339,7 +339,7 @@ class boss_magtheridon : public CreatureScript
Talk(SAY_FREED);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!me->isInCombat())
{
@@ -528,7 +528,7 @@ class mob_hellfire_channeler : public CreatureScript
instance->SetData(DATA_CHANNELER_EVENT, DONE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp
index 00f0fd8964e..4095f3295fa 100644
--- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp
@@ -138,7 +138,7 @@ class boss_grand_warlock_nethekurse : public CreatureScript
{
Talk(SAY_TAUNT);
- //TODO: kill the peons first
+ /// @todo kill the peons first
IsIntroEvent = false;
PeonEngagedCount = 4;
PeonKilledCount = 4;
@@ -213,7 +213,7 @@ class boss_grand_warlock_nethekurse : public CreatureScript
instance->HandleGameObject(instance->GetData64(DATA_NETHEKURSE_DOOR), true);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (IsIntroEvent)
{
@@ -346,7 +346,7 @@ class mob_fel_orc_convert : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp
index dd23f89dcfb..ac261cc5936 100644
--- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp
@@ -130,7 +130,7 @@ class mob_omrogg_heads : public CreatureScript
DeathYell = true;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!DeathYell)
return;
@@ -312,7 +312,7 @@ class boss_warbringer_omrogg : public CreatureScript
instance->SetData(TYPE_OMROGG, DONE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (Delay_Timer <= diff)
{
diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp
index f437018ac4b..13f47b276ef 100644
--- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp
@@ -194,7 +194,7 @@ class boss_warchief_kargath_bladefist : public CreatureScript
me->SummonCreature(MOB_SHATTERED_ASSASSIN, AssassExit[0], AssassExit[1]-8, AssassExit[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
index f0a823472df..099bd6949cb 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
@@ -212,7 +212,7 @@ class boss_alar : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!me->isInCombat()) // sometimes isincombat but !incombat, faction bug?
return;
@@ -515,7 +515,7 @@ class mob_ember_of_alar : public CreatureScript
}
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!UpdateVictim())
return;
@@ -553,7 +553,7 @@ class mob_flame_patch_alar : public CreatureScript
void EnterCombat(Unit* /*who*/) {}
void AttackStart(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 /*diff*/) {}
+ void UpdateAI(uint32 /*diff*/) {}
};
CreatureAI* GetAI(Creature* creature) const
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp
index 9c4b764fd2a..b8245729d73 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp
@@ -195,7 +195,7 @@ class boss_high_astromancer_solarian : public CreatureScript
return (z*sqrt(radius*radius - (x - CENTER_X)*(x - CENTER_X)) + CENTER_Y);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -245,11 +245,13 @@ class boss_high_astromancer_solarian : public CreatureScript
}
else
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (!me->HasInArc(2.5f, target))
- target = me->getVictim();
- if (target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ {
+ if (!me->HasInArc(2.5f, target))
+ target = me->getVictim();
+
DoCast(target, SPELL_ARCANE_MISSILES);
+ }
}
ArcaneMissiles_Timer = 3000;
}
@@ -441,7 +443,7 @@ class mob_solarium_priest : public CreatureScript
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -518,7 +520,7 @@ class spell_astromancer_wrath_of_the_astromancer : public SpellScriptLoader
return;
Unit* target = GetUnitOwner();
- target->CastSpell(target, GetSpellInfo()->Effects[EFFECT_1].CalcValue(),false);
+ target->CastSpell(target, GetSpellInfo()->Effects[EFFECT_1].CalcValue(), false);
}
void Register()
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp
index 07d563cd762..a6497e6a373 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp
@@ -241,7 +241,7 @@ struct advisorbase_ai : public ScriptedAI
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (DelayRes_Timer)
{
@@ -465,7 +465,7 @@ class boss_kaelthas : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Phase 1
switch (Phase)
@@ -1046,7 +1046,7 @@ class boss_thaladred_the_darkener : public CreatureScript
Talk(SAY_THALADRED_DEATH);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
advisorbase_ai::UpdateAI(diff);
@@ -1138,7 +1138,7 @@ class boss_lord_sanguinar : public CreatureScript
Talk(SAY_SANGUINAR_DEATH);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
advisorbase_ai::UpdateAI(diff);
@@ -1227,7 +1227,7 @@ class boss_grand_astromancer_capernian : public CreatureScript
return;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
advisorbase_ai::UpdateAI(diff);
@@ -1353,7 +1353,7 @@ class boss_master_engineer_telonicus : public CreatureScript
Talk(SAY_TELONICUS_AGGRO);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
advisorbase_ai::UpdateAI(diff);
@@ -1404,9 +1404,12 @@ class mob_kael_flamestrike : public CreatureScript
: CreatureScript("mob_kael_flamestrike")
{
}
- struct mob_kael_flamestrikeAI : public Scripted_NoMovementAI
+ struct mob_kael_flamestrikeAI : public ScriptedAI
{
- mob_kael_flamestrikeAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ mob_kael_flamestrikeAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
uint32 Timer;
bool Casting;
@@ -1426,7 +1429,7 @@ class mob_kael_flamestrike : public CreatureScript
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!Casting)
{
@@ -1487,7 +1490,7 @@ class mob_phoenix_tk : public CreatureScript
me->SummonCreature(NPC_PHOENIX_EGG, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 16000);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1553,7 +1556,7 @@ class mob_phoenix_egg_tk : public CreatureScript
summoned->CastSpell(summoned, SPELL_REBIRTH, false);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!Rebirth_Timer)
return;
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
index 468c9ab1e75..d4526e52543 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
@@ -100,7 +100,7 @@ class boss_void_reaver : public CreatureScript
instance->SetData(DATA_VOIDREAVEREVENT, IN_PROGRESS);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp
index d5e39d09301..fd00b2c5b4e 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp
@@ -62,7 +62,7 @@ class mob_crystalcore_devastator : public CreatureScript
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp
index 3c72c8353aa..2b597be8a9f 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -17,26 +16,112 @@
*/
/* ScriptData
-SDName: Boss_Gatewatcher_Gyrokill
-SD%Complete: 0
-SDComment: Place Holder
+SDName: boss_gatewatcher_gyrokill
+SD%Complete: 99%
+SDComment:
SDCategory: Tempest Keep, The Mechanar
EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "mechanar.h"
-//not used
-#define SAY_AGGRO -1554000
-#define SAY_SAW_ATTACK1 -1554001
-#define SAY_SAW_ATTACK2 -1554002
-#define SAY_SLAY1 -1554003
-#define SAY_SLAY2 -1554004
-#define SAY_DEATH -1554005
+enum Say
+{
+ SAY_AGGRO = 0,
+ SAY_SLAY = 1,
+ SAY_SAW_BLADEs = 2,
+ SAY_DEATH = 3
+};
-#define SPELL_STREAM_OF_MACHINE_FLUID 35311
-#define SPELL_SAW_BLADE 35318
-#define H_SPELL_SAW_BLADE 39192
-#define SPELL_SHADOW_POWER 35322
-#define H_SPELL_SHADOW_POWER 39193
+enum Spells
+{
+ SPELL_STREAM_OF_MACHINE_FLUID = 35311,
+ SPELL_SAW_BLADE = 35318,
+ H_SPELL_SAW_BLADE = 39192,
+ SPELL_SHADOW_POWER = 35322,
+ H_SPELL_SHADOW_POWER = 39193
+};
+enum Events
+{
+ EVENT_STREAM_OF_MACHINE_FLUID = 0,
+ EVENT_SAW_BLADE = 1,
+ EVENT_SHADOW_POWER = 2
+};
+
+class boss_gatewatcher_gyrokill : public CreatureScript
+{
+ public:
+ boss_gatewatcher_gyrokill() : CreatureScript("boss_gatewatcher_gyrokill") {}
+
+ struct boss_gatewatcher_gyrokillAI : public BossAI
+ {
+ boss_gatewatcher_gyrokillAI(Creature* creature) : BossAI(creature, DATA_GATEWATCHER_GYROKILL) {}
+
+ void JustDied(Unit* /*killer*/)
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 10000);
+ events.ScheduleEvent(EVENT_SAW_BLADE, 20000);
+ events.ScheduleEvent(EVENT_SHADOW_POWER, 25000);
+ Talk(SAY_AGGRO);
+ }
+
+ void KilledUnit(Unit* /*victim*/)
+ {
+ Talk(SAY_SLAY);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_STREAM_OF_MACHINE_FLUID:
+ DoCastVictim(SPELL_STREAM_OF_MACHINE_FLUID, true);
+ events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, urand(13000, 17000));
+ break;
+ case EVENT_SAW_BLADE:
+ DoCast(me, SPELL_SAW_BLADE);
+ Talk(SAY_SAW_BLADEs);
+ events.ScheduleEvent(EVENT_SAW_BLADE, urand(20000, 30000));
+ break;
+ case EVENT_SHADOW_POWER:
+ DoCast(me, SPELL_SHADOW_POWER);
+ events.ScheduleEvent(EVENT_SAW_BLADE, urand(25000, 35000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_gatewatcher_gyrokillAI (creature);
+ }
+};
+
+void AddSC_boss_gatewatcher_gyrokill()
+{
+ new boss_gatewatcher_gyrokill();
+}
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp
index 09ff6cf8e49..5e29a8d0c31 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp
@@ -25,8 +25,9 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "mechanar.h"
-enum eSays
+enum Says
{
SAY_AGGRO = 0,
SAY_HAMMER = 1,
@@ -35,111 +36,96 @@ enum eSays
EMOTE_HAMMER = 4
};
-enum eSpells
+enum Spells
{
- // Spells to be casted
SPELL_SHADOW_POWER = 35322,
H_SPELL_SHADOW_POWER = 39193,
SPELL_HAMMER_PUNCH = 35326,
SPELL_JACKHAMMER = 35327,
H_SPELL_JACKHAMMER = 39194,
- SPELL_STREAM_OF_MACHINE_FLUID = 35311,
+ SPELL_STREAM_OF_MACHINE_FLUID = 35311
+};
+
+enum Events
+{
+ EVENT_STREAM_OF_MACHINE_FLUID = 0,
+ EVENT_JACKHAMMER = 1,
+ EVENT_SHADOW_POWER = 2
};
class boss_gatewatcher_iron_hand : public CreatureScript
{
public:
+ boss_gatewatcher_iron_hand(): CreatureScript("boss_gatewatcher_iron_hand") {}
- boss_gatewatcher_iron_hand()
- : CreatureScript("boss_gatewatcher_iron_hand")
+ struct boss_gatewatcher_iron_handAI : public BossAI
{
- }
- // Gatewatcher Iron-Hand AI
- struct boss_gatewatcher_iron_handAI : public ScriptedAI
- {
- boss_gatewatcher_iron_handAI(Creature* creature) : ScriptedAI(creature)
- {
- }
-
- uint32 Shadow_Power_Timer;
- uint32 Jackhammer_Timer;
- uint32 Stream_of_Machine_Fluid_Timer;
-
- void Reset()
- {
- Shadow_Power_Timer = 25000;
- Jackhammer_Timer = 45000;
- Stream_of_Machine_Fluid_Timer = 55000;
+ boss_gatewatcher_iron_handAI(Creature* creature) : BossAI(creature, DATA_GATEWATCHER_IRON_HAND) {}
- }
- void EnterCombat(Unit* /*who*/)
- {
- Talk(SAY_AGGRO);
- }
-
- void KilledUnit(Unit* /*victim*/)
- {
- if (rand()%2)
- return;
+ void EnterCombat(Unit* /*who*/)
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 55000);
+ events.ScheduleEvent(EVENT_JACKHAMMER, 45000);
+ events.ScheduleEvent(EVENT_SHADOW_POWER, 25000);
+ Talk(SAY_AGGRO);
+ }
+ void KilledUnit(Unit* /*victim*/)
+ {
+ if (roll_chance_i(50))
Talk(SAY_SLAY);
- }
-
- void JustDied(Unit* /*killer*/)
- {
- Talk(SAY_DEATH);
- //TODO: Add door check/open code
- }
-
- void UpdateAI(const uint32 diff)
- {
- //Return since we have no target
- if (!UpdateVictim())
- return;
+ }
- //Shadow Power
- if (Shadow_Power_Timer <= diff)
- {
- DoCast(me, SPELL_SHADOW_POWER);
- Shadow_Power_Timer = urand(20000, 28000);
- }
- else
- Shadow_Power_Timer -= diff;
+ void JustDied(Unit* /*killer*/)
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
- //Jack Hammer
- if (Jackhammer_Timer <= diff)
- {
- //TODO: expect cast this about 5 times in a row (?), announce it by emote only once
- Talk(EMOTE_HAMMER);
- DoCast(me->getVictim(), SPELL_JACKHAMMER);
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
- //chance to yell, but not same time as emote (after spell in fact casted)
- if (rand()%2)
- return;
+ events.Update(diff);
- Talk(SAY_HAMMER);
- Jackhammer_Timer = 30000;
- }
- else
- Jackhammer_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- //Stream of Machine Fluid
- if (Stream_of_Machine_Fluid_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- DoCast(me->getVictim(), SPELL_STREAM_OF_MACHINE_FLUID);
- Stream_of_Machine_Fluid_Timer = urand(35000, 50000);
+ case EVENT_STREAM_OF_MACHINE_FLUID:
+ DoCastVictim(SPELL_STREAM_OF_MACHINE_FLUID, true);
+ events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, urand(35000, 50000));
+ break;
+ case EVENT_JACKHAMMER:
+ Talk(EMOTE_HAMMER);
+ /// @todo expect cast this about 5 times in a row (?), announce it by emote only once
+ DoCastVictim(SPELL_JACKHAMMER, true);
+ if (roll_chance_i(50))
+ Talk(SAY_HAMMER);
+ events.ScheduleEvent(EVENT_JACKHAMMER, 30000);
+ break;
+ case EVENT_SHADOW_POWER:
+ DoCast(me, SPELL_SHADOW_POWER);
+ events.ScheduleEvent(EVENT_SHADOW_POWER, urand(20000, 28000));
+ break;
+ default:
+ break;
}
- else
- Stream_of_Machine_Fluid_Timer -= diff;
-
- DoMeleeAttackIfReady();
}
- };
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_gatewatcher_iron_handAI(creature);
+ DoMeleeAttackIfReady();
}
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_gatewatcher_iron_handAI(creature);
+ }
};
void AddSC_boss_gatewatcher_iron_hand()
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp
index f8c44471b30..728b3f715b2 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp
@@ -15,21 +15,144 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-//! TODO - Boss not scripted, just ported required spellscript from core
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
+#include "mechanar.h"
#include "Player.h"
enum Spells
{
+ SPELL_HEADCRACK = 35161,
+ SPELL_REFLECTIVE_MAGIC_SHIELD = 35158,
+ SPELL_REFLECTIVE_DAMAGE_SHIELD = 35159,
+ SPELL_POLARITY_SHIFT = 39096,
+ SPELL_BERSERK = 26662,
+ SPELL_NETHER_CHARGE_TIMER = 37670,
+ SPELL_NETHER_CHARGE_PASSIVE = 37670,
+
SPELL_POSITIVE_POLARITY = 39088,
SPELL_POSITIVE_CHARGE_STACK = 39089,
SPELL_POSITIVE_CHARGE = 39090,
+
SPELL_NEGATIVE_POLARITY = 39091,
SPELL_NEGATIVE_CHARGE_STACK = 39092,
- SPELL_NEGATIVE_CHARGE = 39093,
+ SPELL_NEGATIVE_CHARGE = 39093
+};
+
+enum Yells
+{
+ YELL_AGGRO = 0,
+ YELL_REFLECTIVE_MAGIC_SHIELD = 1,
+ YELL_REFLECTIVE_DAMAGE_SHIELD = 2,
+ YELL_KILL = 3,
+ YELL_DEATH = 4
+};
+
+enum Creatures
+{
+ NPC_NETHER_CHARGE = 20405
+};
+
+enum Events
+{
+ EVENT_NONE = 0,
+
+ EVENT_HEADCRACK = 1,
+ EVENT_REFLECTIVE_DAMAGE_SHIELD = 2,
+ EVENT_REFLECTIVE_MAGIE_SHIELD = 3,
+ EVENT_POSITIVE_SHIFT = 4,
+ EVENT_SUMMON_NETHER_CHARGE = 5,
+ EVENT_BERSERK = 6
+};
+
+class boss_mechano_lord_capacitus : public CreatureScript
+{
+ public:
+ boss_mechano_lord_capacitus() : CreatureScript("boss_mechano_lord_capacitus") { }
+
+ struct boss_mechano_lord_capacitusAI : public BossAI
+ {
+ boss_mechano_lord_capacitusAI(Creature* creature) : BossAI(creature, DATA_MECHANOLORD_CAPACITUS) { }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ _EnterCombat();
+ Talk(YELL_AGGRO);
+ events.ScheduleEvent(EVENT_HEADCRACK, 10 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_REFLECTIVE_DAMAGE_SHIELD, 15 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SUMMON_NETHER_CHARGE, 10 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_BERSERK, 3 * MINUTE * IN_MILLISECONDS);
+
+ if (IsHeroic())
+ events.ScheduleEvent(EVENT_POSITIVE_SHIFT, 15 * IN_MILLISECONDS);
+ }
+
+ void KilledUnit(Unit* /*victim*/)
+ {
+ Talk(YELL_KILL);
+ }
+
+ void JustDied(Unit* /*victim*/)
+ {
+ _JustDied();
+ Talk(YELL_DEATH);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_HEADCRACK:
+ DoCastVictim(SPELL_HEADCRACK);
+ events.ScheduleEvent(EVENT_HEADCRACK, 10 * IN_MILLISECONDS);
+ break;
+ case EVENT_REFLECTIVE_DAMAGE_SHIELD:
+ Talk(YELL_REFLECTIVE_DAMAGE_SHIELD);
+ DoCast(me, SPELL_REFLECTIVE_DAMAGE_SHIELD);
+ events.ScheduleEvent(EVENT_REFLECTIVE_MAGIE_SHIELD, 30 * IN_MILLISECONDS);
+ break;
+ case EVENT_REFLECTIVE_MAGIE_SHIELD:
+ Talk(YELL_REFLECTIVE_MAGIC_SHIELD);
+ DoCast(me, SPELL_REFLECTIVE_MAGIC_SHIELD);
+ events.ScheduleEvent(EVENT_REFLECTIVE_DAMAGE_SHIELD, 30 * IN_MILLISECONDS);
+ break;
+ case EVENT_POSITIVE_SHIFT:
+ DoCastAOE(SPELL_POLARITY_SHIFT);
+ events.ScheduleEvent(EVENT_POSITIVE_SHIFT, urand(45, 60) * IN_MILLISECONDS);
+ break;
+ case EVENT_SUMMON_NETHER_CHARGE:
+ Position pos;
+ me->GetRandomNearPosition(pos, 5.0f);
+ me->SummonCreature(NPC_NETHER_CHARGE, pos, TEMPSUMMON_TIMED_DESPAWN, 18000);
+ events.ScheduleEvent(EVENT_SUMMON_NETHER_CHARGE, 10 * IN_MILLISECONDS);
+ break;
+ case EVENT_BERSERK:
+ DoCast(me, SPELL_BERSERK);
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_mechano_lord_capacitusAI(creature);
+ }
};
class spell_capacitus_polarity_charge : public SpellScriptLoader
@@ -138,6 +261,7 @@ class spell_capacitus_polarity_shift : public SpellScriptLoader
void AddSC_boss_mechano_lord_capacitus()
{
+ new boss_mechano_lord_capacitus();
new spell_capacitus_polarity_charge();
new spell_capacitus_polarity_shift();
}
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp
index 5a9e551375b..902fb8e76b3 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp
@@ -36,60 +36,45 @@ enum eSays
SAY_DEATH = 4
};
-enum eSpells
+enum Spells
{
- SPELL_SUMMON_RAGIN_FLAMES = 35275,
+ SPELL_SUMMON_RAGIN_FLAMES = 35275, // Not scripted
SPELL_FROST_ATTACK = 35263,
SPELL_ARCANE_BLAST = 35314,
SPELL_DRAGONS_BREATH = 35250,
SPELL_KNOCKBACK = 37317,
SPELL_SOLARBURN = 35267,
- H_SPELL_SUMMON_RAGIN_FLAMES = 39084,
- SPELL_INFERNO = 35268,
- H_SPELL_INFERNO = 39346,
- SPELL_FIRE_TAIL = 35278,
+ H_SPELL_SUMMON_RAGIN_FLAMES = 39084, // Not scripted
+ SPELL_INFERNO = 35268, // Not scripted
+ H_SPELL_INFERNO = 39346, // Not scripted
+ SPELL_FIRE_TAIL = 35278 // Not scripted
+};
+
+enum Events
+{
+ EVENT_FROST_ATTACK = 0,
+ EVENT_ARCANE_BLAST = 1,
+ EVENT_DRAGONS_BREATH = 2,
+ EVENT_KNOCKBACK = 3,
+ EVENT_SOLARBURN = 4
};
class boss_nethermancer_sepethrea : public CreatureScript
{
- public:
+ public: boss_nethermancer_sepethrea(): CreatureScript("boss_nethermancer_sepethrea") {}
- boss_nethermancer_sepethrea()
- : CreatureScript("boss_nethermancer_sepethrea")
+ struct boss_nethermancer_sepethreaAI : public BossAI
{
- }
- struct boss_nethermancer_sepethreaAI : public ScriptedAI
- {
- boss_nethermancer_sepethreaAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
-
- uint32 frost_attack_Timer;
- uint32 arcane_blast_Timer;
- uint32 dragons_breath_Timer;
- uint32 knockback_Timer;
- uint32 solarburn_Timer;
-
- void Reset()
- {
- frost_attack_Timer = urand(7000, 10000);
- arcane_blast_Timer = urand(12000, 18000);
- dragons_breath_Timer = urand(18000, 22000);
- knockback_Timer = urand(22000, 28000);
- solarburn_Timer = 30000;
-
- if (instance)
- instance->SetData(DATA_NETHERMANCER_EVENT, NOT_STARTED);
- }
+ boss_nethermancer_sepethreaAI(Creature* creature) : BossAI(creature, DATA_NETHERMANCER_SEPRETHREA) {}
void EnterCombat(Unit* who)
{
- if (instance)
- instance->SetData(DATA_NETHERMANCER_EVENT, IN_PROGRESS);
-
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_FROST_ATTACK, urand(7000, 10000));
+ events.ScheduleEvent(EVENT_ARCANE_BLAST, urand(12000, 18000));
+ events.ScheduleEvent(EVENT_DRAGONS_BREATH, urand(18000, 22000));
+ events.ScheduleEvent(EVENT_KNOCKBACK, urand(22000, 28000));
+ events.ScheduleEvent(EVENT_SOLARBURN, 30000);
Talk(SAY_AGGRO);
DoCast(who, SPELL_SUMMON_RAGIN_FLAMES);
Talk(SAY_SUMMON);
@@ -102,66 +87,50 @@ class boss_nethermancer_sepethrea : public CreatureScript
void JustDied(Unit* /*killer*/)
{
+ _JustDied();
Talk(SAY_DEATH);
- if (instance)
- instance->SetData(DATA_NETHERMANCER_EVENT, DONE);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
- //Return since we have no target
if (!UpdateVictim())
return;
- //Frost Attack
- if (frost_attack_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_FROST_ATTACK);
+ events.Update(diff);
- frost_attack_Timer = urand(7000, 10000);
- }
- else
- frost_attack_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- //Arcane Blast
- if (arcane_blast_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_ARCANE_BLAST);
- arcane_blast_Timer = 15000;
- }
- else
- arcane_blast_Timer -= diff;
- //Dragons Breath
- if (dragons_breath_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- DoCast(me->getVictim(), SPELL_DRAGONS_BREATH);
+ switch (eventId)
{
- if (rand()%2)
- return;
- Talk(SAY_DRAGONS_BREATH);
+ case EVENT_FROST_ATTACK:
+ DoCastVictim(SPELL_FROST_ATTACK, true);
+ events.ScheduleEvent(EVENT_FROST_ATTACK, urand(7000, 10000));
+ break;
+ case EVENT_ARCANE_BLAST:
+ DoCastVictim(SPELL_ARCANE_BLAST, true);
+ events.ScheduleEvent(EVENT_ARCANE_BLAST, 15000);
+ break;
+ case EVENT_DRAGONS_BREATH:
+ DoCastVictim(SPELL_DRAGONS_BREATH, true);
+ events.ScheduleEvent(EVENT_DRAGONS_BREATH, urand(12000, 22000));
+ if (roll_chance_i(50))
+ Talk(SAY_DRAGONS_BREATH);
+ break;
+ case EVENT_KNOCKBACK:
+ DoCastVictim(SPELL_KNOCKBACK, true);
+ events.ScheduleEvent(EVENT_KNOCKBACK, urand(15000, 25000));
+ break;
+ case EVENT_SOLARBURN:
+ DoCastVictim(SPELL_SOLARBURN, true);
+ events.ScheduleEvent(EVENT_SOLARBURN, 30000);
+ break;
+ default:
+ break;
}
- dragons_breath_Timer = urand(12000, 22000);
}
- else
- dragons_breath_Timer -= diff;
-
- //Knockback
- if (knockback_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_KNOCKBACK);
- knockback_Timer = urand(15000, 25000);
- }
- else
- knockback_Timer -= diff;
-
- //Solarburn
- if (solarburn_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_SOLARBURN);
- solarburn_Timer = 30000;
- }
- else
- solarburn_Timer -= diff;
DoMeleeAttackIfReady();
}
@@ -172,13 +141,11 @@ class boss_nethermancer_sepethrea : public CreatureScript
return new boss_nethermancer_sepethreaAI(creature);
}
};
+
class mob_ragin_flames : public CreatureScript
{
public:
- mob_ragin_flames()
- : CreatureScript("mob_ragin_flames")
- {
- }
+ mob_ragin_flames() : CreatureScript("mob_ragin_flames") { }
struct mob_ragin_flamesAI : public ScriptedAI
{
@@ -210,14 +177,14 @@ class mob_ragin_flames : public CreatureScript
{
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Check_Timer
if (Check_Timer <= diff)
{
if (instance)
{
- if (instance->GetData(DATA_NETHERMANCER_EVENT) != IN_PROGRESS)
+ if (instance->GetData(DATA_NETHERMANCER_SEPRETHREA) != IN_PROGRESS)
{
//remove
me->setDeathState(JUST_DIED);
@@ -259,9 +226,9 @@ class mob_ragin_flames : public CreatureScript
return new mob_ragin_flamesAI(creature);
}
};
+
void AddSC_boss_nethermancer_sepethrea()
{
new boss_nethermancer_sepethrea();
new mob_ragin_flames();
}
-
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
index 41296daf1fa..65cd195fb80 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
@@ -25,8 +25,9 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "mechanar.h"
-enum eSays
+enum Says
{
SAY_AGGRO = 0,
SAY_DOMINATION = 1,
@@ -35,65 +36,53 @@ enum eSays
SAY_SLAY = 4,
SAY_DEATH = 5
};
-// Spells to be casted
-enum eSpells
+
+enum Spells
{
SPELL_MANA_TAP = 36021,
SPELL_ARCANE_TORRENT = 36022,
SPELL_DOMINATION = 35280,
H_SPELL_ARCANE_EXPLOSION = 15453,
SPELL_FRENZY = 36992,
- //Spells work, but not implemented
- SPELL_SUMMON_NETHER_WRAITH_1 = 35285,
- SPELL_SUMMON_NETHER_WRAITH_2 = 35286,
- SPELL_SUMMON_NETHER_WRAITH_3 = 35287,
- SPELL_SUMMON_NETHER_WRAITH_4 = 35288,
- // Add Spells
- SPELL_DETONATION = 35058,
- SPELL_ARCANE_MISSILES = 35034,
+ SPELL_SUMMON_NETHER_WRAITH_1 = 35285, // Not scripted
+ SPELL_SUMMON_NETHER_WRAITH_2 = 35286, // Not scripted
+ SPELL_SUMMON_NETHER_WRAITH_3 = 35287, // Not scripted
+ SPELL_SUMMON_NETHER_WRAITH_4 = 35288, // Not scripted
+ SPELL_DETONATION = 35058, // Used by Nether Wraith
+ SPELL_ARCANE_MISSILES = 35034 // Used by Nether Wraith
+};
+
+enum Events
+{
+ EVENT_SUMMON = 0,
+ EVENT_MANA_TAP = 1,
+ EVENT_ARCANE_TORRENT = 2,
+ EVENT_DOMINATION = 3,
+ EVENT_ARCANE_EXPLOSION = 4
+};
+
+enum Creatures
+{
+ NPC_NETHER_WRAITH = 21062
};
class boss_pathaleon_the_calculator : public CreatureScript
{
public:
+ boss_pathaleon_the_calculator(): CreatureScript("boss_pathaleon_the_calculator") {}
- boss_pathaleon_the_calculator()
- : CreatureScript("boss_pathaleon_the_calculator")
- {
- }
-
- struct boss_pathaleon_the_calculatorAI : public ScriptedAI
+ struct boss_pathaleon_the_calculatorAI : public BossAI
{
- boss_pathaleon_the_calculatorAI(Creature* creature) : ScriptedAI(creature), summons(me)
- {
- }
+ boss_pathaleon_the_calculatorAI(Creature* creature) : BossAI(creature, DATA_PATHALEON_THE_CALCULATOR) { }
- uint32 Summon_Timer;
- SummonList summons;
- uint32 ManaTap_Timer;
- uint32 ArcaneTorrent_Timer;
- uint32 Domination_Timer;
- uint32 ArcaneExplosion_Timer;
-
- bool Enraged;
-
- uint32 Counter;
-
- void Reset()
- {
- Summon_Timer = 30000;
- ManaTap_Timer = urand(12000, 20000);
- ArcaneTorrent_Timer = urand(16000, 25000);
- Domination_Timer = urand(25000, 40000);
- ArcaneExplosion_Timer = urand(8000, 13000);
-
- Enraged = false;
-
- Counter = 0;
- summons.DespawnAll();
- }
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_SUMMON, 30000);
+ events.ScheduleEvent(EVENT_MANA_TAP, urand(12000, 20000));
+ events.ScheduleEvent(EVENT_ARCANE_TORRENT, urand(16000, 25000));
+ events.ScheduleEvent(EVENT_DOMINATION, urand(25000, 40000));
+ events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(8000, 13000));
Talk(SAY_AGGRO);
}
@@ -104,107 +93,82 @@ class boss_pathaleon_the_calculator : public CreatureScript
void JustDied(Unit* /*killer*/)
{
+ _JustDied();
Talk(SAY_DEATH);
-
- summons.DespawnAll();
}
- void JustSummoned(Creature* summon)
- {
- summons.Summon(summon);
- }
- void SummonedCreatureDespawn(Creature* summon)
+ void DamageTaken(Unit* /*attacker*/, uint32& damage)
{
- summons.Despawn(summon);
+ if (me->HealthBelowPctDamaged(20, damage) && !me->HasAura(SPELL_FRENZY))
+ {
+ DoCast(me, SPELL_FRENZY);
+ Talk(SAY_ENRAGE);
+ }
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
- //Return since we have no target
if (!UpdateVictim())
return;
- if (Summon_Timer <= diff)
- {
- for (uint8 i = 0; i < 3; ++i)
- {
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- Creature* Wraith = me->SummonCreature(21062, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
- if (target && Wraith)
- Wraith->AI()->AttackStart(target);
- }
- Talk(SAY_SUMMON);
- Summon_Timer = urand(30000, 45000);
- }
- else
- Summon_Timer -= diff;
-
- if (ManaTap_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_MANA_TAP);
- ManaTap_Timer = urand(14000, 22000);
- }
- else
- ManaTap_Timer -= diff;
+ events.Update(diff);
- if (ArcaneTorrent_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_ARCANE_TORRENT);
- ArcaneTorrent_Timer = urand(12000, 18000);
- }
- else
- ArcaneTorrent_Timer -= diff;
-
- if (Domination_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
- {
- Talk(SAY_DOMINATION);
- DoCast(target, SPELL_DOMINATION);
- }
- Domination_Timer = urand(25000, 30000);
- }
- else
- Domination_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- //Only casting if Heroic Mode is used
- if (IsHeroic())
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (ArcaneExplosion_Timer <= diff)
+ switch (eventId)
{
- DoCast(me->getVictim(), H_SPELL_ARCANE_EXPLOSION);
- ArcaneExplosion_Timer = urand(10000, 14000);
+ case EVENT_SUMMON:
+ for (uint8 i = 0; i < 3; ++i)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ {
+ if (Creature* Wraith = me->SummonCreature(NPC_NETHER_WRAITH, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000))
+ Wraith->AI()->AttackStart(target);
+ }
+ }
+ Talk(SAY_SUMMON);
+ events.ScheduleEvent(EVENT_SUMMON, urand(30000, 45000));
+ break;
+ case EVENT_MANA_TAP:
+ DoCastVictim(SPELL_MANA_TAP, true);
+ events.ScheduleEvent(EVENT_MANA_TAP, urand(14000, 22000));
+ break;
+ case EVENT_ARCANE_TORRENT:
+ DoCastVictim(SPELL_ARCANE_TORRENT, true);
+ events.ScheduleEvent(EVENT_ARCANE_TORRENT, urand(12000, 18000));
+ break;
+ case EVENT_DOMINATION:
+ Talk(SAY_DOMINATION);
+ DoCastVictim(SPELL_DOMINATION, true);
+ events.ScheduleEvent(EVENT_DOMINATION, urand(25000, 30000));
+ break;
+ case EVENT_ARCANE_EXPLOSION: // Heroic only
+ DoCastVictim(H_SPELL_ARCANE_EXPLOSION, true);
+ events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(10000, 14000));
+ break;
+ default:
+ break;
}
- else
- ArcaneExplosion_Timer -= diff;
- }
-
- if (!Enraged && HealthBelowPct(21))
- {
- DoCast(me, SPELL_FRENZY);
- Talk(SAY_ENRAGE);
- Enraged = true;
-
}
DoMeleeAttackIfReady();
}
};
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_pathaleon_the_calculatorAI (creature);
- }
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_pathaleon_the_calculatorAI (creature);
+ }
};
class mob_nether_wraith : public CreatureScript
{
public:
- mob_nether_wraith()
- : CreatureScript("mob_nether_wraith")
- {
- }
+ mob_nether_wraith() : CreatureScript("mob_nether_wraith") { }
struct mob_nether_wraithAI : public ScriptedAI
{
@@ -225,7 +189,7 @@ class mob_nether_wraith : public CreatureScript
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
index 1f9ddfcdd0b..146569db284 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
@@ -16,68 +16,122 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Instance_Mechanar
-SD%Complete: 100
-SDComment:
-SDCategory: Mechanar
-EndScriptData */
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "mechanar.h"
-#define MAX_ENCOUNTER 1
+static DoorData const doorData[] =
+{
+ { GO_DOOR_MOARG_1, DATA_GATEWATCHER_IRON_HAND, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_DOOR_MOARG_2, DATA_GATEWATCHER_GYROKILL, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_DOOR_NETHERMANCER, DATA_NETHERMANCER_SEPRETHREA, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ {0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }
+};
class instance_mechanar : public InstanceMapScript
{
public:
- instance_mechanar()
- : InstanceMapScript("instance_mechanar", 554)
- {
- }
+ instance_mechanar(): InstanceMapScript("instance_mechanar", 554) { }
struct instance_mechanar_InstanceMapScript : public InstanceScript
{
- instance_mechanar_InstanceMapScript(Map* map) : InstanceScript(map) {}
+ instance_mechanar_InstanceMapScript(Map* map) : InstanceScript(map)
+ {
+ SetBossNumber(EncounterCount);
+ LoadDoorData(doorData);
+ }
- uint32 m_auiEncounter[MAX_ENCOUNTER];
- void Initialize()
+ void OnGameObjectCreate(GameObject* gameObject)
{
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
+ switch (gameObject->GetEntry())
+ {
+ case GO_DOOR_MOARG_1:
+ case GO_DOOR_MOARG_2:
+ case GO_DOOR_NETHERMANCER:
+ AddDoor(gameObject, true);
+ break;
+ default:
+ break;
+ }
}
- bool IsEncounterInProgress() const
+ void OnGameObjectRemove(GameObject* gameObject)
{
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- return true;
-
- return false;
+ switch (gameObject->GetEntry())
+ {
+ case GO_DOOR_MOARG_1:
+ case GO_DOOR_MOARG_2:
+ case GO_DOOR_NETHERMANCER:
+ AddDoor(gameObject, false);
+ break;
+ default:
+ break;
+ }
}
- uint32 GetData(uint32 type) const
+ bool SetBossState(uint32 type, EncounterState state)
{
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
switch (type)
{
- case DATA_NETHERMANCER_EVENT: return m_auiEncounter[0];
+ case DATA_GATEWATCHER_GYROKILL:
+ case DATA_GATEWATCHER_IRON_HAND:
+ case DATA_MECHANOLORD_CAPACITUS:
+ case DATA_NETHERMANCER_SEPRETHREA:
+ case DATA_PATHALEON_THE_CALCULATOR:
+ break;
+ default:
+ break;
}
- return false;
+ return true;
}
- uint64 GetData64(uint32 /*identifier*/) const
+ std::string GetSaveData()
{
- return 0;
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << "M C " << GetBossSaveData();
+
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
}
- void SetData(uint32 type, uint32 data)
+ void Load(const char* str)
{
- switch (type)
+ if (!str)
{
- case DATA_NETHERMANCER_EVENT: m_auiEncounter[0] = data; break;
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
}
+
+ OUT_LOAD_INST_DATA(str);
+
+ char dataHead1, dataHead2;
+
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
+
+ if (dataHead1 == 'M' && dataHead2 == 'C')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
}
};
@@ -89,6 +143,5 @@ class instance_mechanar : public InstanceMapScript
void AddSC_instance_mechanar()
{
- new instance_mechanar;
+ new instance_mechanar();
}
-
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h b/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h
index c933c90afef..0d3a4ea241d 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -19,6 +18,22 @@
#ifndef DEF_MECHANAR_H
#define DEF_MECHANAR_H
-#define DATA_NETHERMANCER_EVENT 1
-#endif
+uint32 const EncounterCount = 5;
+
+enum DataTypes
+{
+ DATA_GATEWATCHER_GYROKILL = 0,
+ DATA_GATEWATCHER_IRON_HAND = 1,
+ DATA_MECHANOLORD_CAPACITUS = 2,
+ DATA_NETHERMANCER_SEPRETHREA = 3,
+ DATA_PATHALEON_THE_CALCULATOR = 4
+};
+enum GameobjectIds
+{
+ GO_DOOR_MOARG_1 = 184632,
+ GO_DOOR_MOARG_2 = 184322,
+ GO_DOOR_NETHERMANCER = 184449
+};
+
+#endif
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
index cd3fb897181..2fc0b475cdf 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
@@ -19,7 +19,7 @@
/* ScriptData
SDName: Arcatraz
SD%Complete: 60
-SDComment: Warden Mellichar, event controller for Skyriss event. Millhouse Manastorm. TODO: make better combatAI for Millhouse.
+SDComment: Warden Mellichar, event controller for Skyriss event. Millhouse Manastorm. @todo make better combatAI for Millhouse.
SDCategory: Tempest Keep, The Arcatraz
EndScriptData */
@@ -138,7 +138,7 @@ class npc_millhouse_manastorm : public CreatureScript
->FailQuest();*/
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!Init)
{
@@ -398,7 +398,7 @@ class npc_warden_mellichar : public CreatureScript
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!IsRunning)
return;
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
index 141257dae63..c6f47fe8de7 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
@@ -152,7 +152,7 @@ class boss_harbinger_skyriss : public CreatureScript
DoCast(me, SPELL_33_ILLUSION);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!Intro)
{
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp
index 20531f1f110..6775fb95824 100644
--- a/src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp
@@ -93,7 +93,7 @@ class boss_commander_sarannis : public CreatureScript
BossAI::JustSummoned(summon);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
index 2ab527c2fd5..39ca6d32196 100644
--- a/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
@@ -114,7 +114,7 @@ class boss_high_botanist_freywinn : public CreatureScript
Talk(SAY_DEATH);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp
index bd9195e44f8..7b4ef77ac10 100644
--- a/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp
@@ -167,7 +167,7 @@ class boss_laj : public CreatureScript
summon->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0));
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp
index ffd48f4dcb5..70b626190b7 100644
--- a/src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp
@@ -95,7 +95,7 @@ class boss_thorngrin_the_tender : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp
index d2b6c44ec7b..1275550a340 100644
--- a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp
@@ -90,7 +90,7 @@ class mob_warp_splinter_treant : public CreatureScript
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
{
@@ -190,7 +190,7 @@ class boss_warp_splinter : public CreatureScript
Talk(SAY_SUMMON);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/boss_doomlord_kazzak.cpp b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp
index 8886e3e41f0..0e66893d3ac 100644
--- a/src/server/scripts/Outland/boss_doomlord_kazzak.cpp
+++ b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp
@@ -108,7 +108,7 @@ class boss_doomlord_kazzak : public CreatureScript
Talk(SAY_DEATH);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
// Return since we have no target
if (!UpdateVictim())
diff --git a/src/server/scripts/Outland/boss_doomwalker.cpp b/src/server/scripts/Outland/boss_doomwalker.cpp
index 9826900d246..33896800ada 100644
--- a/src/server/scripts/Outland/boss_doomwalker.cpp
+++ b/src/server/scripts/Outland/boss_doomwalker.cpp
@@ -97,7 +97,7 @@ class boss_doomwalker : public CreatureScript
who->CastSpell(who, SPELL_AURA_DEATH, 1);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
index d03abc82b9c..91d9eb53506 100644
--- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
+++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
@@ -54,7 +54,7 @@ bool obelisk_one, obelisk_two, obelisk_three, obelisk_four, obelisk_five;
## mobs_bladespire_ogre
######*/
-//TODO: add support for quest 10512 + Creature abilities
+/// @todo add support for quest 10512 + Creature abilities
class mobs_bladespire_ogre : public CreatureScript
{
public:
@@ -71,7 +71,7 @@ public:
void Reset() { }
- void UpdateAI(const uint32 /*uiDiff*/)
+ void UpdateAI(uint32 /*uiDiff*/)
{
if (!UpdateVictim())
return;
@@ -195,7 +195,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (IsNihil)
{
@@ -296,7 +296,7 @@ public:
if (who->HasAura(SPELL_LASHHAN_CHANNEL) && me->IsWithinDistInMap(who, 10.0f))
{
Talk(SAY_SPELL_INFLUENCE, who->GetGUID());
- //TODO: Move the below to updateAI and run if this statement == true
+ /// @todo Move the below to updateAI and run if this statement == true
DoCast(who, 37028, true);
}
}
@@ -468,7 +468,7 @@ public:
OgreGUID = 0;
}
- void UpdateAI(const uint32 /*uiDiff*/) {}
+ void UpdateAI(uint32 /*uiDiff*/) {}
};
};
@@ -528,7 +528,7 @@ public:
}
}
- void UpdateAI(const uint32 /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!UpdateVictim())
return;
@@ -654,7 +654,7 @@ class npc_simon_bunny : public CreatureScript
EventMap _events;
std::list<uint8> colorSequence, playableSequence, playerSequence;
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
_events.Update(diff);
@@ -708,7 +708,7 @@ class npc_simon_bunny : public CreatureScript
}
}
- void DoAction(const int32 action)
+ void DoAction(int32 action)
{
switch (action)
{
diff --git a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
index 64b484268df..e950547ac30 100644
--- a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
+++ b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
@@ -86,7 +86,7 @@ public:
Talk(SAY_SUMMON);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (Faction_Timer)
{
@@ -487,7 +487,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
if (uiCheckTimer <= uiDiff)
{
diff --git a/src/server/scripts/Outland/zone_nagrand.cpp b/src/server/scripts/Outland/zone_nagrand.cpp
index 0a92b985c95..fd193aa4835 100644
--- a/src/server/scripts/Outland/zone_nagrand.cpp
+++ b/src/server/scripts/Outland/zone_nagrand.cpp
@@ -274,7 +274,7 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
if (!me->getVictim())
@@ -445,7 +445,7 @@ public:
ReleasedFromCage = false;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (ReleasedFromCage)
{
@@ -628,7 +628,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -639,7 +639,7 @@ public:
if (ChainLightningTimer <= diff)
{
DoCast(me->getVictim(), SPELL_KUR_CHAIN_LIGHTNING);
- ChainLightningTimer = urand(7000,14000);
+ ChainLightningTimer = urand(7000, 14000);
} else ChainLightningTimer -= diff;
if (HealthBelowPct(30))
@@ -654,7 +654,7 @@ public:
if (FrostShockTimer <= diff)
{
DoCast(me->getVictim(), SPELL_KUR_FROST_SHOCK);
- FrostShockTimer = urand(7500,15000);
+ FrostShockTimer = urand(7500, 15000);
} else FrostShockTimer -= diff;
DoMeleeAttackIfReady();
diff --git a/src/server/scripts/Outland/zone_netherstorm.cpp b/src/server/scripts/Outland/zone_netherstorm.cpp
index 769ee7dc68d..779ab3261ed 100644
--- a/src/server/scripts/Outland/zone_netherstorm.cpp
+++ b/src/server/scripts/Outland/zone_netherstorm.cpp
@@ -237,7 +237,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (Event_Timer <= diff)
{
@@ -305,7 +305,7 @@ public:
## go_manaforge_control_console
######*/
-//TODO: clean up this workaround when Trinity adds support to do it properly (with gossip selections instead of instant summon)
+/// @todo clean up this workaround when Trinity adds support to do it properly (with gossip selections instead of instant summon)
class go_manaforge_control_console : public GameObjectScript
{
public:
@@ -506,7 +506,7 @@ public:
return false;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Is event even running?
if (!isEvent)
@@ -784,7 +784,7 @@ public:
// DoCast(me, SPELL_DE_MATERIALIZE);
//}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!Materialize)
{
@@ -997,7 +997,7 @@ public:
player->FailQuest(QUEST_MARK_V_IS_ALIVE);
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
index 0a016f0923c..b8f96e373f3 100644
--- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
+++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
@@ -126,7 +126,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (bCanEat || bIsEating)
{
@@ -280,7 +280,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
{
@@ -385,7 +385,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (PoisonTimer)
{
@@ -661,6 +661,7 @@ class npc_karynaku : public CreatureScript
/*####
# npc_overlord_morghor
+# this whole script is wrong and needs a rewrite.even the illidan npc used is the wrong one.npc id 23467 may be the correct one
####*/
enum eOverlordData
{
@@ -766,7 +767,7 @@ public:
Player* player = Unit::GetPlayer(*me, PlayerGUID);
Creature* Illi = Creature::GetCreature(*me, IllidanGUID);
- if (!player || !Illi)
+ if (!player)
{
EnterEvadeMode();
return 0;
@@ -794,14 +795,21 @@ public:
return 2000;
break;
case 5:
- Illi->SetVisible(true);
- Illi->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ if (Illi)
+ {
+ Illi->SetVisible(true);
+ Illi->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ Illi->SetDisplayId(21526);
+ }
return 350;
break;
case 6:
- Illi->CastSpell(Illi, SPELL_ONE, true);
- Illi->SetTarget(me->GetGUID());
- me->SetTarget(IllidanGUID);
+ if (Illi)
+ {
+ Illi->CastSpell(Illi, SPELL_ONE, true);
+ Illi->SetTarget(me->GetGUID());
+ me->SetTarget(IllidanGUID);
+ }
return 2000;
break;
case 7:
@@ -810,10 +818,15 @@ public:
break;
case 8:
me->SetUInt32Value(UNIT_FIELD_BYTES_1, 8);
- return 9000;
+ return 2500;
+ break;
+ case 9:
+ // missing text "Lord Illidan, this is the Dragonmaw that I, and others, have told you about. He will lead us to victory!"
+ return 5000;
break;
case 10:
- Illi->AI()->Talk(LORD_ILLIDAN_SAY_1);
+ if (Illi)
+ Illi->AI()->Talk(LORD_ILLIDAN_SAY_1);
return 5000;
break;
case 11:
@@ -821,42 +834,53 @@ public:
return 6000;
break;
case 12:
- Illi->AI()->Talk(LORD_ILLIDAN_SAY_2);
+ if (Illi)
+ Illi->AI()->Talk(LORD_ILLIDAN_SAY_2);
return 5500;
break;
case 13:
- Illi->AI()->Talk(LORD_ILLIDAN_SAY_3);
+ if (Illi)
+ Illi->AI()->Talk(LORD_ILLIDAN_SAY_3);
return 4000;
break;
case 14:
- Illi->SetTarget(PlayerGUID);
+ if (Illi)
+ Illi->SetTarget(PlayerGUID);
return 1500;
break;
case 15:
- Illi->AI()->Talk(LORD_ILLIDAN_SAY_4);
+ if (Illi)
+ Illi->AI()->Talk(LORD_ILLIDAN_SAY_4);
return 1500;
break;
case 16:
- Illi->CastSpell(player, SPELL_TWO, true);
+ if (Illi)
+ Illi->CastSpell(player, SPELL_TWO, true);
player->RemoveAurasDueToSpell(SPELL_THREE);
player->RemoveAurasDueToSpell(SPELL_FOUR);
return 5000;
break;
case 17:
- Illi->AI()->Talk(LORD_ILLIDAN_SAY_5);
+ if (Illi)
+ Illi->AI()->Talk(LORD_ILLIDAN_SAY_5);
return 5000;
break;
case 18:
- Illi->AI()->Talk(LORD_ILLIDAN_SAY_6);
+ if (Illi)
+ Illi->AI()->Talk(LORD_ILLIDAN_SAY_6);
return 5000;
break;
case 19:
- Illi->AI()->Talk(LORD_ILLIDAN_SAY_7);
+ if (Illi)
+ Illi->AI()->Talk(LORD_ILLIDAN_SAY_7);
return 5000;
break;
case 20:
- Illi->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
- Illi->SetDisableGravity(true);
+ if (Illi)
+ {
+ Illi->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
+ Illi->SetDisableGravity(true);
+ }
return 500;
break;
case 21:
@@ -864,8 +888,11 @@ public:
return 500;
break;
case 22:
- Illi->SetVisible(false);
- Illi->setDeathState(JUST_DIED);
+ if (Illi)
+ {
+ Illi->SetVisible(false);
+ Illi->setDeathState(JUST_DIED);
+ }
return 1000;
break;
case 23:
@@ -886,7 +913,7 @@ public:
break;
case 27:
{
- Unit* Yarzill = me->FindNearestCreature(C_YARZILL, 50);
+ Unit* Yarzill = me->FindNearestCreature(C_YARZILL, 50.0f);
if (Yarzill)
Yarzill->SetTarget(PlayerGUID);
return 500;
@@ -921,9 +948,11 @@ public:
}
break;
case 32:
- me->GetMotionMaster()->MovePoint(0, -5085.77f, 577.231f, 86.6719f); return 5000;
+ me->GetMotionMaster()->MovePoint(0, -5085.77f, 577.231f, 86.6719f);
+ return 5000;
break;
case 33:
+ me->SetTarget(0);
Reset();
return 100;
break;
@@ -933,14 +962,14 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!ConversationTimer)
return;
if (ConversationTimer <= diff)
{
- if (Event && IllidanGUID && PlayerGUID)
+ if (Event && PlayerGUID)
ConversationTimer = NextStep(++Step);
} else ConversationTimer -= diff;
}
@@ -1096,14 +1125,14 @@ public:
}
}
- void UpdateAI(const uint32 uiDiff)
+ void UpdateAI(uint32 uiDiff)
{
npc_escortAI::UpdateAI(uiDiff);
if (!UpdateVictim())
return;
- //TODO: add more abilities
+ /// @todo add more abilities
if (!HealthAbovePct(30))
{
if (m_uiHealingTimer <= uiDiff)
@@ -1297,7 +1326,7 @@ public:
++AnimationCount;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (AnimationTimer)
{
@@ -1485,7 +1514,7 @@ public:
Announced = false;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!PlayerGUID || !EventStarted)
return;
@@ -1552,7 +1581,7 @@ public:
CAST_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, LordIllidan->AI())->LiveCounter();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1862,16 +1891,11 @@ class spell_unlocking_zuluheds_chains : public SpellScriptLoader
{
PrepareSpellScript(spell_unlocking_zuluheds_chains_SpellScript);
- bool Load()
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
void HandleAfterHit()
{
- Player* caster = GetCaster()->ToPlayer();
- if (caster->GetQuestStatus(QUEST_ZULUHED) == QUEST_STATUS_INCOMPLETE)
- caster->KilledMonsterCredit(NPC_KARYNAKU, 0);
+ if (GetCaster()->GetTypeId() == TYPEID_PLAYER)
+ if (Creature* karynaku = GetCaster()->FindNearestCreature(NPC_KARYNAKU, 15.0f))
+ GetCaster()->ToPlayer()->CastedCreatureOrGO(NPC_KARYNAKU, karynaku->GetGUID(), GetSpellInfo()->Id);
}
void Register()
@@ -1946,7 +1970,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (tapped)
{
diff --git a/src/server/scripts/Outland/zone_shattrath_city.cpp b/src/server/scripts/Outland/zone_shattrath_city.cpp
index ac26614ae69..14553be0ef4 100644
--- a/src/server/scripts/Outland/zone_shattrath_city.cpp
+++ b/src/server/scripts/Outland/zone_shattrath_city.cpp
@@ -101,7 +101,7 @@ public:
me->RestoreFaction();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -176,7 +176,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -519,7 +519,7 @@ public:
void EnterCombat(Unit* /*who*/){}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (SayTimer <= diff)
{
diff --git a/src/server/scripts/Outland/zone_terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp
index 2b046a7518e..caa31ed472c 100644
--- a/src/server/scripts/Outland/zone_terokkar_forest.cpp
+++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp
@@ -125,7 +125,7 @@ public:
}
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (CanDoQuest)
{
@@ -244,7 +244,7 @@ public:
void Reset() {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
@@ -416,7 +416,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Outland/zone_zangarmarsh.cpp b/src/server/scripts/Outland/zone_zangarmarsh.cpp
index 319da372bf8..b4899189af5 100644
--- a/src/server/scripts/Outland/zone_zangarmarsh.cpp
+++ b/src/server/scripts/Outland/zone_zangarmarsh.cpp
@@ -192,7 +192,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp
index 4bd619155ac..ea8fb5795bd 100644
--- a/src/server/scripts/Spells/spell_dk.cpp
+++ b/src/server/scripts/Spells/spell_dk.cpp
@@ -28,21 +28,32 @@
enum DeathKnightSpells
{
- DK_SPELL_RUNIC_POWER_ENERGIZE = 49088,
- DK_SPELL_ANTI_MAGIC_SHELL_TALENT = 51052,
- DK_SPELL_CORPSE_EXPLOSION_TRIGGERED = 43999,
- DK_SPELL_CORPSE_EXPLOSION_VISUAL = 51270,
- DK_SPELL_GHOUL_EXPLODE = 47496,
- DK_SPELL_SCOURGE_STRIKE_TRIGGERED = 70890,
- DK_SPELL_BLOOD_BOIL_TRIGGERED = 65658,
- DK_SPELL_WILL_OF_THE_NECROPOLIS_TALENT_R1 = 49189,
- DK_SPELL_WILL_OF_THE_NECROPOLIS_AURA_R1 = 52284,
- DK_SPELL_BLOOD_PRESENCE = 48266,
- DK_SPELL_IMPROVED_BLOOD_PRESENCE_TRIGGERED = 63611,
- DK_SPELL_UNHOLY_PRESENCE = 48265,
- DK_SPELL_IMPROVED_UNHOLY_PRESENCE_TRIGGERED = 63622,
+ SPELL_DK_ANTI_MAGIC_SHELL_TALENT = 51052,
+ SPELL_DK_BLACK_ICE_R1 = 49140,
+ SPELL_DK_BLOOD_BOIL_TRIGGERED = 65658,
+ SPELL_DK_BLOOD_GORGED_HEAL = 50454,
+ SPELL_DK_CORPSE_EXPLOSION_TRIGGERED = 43999,
+ SPELL_DK_CORPSE_EXPLOSION_VISUAL = 51270,
+ SPELL_DK_DEATH_COIL_DAMAGE = 47632,
+ SPELL_DK_DEATH_COIL_HEAL = 47633,
+ SPELL_DK_DEATH_STRIKE_HEAL = 45470,
+ SPELL_DK_GHOUL_EXPLODE = 47496,
+ SPELL_DK_GLYPH_OF_ICEBOUND_FORTITUDE = 58625,
+ SPELL_DK_RUNIC_POWER_ENERGIZE = 49088,
+ SPELL_DK_SCOURGE_STRIKE_TRIGGERED = 70890,
+ SPELL_DK_WILL_OF_THE_NECROPOLIS_TALENT_R1 = 49189,
+ SPELL_DK_WILL_OF_THE_NECROPOLIS_AURA_R1 = 52284,
+ SPELL_DK_BLOOD_PRESENCE = 48266,
+ SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED = 63611,
+ SPELL_DK_UNHOLY_PRESENCE = 48265,
+ SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED = 63622,
+ SPELL_DK_ITEM_SIGIL_VENGEFUL_HEART = 64962,
SPELL_DK_ITEM_T8_MELEE_4P_BONUS = 64736,
- DK_SPELL_BLACK_ICE_R1 = 49140,
+};
+
+enum DeathKnightSpellIcons
+{
+ DK_ICON_ID_IMPROVED_DEATH_STRIKE = 2751,
};
// 50462 - Anti-Magic Shell (on raid member)
@@ -65,19 +76,19 @@ class spell_dk_anti_magic_shell_raid : public SpellScriptLoader
void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)
{
- // TODO: this should absorb limited amount of damage, but no info on calculation formula
+ /// @todo this should absorb limited amount of damage, but no info on calculation formula
amount = -1;
}
void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount)
{
- absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct);
+ absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct);
}
void Register()
{
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_anti_magic_shell_raid_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_raid_AuraScript::Absorb, EFFECT_0);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_anti_magic_shell_raid_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
+ OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_raid_AuraScript::Absorb, EFFECT_0);
}
};
@@ -105,9 +116,9 @@ class spell_dk_anti_magic_shell_self : public SpellScriptLoader
return true;
}
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(DK_SPELL_RUNIC_POWER_ENERGIZE))
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_RUNIC_POWER_ENERGIZE))
return false;
return true;
}
@@ -128,14 +139,14 @@ class spell_dk_anti_magic_shell_self : public SpellScriptLoader
// damage absorbed by Anti-Magic Shell energizes the DK with additional runic power.
// This, if I'm not mistaken, shows that we get back ~20% of the absorbed damage as runic power.
int32 bp = absorbAmount * 2 / 10;
- target->CastCustomSpell(target, DK_SPELL_RUNIC_POWER_ENERGIZE, &bp, NULL, NULL, true, NULL, aurEff);
+ target->CastCustomSpell(target, SPELL_DK_RUNIC_POWER_ENERGIZE, &bp, NULL, NULL, true, NULL, aurEff);
}
void Register()
{
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_anti_magic_shell_self_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_self_AuraScript::Absorb, EFFECT_0);
- AfterEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_self_AuraScript::Trigger, EFFECT_0);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_anti_magic_shell_self_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
+ OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_self_AuraScript::Absorb, EFFECT_0);
+ AfterEffectAbsorb += AuraEffectAbsorbFn(spell_dk_anti_magic_shell_self_AuraScript::Trigger, EFFECT_0);
}
};
@@ -163,16 +174,16 @@ class spell_dk_anti_magic_zone : public SpellScriptLoader
return true;
}
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(DK_SPELL_ANTI_MAGIC_SHELL_TALENT))
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_ANTI_MAGIC_SHELL_TALENT))
return false;
return true;
}
void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)
{
- SpellInfo const* talentSpell = sSpellMgr->GetSpellInfo(DK_SPELL_ANTI_MAGIC_SHELL_TALENT);
+ SpellInfo const* talentSpell = sSpellMgr->GetSpellInfo(SPELL_DK_ANTI_MAGIC_SHELL_TALENT);
amount = talentSpell->Effects[EFFECT_0].CalcValue(GetCaster());
if (Player* player = GetCaster()->ToPlayer())
amount += int32(2 * player->GetTotalAttackPowerValue(BASE_ATTACK));
@@ -196,7 +207,105 @@ class spell_dk_anti_magic_zone : public SpellScriptLoader
}
};
-// 49158 Corpse Explosion (51325, 51326, 51327, 51328)
+// 48721 - Blood Boil
+class spell_dk_blood_boil : public SpellScriptLoader
+{
+ public:
+ spell_dk_blood_boil() : SpellScriptLoader("spell_dk_blood_boil") { }
+
+ class spell_dk_blood_boil_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_dk_blood_boil_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_BOIL_TRIGGERED))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _executed = false;
+ return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCaster()->getClass() == CLASS_DEATH_KNIGHT;
+ }
+
+ void HandleAfterHit()
+ {
+ if (_executed || !GetHitUnit())
+ return;
+
+ _executed = true;
+ GetCaster()->CastSpell(GetCaster(), SPELL_DK_BLOOD_BOIL_TRIGGERED, true);
+ }
+
+ void Register()
+ {
+ AfterHit += SpellHitFn(spell_dk_blood_boil_SpellScript::HandleAfterHit);
+ }
+
+ bool _executed;
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_dk_blood_boil_SpellScript();
+ }
+};
+
+// 50453 - Bloodworms Health Leech
+class spell_dk_blood_gorged : public SpellScriptLoader
+{
+ public:
+ spell_dk_blood_gorged() : SpellScriptLoader("spell_dk_blood_gorged") { }
+
+ class spell_dk_blood_gorged_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dk_blood_gorged_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_GORGED_HEAL))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ _procTarget = GetTarget()->GetOwner();
+ return _procTarget;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 bp = int32(eventInfo.GetDamageInfo()->GetDamage() * 1.5f);
+ GetTarget()->CastCustomSpell(SPELL_DK_BLOOD_GORGED_HEAL, SPELLVALUE_BASE_POINT0, bp, _procTarget, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_dk_blood_gorged_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_dk_blood_gorged_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+
+ private:
+ Unit* _procTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dk_blood_gorged_AuraScript();
+ }
+};
+
+// 49158 - Corpse Explosion (51325, 51326, 51327, 51328)
class spell_dk_corpse_explosion : public SpellScriptLoader
{
public:
@@ -206,11 +315,11 @@ class spell_dk_corpse_explosion : public SpellScriptLoader
{
PrepareSpellScript(spell_dk_corpse_explosion_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(DK_SPELL_CORPSE_EXPLOSION_TRIGGERED) || !sSpellMgr->GetSpellInfo(DK_SPELL_GHOUL_EXPLODE))
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_CORPSE_EXPLOSION_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_DK_GHOUL_EXPLODE))
return false;
- if (!sSpellMgr->GetSpellInfo(DK_SPELL_CORPSE_EXPLOSION_VISUAL))
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_CORPSE_EXPLOSION_VISUAL))
return false;
return true;
}
@@ -223,17 +332,17 @@ class spell_dk_corpse_explosion : public SpellScriptLoader
if (unitTarget->isAlive()) // Living ghoul as a target
{
bp = int32(unitTarget->CountPctFromMaxHealth(25));
- unitTarget->CastCustomSpell(unitTarget, DK_SPELL_GHOUL_EXPLODE, &bp, NULL, NULL, false);
+ unitTarget->CastCustomSpell(unitTarget, SPELL_DK_GHOUL_EXPLODE, &bp, NULL, NULL, false);
}
else // Some corpse
{
bp = GetEffectValue();
GetCaster()->CastCustomSpell(unitTarget, GetSpellInfo()->Effects[EFFECT_1].CalcValue(), &bp, NULL, NULL, true);
// Corpse Explosion (Suicide)
- unitTarget->CastSpell(unitTarget, DK_SPELL_CORPSE_EXPLOSION_TRIGGERED, true);
+ unitTarget->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_TRIGGERED, true);
}
// Set corpse look
- GetCaster()->CastSpell(unitTarget, DK_SPELL_CORPSE_EXPLOSION_VISUAL, true);
+ GetCaster()->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_VISUAL, true);
}
}
@@ -249,44 +358,74 @@ class spell_dk_corpse_explosion : public SpellScriptLoader
}
};
-// 47496 - Explode, Ghoul spell for Corpse Explosion
-class spell_dk_ghoul_explode : public SpellScriptLoader
+// -47541, 52375, 59134, -62900 - Death Coil
+class spell_dk_death_coil : public SpellScriptLoader
{
public:
- spell_dk_ghoul_explode() : SpellScriptLoader("spell_dk_ghoul_explode") { }
+ spell_dk_death_coil() : SpellScriptLoader("spell_dk_death_coil") { }
- class spell_dk_ghoul_explode_SpellScript : public SpellScript
+ class spell_dk_death_coil_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_dk_ghoul_explode_SpellScript);
+ PrepareSpellScript(spell_dk_death_coil_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spell*/)
{
- if (!sSpellMgr->GetSpellInfo(DK_SPELL_CORPSE_EXPLOSION_TRIGGERED))
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_COIL_DAMAGE) || !sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_COIL_HEAL))
return false;
return true;
}
- void Suicide(SpellEffIndex /*effIndex*/)
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
- if (Unit* unitTarget = GetHitUnit())
+ int32 damage = GetEffectValue();
+ Unit* caster = GetCaster();
+ if (Unit* target = GetHitUnit())
{
- // Corpse Explosion (Suicide)
- unitTarget->CastSpell(unitTarget, DK_SPELL_CORPSE_EXPLOSION_TRIGGERED, true);
+ if (caster->IsFriendlyTo(target))
+ {
+ int32 bp = int32(damage * 1.5f);
+ caster->CastCustomSpell(target, SPELL_DK_DEATH_COIL_HEAL, &bp, NULL, NULL, true);
+ }
+ else
+ {
+ if (AuraEffect const* auraEffect = caster->GetAuraEffect(SPELL_DK_ITEM_SIGIL_VENGEFUL_HEART, EFFECT_1))
+ damage += auraEffect->GetBaseAmount();
+ caster->CastCustomSpell(target, SPELL_DK_DEATH_COIL_DAMAGE, &damage, NULL, NULL, true);
+ }
}
}
+ SpellCastResult CheckCast()
+ {
+ Unit* caster = GetCaster();
+ if (Unit* target = GetExplTargetUnit())
+ {
+ if (!caster->IsFriendlyTo(target) && !caster->isInFront(target))
+ return SPELL_FAILED_UNIT_NOT_INFRONT;
+
+ if (target->IsFriendlyTo(caster) && target->GetCreatureType() != CREATURE_TYPE_UNDEAD)
+ return SPELL_FAILED_BAD_TARGETS;
+ }
+ else
+ return SPELL_FAILED_BAD_TARGETS;
+
+ return SPELL_CAST_OK;
+ }
+
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_dk_ghoul_explode_SpellScript::Suicide, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE);
+ OnCheckCast += SpellCheckCastFn(spell_dk_death_coil_SpellScript::CheckCast);
+ OnEffectHitTarget += SpellEffectFn(spell_dk_death_coil_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const
{
- return new spell_dk_ghoul_explode_SpellScript();
+ return new spell_dk_death_coil_SpellScript();
}
};
+// 52751 - Death Gate
class spell_dk_death_gate : public SpellScriptLoader
{
public:
@@ -327,6 +466,41 @@ class spell_dk_death_gate : public SpellScriptLoader
}
};
+// 49560 - Death Grip
+class spell_dk_death_grip : public SpellScriptLoader
+{
+ public:
+ spell_dk_death_grip() : SpellScriptLoader("spell_dk_death_grip") { }
+
+ class spell_dk_death_grip_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_dk_death_grip_SpellScript);
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ int32 damage = GetEffectValue();
+ Position const* pos = GetExplTargetDest();
+ if (Unit* target = GetHitUnit())
+ {
+ if (!target->HasAuraType(SPELL_AURA_DEFLECT_SPELLS)) // Deterrence
+ target->CastSpell(pos->GetPositionX(), pos->GetPositionY(), pos->GetPositionZ(), damage, true);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_dk_death_grip_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_dk_death_grip_SpellScript();
+ }
+};
+
+// 48743 - Death Pact
class spell_dk_death_pact : public SpellScriptLoader
{
public:
@@ -351,22 +525,22 @@ class spell_dk_death_pact : public SpellScriptLoader
return SPELL_FAILED_NO_PET;
}
- void FilterTargets(std::list<WorldObject*>& unitList)
+ void FilterTargets(std::list<WorldObject*>& targetList)
{
- Unit* unit_to_add = NULL;
- for (std::list<WorldObject*>::iterator itr = unitList.begin(); itr != unitList.end(); ++itr)
+ Unit* target = NULL;
+ for (std::list<WorldObject*>::iterator itr = targetList.begin(); itr != targetList.end(); ++itr)
{
if (Unit* unit = (*itr)->ToUnit())
- if (unit->GetOwnerGUID() == GetCaster()->GetGUID() && unit->GetCreatureType() == CREATURE_TYPE_UNDEAD)
- {
- unit_to_add = unit;
- break;
- }
+ if (unit->GetOwnerGUID() == GetCaster()->GetGUID() && unit->GetCreatureType() == CREATURE_TYPE_UNDEAD)
+ {
+ target = unit;
+ break;
+ }
}
- unitList.clear();
- if (unit_to_add)
- unitList.push_back(unit_to_add);
+ targetList.clear();
+ if (target)
+ targetList.push_back(target);
}
void Register()
@@ -382,26 +556,19 @@ class spell_dk_death_pact : public SpellScriptLoader
}
};
-// 55090 Scourge Strike (55265, 55270, 55271)
-class spell_dk_scourge_strike : public SpellScriptLoader
+// -49998 - Death Strike
+class spell_dk_death_strike : public SpellScriptLoader
{
public:
- spell_dk_scourge_strike() : SpellScriptLoader("spell_dk_scourge_strike") { }
+ spell_dk_death_strike() : SpellScriptLoader("spell_dk_death_strike") { }
- class spell_dk_scourge_strike_SpellScript : public SpellScript
+ class spell_dk_death_strike_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_dk_scourge_strike_SpellScript);
- float multiplier;
-
- bool Load()
- {
- multiplier = 1.0f;
- return true;
- }
+ PrepareSpellScript(spell_dk_death_strike_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(DK_SPELL_SCOURGE_STRIKE_TRIGGERED))
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_STRIKE_HEAL))
return false;
return true;
}
@@ -409,442 +576,432 @@ class spell_dk_scourge_strike : public SpellScriptLoader
void HandleDummy(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
- if (Unit* unitTarget = GetHitUnit())
+ if (Unit* target = GetHitUnit())
{
- multiplier = (GetEffectValue() * unitTarget->GetDiseasesByCaster(caster->GetGUID()) / 100.f);
- // Death Knight T8 Melee 4P Bonus
- if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_DK_ITEM_T8_MELEE_4P_BONUS, EFFECT_0))
- AddPct(multiplier, aurEff->GetAmount());
+ uint32 count = target->GetDiseasesByCaster(caster->GetGUID());
+ int32 bp = int32(count * caster->CountPctFromMaxHealth(int32(GetSpellInfo()->Effects[EFFECT_0].DamageMultiplier)));
+ // Improved Death Strike
+ if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DEATHKNIGHT, DK_ICON_ID_IMPROVED_DEATH_STRIKE, 0))
+ AddPct(bp, caster->CalculateSpellDamage(caster, aurEff->GetSpellInfo(), 2));
+ caster->CastCustomSpell(caster, SPELL_DK_DEATH_STRIKE_HEAL, &bp, NULL, NULL, false);
}
}
- void HandleAfterHit()
+ void Register()
{
- Unit* caster = GetCaster();
- if (Unit* unitTarget = GetHitUnit())
- {
- int32 bp = GetHitDamage() * multiplier;
+ OnEffectHitTarget += SpellEffectFn(spell_dk_death_strike_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY);
+ }
- if (AuraEffect* aurEff = caster->GetAuraEffectOfRankedSpell(DK_SPELL_BLACK_ICE_R1, EFFECT_0))
- AddPct(bp, aurEff->GetAmount());
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_dk_death_strike_SpellScript();
+ }
+};
- caster->CastCustomSpell(unitTarget, DK_SPELL_SCOURGE_STRIKE_TRIGGERED, &bp, NULL, NULL, true);
+// 47496 - Explode, Ghoul spell for Corpse Explosion
+class spell_dk_ghoul_explode : public SpellScriptLoader
+{
+ public:
+ spell_dk_ghoul_explode() : SpellScriptLoader("spell_dk_ghoul_explode") { }
+
+ class spell_dk_ghoul_explode_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_dk_ghoul_explode_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_CORPSE_EXPLOSION_TRIGGERED))
+ return false;
+ return true;
+ }
+
+ void Suicide(SpellEffIndex /*effIndex*/)
+ {
+ if (Unit* unitTarget = GetHitUnit())
+ {
+ // Corpse Explosion (Suicide)
+ unitTarget->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_TRIGGERED, true);
}
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_dk_scourge_strike_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY);
- AfterHit += SpellHitFn(spell_dk_scourge_strike_SpellScript::HandleAfterHit);
+ OnEffectHitTarget += SpellEffectFn(spell_dk_ghoul_explode_SpellScript::Suicide, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE);
}
};
SpellScript* GetSpellScript() const
{
- return new spell_dk_scourge_strike_SpellScript();
+ return new spell_dk_ghoul_explode_SpellScript();
}
};
-// 49145 - Spell Deflection
-class spell_dk_spell_deflection : public SpellScriptLoader
+// 48792 - Icebound Fortitude
+class spell_dk_icebound_fortitude : public SpellScriptLoader
{
public:
- spell_dk_spell_deflection() : SpellScriptLoader("spell_dk_spell_deflection") { }
+ spell_dk_icebound_fortitude() : SpellScriptLoader("spell_dk_icebound_fortitude") { }
- class spell_dk_spell_deflection_AuraScript : public AuraScript
+ class spell_dk_icebound_fortitude_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_dk_spell_deflection_AuraScript);
-
- uint32 absorbPct;
+ PrepareAuraScript(spell_dk_icebound_fortitude_AuraScript);
bool Load()
{
- absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster());
- return true;
+ Unit* caster = GetCaster();
+ return caster && caster->GetTypeId() == TYPEID_PLAYER;
}
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
{
- // Set absorbtion amount to unlimited
- amount = -1;
- }
+ if (Unit* caster = GetCaster())
+ {
+ int32 value = amount;
+ uint32 defValue = uint32(caster->ToPlayer()->GetSkillValue(SKILL_DEFENSE) + caster->ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));
- void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount)
- {
- // You have a chance equal to your Parry chance
- if ((dmgInfo.GetDamageType() == SPELL_DIRECT_DAMAGE) && roll_chance_f(GetTarget()->GetUnitParryChance()))
- absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct);
+ if (defValue > 400)
+ value -= int32((defValue - 400) * 0.15);
+
+ // Glyph of Icebound Fortitude
+ if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_DK_GLYPH_OF_ICEBOUND_FORTITUDE, EFFECT_0))
+ {
+ int32 valMax = -aurEff->GetAmount();
+ if (value > valMax)
+ value = valMax;
+ }
+ amount = value;
+ }
}
void Register()
{
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_spell_deflection_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_spell_deflection_AuraScript::Absorb, EFFECT_0);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_icebound_fortitude_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN);
}
};
AuraScript* GetAuraScript() const
{
- return new spell_dk_spell_deflection_AuraScript();
+ return new spell_dk_icebound_fortitude_AuraScript();
}
};
-// 48721 Blood Boil
-class spell_dk_blood_boil : public SpellScriptLoader
+// 50365, 50371 - Improved Blood Presence
+class spell_dk_improved_blood_presence : public SpellScriptLoader
{
public:
- spell_dk_blood_boil() : SpellScriptLoader("spell_dk_blood_boil") { }
+ spell_dk_improved_blood_presence() : SpellScriptLoader("spell_dk_improved_blood_presence") { }
- class spell_dk_blood_boil_SpellScript : public SpellScript
+ class spell_dk_improved_blood_presence_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_dk_blood_boil_SpellScript);
+ PrepareAuraScript(spell_dk_improved_blood_presence_AuraScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(DK_SPELL_BLOOD_BOIL_TRIGGERED))
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_PRESENCE) || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED))
return false;
return true;
}
- bool Load()
+ void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
- _executed = false;
- return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCaster()->getClass() == CLASS_DEATH_KNIGHT;
+ Unit* target = GetTarget();
+ if (!target->HasAura(SPELL_DK_BLOOD_PRESENCE) && !target->HasAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED))
+ {
+ int32 basePoints1 = aurEff->GetAmount();
+ target->CastCustomSpell(target, SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED, NULL, &basePoints1, NULL, true, 0, aurEff);
+ }
}
- void HandleAfterHit()
+ void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
- if (_executed || !GetHitUnit())
- return;
-
- _executed = true;
- GetCaster()->CastSpell(GetCaster(), DK_SPELL_BLOOD_BOIL_TRIGGERED, true);
+ Unit* target = GetTarget();
+ if (!target->HasAura(SPELL_DK_BLOOD_PRESENCE))
+ target->RemoveAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED);
}
void Register()
{
- AfterHit += SpellHitFn(spell_dk_blood_boil_SpellScript::HandleAfterHit);
+ AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_blood_presence_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_blood_presence_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
-
- bool _executed;
};
- SpellScript* GetSpellScript() const
+ AuraScript* GetAuraScript() const
{
- return new spell_dk_blood_boil_SpellScript();
+ return new spell_dk_improved_blood_presence_AuraScript();
}
};
-// 52284 - Will of the Necropolis
-class spell_dk_will_of_the_necropolis : public SpellScriptLoader
+// 50391, 50392 - Improved Unholy Presence
+class spell_dk_improved_unholy_presence : public SpellScriptLoader
{
public:
- spell_dk_will_of_the_necropolis() : SpellScriptLoader("spell_dk_will_of_the_necropolis") { }
+ spell_dk_improved_unholy_presence() : SpellScriptLoader("spell_dk_improved_unholy_presence") { }
- class spell_dk_will_of_the_necropolis_AuraScript : public AuraScript
+ class spell_dk_improved_unholy_presence_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_dk_will_of_the_necropolis_AuraScript);
+ PrepareAuraScript(spell_dk_improved_unholy_presence_AuraScript);
- bool Validate(SpellInfo const* spellEntry)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- // can't use other spell than will of the necropolis due to spell_ranks dependency
- if (sSpellMgr->GetFirstSpellInChain(DK_SPELL_WILL_OF_THE_NECROPOLIS_AURA_R1) != sSpellMgr->GetFirstSpellInChain(spellEntry->Id))
- return false;
-
- uint8 rank = sSpellMgr->GetSpellRank(spellEntry->Id);
- if (!sSpellMgr->GetSpellWithRank(DK_SPELL_WILL_OF_THE_NECROPOLIS_TALENT_R1, rank, true))
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_UNHOLY_PRESENCE) || !sSpellMgr->GetSpellInfo(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED))
return false;
-
return true;
}
- uint32 absorbPct;
-
- bool Load()
+ void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
- absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster());
- return true;
+ Unit* target = GetTarget();
+ if (target->HasAura(SPELL_DK_UNHOLY_PRESENCE) && !target->HasAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED))
+ {
+ // Not listed as any effect, only base points set in dbc
+ int32 basePoints0 = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue();
+ target->CastCustomSpell(target, SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED, &basePoints0, &basePoints0, &basePoints0, true, 0, aurEff);
+ }
}
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)
+ void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
- // Set absorbtion amount to unlimited
- amount = -1;
- }
-
- void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount)
- {
- // min pct of hp is stored in effect 0 of talent spell
- uint32 rank = sSpellMgr->GetSpellRank(GetSpellInfo()->Id);
- SpellInfo const* talentProto = sSpellMgr->GetSpellInfo(sSpellMgr->GetSpellWithRank(DK_SPELL_WILL_OF_THE_NECROPOLIS_TALENT_R1, rank));
-
- int32 remainingHp = int32(GetTarget()->GetHealth() - dmgInfo.GetDamage());
- int32 minHp = int32(GetTarget()->CountPctFromMaxHealth(talentProto->Effects[EFFECT_0].CalcValue(GetCaster())));
-
- // Damage that would take you below [effect0] health or taken while you are at [effect0]
- if (remainingHp < minHp)
- absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct);
+ GetTarget()->RemoveAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED);
}
void Register()
{
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_will_of_the_necropolis_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_will_of_the_necropolis_AuraScript::Absorb, EFFECT_0);
+ AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_unholy_presence_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_unholy_presence_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const
{
- return new spell_dk_will_of_the_necropolis_AuraScript();
+ return new spell_dk_improved_unholy_presence_AuraScript();
}
};
-// 50365, 50371 Improved Blood Presence
-class spell_dk_improved_blood_presence : public SpellScriptLoader
+// 59754 Rune Tap - Party
+class spell_dk_rune_tap_party : public SpellScriptLoader
{
-public:
- spell_dk_improved_blood_presence() : SpellScriptLoader("spell_dk_improved_blood_presence") { }
-
- class spell_dk_improved_blood_presence_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_dk_improved_blood_presence_AuraScript);
+ public:
+ spell_dk_rune_tap_party() : SpellScriptLoader("spell_dk_rune_tap_party") { }
- bool Validate(SpellInfo const* /*entry*/)
+ class spell_dk_rune_tap_party_SpellScript : public SpellScript
{
- if (!sSpellMgr->GetSpellInfo(DK_SPELL_BLOOD_PRESENCE) || !sSpellMgr->GetSpellInfo(DK_SPELL_IMPROVED_BLOOD_PRESENCE_TRIGGERED))
- return false;
- return true;
- }
+ PrepareSpellScript(spell_dk_rune_tap_party_SpellScript);
- void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- if (!target->HasAura(DK_SPELL_BLOOD_PRESENCE) && !target->HasAura(DK_SPELL_IMPROVED_BLOOD_PRESENCE_TRIGGERED))
+ void CheckTargets(std::list<WorldObject*>& targets)
{
- int32 basePoints1 = aurEff->GetAmount();
- target->CastCustomSpell(target, DK_SPELL_IMPROVED_BLOOD_PRESENCE_TRIGGERED, NULL, &basePoints1, NULL, true, 0, aurEff);
+ targets.remove(GetCaster());
}
- }
- void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- if (!target->HasAura(DK_SPELL_BLOOD_PRESENCE))
- target->RemoveAura(DK_SPELL_IMPROVED_BLOOD_PRESENCE_TRIGGERED);
- }
-
- void Register()
- {
- AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_blood_presence_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_blood_presence_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_dk_improved_blood_presence_AuraScript();
- }
-};
-
-// 50391, 50392 Improved Unholy Presence
-class spell_dk_improved_unholy_presence : public SpellScriptLoader
-{
-public:
- spell_dk_improved_unholy_presence() : SpellScriptLoader("spell_dk_improved_unholy_presence") { }
-
- class spell_dk_improved_unholy_presence_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_dk_improved_unholy_presence_AuraScript);
-
- bool Validate(SpellInfo const* /*entry*/)
- {
- if (!sSpellMgr->GetSpellInfo(DK_SPELL_UNHOLY_PRESENCE) || !sSpellMgr->GetSpellInfo(DK_SPELL_IMPROVED_UNHOLY_PRESENCE_TRIGGERED))
- return false;
- return true;
- }
-
- void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- if (target->HasAura(DK_SPELL_UNHOLY_PRESENCE) && !target->HasAura(DK_SPELL_IMPROVED_UNHOLY_PRESENCE_TRIGGERED))
+ void Register()
{
- // Not listed as any effect, only base points set in dbc
- int32 basePoints0 = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue();
- target->CastCustomSpell(target, DK_SPELL_IMPROVED_UNHOLY_PRESENCE_TRIGGERED, &basePoints0, &basePoints0, &basePoints0, true, 0, aurEff);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_rune_tap_party_SpellScript::CheckTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY);
}
- }
-
- void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->RemoveAura(DK_SPELL_IMPROVED_UNHOLY_PRESENCE_TRIGGERED);
- }
+ };
- void Register()
+ SpellScript* GetSpellScript() const
{
- AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_unholy_presence_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_unholy_presence_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ return new spell_dk_rune_tap_party_SpellScript();
}
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_dk_improved_unholy_presence_AuraScript();
- }
};
-enum DeathStrike
-{
- ICON_ID_IMPROVED_DEATH_STRIKE = 2751,
- SPELL_DEATH_STRIKE_HEAL = 45470,
-};
-
-class spell_dk_death_strike : public SpellScriptLoader
+// 55090 - Scourge Strike (55265, 55270, 55271)
+class spell_dk_scourge_strike : public SpellScriptLoader
{
public:
- spell_dk_death_strike() : SpellScriptLoader("spell_dk_death_strike") { }
+ spell_dk_scourge_strike() : SpellScriptLoader("spell_dk_scourge_strike") { }
- class spell_dk_death_strike_SpellScript : public SpellScript
+ class spell_dk_scourge_strike_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_dk_death_strike_SpellScript);
+ PrepareSpellScript(spell_dk_scourge_strike_SpellScript);
+ float multiplier;
- bool Validate(SpellInfo const* /*SpellEntry*/)
+ bool Load()
{
- if (!sSpellMgr->GetSpellInfo(SPELL_DEATH_STRIKE_HEAL))
+ multiplier = 1.0f;
+ return true;
+ }
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_SCOURGE_STRIKE_TRIGGERED))
return false;
return true;
}
- void HandleDummy(SpellEffIndex /* effIndex */)
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
- if (Unit* target = GetHitUnit())
+ if (Unit* unitTarget = GetHitUnit())
{
- uint32 count = target->GetDiseasesByCaster(caster->GetGUID());
- int32 bp = int32(count * caster->CountPctFromMaxHealth(int32(GetSpellInfo()->Effects[EFFECT_0].DamageMultiplier)));
- // Improved Death Strike
- if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DEATHKNIGHT, ICON_ID_IMPROVED_DEATH_STRIKE, 0))
- AddPct(bp, caster->CalculateSpellDamage(caster, aurEff->GetSpellInfo(), 2));
- caster->CastCustomSpell(caster, SPELL_DEATH_STRIKE_HEAL, &bp, NULL, NULL, false);
+ multiplier = (GetEffectValue() * unitTarget->GetDiseasesByCaster(caster->GetGUID()) / 100.f);
+ // Death Knight T8 Melee 4P Bonus
+ if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_DK_ITEM_T8_MELEE_4P_BONUS, EFFECT_0))
+ AddPct(multiplier, aurEff->GetAmount());
}
}
- void Register()
+ void HandleAfterHit()
{
- OnEffectHitTarget += SpellEffectFn(spell_dk_death_strike_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY);
+ Unit* caster = GetCaster();
+ if (Unit* unitTarget = GetHitUnit())
+ {
+ int32 bp = GetHitDamage() * multiplier;
+
+ if (AuraEffect* aurEff = caster->GetAuraEffectOfRankedSpell(SPELL_DK_BLACK_ICE_R1, EFFECT_0))
+ AddPct(bp, aurEff->GetAmount());
+
+ caster->CastCustomSpell(unitTarget, SPELL_DK_SCOURGE_STRIKE_TRIGGERED, &bp, NULL, NULL, true);
+ }
}
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_dk_scourge_strike_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY);
+ AfterHit += SpellHitFn(spell_dk_scourge_strike_SpellScript::HandleAfterHit);
+ }
};
SpellScript* GetSpellScript() const
{
- return new spell_dk_death_strike_SpellScript();
+ return new spell_dk_scourge_strike_SpellScript();
}
};
-enum DeathCoil
-{
- SPELL_DEATH_COIL_DAMAGE = 47632,
- SPELL_DEATH_COIL_HEAL = 47633,
- SPELL_SIGIL_VENGEFUL_HEART = 64962,
-};
-
-class spell_dk_death_coil : public SpellScriptLoader
+// 49145 - Spell Deflection
+class spell_dk_spell_deflection : public SpellScriptLoader
{
public:
- spell_dk_death_coil() : SpellScriptLoader("spell_dk_death_coil") { }
+ spell_dk_spell_deflection() : SpellScriptLoader("spell_dk_spell_deflection") { }
- class spell_dk_death_coil_SpellScript : public SpellScript
+ class spell_dk_spell_deflection_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_dk_death_coil_SpellScript);
+ PrepareAuraScript(spell_dk_spell_deflection_AuraScript);
- bool Validate(SpellInfo const* /*spell*/)
+ uint32 absorbPct;
+
+ bool Load()
{
- if (!sSpellMgr->GetSpellInfo(SPELL_DEATH_COIL_DAMAGE) || !sSpellMgr->GetSpellInfo(SPELL_DEATH_COIL_HEAL))
- return false;
+ absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster());
return true;
}
- void HandleDummy(SpellEffIndex /*effIndex*/)
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)
{
- int32 damage = GetEffectValue();
- Unit* caster = GetCaster();
- if (Unit* target = GetHitUnit())
- {
- if (caster->IsFriendlyTo(target))
- {
- int32 bp = int32(damage * 1.5f);
- caster->CastCustomSpell(target, SPELL_DEATH_COIL_HEAL, &bp, NULL, NULL, true);
- }
- else
- {
- if (AuraEffect const* auraEffect = caster->GetAuraEffect(SPELL_SIGIL_VENGEFUL_HEART, EFFECT_1))
- damage += auraEffect->GetBaseAmount();
- caster->CastCustomSpell(target, SPELL_DEATH_COIL_DAMAGE, &damage, NULL, NULL, true);
- }
- }
+ // Set absorbtion amount to unlimited
+ amount = -1;
}
- SpellCastResult CheckCast()
+ void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount)
{
- Unit* caster = GetCaster();
- if (Unit* target = GetExplTargetUnit())
- {
- if (!caster->IsFriendlyTo(target) && !caster->isInFront(target))
- return SPELL_FAILED_UNIT_NOT_INFRONT;
+ // You have a chance equal to your Parry chance
+ if ((dmgInfo.GetDamageType() == SPELL_DIRECT_DAMAGE) && roll_chance_f(GetTarget()->GetUnitParryChance()))
+ absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct);
+ }
- if (target->IsFriendlyTo(caster) && target->GetCreatureType() != CREATURE_TYPE_UNDEAD)
- return SPELL_FAILED_BAD_TARGETS;
- }
- else
- return SPELL_FAILED_BAD_TARGETS;
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_spell_deflection_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
+ OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_spell_deflection_AuraScript::Absorb, EFFECT_0);
+ }
+ };
- return SPELL_CAST_OK;
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dk_spell_deflection_AuraScript();
+ }
+};
+
+// 55233 - Vampiric Blood
+class spell_dk_vampiric_blood : public SpellScriptLoader
+{
+ public:
+ spell_dk_vampiric_blood() : SpellScriptLoader("spell_dk_vampiric_blood") { }
+
+ class spell_dk_vampiric_blood_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dk_vampiric_blood_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ amount = GetUnitOwner()->CountPctFromMaxHealth(amount);
}
void Register()
{
- OnCheckCast += SpellCheckCastFn(spell_dk_death_coil_SpellScript::CheckCast);
- OnEffectHitTarget += SpellEffectFn(spell_dk_death_coil_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_vampiric_blood_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_HEALTH);
}
-
};
- SpellScript* GetSpellScript() const
+ AuraScript* GetAuraScript() const
{
- return new spell_dk_death_coil_SpellScript();
+ return new spell_dk_vampiric_blood_AuraScript();
}
};
-class spell_dk_death_grip : public SpellScriptLoader
+// 52284 - Will of the Necropolis
+class spell_dk_will_of_the_necropolis : public SpellScriptLoader
{
public:
- spell_dk_death_grip() : SpellScriptLoader("spell_dk_death_grip") { }
+ spell_dk_will_of_the_necropolis() : SpellScriptLoader("spell_dk_will_of_the_necropolis") { }
- class spell_dk_death_grip_SpellScript : public SpellScript
+ class spell_dk_will_of_the_necropolis_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_dk_death_grip_SpellScript);
+ PrepareAuraScript(spell_dk_will_of_the_necropolis_AuraScript);
- void HandleDummy(SpellEffIndex /*effIndex*/)
+ bool Validate(SpellInfo const* spellInfo)
{
- int32 damage = GetEffectValue();
- Position const* pos = GetExplTargetDest();
- if (Unit* target = GetHitUnit())
- {
- if (!target->HasAuraType(SPELL_AURA_DEFLECT_SPELLS)) // Deterrence
- target->CastSpell(pos->GetPositionX(), pos->GetPositionY(), pos->GetPositionZ(), damage, true);
- }
+ // can't use other spell than will of the necropolis due to spell_ranks dependency
+ if (sSpellMgr->GetFirstSpellInChain(SPELL_DK_WILL_OF_THE_NECROPOLIS_AURA_R1) != sSpellMgr->GetFirstSpellInChain(spellInfo->Id))
+ return false;
+
+ uint8 rank = sSpellMgr->GetSpellRank(spellInfo->Id);
+ if (!sSpellMgr->GetSpellWithRank(SPELL_DK_WILL_OF_THE_NECROPOLIS_TALENT_R1, rank, true))
+ return false;
+
+ return true;
}
- void Register()
+ uint32 absorbPct;
+
+ bool Load()
{
- OnEffectHitTarget += SpellEffectFn(spell_dk_death_grip_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster());
+ return true;
+ }
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)
+ {
+ // Set absorbtion amount to unlimited
+ amount = -1;
+ }
+
+ void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount)
+ {
+ // min pct of hp is stored in effect 0 of talent spell
+ uint32 rank = sSpellMgr->GetSpellRank(GetSpellInfo()->Id);
+ SpellInfo const* talentProto = sSpellMgr->GetSpellInfo(sSpellMgr->GetSpellWithRank(SPELL_DK_WILL_OF_THE_NECROPOLIS_TALENT_R1, rank));
+
+ int32 remainingHp = int32(GetTarget()->GetHealth() - dmgInfo.GetDamage());
+ int32 minHp = int32(GetTarget()->CountPctFromMaxHealth(talentProto->Effects[EFFECT_0].CalcValue(GetCaster())));
+
+ // Damage that would take you below [effect0] health or taken while you are at [effect0]
+ if (remainingHp < minHp)
+ absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct);
}
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_will_of_the_necropolis_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
+ OnEffectAbsorb += AuraEffectAbsorbFn(spell_dk_will_of_the_necropolis_AuraScript::Absorb, EFFECT_0);
+ }
};
- SpellScript* GetSpellScript() const
+ AuraScript* GetAuraScript() const
{
- return new spell_dk_death_grip_SpellScript();
+ return new spell_dk_will_of_the_necropolis_AuraScript();
}
};
@@ -853,17 +1010,21 @@ void AddSC_deathknight_spell_scripts()
new spell_dk_anti_magic_shell_raid();
new spell_dk_anti_magic_shell_self();
new spell_dk_anti_magic_zone();
+ new spell_dk_blood_boil();
+ new spell_dk_blood_gorged();
new spell_dk_corpse_explosion();
- new spell_dk_ghoul_explode();
+ new spell_dk_death_coil();
new spell_dk_death_gate();
+ new spell_dk_death_grip();
new spell_dk_death_pact();
+ new spell_dk_death_strike();
+ new spell_dk_ghoul_explode();
+ new spell_dk_icebound_fortitude();
+ new spell_dk_improved_blood_presence();
+ new spell_dk_improved_unholy_presence();
+ new spell_dk_rune_tap_party();
new spell_dk_scourge_strike();
new spell_dk_spell_deflection();
- new spell_dk_blood_boil();
+ new spell_dk_vampiric_blood();
new spell_dk_will_of_the_necropolis();
- new spell_dk_improved_blood_presence();
- new spell_dk_improved_unholy_presence();
- new spell_dk_death_strike();
- new spell_dk_death_coil();
- new spell_dk_death_grip();
}
diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp
index a0307f994c9..160f14ff670 100644
--- a/src/server/scripts/Spells/spell_druid.cpp
+++ b/src/server/scripts/Spells/spell_druid.cpp
@@ -29,18 +29,53 @@
enum DruidSpells
{
- DRUID_INCREASED_MOONFIRE_DURATION = 38414,
- DRUID_NATURES_SPLENDOR = 57865,
- DRUID_LIFEBLOOM_FINAL_HEAL = 33778,
- DRUID_LIFEBLOOM_ENERGIZE = 64372,
- DRUID_SURVIVAL_INSTINCTS = 50322,
- DRUID_SAVAGE_ROAR = 62071,
- SPELL_DRUID_ITEM_T8_BALANCE_RELIC = 64950,
- SPELL_KING_OF_THE_JUNGLE = 48492,
- SPELL_TIGER_S_FURY_ENERGIZE = 51178,
- SPELL_ENRAGE_MOD_DAMAGE = 51185,
+ SPELL_DRUID_ENRAGE_MOD_DAMAGE = 51185,
+ SPELL_DRUID_GLYPH_OF_TYPHOON = 62135,
+ SPELL_DRUID_IDOL_OF_FERAL_SHADOWS = 34241,
+ SPELL_DRUID_IDOL_OF_WORSHIP = 60774,
+ SPELL_DRUID_INCREASED_MOONFIRE_DURATION = 38414,
+ SPELL_DRUID_KING_OF_THE_JUNGLE = 48492,
+ SPELL_DRUID_LIFEBLOOM_ENERGIZE = 64372,
+ SPELL_DRUID_LIFEBLOOM_FINAL_HEAL = 33778,
+ SPELL_DRUID_LIVING_SEED_HEAL = 48503,
+ SPELL_DRUID_LIVING_SEED_PROC = 48504,
+ SPELL_DRUID_NATURES_SPLENDOR = 57865,
+ SPELL_DRUID_SURVIVAL_INSTINCTS = 50322,
+ SPELL_DRUID_SAVAGE_ROAR = 62071,
+ SPELL_DRUID_TIGER_S_FURY_ENERGIZE = 51178,
+ SPELL_DRUID_ITEM_T8_BALANCE_RELIC = 64950,
};
+// -1850 - Dash
+class spell_dru_dash : public SpellScriptLoader
+{
+ public:
+ spell_dru_dash() : SpellScriptLoader("spell_dru_dash") { }
+
+ class spell_dru_dash_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_dash_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ // do not set speed if not in cat form
+ if (GetUnitOwner()->GetShapeshiftForm() != FORM_CAT)
+ amount = 0;
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_dash_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_INCREASE_SPEED);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_dash_AuraScript();
+ }
+};
+
+// -5229 - Enrage
class spell_dru_enrage : public SpellScriptLoader
{
public:
@@ -52,8 +87,8 @@ class spell_dru_enrage : public SpellScriptLoader
void OnHit()
{
- if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffectOfRankedSpell(SPELL_KING_OF_THE_JUNGLE, EFFECT_0))
- GetHitUnit()->CastCustomSpell(SPELL_ENRAGE_MOD_DAMAGE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetHitUnit(), true);
+ if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffectOfRankedSpell(SPELL_DRUID_KING_OF_THE_JUNGLE, EFFECT_0))
+ GetHitUnit()->CastCustomSpell(SPELL_DRUID_ENRAGE_MOD_DAMAGE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetHitUnit(), true);
}
void Register()
@@ -68,7 +103,7 @@ class spell_dru_enrage : public SpellScriptLoader
}
};
-// 54846 Glyph of Starfire
+// 54846 - Glyph of Starfire
class spell_dru_glyph_of_starfire : public SpellScriptLoader
{
public:
@@ -78,9 +113,9 @@ class spell_dru_glyph_of_starfire : public SpellScriptLoader
{
PrepareSpellScript(spell_dru_glyph_of_starfire_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(DRUID_INCREASED_MOONFIRE_DURATION) || !sSpellMgr->GetSpellInfo(DRUID_NATURES_SPLENDOR))
+ if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_INCREASED_MOONFIRE_DURATION) || !sSpellMgr->GetSpellInfo(SPELL_DRUID_NATURES_SPLENDOR))
return false;
return true;
}
@@ -95,9 +130,9 @@ class spell_dru_glyph_of_starfire : public SpellScriptLoader
uint32 countMin = aura->GetMaxDuration();
uint32 countMax = aura->GetSpellInfo()->GetMaxDuration() + 9000;
- if (caster->HasAura(DRUID_INCREASED_MOONFIRE_DURATION))
+ if (caster->HasAura(SPELL_DRUID_INCREASED_MOONFIRE_DURATION))
countMax += 3000;
- if (caster->HasAura(DRUID_NATURES_SPLENDOR))
+ if (caster->HasAura(SPELL_DRUID_NATURES_SPLENDOR))
countMax += 3000;
if (countMin < countMax)
@@ -120,6 +155,70 @@ class spell_dru_glyph_of_starfire : public SpellScriptLoader
}
};
+// 34246 - Idol of the Emerald Queen
+// 60779 - Idol of Lush Moss
+class spell_dru_idol_lifebloom : public SpellScriptLoader
+{
+ public:
+ spell_dru_idol_lifebloom() : SpellScriptLoader("spell_dru_idol_lifebloom") { }
+
+ class spell_dru_idol_lifebloom_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_idol_lifebloom_AuraScript);
+
+ void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod)
+ {
+ if (!spellMod)
+ {
+ spellMod = new SpellModifier(GetAura());
+ spellMod->op = SPELLMOD_DOT;
+ spellMod->type = SPELLMOD_FLAT;
+ spellMod->spellId = GetId();
+ spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask;
+ }
+ spellMod->value = aurEff->GetAmount() / 7;
+ }
+
+ void Register()
+ {
+ DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_dru_idol_lifebloom_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_idol_lifebloom_AuraScript();
+ }
+};
+
+// 29166 - Innervate
+class spell_dru_innervate : public SpellScriptLoader
+{
+ public:
+ spell_dru_innervate() : SpellScriptLoader("spell_dru_innervate") { }
+
+ class spell_dru_innervate_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_innervate_AuraScript);
+
+ void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ amount = CalculatePct(int32(GetUnitOwner()->GetCreatePowers(POWER_MANA) / aurEff->GetTotalTicks()), amount);
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_innervate_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_innervate_AuraScript();
+ }
+};
+
+// -5570 - Insect Swarm
class spell_dru_insect_swarm : public SpellScriptLoader
{
public:
@@ -148,6 +247,7 @@ class spell_dru_insect_swarm : public SpellScriptLoader
}
};
+// -33763 - Lifebloom
class spell_dru_lifebloom : public SpellScriptLoader
{
public:
@@ -159,9 +259,9 @@ class spell_dru_lifebloom : public SpellScriptLoader
bool Validate(SpellInfo const* /*spell*/)
{
- if (!sSpellMgr->GetSpellInfo(DRUID_LIFEBLOOM_FINAL_HEAL))
+ if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_LIFEBLOOM_FINAL_HEAL))
return false;
- if (!sSpellMgr->GetSpellInfo(DRUID_LIFEBLOOM_ENERGIZE))
+ if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_LIFEBLOOM_ENERGIZE))
return false;
return true;
}
@@ -180,15 +280,15 @@ class spell_dru_lifebloom : public SpellScriptLoader
healAmount = caster->SpellHealingBonusDone(GetTarget(), GetSpellInfo(), healAmount, HEAL, stack);
healAmount = GetTarget()->SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, HEAL, stack);
- GetTarget()->CastCustomSpell(GetTarget(), DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, aurEff, GetCasterGUID());
+ GetTarget()->CastCustomSpell(GetTarget(), SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, aurEff, GetCasterGUID());
// restore mana
int32 returnMana = CalculatePct(caster->GetCreateMana(), GetSpellInfo()->ManaCostPercentage) * stack / 2;
- caster->CastCustomSpell(caster, DRUID_LIFEBLOOM_ENERGIZE, &returnMana, NULL, NULL, true, NULL, aurEff, GetCasterGUID());
+ caster->CastCustomSpell(caster, SPELL_DRUID_LIFEBLOOM_ENERGIZE, &returnMana, NULL, NULL, true, NULL, aurEff, GetCasterGUID());
return;
}
- GetTarget()->CastCustomSpell(GetTarget(), DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, aurEff, GetCasterGUID());
+ GetTarget()->CastCustomSpell(GetTarget(), SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, aurEff, GetCasterGUID());
}
void HandleDispel(DispelInfo* dispelInfo)
@@ -203,15 +303,15 @@ class spell_dru_lifebloom : public SpellScriptLoader
{
healAmount = caster->SpellHealingBonusDone(target, GetSpellInfo(), healAmount, HEAL, dispelInfo->GetRemovedCharges());
healAmount = target->SpellHealingBonusTaken(caster, GetSpellInfo(), healAmount, HEAL, dispelInfo->GetRemovedCharges());
- target->CastCustomSpell(target, DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, NULL, GetCasterGUID());
+ target->CastCustomSpell(target, SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, NULL, GetCasterGUID());
// restore mana
int32 returnMana = CalculatePct(caster->GetCreateMana(), GetSpellInfo()->ManaCostPercentage) * dispelInfo->GetRemovedCharges() / 2;
- caster->CastCustomSpell(caster, DRUID_LIFEBLOOM_ENERGIZE, &returnMana, NULL, NULL, true, NULL, NULL, GetCasterGUID());
+ caster->CastCustomSpell(caster, SPELL_DRUID_LIFEBLOOM_ENERGIZE, &returnMana, NULL, NULL, true, NULL, NULL, GetCasterGUID());
return;
}
- target->CastCustomSpell(target, DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, NULL, GetCasterGUID());
+ target->CastCustomSpell(target, SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, &healAmount, NULL, NULL, true, NULL, NULL, GetCasterGUID());
}
}
}
@@ -229,6 +329,77 @@ class spell_dru_lifebloom : public SpellScriptLoader
}
};
+// -48496 - Living Seed
+class spell_dru_living_seed : public SpellScriptLoader
+{
+ public:
+ spell_dru_living_seed() : SpellScriptLoader("spell_dru_living_seed") { }
+
+ class spell_dru_living_seed_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_living_seed_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_LIVING_SEED_PROC))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 amount = CalculatePct(eventInfo.GetHealInfo()->GetHeal(), aurEff->GetAmount());
+ GetTarget()->CastCustomSpell(SPELL_DRUID_LIVING_SEED_PROC, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_dru_living_seed_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_living_seed_AuraScript();
+ }
+};
+
+// 48504 - Living Seed (Proc)
+class spell_dru_living_seed_proc : public SpellScriptLoader
+{
+ public:
+ spell_dru_living_seed_proc() : SpellScriptLoader("spell_dru_living_seed_proc") { }
+
+ class spell_dru_living_seed_proc_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_living_seed_proc_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_LIVING_SEED_HEAL))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastCustomSpell(SPELL_DRUID_LIVING_SEED_HEAL, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_dru_living_seed_proc_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_living_seed_proc_AuraScript();
+ }
+};
+
// 69366 - Moonkin Form passive
class spell_dru_moonkin_form_passive : public SpellScriptLoader
{
@@ -273,6 +444,34 @@ class spell_dru_moonkin_form_passive : public SpellScriptLoader
}
};
+// 48391 - Owlkin Frenzy
+class spell_dru_owlkin_frenzy : public SpellScriptLoader
+{
+ public:
+ spell_dru_owlkin_frenzy() : SpellScriptLoader("spell_dru_owlkin_frenzy") { }
+
+ class spell_dru_owlkin_frenzy_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_owlkin_frenzy_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ amount = CalculatePct(GetUnitOwner()->GetCreatePowers(POWER_MANA), amount);
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_owlkin_frenzy_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_PERIODIC_ENERGIZE);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_owlkin_frenzy_AuraScript();
+ }
+};
+
+// -16972 - Predatory Strikes
class spell_dru_predatory_strikes : public SpellScriptLoader
{
public:
@@ -345,6 +544,54 @@ class spell_dru_primal_tenacity : public SpellScriptLoader
}
};
+// -1079 - Rip
+class spell_dru_rip : public SpellScriptLoader
+{
+ public:
+ spell_dru_rip() : SpellScriptLoader("spell_dru_rip") { }
+
+ class spell_dru_rip_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_rip_AuraScript);
+
+ bool Load()
+ {
+ Unit* caster = GetCaster();
+ return caster && caster->GetTypeId() == TYPEID_PLAYER;
+ }
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = false;
+
+ if (Unit* caster = GetCaster())
+ {
+ // 0.01 * $AP * cp
+ uint8 cp = caster->ToPlayer()->GetComboPoints();
+
+ // Idol of Feral Shadows. Can't be handled as SpellMod due its dependency from CPs
+ if (AuraEffect const* idol = caster->GetAuraEffect(SPELL_DRUID_IDOL_OF_FERAL_SHADOWS, EFFECT_0))
+ amount += cp * idol->GetAmount();
+ // Idol of Worship. Can't be handled as SpellMod due its dependency from CPs
+ else if (AuraEffect const* idol = caster->GetAuraEffect(SPELL_DRUID_IDOL_OF_WORSHIP, EFFECT_0))
+ amount += cp * idol->GetAmount();
+
+ amount += int32(CalculatePct(caster->GetTotalAttackPowerValue(BASE_ATTACK), cp));
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_rip_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_rip_AuraScript();
+ }
+};
+
// 62606 - Savage Defense
class spell_dru_savage_defense : public SpellScriptLoader
{
@@ -388,6 +635,7 @@ class spell_dru_savage_defense : public SpellScriptLoader
}
};
+// 52610 - Savage Roar
class spell_dru_savage_roar : public SpellScriptLoader
{
public:
@@ -418,7 +666,7 @@ class spell_dru_savage_roar : public SpellScriptLoader
bool Validate(SpellInfo const* /*spell*/)
{
- if (!sSpellMgr->GetSpellInfo(DRUID_SAVAGE_ROAR))
+ if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_SAVAGE_ROAR))
return false;
return true;
}
@@ -426,12 +674,12 @@ class spell_dru_savage_roar : public SpellScriptLoader
void AfterApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
Unit* target = GetTarget();
- target->CastSpell(target, DRUID_SAVAGE_ROAR, true, NULL, aurEff, GetCasterGUID());
+ target->CastSpell(target, SPELL_DRUID_SAVAGE_ROAR, true, NULL, aurEff, GetCasterGUID());
}
void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
- GetTarget()->RemoveAurasDueToSpell(DRUID_SAVAGE_ROAR);
+ GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_SAVAGE_ROAR);
}
void Register()
@@ -452,6 +700,7 @@ class spell_dru_savage_roar : public SpellScriptLoader
}
};
+// -50294 - Starfall (AOE)
class spell_dru_starfall_aoe : public SpellScriptLoader
{
public:
@@ -478,6 +727,7 @@ class spell_dru_starfall_aoe : public SpellScriptLoader
}
};
+// -50286 - Starfall (Dummy)
class spell_dru_starfall_dummy : public SpellScriptLoader
{
public:
@@ -523,6 +773,7 @@ class spell_dru_starfall_dummy : public SpellScriptLoader
}
};
+// 61336 - Survival Instincts
class spell_dru_survival_instincts : public SpellScriptLoader
{
public:
@@ -553,7 +804,7 @@ class spell_dru_survival_instincts : public SpellScriptLoader
bool Validate(SpellInfo const* /*spell*/)
{
- if (!sSpellMgr->GetSpellInfo(DRUID_SURVIVAL_INSTINCTS))
+ if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_SURVIVAL_INSTINCTS))
return false;
return true;
}
@@ -562,12 +813,12 @@ class spell_dru_survival_instincts : public SpellScriptLoader
{
Unit* target = GetTarget();
int32 bp0 = target->CountPctFromMaxHealth(aurEff->GetAmount());
- target->CastCustomSpell(target, DRUID_SURVIVAL_INSTINCTS, &bp0, NULL, NULL, true);
+ target->CastCustomSpell(target, SPELL_DRUID_SURVIVAL_INSTINCTS, &bp0, NULL, NULL, true);
}
void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
- GetTarget()->RemoveAurasDueToSpell(DRUID_SURVIVAL_INSTINCTS);
+ GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_SURVIVAL_INSTINCTS);
}
void Register()
@@ -622,6 +873,7 @@ class spell_dru_swift_flight_passive : public SpellScriptLoader
}
};
+// -5217 - Tiger's Fury
class spell_dru_tiger_s_fury : public SpellScriptLoader
{
public:
@@ -633,8 +885,8 @@ class spell_dru_tiger_s_fury : public SpellScriptLoader
void OnHit()
{
- if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffectOfRankedSpell(SPELL_KING_OF_THE_JUNGLE, EFFECT_1))
- GetHitUnit()->CastCustomSpell(SPELL_TIGER_S_FURY_ENERGIZE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetHitUnit(), true);
+ if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffectOfRankedSpell(SPELL_DRUID_KING_OF_THE_JUNGLE, EFFECT_1))
+ GetHitUnit()->CastCustomSpell(SPELL_DRUID_TIGER_S_FURY_ENERGIZE, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetHitUnit(), true);
}
void Register()
@@ -649,6 +901,36 @@ class spell_dru_tiger_s_fury : public SpellScriptLoader
}
};
+// -61391 - Typhoon
+class spell_dru_typhoon : public SpellScriptLoader
+{
+ public:
+ spell_dru_typhoon() : SpellScriptLoader("spell_dru_typhoon") { }
+
+ class spell_dru_typhoon_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_dru_typhoon_SpellScript);
+
+ void HandleKnockBack(SpellEffIndex effIndex)
+ {
+ // Glyph of Typhoon
+ if (GetCaster()->HasAura(SPELL_DRUID_GLYPH_OF_TYPHOON))
+ PreventHitDefaultEffect(effIndex);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_dru_typhoon_SpellScript::HandleKnockBack, EFFECT_0, SPELL_EFFECT_KNOCK_BACK);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_dru_typhoon_SpellScript();
+ }
+};
+
+// 70691 - Item T10 Restoration 4P Bonus
class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader
{
public:
@@ -705,13 +987,20 @@ class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader
void AddSC_druid_spell_scripts()
{
+ new spell_dru_dash();
new spell_dru_enrage();
new spell_dru_glyph_of_starfire();
+ new spell_dru_idol_lifebloom();
+ new spell_dru_innervate();
new spell_dru_insect_swarm();
new spell_dru_lifebloom();
+ new spell_dru_living_seed();
+ new spell_dru_living_seed_proc();
new spell_dru_moonkin_form_passive();
+ new spell_dru_owlkin_frenzy();
new spell_dru_predatory_strikes();
new spell_dru_primal_tenacity();
+ new spell_dru_rip();
new spell_dru_savage_defense();
new spell_dru_savage_roar();
new spell_dru_starfall_aoe();
@@ -719,5 +1008,6 @@ void AddSC_druid_spell_scripts()
new spell_dru_survival_instincts();
new spell_dru_swift_flight_passive();
new spell_dru_tiger_s_fury();
+ new spell_dru_typhoon();
new spell_dru_t10_restoration_4p_bonus();
}
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 4a1b0d558ff..00b504d2403 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -72,6 +72,97 @@ class spell_gen_absorb0_hitlimit1 : public SpellScriptLoader
}
};
+// 28764 - Adaptive Warding (Frostfire Regalia Set)
+enum AdaptiveWarding
+{
+ SPELL_GEN_ADAPTIVE_WARDING_FIRE = 28765,
+ SPELL_GEN_ADAPTIVE_WARDING_NATURE = 28768,
+ SPELL_GEN_ADAPTIVE_WARDING_FROST = 28766,
+ SPELL_GEN_ADAPTIVE_WARDING_SHADOW = 28769,
+ SPELL_GEN_ADAPTIVE_WARDING_ARCANE = 28770
+};
+
+class spell_gen_adaptive_warding : public SpellScriptLoader
+{
+ public:
+ spell_gen_adaptive_warding() : SpellScriptLoader("spell_gen_adaptive_warding") { }
+
+ class spell_gen_adaptive_warding_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_gen_adaptive_warding_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_FIRE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_NATURE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_FROST) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_SHADOW) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_ARCANE))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (eventInfo.GetDamageInfo()->GetSpellInfo()) // eventInfo.GetSpellInfo()
+ return false;
+
+ // find Mage Armor
+ if (!GetTarget()->GetAuraEffect(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT, SPELLFAMILY_MAGE, 0x10000000, 0x0, 0x0))
+ return false;
+
+ switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask()))
+ {
+ case SPELL_SCHOOL_NORMAL:
+ case SPELL_SCHOOL_HOLY:
+ return false;
+ default:
+ break;
+ }
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ uint32 spellId = 0;
+ switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask()))
+ {
+ case SPELL_SCHOOL_FIRE:
+ spellId = SPELL_GEN_ADAPTIVE_WARDING_FIRE;
+ break;
+ case SPELL_SCHOOL_NATURE:
+ spellId = SPELL_GEN_ADAPTIVE_WARDING_NATURE;
+ break;
+ case SPELL_SCHOOL_FROST:
+ spellId = SPELL_GEN_ADAPTIVE_WARDING_FROST;
+ break;
+ case SPELL_SCHOOL_SHADOW:
+ spellId = SPELL_GEN_ADAPTIVE_WARDING_SHADOW;
+ break;
+ case SPELL_SCHOOL_ARCANE:
+ spellId = SPELL_GEN_ADAPTIVE_WARDING_ARCANE;
+ break;
+ default:
+ return;
+ }
+ GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_gen_adaptive_warding_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_gen_adaptive_warding_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_gen_adaptive_warding_AuraScript();
+ }
+};
+
// 41337 Aura of Anger
class spell_gen_aura_of_anger : public SpellScriptLoader
{
@@ -226,6 +317,245 @@ class spell_gen_cannibalize : public SpellScriptLoader
}
};
+// 63845 - Create Lance
+enum CreateLanceSpells
+{
+ SPELL_CREATE_LANCE_ALLIANCE = 63914,
+ SPELL_CREATE_LANCE_HORDE = 63919
+};
+
+class spell_gen_create_lance : public SpellScriptLoader
+{
+ public:
+ spell_gen_create_lance() : SpellScriptLoader("spell_gen_create_lance") { }
+
+ class spell_gen_create_lance_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_create_lance_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_ALLIANCE) || !sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_HORDE))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ if (Player* target = GetHitPlayer())
+ {
+ if (target->GetTeam() == ALLIANCE)
+ GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_ALLIANCE, true);
+ else
+ GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_HORDE, true);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_create_lance_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_create_lance_SpellScript();
+ }
+};
+
+// 28702 - Netherbloom
+enum Netherbloom
+{
+ SPELL_NETHERBLOOM_POLLEN_1 = 28703
+};
+
+class spell_gen_netherbloom : public SpellScriptLoader
+{
+ public:
+ spell_gen_netherbloom() : SpellScriptLoader("spell_gen_netherbloom") { }
+
+ class spell_gen_netherbloom_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_netherbloom_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ for (uint8 i = 0; i < 5; ++i)
+ if (!sSpellMgr->GetSpellInfo(SPELL_NETHERBLOOM_POLLEN_1 + i))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ if (Unit* target = GetHitUnit())
+ {
+ // 25% chance of casting a random buff
+ if (roll_chance_i(75))
+ return;
+
+ // triggered spells are 28703 to 28707
+ // Note: some sources say, that there was the possibility of
+ // receiving a debuff. However, this seems to be removed by a patch.
+
+ // don't overwrite an existing aura
+ for (uint8 i = 0; i < 5; ++i)
+ if (target->HasAura(SPELL_NETHERBLOOM_POLLEN_1 + i))
+ return;
+
+ target->CastSpell(target, SPELL_NETHERBLOOM_POLLEN_1 + urand(0, 4), true);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_netherbloom_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_netherbloom_SpellScript();
+ }
+};
+
+// 28720 - Nightmare Vine
+enum NightmareVine
+{
+ SPELL_NIGHTMARE_POLLEN = 28721
+};
+
+class spell_gen_nightmare_vine : public SpellScriptLoader
+{
+ public:
+ spell_gen_nightmare_vine() : SpellScriptLoader("spell_gen_nightmare_vine") { }
+
+ class spell_gen_nightmare_vine_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_nightmare_vine_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_NIGHTMARE_POLLEN))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ if (Unit* target = GetHitUnit())
+ {
+ // 25% chance of casting Nightmare Pollen
+ if (roll_chance_i(25))
+ target->CastSpell(target, SPELL_NIGHTMARE_POLLEN, true);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_nightmare_vine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_nightmare_vine_SpellScript();
+ }
+};
+
+// 27539 - Obsidian Armor
+enum ObsidianArmor
+{
+ SPELL_GEN_OBSIDIAN_ARMOR_HOLY = 27536,
+ SPELL_GEN_OBSIDIAN_ARMOR_FIRE = 27533,
+ SPELL_GEN_OBSIDIAN_ARMOR_NATURE = 27538,
+ SPELL_GEN_OBSIDIAN_ARMOR_FROST = 27534,
+ SPELL_GEN_OBSIDIAN_ARMOR_SHADOW = 27535,
+ SPELL_GEN_OBSIDIAN_ARMOR_ARCANE = 27540
+};
+
+class spell_gen_obsidian_armor : public SpellScriptLoader
+{
+ public:
+ spell_gen_obsidian_armor() : SpellScriptLoader("spell_gen_obsidian_armor") { }
+
+ class spell_gen_obsidian_armor_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_gen_obsidian_armor_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_HOLY) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_FIRE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_NATURE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_FROST) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_SHADOW) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_ARCANE))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (eventInfo.GetDamageInfo()->GetSpellInfo()) // eventInfo.GetSpellInfo()
+ return false;
+
+ if (GetFirstSchoolInMask(eventInfo.GetSchoolMask()) == SPELL_SCHOOL_NORMAL)
+ return false;
+
+ return true;
+ }
+
+ void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ uint32 spellId = 0;
+ switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask()))
+ {
+ case SPELL_SCHOOL_HOLY:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_HOLY;
+ break;
+ case SPELL_SCHOOL_FIRE:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_FIRE;
+ break;
+ case SPELL_SCHOOL_NATURE:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_NATURE;
+ break;
+ case SPELL_SCHOOL_FROST:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_FROST;
+ break;
+ case SPELL_SCHOOL_SHADOW:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_SHADOW;
+ break;
+ case SPELL_SCHOOL_ARCANE:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_ARCANE;
+ break;
+ default:
+ return;
+ }
+ GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_gen_obsidian_armor_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_gen_obsidian_armor_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_gen_obsidian_armor_AuraScript();
+ }
+};
+
// 45472 Parachute
enum ParachuteSpells
{
@@ -1242,7 +1572,7 @@ class spell_gen_vehicle_scaling : public SpellScriptLoader
float factor;
uint16 baseItemLevel;
- // TODO: Reserach coeffs for different vehicles
+ /// @todo Reserach coeffs for different vehicles
switch (GetId())
{
case SPELL_GEAR_SCALING:
@@ -1257,7 +1587,7 @@ class spell_gen_vehicle_scaling : public SpellScriptLoader
float avgILvl = caster->ToPlayer()->GetAverageItemLevel();
if (avgILvl < baseItemLevel)
- return; // TODO: Research possibility of scaling down
+ return; /// @todo Research possibility of scaling down
amount = uint16((avgILvl - baseItemLevel) * factor);
}
@@ -1377,68 +1707,6 @@ class spell_gen_damage_reduction_aura : public SpellScriptLoader
}
};
-class spell_gen_luck_of_the_draw : public SpellScriptLoader
-{
- public:
- spell_gen_luck_of_the_draw() : SpellScriptLoader("spell_gen_luck_of_the_draw") { }
-
- class spell_gen_luck_of_the_draw_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_gen_luck_of_the_draw_AuraScript);
-
- bool Load()
- {
- return GetUnitOwner()->GetTypeId() == TYPEID_PLAYER;
- }
-
- // cheap hax to make it have update calls
- void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude)
- {
- isPeriodic = true;
- amplitude = 5 * IN_MILLISECONDS;
- }
-
- void Update(AuraEffect* /*effect*/)
- {
- if (Player* owner = GetUnitOwner()->ToPlayer())
- {
- const LfgDungeonSet dungeons = sLFGMgr->GetSelectedDungeons(owner->GetGUID());
- LfgDungeonSet::const_iterator itr = dungeons.begin();
-
- if (itr == dungeons.end())
- {
- Remove(AURA_REMOVE_BY_DEFAULT);
- return;
- }
-
-
- LFGDungeonData const* randomDungeon = sLFGMgr->GetLFGDungeon(*itr);
- if (Group* group = owner->GetGroup())
- if (Map const* map = owner->GetMap())
- if (group->isLFGGroup())
- if (uint32 dungeonId = sLFGMgr->GetDungeon(group->GetGUID(), true))
- if (LFGDungeonData const* dungeon = sLFGMgr->GetLFGDungeon(dungeonId))
- if (uint32(dungeon->map) == map->GetId() && dungeon->difficulty == map->GetDifficulty())
- if (randomDungeon && randomDungeon->type == LFG_TYPE_RANDOM)
- return; // in correct dungeon
-
- Remove(AURA_REMOVE_BY_DEFAULT);
- }
- }
-
- void Register()
- {
- DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_gen_luck_of_the_draw_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
- OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_luck_of_the_draw_AuraScript::Update, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
- }
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_gen_luck_of_the_draw_AuraScript();
- }
-};
-
enum DummyTrigger
{
SPELL_PERSISTANT_SHIELD_TRIGGERED = 26470,
@@ -1594,7 +1862,7 @@ class spell_gen_gnomish_transporter : public SpellScriptLoader
void HandleDummy(SpellEffIndex /* effIndex */)
{
Unit* caster = GetCaster();
- caster->CastSpell(caster, roll_chance_i(50) ? SPELL_TRANSPORTER_SUCCESS : SPELL_TRANSPORTER_FAILURE , true);
+ caster->CastSpell(caster, roll_chance_i(50) ? SPELL_TRANSPORTER_SUCCESS : SPELL_TRANSPORTER_FAILURE, true);
}
void Register()
@@ -2796,7 +3064,7 @@ class spell_gen_summon_elemental : public SpellScriptLoader
{
if (GetCaster())
if (Unit* owner = GetCaster()->GetOwner())
- if (owner->GetTypeId() == TYPEID_PLAYER) // todo: this check is maybe wrong
+ if (owner->GetTypeId() == TYPEID_PLAYER) /// @todo this check is maybe wrong
owner->ToPlayer()->RemovePet(NULL, PET_SAVE_NOT_IN_SLOT, true);
}
@@ -3188,13 +3456,75 @@ class spell_gen_replenishment : public SpellScriptLoader
}
};
+enum ServiceUniform
+{
+ SPELL_SERVICE_UNIFORM = 71450,
+
+ MODEL_GOBLIN_MALE = 31002,
+ MODEL_GOBLIN_FEMALE = 31003,
+};
+
+class spell_gen_aura_service_uniform : public SpellScriptLoader
+{
+ public:
+ spell_gen_aura_service_uniform() : SpellScriptLoader("spell_gen_aura_service_uniform") { }
+
+ class spell_gen_aura_service_uniform_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_gen_aura_service_uniform_AuraScript);
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SERVICE_UNIFORM))
+ return false;
+ return true;
+ }
+
+ void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ // Apply model goblin
+ Unit* target = GetTarget();
+ if (target->GetTypeId() == TYPEID_PLAYER)
+ {
+ if (target->getGender() == GENDER_MALE)
+ target->SetDisplayId(MODEL_GOBLIN_MALE);
+ else
+ target->SetDisplayId(MODEL_GOBLIN_FEMALE);
+ }
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
+ if (target->GetTypeId() == TYPEID_PLAYER)
+ target->RestoreDisplayId();
+ }
+
+ void Register()
+ {
+ AfterEffectApply += AuraEffectRemoveFn(spell_gen_aura_service_uniform_AuraScript::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_gen_aura_service_uniform_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_gen_aura_service_uniform_AuraScript();
+ }
+};
+
void AddSC_generic_spell_scripts()
{
new spell_gen_absorb0_hitlimit1();
+ new spell_gen_adaptive_warding();
new spell_gen_aura_of_anger();
new spell_gen_av_drekthar_presence();
new spell_gen_burn_brutallus();
new spell_gen_cannibalize();
+ new spell_gen_create_lance();
+ new spell_gen_netherbloom();
+ new spell_gen_nightmare_vine();
+ new spell_gen_obsidian_armor();
new spell_gen_parachute();
new spell_gen_pet_summoned();
new spell_gen_remove_flight_auras();
@@ -3218,7 +3548,6 @@ void AddSC_generic_spell_scripts()
new spell_gen_vehicle_scaling();
new spell_gen_oracle_wolvar_reputation();
new spell_gen_damage_reduction_aura();
- new spell_gen_luck_of_the_draw();
new spell_gen_dummy_trigger();
new spell_gen_spirit_healer_res();
new spell_gen_gadgetzan_transporter_backfire();
@@ -3262,4 +3591,5 @@ void AddSC_generic_spell_scripts()
new spell_gen_bonked();
new spell_gen_gift_of_naaru();
new spell_gen_replenishment();
+ new spell_gen_aura_service_uniform();
}
diff --git a/src/server/scripts/Spells/spell_holiday.cpp b/src/server/scripts/Spells/spell_holiday.cpp
index 83532e7d72d..37b6a202ed4 100644
--- a/src/server/scripts/Spells/spell_holiday.cpp
+++ b/src/server/scripts/Spells/spell_holiday.cpp
@@ -17,6 +17,7 @@
/*
* Spells used in holidays/game events that do not fit any other category.
+ * Ordered alphabetically using scriptname.
* Scriptnames in this file should be prefixed with "spell_#holidayname_".
*/
@@ -26,6 +27,7 @@
#include "SpellScript.h"
#include "SpellAuraEffects.h"
#include "GridNotifiers.h"
+#include "GridNotifiersImpl.h"
#include "CellImpl.h"
// 45102 Romantic Picnic
@@ -133,6 +135,7 @@ class spell_hallow_end_trick : public SpellScriptLoader
class spell_hallow_end_trick_SpellScript : public SpellScript
{
PrepareSpellScript(spell_hallow_end_trick_SpellScript);
+
bool Validate(SpellInfo const* /*spell*/)
{
if (!sSpellMgr->GetSpellInfo(SPELL_PIRATE_COSTUME_MALE) || !sSpellMgr->GetSpellInfo(SPELL_PIRATE_COSTUME_FEMALE) || !sSpellMgr->GetSpellInfo(SPELL_NINJA_COSTUME_MALE)
@@ -170,7 +173,7 @@ class spell_hallow_end_trick : public SpellScriptLoader
break;
}
- caster->CastSpell(target, spellId, true, NULL);
+ caster->CastSpell(target, spellId, true);
}
}
@@ -218,8 +221,8 @@ class spell_hallow_end_trick_or_treat : public SpellScriptLoader
Unit* caster = GetCaster();
if (Player* target = GetHitPlayer())
{
- caster->CastSpell(target, roll_chance_i(50) ? SPELL_TRICK : SPELL_TREAT, true, NULL);
- caster->CastSpell(target, SPELL_TRICKED_OR_TREATED, true, NULL);
+ caster->CastSpell(target, roll_chance_i(50) ? SPELL_TRICK : SPELL_TREAT, true);
+ caster->CastSpell(target, SPELL_TRICKED_OR_TREATED, true);
}
}
@@ -301,27 +304,10 @@ class spell_winter_veil_mistletoe : public SpellScriptLoader
void HandleScript(SpellEffIndex /*effIndex*/)
{
- Unit* caster = GetCaster();
-
if (Player* target = GetHitPlayer())
{
- uint32 spellId = 0;
- switch (urand(0, 2))
- {
- case 0:
- spellId = SPELL_CREATE_MISTLETOE;
- break;
- case 1:
- spellId = SPELL_CREATE_HOLLY;
- break;
- case 2:
- spellId = SPELL_CREATE_SNOWFLAKES;
- break;
- default:
- return;
- }
-
- caster->CastSpell(target, spellId, true);
+ uint32 spellId = RAND(SPELL_CREATE_HOLLY, SPELL_CREATE_MISTLETOE, SPELL_CREATE_SNOWFLAKES);
+ GetCaster()->CastSpell(target, spellId, true);
}
}
@@ -337,6 +323,71 @@ class spell_winter_veil_mistletoe : public SpellScriptLoader
}
};
+// 26275 - PX-238 Winter Wondervolt TRAP
+enum PX238WinterWondervolt
+{
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_1 = 26157,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_2 = 26272,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_3 = 26273,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_4 = 26274
+};
+
+class spell_winter_veil_px_238_winter_wondervolt : public SpellScriptLoader
+{
+ public:
+ spell_winter_veil_px_238_winter_wondervolt() : SpellScriptLoader("spell_winter_veil_px_238_winter_wondervolt") { }
+
+ class spell_winter_veil_px_238_winter_wondervolt_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_winter_veil_px_238_winter_wondervolt_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_1) ||
+ !sSpellMgr->GetSpellInfo(SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_2) ||
+ !sSpellMgr->GetSpellInfo(SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_3) ||
+ !sSpellMgr->GetSpellInfo(SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_4))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ uint32 const spells[4] =
+ {
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_1,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_2,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_3,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_4
+ };
+
+ if (Unit* target = GetHitUnit())
+ {
+ for (uint8 i = 0; i < 4; ++i)
+ if (target->HasAura(spells[i]))
+ return;
+
+ target->CastSpell(target, spells[urand(0, 3)], true);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_winter_veil_px_238_winter_wondervolt_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+
+ private:
+
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_winter_veil_px_238_winter_wondervolt_SpellScript();
+ }
+};
+
void AddSC_holiday_spell_scripts()
{
// Love is in the Air
@@ -347,4 +398,5 @@ void AddSC_holiday_spell_scripts()
new spell_hallow_end_tricky_treat();
// Winter Veil
new spell_winter_veil_mistletoe();
+ new spell_winter_veil_px_238_winter_wondervolt();
}
diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp
index 18326a8f059..08f65d8323f 100644
--- a/src/server/scripts/Spells/spell_hunter.cpp
+++ b/src/server/scripts/Spells/spell_hunter.cpp
@@ -32,23 +32,28 @@
enum HunterSpells
{
- HUNTER_SPELL_READINESS = 23989,
- DRAENEI_SPELL_GIFT_OF_THE_NAARU = 59543,
- HUNTER_SPELL_BESTIAL_WRATH = 19574,
- HUNTER_PET_SPELL_LAST_STAND_TRIGGERED = 53479,
- HUNTER_PET_HEART_OF_THE_PHOENIX = 55709,
- HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED = 54114,
- HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF = 55711,
- HUNTER_PET_SPELL_CARRION_FEEDER_TRIGGERED = 54045,
- HUNTER_SPELL_INVIGORATION_TRIGGERED = 53398,
- HUNTER_SPELL_MASTERS_CALL_TRIGGERED = 62305,
- HUNTER_SPELL_CHIMERA_SHOT_SERPENT = 53353,
- HUNTER_SPELL_CHIMERA_SHOT_VIPER = 53358,
- HUNTER_SPELL_CHIMERA_SHOT_SCORPID = 53359,
- HUNTER_SPELL_ASPECT_OF_THE_BEAST_PET = 61669,
+ SPELL_HUNTER_ASPECT_OF_THE_BEAST_PET = 61669,
+ SPELL_HUNTER_ASPECT_OF_THE_VIPER_ENERGIZE = 34075,
+ SPELL_HUNTER_BESTIAL_WRATH = 19574,
+ SPELL_HUNTER_CHIMERA_SHOT_SERPENT = 53353,
+ SPELL_HUNTER_CHIMERA_SHOT_VIPER = 53358,
+ SPELL_HUNTER_CHIMERA_SHOT_SCORPID = 53359,
+ SPELL_HUNTER_GLYPH_OF_ASPECT_OF_THE_VIPER = 56851,
+ SPELL_HUNTER_INVIGORATION_TRIGGERED = 53398,
+ SPELL_HUNTER_MASTERS_CALL_TRIGGERED = 62305,
+ SPELL_HUNTER_MISDIRECTION_PROC = 35079,
+ SPELL_HUNTER_PET_LAST_STAND_TRIGGERED = 53479,
+ SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX = 55709,
+ SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED = 54114,
+ SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF = 55711,
+ SPELL_HUNTER_PET_CARRION_FEEDER_TRIGGERED = 54045,
+ SPELL_HUNTER_READINESS = 23989,
+ SPELL_HUNTER_SNIPER_TRAINING_R1 = 53302,
+ SPELL_HUNTER_SNIPER_TRAINING_BUFF_R1 = 64418,
+ SPELL_DRAENEI_GIFT_OF_THE_NAARU = 59543,
};
-// 13161 Aspect of the Beast
+// 13161 - Aspect of the Beast
class spell_hun_aspect_of_the_beast : public SpellScriptLoader
{
public:
@@ -63,9 +68,9 @@ class spell_hun_aspect_of_the_beast : public SpellScriptLoader
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
- bool Validate(SpellInfo const* /*entry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(HUNTER_SPELL_ASPECT_OF_THE_BEAST_PET))
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_ASPECT_OF_THE_BEAST_PET))
return false;
return true;
}
@@ -74,14 +79,14 @@ class spell_hun_aspect_of_the_beast : public SpellScriptLoader
{
if (Player* caster = GetCaster()->ToPlayer())
if (Pet* pet = caster->GetPet())
- pet->RemoveAurasDueToSpell(HUNTER_SPELL_ASPECT_OF_THE_BEAST_PET);
+ pet->RemoveAurasDueToSpell(SPELL_HUNTER_ASPECT_OF_THE_BEAST_PET);
}
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Player* caster = GetCaster()->ToPlayer())
if (caster->GetPet())
- caster->CastSpell(caster, HUNTER_SPELL_ASPECT_OF_THE_BEAST_PET, true);
+ caster->CastSpell(caster, SPELL_HUNTER_ASPECT_OF_THE_BEAST_PET, true);
}
void Register()
@@ -97,7 +102,51 @@ class spell_hun_aspect_of_the_beast : public SpellScriptLoader
}
};
-// 53209 Chimera Shot
+// 34074 - Aspect of the Viper
+class spell_hun_ascpect_of_the_viper : public SpellScriptLoader
+{
+ public:
+ spell_hun_ascpect_of_the_viper() : SpellScriptLoader("spell_hun_ascpect_of_the_viper") { }
+
+ class spell_hun_ascpect_of_the_viper_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_hun_ascpect_of_the_viper_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_ASPECT_OF_THE_VIPER_ENERGIZE))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_GLYPH_OF_ASPECT_OF_THE_VIPER))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+
+ uint32 maxMana = GetTarget()->GetMaxPower(POWER_MANA);
+ int32 mana = CalculatePct(maxMana, GetTarget()->GetAttackTime(RANGED_ATTACK) / 1000.0f);
+
+ if (AuraEffect const* glyph = GetTarget()->GetAuraEffect(SPELL_HUNTER_GLYPH_OF_ASPECT_OF_THE_VIPER, EFFECT_0))
+ AddPct(mana, glyph->GetAmount());
+
+ GetTarget()->CastCustomSpell(SPELL_HUNTER_ASPECT_OF_THE_VIPER_ENERGIZE, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_hun_ascpect_of_the_viper_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_OBS_MOD_POWER);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_hun_ascpect_of_the_viper_AuraScript();
+ }
+};
+
+// 53209 - Chimera Shot
class spell_hun_chimera_shot : public SpellScriptLoader
{
public:
@@ -107,9 +156,9 @@ class spell_hun_chimera_shot : public SpellScriptLoader
{
PrepareSpellScript(spell_hun_chimera_shot_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(HUNTER_SPELL_CHIMERA_SHOT_SERPENT) || !sSpellMgr->GetSpellInfo(HUNTER_SPELL_CHIMERA_SHOT_VIPER) || !sSpellMgr->GetSpellInfo(HUNTER_SPELL_CHIMERA_SHOT_SCORPID))
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_CHIMERA_SHOT_SERPENT) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_CHIMERA_SHOT_VIPER) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_CHIMERA_SHOT_SCORPID))
return false;
return true;
}
@@ -138,7 +187,7 @@ class spell_hun_chimera_shot : public SpellScriptLoader
if (familyFlag[0] & 0x4000)
{
int32 TickCount = aurEff->GetTotalTicks();
- spellId = HUNTER_SPELL_CHIMERA_SHOT_SERPENT;
+ spellId = SPELL_HUNTER_CHIMERA_SHOT_SERPENT;
basePoint = caster->SpellDamageBonusDone(unitTarget, aura->GetSpellInfo(), aurEff->GetAmount(), DOT, aura->GetStackAmount());
ApplyPct(basePoint, TickCount * 40);
basePoint = unitTarget->SpellDamageBonusTaken(caster, aura->GetSpellInfo(), basePoint, DOT, aura->GetStackAmount());
@@ -147,18 +196,18 @@ class spell_hun_chimera_shot : public SpellScriptLoader
else if (familyFlag[1] & 0x00000080)
{
int32 TickCount = aura->GetEffect(0)->GetTotalTicks();
- spellId = HUNTER_SPELL_CHIMERA_SHOT_VIPER;
+ spellId = SPELL_HUNTER_CHIMERA_SHOT_VIPER;
// Amount of one aura tick
basePoint = int32(CalculatePct(unitTarget->GetMaxPower(POWER_MANA), aurEff->GetAmount()));
- int32 casterBasePoint = aurEff->GetAmount() * unitTarget->GetMaxPower(POWER_MANA) / 50; // TODO: WTF? caster uses unitTarget?
+ int32 casterBasePoint = aurEff->GetAmount() * unitTarget->GetMaxPower(POWER_MANA) / 50; /// @todo WTF? caster uses unitTarget?
if (basePoint > casterBasePoint)
basePoint = casterBasePoint;
ApplyPct(basePoint, TickCount * 60);
}
// Scorpid Sting - Attempts to Disarm the target for 10 sec. This effect cannot occur more than once per 1 minute.
else if (familyFlag[0] & 0x00008000)
- spellId = HUNTER_SPELL_CHIMERA_SHOT_SCORPID;
+ spellId = SPELL_HUNTER_CHIMERA_SHOT_SCORPID;
// ?? nothing say in spell desc (possibly need addition check)
//if (familyFlag & 0x0000010000000000LL || // dot
// familyFlag & 0x0000100000000000LL) // stun
@@ -173,7 +222,7 @@ class spell_hun_chimera_shot : public SpellScriptLoader
}
if (spellId)
caster->CastCustomSpell(unitTarget, spellId, &basePoint, 0, 0, true);
- if (spellId == HUNTER_SPELL_CHIMERA_SHOT_SCORPID && caster->ToPlayer()) // Scorpid Sting - Add 1 minute cooldown
+ if (spellId == SPELL_HUNTER_CHIMERA_SHOT_SCORPID && caster->ToPlayer()) // Scorpid Sting - Add 1 minute cooldown
caster->ToPlayer()->AddSpellCooldown(spellId, 0, uint32(time(NULL) + 60));
}
}
@@ -190,7 +239,38 @@ class spell_hun_chimera_shot : public SpellScriptLoader
}
};
-// 53412 Invigoration
+// 781 - Disengage
+class spell_hun_disengage : public SpellScriptLoader
+{
+ public:
+ spell_hun_disengage() : SpellScriptLoader("spell_hun_disengage") { }
+
+ class spell_hun_disengage_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_hun_disengage_SpellScript);
+
+ SpellCastResult CheckCast()
+ {
+ Unit* caster = GetCaster();
+ if (caster->GetTypeId() == TYPEID_PLAYER && !caster->isInCombat())
+ return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;
+
+ return SPELL_CAST_OK;
+ }
+
+ void Register()
+ {
+ OnCheckCast += SpellCheckCastFn(spell_hun_disengage_SpellScript::CheckCast);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_hun_disengage_SpellScript();
+ }
+};
+
+// 53412 - Invigoration
class spell_hun_invigoration : public SpellScriptLoader
{
public:
@@ -200,9 +280,9 @@ class spell_hun_invigoration : public SpellScriptLoader
{
PrepareSpellScript(spell_hun_invigoration_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(HUNTER_SPELL_INVIGORATION_TRIGGERED))
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_INVIGORATION_TRIGGERED))
return false;
return true;
}
@@ -212,7 +292,7 @@ class spell_hun_invigoration : public SpellScriptLoader
if (Unit* unitTarget = GetHitUnit())
if (AuraEffect* aurEff = unitTarget->GetDummyAuraEffect(SPELLFAMILY_HUNTER, 3487, 0))
if (roll_chance_i(aurEff->GetAmount()))
- unitTarget->CastSpell(unitTarget, HUNTER_SPELL_INVIGORATION_TRIGGERED, true);
+ unitTarget->CastSpell(unitTarget, SPELL_HUNTER_INVIGORATION_TRIGGERED, true);
}
void Register()
@@ -227,6 +307,7 @@ class spell_hun_invigoration : public SpellScriptLoader
}
};
+// 53478 - Last Stand Pet
class spell_hun_last_stand_pet : public SpellScriptLoader
{
public:
@@ -236,9 +317,9 @@ class spell_hun_last_stand_pet : public SpellScriptLoader
{
PrepareSpellScript(spell_hun_last_stand_pet_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(HUNTER_PET_SPELL_LAST_STAND_TRIGGERED))
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_PET_LAST_STAND_TRIGGERED))
return false;
return true;
}
@@ -247,12 +328,11 @@ class spell_hun_last_stand_pet : public SpellScriptLoader
{
Unit* caster = GetCaster();
int32 healthModSpellBasePoints0 = int32(caster->CountPctFromMaxHealth(30));
- caster->CastCustomSpell(caster, HUNTER_PET_SPELL_LAST_STAND_TRIGGERED, &healthModSpellBasePoints0, NULL, NULL, true, NULL);
+ caster->CastCustomSpell(caster, SPELL_HUNTER_PET_LAST_STAND_TRIGGERED, &healthModSpellBasePoints0, NULL, NULL, true, NULL);
}
void Register()
{
- // add dummy effect spell handler to pet's Last Stand
OnEffectHitTarget += SpellEffectFn(spell_hun_last_stand_pet_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
@@ -263,6 +343,7 @@ class spell_hun_last_stand_pet : public SpellScriptLoader
}
};
+// 53271 - Masters Call
class spell_hun_masters_call : public SpellScriptLoader
{
public:
@@ -272,9 +353,9 @@ class spell_hun_masters_call : public SpellScriptLoader
{
PrepareSpellScript(spell_hun_masters_call_SpellScript);
- bool Validate(SpellInfo const* spellEntry)
+ bool Validate(SpellInfo const* spellInfo)
{
- if (!sSpellMgr->GetSpellInfo(HUNTER_SPELL_MASTERS_CALL_TRIGGERED) || !sSpellMgr->GetSpellInfo(spellEntry->Effects[EFFECT_0].CalcValue()) || !sSpellMgr->GetSpellInfo(spellEntry->Effects[EFFECT_1].CalcValue()))
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_MASTERS_CALL_TRIGGERED) || !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].CalcValue()) || !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_1].CalcValue()))
return false;
return true;
}
@@ -297,7 +378,7 @@ class spell_hun_masters_call : public SpellScriptLoader
{
// Cannot be processed while pet is dead
TriggerCastFlags castMask = TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_CASTER_AURASTATE);
- target->CastSpell(target, HUNTER_SPELL_MASTERS_CALL_TRIGGERED, castMask);
+ target->CastSpell(target, SPELL_HUNTER_MASTERS_CALL_TRIGGERED, castMask);
}
}
@@ -314,156 +395,139 @@ class spell_hun_masters_call : public SpellScriptLoader
}
};
-class spell_hun_readiness : public SpellScriptLoader
+// 34477 - Misdirection
+class spell_hun_misdirection : public SpellScriptLoader
{
public:
- spell_hun_readiness() : SpellScriptLoader("spell_hun_readiness") { }
+ spell_hun_misdirection() : SpellScriptLoader("spell_hun_misdirection") { }
- class spell_hun_readiness_SpellScript : public SpellScript
+ class spell_hun_misdirection_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_hun_readiness_SpellScript);
+ PrepareAuraScript(spell_hun_misdirection_AuraScript);
- bool Load()
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_MISDIRECTION_PROC))
+ return false;
+ return true;
}
- void HandleDummy(SpellEffIndex /*effIndex*/)
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
- Player* caster = GetCaster()->ToPlayer();
- // immediately finishes the cooldown on your other Hunter abilities except Bestial Wrath
- const SpellCooldowns& cm = caster->ToPlayer()->GetSpellCooldownMap();
- for (SpellCooldowns::const_iterator itr = cm.begin(); itr != cm.end();)
- {
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
+ if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT)
+ GetTarget()->ResetRedirectThreat();
+ }
- ///! If spellId in cooldown map isn't valid, the above will return a null pointer.
- if (spellInfo &&
- spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER &&
- spellInfo->Id != HUNTER_SPELL_READINESS &&
- spellInfo->Id != HUNTER_SPELL_BESTIAL_WRATH &&
- spellInfo->Id != DRAENEI_SPELL_GIFT_OF_THE_NAARU &&
- spellInfo->GetRecoveryTime() > 0)
- caster->RemoveSpellCooldown((itr++)->first, true);
- else
- ++itr;
- }
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ return GetTarget()->GetRedirectThreatTarget();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_MISDIRECTION_PROC, true, NULL, aurEff);
}
void Register()
{
- // add dummy effect spell handler to Readiness
- OnEffectHitTarget += SpellEffectFn(spell_hun_readiness_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_hun_misdirection_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ DoCheckProc += AuraCheckProcFn(spell_hun_misdirection_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_hun_misdirection_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
}
};
- SpellScript* GetSpellScript() const
+ AuraScript* GetAuraScript() const
{
- return new spell_hun_readiness_SpellScript();
+ return new spell_hun_misdirection_AuraScript();
}
};
-// 37506 Scatter Shot
-class spell_hun_scatter_shot : public SpellScriptLoader
+// 35079 - Misdirection (Proc)
+class spell_hun_misdirection_proc : public SpellScriptLoader
{
public:
- spell_hun_scatter_shot() : SpellScriptLoader("spell_hun_scatter_shot") { }
+ spell_hun_misdirection_proc() : SpellScriptLoader("spell_hun_misdirection_proc") { }
- class spell_hun_scatter_shot_SpellScript : public SpellScript
+ class spell_hun_misdirection_proc_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_hun_scatter_shot_SpellScript);
-
- bool Load()
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
+ PrepareAuraScript(spell_hun_misdirection_proc_AuraScript);
- void HandleDummy(SpellEffIndex /*effIndex*/)
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
- Player* caster = GetCaster()->ToPlayer();
- // break Auto Shot and autohit
- caster->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);
- caster->AttackStop();
- caster->SendAttackSwingCancelAttack();
+ GetTarget()->ResetRedirectThreat();
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_hun_scatter_shot_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_hun_misdirection_proc_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
- SpellScript* GetSpellScript() const
+ AuraScript* GetAuraScript() const
{
- return new spell_hun_scatter_shot_SpellScript();
+ return new spell_hun_misdirection_proc_AuraScript();
}
};
-// 53302, 53303, 53304 Sniper Training
-enum eSniperTrainingSpells
-{
- SPELL_SNIPER_TRAINING_R1 = 53302,
- SPELL_SNIPER_TRAINING_BUFF_R1 = 64418,
-};
-
-class spell_hun_sniper_training : public SpellScriptLoader
+// 54044 - Pet Carrion Feeder
+class spell_hun_pet_carrion_feeder : public SpellScriptLoader
{
public:
- spell_hun_sniper_training() : SpellScriptLoader("spell_hun_sniper_training") { }
+ spell_hun_pet_carrion_feeder() : SpellScriptLoader("spell_hun_pet_carrion_feeder") { }
- class spell_hun_sniper_training_AuraScript : public AuraScript
+ class spell_hun_pet_carrion_feeder_SpellScript : public SpellScript
{
- PrepareAuraScript(spell_hun_sniper_training_AuraScript);
+ PrepareSpellScript(spell_hun_pet_carrion_feeder_SpellScript);
- bool Validate(SpellInfo const* /*entry*/)
+ bool Load()
{
- if (!sSpellMgr->GetSpellInfo(SPELL_SNIPER_TRAINING_R1) || !sSpellMgr->GetSpellInfo(SPELL_SNIPER_TRAINING_BUFF_R1))
+ if (!GetCaster()->isPet())
return false;
return true;
}
- void HandlePeriodic(AuraEffect const* aurEff)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- PreventDefaultAction();
- if (aurEff->GetAmount() <= 0)
- {
- Unit* caster = GetCaster();
- uint32 spellId = SPELL_SNIPER_TRAINING_BUFF_R1 + GetId() - SPELL_SNIPER_TRAINING_R1;
- if (Unit* target = GetTarget())
- if (!target->HasAura(spellId))
- {
- SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(spellId);
- Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? caster : target;
- triggerCaster->CastSpell(target, triggeredSpellInfo, true, 0, aurEff);
- }
- }
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_PET_CARRION_FEEDER_TRIGGERED))
+ return false;
+ return true;
}
- void HandleUpdatePeriodic(AuraEffect* aurEff)
+ SpellCastResult CheckIfCorpseNear()
{
- if (Player* playerTarget = GetUnitOwner()->ToPlayer())
- {
- int32 baseAmount = aurEff->GetBaseAmount();
- int32 amount = playerTarget->isMoving() ?
- playerTarget->CalculateSpellDamage(playerTarget, GetSpellInfo(), aurEff->GetEffIndex(), &baseAmount) :
- aurEff->GetAmount() - 1;
- aurEff->SetAmount(amount);
- }
+ Unit* caster = GetCaster();
+ float max_range = GetSpellInfo()->GetMaxRange(false);
+ WorldObject* result = NULL;
+ // search for nearby enemy corpse in range
+ Trinity::AnyDeadUnitSpellTargetInRangeCheck check(caster, max_range, GetSpellInfo(), TARGET_CHECK_ENEMY);
+ Trinity::WorldObjectSearcher<Trinity::AnyDeadUnitSpellTargetInRangeCheck> searcher(caster, result, check);
+ caster->GetMap()->VisitFirstFound(caster->m_positionX, caster->m_positionY, max_range, searcher);
+ if (!result)
+ return SPELL_FAILED_NO_EDIBLE_CORPSES;
+ return SPELL_CAST_OK;
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ caster->CastSpell(caster, SPELL_HUNTER_PET_CARRION_FEEDER_TRIGGERED, false);
}
void Register()
{
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_hun_sniper_training_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
- OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_hun_sniper_training_AuraScript::HandleUpdatePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
+ OnEffectHit += SpellEffectFn(spell_hun_pet_carrion_feeder_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnCheckCast += SpellCheckCastFn(spell_hun_pet_carrion_feeder_SpellScript::CheckIfCorpseNear);
}
};
- AuraScript* GetAuraScript() const
+ SpellScript* GetSpellScript() const
{
- return new spell_hun_sniper_training_AuraScript();
+ return new spell_hun_pet_carrion_feeder_SpellScript();
}
};
+// 55709 - Pet Heart of the Phoenix
class spell_hun_pet_heart_of_the_phoenix : public SpellScriptLoader
{
public:
@@ -480,9 +544,9 @@ class spell_hun_pet_heart_of_the_phoenix : public SpellScriptLoader
return true;
}
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED) || !sSpellMgr->GetSpellInfo(HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF))
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF))
return false;
return true;
}
@@ -491,16 +555,15 @@ class spell_hun_pet_heart_of_the_phoenix : public SpellScriptLoader
{
Unit* caster = GetCaster();
if (Unit* owner = caster->GetOwner())
- if (!caster->HasAura(HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF))
+ if (!caster->HasAura(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF))
{
- owner->CastCustomSpell(HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED, SPELLVALUE_BASE_POINT0, 100, caster, true);
- caster->CastSpell(caster, HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF, true);
+ owner->CastCustomSpell(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED, SPELLVALUE_BASE_POINT0, 100, caster, true);
+ caster->CastSpell(caster, SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF, true);
}
}
void Register()
{
- // add dummy effect spell handler to pet's Last Stand
OnEffectHitTarget += SpellEffectFn(spell_hun_pet_heart_of_the_phoenix_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
@@ -511,150 +574,151 @@ class spell_hun_pet_heart_of_the_phoenix : public SpellScriptLoader
}
};
-class spell_hun_pet_carrion_feeder : public SpellScriptLoader
+// 23989 - Readiness
+class spell_hun_readiness : public SpellScriptLoader
{
public:
- spell_hun_pet_carrion_feeder() : SpellScriptLoader("spell_hun_pet_carrion_feeder") { }
+ spell_hun_readiness() : SpellScriptLoader("spell_hun_readiness") { }
- class spell_hun_pet_carrion_feeder_SpellScript : public SpellScript
+ class spell_hun_readiness_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_hun_pet_carrion_feeder_SpellScript);
+ PrepareSpellScript(spell_hun_readiness_SpellScript);
bool Load()
{
- if (!GetCaster()->isPet())
- return false;
- return true;
- }
-
- bool Validate(SpellInfo const* /*spellEntry*/)
- {
- if (!sSpellMgr->GetSpellInfo(HUNTER_PET_SPELL_CARRION_FEEDER_TRIGGERED))
- return false;
- return true;
- }
-
- SpellCastResult CheckIfCorpseNear()
- {
- Unit* caster = GetCaster();
- float max_range = GetSpellInfo()->GetMaxRange(false);
- WorldObject* result = NULL;
- // search for nearby enemy corpse in range
- Trinity::AnyDeadUnitSpellTargetInRangeCheck check(caster, max_range, GetSpellInfo(), TARGET_CHECK_ENEMY);
- Trinity::WorldObjectSearcher<Trinity::AnyDeadUnitSpellTargetInRangeCheck> searcher(caster, result, check);
- caster->GetMap()->VisitFirstFound(caster->m_positionX, caster->m_positionY, max_range, searcher);
- if (!result)
- return SPELL_FAILED_NO_EDIBLE_CORPSES;
- return SPELL_CAST_OK;
+ return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
void HandleDummy(SpellEffIndex /*effIndex*/)
{
- Unit* caster = GetCaster();
- caster->CastSpell(caster, HUNTER_PET_SPELL_CARRION_FEEDER_TRIGGERED, false);
+ Player* caster = GetCaster()->ToPlayer();
+ // immediately finishes the cooldown on your other Hunter abilities except Bestial Wrath
+ const SpellCooldowns& cm = caster->ToPlayer()->GetSpellCooldownMap();
+ for (SpellCooldowns::const_iterator itr = cm.begin(); itr != cm.end();)
+ {
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
+
+ ///! If spellId in cooldown map isn't valid, the above will return a null pointer.
+ if (spellInfo &&
+ spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER &&
+ spellInfo->Id != SPELL_HUNTER_READINESS &&
+ spellInfo->Id != SPELL_HUNTER_BESTIAL_WRATH &&
+ spellInfo->Id != SPELL_DRAENEI_GIFT_OF_THE_NAARU &&
+ spellInfo->GetRecoveryTime() > 0)
+ caster->RemoveSpellCooldown((itr++)->first, true);
+ else
+ ++itr;
+ }
}
void Register()
{
- // add dummy effect spell handler to pet's Last Stand
- OnEffectHit += SpellEffectFn(spell_hun_pet_carrion_feeder_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- OnCheckCast += SpellCheckCastFn(spell_hun_pet_carrion_feeder_SpellScript::CheckIfCorpseNear);
+ OnEffectHitTarget += SpellEffectFn(spell_hun_readiness_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const
{
- return new spell_hun_pet_carrion_feeder_SpellScript();
+ return new spell_hun_readiness_SpellScript();
}
};
-// 34477 Misdirection
-class spell_hun_misdirection : public SpellScriptLoader
+// 37506 - Scatter Shot
+class spell_hun_scatter_shot : public SpellScriptLoader
{
public:
- spell_hun_misdirection() : SpellScriptLoader("spell_hun_misdirection") { }
+ spell_hun_scatter_shot() : SpellScriptLoader("spell_hun_scatter_shot") { }
- class spell_hun_misdirection_AuraScript : public AuraScript
+ class spell_hun_scatter_shot_SpellScript : public SpellScript
{
- PrepareAuraScript(spell_hun_misdirection_AuraScript);
+ PrepareSpellScript(spell_hun_scatter_shot_SpellScript);
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_PLAYER;
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
- if (Unit* caster = GetCaster())
- if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT)
- caster->SetReducedThreatPercent(0, 0);
+ Player* caster = GetCaster()->ToPlayer();
+ // break Auto Shot and autohit
+ caster->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);
+ caster->AttackStop();
+ caster->SendAttackSwingCancelAttack();
}
void Register()
{
- AfterEffectRemove += AuraEffectRemoveFn(spell_hun_misdirection_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ OnEffectHitTarget += SpellEffectFn(spell_hun_scatter_shot_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
- AuraScript* GetAuraScript() const
+ SpellScript* GetSpellScript() const
{
- return new spell_hun_misdirection_AuraScript();
+ return new spell_hun_scatter_shot_SpellScript();
}
};
-// 35079 Misdirection proc
-class spell_hun_misdirection_proc : public SpellScriptLoader
+// -53302 - Sniper Training
+class spell_hun_sniper_training : public SpellScriptLoader
{
public:
- spell_hun_misdirection_proc() : SpellScriptLoader("spell_hun_misdirection_proc") { }
+ spell_hun_sniper_training() : SpellScriptLoader("spell_hun_sniper_training") { }
- class spell_hun_misdirection_proc_AuraScript : public AuraScript
+ class spell_hun_sniper_training_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_hun_misdirection_proc_AuraScript);
+ PrepareAuraScript(spell_hun_sniper_training_AuraScript);
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (GetCaster())
- GetCaster()->SetReducedThreatPercent(0, 0);
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_SNIPER_TRAINING_R1) || !sSpellMgr->GetSpellInfo(SPELL_HUNTER_SNIPER_TRAINING_BUFF_R1))
+ return false;
+ return true;
}
- void Register()
+ void HandlePeriodic(AuraEffect const* aurEff)
{
- AfterEffectRemove += AuraEffectRemoveFn(spell_hun_misdirection_proc_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ PreventDefaultAction();
+ if (aurEff->GetAmount() <= 0)
+ {
+ Unit* caster = GetCaster();
+ uint32 spellId = SPELL_HUNTER_SNIPER_TRAINING_BUFF_R1 + GetId() - SPELL_HUNTER_SNIPER_TRAINING_R1;
+ if (Unit* target = GetTarget())
+ if (!target->HasAura(spellId))
+ {
+ SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(spellId);
+ Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? caster : target;
+ triggerCaster->CastSpell(target, triggeredSpellInfo, true, 0, aurEff);
+ }
+ }
}
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_hun_misdirection_proc_AuraScript();
- }
-};
-
-class spell_hun_disengage : public SpellScriptLoader
-{
- public:
- spell_hun_disengage() : SpellScriptLoader("spell_hun_disengage") { }
- class spell_hun_disengage_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_hun_disengage_SpellScript);
-
- SpellCastResult CheckCast()
+ void HandleUpdatePeriodic(AuraEffect* aurEff)
{
- Unit* caster = GetCaster();
- if (caster->GetTypeId() == TYPEID_PLAYER && !caster->isInCombat())
- return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;
-
- return SPELL_CAST_OK;
+ if (Player* playerTarget = GetUnitOwner()->ToPlayer())
+ {
+ int32 baseAmount = aurEff->GetBaseAmount();
+ int32 amount = playerTarget->isMoving() ?
+ playerTarget->CalculateSpellDamage(playerTarget, GetSpellInfo(), aurEff->GetEffIndex(), &baseAmount) :
+ aurEff->GetAmount() - 1;
+ aurEff->SetAmount(amount);
+ }
}
void Register()
{
- OnCheckCast += SpellCheckCastFn(spell_hun_disengage_SpellScript::CheckCast);
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_hun_sniper_training_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
+ OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_hun_sniper_training_AuraScript::HandleUpdatePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
- SpellScript* GetSpellScript() const
+ AuraScript* GetAuraScript() const
{
- return new spell_hun_disengage_SpellScript();
+ return new spell_hun_sniper_training_AuraScript();
}
};
+// 1515 - Tame Beast
class spell_hun_tame_beast : public SpellScriptLoader
{
public:
@@ -706,6 +770,8 @@ class spell_hun_tame_beast : public SpellScriptLoader
}
};
+// -24604 - Furious Howl
+// 53434 - Call of the Wild
class spell_hun_target_only_pet_and_owner : public SpellScriptLoader
{
public:
@@ -739,18 +805,19 @@ class spell_hun_target_only_pet_and_owner : public SpellScriptLoader
void AddSC_hunter_spell_scripts()
{
new spell_hun_aspect_of_the_beast();
+ new spell_hun_ascpect_of_the_viper();
new spell_hun_chimera_shot();
+ new spell_hun_disengage();
new spell_hun_invigoration();
new spell_hun_last_stand_pet();
new spell_hun_masters_call();
+ new spell_hun_misdirection();
+ new spell_hun_misdirection_proc();
+ new spell_hun_pet_carrion_feeder();
+ new spell_hun_pet_heart_of_the_phoenix();
new spell_hun_readiness();
new spell_hun_scatter_shot();
new spell_hun_sniper_training();
- new spell_hun_pet_heart_of_the_phoenix();
- new spell_hun_pet_carrion_feeder();
- new spell_hun_misdirection();
- new spell_hun_misdirection_proc();
- new spell_hun_disengage();
new spell_hun_tame_beast();
new spell_hun_target_only_pet_and_owner();
}
diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp
index ccd8f3f81e7..c9c75cdb134 100644
--- a/src/server/scripts/Spells/spell_item.cpp
+++ b/src/server/scripts/Spells/spell_item.cpp
@@ -73,6 +73,150 @@ class spell_item_trigger_spell : public SpellScriptLoader
}
};
+// 26400 - Arcane Shroud
+class spell_item_arcane_shroud : public SpellScriptLoader
+{
+ public:
+ spell_item_arcane_shroud() : SpellScriptLoader("spell_item_arcane_shroud") { }
+
+ class spell_item_arcane_shroud_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_arcane_shroud_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ int32 diff = GetUnitOwner()->getLevel() - 60;
+ if (diff > 0)
+ amount += 2 * diff;
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_item_arcane_shroud_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_THREAT);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_arcane_shroud_AuraScript();
+ }
+};
+
+// 64411 - Blessing of Ancient Kings (Val'anyr, Hammer of Ancient Kings)
+enum BlessingOfAncientKings
+{
+ SPELL_PROTECTION_OF_ANCIENT_KINGS = 64413
+};
+
+class spell_item_blessing_of_ancient_kings : public SpellScriptLoader
+{
+ public:
+ spell_item_blessing_of_ancient_kings() : SpellScriptLoader("spell_item_blessing_of_ancient_kings") { }
+
+ class spell_item_blessing_of_ancient_kings_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_blessing_of_ancient_kings_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PROTECTION_OF_ANCIENT_KINGS))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetProcTarget();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 absorb = int32(CalculatePct(eventInfo.GetHealInfo()->GetHeal(), 15.0f));
+ if (AuraEffect* protEff = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_PROTECTION_OF_ANCIENT_KINGS, 0, eventInfo.GetActor()->GetGUID()))
+ {
+ // The shield can grow to a maximum size of 20,000 damage absorbtion
+ protEff->SetAmount(std::min<int32>(protEff->GetAmount() + absorb, 20000));
+
+ // Refresh and return to prevent replacing the aura
+ protEff->GetBase()->RefreshDuration();
+ }
+ else
+ GetTarget()->CastCustomSpell(SPELL_PROTECTION_OF_ANCIENT_KINGS, SPELLVALUE_BASE_POINT0, absorb, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_item_blessing_of_ancient_kings_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_item_blessing_of_ancient_kings_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_blessing_of_ancient_kings_AuraScript();
+ }
+};
+
+// 8342 - Defibrillate (Goblin Jumper Cables) have 33% chance on success
+// 22999 - Defibrillate (Goblin Jumper Cables XL) have 50% chance on success
+// 54732 - Defibrillate (Gnomish Army Knife) have 67% chance on success
+enum Defibrillate
+{
+ SPELL_GOBLIN_JUMPER_CABLES_FAIL = 8338,
+ SPELL_GOBLIN_JUMPER_CABLES_XL_FAIL = 23055
+};
+
+class spell_item_defibrillate : public SpellScriptLoader
+{
+ public:
+ spell_item_defibrillate(char const* name, uint8 chance, uint32 failSpell = 0) : SpellScriptLoader(name), _chance(chance), _failSpell(failSpell) { }
+
+ class spell_item_defibrillate_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_item_defibrillate_SpellScript);
+
+ public:
+ spell_item_defibrillate_SpellScript(uint8 chance, uint32 failSpell) : SpellScript(), _chance(chance), _failSpell(failSpell) { }
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (_failSpell && !sSpellMgr->GetSpellInfo(_failSpell))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ if (roll_chance_i(_chance))
+ {
+ PreventHitDefaultEffect(effIndex);
+ if (_failSpell)
+ GetCaster()->CastSpell(GetCaster(), _failSpell, true, GetCastItem());
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_item_defibrillate_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_RESURRECT);
+ }
+
+ private:
+ uint8 _chance;
+ uint32 _failSpell;
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_item_defibrillate_SpellScript(_chance, _failSpell);
+ }
+
+ private:
+ uint8 _chance;
+ uint32 _failSpell;
+};
+
// http://www.wowhead.com/item=6522 Deviate Fish
// 8063 Deviate Fish
enum DeviateFishSpells
@@ -357,6 +501,47 @@ class spell_item_mingos_fortune_generator : public SpellScriptLoader
}
};
+// 71875, 71877 - Item - Black Bruise: Necrotic Touch Proc
+enum NecroticTouch
+{
+ SPELL_ITEM_NECROTIC_TOUCH_PROC = 71879
+};
+
+class spell_item_necrotic_touch : public SpellScriptLoader
+{
+ public:
+ spell_item_necrotic_touch() : SpellScriptLoader("spell_item_necrotic_touch") { }
+
+ class spell_item_necrotic_touch_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_necrotic_touch_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ITEM_NECROTIC_TOUCH_PROC))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 bp = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount());
+ GetTarget()->CastCustomSpell(SPELL_ITEM_NECROTIC_TOUCH_PROC, SPELLVALUE_BASE_POINT0, bp, GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_item_necrotic_touch_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_necrotic_touch_AuraScript();
+ }
+};
+
// http://www.wowhead.com/item=10720 Gnomish Net-o-Matic Projector
// 13120 Net-o-Matic
enum NetOMaticSpells
@@ -464,6 +649,35 @@ class spell_item_noggenfogger_elixir : public SpellScriptLoader
}
};
+// 17512 - Piccolo of the Flaming Fire
+class spell_item_piccolo_of_the_flaming_fire : public SpellScriptLoader
+{
+ public:
+ spell_item_piccolo_of_the_flaming_fire() : SpellScriptLoader("spell_item_piccolo_of_the_flaming_fire") { }
+
+ class spell_item_piccolo_of_the_flaming_fire_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_item_piccolo_of_the_flaming_fire_SpellScript);
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ if (Player* target = GetHitPlayer())
+ target->HandleEmoteCommand(EMOTE_STATE_DANCE);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_item_piccolo_of_the_flaming_fire_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_item_piccolo_of_the_flaming_fire_SpellScript();
+ }
+};
+
// http://www.wowhead.com/item=6657 Savory Deviate Delight
// 8213 Savory Deviate Delight
enum SavoryDeviateDelight
@@ -522,6 +736,274 @@ class spell_item_savory_deviate_delight : public SpellScriptLoader
}
};
+// 48129 - Scroll of Recall
+// 60320 - Scroll of Recall II
+// 60321 - Scroll of Recall III
+enum ScrollOfRecall
+{
+ SPELL_SCROLL_OF_RECALL_I = 48129,
+ SPELL_SCROLL_OF_RECALL_II = 60320,
+ SPELL_SCROLL_OF_RECALL_III = 60321,
+ SPELL_LOST = 60444,
+ SPELL_SCROLL_OF_RECALL_FAIL_ALLIANCE_1 = 60323,
+ SPELL_SCROLL_OF_RECALL_FAIL_HORDE_1 = 60328,
+};
+
+class spell_item_scroll_of_recall : public SpellScriptLoader
+{
+ public:
+ spell_item_scroll_of_recall() : SpellScriptLoader("spell_item_scroll_of_recall") { }
+
+ class spell_item_scroll_of_recall_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_item_scroll_of_recall_SpellScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_PLAYER;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ Unit* caster = GetCaster();
+ uint8 maxSafeLevel = 0;
+ switch (GetSpellInfo()->Id)
+ {
+ case SPELL_SCROLL_OF_RECALL_I: // Scroll of Recall
+ maxSafeLevel = 40;
+ break;
+ case SPELL_SCROLL_OF_RECALL_II: // Scroll of Recall II
+ maxSafeLevel = 70;
+ break;
+ case SPELL_SCROLL_OF_RECALL_III: // Scroll of Recal III
+ maxSafeLevel = 80;
+ break;
+ default:
+ break;
+ }
+
+ if (caster->getLevel() > maxSafeLevel)
+ {
+ caster->CastSpell(caster, SPELL_LOST, true);
+
+ // ALLIANCE from 60323 to 60330 - HORDE from 60328 to 60335
+ uint32 spellId = SPELL_SCROLL_OF_RECALL_FAIL_ALLIANCE_1;
+ if (GetCaster()->ToPlayer()->GetTeam() == HORDE)
+ spellId = SPELL_SCROLL_OF_RECALL_FAIL_HORDE_1;
+
+ GetCaster()->CastSpell(GetCaster(), spellId + urand(0, 7), true);
+
+ PreventHitDefaultEffect(effIndex);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_item_scroll_of_recall_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_TELEPORT_UNITS);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_item_scroll_of_recall_SpellScript();
+ }
+};
+
+// 71169 - Shadow's Fate (Shadowmourne questline)
+enum ShadowsFate
+{
+ SPELL_SOUL_FEAST = 71203,
+};
+
+class spell_item_unsated_craving : public SpellScriptLoader
+{
+ public:
+ spell_item_unsated_craving() : SpellScriptLoader("spell_item_unsated_craving") { }
+
+ class spell_item_unsated_craving_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_unsated_craving_AuraScript);
+
+ bool CheckProc(ProcEventInfo& procInfo)
+ {
+ Unit* caster = procInfo.GetActor();
+ if (!caster || caster->GetTypeId() != TYPEID_PLAYER)
+ return false;
+
+ Unit* target = procInfo.GetActionTarget();
+ if (!target || target->GetTypeId() != TYPEID_UNIT || target->GetCreatureType() == CREATURE_TYPE_CRITTER || target->isSummon())
+ return false;
+
+ return true;
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_item_unsated_craving_AuraScript::CheckProc);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_unsated_craving_AuraScript();
+ }
+};
+
+class spell_item_shadows_fate : public SpellScriptLoader
+{
+ public:
+ spell_item_shadows_fate() : SpellScriptLoader("spell_item_shadows_fate") { }
+
+ class spell_item_shadows_fate_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_shadows_fate_AuraScript);
+
+ void HandleProc(ProcEventInfo& procInfo)
+ {
+ Unit* caster = procInfo.GetActor();
+ Unit* target = GetCaster();
+ if (!caster || !target)
+ return;
+
+ caster->CastSpell(target, SPELL_SOUL_FEAST, TRIGGERED_FULL_MASK);
+ }
+
+ void Register()
+ {
+ OnProc += AuraProcFn(spell_item_shadows_fate_AuraScript::HandleProc);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_shadows_fate_AuraScript();
+ }
+};
+
+enum Shadowmourne
+{
+ SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE = 71904,
+ SPELL_SHADOWMOURNE_SOUL_FRAGMENT = 71905,
+ SPELL_SHADOWMOURNE_VISUAL_LOW = 72521,
+ SPELL_SHADOWMOURNE_VISUAL_HIGH = 72523,
+ SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF = 73422,
+};
+
+// 71903 - Item - Shadowmourne Legendary
+class spell_item_shadowmourne : public SpellScriptLoader
+{
+ public:
+ spell_item_shadowmourne() : SpellScriptLoader("spell_item_shadowmourne") { }
+
+ class spell_item_shadowmourne_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_shadowmourne_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_SOUL_FRAGMENT))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (GetTarget()->HasAura(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) // cant collect shards while under effect of Chaos Bane buff
+ return false;
+ return eventInfo.GetProcTarget() && eventInfo.GetProcTarget()->isAlive();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(GetTarget(), SPELL_SHADOWMOURNE_SOUL_FRAGMENT, true, NULL, aurEff);
+
+ // this can't be handled in AuraScript of SoulFragments because we need to know victim
+ if (Aura* soulFragments = GetTarget()->GetAura(SPELL_SHADOWMOURNE_SOUL_FRAGMENT))
+ {
+ if (soulFragments->GetStackAmount() >= 10)
+ {
+ GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, true, NULL, aurEff);
+ soulFragments->Remove();
+ }
+ }
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_item_shadowmourne_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_item_shadowmourne_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_shadowmourne_AuraScript();
+ }
+};
+
+// 71905 - Soul Fragment
+class spell_item_shadowmourne_soul_fragment : public SpellScriptLoader
+{
+ public:
+ spell_item_shadowmourne_soul_fragment() : SpellScriptLoader("spell_item_shadowmourne_soul_fragment") { }
+
+ class spell_item_shadowmourne_soul_fragment_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_shadowmourne_soul_fragment_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_VISUAL_LOW) || !sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_VISUAL_HIGH) || !sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF))
+ return false;
+ return true;
+ }
+
+ void OnStackChange(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
+ switch (GetStackAmount())
+ {
+ case 1:
+ target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_LOW, true);
+ break;
+ case 6:
+ target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_LOW);
+ target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_HIGH, true);
+ break;
+ case 10:
+ target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_HIGH);
+ target->CastSpell(target, SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF, true);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
+ target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_LOW);
+ target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_HIGH);
+ }
+
+ void Register()
+ {
+ AfterEffectApply += AuraEffectApplyFn(spell_item_shadowmourne_soul_fragment_AuraScript::OnStackChange, EFFECT_0, SPELL_AURA_MOD_STAT, AuraEffectHandleModes(AURA_EFFECT_HANDLE_REAL | AURA_EFFECT_HANDLE_REAPPLY));
+ AfterEffectRemove += AuraEffectRemoveFn(spell_item_shadowmourne_soul_fragment_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_STAT, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_shadowmourne_soul_fragment_AuraScript();
+ }
+};
+
// http://www.wowhead.com/item=7734 Six Demon Bag
// 14537 Six Demon Bag
enum SixDemonBagSpells
@@ -593,6 +1075,35 @@ class spell_item_six_demon_bag : public SpellScriptLoader
}
};
+// 28862 - The Eye of Diminution
+class spell_item_the_eye_of_diminution : public SpellScriptLoader
+{
+ public:
+ spell_item_the_eye_of_diminution() : SpellScriptLoader("spell_item_the_eye_of_diminution") { }
+
+ class spell_item_the_eye_of_diminution_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_the_eye_of_diminution_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ int32 diff = GetUnitOwner()->getLevel() - 60;
+ if (diff > 0)
+ amount += diff;
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_item_the_eye_of_diminution_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_THREAT);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_the_eye_of_diminution_AuraScript();
+ }
+};
+
// http://www.wowhead.com/item=44012 Underbelly Elixir
// 59640 Underbelly Elixir
enum UnderbellyElixirSpells
@@ -646,70 +1157,6 @@ class spell_item_underbelly_elixir : public SpellScriptLoader
}
};
-enum eShadowmourneVisuals
-{
- SPELL_SHADOWMOURNE_VISUAL_LOW = 72521,
- SPELL_SHADOWMOURNE_VISUAL_HIGH = 72523,
- SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF = 73422,
-};
-
-class spell_item_shadowmourne : public SpellScriptLoader
-{
-public:
- spell_item_shadowmourne() : SpellScriptLoader("spell_item_shadowmourne") { }
-
- class spell_item_shadowmourne_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_item_shadowmourne_AuraScript);
-
- bool Validate(SpellInfo const* /*spellEntry*/)
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_VISUAL_LOW) || !sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_VISUAL_HIGH) || !sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF))
- return false;
- return true;
- }
-
- void OnStackChange(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- switch (GetStackAmount())
- {
- case 1:
- target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_LOW, true);
- break;
- case 6:
- target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_LOW);
- target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_HIGH, true);
- break;
- case 10:
- target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_HIGH);
- target->CastSpell(target, SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF, true);
- break;
- default:
- break;
- }
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_LOW);
- target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_HIGH);
- }
-
- void Register()
- {
- AfterEffectApply += AuraEffectApplyFn(spell_item_shadowmourne_AuraScript::OnStackChange, EFFECT_0, SPELL_AURA_MOD_STAT, AuraEffectHandleModes(AURA_EFFECT_HANDLE_REAL | AURA_EFFECT_HANDLE_REAPPLY));
- AfterEffectRemove += AuraEffectRemoveFn(spell_item_shadowmourne_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_STAT, AURA_EFFECT_HANDLE_REAL);
- }
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_item_shadowmourne_AuraScript();
- }
-};
-
enum AirRifleSpells
{
SPELL_AIR_RIFLE_HOLD_VISUAL = 65582,
@@ -1350,7 +1797,7 @@ class spell_item_poultryizer : public SpellScriptLoader
void HandleDummy(SpellEffIndex /* effIndex */)
{
if (GetCastItem() && GetHitUnit())
- GetCaster()->CastSpell(GetHitUnit(), roll_chance_i(80) ? SPELL_POULTRYIZER_SUCCESS : SPELL_POULTRYIZER_BACKFIRE , true, GetCastItem());
+ GetCaster()->CastSpell(GetHitUnit(), roll_chance_i(80) ? SPELL_POULTRYIZER_SUCCESS : SPELL_POULTRYIZER_BACKFIRE, true, GetCastItem());
}
void Register()
@@ -1710,7 +2157,7 @@ class spell_item_teach_language : public SpellScriptLoader
Player* caster = GetCaster()->ToPlayer();
if (roll_chance_i(34))
- caster->CastSpell(caster,caster->GetTeam() == ALLIANCE ? SPELL_LEARN_GNOMISH_BINARY : SPELL_LEARN_GOBLIN_BINARY, true);
+ caster->CastSpell(caster, caster->GetTeam() == ALLIANCE ? SPELL_LEARN_GNOMISH_BINARY : SPELL_LEARN_GOBLIN_BINARY, true);
}
void Register()
@@ -2004,7 +2451,7 @@ public:
void HandleDummy(SpellEffIndex /*effIndex*/)
{
if (GetHitUnit())
- GetCaster()->CastSpell(GetCaster(),SPELL_FORCE_CAST_SUMMON_GNOME_SOUL);
+ GetCaster()->CastSpell(GetCaster(), SPELL_FORCE_CAST_SUMMON_GNOME_SOUL);
}
void Register()
@@ -2030,17 +2477,29 @@ void AddSC_item_spell_scripts()
// 23075 Mithril Mechanical Dragonling
new spell_item_trigger_spell("spell_item_mithril_mechanical_dragonling", SPELL_MITHRIL_MECHANICAL_DRAGONLING);
+ new spell_item_arcane_shroud();
+ new spell_item_blessing_of_ancient_kings();
+ new spell_item_defibrillate("spell_item_goblin_jumper_cables", 67, SPELL_GOBLIN_JUMPER_CABLES_FAIL);
+ new spell_item_defibrillate("spell_item_goblin_jumper_cables_xl", 50, SPELL_GOBLIN_JUMPER_CABLES_XL_FAIL);
+ new spell_item_defibrillate("spell_item_gnomish_army_knife", 33);
new spell_item_deviate_fish();
new spell_item_flask_of_the_north();
new spell_item_gnomish_death_ray();
new spell_item_make_a_wish();
new spell_item_mingos_fortune_generator();
+ new spell_item_necrotic_touch();
new spell_item_net_o_matic();
new spell_item_noggenfogger_elixir();
+ new spell_item_piccolo_of_the_flaming_fire();
new spell_item_savory_deviate_delight();
+ new spell_item_scroll_of_recall();
+ new spell_item_unsated_craving();
+ new spell_item_shadows_fate();
+ new spell_item_shadowmourne();
+ new spell_item_shadowmourne_soul_fragment();
new spell_item_six_demon_bag();
+ new spell_item_the_eye_of_diminution();
new spell_item_underbelly_elixir();
- new spell_item_shadowmourne();
new spell_item_red_rider_air_rifle();
new spell_item_create_heart_candy();
diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp
index cf10cfdab5c..e27248da6fc 100644
--- a/src/server/scripts/Spells/spell_mage.cpp
+++ b/src/server/scripts/Spells/spell_mage.cpp
@@ -28,7 +28,15 @@
enum MageSpells
{
+ SPELL_MAGE_BURNOUT = 29077,
SPELL_MAGE_COLD_SNAP = 11958,
+ SPELL_MAGE_FOCUS_MAGIC_PROC = 54648,
+ SPELL_MAGE_FROST_WARDING_R1 = 11189,
+ SPELL_MAGE_FROST_WARDING_TRIGGERED = 57776,
+ SPELL_MAGE_INCANTERS_ABSORBTION_R1 = 44394,
+ SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED = 44413,
+ SPELL_MAGE_IGNITE = 12654,
+ SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE = 29077,
SPELL_MAGE_SQUIRREL_FORM = 32813,
SPELL_MAGE_GIRAFFE_FORM = 32816,
SPELL_MAGE_SERPENT_FORM = 32817,
@@ -41,6 +49,32 @@ enum MageSpells
SPELL_MAGE_GLYPH_OF_BLAST_WAVE = 62126,
};
+// Incanter's Absorbtion
+class spell_mage_incanters_absorbtion_base_AuraScript : public AuraScript
+{
+ public:
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_R1))
+ return false;
+ return true;
+ }
+
+ void Trigger(AuraEffect* aurEff, DamageInfo& /*dmgInfo*/, uint32& absorbAmount)
+ {
+ Unit* target = GetTarget();
+
+ if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_INCANTERS_ABSORBTION_R1, EFFECT_0))
+ {
+ int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount());
+ target->CastCustomSpell(target, SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);
+ }
+ }
+};
+
+// -11113 - Blast Wave
class spell_mage_blast_wave : public SpellScriptLoader
{
public:
@@ -50,7 +84,7 @@ class spell_mage_blast_wave : public SpellScriptLoader
{
PrepareSpellScript(spell_mage_blast_wave_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_GLYPH_OF_BLAST_WAVE))
return false;
@@ -75,6 +109,52 @@ class spell_mage_blast_wave : public SpellScriptLoader
}
};
+// -44449 - Burnout
+class spell_mage_burnout : public SpellScriptLoader
+{
+ public:
+ spell_mage_burnout() : SpellScriptLoader("spell_mage_burnout") { }
+
+ class spell_mage_burnout_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_mage_burnout_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_BURNOUT))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetDamageInfo()->GetSpellInfo(); // eventInfo.GetSpellInfo()
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 mana = int32(eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), eventInfo.GetDamageInfo()->GetSchoolMask()));
+ mana = CalculatePct(mana, aurEff->GetAmount());
+
+ GetTarget()->CastCustomSpell(SPELL_MAGE_BURNOUT, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_mage_burnout_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_mage_burnout_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_mage_burnout_AuraScript();
+ }
+};
+
+// 11958 - Cold Snap
class spell_mage_cold_snap : public SpellScriptLoader
{
public:
@@ -91,7 +171,6 @@ class spell_mage_cold_snap : public SpellScriptLoader
void HandleDummy(SpellEffIndex /*effIndex*/)
{
-
Player* caster = GetCaster()->ToPlayer();
// immediately finishes the cooldown on Frost spells
const SpellCooldowns& cm = caster->GetSpellCooldownMap();
@@ -112,7 +191,6 @@ class spell_mage_cold_snap : public SpellScriptLoader
void Register()
{
- // add dummy effect spell handler to Cold Snap
OnEffectHit += SpellEffectFn(spell_mage_cold_snap_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
@@ -123,271 +201,444 @@ class spell_mage_cold_snap : public SpellScriptLoader
}
};
-enum SilvermoonPolymorph
+// -543 - Fire Ward
+// -6143 - Frost Ward
+class spell_mage_fire_frost_ward : public SpellScriptLoader
{
- NPC_AUROSALIA = 18744,
+ public:
+ spell_mage_fire_frost_ward() : SpellScriptLoader("spell_mage_fire_frost_ward") { }
+
+ class spell_mage_fire_frost_ward_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript
+ {
+ PrepareAuraScript(spell_mage_fire_frost_ward_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_TRIGGERED))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_R1))
+ return false;
+ return true;
+ }
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = false;
+ if (Unit* caster = GetCaster())
+ {
+ // +80.68% from sp bonus
+ float bonus = 0.8068f;
+
+ bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
+ bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
+
+ amount += int32(bonus);
+ }
+ }
+
+ void Absorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount)
+ {
+ Unit* target = GetTarget();
+ if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_FROST_WARDING_R1, EFFECT_0))
+ {
+ int32 chance = talentAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); // SPELL_EFFECT_DUMMY with NO_TARGET
+
+ if (roll_chance_i(chance))
+ {
+ int32 bp = dmgInfo.GetDamage();
+ dmgInfo.AbsorbDamage(bp);
+ target->CastCustomSpell(target, SPELL_MAGE_FROST_WARDING_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);
+ absorbAmount = 0;
+ PreventDefaultAction();
+ }
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_fire_frost_ward_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
+ OnEffectAbsorb += AuraEffectAbsorbFn(spell_mage_fire_frost_ward_AuraScript::Absorb, EFFECT_0);
+ AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_fire_frost_ward_AuraScript::Trigger, EFFECT_0);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_mage_fire_frost_ward_AuraScript();
+ }
};
-// TODO: move out of here and rename - not a mage spell
-class spell_mage_polymorph_cast_visual : public SpellScriptLoader
+// 54646 - Focus Magic
+class spell_mage_focus_magic : public SpellScriptLoader
{
public:
- spell_mage_polymorph_cast_visual() : SpellScriptLoader("spell_mage_polymorph_visual") { }
+ spell_mage_focus_magic() : SpellScriptLoader("spell_mage_focus_magic") { }
- class spell_mage_polymorph_cast_visual_SpellScript : public SpellScript
+ class spell_mage_focus_magic_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_mage_polymorph_cast_visual_SpellScript);
+ PrepareAuraScript(spell_mage_focus_magic_AuraScript);
- static const uint32 PolymorhForms[6];
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FOCUS_MAGIC_PROC))
+ return false;
+ return true;
+ }
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Load()
{
- // check if spell ids exist in dbc
- for (uint32 i = 0; i < 6; i++)
- if (!sSpellMgr->GetSpellInfo(PolymorhForms[i]))
- return false;
+ _procTarget = NULL;
return true;
}
- void HandleDummy(SpellEffIndex /*effIndex*/)
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
{
- if (Unit* target = GetCaster()->FindNearestCreature(NPC_AUROSALIA, 30.0f))
- if (target->GetTypeId() == TYPEID_UNIT)
- target->CastSpell(target, PolymorhForms[urand(0, 5)], true);
+ _procTarget = GetCaster();
+ return _procTarget && _procTarget->isAlive();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(_procTarget, SPELL_MAGE_FOCUS_MAGIC_PROC, true, NULL, aurEff);
}
void Register()
{
- // add dummy effect spell handler to Polymorph visual
- OnEffectHitTarget += SpellEffectFn(spell_mage_polymorph_cast_visual_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ DoCheckProc += AuraCheckProcFn(spell_mage_focus_magic_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_mage_focus_magic_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MOD_SPELL_CRIT_CHANCE);
}
+
+ private:
+ Unit* _procTarget;
};
- SpellScript* GetSpellScript() const
+ AuraScript* GetAuraScript() const
{
- return new spell_mage_polymorph_cast_visual_SpellScript();
+ return new spell_mage_focus_magic_AuraScript();
}
};
-const uint32 spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_SpellScript::PolymorhForms[6] =
+// -11426 - Ice Barrier
+class spell_mage_ice_barrier : public SpellScriptLoader
{
- SPELL_MAGE_SQUIRREL_FORM,
- SPELL_MAGE_GIRAFFE_FORM,
- SPELL_MAGE_SERPENT_FORM,
- SPELL_MAGE_DRAGONHAWK_FORM,
- SPELL_MAGE_WORGEN_FORM,
- SPELL_MAGE_SHEEP_FORM
+ public:
+ spell_mage_ice_barrier() : SpellScriptLoader("spell_mage_ice_barrier") { }
+
+ class spell_mage_ice_barrier_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript
+ {
+ PrepareAuraScript(spell_mage_ice_barrier_AuraScript);
+
+ void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = false;
+ if (Unit* caster = GetCaster())
+ {
+ // +80.68% from sp bonus
+ float bonus = 0.8068f;
+
+ bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
+
+ // Glyph of Ice Barrier: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :)
+ // Glyph of Ice Barrier is only applied at the spell damage bonus because it was already applied to the base value in CalculateSpellDamage
+ bonus = caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), bonus);
+
+ bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
+
+ amount += int32(bonus);
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_ice_barrier_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
+ AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_ice_barrier_AuraScript::Trigger, EFFECT_0);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_mage_ice_barrier_AuraScript();
+ }
};
-class spell_mage_summon_water_elemental : public SpellScriptLoader
+// -11119 - Ignite
+class spell_mage_ignite : public SpellScriptLoader
{
public:
- spell_mage_summon_water_elemental() : SpellScriptLoader("spell_mage_summon_water_elemental") { }
+ spell_mage_ignite() : SpellScriptLoader("spell_mage_ignite") { }
- class spell_mage_summon_water_elemental_SpellScript : public SpellScript
+ class spell_mage_ignite_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_mage_summon_water_elemental_SpellScript);
+ PrepareAuraScript(spell_mage_ignite_AuraScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER) || !sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY) || !sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT))
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_IGNITE))
return false;
return true;
}
- void HandleDummy(SpellEffIndex /*effIndex*/)
+ bool CheckProc(ProcEventInfo& eventInfo)
{
- Unit* caster = GetCaster();
- // Glyph of Eternal Water
- if (caster->HasAura(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER))
- caster->CastSpell(caster, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT, true);
- else
- caster->CastSpell(caster, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY, true);
+ return eventInfo.GetProcTarget();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ SpellInfo const* igniteDot = sSpellMgr->GetSpellInfo(SPELL_MAGE_IGNITE);
+ int32 pct = 8 * GetSpellInfo()->GetRank();
+
+ int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot->GetMaxTicks());
+ amount += eventInfo.GetProcTarget()->GetRemainingPeriodicAmount(eventInfo.GetActor()->GetGUID(), SPELL_MAGE_IGNITE, SPELL_AURA_PERIODIC_DAMAGE);
+ GetTarget()->CastCustomSpell(SPELL_MAGE_IGNITE, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, NULL, aurEff);
}
void Register()
{
- // add dummy effect spell handler to Summon Water Elemental
- OnEffectHit += SpellEffectFn(spell_mage_summon_water_elemental_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ DoCheckProc += AuraCheckProcFn(spell_mage_ignite_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_mage_ignite_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
}
};
- SpellScript* GetSpellScript() const
+ AuraScript* GetAuraScript() const
{
- return new spell_mage_summon_water_elemental_SpellScript();
+ return new spell_mage_ignite_AuraScript();
}
};
-// Frost Warding
-class spell_mage_frost_warding_trigger : public SpellScriptLoader
+// -44457 - Living Bomb
+class spell_mage_living_bomb : public SpellScriptLoader
{
public:
- spell_mage_frost_warding_trigger() : SpellScriptLoader("spell_mage_frost_warding_trigger") { }
+ spell_mage_living_bomb() : SpellScriptLoader("spell_mage_living_bomb") { }
- class spell_mage_frost_warding_trigger_AuraScript : public AuraScript
+ class spell_mage_living_bomb_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_mage_frost_warding_trigger_AuraScript);
-
- enum Spells
- {
- SPELL_MAGE_FROST_WARDING_TRIGGERED = 57776,
- SPELL_MAGE_FROST_WARDING_R1 = 28332,
- };
+ PrepareAuraScript(spell_mage_living_bomb_AuraScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* spell)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_R1))
+ if (!sSpellMgr->GetSpellInfo(uint32(spell->Effects[EFFECT_1].CalcValue())))
return false;
return true;
}
- void Absorb(AuraEffect* aurEff, DamageInfo & dmgInfo, uint32 & absorbAmount)
+ void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
- Unit* target = GetTarget();
- if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_FROST_WARDING_R1, EFFECT_0))
- {
- int32 chance = talentAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue();
+ AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode();
+ if (removeMode != AURA_REMOVE_BY_ENEMY_SPELL && removeMode != AURA_REMOVE_BY_EXPIRE)
+ return;
- if (roll_chance_i(chance))
- {
- int32 bp = dmgInfo.GetDamage();
- dmgInfo.AbsorbDamage(bp);
- target->CastCustomSpell(target, SPELL_MAGE_FROST_WARDING_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);
- absorbAmount = 0;
- PreventDefaultAction();
- }
- }
+ if (Unit* caster = GetCaster())
+ caster->CastSpell(GetTarget(), uint32(aurEff->GetAmount()), true, NULL, aurEff);
}
void Register()
{
- OnEffectAbsorb += AuraEffectAbsorbFn(spell_mage_frost_warding_trigger_AuraScript::Absorb, EFFECT_0);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_mage_living_bomb_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const
{
- return new spell_mage_frost_warding_trigger_AuraScript();
+ return new spell_mage_living_bomb_AuraScript();
}
};
-class spell_mage_incanters_absorbtion_base_AuraScript : public AuraScript
+// -1463 - Mana Shield
+class spell_mage_mana_shield : public SpellScriptLoader
{
public:
- enum Spells
+ spell_mage_mana_shield() : SpellScriptLoader("spell_mage_mana_shield") { }
+
+ class spell_mage_mana_shield_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript
{
- SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED = 44413,
- SPELL_MAGE_INCANTERS_ABSORBTION_R1 = 44394,
+ PrepareAuraScript(spell_mage_mana_shield_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = false;
+ if (Unit* caster = GetCaster())
+ {
+ // +80.53% from sp bonus
+ float bonus = 0.8053f;
+
+ bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
+ bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
+
+ amount += int32(bonus);
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_mana_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MANA_SHIELD);
+ AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_mana_shield_AuraScript::Trigger, EFFECT_0);
+ }
};
- bool Validate(SpellInfo const* /*spellEntry*/)
+ AuraScript* GetAuraScript() const
{
- return sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED)
- && sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_R1);
+ return new spell_mage_mana_shield_AuraScript();
}
+};
- void Trigger(AuraEffect* aurEff, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount)
+// -29074 - Master of Elements
+class spell_mage_master_of_elements : public SpellScriptLoader
+{
+ public:
+ spell_mage_master_of_elements() : SpellScriptLoader("spell_mage_master_of_elements") { }
+
+ class spell_mage_master_of_elements_AuraScript : public AuraScript
{
- Unit* target = GetTarget();
+ PrepareAuraScript(spell_mage_master_of_elements_AuraScript);
- if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_INCANTERS_ABSORBTION_R1, EFFECT_0))
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount());
- target->CastCustomSpell(target, SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE))
+ return false;
+ return true;
}
- }
-};
-// Incanter's Absorption
-class spell_mage_incanters_absorbtion_absorb : public SpellScriptLoader
-{
-public:
- spell_mage_incanters_absorbtion_absorb() : SpellScriptLoader("spell_mage_incanters_absorbtion_absorb") { }
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetDamageInfo()->GetSpellInfo(); // eventInfo.GetSpellInfo()
+ }
- class spell_mage_incanters_absorbtion_absorb_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript
- {
- PrepareAuraScript(spell_mage_incanters_absorbtion_absorb_AuraScript);
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 mana = int32(eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), eventInfo.GetDamageInfo()->GetSchoolMask()));
+ mana = CalculatePct(mana, aurEff->GetAmount());
+
+ if (mana > 0)
+ GetTarget()->CastCustomSpell(SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_mage_master_of_elements_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_mage_master_of_elements_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
- void Register()
+ AuraScript* GetAuraScript() const
{
- AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_incanters_absorbtion_absorb_AuraScript::Trigger, EFFECT_0);
+ return new spell_mage_master_of_elements_AuraScript();
}
- };
+};
- AuraScript* GetAuraScript() const
- {
- return new spell_mage_incanters_absorbtion_absorb_AuraScript();
- }
+enum SilvermoonPolymorph
+{
+ NPC_AUROSALIA = 18744,
};
-// Incanter's Absorption
-class spell_mage_incanters_absorbtion_manashield : public SpellScriptLoader
+/// @todo move out of here and rename - not a mage spell
+// 32826 - Polymorph (Visual)
+class spell_mage_polymorph_cast_visual : public SpellScriptLoader
{
-public:
- spell_mage_incanters_absorbtion_manashield() : SpellScriptLoader("spell_mage_incanters_absorbtion_manashield") { }
+ public:
+ spell_mage_polymorph_cast_visual() : SpellScriptLoader("spell_mage_polymorph_visual") { }
+
+ class spell_mage_polymorph_cast_visual_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_mage_polymorph_cast_visual_SpellScript);
- class spell_mage_incanters_absorbtion_manashield_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript
- {
- PrepareAuraScript(spell_mage_incanters_absorbtion_manashield_AuraScript);
+ static const uint32 PolymorhForms[6];
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ // check if spell ids exist in dbc
+ for (uint32 i = 0; i < 6; ++i)
+ if (!sSpellMgr->GetSpellInfo(PolymorhForms[i]))
+ return false;
+ return true;
+ }
- void Register()
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ if (Unit* target = GetCaster()->FindNearestCreature(NPC_AUROSALIA, 30.0f))
+ if (target->GetTypeId() == TYPEID_UNIT)
+ target->CastSpell(target, PolymorhForms[urand(0, 5)], true);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_mage_polymorph_cast_visual_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
{
- AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_incanters_absorbtion_manashield_AuraScript::Trigger, EFFECT_0);
+ return new spell_mage_polymorph_cast_visual_SpellScript();
}
- };
+};
- AuraScript* GetAuraScript() const
- {
- return new spell_mage_incanters_absorbtion_manashield_AuraScript();
- }
+const uint32 spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_SpellScript::PolymorhForms[6] =
+{
+ SPELL_MAGE_SQUIRREL_FORM,
+ SPELL_MAGE_GIRAFFE_FORM,
+ SPELL_MAGE_SERPENT_FORM,
+ SPELL_MAGE_DRAGONHAWK_FORM,
+ SPELL_MAGE_WORGEN_FORM,
+ SPELL_MAGE_SHEEP_FORM
};
-class spell_mage_living_bomb : public SpellScriptLoader
+// 31687 - Summon Water Elemental
+class spell_mage_summon_water_elemental : public SpellScriptLoader
{
public:
- spell_mage_living_bomb() : SpellScriptLoader("spell_mage_living_bomb") { }
+ spell_mage_summon_water_elemental() : SpellScriptLoader("spell_mage_summon_water_elemental") { }
- class spell_mage_living_bomb_AuraScript : public AuraScript
+ class spell_mage_summon_water_elemental_SpellScript : public SpellScript
{
- PrepareAuraScript(spell_mage_living_bomb_AuraScript);
+ PrepareSpellScript(spell_mage_summon_water_elemental_SpellScript);
- bool Validate(SpellInfo const* spell)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(uint32(spell->Effects[EFFECT_1].CalcValue())))
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER) || !sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY) || !sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT))
return false;
return true;
}
- void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
- AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode();
- if (removeMode != AURA_REMOVE_BY_ENEMY_SPELL && removeMode != AURA_REMOVE_BY_EXPIRE)
- return;
-
- if (Unit* caster = GetCaster())
- caster->CastSpell(GetTarget(), uint32(aurEff->GetAmount()), true, NULL, aurEff);
+ Unit* caster = GetCaster();
+ // Glyph of Eternal Water
+ if (caster->HasAura(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER))
+ caster->CastSpell(caster, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT, true);
+ else
+ caster->CastSpell(caster, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY, true);
}
void Register()
{
- AfterEffectRemove += AuraEffectRemoveFn(spell_mage_living_bomb_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ OnEffectHit += SpellEffectFn(spell_mage_summon_water_elemental_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
- AuraScript* GetAuraScript() const
+ SpellScript* GetSpellScript() const
{
- return new spell_mage_living_bomb_AuraScript();
+ return new spell_mage_summon_water_elemental_SpellScript();
}
};
void AddSC_mage_spell_scripts()
{
new spell_mage_blast_wave();
+ new spell_mage_burnout();
new spell_mage_cold_snap();
- new spell_mage_frost_warding_trigger();
- new spell_mage_incanters_absorbtion_absorb();
- new spell_mage_incanters_absorbtion_manashield();
+ new spell_mage_fire_frost_ward();
+ new spell_mage_focus_magic();
+ new spell_mage_ice_barrier();
+ new spell_mage_ignite();
+ new spell_mage_living_bomb();
+ new spell_mage_mana_shield();
+ new spell_mage_master_of_elements();
new spell_mage_polymorph_cast_visual();
new spell_mage_summon_water_elemental();
- new spell_mage_living_bomb();
}
diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp
index 07d903c9587..6be2453affb 100644
--- a/src/server/scripts/Spells/spell_paladin.cpp
+++ b/src/server/scripts/Spells/spell_paladin.cpp
@@ -29,28 +29,40 @@
enum PaladinSpells
{
- PALADIN_SPELL_DIVINE_PLEA = 54428,
- PALADIN_SPELL_BLESSING_OF_SANCTUARY_BUFF = 67480,
+ SPELL_PALADIN_DIVINE_PLEA = 54428,
+ SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF = 67480,
+ SPELL_PALADIN_BLESSING_OF_SANCTUARY_ENERGIZE = 57319,
- PALADIN_SPELL_HOLY_SHOCK_R1 = 20473,
- PALADIN_SPELL_HOLY_SHOCK_R1_DAMAGE = 25912,
- PALADIN_SPELL_HOLY_SHOCK_R1_HEALING = 25914,
+ SPELL_PALADIN_HOLY_SHOCK_R1 = 20473,
+ SPELL_PALADIN_HOLY_SHOCK_R1_DAMAGE = 25912,
+ SPELL_PALADIN_HOLY_SHOCK_R1_HEALING = 25914,
- SPELL_BLESSING_OF_LOWER_CITY_DRUID = 37878,
- SPELL_BLESSING_OF_LOWER_CITY_PALADIN = 37879,
- SPELL_BLESSING_OF_LOWER_CITY_PRIEST = 37880,
- SPELL_BLESSING_OF_LOWER_CITY_SHAMAN = 37881,
+ SPELL_PALADIN_BLESSING_OF_LOWER_CITY_DRUID = 37878,
+ SPELL_PALADIN_BLESSING_OF_LOWER_CITY_PALADIN = 37879,
+ SPELL_PALADIN_BLESSING_OF_LOWER_CITY_PRIEST = 37880,
+ SPELL_PALADIN_BLESSING_OF_LOWER_CITY_SHAMAN = 37881,
- SPELL_DIVINE_STORM = 53385,
- SPELL_DIVINE_STORM_DUMMY = 54171,
- SPELL_DIVINE_STORM_HEAL = 54172,
+ SPELL_PALADIN_DIVINE_STORM = 53385,
+ SPELL_PALADIN_DIVINE_STORM_DUMMY = 54171,
+ SPELL_PALADIN_DIVINE_STORM_HEAL = 54172,
- SPELL_FORBEARANCE = 25771,
- SPELL_AVENGING_WRATH_MARKER = 61987,
- SPELL_IMMUNE_SHIELD_MARKER = 61988,
+ SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE = 25997,
- SPELL_HAND_OF_SACRIFICE = 6940,
- SPELL_DIVINE_SACRIFICE = 64205,
+ SPELL_PALADIN_FORBEARANCE = 25771,
+ SPELL_PALADIN_AVENGING_WRATH_MARKER = 61987,
+ SPELL_PALADIN_IMMUNE_SHIELD_MARKER = 61988,
+
+ SPELL_PALADIN_HAND_OF_SACRIFICE = 6940,
+ SPELL_PALADIN_DIVINE_SACRIFICE = 64205,
+
+ SPELL_PALADIN_GLYPH_OF_SALVATION = 63225,
+
+ SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT = 31790,
+
+ SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS = 25742,
+
+ SPELL_GENERIC_ARENA_DAMPENING = 74410,
+ SPELL_GENERIC_BATTLEGROUND_DAMPENING = 74411
};
// 31850 - Ardent Defender
@@ -129,6 +141,7 @@ class spell_pal_ardent_defender : public SpellScriptLoader
}
};
+// 37877 - Blessing of Faith
class spell_pal_blessing_of_faith : public SpellScriptLoader
{
public:
@@ -138,9 +151,9 @@ class spell_pal_blessing_of_faith : public SpellScriptLoader
{
PrepareSpellScript(spell_pal_blessing_of_faith_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_BLESSING_OF_LOWER_CITY_DRUID) || !sSpellMgr->GetSpellInfo(SPELL_BLESSING_OF_LOWER_CITY_PALADIN) || !sSpellMgr->GetSpellInfo(SPELL_BLESSING_OF_LOWER_CITY_PRIEST) || !sSpellMgr->GetSpellInfo(SPELL_BLESSING_OF_LOWER_CITY_SHAMAN))
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_LOWER_CITY_DRUID) || !sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_LOWER_CITY_PALADIN) || !sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_LOWER_CITY_PRIEST) || !sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_LOWER_CITY_SHAMAN))
return false;
return true;
}
@@ -152,11 +165,20 @@ class spell_pal_blessing_of_faith : public SpellScriptLoader
uint32 spell_id = 0;
switch (unitTarget->getClass())
{
- case CLASS_DRUID: spell_id = SPELL_BLESSING_OF_LOWER_CITY_DRUID; break;
- case CLASS_PALADIN: spell_id = SPELL_BLESSING_OF_LOWER_CITY_PALADIN; break;
- case CLASS_PRIEST: spell_id = SPELL_BLESSING_OF_LOWER_CITY_PRIEST; break;
- case CLASS_SHAMAN: spell_id = SPELL_BLESSING_OF_LOWER_CITY_SHAMAN; break;
- default: return; // ignore for non-healing classes
+ case CLASS_DRUID:
+ spell_id = SPELL_PALADIN_BLESSING_OF_LOWER_CITY_DRUID;
+ break;
+ case CLASS_PALADIN:
+ spell_id = SPELL_PALADIN_BLESSING_OF_LOWER_CITY_PALADIN;
+ break;
+ case CLASS_PRIEST:
+ spell_id = SPELL_PALADIN_BLESSING_OF_LOWER_CITY_PRIEST;
+ break;
+ case CLASS_SHAMAN:
+ spell_id = SPELL_PALADIN_BLESSING_OF_LOWER_CITY_SHAMAN;
+ break;
+ default:
+ return; // ignore for non-healing classes
}
Unit* caster = GetCaster();
caster->CastSpell(caster, spell_id, true);
@@ -165,7 +187,6 @@ class spell_pal_blessing_of_faith : public SpellScriptLoader
void Register()
{
- // add dummy effect spell handler to Blessing of Faith
OnEffectHitTarget += SpellEffectFn(spell_pal_blessing_of_faith_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
@@ -176,8 +197,8 @@ class spell_pal_blessing_of_faith : public SpellScriptLoader
}
};
-// 20911 Blessing of Sanctuary
-// 25899 Greater Blessing of Sanctuary
+// 20911 - Blessing of Sanctuary
+// 25899 - Greater Blessing of Sanctuary
class spell_pal_blessing_of_sanctuary : public SpellScriptLoader
{
public:
@@ -187,9 +208,11 @@ class spell_pal_blessing_of_sanctuary : public SpellScriptLoader
{
PrepareAuraScript(spell_pal_blessing_of_sanctuary_AuraScript);
- bool Validate(SpellInfo const* /*entry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(PALADIN_SPELL_BLESSING_OF_SANCTUARY_BUFF))
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_SANCTUARY_ENERGIZE))
return false;
return true;
}
@@ -198,19 +221,32 @@ class spell_pal_blessing_of_sanctuary : public SpellScriptLoader
{
Unit* target = GetTarget();
if (Unit* caster = GetCaster())
- caster->CastSpell(target, PALADIN_SPELL_BLESSING_OF_SANCTUARY_BUFF, true);
+ caster->CastSpell(target, SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF, true);
}
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Unit* target = GetTarget();
- target->RemoveAura(PALADIN_SPELL_BLESSING_OF_SANCTUARY_BUFF, GetCasterGUID());
+ target->RemoveAura(SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF, GetCasterGUID());
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ return GetTarget()->getPowerType() == POWER_MANA;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(GetTarget(), SPELL_PALADIN_BLESSING_OF_SANCTUARY_ENERGIZE, true, NULL, aurEff);
}
void Register()
{
AfterEffectApply += AuraEffectApplyFn(spell_pal_blessing_of_sanctuary_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
AfterEffectRemove += AuraEffectRemoveFn(spell_pal_blessing_of_sanctuary_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ DoCheckProc += AuraCheckProcFn(spell_pal_blessing_of_sanctuary_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_pal_blessing_of_sanctuary_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
}
};
@@ -220,7 +256,225 @@ class spell_pal_blessing_of_sanctuary : public SpellScriptLoader
}
};
-// 63521 Guarded by The Light
+// 64205 - Divine Sacrifice
+class spell_pal_divine_sacrifice : public SpellScriptLoader
+{
+ public:
+ spell_pal_divine_sacrifice() : SpellScriptLoader("spell_pal_divine_sacrifice") { }
+
+ class spell_pal_divine_sacrifice_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pal_divine_sacrifice_AuraScript);
+
+ uint32 groupSize, minHpPct;
+ int32 remainingAmount;
+
+ bool Load()
+ {
+
+ if (Unit* caster = GetCaster())
+ {
+ if (caster->GetTypeId() == TYPEID_PLAYER)
+ {
+ if (caster->ToPlayer()->GetGroup())
+ groupSize = caster->ToPlayer()->GetGroup()->GetMembersCount();
+ else
+ groupSize = 1;
+ }
+ else
+ return false;
+
+ remainingAmount = (caster->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster)) * groupSize);
+ minHpPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(caster);
+ return true;
+ }
+ return false;
+ }
+
+ void Split(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & splitAmount)
+ {
+ remainingAmount -= splitAmount;
+ // break when absorbed everything it could, or if the casters hp drops below 20%
+ if (Unit* caster = GetCaster())
+ if (remainingAmount <= 0 || (caster->GetHealthPct() < minHpPct))
+ caster->RemoveAura(SPELL_PALADIN_DIVINE_SACRIFICE);
+ }
+
+ void Register()
+ {
+ OnEffectSplit += AuraEffectSplitFn(spell_pal_divine_sacrifice_AuraScript::Split, EFFECT_0);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pal_divine_sacrifice_AuraScript();
+ }
+};
+
+// 53385 - Divine Storm
+class spell_pal_divine_storm : public SpellScriptLoader
+{
+ public:
+ spell_pal_divine_storm() : SpellScriptLoader("spell_pal_divine_storm") { }
+
+ class spell_pal_divine_storm_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_pal_divine_storm_SpellScript);
+
+ uint32 healPct;
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_DIVINE_STORM_DUMMY))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ healPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster());
+ return true;
+ }
+
+ void TriggerHeal()
+ {
+ Unit* caster = GetCaster();
+ caster->CastCustomSpell(SPELL_PALADIN_DIVINE_STORM_DUMMY, SPELLVALUE_BASE_POINT0, (GetHitDamage() * healPct) / 100, caster, true);
+ }
+
+ void Register()
+ {
+ AfterHit += SpellHitFn(spell_pal_divine_storm_SpellScript::TriggerHeal);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_pal_divine_storm_SpellScript();
+ }
+};
+
+// 54171 - Divine Storm (Dummy)
+class spell_pal_divine_storm_dummy : public SpellScriptLoader
+{
+ public:
+ spell_pal_divine_storm_dummy() : SpellScriptLoader("spell_pal_divine_storm_dummy") { }
+
+ class spell_pal_divine_storm_dummy_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_pal_divine_storm_dummy_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_DIVINE_STORM_HEAL))
+ return false;
+ return true;
+ }
+
+ void CountTargets(std::list<WorldObject*>& targetList)
+ {
+ _targetCount = targetList.size();
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ if (!_targetCount || ! GetHitUnit())
+ return;
+
+ int32 heal = GetEffectValue() / _targetCount;
+ GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_PALADIN_DIVINE_STORM_HEAL, &heal, NULL, NULL, true);
+ }
+ private:
+ uint32 _targetCount;
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_pal_divine_storm_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_divine_storm_dummy_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_RAID);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_pal_divine_storm_dummy_SpellScript();
+ }
+};
+
+// 33695 - Exorcism and Holy Wrath Damage
+class spell_pal_exorcism_and_holy_wrath_damage : public SpellScriptLoader
+{
+ public:
+ spell_pal_exorcism_and_holy_wrath_damage() : SpellScriptLoader("spell_pal_exorcism_and_holy_wrath_damage") { }
+
+ class spell_pal_exorcism_and_holy_wrath_damage_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pal_exorcism_and_holy_wrath_damage_AuraScript);
+
+ void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod)
+ {
+ if (!spellMod)
+ {
+ spellMod = new SpellModifier(aurEff->GetBase());
+ spellMod->op = SPELLMOD_DAMAGE;
+ spellMod->type = SPELLMOD_FLAT;
+ spellMod->spellId = GetId();
+ spellMod->mask[1] = 0x200002;
+ }
+
+ spellMod->value = aurEff->GetAmount();
+ }
+
+ void Register()
+ {
+ DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_pal_exorcism_and_holy_wrath_damage_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pal_exorcism_and_holy_wrath_damage_AuraScript();
+ }
+};
+
+// -9799 - Eye for an Eye
+class spell_pal_eye_for_an_eye : public SpellScriptLoader
+{
+ public:
+ spell_pal_eye_for_an_eye() : SpellScriptLoader("spell_pal_eye_for_an_eye") { }
+
+ class spell_pal_eye_for_an_eye_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pal_eye_for_an_eye_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE))
+ return false;
+ return true;
+ }
+
+ void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ // return damage % to attacker but < 50% own total health
+ int32 damage = int32(std::min(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()), GetTarget()->GetMaxHealth() / 2));
+ GetTarget()->CastCustomSpell(SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_pal_eye_for_an_eye_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pal_eye_for_an_eye_AuraScript();
+ }
+};
+
+// 63521 - Guarded by The Light
class spell_pal_guarded_by_the_light : public SpellScriptLoader
{
public:
@@ -230,9 +484,9 @@ class spell_pal_guarded_by_the_light : public SpellScriptLoader
{
PrepareSpellScript(spell_pal_guarded_by_the_light_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(PALADIN_SPELL_DIVINE_PLEA))
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_DIVINE_PLEA))
return false;
return true;
}
@@ -240,7 +494,7 @@ class spell_pal_guarded_by_the_light : public SpellScriptLoader
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
// Divine Plea
- if (Aura* aura = GetCaster()->GetAura(PALADIN_SPELL_DIVINE_PLEA))
+ if (Aura* aura = GetCaster()->GetAura(SPELL_PALADIN_DIVINE_PLEA))
aura->RefreshDuration();
}
@@ -256,6 +510,84 @@ class spell_pal_guarded_by_the_light : public SpellScriptLoader
}
};
+// 6940 - Hand of Sacrifice
+class spell_pal_hand_of_sacrifice : public SpellScriptLoader
+{
+ public:
+ spell_pal_hand_of_sacrifice() : SpellScriptLoader("spell_pal_hand_of_sacrifice") { }
+
+ class spell_pal_hand_of_sacrifice_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pal_hand_of_sacrifice_AuraScript);
+
+ int32 remainingAmount;
+
+ bool Load()
+ {
+ if (Unit* caster = GetCaster())
+ {
+ remainingAmount = caster->GetMaxHealth();
+ return true;
+ }
+ return false;
+ }
+
+ void Split(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & splitAmount)
+ {
+ remainingAmount -= splitAmount;
+
+ if (remainingAmount <= 0)
+ {
+ GetTarget()->RemoveAura(SPELL_PALADIN_HAND_OF_SACRIFICE);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectSplit += AuraEffectSplitFn(spell_pal_hand_of_sacrifice_AuraScript::Split, EFFECT_0);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pal_hand_of_sacrifice_AuraScript();
+ }
+};
+
+// 1038 - Hand of Salvation
+class spell_pal_hand_of_salvation : public SpellScriptLoader
+{
+ public:
+ spell_pal_hand_of_salvation() : SpellScriptLoader("spell_pal_hand_of_salvation") { }
+
+ class spell_pal_hand_of_salvation_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pal_hand_of_salvation_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ // Glyph of Salvation
+ if (caster->GetGUID() == GetUnitOwner()->GetGUID())
+ if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_PALADIN_GLYPH_OF_SALVATION, EFFECT_0))
+ amount -= aurEff->GetAmount();
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pal_hand_of_salvation_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pal_hand_of_salvation_AuraScript();
+ }
+};
+
+// -20473 - Holy Shock
class spell_pal_holy_shock : public SpellScriptLoader
{
public:
@@ -267,15 +599,15 @@ class spell_pal_holy_shock : public SpellScriptLoader
bool Validate(SpellInfo const* spell)
{
- if (!sSpellMgr->GetSpellInfo(PALADIN_SPELL_HOLY_SHOCK_R1))
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_HOLY_SHOCK_R1))
return false;
// can't use other spell than holy shock due to spell_ranks dependency
- if (sSpellMgr->GetFirstSpellInChain(PALADIN_SPELL_HOLY_SHOCK_R1) != sSpellMgr->GetFirstSpellInChain(spell->Id))
+ if (sSpellMgr->GetFirstSpellInChain(SPELL_PALADIN_HOLY_SHOCK_R1) != sSpellMgr->GetFirstSpellInChain(spell->Id))
return false;
uint8 rank = sSpellMgr->GetSpellRank(spell->Id);
- if (!sSpellMgr->GetSpellWithRank(PALADIN_SPELL_HOLY_SHOCK_R1_DAMAGE, rank, true) || !sSpellMgr->GetSpellWithRank(PALADIN_SPELL_HOLY_SHOCK_R1_HEALING, rank, true))
+ if (!sSpellMgr->GetSpellWithRank(SPELL_PALADIN_HOLY_SHOCK_R1_DAMAGE, rank, true) || !sSpellMgr->GetSpellWithRank(SPELL_PALADIN_HOLY_SHOCK_R1_HEALING, rank, true))
return false;
return true;
@@ -288,9 +620,9 @@ class spell_pal_holy_shock : public SpellScriptLoader
{
uint8 rank = sSpellMgr->GetSpellRank(GetSpellInfo()->Id);
if (caster->IsFriendlyTo(unitTarget))
- caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(PALADIN_SPELL_HOLY_SHOCK_R1_HEALING, rank), true, 0);
+ caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PALADIN_HOLY_SHOCK_R1_HEALING, rank), true, 0);
else
- caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(PALADIN_SPELL_HOLY_SHOCK_R1_DAMAGE, rank), true, 0);
+ caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PALADIN_HOLY_SHOCK_R1_DAMAGE, rank), true, 0);
}
}
@@ -315,7 +647,6 @@ class spell_pal_holy_shock : public SpellScriptLoader
void Register()
{
- // add dummy effect spell handler to Holy Shock
OnCheckCast += SpellCheckCastFn(spell_pal_holy_shock_SpellScript::CheckCast);
OnEffectHitTarget += SpellEffectFn(spell_pal_holy_shock_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
@@ -327,6 +658,7 @@ class spell_pal_holy_shock : public SpellScriptLoader
}
};
+// 20425 - Judgement of Command
class spell_pal_judgement_of_command : public SpellScriptLoader
{
public:
@@ -334,7 +666,8 @@ class spell_pal_judgement_of_command : public SpellScriptLoader
class spell_pal_judgement_of_command_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_pal_judgement_of_command_SpellScript)
+ PrepareSpellScript(spell_pal_judgement_of_command_SpellScript);
+
void HandleDummy(SpellEffIndex /*effIndex*/)
{
if (Unit* unitTarget = GetHitUnit())
@@ -344,7 +677,6 @@ class spell_pal_judgement_of_command : public SpellScriptLoader
void Register()
{
- // add dummy effect spell handler to Judgement of Command
OnEffectHitTarget += SpellEffectFn(spell_pal_judgement_of_command_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
@@ -355,93 +687,7 @@ class spell_pal_judgement_of_command : public SpellScriptLoader
}
};
-class spell_pal_divine_storm : public SpellScriptLoader
-{
- public:
- spell_pal_divine_storm() : SpellScriptLoader("spell_pal_divine_storm") { }
-
- class spell_pal_divine_storm_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_pal_divine_storm_SpellScript);
-
- uint32 healPct;
-
- bool Validate(SpellInfo const* /* spell */)
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_DIVINE_STORM_DUMMY))
- return false;
- return true;
- }
-
- bool Load()
- {
- healPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster());
- return true;
- }
-
- void TriggerHeal()
- {
- Unit* caster = GetCaster();
- caster->CastCustomSpell(SPELL_DIVINE_STORM_DUMMY, SPELLVALUE_BASE_POINT0, (GetHitDamage() * healPct) / 100, caster, true);
- }
-
- void Register()
- {
- AfterHit += SpellHitFn(spell_pal_divine_storm_SpellScript::TriggerHeal);
- }
- };
-
- SpellScript* GetSpellScript() const
- {
- return new spell_pal_divine_storm_SpellScript();
- }
-};
-
-class spell_pal_divine_storm_dummy : public SpellScriptLoader
-{
- public:
- spell_pal_divine_storm_dummy() : SpellScriptLoader("spell_pal_divine_storm_dummy") { }
-
- class spell_pal_divine_storm_dummy_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_pal_divine_storm_dummy_SpellScript);
-
- bool Validate(SpellInfo const* /* spell */)
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_DIVINE_STORM_HEAL))
- return false;
- return true;
- }
-
- void CountTargets(std::list<WorldObject*>& targetList)
- {
- _targetCount = targetList.size();
- }
-
- void HandleDummy(SpellEffIndex /* effIndex */)
- {
- if (!_targetCount || ! GetHitUnit())
- return;
-
- int32 heal = GetEffectValue() / _targetCount;
- GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_DIVINE_STORM_HEAL, &heal, NULL, NULL, true);
- }
- private:
- uint32 _targetCount;
-
- void Register()
- {
- OnEffectHitTarget += SpellEffectFn(spell_pal_divine_storm_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_divine_storm_dummy_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_RAID);
- }
- };
-
- SpellScript* GetSpellScript() const
- {
- return new spell_pal_divine_storm_dummy_SpellScript();
- }
-};
-
+// -633 - Lay on Hands
class spell_pal_lay_on_hands : public SpellScriptLoader
{
public:
@@ -453,11 +699,11 @@ class spell_pal_lay_on_hands : public SpellScriptLoader
bool Validate(SpellInfo const* /*spell*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_FORBEARANCE))
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_FORBEARANCE))
return false;
- if (!sSpellMgr->GetSpellInfo(SPELL_AVENGING_WRATH_MARKER))
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_AVENGING_WRATH_MARKER))
return false;
- if (!sSpellMgr->GetSpellInfo(SPELL_IMMUNE_SHIELD_MARKER))
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_IMMUNE_SHIELD_MARKER))
return false;
return true;
}
@@ -467,7 +713,7 @@ class spell_pal_lay_on_hands : public SpellScriptLoader
Unit* caster = GetCaster();
if (Unit* target = GetExplTargetUnit())
if (caster == target)
- if (target->HasAura(SPELL_FORBEARANCE) || target->HasAura(SPELL_AVENGING_WRATH_MARKER) || target->HasAura(SPELL_IMMUNE_SHIELD_MARKER))
+ if (target->HasAura(SPELL_PALADIN_FORBEARANCE) || target->HasAura(SPELL_PALADIN_AVENGING_WRATH_MARKER) || target->HasAura(SPELL_PALADIN_IMMUNE_SHIELD_MARKER))
return SPELL_FAILED_TARGET_AURASTATE;
return SPELL_CAST_OK;
@@ -478,9 +724,9 @@ class spell_pal_lay_on_hands : public SpellScriptLoader
Unit* caster = GetCaster();
if (caster == GetHitUnit())
{
- caster->CastSpell(caster, SPELL_FORBEARANCE, true);
- caster->CastSpell(caster, SPELL_AVENGING_WRATH_MARKER, true);
- caster->CastSpell(caster, SPELL_IMMUNE_SHIELD_MARKER, true);
+ caster->CastSpell(caster, SPELL_PALADIN_FORBEARANCE, true);
+ caster->CastSpell(caster, SPELL_PALADIN_AVENGING_WRATH_MARKER, true);
+ caster->CastSpell(caster, SPELL_PALADIN_IMMUNE_SHIELD_MARKER, true);
}
}
@@ -497,6 +743,7 @@ class spell_pal_lay_on_hands : public SpellScriptLoader
}
};
+// 31789 - Righteous Defense
class spell_pal_righteous_defense : public SpellScriptLoader
{
public:
@@ -506,6 +753,13 @@ class spell_pal_righteous_defense : public SpellScriptLoader
{
PrepareSpellScript(spell_pal_righteous_defense_SpellScript);
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT))
+ return false;
+ return true;
+ }
+
SpellCastResult CheckCast()
{
Unit* caster = GetCaster();
@@ -523,148 +777,123 @@ class spell_pal_righteous_defense : public SpellScriptLoader
return SPELL_CAST_OK;
}
- void Register()
+ void HandleTriggerSpellLaunch(SpellEffIndex effIndex)
{
- OnCheckCast += SpellCheckCastFn(spell_pal_righteous_defense_SpellScript::CheckCast);
+ PreventHitDefaultEffect(effIndex);
}
- };
- SpellScript* GetSpellScript() const
- {
- return new spell_pal_righteous_defense_SpellScript();
- }
-};
-
-class spell_pal_exorcism_and_holy_wrath_damage : public SpellScriptLoader
-{
- public:
- spell_pal_exorcism_and_holy_wrath_damage() : SpellScriptLoader("spell_pal_exorcism_and_holy_wrath_damage") { }
-
- class spell_pal_exorcism_and_holy_wrath_damage_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_pal_exorcism_and_holy_wrath_damage_AuraScript);
-
- void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod)
+ void HandleTriggerSpellHit(SpellEffIndex effIndex)
{
- if (!spellMod)
- {
- spellMod = new SpellModifier(aurEff->GetBase());
- spellMod->op = SPELLMOD_DAMAGE;
- spellMod->type = SPELLMOD_FLAT;
- spellMod->spellId = GetId();
- spellMod->mask[1] = 0x200002;
- }
-
- spellMod->value = aurEff->GetAmount();
+ PreventHitDefaultEffect(effIndex);
+ if (Unit* target = GetHitUnit())
+ GetCaster()->CastSpell(target, SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT, true);
}
void Register()
{
- DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_pal_exorcism_and_holy_wrath_damage_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY);
+ OnCheckCast += SpellCheckCastFn(spell_pal_righteous_defense_SpellScript::CheckCast);
+ //! WORKAROUND
+ //! target select will be executed in hitphase of effect 0
+ //! so we must handle trigger spell also in hit phase (default execution in launch phase)
+ //! see issue #3718
+ OnEffectLaunchTarget += SpellEffectFn(spell_pal_righteous_defense_SpellScript::HandleTriggerSpellLaunch, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL);
+ OnEffectHitTarget += SpellEffectFn(spell_pal_righteous_defense_SpellScript::HandleTriggerSpellHit, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL);
}
};
- AuraScript* GetAuraScript() const
+ SpellScript* GetSpellScript() const
{
- return new spell_pal_exorcism_and_holy_wrath_damage_AuraScript();
+ return new spell_pal_righteous_defense_SpellScript();
}
};
-class spell_pal_hand_of_sacrifice : public SpellScriptLoader
+// 58597 - Sacred Shield
+class spell_pal_sacred_shield : public SpellScriptLoader
{
public:
- spell_pal_hand_of_sacrifice() : SpellScriptLoader("spell_pal_hand_of_sacrifice") { }
+ spell_pal_sacred_shield() : SpellScriptLoader("spell_pal_sacred_shield") { }
- class spell_pal_hand_of_sacrifice_AuraScript : public AuraScript
+ class spell_pal_sacred_shield_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_pal_hand_of_sacrifice_AuraScript);
-
- int32 remainingAmount;
+ PrepareAuraScript(spell_pal_sacred_shield_AuraScript);
- bool Load()
+ void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/)
{
if (Unit* caster = GetCaster())
{
- remainingAmount = caster->GetMaxHealth();
- return true;
- }
- return false;
- }
+ // +75.00% from sp bonus
+ float bonus = CalculatePct(caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()), 75.0f);
- void Split(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & splitAmount)
- {
- remainingAmount -= splitAmount;
+ // Divine Guardian is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage
+ bonus = caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), bonus);
+ bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
- if (remainingAmount <= 0)
- {
- GetTarget()->RemoveAura(SPELL_HAND_OF_SACRIFICE);
+ amount += int32(bonus);
+
+ // Arena - Dampening
+ if (AuraEffect const* dampening = caster->GetAuraEffect(SPELL_GENERIC_ARENA_DAMPENING, EFFECT_0))
+ AddPct(amount, dampening->GetAmount());
+ // Battleground - Dampening
+ else if (AuraEffect const* dampening = caster->GetAuraEffect(SPELL_GENERIC_BATTLEGROUND_DAMPENING, EFFECT_0))
+ AddPct(amount, dampening->GetAmount());
}
}
void Register()
{
- OnEffectSplit += AuraEffectSplitFn(spell_pal_hand_of_sacrifice_AuraScript::Split, EFFECT_0);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pal_sacred_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
}
};
AuraScript* GetAuraScript() const
{
- return new spell_pal_hand_of_sacrifice_AuraScript();
+ return new spell_pal_sacred_shield_AuraScript();
}
};
-class spell_pal_divine_sacrifice : public SpellScriptLoader
+// 20154, 21084 - Seal of Righteousness - melee proc dummy (addition ${$MWS*(0.022*$AP+0.044*$SPH)} damage)
+class spell_pal_seal_of_righteousness : public SpellScriptLoader
{
public:
- spell_pal_divine_sacrifice() : SpellScriptLoader("spell_pal_divine_sacrifice") { }
+ spell_pal_seal_of_righteousness() : SpellScriptLoader("spell_pal_seal_of_righteousness") { }
- class spell_pal_divine_sacrifice_AuraScript : public AuraScript
+ class spell_pal_seal_of_righteousness_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_pal_divine_sacrifice_AuraScript);
+ PrepareAuraScript(spell_pal_seal_of_righteousness_AuraScript);
- uint32 groupSize, minHpPct;
- int32 remainingAmount;
-
- bool Load()
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS))
+ return false;
+ return true;
+ }
- if (Unit* caster = GetCaster())
- {
- if (caster->GetTypeId() == TYPEID_PLAYER)
- {
- if (caster->ToPlayer()->GetGroup())
- groupSize = caster->ToPlayer()->GetGroup()->GetMembersCount();
- else
- groupSize = 1;
- }
- else
- return false;
-
- remainingAmount = (caster->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster)) * groupSize);
- minHpPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(caster);
- return true;
- }
- return false;
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetProcTarget();
}
- void Split(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & splitAmount)
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
{
- remainingAmount -= splitAmount;
- // break when absorbed everything it could, or if the casters hp drops below 20%
- if (Unit* caster = GetCaster())
- if (remainingAmount <= 0 || (caster->GetHealthPct() < minHpPct))
- caster->RemoveAura(SPELL_DIVINE_SACRIFICE);
+ PreventDefaultAction();
+
+ float ap = GetTarget()->GetTotalAttackPowerValue(BASE_ATTACK);
+ int32 holy = GetTarget()->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_HOLY);
+ holy += eventInfo.GetProcTarget()->SpellBaseDamageBonusTaken(SPELL_SCHOOL_MASK_HOLY);
+ int32 bp = int32((ap * 0.022f + 0.044f * holy) * GetTarget()->GetAttackTime(BASE_ATTACK) / 1000);
+ GetTarget()->CastCustomSpell(SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS, SPELLVALUE_BASE_POINT0, bp, eventInfo.GetProcTarget(), true, NULL, aurEff);
}
void Register()
{
- OnEffectSplit += AuraEffectSplitFn(spell_pal_divine_sacrifice_AuraScript::Split, EFFECT_0);
+ DoCheckProc += AuraCheckProcFn(spell_pal_seal_of_righteousness_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_pal_seal_of_righteousness_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
}
};
AuraScript* GetAuraScript() const
{
- return new spell_pal_divine_sacrifice_AuraScript();
+ return new spell_pal_seal_of_righteousness_AuraScript();
}
};
@@ -673,14 +902,18 @@ void AddSC_paladin_spell_scripts()
new spell_pal_ardent_defender();
new spell_pal_blessing_of_faith();
new spell_pal_blessing_of_sanctuary();
+ new spell_pal_divine_sacrifice();
+ new spell_pal_divine_storm();
+ new spell_pal_divine_storm_dummy();
+ new spell_pal_exorcism_and_holy_wrath_damage();
+ new spell_pal_eye_for_an_eye();
new spell_pal_guarded_by_the_light();
+ new spell_pal_hand_of_sacrifice();
+ new spell_pal_hand_of_salvation();
new spell_pal_holy_shock();
new spell_pal_judgement_of_command();
- new spell_pal_divine_storm();
- new spell_pal_divine_storm_dummy();
new spell_pal_lay_on_hands();
new spell_pal_righteous_defense();
- new spell_pal_exorcism_and_holy_wrath_damage();
- new spell_pal_hand_of_sacrifice();
- new spell_pal_divine_sacrifice();
+ new spell_pal_sacred_shield();
+ new spell_pal_seal_of_righteousness();
}
diff --git a/src/server/scripts/Spells/spell_pet.cpp b/src/server/scripts/Spells/spell_pet.cpp
index 5198e555ee1..c4d5562ab39 100644
--- a/src/server/scripts/Spells/spell_pet.cpp
+++ b/src/server/scripts/Spells/spell_pet.cpp
@@ -1451,7 +1451,7 @@ public:
if (pet->GetEntry() == ENTRY_ARMY_OF_THE_DEAD_GHOUL)
amount = -90;
// Night of the dead
- else if ( Aura * aur = owner->GetAuraOfRankedSpell(SPELL_NIGHT_OF_THE_DEAD))
+ else if (Aura* aur = owner->GetAuraOfRankedSpell(SPELL_NIGHT_OF_THE_DEAD))
amount = aur->GetSpellInfo()->Effects[EFFECT_2].CalcValue();
}
}
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index 045df640090..4e86a895484 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -29,20 +29,118 @@
enum PriestSpells
{
- PRIEST_SPELL_GUARDIAN_SPIRIT_HEAL = 48153,
- PRIEST_SPELL_PENANCE_R1 = 47540,
- PRIEST_SPELL_PENANCE_R1_DAMAGE = 47758,
- PRIEST_SPELL_PENANCE_R1_HEAL = 47757,
- PRIEST_SPELL_REFLECTIVE_SHIELD_TRIGGERED = 33619,
- PRIEST_SPELL_REFLECTIVE_SHIELD_R1 = 33201,
- PRIEST_SPELL_VAMPIRIC_TOUCH_DISPEL = 64085,
- PRIEST_SPELL_EMPOWERED_RENEW = 63544,
- PRIEST_ICON_ID_EMPOWERED_RENEW_TALENT = 3021,
- PRIEST_ICON_ID_PAIN_AND_SUFFERING = 2874,
- PRIEST_SHADOW_WORD_DEATH = 32409,
+ SPELL_PRIEST_DIVINE_AEGIS = 47753,
+ SPELL_PRIEST_EMPOWERED_RENEW = 63544,
+ SPELL_PRIEST_GLYPH_OF_LIGHTWELL = 55673,
+ SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL = 56161,
+ SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL = 48153,
+ SPELL_PRIEST_MANA_LEECH_PROC = 34650,
+ SPELL_PRIEST_PENANCE_R1 = 47540,
+ SPELL_PRIEST_PENANCE_R1_DAMAGE = 47758,
+ SPELL_PRIEST_PENANCE_R1_HEAL = 47757,
+ SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED = 33619,
+ SPELL_PRIEST_REFLECTIVE_SHIELD_R1 = 33201,
+ SPELL_PRIEST_SHADOW_WORD_DEATH = 32409,
+ SPELL_PRIEST_T9_HEALING_2P = 67201,
+ SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL = 64085,
};
-// Guardian Spirit
+enum PriestSpellIcons
+{
+ PRIEST_ICON_ID_BORROWED_TIME = 2899,
+ PRIEST_ICON_ID_EMPOWERED_RENEW_TALENT = 3021,
+ PRIEST_ICON_ID_PAIN_AND_SUFFERING = 2874,
+};
+
+// -47509 - Divine Aegis
+class spell_pri_divine_aegis : public SpellScriptLoader
+{
+ public:
+ spell_pri_divine_aegis() : SpellScriptLoader("spell_pri_divine_aegis") { }
+
+ class spell_pri_divine_aegis_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_divine_aegis_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_DIVINE_AEGIS))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetProcTarget();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 absorb = CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount());
+
+ // Multiple effects stack, so let's try to find this aura.
+ if (AuraEffect const* aegis = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_PRIEST_DIVINE_AEGIS, EFFECT_0))
+ absorb += aegis->GetAmount();
+
+ absorb = std::min(absorb, eventInfo.GetProcTarget()->getLevel() * 125);
+
+ GetTarget()->CastCustomSpell(SPELL_PRIEST_DIVINE_AEGIS, SPELLVALUE_BASE_POINT0, absorb, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_pri_divine_aegis_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_pri_divine_aegis_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pri_divine_aegis_AuraScript();
+ }
+};
+
+// 55680 - Glyph of Prayer of Healing
+class spell_pri_glyph_of_prayer_of_healing : public SpellScriptLoader
+{
+ public:
+ spell_pri_glyph_of_prayer_of_healing() : SpellScriptLoader("spell_pri_glyph_of_prayer_of_healing") { }
+
+ class spell_pri_glyph_of_prayer_of_healing_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_glyph_of_prayer_of_healing_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL);
+ int32 heal = int32(CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount()) / triggeredSpellInfo->GetMaxTicks());
+ GetTarget()->CastCustomSpell(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL, SPELLVALUE_BASE_POINT0, heal, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_pri_glyph_of_prayer_of_healing_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pri_glyph_of_prayer_of_healing_AuraScript();
+ }
+};
+
+// -47788 - Guardian Spirit
class spell_pri_guardian_spirit : public SpellScriptLoader
{
public:
@@ -54,9 +152,9 @@ class spell_pri_guardian_spirit : public SpellScriptLoader
uint32 healPct;
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(PRIEST_SPELL_GUARDIAN_SPIRIT_HEAL))
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL))
return false;
return true;
}
@@ -82,7 +180,7 @@ class spell_pri_guardian_spirit : public SpellScriptLoader
int32 healAmount = int32(target->CountPctFromMaxHealth(healPct));
// remove the aura now, we don't want 40% healing bonus
Remove(AURA_REMOVE_BY_ENEMY_SPELL);
- target->CastCustomSpell(target, PRIEST_SPELL_GUARDIAN_SPIRIT_HEAL, &healAmount, NULL, NULL, true);
+ target->CastCustomSpell(target, SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL, &healAmount, NULL, NULL, true);
absorbAmount = dmgInfo.GetDamage();
}
@@ -99,6 +197,39 @@ class spell_pri_guardian_spirit : public SpellScriptLoader
}
};
+// -7001 - Lightwell Renew
+class spell_pri_lightwell_renew : public SpellScriptLoader
+{
+ public:
+ spell_pri_lightwell_renew() : SpellScriptLoader("spell_pri_lightwell_renew") { }
+
+ class spell_pri_lightwell_renew_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_lightwell_renew_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ // Bonus from Glyph of Lightwell
+ if (AuraEffect* modHealing = caster->GetAuraEffect(SPELL_PRIEST_GLYPH_OF_LIGHTWELL, EFFECT_0))
+ AddPct(amount, modHealing->GetAmount());
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_lightwell_renew_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pri_lightwell_renew_AuraScript();
+ }
+};
+
+// -8129 - Mana Burn
class spell_pri_mana_burn : public SpellScriptLoader
{
public:
@@ -126,6 +257,58 @@ class spell_pri_mana_burn : public SpellScriptLoader
}
};
+// 28305 - Mana Leech (Passive) (Priest Pet Aura)
+class spell_pri_mana_leech : public SpellScriptLoader
+{
+ public:
+ spell_pri_mana_leech() : SpellScriptLoader("spell_pri_mana_leech") { }
+
+ class spell_pri_mana_leech_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_mana_leech_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_MANA_LEECH_PROC))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ _procTarget = GetTarget()->GetOwner();
+ return _procTarget;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(_procTarget, SPELL_PRIEST_MANA_LEECH_PROC, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_pri_mana_leech_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_pri_mana_leech_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+
+ private:
+ Unit* _procTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pri_mana_leech_AuraScript();
+ }
+};
+
+// -49821 - Mind Sear
class spell_pri_mind_sear : public SpellScriptLoader
{
public:
@@ -152,12 +335,12 @@ class spell_pri_mind_sear : public SpellScriptLoader
}
};
+// 47948 - Pain and Suffering (Proc)
class spell_pri_pain_and_suffering_proc : public SpellScriptLoader
{
public:
spell_pri_pain_and_suffering_proc() : SpellScriptLoader("spell_pri_pain_and_suffering_proc") { }
- // 47948 Pain and Suffering (proc)
class spell_pri_pain_and_suffering_proc_SpellScript : public SpellScript
{
PrepareSpellScript(spell_pri_pain_and_suffering_proc_SpellScript);
@@ -182,6 +365,7 @@ class spell_pri_pain_and_suffering_proc : public SpellScriptLoader
}
};
+// -47540 - Penance
class spell_pri_penance : public SpellScriptLoader
{
public:
@@ -196,18 +380,18 @@ class spell_pri_penance : public SpellScriptLoader
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
- bool Validate(SpellInfo const* spellEntry)
+ bool Validate(SpellInfo const* spellInfo)
{
- if (!sSpellMgr->GetSpellInfo(PRIEST_SPELL_PENANCE_R1))
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_PENANCE_R1))
return false;
// can't use other spell than this penance due to spell_ranks dependency
- if (sSpellMgr->GetFirstSpellInChain(PRIEST_SPELL_PENANCE_R1) != sSpellMgr->GetFirstSpellInChain(spellEntry->Id))
+ if (sSpellMgr->GetFirstSpellInChain(SPELL_PRIEST_PENANCE_R1) != sSpellMgr->GetFirstSpellInChain(spellInfo->Id))
return false;
- uint8 rank = sSpellMgr->GetSpellRank(spellEntry->Id);
- if (!sSpellMgr->GetSpellWithRank(PRIEST_SPELL_PENANCE_R1_DAMAGE, rank, true))
+ uint8 rank = sSpellMgr->GetSpellRank(spellInfo->Id);
+ if (!sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_DAMAGE, rank, true))
return false;
- if (!sSpellMgr->GetSpellWithRank(PRIEST_SPELL_PENANCE_R1_HEAL, rank, true))
+ if (!sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_HEAL, rank, true))
return false;
return true;
@@ -224,9 +408,9 @@ class spell_pri_penance : public SpellScriptLoader
uint8 rank = sSpellMgr->GetSpellRank(GetSpellInfo()->Id);
if (caster->IsFriendlyTo(unitTarget))
- caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(PRIEST_SPELL_PENANCE_R1_HEAL, rank), false, 0);
+ caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_HEAL, rank), false, 0);
else
- caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(PRIEST_SPELL_PENANCE_R1_DAMAGE, rank), false, 0);
+ caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_DAMAGE, rank), false, 0);
}
}
@@ -241,7 +425,6 @@ class spell_pri_penance : public SpellScriptLoader
void Register()
{
- // add dummy effect spell handler to Penance
OnEffectHitTarget += SpellEffectFn(spell_pri_penance_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
OnCheckCast += SpellCheckCastFn(spell_pri_penance_SpellScript::CheckCast);
}
@@ -253,129 +436,118 @@ class spell_pri_penance : public SpellScriptLoader
}
};
-// Reflective Shield
-class spell_pri_reflective_shield_trigger : public SpellScriptLoader
+// -17 - Power Word: Shield
+class spell_pri_power_word_shield : public SpellScriptLoader
{
public:
- spell_pri_reflective_shield_trigger() : SpellScriptLoader("spell_pri_reflective_shield_trigger") { }
+ spell_pri_power_word_shield() : SpellScriptLoader("spell_pri_power_word_shield") { }
- class spell_pri_reflective_shield_trigger_AuraScript : public AuraScript
+ class spell_pri_power_word_shield_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_pri_reflective_shield_trigger_AuraScript);
+ PrepareAuraScript(spell_pri_power_word_shield_AuraScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(PRIEST_SPELL_REFLECTIVE_SHIELD_TRIGGERED) || !sSpellMgr->GetSpellInfo(PRIEST_SPELL_REFLECTIVE_SHIELD_R1))
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_R1))
return false;
return true;
}
- void Trigger(AuraEffect* aurEff, DamageInfo & dmgInfo, uint32 & absorbAmount)
+ void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = false;
+ if (Unit* caster = GetCaster())
+ {
+ // +80.68% from sp bonus
+ float bonus = 0.8068f;
+
+ // Borrowed Time
+ if (AuraEffect const* borrowedTime = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_BORROWED_TIME, EFFECT_1))
+ bonus += CalculatePct(1.0f, borrowedTime->GetAmount());
+
+ bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
+
+ // Improved PW: Shield: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :)
+ // Improved PW: Shield is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage
+ bonus = caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), bonus);
+ bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
+
+ amount += int32(bonus);
+
+ // Twin Disciplines
+ if (AuraEffect const* twinDisciplines = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_PRIEST, 0x400000, 0, 0, GetCasterGUID()))
+ AddPct(amount, twinDisciplines->GetAmount());
+
+ // Focused Power
+ amount *= caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_DONE_PERCENT);
+ }
+ }
+
+ void ReflectDamage(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount)
{
Unit* target = GetTarget();
if (dmgInfo.GetAttacker() == target)
return;
- if (GetCaster())
- if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(PRIEST_SPELL_REFLECTIVE_SHIELD_R1, EFFECT_0))
+ if (Unit* caster = GetCaster())
+ if (AuraEffect* talentAurEff = caster->GetAuraEffectOfRankedSpell(SPELL_PRIEST_REFLECTIVE_SHIELD_R1, EFFECT_0))
{
int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount());
- target->CastCustomSpell(dmgInfo.GetAttacker(), PRIEST_SPELL_REFLECTIVE_SHIELD_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);
+ target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);
}
}
void Register()
{
- AfterEffectAbsorb += AuraEffectAbsorbFn(spell_pri_reflective_shield_trigger_AuraScript::Trigger, EFFECT_0);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_power_word_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
+ AfterEffectAbsorb += AuraEffectAbsorbFn(spell_pri_power_word_shield_AuraScript::ReflectDamage, EFFECT_0);
}
};
AuraScript* GetAuraScript() const
{
- return new spell_pri_reflective_shield_trigger_AuraScript();
+ return new spell_pri_power_word_shield_AuraScript();
}
};
-enum PrayerOfMending
-{
- SPELL_T9_HEALING_2_PIECE = 67201,
-};
-// Prayer of Mending Heal
+// 33110 - Prayer of Mending Heal
class spell_pri_prayer_of_mending_heal : public SpellScriptLoader
{
-public:
- spell_pri_prayer_of_mending_heal() : SpellScriptLoader("spell_pri_prayer_of_mending_heal") { }
-
- class spell_pri_prayer_of_mending_heal_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_pri_prayer_of_mending_heal_SpellScript);
-
- void HandleHeal(SpellEffIndex /*effIndex*/)
- {
- if (Unit* caster = GetOriginalCaster())
- {
- if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_T9_HEALING_2_PIECE, EFFECT_0))
- {
- int32 heal = GetHitHeal();
- AddPct(heal, aurEff->GetAmount());
- SetHitHeal(heal);
- }
- }
-
- }
-
- void Register()
- {
- OnEffectHitTarget += SpellEffectFn(spell_pri_prayer_of_mending_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL);
- }
- };
-
- SpellScript* GetSpellScript() const
- {
- return new spell_pri_prayer_of_mending_heal_SpellScript();
- }
-};
-
-class spell_pri_vampiric_touch : public SpellScriptLoader
-{
public:
- spell_pri_vampiric_touch() : SpellScriptLoader("spell_pri_vampiric_touch") { }
+ spell_pri_prayer_of_mending_heal() : SpellScriptLoader("spell_pri_prayer_of_mending_heal") { }
- class spell_pri_vampiric_touch_AuraScript : public AuraScript
+ class spell_pri_prayer_of_mending_heal_SpellScript : public SpellScript
{
- PrepareAuraScript(spell_pri_vampiric_touch_AuraScript);
+ PrepareSpellScript(spell_pri_prayer_of_mending_heal_SpellScript);
- bool Validate(SpellInfo const* /*spell*/)
+ void HandleHeal(SpellEffIndex /*effIndex*/)
{
- if (!sSpellMgr->GetSpellInfo(PRIEST_SPELL_VAMPIRIC_TOUCH_DISPEL))
- return false;
- return true;
- }
-
- void HandleDispel(DispelInfo* /*dispelInfo*/)
- {
- if (Unit* caster = GetCaster())
- if (Unit* target = GetUnitOwner())
- if (AuraEffect const* aurEff = GetEffect(EFFECT_1))
- {
- int32 damage = aurEff->GetAmount() * 8;
- // backfire damage
- caster->CastCustomSpell(target, PRIEST_SPELL_VAMPIRIC_TOUCH_DISPEL, &damage, NULL, NULL, true, NULL, aurEff);
- }
+ if (Unit* caster = GetOriginalCaster())
+ {
+ if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_PRIEST_T9_HEALING_2P, EFFECT_0))
+ {
+ int32 heal = GetHitHeal();
+ AddPct(heal, aurEff->GetAmount());
+ SetHitHeal(heal);
+ }
+ }
}
void Register()
{
- AfterDispel += AuraDispelFn(spell_pri_vampiric_touch_AuraScript::HandleDispel);
+ OnEffectHitTarget += SpellEffectFn(spell_pri_prayer_of_mending_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL);
}
};
- AuraScript* GetAuraScript() const
+ SpellScript* GetSpellScript() const
{
- return new spell_pri_vampiric_touch_AuraScript();
+ return new spell_pri_prayer_of_mending_heal_SpellScript();
}
};
+// -139 - Renew
class spell_pri_renew : public SpellScriptLoader
{
public:
@@ -401,7 +573,7 @@ class spell_pri_renew : public SpellScriptLoader
heal = GetTarget()->SpellHealingBonusTaken(caster, GetSpellInfo(), heal, DOT);
int32 basepoints0 = empoweredRenewAurEff->GetAmount() * GetEffect(EFFECT_0)->GetTotalTicks() * int32(heal) / 100;
- caster->CastCustomSpell(GetTarget(), PRIEST_SPELL_EMPOWERED_RENEW, &basepoints0, NULL, NULL, true, NULL, aurEff);
+ caster->CastCustomSpell(GetTarget(), SPELL_PRIEST_EMPOWERED_RENEW, &basepoints0, NULL, NULL, true, NULL, aurEff);
}
}
}
@@ -418,6 +590,7 @@ class spell_pri_renew : public SpellScriptLoader
}
};
+// -32379 - Shadow Word Death
class spell_pri_shadow_word_death : public SpellScriptLoader
{
public:
@@ -435,7 +608,7 @@ class spell_pri_shadow_word_death : public SpellScriptLoader
if (AuraEffect* aurEff = GetCaster()->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_PAIN_AND_SUFFERING, EFFECT_1))
AddPct(damage, aurEff->GetAmount());
- GetCaster()->CastCustomSpell(GetCaster(), PRIEST_SHADOW_WORD_DEATH, &damage, 0, 0, true);
+ GetCaster()->CastCustomSpell(GetCaster(), SPELL_PRIEST_SHADOW_WORD_DEATH, &damage, 0, 0, true);
}
void Register()
@@ -450,16 +623,61 @@ class spell_pri_shadow_word_death : public SpellScriptLoader
}
};
+// -34914 - Vampiric Touch
+class spell_pri_vampiric_touch : public SpellScriptLoader
+{
+ public:
+ spell_pri_vampiric_touch() : SpellScriptLoader("spell_pri_vampiric_touch") { }
+
+ class spell_pri_vampiric_touch_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_vampiric_touch_AuraScript);
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL))
+ return false;
+ return true;
+ }
+
+ void HandleDispel(DispelInfo* /*dispelInfo*/)
+ {
+ if (Unit* caster = GetCaster())
+ if (Unit* target = GetUnitOwner())
+ if (AuraEffect const* aurEff = GetEffect(EFFECT_1))
+ {
+ int32 damage = aurEff->GetAmount() * 8;
+ // backfire damage
+ caster->CastCustomSpell(target, SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL, &damage, NULL, NULL, true, NULL, aurEff);
+ }
+ }
+
+ void Register()
+ {
+ AfterDispel += AuraDispelFn(spell_pri_vampiric_touch_AuraScript::HandleDispel);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pri_vampiric_touch_AuraScript();
+ }
+};
+
void AddSC_priest_spell_scripts()
{
+ new spell_pri_divine_aegis();
+ new spell_pri_glyph_of_prayer_of_healing();
new spell_pri_guardian_spirit();
+ new spell_pri_lightwell_renew();
new spell_pri_mana_burn();
+ new spell_pri_mana_leech();
+ new spell_pri_mind_sear();
new spell_pri_pain_and_suffering_proc();
new spell_pri_penance();
- new spell_pri_reflective_shield_trigger();
- new spell_pri_mind_sear();
+ new spell_pri_power_word_shield();
new spell_pri_prayer_of_mending_heal();
- new spell_pri_vampiric_touch();
new spell_pri_renew();
new spell_pri_shadow_word_death();
+ new spell_pri_vampiric_touch();
}
diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp
index 9cd94e9c7d5..3036c52876d 100644
--- a/src/server/scripts/Spells/spell_quest.cpp
+++ b/src/server/scripts/Spells/spell_quest.cpp
@@ -25,6 +25,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
+#include "SpellAuras.h"
#include "Vehicle.h"
#include "GridNotifiers.h"
#include "GridNotifiersImpl.h"
@@ -1517,6 +1518,128 @@ class spell_q11010_q11102_q11023_q11008_check_fly_mount : public SpellScriptLoad
}
};
+enum SpellZuldrakRat
+{
+ SPELL_SUMMON_GORGED_LURKING_BASILISK = 50928
+};
+
+class spell_q12527_zuldrak_rat : public SpellScriptLoader
+{
+ public:
+ spell_q12527_zuldrak_rat() : SpellScriptLoader("spell_q12527_zuldrak_rat") { }
+
+ class spell_q12527_zuldrak_rat_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_q12527_zuldrak_rat_SpellScript);
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_GORGED_LURKING_BASILISK))
+ return false;
+ return true;
+ }
+
+ void HandleScriptEffect(SpellEffIndex /* effIndex */)
+ {
+ if (GetHitAura() && GetHitAura()->GetStackAmount() >= GetSpellInfo()->StackAmount)
+ {
+ GetHitUnit()->CastSpell((Unit*) NULL, SPELL_SUMMON_GORGED_LURKING_BASILISK, true);
+ if (Creature* basilisk = GetHitUnit()->ToCreature())
+ basilisk->DespawnOrUnsummon();
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_q12527_zuldrak_rat_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_q12527_zuldrak_rat_SpellScript();
+ }
+};
+
+// 13291 - Borrowed Technology/13292 - The Solution Solution /Daily//13239 - Volatility/13261 - Volatiliy /Daily//
+enum Quest13291_13292_13239_13261Data
+{
+ // NPCs
+ NPC_SKYTALON = 31583,
+ NPC_DECOY = 31578,
+ // Spells
+ SPELL_RIDE = 56687
+};
+
+class spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy : public SpellScriptLoader
+{
+ public:
+ spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy() : SpellScriptLoader("spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy") { }
+
+ class spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy_SpellScript);
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_RIDE))
+ return false;
+
+ return true;
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ if (!GetHitCreature())
+ return;
+ // TO DO: Being triggered is hack, but in checkcast it doesn't pass aurastate requirements.
+ // Beside that the decoy won't keep it's freeze animation state when enter.
+ GetHitCreature()->CastSpell(GetCaster(), SPELL_RIDE, true);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy_SpellScript();
+ }
+};
+
+class spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon : public SpellScriptLoader
+{
+ public:
+ spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon() : SpellScriptLoader("spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon") { }
+
+ class spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript);
+
+ void ChangeSummonPos(SpellEffIndex /*effIndex*/)
+ {
+ // Adjust effect summon position
+ WorldLocation summonPos = *GetExplTargetDest();
+ Position offset = { 0.0f, 0.0f, 20.0f, 0.0f };
+ summonPos.RelocateOffset(offset);
+ SetExplTargetDest(summonPos);
+ GetHitDest()->RelocateOffset(offset);
+ }
+
+ void Register()
+ {
+ OnEffectHit += SpellEffectFn(spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript::ChangeSummonPos, EFFECT_0, SPELL_EFFECT_SUMMON);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript();
+ }
+};
+
void AddSC_quest_spell_scripts()
{
new spell_q55_sacred_cleansing();
@@ -1554,4 +1677,7 @@ void AddSC_quest_spell_scripts()
new spell_q11010_q11102_q11023_choose_loc();
new spell_q11010_q11102_q11023_q11008_check_fly_mount();
new spell_q12372_azure_on_death_force_whisper();
+ new spell_q12527_zuldrak_rat();
+ new spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy();
+ new spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon();
}
diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp
index ad69b4b1026..f6391c80d63 100644
--- a/src/server/scripts/Spells/spell_rogue.cpp
+++ b/src/server/scripts/Spells/spell_rogue.cpp
@@ -28,13 +28,71 @@
enum RogueSpells
{
- ROGUE_SPELL_SHIV_TRIGGERED = 5940,
- ROGUE_SPELL_GLYPH_OF_PREPARATION = 56819,
- ROGUE_SPELL_PREY_ON_THE_WEAK = 58670,
- ROGUE_SPELL_CHEAT_DEATH_COOLDOWN = 31231,
+ SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK = 22482,
+ SPELL_ROGUE_CHEAT_DEATH_COOLDOWN = 31231,
+ SPELL_ROGUE_GLYPH_OF_PREPARATION = 56819,
+ SPELL_ROGUE_PREY_ON_THE_WEAK = 58670,
+ SPELL_ROGUE_SHIV_TRIGGERED = 5940,
+ SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST = 57933,
+ SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC = 59628,
};
-// Cheat Death
+// 13877, 33735, (check 51211, 65956) - Blade Flurry
+class spell_rog_blade_flurry : public SpellScriptLoader
+{
+ public:
+ spell_rog_blade_flurry() : SpellScriptLoader("spell_rog_blade_flurry") { }
+
+ class spell_rog_blade_flurry_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_rog_blade_flurry_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ _procTarget = eventInfo.GetActor()->SelectNearbyTarget(eventInfo.GetProcTarget());
+ return _procTarget;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ if (eventInfo.GetDamageInfo())
+ {
+ int32 damage = eventInfo.GetDamageInfo()->GetDamage();
+ GetTarget()->CastCustomSpell(SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK, SPELLVALUE_BASE_POINT0, damage, _procTarget, true, NULL, aurEff);
+ }
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_rog_blade_flurry_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_rog_blade_flurry_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MOD_MELEE_HASTE);
+ }
+
+ private:
+ Unit* _procTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_rog_blade_flurry_AuraScript();
+ }
+};
+
+// -31228 - Cheat Death
class spell_rog_cheat_death : public SpellScriptLoader
{
public:
@@ -46,9 +104,9 @@ class spell_rog_cheat_death : public SpellScriptLoader
uint32 absorbChance;
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(ROGUE_SPELL_CHEAT_DEATH_COOLDOWN))
+ if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_CHEAT_DEATH_COOLDOWN))
return false;
return true;
}
@@ -68,11 +126,11 @@ class spell_rog_cheat_death : public SpellScriptLoader
void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount)
{
Player* target = GetTarget()->ToPlayer();
- if (dmgInfo.GetDamage() < target->GetHealth() || target->HasSpellCooldown(ROGUE_SPELL_CHEAT_DEATH_COOLDOWN) || !roll_chance_i(absorbChance))
+ if (dmgInfo.GetDamage() < target->GetHealth() || target->HasSpellCooldown(SPELL_ROGUE_CHEAT_DEATH_COOLDOWN) || !roll_chance_i(absorbChance))
return;
- target->CastSpell(target, ROGUE_SPELL_CHEAT_DEATH_COOLDOWN, true);
- target->AddSpellCooldown(ROGUE_SPELL_CHEAT_DEATH_COOLDOWN, 0, time(NULL) + 60);
+ target->CastSpell(target, SPELL_ROGUE_CHEAT_DEATH_COOLDOWN, true);
+ target->AddSpellCooldown(SPELL_ROGUE_CHEAT_DEATH_COOLDOWN, 0, time(NULL) + 60);
uint32 health10 = target->CountPctFromMaxHealth(10);
@@ -97,7 +155,101 @@ class spell_rog_cheat_death : public SpellScriptLoader
}
};
-// 31130 - Nerves of Steel
+// -2818 - Deadly Poison
+class spell_rog_deadly_poison : public SpellScriptLoader
+{
+ public:
+ spell_rog_deadly_poison() : SpellScriptLoader("spell_rog_deadly_poison") { }
+
+ class spell_rog_deadly_poison_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_rog_deadly_poison_SpellScript);
+
+ bool Load()
+ {
+ _stackAmount = 0;
+ // at this point CastItem must already be initialized
+ return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCastItem();
+ }
+
+ void HandleBeforeHit()
+ {
+ if (Unit* target = GetHitUnit())
+ // Deadly Poison
+ if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x10000, 0x80000, 0, GetCaster()->GetGUID()))
+ _stackAmount = aurEff->GetBase()->GetStackAmount();
+ }
+
+ void HandleAfterHit()
+ {
+ if (_stackAmount < 5)
+ return;
+
+ Player* player = GetCaster()->ToPlayer();
+
+ if (Unit* target = GetHitUnit())
+ {
+
+ Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND);
+
+ if (item == GetCastItem())
+ item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
+
+ if (!item)
+ return;
+
+ // item combat enchantments
+ for (uint8 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot)
+ {
+ SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(item->GetEnchantmentId(EnchantmentSlot(slot)));
+ if (!enchant)
+ continue;
+
+ for (uint8 s = 0; s < 3; ++s)
+ {
+ if (enchant->type[s] != ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL)
+ continue;
+
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(enchant->spellid[s]);
+ if (!spellInfo)
+ {
+ sLog->outError(LOG_FILTER_SPELLS_AURAS, "Player::CastItemCombatSpell Enchant %i, player (Name: %s, GUID: %u) cast unknown spell %i", enchant->ID, player->GetName().c_str(), player->GetGUIDLow(), enchant->spellid[s]);
+ continue;
+ }
+
+ // Proc only rogue poisons
+ if (spellInfo->SpellFamilyName != SPELLFAMILY_ROGUE || spellInfo->Dispel != DISPEL_POISON)
+ continue;
+
+ // Do not reproc deadly
+ if (spellInfo->SpellFamilyFlags.IsEqual(0x10000, 0x80000, 0))
+ continue;
+
+ if (spellInfo->IsPositive())
+ player->CastSpell(player, enchant->spellid[s], true, item);
+ else
+ player->CastSpell(target, enchant->spellid[s], true, item);
+ }
+ }
+ }
+ }
+
+ void Register()
+ {
+ BeforeHit += SpellHitFn(spell_rog_deadly_poison_SpellScript::HandleBeforeHit);
+ AfterHit += SpellHitFn(spell_rog_deadly_poison_SpellScript::HandleAfterHit);
+ }
+
+ uint8 _stackAmount;
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_rog_deadly_poison_SpellScript();
+ }
+};
+
+// -31130 - Nerves of Steel
class spell_rog_nerves_of_steel : public SpellScriptLoader
{
public:
@@ -141,6 +293,7 @@ class spell_rog_nerves_of_steel : public SpellScriptLoader
}
};
+// 14185 - Preparation
class spell_rog_preparation : public SpellScriptLoader
{
public:
@@ -155,9 +308,9 @@ class spell_rog_preparation : public SpellScriptLoader
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(ROGUE_SPELL_GLYPH_OF_PREPARATION))
+ if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_GLYPH_OF_PREPARATION))
return false;
return true;
}
@@ -177,7 +330,7 @@ class spell_rog_preparation : public SpellScriptLoader
if (spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_COLDB_SHADOWSTEP || // Cold Blood, Shadowstep
spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_VAN_EVAS_SPRINT) // Vanish, Evasion, Sprint
caster->RemoveSpellCooldown((itr++)->first, true);
- else if (caster->HasAura(ROGUE_SPELL_GLYPH_OF_PREPARATION))
+ else if (caster->HasAura(SPELL_ROGUE_GLYPH_OF_PREPARATION))
{
if (spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_DISMANTLE || // Dismantle
spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_KICK || // Kick
@@ -197,7 +350,6 @@ class spell_rog_preparation : public SpellScriptLoader
void Register()
{
- // add dummy effect spell handler to Preparation
OnEffectHitTarget += SpellEffectFn(spell_rog_preparation_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
@@ -208,51 +360,104 @@ class spell_rog_preparation : public SpellScriptLoader
}
};
-// 51685-51689 Prey on the Weak
+// -51685 - Prey on the Weak
class spell_rog_prey_on_the_weak : public SpellScriptLoader
{
-public:
- spell_rog_prey_on_the_weak() : SpellScriptLoader("spell_rog_prey_on_the_weak") { }
+ public:
+ spell_rog_prey_on_the_weak() : SpellScriptLoader("spell_rog_prey_on_the_weak") { }
- class spell_rog_prey_on_the_weak_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_rog_prey_on_the_weak_AuraScript);
+ class spell_rog_prey_on_the_weak_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_rog_prey_on_the_weak_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_PREY_ON_THE_WEAK))
+ return false;
+ return true;
+ }
- bool Validate(SpellInfo const* /*spellEntry*/)
+ void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
+ {
+ Unit* target = GetTarget();
+ Unit* victim = target->getVictim();
+ if (victim && (target->GetHealthPct() > victim->GetHealthPct()))
+ {
+ if (!target->HasAura(SPELL_ROGUE_PREY_ON_THE_WEAK))
+ {
+ int32 bp = GetSpellInfo()->Effects[EFFECT_0].CalcValue();
+ target->CastCustomSpell(target, SPELL_ROGUE_PREY_ON_THE_WEAK, &bp, 0, 0, true);
+ }
+ }
+ else
+ target->RemoveAurasDueToSpell(SPELL_ROGUE_PREY_ON_THE_WEAK);
+ }
+
+ void Register()
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_rog_prey_on_the_weak_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
{
- if (!sSpellMgr->GetSpellInfo(ROGUE_SPELL_PREY_ON_THE_WEAK))
- return false;
- return true;
+ return new spell_rog_prey_on_the_weak_AuraScript();
}
+};
+
+// -1943 - Rupture
+class spell_rog_rupture : public SpellScriptLoader
+{
+ public:
+ spell_rog_rupture() : SpellScriptLoader("spell_rog_rupture") { }
- void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
+ class spell_rog_rupture_AuraScript : public AuraScript
{
- Unit* target = GetTarget();
- Unit* victim = target->getVictim();
- if (victim && (target->GetHealthPct() > victim->GetHealthPct()))
+ PrepareAuraScript(spell_rog_rupture_AuraScript);
+
+ bool Load()
+ {
+ Unit* caster = GetCaster();
+ return caster && caster->GetTypeId() == TYPEID_PLAYER;
+ }
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
{
- if (!target->HasAura(ROGUE_SPELL_PREY_ON_THE_WEAK))
+ if (Unit* caster = GetCaster())
{
- int32 bp = GetSpellInfo()->Effects[EFFECT_0].CalcValue();
- target->CastCustomSpell(target, ROGUE_SPELL_PREY_ON_THE_WEAK, &bp, 0, 0, true);
+ canBeRecalculated = false;
+
+ float const attackpowerPerCombo[6] =
+ {
+ 0.0f,
+ 0.015f, // 1 point: ${($m1 + $b1*1 + 0.015 * $AP) * 4} damage over 8 secs
+ 0.024f, // 2 points: ${($m1 + $b1*2 + 0.024 * $AP) * 5} damage over 10 secs
+ 0.03f, // 3 points: ${($m1 + $b1*3 + 0.03 * $AP) * 6} damage over 12 secs
+ 0.03428571f, // 4 points: ${($m1 + $b1*4 + 0.03428571 * $AP) * 7} damage over 14 secs
+ 0.0375f // 5 points: ${($m1 + $b1*5 + 0.0375 * $AP) * 8} damage over 16 secs
+ };
+
+ uint8 cp = caster->ToPlayer()->GetComboPoints();
+ if (cp > 5)
+ cp = 5;
+
+ amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * attackpowerPerCombo[cp]);
}
}
- else
- target->RemoveAurasDueToSpell(ROGUE_SPELL_PREY_ON_THE_WEAK);
- }
- void Register()
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_rog_rupture_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
{
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_rog_prey_on_the_weak_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ return new spell_rog_rupture_AuraScript();
}
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_rog_prey_on_the_weak_AuraScript();
- }
};
+// 5938 - Shiv
class spell_rog_shiv : public SpellScriptLoader
{
public:
@@ -267,9 +472,9 @@ class spell_rog_shiv : public SpellScriptLoader
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(ROGUE_SPELL_SHIV_TRIGGERED))
+ if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_SHIV_TRIGGERED))
return false;
return true;
}
@@ -278,12 +483,11 @@ class spell_rog_shiv : public SpellScriptLoader
{
Unit* caster = GetCaster();
if (Unit* unitTarget = GetHitUnit())
- caster->CastSpell(unitTarget, ROGUE_SPELL_SHIV_TRIGGERED, true);
+ caster->CastSpell(unitTarget, SPELL_ROGUE_SHIV_TRIGGERED, true);
}
void Register()
{
- // add dummy effect spell handler to Shiv
OnEffectHitTarget += SpellEffectFn(spell_rog_shiv_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
@@ -294,134 +498,107 @@ class spell_rog_shiv : public SpellScriptLoader
}
};
-class spell_rog_deadly_poison : public SpellScriptLoader
+// 57934 - Tricks of the Trade
+class spell_rog_tricks_of_the_trade : public SpellScriptLoader
{
public:
- spell_rog_deadly_poison() : SpellScriptLoader("spell_rog_deadly_poison") { }
+ spell_rog_tricks_of_the_trade() : SpellScriptLoader("spell_rog_tricks_of_the_trade") { }
- class spell_rog_deadly_poison_SpellScript : public SpellScript
+ class spell_rog_tricks_of_the_trade_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_rog_deadly_poison_SpellScript);
+ PrepareAuraScript(spell_rog_tricks_of_the_trade_AuraScript);
- bool Load()
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- _stackAmount = 0;
- // at this point CastItem must already be initialized
- return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCastItem();
+ if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC))
+ return false;
+ return true;
}
- void HandleBeforeHit()
+ bool Load()
{
- if (Unit* target = GetHitUnit())
- // Deadly Poison
- if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x10000, 0x80000, 0, GetCaster()->GetGUID()))
- _stackAmount = aurEff->GetBase()->GetStackAmount();
+ _redirectTarget = NULL;
+ return true;
}
- void HandleAfterHit()
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
- if (_stackAmount < 5)
- return;
-
- Player* player = GetCaster()->ToPlayer();
-
- if (Unit* target = GetHitUnit())
- {
-
- Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND);
-
- if (item == GetCastItem())
- item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
-
- if (!item)
- return;
-
- // item combat enchantments
- for (uint8 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot)
- {
- SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(item->GetEnchantmentId(EnchantmentSlot(slot)));
- if (!enchant)
- continue;
-
- for (uint8 s = 0; s < 3; ++s)
- {
- if (enchant->type[s] != ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL)
- continue;
-
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(enchant->spellid[s]);
- if (!spellInfo)
- {
- sLog->outError(LOG_FILTER_SPELLS_AURAS, "Player::CastItemCombatSpell Enchant %i, player (Name: %s, GUID: %u) cast unknown spell %i", enchant->ID, player->GetName().c_str(), player->GetGUIDLow(), enchant->spellid[s]);
- continue;
- }
+ if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT)
+ GetTarget()->ResetRedirectThreat();
+ }
- // Proc only rogue poisons
- if (spellInfo->SpellFamilyName != SPELLFAMILY_ROGUE || spellInfo->Dispel != DISPEL_POISON)
- continue;
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ _redirectTarget = GetTarget()->GetRedirectThreatTarget();
+ return _redirectTarget;
+ }
- // Do not reproc deadly
- if (spellInfo->SpellFamilyFlags.IsEqual(0x10000, 0x80000, 0))
- continue;
+ void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
- if (spellInfo->IsPositive())
- player->CastSpell(player, enchant->spellid[s], true, item);
- else
- player->CastSpell(target, enchant->spellid[s], true, item);
- }
- }
- }
+ Unit* target = GetTarget();
+ target->CastSpell(_redirectTarget, SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST, true);
+ target->CastSpell(target, SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC, true);
+ Remove(AURA_REMOVE_BY_DEFAULT); // maybe handle by proc charges
}
void Register()
{
- BeforeHit += SpellHitFn(spell_rog_deadly_poison_SpellScript::HandleBeforeHit);
- AfterHit += SpellHitFn(spell_rog_deadly_poison_SpellScript::HandleAfterHit);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_rog_tricks_of_the_trade_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ DoCheckProc += AuraCheckProcFn(spell_rog_tricks_of_the_trade_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_rog_tricks_of_the_trade_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
}
- uint8 _stackAmount;
+ private:
+ Unit* _redirectTarget;
};
- SpellScript* GetSpellScript() const
+ AuraScript* GetAuraScript() const
{
- return new spell_rog_deadly_poison_SpellScript();
+ return new spell_rog_tricks_of_the_trade_AuraScript();
}
};
-class spell_rog_shadowstep : public SpellScriptLoader
+// 59628 - Tricks of the Trade (Proc)
+class spell_rog_tricks_of_the_trade_proc : public SpellScriptLoader
{
public:
- spell_rog_shadowstep() : SpellScriptLoader("spell_rog_shadowstep") { }
+ spell_rog_tricks_of_the_trade_proc() : SpellScriptLoader("spell_rog_tricks_of_the_trade_proc") { }
- class spell_rog_shadowstep_SpellScript : public SpellScript
+ class spell_rog_tricks_of_the_trade_proc_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_rog_shadowstep_SpellScript);
+ PrepareAuraScript(spell_rog_tricks_of_the_trade_proc_AuraScript);
- SpellCastResult CheckCast()
+ void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
- if (GetCaster()->HasUnitState(UNIT_STATE_ROOT))
- return SPELL_FAILED_ROOTED;
- return SPELL_CAST_OK;
+ GetTarget()->ResetRedirectThreat();
}
void Register()
{
- OnCheckCast += SpellCheckCastFn(spell_rog_shadowstep_SpellScript::CheckCast);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_rog_tricks_of_the_trade_proc_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
- SpellScript* GetSpellScript() const
+ AuraScript* GetAuraScript() const
{
- return new spell_rog_shadowstep_SpellScript();
+ return new spell_rog_tricks_of_the_trade_proc_AuraScript();
}
};
void AddSC_rogue_spell_scripts()
{
+ new spell_rog_blade_flurry();
new spell_rog_cheat_death();
+ new spell_rog_deadly_poison();
new spell_rog_nerves_of_steel();
new spell_rog_preparation();
new spell_rog_prey_on_the_weak();
+ new spell_rog_rupture();
new spell_rog_shiv();
- new spell_rog_deadly_poison();
- new spell_rog_shadowstep();
+ new spell_rog_tricks_of_the_trade();
+ new spell_rog_tricks_of_the_trade_proc();
}
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index ff7c83b95a5..f970807bb94 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -30,28 +30,72 @@
enum ShamanSpells
{
- SHAMAN_SPELL_GLYPH_OF_MANA_TIDE = 55441,
- SHAMAN_SPELL_MANA_TIDE_TOTEM = 39609,
- SHAMAN_SPELL_FIRE_NOVA_R1 = 1535,
- SHAMAN_SPELL_FIRE_NOVA_TRIGGERED_R1 = 8349,
- SHAMAN_SPELL_SATED = 57724,
- SHAMAN_SPELL_EXHAUSTION = 57723,
+ SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC = 52752,
+ SPELL_SHAMAN_BIND_SIGHT = 6277,
+ SPELL_SHAMAN_CLEANSING_TOTEM_EFFECT = 52025,
+ SPELL_SHAMAN_EARTH_SHIELD_HEAL = 379,
+ SPELL_SHAMAN_EXHAUSTION = 57723,
+ SPELL_SHAMAN_FIRE_NOVA_R1 = 1535,
+ SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1 = 8349,
+ SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD = 63279,
+ SPELL_SHAMAN_GLYPH_OF_HEALING_STREAM_TOTEM = 55456,
+ SPELL_SHAMAN_GLYPH_OF_MANA_TIDE = 55441,
+ SPELL_SHAMAN_GLYPH_OF_THUNDERSTORM = 62132,
+ SPELL_SHAMAN_LAVA_FLOWS_R1 = 51480,
+ SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1 = 64694,
+ SPELL_SHAMAN_MANA_SPRING_TOTEM_ENERGIZE = 52032,
+ SPELL_SHAMAN_MANA_TIDE_TOTEM = 39609,
+ SPELL_SHAMAN_SATED = 57724,
+ SPELL_SHAMAN_STORM_EARTH_AND_FIRE = 51483,
+ SPELL_SHAMAN_TOTEM_EARTHBIND_EARTHGRAB = 64695,
+ SPELL_SHAMAN_TOTEM_EARTHBIND_TOTEM = 6474,
+ SPELL_SHAMAN_TOTEM_EARTHEN_POWER = 59566,
+ SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL = 52042
+};
+
+enum ShamanSpellIcons
+{
+ SHAMAN_ICON_ID_RESTORATIVE_TOTEMS = 338,
+ SHAMAN_ICON_ID_SHAMAN_LAVA_FLOW = 3087
+};
+
+// 52759 - Ancestral Awakening (Proc)
+class spell_sha_ancestral_awakening_proc : public SpellScriptLoader
+{
+ public:
+ spell_sha_ancestral_awakening_proc() : SpellScriptLoader("spell_sha_ancestral_awakening_proc") { }
- SHAMAN_SPELL_STORM_EARTH_AND_FIRE = 51483,
- EARTHBIND_TOTEM_SPELL_EARTHGRAB = 64695,
+ class spell_sha_ancestral_awakening_proc_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_sha_ancestral_awakening_proc_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC))
+ return false;
+ return true;
+ }
- // For Earthen Power
- SHAMAN_TOTEM_SPELL_EARTHBIND_TOTEM = 6474,
- SHAMAN_TOTEM_SPELL_EARTHEN_POWER = 59566,
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ int32 damage = GetEffectValue();
+ if (GetHitUnit())
+ GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC, &damage, NULL, NULL, true);
+ }
- SHAMAN_BIND_SIGHT = 6277,
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_sha_ancestral_awakening_proc_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
- ICON_ID_SHAMAN_LAVA_FLOW = 3087,
- SHAMAN_LAVA_FLOWS_R1 = 51480,
- SHAMAN_LAVA_FLOWS_TRIGGERED_R1 = 64694,
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_sha_ancestral_awakening_proc_SpellScript();
+ }
};
-// 51474 - Astral shift
+// 51474 - Astral Shift
class spell_sha_astral_shift : public SpellScriptLoader
{
public:
@@ -95,115 +139,198 @@ class spell_sha_astral_shift : public SpellScriptLoader
}
};
-// 1535 Fire Nova
-class spell_sha_fire_nova : public SpellScriptLoader
+// 2825 - Bloodlust
+class spell_sha_bloodlust : public SpellScriptLoader
{
public:
- spell_sha_fire_nova() : SpellScriptLoader("spell_sha_fire_nova") { }
+ spell_sha_bloodlust() : SpellScriptLoader("spell_sha_bloodlust") { }
- class spell_sha_fire_nova_SpellScript : public SpellScript
+ class spell_sha_bloodlust_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_sha_fire_nova_SpellScript);
+ PrepareSpellScript(spell_sha_bloodlust_SpellScript);
- bool Validate(SpellInfo const* spellEntry)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SHAMAN_SPELL_FIRE_NOVA_R1) || sSpellMgr->GetFirstSpellInChain(SHAMAN_SPELL_FIRE_NOVA_R1) != sSpellMgr->GetFirstSpellInChain(spellEntry->Id))
- return false;
-
- uint8 rank = sSpellMgr->GetSpellRank(spellEntry->Id);
- if (!sSpellMgr->GetSpellWithRank(SHAMAN_SPELL_FIRE_NOVA_TRIGGERED_R1, rank, true))
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_SATED))
return false;
return true;
}
- SpellCastResult CheckFireTotem()
+ void RemoveInvalidTargets(std::list<WorldObject*>& targets)
{
- // fire totem
- if (!GetCaster()->m_SummonSlot[1])
- {
- SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_HAVE_FIRE_TOTEM);
- return SPELL_FAILED_CUSTOM_ERROR;
- }
+ targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_SHAMAN_SATED));
+ }
- return SPELL_CAST_OK;
+ void ApplyDebuff()
+ {
+ if (Unit* target = GetHitUnit())
+ target->CastSpell(target, SPELL_SHAMAN_SATED, true);
}
- void HandleDummy(SpellEffIndex /*effIndex*/)
+ void Register()
{
- if (Unit* caster = GetCaster())
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_bloodlust_SpellScript::RemoveInvalidTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_RAID);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_bloodlust_SpellScript::RemoveInvalidTargets, EFFECT_1, TARGET_UNIT_CASTER_AREA_RAID);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_bloodlust_SpellScript::RemoveInvalidTargets, EFFECT_2, TARGET_UNIT_CASTER_AREA_RAID);
+ AfterHit += SpellHitFn(spell_sha_bloodlust_SpellScript::ApplyDebuff);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_sha_bloodlust_SpellScript();
+ }
+};
+
+// -1064 - Chain Heal
+class spell_sha_chain_heal : public SpellScriptLoader
+{
+ public:
+ spell_sha_chain_heal() : SpellScriptLoader("spell_sha_chain_heal") { }
+
+ class spell_sha_chain_heal_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_sha_chain_heal_SpellScript);
+
+ bool Load()
+ {
+ firstHeal = true;
+ riptide = false;
+ return true;
+ }
+
+ void HandleHeal(SpellEffIndex /*effIndex*/)
+ {
+ if (firstHeal)
{
- uint8 rank = sSpellMgr->GetSpellRank(GetSpellInfo()->Id);
- if (uint32 spellId = sSpellMgr->GetSpellWithRank(SHAMAN_SPELL_FIRE_NOVA_TRIGGERED_R1, rank))
+ // Check if the target has Riptide
+ if (AuraEffect* aurEff = GetHitUnit()->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_SHAMAN, 0, 0, 0x10, GetCaster()->GetGUID()))
{
- Creature* totem = caster->GetMap()->GetCreature(caster->m_SummonSlot[1]);
- if (totem && totem->isTotem())
- caster->CastSpell(totem, spellId, true);
+ riptide = true;
+ // Consume it
+ GetHitUnit()->RemoveAura(aurEff->GetBase());
}
+ firstHeal = false;
}
+ // Riptide increases the Chain Heal effect by 25%
+ if (riptide)
+ SetHitHeal(GetHitHeal() * 1.25f);
}
void Register()
{
- OnCheckCast += SpellCheckCastFn(spell_sha_fire_nova_SpellScript::CheckFireTotem);
- OnEffectHitTarget += SpellEffectFn(spell_sha_fire_nova_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnEffectHitTarget += SpellEffectFn(spell_sha_chain_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL);
}
+
+ bool firstHeal;
+ bool riptide;
};
SpellScript* GetSpellScript() const
{
- return new spell_sha_fire_nova_SpellScript();
+ return new spell_sha_chain_heal_SpellScript();
}
};
-// 39610 Mana Tide Totem
-class spell_sha_mana_tide_totem : public SpellScriptLoader
+// 8171 - Cleansing Totem (Pulse)
+class spell_sha_cleansing_totem_pulse : public SpellScriptLoader
{
public:
- spell_sha_mana_tide_totem() : SpellScriptLoader("spell_sha_mana_tide_totem") { }
+ spell_sha_cleansing_totem_pulse() : SpellScriptLoader("spell_sha_cleansing_totem_pulse") { }
- class spell_sha_mana_tide_totem_SpellScript : public SpellScript
+ class spell_sha_cleansing_totem_pulse_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_sha_mana_tide_totem_SpellScript);
+ PrepareSpellScript(spell_sha_cleansing_totem_pulse_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SHAMAN_SPELL_GLYPH_OF_MANA_TIDE) || !sSpellMgr->GetSpellInfo(SHAMAN_SPELL_MANA_TIDE_TOTEM))
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_CLEANSING_TOTEM_EFFECT))
return false;
return true;
}
void HandleDummy(SpellEffIndex /*effIndex*/)
{
- if (Unit* caster = GetCaster())
- if (Unit* unitTarget = GetHitUnit())
- {
- if (unitTarget->getPowerType() == POWER_MANA)
- {
- int32 effValue = GetEffectValue();
- // Glyph of Mana Tide
- if (Unit* owner = caster->GetOwner())
- if (AuraEffect* dummy = owner->GetAuraEffect(SHAMAN_SPELL_GLYPH_OF_MANA_TIDE, 0))
- effValue += dummy->GetAmount();
- // Regenerate 6% of Total Mana Every 3 secs
- int32 effBasePoints0 = int32(CalculatePct(unitTarget->GetMaxPower(POWER_MANA), effValue));
- caster->CastCustomSpell(unitTarget, SHAMAN_SPELL_MANA_TIDE_TOTEM, &effBasePoints0, NULL, NULL, true, NULL, NULL, GetOriginalCaster()->GetGUID());
- }
- }
+ int32 bp = 1;
+ if (GetCaster() && GetHitUnit() && GetOriginalCaster())
+ GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_SHAMAN_CLEANSING_TOTEM_EFFECT, NULL, &bp, NULL, true, NULL, NULL, GetOriginalCaster()->GetGUID());
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_sha_mana_tide_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnEffectHitTarget += SpellEffectFn(spell_sha_cleansing_totem_pulse_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const
{
- return new spell_sha_mana_tide_totem_SpellScript();
+ return new spell_sha_cleansing_totem_pulse_SpellScript();
+ }
+};
+
+// -974 - Earth Shield
+class spell_sha_earth_shield : public SpellScriptLoader
+{
+ public:
+ spell_sha_earth_shield() : SpellScriptLoader("spell_sha_earth_shield") { }
+
+ class spell_sha_earth_shield_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_sha_earth_shield_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_EARTH_SHIELD_HEAL))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD))
+ return false;
+ return true;
+ }
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool & /*canBeRecalculated*/)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ amount = caster->SpellHealingBonusDone(GetUnitOwner(), GetSpellInfo(), amount, HEAL);
+ amount = GetUnitOwner()->SpellHealingBonusTaken(caster, GetSpellInfo(), amount, HEAL);
+
+ // Glyph of Earth Shield
+ //! WORKAROUND
+ //! this glyph is a proc
+ if (AuraEffect* glyph = caster->GetAuraEffect(SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD, EFFECT_0))
+ AddPct(amount, glyph->GetAmount());
+ }
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+
+ //! HACK due to currenct proc system implementation
+ if (Player* player = GetTarget()->ToPlayer())
+ if (player->HasSpellCooldown(SPELL_SHAMAN_EARTH_SHIELD_HEAL))
+ return;
+
+ GetTarget()->CastCustomSpell(SPELL_SHAMAN_EARTH_SHIELD_HEAL, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, NULL, aurEff, GetCasterGUID());
+
+ if (Player* player = GetTarget()->ToPlayer())
+ player->AddSpellCooldown(SPELL_SHAMAN_EARTH_SHIELD_HEAL, 0, time(NULL) + 3);
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_earth_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_DUMMY);
+ OnEffectProc += AuraEffectProcFn(spell_sha_earth_shield_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_sha_earth_shield_AuraScript();
}
};
-// 6474 - Earthbind Totem - Fix Talent:Earthen Power
+// 6474 - Earthbind Totem - Fix Talent: Earthen Power
class spell_sha_earthbind_totem : public SpellScriptLoader
{
public:
@@ -213,9 +340,9 @@ class spell_sha_earthbind_totem : public SpellScriptLoader
{
PrepareAuraScript(spell_sha_earthbind_totem_AuraScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SHAMAN_TOTEM_SPELL_EARTHBIND_TOTEM) || !sSpellMgr->GetSpellInfo(SHAMAN_TOTEM_SPELL_EARTHEN_POWER))
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_EARTHBIND_TOTEM) || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_EARTHEN_POWER))
return false;
return true;
}
@@ -227,7 +354,7 @@ class spell_sha_earthbind_totem : public SpellScriptLoader
if (Player* owner = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself())
if (AuraEffect* aur = owner->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 2289, 0))
if (roll_chance_i(aur->GetBaseAmount()))
- GetTarget()->CastSpell((Unit*)NULL, SHAMAN_TOTEM_SPELL_EARTHEN_POWER, true);
+ GetTarget()->CastSpell((Unit*)NULL, SPELL_SHAMAN_TOTEM_EARTHEN_POWER, true);
}
void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
@@ -238,10 +365,10 @@ class spell_sha_earthbind_totem : public SpellScriptLoader
if (!owner)
return;
// Storm, Earth and Fire
- if (AuraEffect* aurEff = owner->GetAuraEffectOfRankedSpell(SHAMAN_SPELL_STORM_EARTH_AND_FIRE, EFFECT_1))
+ if (AuraEffect* aurEff = owner->GetAuraEffectOfRankedSpell(SPELL_SHAMAN_STORM_EARTH_AND_FIRE, EFFECT_1))
{
if (roll_chance_i(aurEff->GetAmount()))
- GetCaster()->CastSpell(GetCaster(), EARTHBIND_TOTEM_SPELL_EARTHGRAB, false);
+ GetCaster()->CastSpell(GetCaster(), SPELL_SHAMAN_TOTEM_EARTHBIND_EARTHGRAB, false);
}
}
@@ -275,6 +402,7 @@ class EarthenPowerTargetSelector
}
};
+// 59566 - Earthen Power
class spell_sha_earthen_power : public SpellScriptLoader
{
public:
@@ -301,177 +429,112 @@ class spell_sha_earthen_power : public SpellScriptLoader
}
};
-class spell_sha_bloodlust : public SpellScriptLoader
+// -1535 - Fire Nova
+class spell_sha_fire_nova : public SpellScriptLoader
{
public:
- spell_sha_bloodlust() : SpellScriptLoader("spell_sha_bloodlust") { }
+ spell_sha_fire_nova() : SpellScriptLoader("spell_sha_fire_nova") { }
- class spell_sha_bloodlust_SpellScript : public SpellScript
+ class spell_sha_fire_nova_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_sha_bloodlust_SpellScript);
+ PrepareSpellScript(spell_sha_fire_nova_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* spellInfo)
{
- if (!sSpellMgr->GetSpellInfo(SHAMAN_SPELL_SATED))
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_FIRE_NOVA_R1) || sSpellMgr->GetFirstSpellInChain(SPELL_SHAMAN_FIRE_NOVA_R1) != sSpellMgr->GetFirstSpellInChain(spellInfo->Id))
return false;
- return true;
- }
-
- void RemoveInvalidTargets(std::list<WorldObject*>& targets)
- {
- targets.remove_if(Trinity::UnitAuraCheck(true, SHAMAN_SPELL_SATED));
- }
-
- void ApplyDebuff()
- {
- if (Unit* target = GetHitUnit())
- target->CastSpell(target, SHAMAN_SPELL_SATED, true);
- }
- void Register()
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_bloodlust_SpellScript::RemoveInvalidTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_RAID);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_bloodlust_SpellScript::RemoveInvalidTargets, EFFECT_1, TARGET_UNIT_CASTER_AREA_RAID);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_bloodlust_SpellScript::RemoveInvalidTargets, EFFECT_2, TARGET_UNIT_CASTER_AREA_RAID);
- AfterHit += SpellHitFn(spell_sha_bloodlust_SpellScript::ApplyDebuff);
- }
- };
-
- SpellScript* GetSpellScript() const
- {
- return new spell_sha_bloodlust_SpellScript();
- }
-};
-
-class spell_sha_heroism : public SpellScriptLoader
-{
- public:
- spell_sha_heroism() : SpellScriptLoader("spell_sha_heroism") { }
-
- class spell_sha_heroism_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_sha_heroism_SpellScript);
-
- bool Validate(SpellInfo const* /*spellEntry*/)
- {
- if (!sSpellMgr->GetSpellInfo(SHAMAN_SPELL_EXHAUSTION))
+ uint8 rank = sSpellMgr->GetSpellRank(spellInfo->Id);
+ if (!sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1, rank, true))
return false;
return true;
}
- void RemoveInvalidTargets(std::list<WorldObject*>& targets)
- {
- targets.remove_if(Trinity::UnitAuraCheck(true, SHAMAN_SPELL_EXHAUSTION));
- }
-
- void ApplyDebuff()
- {
- if (Unit* target = GetHitUnit())
- target->CastSpell(target, SHAMAN_SPELL_EXHAUSTION, true);
- }
-
- void Register()
+ SpellCastResult CheckFireTotem()
{
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_heroism_SpellScript::RemoveInvalidTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_RAID);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_heroism_SpellScript::RemoveInvalidTargets, EFFECT_1, TARGET_UNIT_CASTER_AREA_RAID);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_heroism_SpellScript::RemoveInvalidTargets, EFFECT_2, TARGET_UNIT_CASTER_AREA_RAID);
- AfterHit += SpellHitFn(spell_sha_heroism_SpellScript::ApplyDebuff);
- }
- };
-
- SpellScript* GetSpellScript() const
- {
- return new spell_sha_heroism_SpellScript();
- }
-};
-
-enum AncestralAwakeningProc
-{
- SPELL_ANCESTRAL_AWAKENING_PROC = 52752,
-};
-
-class spell_sha_ancestral_awakening_proc : public SpellScriptLoader
-{
- public:
- spell_sha_ancestral_awakening_proc() : SpellScriptLoader("spell_sha_ancestral_awakening_proc") { }
-
- class spell_sha_ancestral_awakening_proc_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_sha_ancestral_awakening_proc_SpellScript);
+ // fire totem
+ if (!GetCaster()->m_SummonSlot[1])
+ {
+ SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_HAVE_FIRE_TOTEM);
+ return SPELL_FAILED_CUSTOM_ERROR;
+ }
- bool Validate(SpellInfo const* /*SpellEntry*/)
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_ANCESTRAL_AWAKENING_PROC))
- return false;
- return true;
+ return SPELL_CAST_OK;
}
- void HandleDummy(SpellEffIndex /* effIndex */)
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
- int32 damage = GetEffectValue();
- if (GetCaster() && GetHitUnit())
- GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_ANCESTRAL_AWAKENING_PROC, &damage, NULL, NULL, true);
+ if (Unit* caster = GetCaster())
+ {
+ uint8 rank = sSpellMgr->GetSpellRank(GetSpellInfo()->Id);
+ if (uint32 spellId = sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1, rank))
+ {
+ Creature* totem = caster->GetMap()->GetCreature(caster->m_SummonSlot[1]);
+ if (totem && totem->isTotem())
+ caster->CastSpell(totem, spellId, true);
+ }
+ }
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_sha_ancestral_awakening_proc_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnCheckCast += SpellCheckCastFn(spell_sha_fire_nova_SpellScript::CheckFireTotem);
+ OnEffectHitTarget += SpellEffectFn(spell_sha_fire_nova_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const
{
- return new spell_sha_ancestral_awakening_proc_SpellScript();
+ return new spell_sha_fire_nova_SpellScript();
}
};
-enum CleansingTotemPulse
-{
- SPELL_CLEANSING_TOTEM_EFFECT = 52025,
-};
-
-class spell_sha_cleansing_totem_pulse : public SpellScriptLoader
+// -8050 - Flame Shock
+class spell_sha_flame_shock : public SpellScriptLoader
{
public:
- spell_sha_cleansing_totem_pulse() : SpellScriptLoader("spell_sha_cleansing_totem_pulse") { }
+ spell_sha_flame_shock() : SpellScriptLoader("spell_sha_flame_shock") { }
- class spell_sha_cleansing_totem_pulse_SpellScript : public SpellScript
+ class spell_sha_flame_shock_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_sha_cleansing_totem_pulse_SpellScript);
+ PrepareAuraScript(spell_sha_flame_shock_AuraScript);
- bool Validate(SpellInfo const* /*SpellEntry*/)
+ bool Validate(SpellInfo const* /*spell*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_CLEANSING_TOTEM_EFFECT))
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_FLOWS_R1))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1))
return false;
return true;
}
- void HandleDummy(SpellEffIndex /* effIndex */)
+ void HandleDispel(DispelInfo* /*dispelInfo*/)
{
- int32 bp = 1;
- if (GetCaster() && GetHitUnit() && GetOriginalCaster())
- GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_CLEANSING_TOTEM_EFFECT, NULL, &bp, NULL, true, NULL, NULL, GetOriginalCaster()->GetGUID());
+ if (Unit* caster = GetCaster())
+ // Lava Flows
+ if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, SHAMAN_ICON_ID_SHAMAN_LAVA_FLOW, EFFECT_0))
+ {
+ if (sSpellMgr->GetFirstSpellInChain(SPELL_SHAMAN_LAVA_FLOWS_R1) != sSpellMgr->GetFirstSpellInChain(aurEff->GetId()))
+ return;
+
+ uint8 rank = sSpellMgr->GetSpellRank(aurEff->GetId());
+ caster->CastSpell(caster, sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1, rank), true);
+ }
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_sha_cleansing_totem_pulse_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ AfterDispel += AuraDispelFn(spell_sha_flame_shock_AuraScript::HandleDispel);
}
};
- SpellScript* GetSpellScript() const
+ AuraScript* GetAuraScript() const
{
- return new spell_sha_cleansing_totem_pulse_SpellScript();
+ return new spell_sha_flame_shock_AuraScript();
}
};
-enum HealingStreamTotem
-{
- SPELL_GLYPH_OF_HEALING_STREAM_TOTEM = 55456,
- ICON_ID_RESTORATIVE_TOTEMS = 338,
- SPELL_HEALING_STREAM_TOTEM_HEAL = 52042,
-};
-
+// 52041, 52046, 52047, 52048, 52049, 52050, 58759, 58760, 58761 - Healing Stream Totem
class spell_sha_healing_stream_totem : public SpellScriptLoader
{
public:
@@ -481,14 +544,14 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader
{
PrepareSpellScript(spell_sha_healing_stream_totem_SpellScript);
- bool Validate(SpellInfo const* /*SpellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_GLYPH_OF_HEALING_STREAM_TOTEM) || !sSpellMgr->GetSpellInfo(SPELL_HEALING_STREAM_TOTEM_HEAL))
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_HEALING_STREAM_TOTEM) || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL))
return false;
return true;
}
- void HandleDummy(SpellEffIndex /* effIndex */)
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
int32 damage = GetEffectValue();
SpellInfo const* triggeringSpell = GetTriggeringSpell();
@@ -501,16 +564,16 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader
damage = int32(owner->SpellHealingBonusDone(target, triggeringSpell, damage, HEAL));
// Restorative Totems
- if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, ICON_ID_RESTORATIVE_TOTEMS, 1))
+ if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, SHAMAN_ICON_ID_RESTORATIVE_TOTEMS, 1))
AddPct(damage, dummy->GetAmount());
// Glyph of Healing Stream Totem
- if (AuraEffect const* aurEff = owner->GetAuraEffect(SPELL_GLYPH_OF_HEALING_STREAM_TOTEM, EFFECT_0))
+ if (AuraEffect const* aurEff = owner->GetAuraEffect(SPELL_SHAMAN_GLYPH_OF_HEALING_STREAM_TOTEM, EFFECT_0))
AddPct(damage, aurEff->GetAmount());
damage = int32(target->SpellHealingBonusTaken(owner, triggeringSpell, damage, HEAL));
}
- caster->CastCustomSpell(target, SPELL_HEALING_STREAM_TOTEM_HEAL, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID());
+ caster->CastCustomSpell(target, SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID());
}
}
@@ -526,49 +589,50 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader
}
};
-enum ManaSpringTotem
-{
- SPELL_MANA_SPRING_TOTEM_ENERGIZE = 52032,
-};
-
-class spell_sha_mana_spring_totem : public SpellScriptLoader
+// 32182 - Heroism
+class spell_sha_heroism : public SpellScriptLoader
{
public:
- spell_sha_mana_spring_totem() : SpellScriptLoader("spell_sha_mana_spring_totem") { }
+ spell_sha_heroism() : SpellScriptLoader("spell_sha_heroism") { }
- class spell_sha_mana_spring_totem_SpellScript : public SpellScript
+ class spell_sha_heroism_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_sha_mana_spring_totem_SpellScript);
+ PrepareSpellScript(spell_sha_heroism_SpellScript);
- bool Validate(SpellInfo const* /*SpellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_MANA_SPRING_TOTEM_ENERGIZE))
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_EXHAUSTION))
return false;
return true;
}
- void HandleDummy(SpellEffIndex /* effIndex */)
+ void RemoveInvalidTargets(std::list<WorldObject*>& targets)
+ {
+ targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_SHAMAN_EXHAUSTION));
+ }
+
+ void ApplyDebuff()
{
- int32 damage = GetEffectValue();
if (Unit* target = GetHitUnit())
- if (Unit* caster = GetCaster())
- if (target->getPowerType() == POWER_MANA)
- caster->CastCustomSpell(target, SPELL_MANA_SPRING_TOTEM_ENERGIZE, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID());
+ target->CastSpell(target, SPELL_SHAMAN_EXHAUSTION, true);
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_sha_mana_spring_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_heroism_SpellScript::RemoveInvalidTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_RAID);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_heroism_SpellScript::RemoveInvalidTargets, EFFECT_1, TARGET_UNIT_CASTER_AREA_RAID);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_heroism_SpellScript::RemoveInvalidTargets, EFFECT_2, TARGET_UNIT_CASTER_AREA_RAID);
+ AfterHit += SpellHitFn(spell_sha_heroism_SpellScript::ApplyDebuff);
}
-
};
SpellScript* GetSpellScript() const
{
- return new spell_sha_mana_spring_totem_SpellScript();
+ return new spell_sha_heroism_SpellScript();
}
};
+// 60103 - Lava Lash
class spell_sha_lava_lash : public SpellScriptLoader
{
public:
@@ -583,7 +647,7 @@ class spell_sha_lava_lash : public SpellScriptLoader
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
- void HandleDummy(SpellEffIndex /* effIndex */)
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
if (Player* caster = GetCaster()->ToPlayer())
{
@@ -612,100 +676,94 @@ class spell_sha_lava_lash : public SpellScriptLoader
}
};
-// 1064 Chain Heal
-class spell_sha_chain_heal : public SpellScriptLoader
+// 52031, 52033, 52034, 52035, 52036, 58778, 58779, 58780 - Mana Spring Totem
+class spell_sha_mana_spring_totem : public SpellScriptLoader
{
public:
- spell_sha_chain_heal() : SpellScriptLoader("spell_sha_chain_heal") { }
+ spell_sha_mana_spring_totem() : SpellScriptLoader("spell_sha_mana_spring_totem") { }
- class spell_sha_chain_heal_SpellScript : public SpellScript
+ class spell_sha_mana_spring_totem_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_sha_chain_heal_SpellScript);
+ PrepareSpellScript(spell_sha_mana_spring_totem_SpellScript);
- bool Load()
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- firstHeal = true;
- riptide = false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_MANA_SPRING_TOTEM_ENERGIZE))
+ return false;
return true;
}
- void HandleHeal(SpellEffIndex /*effIndex*/)
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
- if (firstHeal)
- {
- // Check if the target has Riptide
- if (AuraEffect* aurEff = GetHitUnit()->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_SHAMAN, 0, 0, 0x10, GetCaster()->GetGUID()))
- {
- riptide = true;
- // Consume it
- GetHitUnit()->RemoveAura(aurEff->GetBase());
- }
- firstHeal = false;
- }
- // Riptide increases the Chain Heal effect by 25%
- if (riptide)
- SetHitHeal(GetHitHeal() * 1.25f);
+ int32 damage = GetEffectValue();
+ if (Unit* target = GetHitUnit())
+ if (Unit* caster = GetCaster())
+ if (target->getPowerType() == POWER_MANA)
+ caster->CastCustomSpell(target, SPELL_SHAMAN_MANA_SPRING_TOTEM_ENERGIZE, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID());
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_sha_chain_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL);
+ OnEffectHitTarget += SpellEffectFn(spell_sha_mana_spring_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
- bool firstHeal;
- bool riptide;
};
SpellScript* GetSpellScript() const
{
- return new spell_sha_chain_heal_SpellScript();
+ return new spell_sha_mana_spring_totem_SpellScript();
}
};
-class spell_sha_flame_shock : public SpellScriptLoader
+// 39610 - Mana Tide Totem
+class spell_sha_mana_tide_totem : public SpellScriptLoader
{
public:
- spell_sha_flame_shock() : SpellScriptLoader("spell_sha_flame_shock") { }
+ spell_sha_mana_tide_totem() : SpellScriptLoader("spell_sha_mana_tide_totem") { }
- class spell_sha_flame_shock_AuraScript : public AuraScript
+ class spell_sha_mana_tide_totem_SpellScript : public SpellScript
{
- PrepareAuraScript(spell_sha_flame_shock_AuraScript);
+ PrepareSpellScript(spell_sha_mana_tide_totem_SpellScript);
- bool Validate(SpellInfo const* /*spell*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SHAMAN_LAVA_FLOWS_R1))
- return false;
- if (!sSpellMgr->GetSpellInfo(SHAMAN_LAVA_FLOWS_TRIGGERED_R1))
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_MANA_TIDE) || !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_MANA_TIDE_TOTEM))
return false;
return true;
}
- void HandleDispel(DispelInfo* /*dispelInfo*/)
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
if (Unit* caster = GetCaster())
- // Lava Flows
- if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, ICON_ID_SHAMAN_LAVA_FLOW, EFFECT_0))
+ if (Unit* unitTarget = GetHitUnit())
{
- if (sSpellMgr->GetFirstSpellInChain(SHAMAN_LAVA_FLOWS_R1) != sSpellMgr->GetFirstSpellInChain(aurEff->GetId()))
- return;
-
- uint8 rank = sSpellMgr->GetSpellRank(aurEff->GetId());
- caster->CastSpell(caster, sSpellMgr->GetSpellWithRank(SHAMAN_LAVA_FLOWS_TRIGGERED_R1, rank), true);
+ if (unitTarget->getPowerType() == POWER_MANA)
+ {
+ int32 effValue = GetEffectValue();
+ // Glyph of Mana Tide
+ if (Unit* owner = caster->GetOwner())
+ if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_SHAMAN_GLYPH_OF_MANA_TIDE, 0))
+ effValue += dummy->GetAmount();
+ // Regenerate 6% of Total Mana Every 3 secs
+ int32 effBasePoints0 = int32(CalculatePct(unitTarget->GetMaxPower(POWER_MANA), effValue));
+ caster->CastCustomSpell(unitTarget, SPELL_SHAMAN_MANA_TIDE_TOTEM, &effBasePoints0, NULL, NULL, true, NULL, NULL, GetOriginalCaster()->GetGUID());
+ }
}
}
void Register()
{
- AfterDispel += AuraDispelFn(spell_sha_flame_shock_AuraScript::HandleDispel);
+ OnEffectHitTarget += SpellEffectFn(spell_sha_mana_tide_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
- AuraScript* GetAuraScript() const
+ SpellScript* GetSpellScript() const
{
- return new spell_sha_flame_shock_AuraScript();
+ return new spell_sha_mana_tide_totem_SpellScript();
}
};
+// 6495 - Sentry Totem
class spell_sha_sentry_totem : public SpellScriptLoader
{
public:
@@ -717,7 +775,7 @@ class spell_sha_sentry_totem : public SpellScriptLoader
bool Validate(SpellInfo const* /*spell*/)
{
- if (!sSpellMgr->GetSpellInfo(SHAMAN_BIND_SIGHT))
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_BIND_SIGHT))
return false;
return true;
}
@@ -727,7 +785,7 @@ class spell_sha_sentry_totem : public SpellScriptLoader
if (Unit* caster = GetCaster())
if (Creature* totem = caster->GetMap()->GetCreature(caster->m_SummonSlot[4]))
if (totem->isTotem())
- caster->CastSpell(totem, SHAMAN_BIND_SIGHT, true);
+ caster->CastSpell(totem, SPELL_SHAMAN_BIND_SIGHT, true);
}
void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
@@ -750,21 +808,52 @@ class spell_sha_sentry_totem : public SpellScriptLoader
}
};
+// -51490 - Thunderstorm
+class spell_sha_thunderstorm : public SpellScriptLoader
+{
+ public:
+ spell_sha_thunderstorm() : SpellScriptLoader("spell_sha_thunderstorm") { }
+
+ class spell_sha_thunderstorm_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_sha_thunderstorm_SpellScript);
+
+ void HandleKnockBack(SpellEffIndex effIndex)
+ {
+ // Glyph of Thunderstorm
+ if (GetCaster()->HasAura(SPELL_SHAMAN_GLYPH_OF_THUNDERSTORM))
+ PreventHitDefaultEffect(effIndex);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_sha_thunderstorm_SpellScript::HandleKnockBack, EFFECT_2, SPELL_EFFECT_KNOCK_BACK);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_sha_thunderstorm_SpellScript();
+ }
+};
+
void AddSC_shaman_spell_scripts()
{
+ new spell_sha_ancestral_awakening_proc();
new spell_sha_astral_shift();
- new spell_sha_fire_nova();
- new spell_sha_mana_tide_totem();
- new spell_sha_earthbind_totem();
- new spell_sha_earthen_power();
new spell_sha_bloodlust();
- new spell_sha_heroism();
- new spell_sha_ancestral_awakening_proc();
+ new spell_sha_chain_heal();
new spell_sha_cleansing_totem_pulse();
+ new spell_sha_earth_shield();
+ new spell_sha_earthbind_totem();
+ new spell_sha_earthen_power();
+ new spell_sha_fire_nova();
+ new spell_sha_flame_shock();
new spell_sha_healing_stream_totem();
- new spell_sha_mana_spring_totem();
+ new spell_sha_heroism();
new spell_sha_lava_lash();
- new spell_sha_chain_heal();
- new spell_sha_flame_shock();
+ new spell_sha_mana_spring_totem();
+ new spell_sha_mana_tide_totem();
new spell_sha_sentry_totem();
+ new spell_sha_thunderstorm();
}
diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp
index 2070933173b..a9a4b2d749a 100644
--- a/src/server/scripts/Spells/spell_warlock.cpp
+++ b/src/server/scripts/Spells/spell_warlock.cpp
@@ -28,141 +28,91 @@
enum WarlockSpells
{
- WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS = 54435,
- WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER = 54443,
- WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD = 54508,
- WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER = 54509,
- WARLOCK_DEMONIC_EMPOWERMENT_IMP = 54444,
- WARLOCK_IMPROVED_HEALTHSTONE_R1 = 18692,
- WARLOCK_IMPROVED_HEALTHSTONE_R2 = 18693,
- WARLOCK_DEMONIC_CIRCLE_SUMMON = 48018,
- WARLOCK_DEMONIC_CIRCLE_TELEPORT = 48020,
- WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST = 62388,
- WARLOCK_HAUNT = 48181,
- WARLOCK_HAUNT_HEAL = 48210,
- WARLOCK_UNSTABLE_AFFLICTION_DISPEL = 31117,
- WARLOCK_CURSE_OF_DOOM_EFFECT = 18662,
- WARLOCK_IMPROVED_HEALTH_FUNNEL_R1 = 18703,
- WARLOCK_IMPROVED_HEALTH_FUNNEL_R2 = 18704,
- WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1 = 60955,
- WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2 = 60956,
+ SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT = 18662,
+ SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON = 48018,
+ SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT = 48020,
+ SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST = 62388,
+ SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS = 54435,
+ SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER = 54443,
+ SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD = 54508,
+ SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER = 54509,
+ SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP = 54444,
+ SPELL_WARLOCK_FEL_SYNERGY_HEAL = 54181,
+ SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE = 63106,
+ SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R1 = 18692,
+ SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R2 = 18693,
+ SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1 = 18703,
+ SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2 = 18704,
+ SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1 = 60955,
+ SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2 = 60956,
+ SPELL_WARLOCK_HAUNT = 48181,
+ SPELL_WARLOCK_HAUNT_HEAL = 48210,
+ SPELL_WARLOCK_LIFE_TAP_ENERGIZE = 31818,
+ SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2 = 32553,
+ SPELL_WARLOCK_SOULSHATTER = 32835,
+ SPELL_WARLOCK_SIPHON_LIFE_HEAL = 63106,
+ SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL = 31117
};
-class spell_warl_banish : public SpellScriptLoader
+enum WarlockSpellIcons
{
-public:
- spell_warl_banish() : SpellScriptLoader("spell_warl_banish") { }
-
- class spell_warl_banish_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_warl_banish_SpellScript);
-
- bool Load()
- {
- _removed = false;
- return true;
- }
-
- void HandleBanish()
- {
- if (Unit* target = GetHitUnit())
- {
- if (target->GetAuraEffect(SPELL_AURA_SCHOOL_IMMUNITY, SPELLFAMILY_WARLOCK, 0, 0x08000000, 0))
- {
- //No need to remove old aura since its removed due to not stack by current Banish aura
- PreventHitDefaultEffect(EFFECT_0);
- PreventHitDefaultEffect(EFFECT_1);
- PreventHitDefaultEffect(EFFECT_2);
- _removed = true;
- }
- }
- }
-
- void RemoveAura()
- {
- if (_removed)
- PreventHitAura();
- }
-
- void Register()
- {
- BeforeHit += SpellHitFn(spell_warl_banish_SpellScript::HandleBanish);
- AfterHit += SpellHitFn(spell_warl_banish_SpellScript::RemoveAura);
- }
-
- bool _removed;
- };
-
- SpellScript* GetSpellScript() const
- {
- return new spell_warl_banish_SpellScript();
- }
+ WARLOCK_ICON_ID_IMPROVED_LIFE_TAP = 208,
+ WARLOCK_ICON_ID_MANA_FEED = 1982
};
-// 47193 Demonic Empowerment
-class spell_warl_demonic_empowerment : public SpellScriptLoader
+// 710, 18647 - Banish
+class spell_warl_banish : public SpellScriptLoader
{
public:
- spell_warl_demonic_empowerment() : SpellScriptLoader("spell_warl_demonic_empowerment") { }
+ spell_warl_banish() : SpellScriptLoader("spell_warl_banish") { }
- class spell_warl_demonic_empowerment_SpellScript : public SpellScript
+ class spell_warl_banish_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_warl_demonic_empowerment_SpellScript);
+ PrepareSpellScript(spell_warl_banish_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Load()
{
- if (!sSpellMgr->GetSpellInfo(WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS) || !sSpellMgr->GetSpellInfo(WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER) || !sSpellMgr->GetSpellInfo(WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD) || !sSpellMgr->GetSpellInfo(WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER) || !sSpellMgr->GetSpellInfo(WARLOCK_DEMONIC_EMPOWERMENT_IMP))
- return false;
+ _removed = false;
return true;
}
- void HandleScriptEffect(SpellEffIndex /*effIndex*/)
+ void HandleBanish()
{
- if (Creature* targetCreature = GetHitCreature())
+ if (Unit* target = GetHitUnit())
{
- if (targetCreature->isPet())
+ if (target->GetAuraEffect(SPELL_AURA_SCHOOL_IMMUNITY, SPELLFAMILY_WARLOCK, 0, 0x08000000, 0))
{
- CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(targetCreature->GetEntry());
- switch (ci->family)
- {
- case CREATURE_FAMILY_SUCCUBUS:
- targetCreature->CastSpell(targetCreature, WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS, true);
- break;
- case CREATURE_FAMILY_VOIDWALKER:
- {
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER);
- int32 hp = int32(targetCreature->CountPctFromMaxHealth(GetCaster()->CalculateSpellDamage(targetCreature, spellInfo, 0)));
- targetCreature->CastCustomSpell(targetCreature, WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER, &hp, NULL, NULL, true);
- //unitTarget->CastSpell(unitTarget, 54441, true);
- break;
- }
- case CREATURE_FAMILY_FELGUARD:
- targetCreature->CastSpell(targetCreature, WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD, true);
- break;
- case CREATURE_FAMILY_FELHUNTER:
- targetCreature->CastSpell(targetCreature, WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER, true);
- break;
- case CREATURE_FAMILY_IMP:
- targetCreature->CastSpell(targetCreature, WARLOCK_DEMONIC_EMPOWERMENT_IMP, true);
- break;
- }
+ // No need to remove old aura since its removed due to not stack by current Banish aura
+ PreventHitDefaultEffect(EFFECT_0);
+ PreventHitDefaultEffect(EFFECT_1);
+ PreventHitDefaultEffect(EFFECT_2);
+ _removed = true;
}
}
}
+ void RemoveAura()
+ {
+ if (_removed)
+ PreventHitAura();
+ }
+
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_warl_demonic_empowerment_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ BeforeHit += SpellHitFn(spell_warl_banish_SpellScript::HandleBanish);
+ AfterHit += SpellHitFn(spell_warl_banish_SpellScript::RemoveAura);
}
+
+ bool _removed;
};
SpellScript* GetSpellScript() const
{
- return new spell_warl_demonic_empowerment_SpellScript();
+ return new spell_warl_banish_SpellScript();
}
};
-// 6201 Create Healthstone (and ranks)
+// 6201 - Create Healthstone (and ranks)
class spell_warl_create_healthstone : public SpellScriptLoader
{
public:
@@ -174,9 +124,9 @@ class spell_warl_create_healthstone : public SpellScriptLoader
static uint32 const iTypes[8][3];
- bool Validate(SpellInfo const* /*spellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(WARLOCK_IMPROVED_HEALTHSTONE_R1) || !sSpellMgr->GetSpellInfo(WARLOCK_IMPROVED_HEALTHSTONE_R2))
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R1) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R2))
return false;
return true;
}
@@ -204,8 +154,12 @@ class spell_warl_create_healthstone : public SpellScriptLoader
{
switch (aurEff->GetId())
{
- case WARLOCK_IMPROVED_HEALTHSTONE_R1: rank = 1; break;
- case WARLOCK_IMPROVED_HEALTHSTONE_R2: rank = 2; break;
+ case SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R1:
+ rank = 1;
+ break;
+ case SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R2:
+ rank = 2;
+ break;
default:
sLog->outError(LOG_FILTER_SPELLS_AURAS, "Unknown rank of Improved Healthstone id: %d", aurEff->GetId());
break;
@@ -241,142 +195,379 @@ uint32 const spell_warl_create_healthstone::spell_warl_create_healthstone_SpellS
{36892, 36893, 36894} // Fel Healthstone
};
-// 47422 Everlasting Affliction
-class spell_warl_everlasting_affliction : public SpellScriptLoader
+// -603 - Curse of Doom
+class spell_warl_curse_of_doom : public SpellScriptLoader
{
public:
- spell_warl_everlasting_affliction() : SpellScriptLoader("spell_warl_everlasting_affliction") { }
+ spell_warl_curse_of_doom() : SpellScriptLoader("spell_warl_curse_of_doom") { }
- class spell_warl_everlasting_affliction_SpellScript : public SpellScript
+ class spell_warl_curse_of_doom_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_warl_everlasting_affliction_SpellScript);
+ PrepareAuraScript(spell_warl_curse_of_doom_AuraScript);
- void HandleScriptEffect(SpellEffIndex /*effIndex*/)
+ bool Validate(SpellInfo const* /*spell*/)
{
- if (Unit* unitTarget = GetHitUnit())
- // Refresh corruption on target
- if (AuraEffect* aur = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x2, 0, 0, GetCaster()->GetGUID()))
- aur->GetBase()->RefreshDuration();
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER;
+ }
+
+ void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
+ {
+ if (!GetCaster())
+ return;
+
+ AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode();
+ if (removeMode != AURA_REMOVE_BY_DEATH || !IsExpired())
+ return;
+
+ if (GetCaster()->ToPlayer()->isHonorOrXPTarget(GetTarget()))
+ GetCaster()->CastSpell(GetTarget(), SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT, true, NULL, aurEff);
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_warl_everlasting_affliction_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_warl_curse_of_doom_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
}
};
- SpellScript* GetSpellScript() const
+ AuraScript* GetAuraScript() const
{
- return new spell_warl_everlasting_affliction_SpellScript();
+ return new spell_warl_curse_of_doom_AuraScript();
}
};
-// 18541 Ritual of Doom Effect
-class spell_warl_ritual_of_doom_effect : public SpellScriptLoader
+// 48018 - Demonic Circle Summon
+class spell_warl_demonic_circle_summon : public SpellScriptLoader
{
-public:
- spell_warl_ritual_of_doom_effect() : SpellScriptLoader("spell_warl_ritual_of_doom_effect") { }
+ public:
+ spell_warl_demonic_circle_summon() : SpellScriptLoader("spell_warl_demonic_circle_summon") { }
+
+ class spell_warl_demonic_circle_summon_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warl_demonic_circle_summon_AuraScript);
+
+ void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes mode)
+ {
+ // If effect is removed by expire remove the summoned demonic circle too.
+ if (!(mode & AURA_EFFECT_HANDLE_REAPPLY))
+ GetTarget()->RemoveGameObject(GetId(), true);
+
+ GetTarget()->RemoveAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST);
+ }
+
+ void HandleDummyTick(AuraEffect const* /*aurEff*/)
+ {
+ if (GameObject* circle = GetTarget()->GetGameObject(GetId()))
+ {
+ // Here we check if player is in demonic circle teleport range, if so add
+ // WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST; allowing him to cast the WARLOCK_DEMONIC_CIRCLE_TELEPORT.
+ // If not in range remove the WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST.
- class spell_warl_ritual_of_doom_effect_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_warl_ritual_of_doom_effect_SpellScript);
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT);
- void HandleDummy(SpellEffIndex /*effIndex*/)
+ if (GetTarget()->IsWithinDist(circle, spellInfo->GetMaxRange(true)))
+ {
+ if (!GetTarget()->HasAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST))
+ GetTarget()->CastSpell(GetTarget(), SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST, true);
+ }
+ else
+ GetTarget()->RemoveAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectRemove += AuraEffectApplyFn(spell_warl_demonic_circle_summon_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_demonic_circle_summon_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
{
- Unit* caster = GetCaster();
- caster->CastSpell(caster, GetEffectValue(), true);
+ return new spell_warl_demonic_circle_summon_AuraScript();
}
+};
+
+// 48020 - Demonic Circle Teleport
+class spell_warl_demonic_circle_teleport : public SpellScriptLoader
+{
+ public:
+ spell_warl_demonic_circle_teleport() : SpellScriptLoader("spell_warl_demonic_circle_teleport") { }
- void Register()
+ class spell_warl_demonic_circle_teleport_AuraScript : public AuraScript
{
- OnEffectHit += SpellEffectFn(spell_warl_ritual_of_doom_effect_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ PrepareAuraScript(spell_warl_demonic_circle_teleport_AuraScript);
+
+ void HandleTeleport(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Player* player = GetTarget()->ToPlayer())
+ {
+ if (GameObject* circle = player->GetGameObject(SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON))
+ {
+ player->NearTeleportTo(circle->GetPositionX(), circle->GetPositionY(), circle->GetPositionZ(), circle->GetOrientation());
+ player->RemoveMovementImpairingAuras();
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnEffectApply += AuraEffectApplyFn(spell_warl_demonic_circle_teleport_AuraScript::HandleTeleport, EFFECT_0, SPELL_AURA_MECHANIC_IMMUNITY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warl_demonic_circle_teleport_AuraScript();
}
- };
+};
+
+// 47193 - Demonic Empowerment
+class spell_warl_demonic_empowerment : public SpellScriptLoader
+{
+ public:
+ spell_warl_demonic_empowerment() : SpellScriptLoader("spell_warl_demonic_empowerment") { }
+
+ class spell_warl_demonic_empowerment_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warl_demonic_empowerment_SpellScript);
- SpellScript* GetSpellScript() const
- {
- return new spell_warl_ritual_of_doom_effect_SpellScript();
- }
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP))
+ return false;
+ return true;
+ }
+
+ void HandleScriptEffect(SpellEffIndex /*effIndex*/)
+ {
+ if (Creature* targetCreature = GetHitCreature())
+ {
+ if (targetCreature->isPet())
+ {
+ CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(targetCreature->GetEntry());
+ switch (ci->family)
+ {
+ case CREATURE_FAMILY_SUCCUBUS:
+ targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS, true);
+ break;
+ case CREATURE_FAMILY_VOIDWALKER:
+ {
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER);
+ int32 hp = int32(targetCreature->CountPctFromMaxHealth(GetCaster()->CalculateSpellDamage(targetCreature, spellInfo, 0)));
+ targetCreature->CastCustomSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER, &hp, NULL, NULL, true);
+ //unitTarget->CastSpell(unitTarget, 54441, true);
+ break;
+ }
+ case CREATURE_FAMILY_FELGUARD:
+ targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD, true);
+ break;
+ case CREATURE_FAMILY_FELHUNTER:
+ targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER, true);
+ break;
+ case CREATURE_FAMILY_IMP:
+ targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP, true);
+ break;
+ }
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warl_demonic_empowerment_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warl_demonic_empowerment_SpellScript();
+ }
};
-class spell_warl_seed_of_corruption : public SpellScriptLoader
+// 47422 - Everlasting Affliction
+class spell_warl_everlasting_affliction : public SpellScriptLoader
{
public:
- spell_warl_seed_of_corruption() : SpellScriptLoader("spell_warl_seed_of_corruption") { }
+ spell_warl_everlasting_affliction() : SpellScriptLoader("spell_warl_everlasting_affliction") { }
- class spell_warl_seed_of_corruption_SpellScript : public SpellScript
+ class spell_warl_everlasting_affliction_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_warl_seed_of_corruption_SpellScript);
+ PrepareSpellScript(spell_warl_everlasting_affliction_SpellScript);
- void FilterTargets(std::list<WorldObject*>& targets)
+ void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
- if (GetExplTargetUnit())
- targets.remove(GetExplTargetUnit());
+ if (Unit* unitTarget = GetHitUnit())
+ // Refresh corruption on target
+ if (AuraEffect* aur = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x2, 0, 0, GetCaster()->GetGUID()))
+ aur->GetBase()->RefreshDuration();
}
void Register()
{
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warl_seed_of_corruption_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
+ OnEffectHitTarget += SpellEffectFn(spell_warl_everlasting_affliction_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const
{
- return new spell_warl_seed_of_corruption_SpellScript();
+ return new spell_warl_everlasting_affliction_SpellScript();
}
};
-enum Soulshatter
+// -47230 - Fel Synergy
+class spell_warl_fel_synergy : public SpellScriptLoader
{
- SPELL_SOULSHATTER = 32835,
+ public:
+ spell_warl_fel_synergy() : SpellScriptLoader("spell_warl_fel_synergy") { }
+
+ class spell_warl_fel_synergy_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warl_fel_synergy_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_FEL_SYNERGY_HEAL))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return GetTarget()->GetGuardianPet() && eventInfo.GetDamageInfo()->GetDamage();
+ }
+
+ void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 heal = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount());
+ GetTarget()->CastCustomSpell(SPELL_WARLOCK_FEL_SYNERGY_HEAL, SPELLVALUE_BASE_POINT0, heal, (Unit*)NULL, true, NULL, aurEff); // TARGET_UNIT_PET
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_warl_fel_synergy_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_warl_fel_synergy_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warl_fel_synergy_AuraScript();
+ }
};
-class spell_warl_soulshatter : public SpellScriptLoader
+// -48181 - Haunt
+class spell_warl_haunt : public SpellScriptLoader
{
public:
- spell_warl_soulshatter() : SpellScriptLoader("spell_warl_soulshatter") { }
+ spell_warl_haunt() : SpellScriptLoader("spell_warl_haunt") { }
- class spell_warl_soulshatter_SpellScript : public SpellScript
+ class spell_warl_haunt_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_warl_soulshatter_SpellScript);
+ PrepareSpellScript(spell_warl_haunt_SpellScript);
+
+ void HandleOnHit()
+ {
+ if (Aura* aura = GetHitAura())
+ if (AuraEffect* aurEff = aura->GetEffect(EFFECT_1))
+ aurEff->SetAmount(CalculatePct(aurEff->GetAmount(), GetHitDamage()));
+ }
+
+ void Register()
+ {
+ OnHit += SpellHitFn(spell_warl_haunt_SpellScript::HandleOnHit);
+ }
+ };
+
+ class spell_warl_haunt_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warl_haunt_AuraScript);
bool Validate(SpellInfo const* /*spell*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_SOULSHATTER))
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_HAUNT_HEAL))
return false;
return true;
}
- void HandleDummy(SpellEffIndex /*effIndex*/)
+ void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
- Unit* caster = GetCaster();
- if (Unit* target = GetHitUnit())
+ if (Unit* caster = GetCaster())
{
- if (target->CanHaveThreatList() && target->getThreatManager().getThreat(caster) > 0.0f)
- caster->CastSpell(target, SPELL_SOULSHATTER, true);
+ int32 amount = aurEff->GetAmount();
+ GetTarget()->CastCustomSpell(caster, SPELL_WARLOCK_HAUNT_HEAL, &amount, NULL, NULL, true, NULL, aurEff, GetCasterGUID());
}
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_warl_soulshatter_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnEffectRemove += AuraEffectApplyFn(spell_warl_haunt_AuraScript::HandleRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
}
};
SpellScript* GetSpellScript() const
{
- return new spell_warl_soulshatter_SpellScript();
+ return new spell_warl_haunt_SpellScript();
+ }
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warl_haunt_AuraScript();
}
};
-enum LifeTap
+// -755 - Health Funnel
+class spell_warl_health_funnel : public SpellScriptLoader
{
- SPELL_LIFE_TAP_ENERGIZE = 31818,
- SPELL_LIFE_TAP_ENERGIZE_2 = 32553,
- ICON_ID_IMPROVED_LIFE_TAP = 208,
- ICON_ID_MANA_FEED = 1982,
+ public:
+ spell_warl_health_funnel() : SpellScriptLoader("spell_warl_health_funnel") { }
+
+ class spell_warl_health_funnel_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warl_health_funnel_AuraScript);
+
+ void ApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* caster = GetCaster();
+ if (!caster)
+ return;
+
+ Unit* target = GetTarget();
+ if (caster->HasAura(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2))
+ target->CastSpell(target, SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2, true);
+ else if (caster->HasAura(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1))
+ target->CastSpell(target, SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1, true);
+ }
+
+ void RemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
+ target->RemoveAurasDueToSpell(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1);
+ target->RemoveAurasDueToSpell(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2);
+ }
+
+ void Register()
+ {
+ OnEffectRemove += AuraEffectRemoveFn(spell_warl_health_funnel_AuraScript::RemoveEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL);
+ OnEffectApply += AuraEffectApplyFn(spell_warl_health_funnel_AuraScript::ApplyEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warl_health_funnel_AuraScript();
+ }
};
+// -1454 - Life Tap
class spell_warl_life_tap : public SpellScriptLoader
{
public:
@@ -393,7 +584,7 @@ class spell_warl_life_tap : public SpellScriptLoader
bool Validate(SpellInfo const* /*spell*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_ENERGIZE) || !sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_ENERGIZE_2))
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_LIFE_TAP_ENERGIZE) || !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2))
return false;
return true;
}
@@ -410,20 +601,20 @@ class spell_warl_life_tap : public SpellScriptLoader
target->ModifyHealth(-damage);
// Improved Life Tap mod
- if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, ICON_ID_IMPROVED_LIFE_TAP, 0))
+ if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_IMPROVED_LIFE_TAP, 0))
AddPct(mana, aurEff->GetAmount());
- caster->CastCustomSpell(target, SPELL_LIFE_TAP_ENERGIZE, &mana, NULL, NULL, false);
+ caster->CastCustomSpell(target, SPELL_WARLOCK_LIFE_TAP_ENERGIZE, &mana, NULL, NULL, false);
// Mana Feed
int32 manaFeedVal = 0;
- if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_WARLOCK, ICON_ID_MANA_FEED, 0))
+ if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_MANA_FEED, 0))
manaFeedVal = aurEff->GetAmount();
if (manaFeedVal > 0)
{
ApplyPct(manaFeedVal, mana);
- caster->CastCustomSpell(caster, SPELL_LIFE_TAP_ENERGIZE_2, &manaFeedVal, NULL, NULL, true, NULL);
+ caster->CastCustomSpell(caster, SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2, &manaFeedVal, NULL, NULL, true, NULL);
}
}
}
@@ -448,149 +639,188 @@ class spell_warl_life_tap : public SpellScriptLoader
}
};
-class spell_warl_demonic_circle_summon : public SpellScriptLoader
+// 18541 - Ritual of Doom Effect
+class spell_warl_ritual_of_doom_effect : public SpellScriptLoader
{
public:
- spell_warl_demonic_circle_summon() : SpellScriptLoader("spell_warl_demonic_circle_summon") { }
+ spell_warl_ritual_of_doom_effect() : SpellScriptLoader("spell_warl_ritual_of_doom_effect") { }
- class spell_warl_demonic_circle_summon_AuraScript : public AuraScript
+ class spell_warl_ritual_of_doom_effect_SpellScript : public SpellScript
{
- PrepareAuraScript(spell_warl_demonic_circle_summon_AuraScript);
+ PrepareSpellScript(spell_warl_ritual_of_doom_effect_SpellScript);
- void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes mode)
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
- // If effect is removed by expire remove the summoned demonic circle too.
- if (!(mode & AURA_EFFECT_HANDLE_REAPPLY))
- GetTarget()->RemoveGameObject(GetId(), true);
-
- GetTarget()->RemoveAura(WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST);
+ Unit* caster = GetCaster();
+ caster->CastSpell(caster, GetEffectValue(), true);
}
- void HandleDummyTick(AuraEffect const* /*aurEff*/)
+ void Register()
{
- if (GameObject* circle = GetTarget()->GetGameObject(GetId()))
- {
- // Here we check if player is in demonic circle teleport range, if so add
- // WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST; allowing him to cast the WARLOCK_DEMONIC_CIRCLE_TELEPORT.
- // If not in range remove the WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST.
+ OnEffectHit += SpellEffectFn(spell_warl_ritual_of_doom_effect_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(WARLOCK_DEMONIC_CIRCLE_TELEPORT);
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warl_ritual_of_doom_effect_SpellScript();
+ }
+};
- if (GetTarget()->IsWithinDist(circle, spellInfo->GetMaxRange(true)))
- {
- if (!GetTarget()->HasAura(WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST))
- GetTarget()->CastSpell(GetTarget(), WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST, true);
- }
- else
- GetTarget()->RemoveAura(WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST);
- }
+// -27285 - Seed of Corruption
+class spell_warl_seed_of_corruption : public SpellScriptLoader
+{
+ public:
+ spell_warl_seed_of_corruption() : SpellScriptLoader("spell_warl_seed_of_corruption") { }
+
+ class spell_warl_seed_of_corruption_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warl_seed_of_corruption_SpellScript);
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ if (GetExplTargetUnit())
+ targets.remove(GetExplTargetUnit());
}
void Register()
{
- OnEffectRemove += AuraEffectApplyFn(spell_warl_demonic_circle_summon_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_demonic_circle_summon_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warl_seed_of_corruption_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
}
};
- AuraScript* GetAuraScript() const
+ SpellScript* GetSpellScript() const
{
- return new spell_warl_demonic_circle_summon_AuraScript();
+ return new spell_warl_seed_of_corruption_SpellScript();
}
};
-class spell_warl_demonic_circle_teleport : public SpellScriptLoader
+// -7235 - Shadow Ward
+class spell_warl_shadow_ward : public SpellScriptLoader
{
public:
- spell_warl_demonic_circle_teleport() : SpellScriptLoader("spell_warl_demonic_circle_teleport") { }
+ spell_warl_shadow_ward() : SpellScriptLoader("spell_warl_shadow_ward") { }
- class spell_warl_demonic_circle_teleport_AuraScript : public AuraScript
+ class spell_warl_shadow_ward_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_warl_demonic_circle_teleport_AuraScript);
+ PrepareAuraScript(spell_warl_shadow_ward_AuraScript);
- void HandleTeleport(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
{
- if (Player* player = GetTarget()->ToPlayer())
+ canBeRecalculated = false;
+ if (Unit* caster = GetCaster())
{
- if (GameObject* circle = player->GetGameObject(WARLOCK_DEMONIC_CIRCLE_SUMMON))
- {
- player->NearTeleportTo(circle->GetPositionX(), circle->GetPositionY(), circle->GetPositionZ(), circle->GetOrientation());
- player->RemoveMovementImpairingAuras();
- }
+ // +80.68% from sp bonus
+ float bonus = 0.8068f;
+
+ bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
+ bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
+
+ amount += int32(bonus);
}
}
void Register()
{
- OnEffectApply += AuraEffectApplyFn(spell_warl_demonic_circle_teleport_AuraScript::HandleTeleport, EFFECT_0, SPELL_AURA_MECHANIC_IMMUNITY, AURA_EFFECT_HANDLE_REAL);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_shadow_ward_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
}
};
AuraScript* GetAuraScript() const
{
- return new spell_warl_demonic_circle_teleport_AuraScript();
+ return new spell_warl_shadow_ward_AuraScript();
}
};
-class spell_warl_haunt : public SpellScriptLoader
+// 63108 - Siphon Life
+class spell_warl_siphon_life : public SpellScriptLoader
{
public:
- spell_warl_haunt() : SpellScriptLoader("spell_warl_haunt") { }
+ spell_warl_siphon_life() : SpellScriptLoader("spell_warl_siphon_life") { }
- class spell_warl_haunt_SpellScript : public SpellScript
+ class spell_warl_siphon_life_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_warl_haunt_SpellScript);
+ PrepareAuraScript(spell_warl_siphon_life_AuraScript);
- void HandleOnHit()
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (Aura* aura = GetHitAura())
- if (AuraEffect* aurEff = aura->GetEffect(EFFECT_1))
- aurEff->SetAmount(CalculatePct(aurEff->GetAmount(), GetHitDamage()));
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SIPHON_LIFE_HEAL))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetDamageInfo()->GetDamage();
+ }
+
+ void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()));
+ // Glyph of Siphon Life
+ if (AuraEffect const* glyph = GetTarget()->GetAuraEffect(SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE, EFFECT_0))
+ AddPct(amount, glyph->GetAmount());
+
+ GetTarget()->CastCustomSpell(SPELL_WARLOCK_SIPHON_LIFE_HEAL, SPELLVALUE_BASE_POINT0, amount, GetTarget(), true, NULL, aurEff);
}
void Register()
{
- OnHit += SpellHitFn(spell_warl_haunt_SpellScript::HandleOnHit);
+ DoCheckProc += AuraCheckProcFn(spell_warl_siphon_life_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_warl_siphon_life_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY);
}
};
- class spell_warl_haunt_AuraScript : public AuraScript
+ AuraScript* GetAuraScript() const
{
- PrepareAuraScript(spell_warl_haunt_AuraScript);
+ return new spell_warl_siphon_life_AuraScript();
+ }
+};
+
+// 29858 - Soulshatter
+class spell_warl_soulshatter : public SpellScriptLoader
+{
+ public:
+ spell_warl_soulshatter() : SpellScriptLoader("spell_warl_soulshatter") { }
+
+ class spell_warl_soulshatter_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warl_soulshatter_SpellScript);
bool Validate(SpellInfo const* /*spell*/)
{
- if (!sSpellMgr->GetSpellInfo(WARLOCK_HAUNT_HEAL))
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SOULSHATTER))
return false;
return true;
}
- void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
- if (Unit* caster = GetCaster())
+ Unit* caster = GetCaster();
+ if (Unit* target = GetHitUnit())
{
- int32 amount = aurEff->GetAmount();
- GetTarget()->CastCustomSpell(caster, WARLOCK_HAUNT_HEAL, &amount, NULL, NULL, true, NULL, aurEff, GetCasterGUID());
+ if (target->CanHaveThreatList() && target->getThreatManager().getThreat(caster) > 0.0f)
+ caster->CastSpell(target, SPELL_WARLOCK_SOULSHATTER, true);
}
}
void Register()
{
- OnEffectRemove += AuraEffectApplyFn(spell_warl_haunt_AuraScript::HandleRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ OnEffectHitTarget += SpellEffectFn(spell_warl_soulshatter_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const
{
- return new spell_warl_haunt_SpellScript();
- }
-
- AuraScript* GetAuraScript() const
- {
- return new spell_warl_haunt_AuraScript();
+ return new spell_warl_soulshatter_SpellScript();
}
};
+// -30108 - Unstable Affliction
class spell_warl_unstable_affliction : public SpellScriptLoader
{
public:
@@ -602,7 +832,7 @@ class spell_warl_unstable_affliction : public SpellScriptLoader
bool Validate(SpellInfo const* /*spell*/)
{
- if (!sSpellMgr->GetSpellInfo(WARLOCK_UNSTABLE_AFFLICTION_DISPEL))
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL))
return false;
return true;
}
@@ -614,7 +844,7 @@ class spell_warl_unstable_affliction : public SpellScriptLoader
{
int32 damage = aurEff->GetAmount() * 9;
// backfire damage and silence
- caster->CastCustomSpell(dispelInfo->GetDispeller(), WARLOCK_UNSTABLE_AFFLICTION_DISPEL, &damage, NULL, NULL, true, NULL, aurEff);
+ caster->CastCustomSpell(dispelInfo->GetDispeller(), SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL, &damage, NULL, NULL, true, NULL, aurEff);
}
}
@@ -630,108 +860,23 @@ class spell_warl_unstable_affliction : public SpellScriptLoader
}
};
-class spell_warl_curse_of_doom : public SpellScriptLoader
-{
- public:
- spell_warl_curse_of_doom() : SpellScriptLoader("spell_warl_curse_of_doom") { }
-
- class spell_warl_curse_of_doom_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_warl_curse_of_doom_AuraScript);
-
- bool Validate(SpellInfo const* /*spell*/)
- {
- if (!sSpellMgr->GetSpellInfo(WARLOCK_CURSE_OF_DOOM_EFFECT))
- return false;
- return true;
- }
-
- bool Load()
- {
- return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
- void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- if (!GetCaster())
- return;
-
- AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode();
- if (removeMode != AURA_REMOVE_BY_DEATH || !IsExpired())
- return;
-
- if (GetCaster()->ToPlayer()->isHonorOrXPTarget(GetTarget()))
- GetCaster()->CastSpell(GetTarget(), WARLOCK_CURSE_OF_DOOM_EFFECT, true, NULL, aurEff);
- }
-
- void Register()
- {
- AfterEffectRemove += AuraEffectRemoveFn(spell_warl_curse_of_doom_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
- }
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_warl_curse_of_doom_AuraScript();
- }
-};
-
-class spell_warl_health_funnel : public SpellScriptLoader
-{
-public:
- spell_warl_health_funnel() : SpellScriptLoader("spell_warl_health_funnel") { }
-
- class spell_warl_health_funnel_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_warl_health_funnel_AuraScript);
-
- void ApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* caster = GetCaster();
- if (!caster)
- return;
-
- Unit* target = GetTarget();
- if (caster->HasAura(WARLOCK_IMPROVED_HEALTH_FUNNEL_R2))
- target->CastSpell(target, WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2, true);
- else if (caster->HasAura(WARLOCK_IMPROVED_HEALTH_FUNNEL_R1))
- target->CastSpell(target, WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1, true);
- }
-
- void RemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- target->RemoveAurasDueToSpell(WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1);
- target->RemoveAurasDueToSpell(WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2);
- }
-
- void Register()
- {
- OnEffectRemove += AuraEffectRemoveFn(spell_warl_health_funnel_AuraScript::RemoveEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL);
- OnEffectApply += AuraEffectApplyFn(spell_warl_health_funnel_AuraScript::ApplyEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL);
- }
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_warl_health_funnel_AuraScript();
- }
-};
-
void AddSC_warlock_spell_scripts()
{
new spell_warl_banish();
- new spell_warl_demonic_empowerment();
new spell_warl_create_healthstone();
+ new spell_warl_curse_of_doom();
+ new spell_warl_demonic_circle_summon();
+ new spell_warl_demonic_circle_teleport();
+ new spell_warl_demonic_empowerment();
new spell_warl_everlasting_affliction();
+ new spell_warl_fel_synergy();
+ new spell_warl_haunt();
+ new spell_warl_health_funnel();
+ new spell_warl_life_tap();
new spell_warl_ritual_of_doom_effect();
new spell_warl_seed_of_corruption();
+ new spell_warl_shadow_ward();
+ new spell_warl_siphon_life();
new spell_warl_soulshatter();
- new spell_warl_life_tap();
- new spell_warl_demonic_circle_summon();
- new spell_warl_demonic_circle_teleport();
- new spell_warl_haunt();
new spell_warl_unstable_affliction();
- new spell_warl_curse_of_doom();
- new spell_warl_health_funnel();
}
diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp
index 7b6ac8fed12..7136f046873 100644
--- a/src/server/scripts/Spells/spell_warrior.cpp
+++ b/src/server/scripts/Spells/spell_warrior.cpp
@@ -28,137 +28,217 @@
enum WarriorSpells
{
- WARRIOR_SPELL_LAST_STAND_TRIGGERED = 12976,
+ SPELL_WARRIOR_BLOODTHIRST = 23885,
+ SPELL_WARRIOR_BLOODTHIRST_DAMAGE = 23881,
+ SPELL_WARRIOR_CHARGE = 34846,
+ SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE = 59653,
+ SPELL_WARRIOR_DEEP_WOUNDS_RANK_1 = 12162,
+ SPELL_WARRIOR_DEEP_WOUNDS_RANK_2 = 12850,
+ SPELL_WARRIOR_DEEP_WOUNDS_RANK_3 = 12868,
+ SPELL_WARRIOR_DEEP_WOUNDS_RANK_PERIODIC = 12721,
+ SPELL_WARRIOR_EXECUTE = 20647,
+ SPELL_WARRIOR_GLYPH_OF_EXECUTION = 58367,
+ SPELL_WARRIOR_GLYPH_OF_VIGILANCE = 63326,
+ SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF = 65156,
+ SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT = 64976,
+ SPELL_WARRIOR_LAST_STAND_TRIGGERED = 12976,
+ SPELL_WARRIOR_SLAM = 50783,
+ SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK = 26654,
+ SPELL_WARRIOR_TAUNT = 355,
+ SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_1 = 46859,
+ SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_2 = 46860,
+ SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_1 = 64849,
+ SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_2 = 64850,
+ SPELL_WARRIOR_VIGILANCE_PROC = 50725,
+ SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT = 59665,
+
+ SPELL_PALADIN_BLESSING_OF_SANCTUARY = 20911,
+ SPELL_PALADIN_GREATER_BLESSING_OF_SANCTUARY = 25899,
+ SPELL_PRIEST_RENEWED_HOPE = 63944,
+ SPELL_GEN_DAMAGE_REDUCTION_AURA = 68066,
};
-class spell_warr_last_stand : public SpellScriptLoader
+enum WarriorSpellIcons
+{
+ WARRIOR_ICON_ID_SUDDEN_DEATH = 1989,
+};
+
+// 23881 - Bloodthirst
+class spell_warr_bloodthirst : public SpellScriptLoader
{
public:
- spell_warr_last_stand() : SpellScriptLoader("spell_warr_last_stand") { }
+ spell_warr_bloodthirst() : SpellScriptLoader("spell_warr_bloodthirst") { }
- class spell_warr_last_stand_SpellScript : public SpellScript
+ class spell_warr_bloodthirst_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_warr_last_stand_SpellScript);
+ PrepareSpellScript(spell_warr_bloodthirst_SpellScript);
- bool Validate(SpellInfo const* /*spellEntry*/)
+ void HandleDamage(SpellEffIndex /*effIndex*/)
{
- if (!sSpellMgr->GetSpellInfo(WARRIOR_SPELL_LAST_STAND_TRIGGERED))
- return false;
- return true;
+ int32 damage = GetEffectValue();
+ ApplyPct(damage, GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK));
+
+ if (Unit* target = GetHitUnit())
+ {
+ damage = GetCaster()->SpellDamageBonusDone(target, GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE);
+ damage = target->SpellDamageBonusTaken(GetCaster(), GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE);
+ }
+ SetHitDamage(damage);
}
void HandleDummy(SpellEffIndex /*effIndex*/)
{
- if (Unit* caster = GetCaster())
- {
- int32 healthModSpellBasePoints0 = int32(caster->CountPctFromMaxHealth(30));
- caster->CastCustomSpell(caster, WARRIOR_SPELL_LAST_STAND_TRIGGERED, &healthModSpellBasePoints0, NULL, NULL, true, NULL);
- }
+ int32 damage = GetEffectValue();
+ GetCaster()->CastCustomSpell(GetCaster(), SPELL_WARRIOR_BLOODTHIRST, &damage, NULL, NULL, true, NULL);
}
void Register()
{
- // add dummy effect spell handler to Last Stand
- OnEffectHit += SpellEffectFn(spell_warr_last_stand_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnEffectHitTarget += SpellEffectFn(spell_warr_bloodthirst_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
+ OnEffectHit += SpellEffectFn(spell_warr_bloodthirst_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const
{
- return new spell_warr_last_stand_SpellScript();
+ return new spell_warr_bloodthirst_SpellScript();
}
};
-class spell_warr_improved_spell_reflection : public SpellScriptLoader
+// 23880 - Bloodthirst (Heal)
+class spell_warr_bloodthirst_heal : public SpellScriptLoader
{
public:
- spell_warr_improved_spell_reflection() : SpellScriptLoader("spell_warr_improved_spell_reflection") { }
+ spell_warr_bloodthirst_heal() : SpellScriptLoader("spell_warr_bloodthirst_heal") { }
- class spell_warr_improved_spell_reflection_SpellScript : public SpellScript
+ class spell_warr_bloodthirst_heal_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_warr_improved_spell_reflection_SpellScript);
+ PrepareSpellScript(spell_warr_bloodthirst_heal_SpellScript);
- void FilterTargets(std::list<WorldObject*>& unitList)
+ void HandleHeal(SpellEffIndex /*effIndex*/)
{
- if (GetCaster())
- unitList.remove(GetCaster());
+ if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARRIOR_BLOODTHIRST_DAMAGE))
+ SetHitHeal(GetCaster()->CountPctFromMaxHealth(spellInfo->Effects[EFFECT_1].CalcValue(GetCaster())));
}
void Register()
{
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_improved_spell_reflection_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY);
+ OnEffectHitTarget += SpellEffectFn(spell_warr_bloodthirst_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL);
}
};
SpellScript* GetSpellScript() const
{
- return new spell_warr_improved_spell_reflection_SpellScript();
+ return new spell_warr_bloodthirst_heal_SpellScript();
}
};
-enum DamageReductionAura
+// -100 - Charge
+class spell_warr_charge : public SpellScriptLoader
{
- SPELL_BLESSING_OF_SANCTUARY = 20911,
- SPELL_GREATER_BLESSING_OF_SANCTUARY = 25899,
- SPELL_RENEWED_HOPE = 63944,
- SPELL_DAMAGE_REDUCTION_AURA = 68066,
-};
+ public:
+ spell_warr_charge() : SpellScriptLoader("spell_warr_charge") { }
-class spell_warr_vigilance : public SpellScriptLoader
-{
-public:
- spell_warr_vigilance() : SpellScriptLoader("spell_warr_vigilance") { }
+ class spell_warr_charge_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warr_charge_SpellScript);
- class spell_warr_vigilance_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_warr_vigilance_AuraScript);
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_CHARGE))
+ return false;
+ return true;
+ }
- bool Validate(SpellInfo const* /*SpellEntry*/)
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_DAMAGE_REDUCTION_AURA))
- return false;
- return true;
- }
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ int32 chargeBasePoints0 = GetEffectValue();
+ Unit* caster = GetCaster();
+ caster->CastCustomSpell(caster, SPELL_WARRIOR_CHARGE, &chargeBasePoints0, NULL, NULL, true);
+
+ // Juggernaut crit bonus
+ if (caster->HasAura(SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT))
+ caster->CastSpell(caster, SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF, true);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warr_charge_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY);
+ }
+ };
- void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ SpellScript* GetSpellScript() const
{
- if (Unit* target = GetTarget())
- target->CastSpell(target, SPELL_DAMAGE_REDUCTION_AURA, true);
+ return new spell_warr_charge_SpellScript();
}
+};
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+// 12809 - Concussion Blow
+class spell_warr_concussion_blow : public SpellScriptLoader
+{
+ public:
+ spell_warr_concussion_blow() : SpellScriptLoader("spell_warr_concussion_blow") { }
+
+ class spell_warr_concussion_blow_SpellScript : public SpellScript
{
- if (Unit* target = GetTarget())
+ PrepareSpellScript(spell_warr_concussion_blow_SpellScript);
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
- if (target->HasAura(SPELL_DAMAGE_REDUCTION_AURA) && !(target->HasAura(SPELL_BLESSING_OF_SANCTUARY) ||
- target->HasAura(SPELL_GREATER_BLESSING_OF_SANCTUARY) ||
- target->HasAura(SPELL_RENEWED_HOPE)))
- target->RemoveAurasDueToSpell(SPELL_DAMAGE_REDUCTION_AURA);
+ SetHitDamage(CalculatePct(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK), GetEffectValue()));
}
- }
- void Register()
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warr_concussion_blow_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
{
- OnEffectApply += AuraEffectApplyFn(spell_warr_vigilance_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- OnEffectRemove += AuraEffectRemoveFn(spell_warr_vigilance_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ return new spell_warr_concussion_blow_SpellScript();
}
-
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_warr_vigilance_AuraScript();
- }
};
-enum DeepWounds
+// -58872 - Damage Shield
+class spell_warr_damage_shield : public SpellScriptLoader
{
- SPELL_DEEP_WOUNDS_RANK_1 = 12162,
- SPELL_DEEP_WOUNDS_RANK_2 = 12850,
- SPELL_DEEP_WOUNDS_RANK_3 = 12868,
- SPELL_DEEP_WOUNDS_RANK_PERIODIC = 12721,
+ public:
+ spell_warr_damage_shield() : SpellScriptLoader("spell_warr_damage_shield") { }
+
+ class spell_warr_damage_shield_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warr_damage_shield_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE))
+ return false;
+ return true;
+ }
+
+ void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ // % of amount blocked
+ int32 damage = CalculatePct(int32(GetTarget()->GetShieldBlockValue()), aurEff->GetAmount());
+ GetTarget()->CastCustomSpell(SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_warr_damage_shield_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warr_damage_shield_AuraScript();
+ }
};
+// -12162 - Deep Wounds
class spell_warr_deep_wounds : public SpellScriptLoader
{
public:
@@ -168,14 +248,14 @@ class spell_warr_deep_wounds : public SpellScriptLoader
{
PrepareSpellScript(spell_warr_deep_wounds_SpellScript);
- bool Validate(SpellInfo const* /*SpellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_DEEP_WOUNDS_RANK_1) || !sSpellMgr->GetSpellInfo(SPELL_DEEP_WOUNDS_RANK_2) || !sSpellMgr->GetSpellInfo(SPELL_DEEP_WOUNDS_RANK_3))
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_1) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_2) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_3))
return false;
return true;
}
- void HandleDummy(SpellEffIndex /* effIndex */)
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
int32 damage = GetEffectValue();
Unit* caster = GetCaster();
@@ -188,16 +268,16 @@ class spell_warr_deep_wounds : public SpellScriptLoader
damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE);
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_DEEP_WOUNDS_RANK_PERIODIC);
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_PERIODIC);
uint32 ticks = spellInfo->GetDuration() / spellInfo->Effects[EFFECT_0].Amplitude;
// Add remaining ticks to damage done
- if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_DEEP_WOUNDS_RANK_PERIODIC, EFFECT_0, caster->GetGUID()))
+ if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_WARRIOR_DEEP_WOUNDS_RANK_PERIODIC, EFFECT_0, caster->GetGUID()))
damage += aurEff->GetAmount() * (ticks - aurEff->GetTickNumber());
- damage = damage / ticks;
+ damage /= ticks;
- caster->CastCustomSpell(target, SPELL_DEEP_WOUNDS_RANK_PERIODIC, &damage, NULL, NULL, true);
+ caster->CastCustomSpell(target, SPELL_WARRIOR_DEEP_WOUNDS_RANK_PERIODIC, &damage, NULL, NULL, true);
}
}
@@ -213,311 +293,500 @@ class spell_warr_deep_wounds : public SpellScriptLoader
}
};
-enum Charge
-{
- SPELL_JUGGERNAUT_CRIT_BONUS_TALENT = 64976,
- SPELL_JUGGERNAUT_CRIT_BONUS_BUFF = 65156,
- SPELL_CHARGE = 34846,
-};
-
-class spell_warr_charge : public SpellScriptLoader
+// -5308 - Execute
+class spell_warr_execute : public SpellScriptLoader
{
public:
- spell_warr_charge() : SpellScriptLoader("spell_warr_charge") { }
+ spell_warr_execute() : SpellScriptLoader("spell_warr_execute") { }
- class spell_warr_charge_SpellScript : public SpellScript
+ class spell_warr_execute_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_warr_charge_SpellScript);
+ PrepareSpellScript(spell_warr_execute_SpellScript);
- bool Validate(SpellInfo const* /*SpellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_JUGGERNAUT_CRIT_BONUS_TALENT) || !sSpellMgr->GetSpellInfo(SPELL_JUGGERNAUT_CRIT_BONUS_BUFF) || !sSpellMgr->GetSpellInfo(SPELL_CHARGE))
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_EXECUTE) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_GLYPH_OF_EXECUTION))
return false;
return true;
}
- void HandleDummy(SpellEffIndex /* effIndex */)
+
+ void HandleDummy(SpellEffIndex effIndex)
{
- int32 chargeBasePoints0 = GetEffectValue();
Unit* caster = GetCaster();
- caster->CastCustomSpell(caster, SPELL_CHARGE, &chargeBasePoints0, NULL, NULL, true);
+ if (Unit* target = GetHitUnit())
+ {
+ SpellInfo const* spellInfo = GetSpellInfo();
+ int32 rageUsed = std::min<int32>(300 - spellInfo->CalcPowerCost(caster, SpellSchoolMask(spellInfo->SchoolMask)), caster->GetPower(POWER_RAGE));
+ int32 newRage = std::max<int32>(0, caster->GetPower(POWER_RAGE) - rageUsed);
- //Juggernaut crit bonus
- if (caster->HasAura(SPELL_JUGGERNAUT_CRIT_BONUS_TALENT))
- caster->CastSpell(caster, SPELL_JUGGERNAUT_CRIT_BONUS_BUFF, true);
+ // Sudden Death rage save
+ if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_GENERIC, WARRIOR_ICON_ID_SUDDEN_DEATH, EFFECT_0))
+ {
+ int32 ragesave = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue() * 10;
+ newRage = std::max(newRage, ragesave);
+ }
+
+ caster->SetPower(POWER_RAGE, uint32(newRage));
+ // Glyph of Execution bonus
+ if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_WARRIOR_GLYPH_OF_EXECUTION, EFFECT_0))
+ rageUsed += aurEff->GetAmount() * 10;
+
+
+ int32 bp = GetEffectValue() + int32(rageUsed * spellInfo->Effects[effIndex].DamageMultiplier + caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.2f);
+ caster->CastCustomSpell(target, SPELL_WARRIOR_EXECUTE, &bp, NULL, NULL, true, NULL, NULL, GetOriginalCaster()->GetGUID());
+ }
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_warr_charge_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY);
+ OnEffectHitTarget += SpellEffectFn(spell_warr_execute_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const
{
- return new spell_warr_charge_SpellScript();
+ return new spell_warr_execute_SpellScript();
}
};
-enum Slam
-{
- SPELL_SLAM = 50783,
-};
-
-class spell_warr_slam : public SpellScriptLoader
+// 59725 - Improved Spell Reflection
+class spell_warr_improved_spell_reflection : public SpellScriptLoader
{
public:
- spell_warr_slam() : SpellScriptLoader("spell_warr_slam") { }
+ spell_warr_improved_spell_reflection() : SpellScriptLoader("spell_warr_improved_spell_reflection") { }
- class spell_warr_slam_SpellScript : public SpellScript
+ class spell_warr_improved_spell_reflection_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_warr_slam_SpellScript);
+ PrepareSpellScript(spell_warr_improved_spell_reflection_SpellScript);
- bool Validate(SpellInfo const* /*SpellEntry*/)
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_SLAM))
- return false;
- return true;
- }
- void HandleDummy(SpellEffIndex /* effIndex */)
+ void FilterTargets(std::list<WorldObject*>& unitList)
{
- int32 bp0 = GetEffectValue();
- if (GetHitUnit())
- GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_SLAM, &bp0, NULL, NULL, true, 0);
+ if (GetCaster())
+ unitList.remove(GetCaster());
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_warr_slam_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_improved_spell_reflection_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY);
}
};
SpellScript* GetSpellScript() const
{
- return new spell_warr_slam_SpellScript();
+ return new spell_warr_improved_spell_reflection_SpellScript();
}
};
-enum Execute
+// 5246 - Intimidating Shout
+class spell_warr_intimidating_shout : public SpellScriptLoader
{
- SPELL_EXECUTE = 20647,
- SPELL_GLYPH_OF_EXECUTION = 58367,
- ICON_ID_SUDDEN_DEATH = 1989,
+ public:
+ spell_warr_intimidating_shout() : SpellScriptLoader("spell_warr_intimidating_shout") { }
+
+ class spell_warr_intimidating_shout_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warr_intimidating_shout_SpellScript);
+
+ void FilterTargets(std::list<WorldObject*>& unitList)
+ {
+ unitList.remove(GetExplTargetWorldObject());
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout_SpellScript::FilterTargets, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warr_intimidating_shout_SpellScript();
+ }
};
-class spell_warr_execute : public SpellScriptLoader
+// 12975 - Last Stand
+class spell_warr_last_stand : public SpellScriptLoader
{
public:
- spell_warr_execute() : SpellScriptLoader("spell_warr_execute") { }
+ spell_warr_last_stand() : SpellScriptLoader("spell_warr_last_stand") { }
- class spell_warr_execute_SpellScript : public SpellScript
+ class spell_warr_last_stand_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_warr_execute_SpellScript);
+ PrepareSpellScript(spell_warr_last_stand_SpellScript);
- bool Validate(SpellInfo const* /*SpellEntry*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_EXECUTE) || !sSpellMgr->GetSpellInfo(SPELL_GLYPH_OF_EXECUTION))
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_LAST_STAND_TRIGGERED))
return false;
return true;
}
- void HandleDummy(SpellEffIndex effIndex)
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
- Unit* caster = GetCaster();
- if (Unit* target = GetHitUnit())
+ if (Unit* caster = GetCaster())
{
- SpellInfo const* spellInfo = GetSpellInfo();
- int32 rageUsed = std::min<int32>(300 - spellInfo->CalcPowerCost(caster, SpellSchoolMask(spellInfo->SchoolMask)), caster->GetPower(POWER_RAGE));
- int32 newRage = std::max<int32>(0, caster->GetPower(POWER_RAGE) - rageUsed);
-
- // Sudden Death rage save
- if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_GENERIC, ICON_ID_SUDDEN_DEATH, EFFECT_0))
- {
- int32 ragesave = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue() * 10;
- newRage = std::max(newRage, ragesave);
- }
-
- caster->SetPower(POWER_RAGE, uint32(newRage));
- // Glyph of Execution bonus
- if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_GLYPH_OF_EXECUTION, EFFECT_0))
- rageUsed += aurEff->GetAmount() * 10;
-
-
- int32 bp = GetEffectValue() + int32(rageUsed * spellInfo->Effects[effIndex].DamageMultiplier + caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.2f);
- caster->CastCustomSpell(target,SPELL_EXECUTE,&bp,0,0,true,0,0,GetOriginalCaster()->GetGUID());
+ int32 healthModSpellBasePoints0 = int32(caster->CountPctFromMaxHealth(30));
+ caster->CastCustomSpell(caster, SPELL_WARRIOR_LAST_STAND_TRIGGERED, &healthModSpellBasePoints0, NULL, NULL, true, NULL);
}
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_warr_execute_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnEffectHit += SpellEffectFn(spell_warr_last_stand_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const
{
- return new spell_warr_execute_SpellScript();
+ return new spell_warr_last_stand_SpellScript();
}
};
-class spell_warr_concussion_blow : public SpellScriptLoader
+// 7384, 7887, 11584, 11585 - Overpower
+class spell_warr_overpower : public SpellScriptLoader
{
public:
- spell_warr_concussion_blow() : SpellScriptLoader("spell_warr_concussion_blow") { }
+ spell_warr_overpower() : SpellScriptLoader("spell_warr_overpower") { }
- class spell_warr_concussion_blow_SpellScript : public SpellScript
+ class spell_warr_overpower_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_warr_concussion_blow_SpellScript);
+ PrepareSpellScript(spell_warr_overpower_SpellScript);
- void HandleDummy(SpellEffIndex /* effIndex */)
+ void HandleEffect(SpellEffIndex /*effIndex*/)
{
- SetHitDamage(CalculatePct(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK), GetEffectValue()));
+ uint32 spellId = 0;
+ if (GetCaster()->HasAura(SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_1))
+ spellId = SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_1;
+ else if (GetCaster()->HasAura(SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_2))
+ spellId = SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_2;
+
+ if (!spellId)
+ return;
+
+ if (Player* target = GetHitPlayer())
+ if (target->HasUnitState(UNIT_STATE_CASTING))
+ target->CastSpell(target, spellId, true);
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_warr_concussion_blow_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY);
+ OnEffectHitTarget += SpellEffectFn(spell_warr_overpower_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_ANY);
}
};
SpellScript* GetSpellScript() const
{
- return new spell_warr_concussion_blow_SpellScript();
+ return new spell_warr_overpower_SpellScript();
}
};
-enum Bloodthirst
+// -772 - Rend
+class spell_warr_rend : public SpellScriptLoader
{
- SPELL_BLOODTHIRST = 23885,
+ public:
+ spell_warr_rend() : SpellScriptLoader("spell_warr_rend") { }
+
+ class spell_warr_rend_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warr_rend_AuraScript);
+
+ void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ canBeRecalculated = false;
+
+ // $0.2 * (($MWB + $mwb) / 2 + $AP / 14 * $MWS) bonus per tick
+ float ap = caster->GetTotalAttackPowerValue(BASE_ATTACK);
+ int32 mws = caster->GetAttackTime(BASE_ATTACK);
+ float mwbMin = caster->GetWeaponDamageRange(BASE_ATTACK, MINDAMAGE);
+ float mwbMax = caster->GetWeaponDamageRange(BASE_ATTACK, MAXDAMAGE);
+ float mwb = ((mwbMin + mwbMax) / 2 + ap * mws / 14000) * 0.2f;
+ amount += int32(caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), mwb));
+
+ // "If used while your target is above 75% health, Rend does 35% more damage."
+ // as for 3.1.3 only ranks above 9 (wrong tooltip?)
+ if (GetSpellInfo()->GetRank() >= 9)
+ {
+ if (GetUnitOwner()->HasAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT, GetSpellInfo(), caster))
+ AddPct(amount, GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster));
+ }
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warr_rend_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warr_rend_AuraScript();
+ }
};
-class spell_warr_bloodthirst : public SpellScriptLoader
+// 64380, 65941 - Shattering Throw
+class spell_warr_shattering_throw : public SpellScriptLoader
{
public:
- spell_warr_bloodthirst() : SpellScriptLoader("spell_warr_bloodthirst") { }
+ spell_warr_shattering_throw() : SpellScriptLoader("spell_warr_shattering_throw") { }
- class spell_warr_bloodthirst_SpellScript : public SpellScript
+ class spell_warr_shattering_throw_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_warr_bloodthirst_SpellScript);
+ PrepareSpellScript(spell_warr_shattering_throw_SpellScript);
- void HandleDamage(SpellEffIndex /*effIndex*/)
+ void HandleScript(SpellEffIndex effIndex)
{
- int32 damage = GetEffectValue();
- ApplyPct(damage, GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK));
+ PreventHitDefaultEffect(effIndex);
+ // remove shields, will still display immune to damage part
if (Unit* target = GetHitUnit())
- {
- damage = GetCaster()->SpellDamageBonusDone(target, GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE);
- damage = target->SpellDamageBonusTaken(GetCaster(), GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE);
- }
- SetHitDamage(damage);
+ target->RemoveAurasWithMechanic(1 << MECHANIC_IMMUNE_SHIELD, AURA_REMOVE_BY_ENEMY_SPELL);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warr_shattering_throw_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warr_shattering_throw_SpellScript();
+ }
+};
+
+// -1464 - Slam
+class spell_warr_slam : public SpellScriptLoader
+{
+ public:
+ spell_warr_slam() : SpellScriptLoader("spell_warr_slam") { }
+
+ class spell_warr_slam_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warr_slam_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SLAM))
+ return false;
+ return true;
}
void HandleDummy(SpellEffIndex /*effIndex*/)
{
- int32 damage = GetEffectValue();
- GetCaster()->CastCustomSpell(GetCaster(), SPELL_BLOODTHIRST, &damage, NULL, NULL, true, NULL);
+ int32 bp0 = GetEffectValue();
+ if (GetHitUnit())
+ GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_WARRIOR_SLAM, &bp0, NULL, NULL, true, 0);
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_warr_bloodthirst_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- OnEffectHit += SpellEffectFn(spell_warr_bloodthirst_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY);
+ OnEffectHitTarget += SpellEffectFn(spell_warr_slam_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const
{
- return new spell_warr_bloodthirst_SpellScript();
+ return new spell_warr_slam_SpellScript();
}
};
-enum BloodthirstHeal
-{
- SPELL_BLOODTHIRST_DAMAGE = 23881,
-};
-
-class spell_warr_bloodthirst_heal : public SpellScriptLoader
+// 12328, 18765, 35429 - Sweeping Strikes
+class spell_warr_sweeping_strikes : public SpellScriptLoader
{
public:
- spell_warr_bloodthirst_heal() : SpellScriptLoader("spell_warr_bloodthirst_heal") { }
+ spell_warr_sweeping_strikes() : SpellScriptLoader("spell_warr_sweeping_strikes") { }
- class spell_warr_bloodthirst_heal_SpellScript : public SpellScript
+ class spell_warr_sweeping_strikes_AuraScript : public AuraScript
{
- PrepareSpellScript(spell_warr_bloodthirst_heal_SpellScript);
+ PrepareAuraScript(spell_warr_sweeping_strikes_AuraScript);
- void HandleHeal(SpellEffIndex /*effIndex*/)
+ bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_BLOODTHIRST_DAMAGE))
- SetHitHeal(GetCaster()->CountPctFromMaxHealth(spellInfo->Effects[EFFECT_1].CalcValue(GetCaster())));
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ _procTarget = eventInfo.GetActor()->SelectNearbyTarget(eventInfo.GetProcTarget());
+ return _procTarget;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK, true, NULL, aurEff);
}
void Register()
{
- OnEffectHitTarget += SpellEffectFn(spell_warr_bloodthirst_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL);
+ DoCheckProc += AuraCheckProcFn(spell_warr_sweeping_strikes_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_warr_sweeping_strikes_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
}
+
+ private:
+ Unit* _procTarget;
};
- SpellScript* GetSpellScript() const
+ AuraScript* GetAuraScript() const
{
- return new spell_warr_bloodthirst_heal_SpellScript();
+ return new spell_warr_sweeping_strikes_AuraScript();
}
};
-enum Overpower
+// 50720 - Vigilance
+class spell_warr_vigilance : public SpellScriptLoader
{
- SPELL_UNRELENTING_ASSAULT_RANK_1 = 46859,
- SPELL_UNRELENTING_ASSAULT_RANK_2 = 46860,
- SPELL_UNRELENTING_ASSAULT_TRIGGER_1 = 64849,
- SPELL_UNRELENTING_ASSAULT_TRIGGER_2 = 64850,
+ public:
+ spell_warr_vigilance() : SpellScriptLoader("spell_warr_vigilance") { }
+
+ class spell_warr_vigilance_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warr_vigilance_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_GLYPH_OF_VIGILANCE))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_VIGILANCE_PROC))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_GEN_DAMAGE_REDUCTION_AURA))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
+ target->CastSpell(target, SPELL_GEN_DAMAGE_REDUCTION_AURA, true);
+
+ if (Unit* caster = GetCaster())
+ target->CastSpell(caster, SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT, true);
+ }
+
+ void HandleAfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ //! WORKAROUND
+ //! this glyph is a proc
+ if (Unit* caster = GetCaster())
+ {
+ if (AuraEffect const* glyph = caster->GetAuraEffect(SPELL_WARRIOR_GLYPH_OF_VIGILANCE, EFFECT_0))
+ GetTarget()->ModifyRedirectThreat(glyph->GetAmount());
+ }
+ }
+
+ void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
+ if (target->HasAura(SPELL_GEN_DAMAGE_REDUCTION_AURA) &&
+ !(target->HasAura(SPELL_PALADIN_BLESSING_OF_SANCTUARY) ||
+ target->HasAura(SPELL_PALADIN_GREATER_BLESSING_OF_SANCTUARY) ||
+ target->HasAura(SPELL_PRIEST_RENEWED_HOPE)))
+ {
+ target->RemoveAurasDueToSpell(SPELL_GEN_DAMAGE_REDUCTION_AURA);
+ }
+
+ target->ResetRedirectThreat();
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ _procTarget = GetCaster();
+ return _procTarget;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_VIGILANCE_PROC, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectApply += AuraEffectApplyFn(spell_warr_vigilance_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ AfterEffectApply += AuraEffectApplyFn(spell_warr_vigilance_AuraScript::HandleAfterApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ OnEffectRemove += AuraEffectRemoveFn(spell_warr_vigilance_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ DoCheckProc += AuraCheckProcFn(spell_warr_vigilance_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_warr_vigilance_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+
+ private:
+ Unit* _procTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warr_vigilance_AuraScript();
+ }
};
-class spell_warr_overpower : public SpellScriptLoader
+// 50725 Vigilance
+class spell_warr_vigilance_trigger : public SpellScriptLoader
{
-public:
- spell_warr_overpower() : SpellScriptLoader("spell_warr_overpower") { }
-
- class spell_warr_overpower_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_warr_overpower_SpellScript);
+ public:
+ spell_warr_vigilance_trigger() : SpellScriptLoader("spell_warr_vigilance_trigger") { }
- void HandleEffect(SpellEffIndex /* effIndex */)
+ class spell_warr_vigilance_trigger_SpellScript : public SpellScript
{
- uint32 spellId = 0;
- if (GetCaster()->HasAura(SPELL_UNRELENTING_ASSAULT_RANK_1))
- spellId = SPELL_UNRELENTING_ASSAULT_TRIGGER_1;
- else if (GetCaster()->HasAura(SPELL_UNRELENTING_ASSAULT_RANK_2))
- spellId = SPELL_UNRELENTING_ASSAULT_TRIGGER_2;
+ PrepareSpellScript(spell_warr_vigilance_trigger_SpellScript);
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
- if (!spellId)
- return;
+ // Remove Taunt cooldown
+ if (Player* target = GetHitPlayer())
+ target->RemoveSpellCooldown(SPELL_WARRIOR_TAUNT, true);
+ }
- if (Player* target = GetHitPlayer())
- if (target->HasUnitState(UNIT_STATE_CASTING))
- target->CastSpell(target, spellId, true);
- }
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warr_vigilance_trigger_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
- void Register()
+ SpellScript* GetSpellScript() const
{
- OnEffectHitTarget += SpellEffectFn(spell_warr_overpower_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_ANY);
+ return new spell_warr_vigilance_trigger_SpellScript();
}
- };
-
- SpellScript* GetSpellScript() const
- {
- return new spell_warr_overpower_SpellScript();
- }
};
void AddSC_warrior_spell_scripts()
{
- new spell_warr_last_stand();
- new spell_warr_improved_spell_reflection();
- new spell_warr_vigilance();
- new spell_warr_deep_wounds();
- new spell_warr_charge();
- new spell_warr_slam();
- new spell_warr_execute();
- new spell_warr_concussion_blow();
new spell_warr_bloodthirst();
new spell_warr_bloodthirst_heal();
+ new spell_warr_charge();
+ new spell_warr_concussion_blow();
+ new spell_warr_damage_shield();
+ new spell_warr_deep_wounds();
+ new spell_warr_execute();
+ new spell_warr_improved_spell_reflection();
+ new spell_warr_intimidating_shout();
+ new spell_warr_last_stand();
new spell_warr_overpower();
+ new spell_warr_rend();
+ new spell_warr_shattering_throw();
+ new spell_warr_slam();
+ new spell_warr_sweeping_strikes();
+ new spell_warr_vigilance();
+ new spell_warr_vigilance_trigger();
}
diff --git a/src/server/scripts/World/achievement_scripts.cpp b/src/server/scripts/World/achievement_scripts.cpp
index 41a32185620..d0ffe5214db 100644
--- a/src/server/scripts/World/achievement_scripts.cpp
+++ b/src/server/scripts/World/achievement_scripts.cpp
@@ -315,6 +315,30 @@ class achievement_not_even_a_scratch : public AchievementCriteriaScript
}
};
+enum FlirtWithDisaster
+{
+ AURA_PERFUME_FOREVER = 70235,
+ AURA_PERFUME_ENCHANTRESS = 70234,
+ AURA_PERFUME_VICTORY = 70233,
+};
+
+class achievement_flirt_with_disaster_perf_check : public AchievementCriteriaScript
+{
+ public:
+ achievement_flirt_with_disaster_perf_check() : AchievementCriteriaScript("achievement_flirt_with_disaster_perf_check") { }
+
+ bool OnCheck(Player* player, Unit* /*target*/)
+ {
+ if (!player)
+ return false;
+
+ if (player->HasAura(AURA_PERFUME_FOREVER) || player->HasAura(AURA_PERFUME_ENCHANTRESS) || player->HasAura(AURA_PERFUME_VICTORY))
+ return true;
+
+ return false;
+ }
+};
+
void AddSC_achievement_scripts()
{
new achievement_resilient_victory();
@@ -333,4 +357,5 @@ void AddSC_achievement_scripts()
new achievement_bg_sa_defense_of_ancients();
new achievement_tilted();
new achievement_not_even_a_scratch();
+ new achievement_flirt_with_disaster_perf_check();
}
diff --git a/src/server/scripts/World/areatrigger_scripts.cpp b/src/server/scripts/World/areatrigger_scripts.cpp
index c031c4a3b4d..c8436dfa1f0 100644
--- a/src/server/scripts/World/areatrigger_scripts.cpp
+++ b/src/server/scripts/World/areatrigger_scripts.cpp
@@ -425,6 +425,71 @@ class AreaTrigger_at_area_52_entrance : public AreaTriggerScript
std::map<uint32, time_t> _triggerTimes;
};
+/*######
+ ## at_frostgrips_hollow
+ ######*/
+
+enum FrostgripsHollow
+{
+ QUEST_THE_LONESOME_WATCHER = 12877,
+
+ NPC_STORMFORGED_MONITOR = 29862,
+ NPC_STORMFORGED_ERADICTOR = 29861,
+
+ TYPE_WAYPOINT = 0,
+ DATA_START = 0
+};
+
+Position const stormforgedMonitorPosition = {6963.95f, 45.65f, 818.71f, 4.948f};
+Position const stormforgedEradictorPosition = {6983.18f, 7.15f, 806.33f, 2.228f};
+
+class AreaTrigger_at_frostgrips_hollow : public AreaTriggerScript
+{
+public:
+ AreaTrigger_at_frostgrips_hollow() : AreaTriggerScript("at_frostgrips_hollow")
+ {
+ stormforgedMonitorGUID = 0;
+ stormforgedEradictorGUID = 0;
+ }
+
+ bool OnTrigger(Player* player, AreaTriggerEntry const* /* trigger */)
+ {
+ if (player->GetQuestStatus(QUEST_THE_LONESOME_WATCHER) != QUEST_STATUS_INCOMPLETE)
+ return false;
+
+ Creature* stormforgedMonitor = Creature::GetCreature(*player, stormforgedMonitorGUID);
+ if (stormforgedMonitor)
+ return false;
+
+ Creature* stormforgedEradictor = Creature::GetCreature(*player, stormforgedEradictorGUID);
+ if (stormforgedEradictor)
+ return false;
+
+ stormforgedMonitor = player->SummonCreature(NPC_STORMFORGED_MONITOR, stormforgedMonitorPosition, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
+ if (stormforgedMonitor)
+ {
+ stormforgedMonitorGUID = stormforgedMonitor->GetGUID();
+ stormforgedMonitor->SetWalk(false);
+ /// The npc would search an alternative way to get to the last waypoint without this unit state.
+ stormforgedMonitor->AddUnitState(UNIT_STATE_IGNORE_PATHFINDING);
+ stormforgedMonitor->GetMotionMaster()->MovePath(NPC_STORMFORGED_MONITOR * 100, false);
+ }
+
+ stormforgedEradictor = player->SummonCreature(NPC_STORMFORGED_ERADICTOR, stormforgedEradictorPosition, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
+ if (stormforgedEradictor)
+ {
+ stormforgedEradictorGUID = stormforgedEradictor->GetGUID();
+ stormforgedEradictor->GetMotionMaster()->MovePath(NPC_STORMFORGED_ERADICTOR * 100, false);
+ }
+
+ return true;
+ }
+
+private:
+ uint64 stormforgedMonitorGUID;
+ uint64 stormforgedEradictorGUID;
+};
+
void AddSC_areatrigger_scripts()
{
new AreaTrigger_at_coilfang_waterfall();
@@ -436,4 +501,5 @@ void AddSC_areatrigger_scripts()
new AreaTrigger_at_nats_landing();
new AreaTrigger_at_brewfest();
new AreaTrigger_at_area_52_entrance();
+ new AreaTrigger_at_frostgrips_hollow();
}
diff --git a/src/server/scripts/World/boss_emerald_dragons.cpp b/src/server/scripts/World/boss_emerald_dragons.cpp
index 7699712a1e4..4e95a6162d3 100644
--- a/src/server/scripts/World/boss_emerald_dragons.cpp
+++ b/src/server/scripts/World/boss_emerald_dragons.cpp
@@ -113,7 +113,7 @@ struct emerald_dragonAI : public WorldBossAI
}
// Execute and reschedule base events shared between all Emerald Dragons
- void ExecuteEvent(uint32 const eventId)
+ void ExecuteEvent(uint32 eventId)
{
switch (eventId)
{
@@ -137,7 +137,7 @@ struct emerald_dragonAI : public WorldBossAI
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -177,7 +177,7 @@ class npc_dream_fog : public CreatureScript
_roamTimer = 0;
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -275,7 +275,7 @@ class boss_ysondre : public CreatureScript
}
}
- void ExecuteEvent(uint32 const eventId)
+ void ExecuteEvent(uint32 eventId)
{
switch (eventId)
{
@@ -304,7 +304,7 @@ class boss_ysondre : public CreatureScript
* --- Dragonspecific scripts and handling: LETHON
* ---
*
- * TODO:
+ * @todo
* - Spell: Shadow bolt whirl casts needs custom handling (spellscript)
*/
@@ -370,7 +370,7 @@ class boss_lethon : public CreatureScript
}
}
- void ExecuteEvent(uint32 const eventId)
+ void ExecuteEvent(uint32 eventId)
{
switch (eventId)
{
@@ -490,7 +490,7 @@ class boss_emeriss : public CreatureScript
}
}
- void ExecuteEvent(uint32 const eventId)
+ void ExecuteEvent(uint32 eventId)
{
switch (eventId)
{
@@ -604,7 +604,7 @@ class boss_taerar : public CreatureScript
}
}
- void ExecuteEvent(uint32 const eventId)
+ void ExecuteEvent(uint32 eventId)
{
switch (eventId)
{
@@ -622,7 +622,7 @@ class boss_taerar : public CreatureScript
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!me->isInCombat())
return;
diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp
index 5ed45764ed6..f57b6b8942c 100644
--- a/src/server/scripts/World/go_scripts.cpp
+++ b/src/server/scripts/World/go_scripts.cpp
@@ -251,7 +251,7 @@ class go_tablet_of_the_seven : public GameObjectScript
public:
go_tablet_of_the_seven() : GameObjectScript("go_tablet_of_the_seven") { }
- //TODO: use gossip option ("Transcript the Tablet") instead, if Trinity adds support.
+ /// @todo use gossip option ("Transcript the Tablet") instead, if Trinity adds support.
bool OnGossipHello(Player* player, GameObject* go)
{
if (go->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER)
@@ -1072,7 +1072,7 @@ public:
Quest const* qInfo = sObjectMgr->GetQuestTemplate(QUEST_PRISONERS_OF_WYRMSKULL);
if (qInfo)
{
- //TODO: prisoner should help player for a short period of time
+ /// @todo prisoner should help player for a short period of time
player->KilledMonsterCredit(qInfo->RequiredNpcOrGo[0], 0);
pPrisoner->DisappearAndDie();
}
diff --git a/src/server/scripts/World/guards.cpp b/src/server/scripts/World/guards.cpp
index f07a9ed7671..bff30f6cca5 100644
--- a/src/server/scripts/World/guards.cpp
+++ b/src/server/scripts/World/guards.cpp
@@ -70,7 +70,7 @@ public:
DoCast(who, spell->Id);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Always decrease our global cooldown first
if (globalCooldown > diff)
@@ -273,7 +273,7 @@ public:
canTeleport = false;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -338,7 +338,7 @@ public:
canTeleport = false;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
diff --git a/src/server/scripts/World/mob_generic_creature.cpp b/src/server/scripts/World/mob_generic_creature.cpp
index 174ba8870d1..d0ac142e050 100644
--- a/src/server/scripts/World/mob_generic_creature.cpp
+++ b/src/server/scripts/World/mob_generic_creature.cpp
@@ -55,7 +55,7 @@ public:
IsSelfRooted = true;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
//Always decrease our global cooldown first
if (GlobalCooldown > diff)
@@ -186,7 +186,7 @@ public:
uint32 timer, interval;
const SpellInfo* spell;
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (timer <= diff)
{
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index aaac8ee4b83..12796d5f88e 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -344,7 +344,7 @@ public:
void EnterCombat(Unit* /*who*/) {}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
// Reset flags after a certain time has passed so that the next player has to start the 'event' again
if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER))
@@ -444,7 +444,7 @@ public:
me->SendMessageToSet(&data, true);
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!Active)
{
@@ -689,7 +689,7 @@ public:
}
}
- void UpdateAI(uint32 const diff);
+ void UpdateAI(uint32 diff);
void EnterCombat(Unit* /*who*/){}
};
@@ -798,7 +798,7 @@ public:
}
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
//lower HP on every world tick makes it a useful counter, not officlone though
if (me->isAlive() && me->GetHealth() > 6)
@@ -824,7 +824,7 @@ public:
}
};
-void npc_doctor::npc_doctorAI::UpdateAI(uint32 const diff)
+void npc_doctor::npc_doctorAI::UpdateAI(uint32 diff)
{
if (Event && SummonPatientCount >= 20)
{
@@ -881,7 +881,7 @@ void npc_doctor::npc_doctorAI::UpdateAI(uint32 const diff)
## npc_garments_of_quests
######*/
-//TODO: get text for each NPC
+/// @todo get text for each NPC
enum Garments
{
@@ -1056,7 +1056,7 @@ public:
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (CanRun && !me->isInCombat())
{
@@ -1128,7 +1128,7 @@ public:
{
}
- void UpdateAI(uint32 const /*diff*/)
+ void UpdateAI(uint32 /*diff*/)
{
if (!UpdateVictim())
return;
@@ -1540,7 +1540,7 @@ public:
void AttackStart(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (ExplosionTimer <= diff)
{
@@ -1656,7 +1656,7 @@ public:
}
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -1734,7 +1734,7 @@ public:
void EnterCombat(Unit* /*who*/){}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (me->HasAura(20372))
{
@@ -1921,7 +1921,7 @@ public:
despawnTimer = 4 * IN_MILLISECONDS;
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (despawnTimer > 0)
{
@@ -1981,10 +1981,11 @@ class npc_training_dummy : public CreatureScript
public:
npc_training_dummy() : CreatureScript("npc_training_dummy") { }
- struct npc_training_dummyAI : Scripted_NoMovementAI
+ struct npc_training_dummyAI : ScriptedAI
{
- npc_training_dummyAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_training_dummyAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
entry = creature->GetEntry();
}
@@ -2015,13 +2016,7 @@ public:
damage = 0;
}
- void EnterCombat(Unit* /*who*/)
- {
- if (entry != NPC_ADVANCED_TARGET_DUMMY && entry != NPC_TARGET_DUMMY)
- return;
- }
-
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -2115,7 +2110,7 @@ public:
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -2179,7 +2174,7 @@ public:
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
@@ -2509,11 +2504,11 @@ public:
break;
case GOSSIP_ACTION_INFO_DEF + 8:
player->CLOSE_GOSSIP_MENU();
- player->AddItem(ITEM_KEY_TO_THE_FOCUSING_IRIS,1);
+ player->AddItem(ITEM_KEY_TO_THE_FOCUSING_IRIS, 1);
break;
case GOSSIP_ACTION_INFO_DEF + 9:
player->CLOSE_GOSSIP_MENU();
- player->AddItem(ITEM_HC_KEY_TO_THE_FOCUSING_IRIS,1);
+ player->AddItem(ITEM_HC_KEY_TO_THE_FOCUSING_IRIS, 1);
break;
}
return true;
@@ -2828,7 +2823,7 @@ public:
{
if (!me->FindNearestCreature(NPC_OMEN, 100.0f, false) && me->GetDistance2d(omenSummonPos.GetPositionX(), omenSummonPos.GetPositionY()) <= 100.0f)
{
- switch (urand(0,9))
+ switch (urand(0, 9))
{
case 0:
case 1:
@@ -2909,14 +2904,14 @@ public:
void EnterCombat(Unit* /*who*/) { }
- void DoAction(const int32 /*param*/)
+ void DoAction(int32 /*param*/)
{
inLove = true;
if (Unit* owner = me->GetOwner())
owner->CastSpell(owner, SPELL_SPRING_FLING, true);
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 diff)
{
if (inLove)
{
@@ -2956,31 +2951,6 @@ public:
};
};
-/*######
-## npc_generic_harpoon_cannon
-######*/
-
-class npc_generic_harpoon_cannon : public CreatureScript
-{
-public:
- npc_generic_harpoon_cannon() : CreatureScript("npc_generic_harpoon_cannon") { }
-
- struct npc_generic_harpoon_cannonAI : public ScriptedAI
- {
- npc_generic_harpoon_cannonAI(Creature* creature) : ScriptedAI(creature) {}
-
- void Reset()
- {
- me->SetUnitMovementFlags(MOVEMENTFLAG_ROOT);
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_generic_harpoon_cannonAI(creature);
- }
-};
-
void AddSC_npcs_special()
{
new npc_air_force_bots();
@@ -3012,5 +2982,4 @@ void AddSC_npcs_special()
new npc_earth_elemental();
new npc_firework();
new npc_spring_rabbit();
- new npc_generic_harpoon_cannon();
}