aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.h2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp58
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp1
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h13
-rw-r--r--src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp7
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp5
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h1
-rw-r--r--src/server/game/Entities/Player/Player.cpp58
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp14
-rw-r--r--src/server/game/Globals/ObjectMgr.h18
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp20
-rw-r--r--src/server/game/Instances/InstanceScript.cpp136
-rw-r--r--src/server/game/Instances/InstanceScript.h42
-rw-r--r--src/server/game/Miscellaneous/Language.h34
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h2
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp10
-rw-r--r--src/server/game/Spells/Spell.cpp2
-rw-r--r--src/server/game/Spells/SpellMgr.cpp3
-rw-r--r--src/server/game/Tickets/TicketMgr.cpp4
-rw-r--r--src/server/game/Tickets/TicketMgr.h2
-rw-r--r--src/server/game/World/World.cpp1
-rw-r--r--src/server/game/World/World.h1
-rw-r--r--src/server/scripts/Commands/cs_ban.cpp4
-rw-r--r--src/server/scripts/Commands/cs_instance.cpp27
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp57
-rw-r--r--src/server/scripts/Commands/cs_server.cpp17
-rw-r--r--src/server/scripts/Commands/cs_ticket.cpp13
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp213
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h2
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h1
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp50
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h1
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp119
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h2
-rw-r--r--src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Deadmines/deadmines.h2
-rw-r--r--src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp44
-rw-r--r--src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.h2
-rw-r--r--src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/karazhan.h3
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp43
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h2
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp14
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp16
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp60
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp20
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp135
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp37
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp45
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h2
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp79
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp14
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp199
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp211
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp135
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp102
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp45
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/scholomance.h5
-rw-r--r--src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp8
-rw-r--r--src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h2
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp16
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp14
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp18
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp28
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp20
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp12
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp14
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp10
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp10
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp14
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp66
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/stratholme.h2
-rw-r--r--src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h2
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp28
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp62
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp14
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp68
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp180
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp348
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp80
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h1
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp36
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp16
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp12
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/uldaman.h2
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp29
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp33
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp124
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp61
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp25
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp53
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp44
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/zulaman.h2
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp21
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp12
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp20
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp37
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp12
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp26
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp56
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp16
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp43
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h2
-rw-r--r--src/server/scripts/EasternKingdoms/zone_duskwood.cpp12
-rw-r--r--src/server/scripts/EasternKingdoms/zone_hinterlands.cpp8
-rw-r--r--src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp14
-rw-r--r--src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp14
-rw-r--r--src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp15
-rw-r--r--src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp32
-rw-r--r--src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp8
-rw-r--r--src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp16
-rw-r--r--src/server/scripts/EasternKingdoms/zone_undercity.cpp46
-rw-r--r--src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp28
-rw-r--r--src/server/scripts/EasternKingdoms/zone_wetlands.cpp12
-rw-r--r--src/server/scripts/Events/childrens_week.cpp131
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp16
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h2
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp12
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp8
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp10
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp1
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp16
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp72
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp20
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp16
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp16
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp64
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp19
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp1
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp18
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp27
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp12
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp18
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp53
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp1
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp18
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp14
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp24
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp1
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp8
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp1
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp31
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h2
-rw-r--r--src/server/scripts/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp16
-rw-r--r--src/server/scripts/Kalimdor/Maraudon/boss_landslide.cpp16
-rw-r--r--src/server/scripts/Kalimdor/Maraudon/boss_noxxion.cpp20
-rw-r--r--src/server/scripts/Kalimdor/Maraudon/boss_princess_theradras.cpp18
-rw-r--r--src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp114
-rw-r--r--src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp80
-rw-r--r--src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h9
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp16
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp62
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h1
-rw-r--r--src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp1
-rw-r--r--src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.h2
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp10
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp1
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp8
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp8
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp12
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp8
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp44
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h2
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp50
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp74
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp34
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp28
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp28
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp61
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp12
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp70
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp14
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp1
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp18
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h2
-rw-r--r--src/server/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp1
-rw-r--r--src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.h2
-rw-r--r--src/server/scripts/Kalimdor/ZulFarrak/boss_zum_rah.cpp14
-rw-r--r--src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp1
-rw-r--r--src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp12
-rw-r--r--src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h2
-rw-r--r--src/server/scripts/Kalimdor/boss_azuregos.cpp5
-rw-r--r--src/server/scripts/Kalimdor/zone_ashenvale.cpp28
-rw-r--r--src/server/scripts/Kalimdor/zone_azshara.cpp40
-rw-r--r--src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp90
-rw-r--r--src/server/scripts/Kalimdor/zone_darkshore.cpp12
-rw-r--r--src/server/scripts/Kalimdor/zone_durotar.cpp25
-rw-r--r--src/server/scripts/Kalimdor/zone_moonglade.cpp20
-rw-r--r--src/server/scripts/Kalimdor/zone_mulgore.cpp36
-rw-r--r--src/server/scripts/Kalimdor/zone_orgrimmar.cpp34
-rw-r--r--src/server/scripts/Kalimdor/zone_silithus.cpp80
-rw-r--r--src/server/scripts/Kalimdor/zone_tanaris.cpp43
-rw-r--r--src/server/scripts/Kalimdor/zone_the_barrens.cpp46
-rw-r--r--src/server/scripts/Kalimdor/zone_thousand_needles.cpp13
-rw-r--r--src/server/scripts/Kalimdor/zone_thunder_bluff.cpp20
-rw-r--r--src/server/scripts/Kalimdor/zone_ungoro_crater.cpp30
-rw-r--r--src/server/scripts/Kalimdor/zone_winterspring.cpp14
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h1
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp14
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp16
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp38
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp48
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h1
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp33
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp18
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp44
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp16
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp44
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp14
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h1
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp14
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp8
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp46
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp1
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp51
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h7
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp56
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp52
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp84
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp1
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp4
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h2
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp34
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp36
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp8
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp36
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp42
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp6
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp29
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h2
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp27
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp27
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp12
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h1
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp44
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp10
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp15
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp16
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h1
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp42
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp12
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h1
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp63
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp12
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp11
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp10
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp46
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp16
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h1
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp18
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_eck.cpp18
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp31
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp16
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp16
-rw-r--r--src/server/scripts/Northrend/Gundrak/gundrak.h2
-rw-r--r--src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp1
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp30
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp12
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp16
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp22
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp1
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp1
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp30
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp10
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp25
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp37
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h4
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp6
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp99
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp12
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp23
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp17
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp8
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp18
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp10
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp2
-rw-r--r--src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp45
-rw-r--r--src/server/scripts/Northrend/Naxxramas/naxxramas.h2
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h2
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp71
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp1
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/nexus.h2
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp44
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/oculus.h1
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h1
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp44
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h1
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp48
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp99
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h1
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp48
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h1
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp44
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h1
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp1
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h2
-rw-r--r--src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp1
-rw-r--r--src/server/scripts/Northrend/VioletHold/violet_hold.h2
-rw-r--r--src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/auchenai_crypts.h1
-rw-r--r--src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/instance_auchenai_crypts.cpp1
-rw-r--r--src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp111
-rw-r--r--src/server/scripts/Outland/Auchindoun/ManaTombs/instance_mana_tombs.cpp1
-rw-r--r--src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.h1
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp44
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h1
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp44
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h1
-rw-r--r--src/server/scripts/Outland/BlackTemple/black_temple.h6
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp314
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_supremus.cpp212
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp135
-rw-r--r--src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp44
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp1
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h2
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp56
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h1
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h1
-rw-r--r--src/server/scripts/Outland/GruulsLair/gruuls_lair.h1
-rw-r--r--src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp44
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h5
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp111
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp98
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp44
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h2
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp51
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp1
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h2
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp52
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h2
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp1
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/the_eye.h2
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp44
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h2
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h1
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp44
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp45
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/the_botanica.h2
-rw-r--r--src/server/scripts/Outland/zone_shadowmoon_valley.cpp79
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp5
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp26
-rw-r--r--src/server/scripts/World/boss_emerald_dragons.cpp2
-rw-r--r--src/server/scripts/World/go_scripts.cpp28
-rw-r--r--src/server/shared/Configuration/Config.cpp2
-rw-r--r--src/server/shared/Database/Field.h16
-rw-r--r--src/server/worldserver/worldserver.conf.dist32
-rw-r--r--src/tools/vmap4_extractor/model.cpp2
364 files changed, 5101 insertions, 4873 deletions
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h
index 788da26ea4a..f11769f1d1d 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h
@@ -370,7 +370,7 @@ class BossAI : public ScriptedAI
void _JustDied();
void _JustReachedHome() { me->setActive(false); }
- bool CheckInRoom()
+ virtual bool CheckInRoom()
{
if (CheckBoundary(me))
return true;
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 722f86a2392..93fe943b26b 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -2217,6 +2217,64 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
sGameEventMgr->StartEvent(eventId, true);
break;
}
+ case SMART_ACTION_START_CLOSEST_WAYPOINT:
+ {
+ uint32 waypoints[SMART_ACTION_PARAM_COUNT];
+ waypoints[0] = e.action.closestWaypointFromList.wp1;
+ waypoints[1] = e.action.closestWaypointFromList.wp2;
+ waypoints[2] = e.action.closestWaypointFromList.wp3;
+ waypoints[3] = e.action.closestWaypointFromList.wp4;
+ waypoints[4] = e.action.closestWaypointFromList.wp5;
+ waypoints[5] = e.action.closestWaypointFromList.wp6;
+ float distanceToClosest = std::numeric_limits<float>::max();
+ WayPoint* closestWp = NULL;
+
+ ObjectList* targets = GetTargets(e, unit);
+ if (targets)
+ {
+ for (ObjectList::iterator itr = targets->begin(); itr != targets->end(); ++itr)
+ {
+ if (Creature* target = (*itr)->ToCreature())
+ {
+ if (IsSmart(target))
+ {
+ for (uint8 i = 0; i < SMART_ACTION_PARAM_COUNT; i++)
+ {
+ if (!waypoints[i])
+ continue;
+
+ WPPath* path = sSmartWaypointMgr->GetPath(waypoints[i]);
+
+ if (!path || path->empty())
+ continue;
+
+ WPPath::const_iterator itrWp = path->find(0);
+
+ if (itrWp != path->end())
+ {
+ if (WayPoint* wp = itrWp->second)
+ {
+ float distToThisPath = target->GetDistance(wp->x, wp->y, wp->z);
+
+ if (distToThisPath < distanceToClosest)
+ {
+ distanceToClosest = distToThisPath;
+ closestWp = wp;
+ }
+ }
+ }
+ }
+
+ if (closestWp)
+ CAST_AI(SmartAI, target->AI())->StartPath(false, closestWp->id, true);
+ }
+ }
+ }
+
+ delete targets;
+ }
+ break;
+ }
default:
TC_LOG_ERROR("sql.sql", "SmartScript::ProcessAction: Entry %d SourceType %u, Event %u, Unhandled Action type %u", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType());
break;
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index 2e8453904a1..7b7e4fce7ea 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -1008,6 +1008,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
}
break;
}
+ case SMART_ACTION_START_CLOSEST_WAYPOINT:
case SMART_ACTION_FOLLOW:
case SMART_ACTION_SET_ORIENTATION:
case SMART_ACTION_STORE_TARGET_LIST:
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index c79deb5d960..296c3161845 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -529,8 +529,9 @@ enum SMART_ACTION
SMART_ACTION_REMOVE_POWER = 110, // PowerType, newPower
SMART_ACTION_GAME_EVENT_STOP = 111, // GameEventId
SMART_ACTION_GAME_EVENT_START = 112, // GameEventId
+ SMART_ACTION_START_CLOSEST_WAYPOINT = 113, // wp1, wp2, wp3, wp4, wp5, wp6, wp7
- SMART_ACTION_END = 113
+ SMART_ACTION_END = 114
};
struct SmartAction
@@ -987,6 +988,16 @@ struct SmartAction
uint32 id;
} gameEventStart;
+ struct
+ {
+ uint32 wp1;
+ uint32 wp2;
+ uint32 wp3;
+ uint32 wp4;
+ uint32 wp5;
+ uint32 wp6;
+ } closestWaypointFromList;
+
//! Note for any new future actions
//! All parameters must have type uint32
diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp b/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp
index 20d0364ab79..6e7425a75a3 100644
--- a/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp
+++ b/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp
@@ -355,6 +355,7 @@ void AuctionBotBuyer::AddNewAuctionBuyerBotBid(BuyerConfiguration& config)
uint32 bidPrice;
uint32 bidPriceByItem;
uint32 minBidPrice;
+ uint32 minBuyPrice;
if (auction->bid >= auction->startbid)
{
bidPrice = auction->GetAuctionOutBid();
@@ -373,6 +374,7 @@ void AuctionBotBuyer::AddNewAuctionBuyerBotBid(BuyerConfiguration& config)
inGameBuyPrice = 0;
inGameBidPrice = 0;
minBidPrice = 0;
+ minBuyPrice = 0;
}
else
{
@@ -381,6 +383,7 @@ void AuctionBotBuyer::AddNewAuctionBuyerBotBid(BuyerConfiguration& config)
inGameBuyPrice = sameItemItr->second.BuyPrice / sameItemItr->second.ItemCount;
inGameBidPrice = sameItemItr->second.BidPrice / sameItemItr->second.ItemCount;
minBidPrice = sameItemItr->second.MinBidPrice;
+ minBuyPrice = sameItemItr->second.MinBuyPrice;
}
uint32 maxBidablePrice = maxBuyablePrice - (maxBuyablePrice / 30); // Max Bidable price defined to 70% of max buyable price
@@ -389,14 +392,14 @@ void AuctionBotBuyer::AddNewAuctionBuyerBotBid(BuyerConfiguration& config)
TC_LOG_DEBUG("ahbot", "AHBot: MaxPrice of Entry %u is %.1fg.", itr->second.AuctionId, double(maxBuyablePrice) / 10000.0);
TC_LOG_DEBUG("ahbot", "AHBot: GamePrice buy=%.1fg, bid=%.1fg.", inGameBuyPrice / 10000, inGameBidPrice / 10000);
TC_LOG_DEBUG("ahbot", "AHBot: Minimal price see in AH Buy=%ug, Bid=%ug.",
- sameItemItr->second.MinBuyPrice / 10000, minBidPrice / 10000);
+ minBuyPrice / 10000, minBidPrice / 10000);
TC_LOG_DEBUG("ahbot", "AHBot: Actual Entry price, Buy=%ug, Bid=%ug.", buyoutPrice / 10000, bidPrice / 10000);
if (!auction->owner) // Original auction owner
maxChance = maxChance / 5; // if Owner is AHBot this mean player placed bid on this auction. We divide by 5 chance for AhBuyer to place bid on it. (This make more challenge than ignore entry)
if (auction->buyout != 0) // Is the item directly buyable?
{
- if (IsBuyableEntry(buyoutPrice, inGameBuyPrice, maxBuyablePrice, sameItemItr->second.MinBuyPrice, maxChance, config.FactionChance))
+ if (IsBuyableEntry(buyoutPrice, inGameBuyPrice, maxBuyablePrice, minBuyPrice, maxChance, config.FactionChance))
{
if (IsBidableEntry(bidPriceByItem, inGameBuyPrice, maxBidablePrice, minBidPrice, maxChance / 2, config.FactionChance))
{
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 3c33159cf1e..f45d3a071e1 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -892,11 +892,6 @@ void GameObject::DeleteFromDB()
WorldDatabase.Execute(stmt);
}
-GameObject* GameObject::GetGameObject(WorldObject& object, uint64 guid)
-{
- return object.GetMap()->GetGameObject(guid);
-}
-
/*********************************************************/
/*** QUEST SYSTEM ***/
/*********************************************************/
diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h
index f551ab2046c..6807fbf9387 100644
--- a/src/server/game/Entities/GameObject/GameObject.h
+++ b/src/server/game/Entities/GameObject/GameObject.h
@@ -643,7 +643,6 @@ class GameObject : public WorldObject, public GridObject<GameObject>, public Map
bool Create(uint32 guidlow, uint32 name_id, Map* map, uint32 phaseMask, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 animprogress, GOState go_state, uint32 artKit = 0);
void Update(uint32 p_time) override;
- static GameObject* GetGameObject(WorldObject& object, uint64 guid);
GameObjectTemplate const* GetGOInfo() const { return m_goInfo; }
GameObjectData const* GetGOData() const { return m_goData; }
GameObjectValue const* GetGOValue() const { return &m_goValue; }
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 158ff17ea11..0e1e53cfe4c 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -5884,38 +5884,36 @@ float Player::OCTRegenMPPerSpirit()
return regen;
}
-void Player::ApplyRatingMod(CombatRating cr, int32 value, bool apply)
+void Player::ApplyRatingMod(CombatRating combatRating, int32 value, bool apply)
{
- float oldRating = m_baseRatingValue[cr];
- m_baseRatingValue[cr]+=(apply ? value : -value);
+ float oldRating = m_baseRatingValue[combatRating];
+ m_baseRatingValue[combatRating] += (apply ? value : -value);
+
// explicit affected values
- if (cr == CR_HASTE_MELEE || cr == CR_HASTE_RANGED || cr == CR_HASTE_SPELL)
- {
- float const mult = GetRatingMultiplier(cr);
- float const oldVal = oldRating * mult;
- float const newVal = m_baseRatingValue[cr] * mult;
- switch (cr)
- {
- case CR_HASTE_MELEE:
- ApplyAttackTimePercentMod(BASE_ATTACK, oldVal, false);
- ApplyAttackTimePercentMod(OFF_ATTACK, oldVal, false);
- ApplyAttackTimePercentMod(BASE_ATTACK, newVal, true);
- ApplyAttackTimePercentMod(OFF_ATTACK, newVal, true);
- break;
- case CR_HASTE_RANGED:
- ApplyAttackTimePercentMod(RANGED_ATTACK, oldVal, false);
- ApplyAttackTimePercentMod(RANGED_ATTACK, newVal, true);
- break;
- case CR_HASTE_SPELL:
- ApplyCastTimePercentMod(oldVal, false);
- ApplyCastTimePercentMod(newVal, true);
- break;
- default: // shut up compiler warnings
- break;
- }
+ float const multiplier = GetRatingMultiplier(combatRating);
+ float const oldVal = oldRating * multiplier;
+ float const newVal = m_baseRatingValue[combatRating] * multiplier;
+ switch (combatRating)
+ {
+ case CR_HASTE_MELEE:
+ ApplyAttackTimePercentMod(BASE_ATTACK, oldVal, false);
+ ApplyAttackTimePercentMod(OFF_ATTACK, oldVal, false);
+ ApplyAttackTimePercentMod(BASE_ATTACK, newVal, true);
+ ApplyAttackTimePercentMod(OFF_ATTACK, newVal, true);
+ break;
+ case CR_HASTE_RANGED:
+ ApplyAttackTimePercentMod(RANGED_ATTACK, oldVal, false);
+ ApplyAttackTimePercentMod(RANGED_ATTACK, newVal, true);
+ break;
+ case CR_HASTE_SPELL:
+ ApplyCastTimePercentMod(oldVal, false);
+ ApplyCastTimePercentMod(newVal, true);
+ break;
+ default:
+ break;
}
- UpdateRating(cr);
+ UpdateRating(combatRating);
}
void Player::UpdateRating(CombatRating cr)
@@ -26495,13 +26493,13 @@ void Player::SendItemRetrievalMail(uint32 itemEntry, uint32 count)
MailSender sender(MAIL_CREATURE, 34337 /* The Postmaster */);
MailDraft draft("Recovered Item", "We recovered a lost item in the twisting nether and noted that it was yours.$B$BPlease find said object enclosed."); // This is the text used in Cataclysm, it probably wasn't changed.
SQLTransaction trans = CharacterDatabase.BeginTransaction();
-
+
if (Item* item = Item::CreateItem(itemEntry, count, 0))
{
item->SaveToDB(trans);
draft.AddItem(item);
}
-
+
draft.SendMailTo(trans, MailReceiver(this, GetGUIDLow()), sender);
CharacterDatabase.CommitTransaction(trans);
}
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 0bc5c29ab11..7ab843943f8 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -7329,7 +7329,7 @@ void ObjectMgr::DeleteCorpseCellData(uint32 mapid, uint32 cellid, uint32 player_
cell_guids.corpses.erase(player_guid);
}
-void ObjectMgr::LoadQuestRelationsHelper(QuestRelations& map, std::string const& table, bool starter, bool go)
+void ObjectMgr::LoadQuestRelationsHelper(QuestRelations& map, QuestRelationsReverse* reverseMap, std::string const& table, bool starter, bool go)
{
uint32 oldMSTime = getMSTime();
@@ -7362,7 +7362,11 @@ void ObjectMgr::LoadQuestRelationsHelper(QuestRelations& map, std::string const&
}
if (!poolId || !starter)
+ {
map.insert(QuestRelations::value_type(id, quest));
+ if (reverseMap)
+ reverseMap->insert(QuestRelationsReverse::value_type(quest, id));
+ }
else if (starter)
poolRelationMap->insert(PooledQuestRelation::value_type(quest, id));
@@ -7374,7 +7378,7 @@ void ObjectMgr::LoadQuestRelationsHelper(QuestRelations& map, std::string const&
void ObjectMgr::LoadGameobjectQuestStarters()
{
- LoadQuestRelationsHelper(_goQuestRelations, "gameobject_queststarter", true, true);
+ LoadQuestRelationsHelper(_goQuestRelations, nullptr, "gameobject_queststarter", true, true);
for (QuestRelations::iterator itr = _goQuestRelations.begin(); itr != _goQuestRelations.end(); ++itr)
{
@@ -7388,7 +7392,7 @@ void ObjectMgr::LoadGameobjectQuestStarters()
void ObjectMgr::LoadGameobjectQuestEnders()
{
- LoadQuestRelationsHelper(_goQuestInvolvedRelations, "gameobject_questender", false, true);
+ LoadQuestRelationsHelper(_goQuestInvolvedRelations, &_goQuestInvolvedRelationsReverse, "gameobject_questender", false, true);
for (QuestRelations::iterator itr = _goQuestInvolvedRelations.begin(); itr != _goQuestInvolvedRelations.end(); ++itr)
{
@@ -7402,7 +7406,7 @@ void ObjectMgr::LoadGameobjectQuestEnders()
void ObjectMgr::LoadCreatureQuestStarters()
{
- LoadQuestRelationsHelper(_creatureQuestRelations, "creature_queststarter", true, false);
+ LoadQuestRelationsHelper(_creatureQuestRelations, nullptr, "creature_queststarter", true, false);
for (QuestRelations::iterator itr = _creatureQuestRelations.begin(); itr != _creatureQuestRelations.end(); ++itr)
{
@@ -7416,7 +7420,7 @@ void ObjectMgr::LoadCreatureQuestStarters()
void ObjectMgr::LoadCreatureQuestEnders()
{
- LoadQuestRelationsHelper(_creatureQuestInvolvedRelations, "creature_questender", false, false);
+ LoadQuestRelationsHelper(_creatureQuestInvolvedRelations, &_creatureQuestInvolvedRelationsReverse, "creature_questender", false, false);
for (QuestRelations::iterator itr = _creatureQuestInvolvedRelations.begin(); itr != _creatureQuestInvolvedRelations.end(); ++itr)
{
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 56ae4a4c6d1..dc9196dd0df 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -492,8 +492,10 @@ typedef std::unordered_map<int32, TrinityStringLocale> TrinityStringLocaleContai
typedef std::unordered_map<uint32, GossipMenuItemsLocale> GossipMenuItemsLocaleContainer;
typedef std::unordered_map<uint32, PointOfInterestLocale> PointOfInterestLocaleContainer;
-typedef std::multimap<uint32, uint32> QuestRelations;
+typedef std::multimap<uint32, uint32> QuestRelations; // unit/go -> quest
+typedef std::multimap<uint32, uint32> QuestRelationsReverse; // quest -> unit/go
typedef std::pair<QuestRelations::const_iterator, QuestRelations::const_iterator> QuestRelationBounds;
+typedef std::pair<QuestRelationsReverse::const_iterator, QuestRelationsReverse::const_iterator> QuestRelationReverseBounds;
struct PetLevelInfo
{
@@ -930,6 +932,11 @@ class ObjectMgr
return _goQuestInvolvedRelations.equal_range(go_entry);
}
+ QuestRelationReverseBounds GetGOQuestInvolvedRelationReverseBounds(uint32 questId)
+ {
+ return _goQuestInvolvedRelationsReverse.equal_range(questId);
+ }
+
QuestRelations* GetCreatureQuestRelationMap()
{
return &_creatureQuestRelations;
@@ -945,6 +952,11 @@ class ObjectMgr
return _creatureQuestInvolvedRelations.equal_range(creature_entry);
}
+ QuestRelationReverseBounds GetCreatureQuestInvolvedRelationReverseBounds(uint32 questId)
+ {
+ return _creatureQuestInvolvedRelationsReverse.equal_range(questId);
+ }
+
void LoadEventScripts();
void LoadSpellScripts();
void LoadWaypointScripts();
@@ -1347,8 +1359,10 @@ class ObjectMgr
QuestRelations _goQuestRelations;
QuestRelations _goQuestInvolvedRelations;
+ QuestRelationsReverse _goQuestInvolvedRelationsReverse;
QuestRelations _creatureQuestRelations;
QuestRelations _creatureQuestInvolvedRelations;
+ QuestRelationsReverse _creatureQuestInvolvedRelationsReverse;
//character reserved names
typedef std::set<std::wstring> ReservedNamesContainer;
@@ -1373,7 +1387,7 @@ class ObjectMgr
private:
void LoadScripts(ScriptsType type);
void CheckScripts(ScriptsType type, std::set<int32>& ids);
- void LoadQuestRelationsHelper(QuestRelations& map, std::string const& table, bool starter, bool go);
+ void LoadQuestRelationsHelper(QuestRelations& map, QuestRelationsReverse* reverseMap, std::string const& table, bool starter, bool go);
void PlayerCreateInfoAddItemHelper(uint32 race_, uint32 class_, uint32 itemId, int32 count);
MailLevelRewardContainer _mailLevelRewardStore;
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp
index 13f79fb88c5..9cce494a522 100644
--- a/src/server/game/Handlers/SpellHandler.cpp
+++ b/src/server/game/Handlers/SpellHandler.cpp
@@ -33,6 +33,7 @@
#include "GameObjectAI.h"
#include "SpellAuraEffects.h"
#include "Player.h"
+#include "Config.h"
void WorldSession::HandleClientCastFlags(WorldPacket& recvPacket, uint8 castFlags, SpellCastTargets& targets)
{
@@ -436,6 +437,25 @@ void WorldSession::HandleCancelAuraOpcode(WorldPacket& recvPacket)
// maybe should only remove one buff when there are multiple?
_player->RemoveOwnedAura(spellId, 0, 0, AURA_REMOVE_BY_CANCEL);
+
+ // If spell being removed is a resource tracker, see if player was tracking both (herbs / minerals) and remove the other
+ if (sWorld->getBoolConfig(CONFIG_ALLOW_TRACK_BOTH_RESOURCES) && spellInfo->HasAura(SPELL_AURA_TRACK_RESOURCES))
+ {
+ Unit::AuraEffectList const& auraEffects = _player->GetAuraEffectsByType(SPELL_AURA_TRACK_RESOURCES);
+ if (!auraEffects.empty())
+ {
+ // Build list of spell IDs to cancel. Trying to cancel the aura while iterating
+ // over AuraEffectList caused "incompatible iterator" errors on second pass
+ std::list<uint32> spellIDs;
+
+ for (Unit::AuraEffectList::const_iterator auraEffect = auraEffects.begin(); auraEffect != auraEffects.end(); auraEffect++)
+ spellIDs.push_back((*auraEffect)->GetId());
+
+ // Remove all auras related to resource tracking (only Herbs and Minerals in 3.3.5a)
+ for (std::list<uint32>::iterator it = spellIDs.begin(); it != spellIDs.end(); it++)
+ _player->RemoveOwnedAura(*it, 0, 0, AURA_REMOVE_BY_CANCEL);
+ }
+ }
}
void WorldSession::HandlePetCancelAuraOpcode(WorldPacket& recvPacket)
diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp
index adef21fe7a2..6278e66baef 100644
--- a/src/server/game/Instances/InstanceScript.cpp
+++ b/src/server/game/Instances/InstanceScript.cpp
@@ -43,16 +43,6 @@ void InstanceScript::SaveToDB()
CharacterDatabase.Execute(stmt);
}
-void InstanceScript::HandleGameObject(uint64 GUID, bool open, GameObject* go)
-{
- if (!go)
- go = instance->GetGameObject(GUID);
- if (go)
- go->SetGoState(open ? GO_STATE_ACTIVE : GO_STATE_READY);
- else
- TC_LOG_DEBUG("scripts", "InstanceScript: HandleGameObject failed");
-}
-
bool InstanceScript::IsEncounterInProgress() const
{
for (std::vector<BossInfo>::const_iterator itr = bosses.begin(); itr != bosses.end(); ++itr)
@@ -62,6 +52,13 @@ bool InstanceScript::IsEncounterInProgress() const
return false;
}
+void InstanceScript::SetHeaders(std::string const& dataHeaders)
+{
+ for (char header : dataHeaders)
+ if (isalpha(header))
+ headers.push_back(header);
+}
+
void InstanceScript::LoadMinionData(const MinionData* data)
{
while (data->entry)
@@ -232,65 +229,140 @@ bool InstanceScript::SetBossState(uint32 id, EncounterState state)
return false;
}
-std::string InstanceScript::LoadBossState(const char * data)
+void InstanceScript::Load(char const* data)
{
if (!data)
- return NULL;
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
+
+ OUT_LOAD_INST_DATA(data);
+
std::istringstream loadStream(data);
- uint32 buff;
+
+ if (ReadSaveDataHeaders(loadStream))
+ {
+ ReadSaveDataBossStates(loadStream);
+ ReadSaveDataMore(loadStream);
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
+}
+
+bool InstanceScript::ReadSaveDataHeaders(std::istringstream& data)
+{
+ for (char header : headers)
+ {
+ char buff;
+ data >> buff;
+
+ if (header != buff)
+ return false;
+ }
+
+ return true;
+}
+
+void InstanceScript::ReadSaveDataBossStates(std::istringstream& data)
+{
uint32 bossId = 0;
for (std::vector<BossInfo>::iterator i = bosses.begin(); i != bosses.end(); ++i, ++bossId)
{
- loadStream >> buff;
+ uint32 buff;
+ data >> buff;
+ if (buff == IN_PROGRESS || buff == SPECIAL)
+ buff = NOT_STARTED;
+
if (buff < TO_BE_DECIDED)
- SetBossState(bossId, (EncounterState)buff);
+ SetBossState(bossId, EncounterState(buff));
}
- return loadStream.str();
}
-std::string InstanceScript::GetBossSaveData()
+std::string InstanceScript::GetSaveData()
{
+ OUT_SAVE_INST_DATA;
+
std::ostringstream saveStream;
- for (std::vector<BossInfo>::iterator i = bosses.begin(); i != bosses.end(); ++i)
- saveStream << (uint32)i->state << ' ';
+
+ WriteSaveDataHeaders(saveStream);
+ WriteSaveDataBossStates(saveStream);
+ WriteSaveDataMore(saveStream);
+
+ OUT_SAVE_INST_DATA_COMPLETE;
+
return saveStream.str();
}
-void InstanceScript::DoUseDoorOrButton(uint64 uiGuid, uint32 uiWithRestoreTime, bool bUseAlternativeState)
+void InstanceScript::WriteSaveDataHeaders(std::ostringstream& data)
{
- if (!uiGuid)
- return;
+ for (char header : headers)
+ data << header << ' ';
+}
- GameObject* go = instance->GetGameObject(uiGuid);
+void InstanceScript::WriteSaveDataBossStates(std::ostringstream& data)
+{
+ for (BossInfo const& bossInfo : bosses)
+ data << uint32(bossInfo.state) << ' ';
+}
+void InstanceScript::HandleGameObject(uint64 guid, bool open, GameObject* go /*= nullptr*/)
+{
+ if (!go)
+ go = instance->GetGameObject(guid);
if (go)
+ go->SetGoState(open ? GO_STATE_ACTIVE : GO_STATE_READY);
+ else
+ TC_LOG_DEBUG("scripts", "InstanceScript: HandleGameObject failed");
+}
+
+void InstanceScript::DoUseDoorOrButton(uint64 guid, uint32 withRestoreTime /*= 0*/, bool useAlternativeState /*= false*/)
+{
+ if (!guid)
+ return;
+
+ if (GameObject* go = instance->GetGameObject(guid))
{
if (go->GetGoType() == GAMEOBJECT_TYPE_DOOR || go->GetGoType() == GAMEOBJECT_TYPE_BUTTON)
{
if (go->getLootState() == GO_READY)
- go->UseDoorOrButton(uiWithRestoreTime, bUseAlternativeState);
+ go->UseDoorOrButton(withRestoreTime, useAlternativeState);
else if (go->getLootState() == GO_ACTIVATED)
go->ResetDoorOrButton();
}
else
- TC_LOG_ERROR("misc", "SD2: Script call DoUseDoorOrButton, but gameobject entry %u is type %u.", go->GetEntry(), go->GetGoType());
+ TC_LOG_ERROR("scripts", "InstanceScript: DoUseDoorOrButton can't use gameobject entry %u, because type is %u.", go->GetEntry(), go->GetGoType());
}
+ else
+ TC_LOG_DEBUG("scripts", "InstanceScript: HandleGameObject failed");
}
-void InstanceScript::DoRespawnGameObject(uint64 uiGuid, uint32 uiTimeToDespawn)
+void InstanceScript::DoRespawnGameObject(uint64 guid, uint32 timeToDespawn /*= MINUTE*/)
{
- if (GameObject* go = instance->GetGameObject(uiGuid))
+ if (GameObject* go = instance->GetGameObject(guid))
{
- //not expect any of these should ever be handled
- if (go->GetGoType() == GAMEOBJECT_TYPE_FISHINGNODE || go->GetGoType() == GAMEOBJECT_TYPE_DOOR ||
- go->GetGoType() == GAMEOBJECT_TYPE_BUTTON || go->GetGoType() == GAMEOBJECT_TYPE_TRAP)
- return;
+ switch (go->GetGoType())
+ {
+ case GAMEOBJECT_TYPE_DOOR:
+ case GAMEOBJECT_TYPE_BUTTON:
+ case GAMEOBJECT_TYPE_TRAP:
+ case GAMEOBJECT_TYPE_FISHINGNODE:
+ // not expect any of these should ever be handled
+ TC_LOG_ERROR("scripts", "InstanceScript: DoRespawnGameObject can't respawn gameobject entry %u, because type is %u.", go->GetEntry(), go->GetGoType());
+ return;
+ default:
+ break;
+ }
if (go->isSpawned())
return;
- go->SetRespawnTime(uiTimeToDespawn);
+ go->SetRespawnTime(timeToDespawn);
}
+ else
+ TC_LOG_DEBUG("scripts", "InstanceScript: DoRespawnGameObject failed");
}
void InstanceScript::DoUpdateWorldState(uint32 uiStateId, uint32 uiStateData)
diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h
index f379572961c..41f62cfb5f2 100644
--- a/src/server/game/Instances/InstanceScript.h
+++ b/src/server/game/Instances/InstanceScript.h
@@ -137,38 +137,38 @@ class InstanceScript : public ZoneScript
Map* instance;
- //On creation, NOT load.
+ // On creation, NOT load.
virtual void Initialize() { }
- //On load
- virtual void Load(char const* data) { LoadBossState(data); }
+ // On load
+ virtual void Load(char const* data);
- //When save is needed, this function generates the data
- virtual std::string GetSaveData() { return GetBossSaveData(); }
+ // When save is needed, this function generates the data
+ virtual std::string GetSaveData();
void SaveToDB();
virtual void Update(uint32 /*diff*/) { }
- //Used by the map's CanEnter function.
- //This is to prevent players from entering during boss encounters.
+ // Used by the map's CanEnter function.
+ // This is to prevent players from entering during boss encounters.
virtual bool IsEncounterInProgress() const;
- //Called when a player successfully enters the instance.
+ // Called when a player successfully enters the instance.
virtual void OnPlayerEnter(Player* /*player*/) { }
- //Handle open / close objects
- //use HandleGameObject(0, boolen, GO); in OnObjectCreate in instance scripts
- //use HandleGameObject(GUID, boolen, NULL); in any other script
- void HandleGameObject(uint64 guid, bool open, GameObject* go = NULL);
+ // Handle open / close objects
+ // * use HandleGameObject(0, boolen, GO); in OnObjectCreate in instance scripts
+ // * use HandleGameObject(GUID, boolen, NULL); in any other script
+ void HandleGameObject(uint64 guid, bool open, GameObject* go = nullptr);
- //change active state of doors or buttons
+ // Change active state of doors or buttons
void DoUseDoorOrButton(uint64 guid, uint32 withRestoreTime = 0, bool useAlternativeState = false);
- //Respawns a GO having negative spawntimesecs in gameobject-table
+ // Respawns a GO having negative spawntimesecs in gameobject-table
void DoRespawnGameObject(uint64 guid, uint32 timeToDespawn = MINUTE);
- //sends world state update to all players in instance
+ // Sends world state update to all players in instance
void DoUpdateWorldState(uint32 worldstateId, uint32 worldstateValue);
// Send Notify to all players in instance
@@ -215,6 +215,7 @@ class InstanceScript : public ZoneScript
virtual void FillInitialWorldStates(WorldPacket& /*data*/) { }
protected:
+ void SetHeaders(std::string const& dataHeaders);
void SetBossNumber(uint32 number) { bosses.resize(number); }
void LoadDoorData(DoorData const* data);
void LoadMinionData(MinionData const* data);
@@ -225,9 +226,16 @@ class InstanceScript : public ZoneScript
void UpdateDoorState(GameObject* door);
void UpdateMinionState(Creature* minion, EncounterState state);
- std::string LoadBossState(char const* data);
- std::string GetBossSaveData();
+ // Instance Load and Save
+ bool ReadSaveDataHeaders(std::istringstream& data);
+ void ReadSaveDataBossStates(std::istringstream& data);
+ virtual void ReadSaveDataMore(std::istringstream& /*data*/) { }
+ void WriteSaveDataHeaders(std::ostringstream& data);
+ void WriteSaveDataBossStates(std::ostringstream& data);
+ virtual void WriteSaveDataMore(std::ostringstream& /*data*/) { }
+
private:
+ std::vector<char> headers;
std::vector<BossInfo> bosses;
DoorInfoMap doors;
MinionInfoMap minions;
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index 66cae69cb33..eceb0a8e7de 100644
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -404,8 +404,8 @@ enum TrinityStrings
LANG_BANINFO_HISTORYENTRY = 418,
LANG_BANINFO_INFINITE = 419,
LANG_BANINFO_NEVER = 420,
- LANG_BANINFO_YES = 421,
- LANG_BANINFO_NO = 422,
+ LANG_YES = 421,
+ LANG_NO = 422,
LANG_BANINFO_IPENTRY = 423,
LANG_BANLIST_NOIP = 424,
@@ -1014,7 +1014,7 @@ enum TrinityStrings
LANG_BG_AV_START_TWO_MINUTES = 1333,
// FREE IDS 1334-1999
- // Ticket Strings 2000-2029
+ // Ticket Strings 2000-2030
LANG_COMMAND_TICKETNEW = 2000,
LANG_COMMAND_TICKETUPDATED = 2001,
LANG_COMMAND_TICKETPLAYERABANDON = 2002,
@@ -1045,6 +1045,7 @@ enum TrinityStrings
LANG_COMMAND_TICKETPENDING = 2027,
LANG_COMMAND_TICKETRESET = 2028,
LANG_COMMAND_TICKETLISTRESPONSE = 2029,
+ LANG_COMMAND_TICKETCOMPLETED = 2030,
// Trinity strings 5000-9999
LANG_COMMAND_FREEZE = 5000,
@@ -1078,16 +1079,37 @@ enum TrinityStrings
LANG_GOINFO_NAME = 5027,
LANG_GOINFO_LOOTID = 5028,
LANG_COMMAND_LOOKUP_MAX_RESULTS = 5029,
- // unused = 5030,
+ LANG_UNAUTHORIZED = 5030,
LANG_NPCINFO_AIINFO = 5031,
LANG_COMMAND_NO_BATTLEGROUND_FOUND = 5032,
LANG_COMMAND_NO_ACHIEVEMENT_CRITERIA_FOUND = 5033,
LANG_COMMAND_NO_OUTDOOR_PVP_FORUND = 5034,
- // unused = 5035,
+ LANG_NO_REASON = 5035,
LANG_NPCINFO_EQUIPMENT = 5036,
LANG_NPCINFO_MECHANIC_IMMUNE = 5037,
LANG_NPCINFO_UNIT_FIELD_FLAGS = 5038,
- // Room for more Trinity strings 5039-9999
+ LANG_CONSOLE = 5039,
+ LANG_CHARACTER = 5040,
+ LANG_PERMANENTLY = 5041,
+ LANG_GPS_POSITION_OUTDOORS = 5042,
+ LANG_GPS_POSITION_INDOORS = 5043,
+ LANG_GPS_NO_VMAP = 5044,
+
+ // Instance commands
+ LANG_COMMAND_LIST_BIND_INFO = 5045,
+ LANG_COMMAND_LIST_BIND_PLAYER_BINDS = 5046,
+ LANG_COMMAND_LIST_BIND_GROUP_BINDS = 5047,
+ LANG_COMMAND_INST_UNBIND_UNBINDING = 5048,
+ LANG_COMMAND_INST_UNBIND_UNBOUND = 5049,
+ LANG_COMMAND_INST_STAT_LOADED_INST = 5050,
+ LANG_COMMAND_INST_STAT_PLAYERS_IN = 5051,
+ LANG_COMMAND_INST_STAT_SAVES = 5052,
+ LANG_COMMAND_INST_STAT_PLAYERSBOUND = 5053,
+ LANG_COMMAND_INST_STAT_GROUPSBOUND = 5054,
+ LANG_NOT_DUNGEON = 5055, // Map is not a dungeon.
+ LANG_NO_INSTANCE_DATA = 5056, // Map has no instance data.
+
+ // Room for more Trinity strings 5057-9999
// Level requirement notifications
LANG_SAY_REQ = 6604,
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 5309229b0fc..0e6966e6678 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -2586,7 +2586,7 @@ enum CreatureTypeFlags
CREATURE_TYPEFLAGS_DEAD_INTERACT = 0x00000080, // Player can interact with the creature if its dead (not player dead)
CREATURE_TYPEFLAGS_HERBLOOT = 0x00000100, // Can be looted by herbalist
CREATURE_TYPEFLAGS_MININGLOOT = 0x00000200, // Can be looted by miner
- CREATURE_TYPEFLAGS_UNK10 = 0x00000400,
+ CREATURE_TYPEFLAGS_DONT_LOG_DEATH = 0x00000400, // Death event will not show up in combat log
CREATURE_TYPEFLAGS_MOUNTED_COMBAT = 0x00000800, // Creature can remain mounted when entering combat
CREATURE_TYPEFLAGS_AID_PLAYERS = 0x00001000, // ? Can aid any player in combat if in range?
CREATURE_TYPEFLAGS_UNK13 = 0x00002000,
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 07cfa80f297..5bc2c41b6ce 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -35,6 +35,7 @@
#include "ScriptMgr.h"
#include "SpellScript.h"
#include "Vehicle.h"
+#include "Config.h"
AuraApplication::AuraApplication(Unit* target, Unit* caster, Aura* aura, uint8 effMask):
_target(target), _base(aura), _removeMode(AURA_REMOVE_NONE), _slot(MAX_AURAS),
@@ -1785,6 +1786,15 @@ bool Aura::CanStackWith(Aura const* existingAura) const
return true;
}
+ // Check for custom server setting to allow tracking both Herbs and Minerals
+ // Note: The following are client limitations and cannot be coded for:
+ // * The minimap tracking icon will display whichever skill is activated second
+ // * The minimap tracking list will only show a check mark next to the last skill activated
+ // Sometimes this bugs out and doesn't switch the check mark. It has no effect on the actual tracking though.
+ // * The minimap dots are yellow for both resources
+ if (m_spellInfo->HasAura(SPELL_AURA_TRACK_RESOURCES) && existingSpellInfo->HasAura(SPELL_AURA_TRACK_RESOURCES))
+ return sWorld->getBoolConfig(CONFIG_ALLOW_TRACK_BOTH_RESOURCES);
+
// check spell specific stack rules
if (m_spellInfo->IsAuraExclusiveBySpecificWith(existingSpellInfo)
|| (sameCaster && m_spellInfo->IsAuraExclusiveBySpecificPerCasterWith(existingSpellInfo)))
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index de6effb8b14..bb68010ca12 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -6449,7 +6449,7 @@ bool Spell::CheckEffectTarget(Unit const* target, uint32 eff, Position const* lo
// check for ignore LOS on the effect itself
if (m_spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS || DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_spellInfo->Id, NULL, SPELL_DISABLE_LOS))
return true;
-
+
// if spell is triggered, need to check for LOS disable on the aura triggering it and inherit that behaviour
if (IsTriggered() && m_triggeredByAuraSpell && (m_triggeredByAuraSpell->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS || DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_triggeredByAuraSpell->Id, NULL, SPELL_DISABLE_LOS)))
return true;
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 3e835f8dd91..a5355c62f2c 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -85,6 +85,9 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto,
// Black Plague
else if (spellproto->Id == 64155)
return DIMINISHING_NONE;
+ // Screams of the Dead (King Ymiron)
+ else if (spellproto->Id == 51750)
+ return DIMINISHING_NONE;
break;
}
// Event spells
diff --git a/src/server/game/Tickets/TicketMgr.cpp b/src/server/game/Tickets/TicketMgr.cpp
index 71d51153b4c..d1f45ba88bf 100644
--- a/src/server/game/Tickets/TicketMgr.cpp
+++ b/src/server/game/Tickets/TicketMgr.cpp
@@ -179,7 +179,7 @@ std::string GmTicket::FormatMessageString(ChatHandler& handler, bool detailed) c
return ss.str();
}
-std::string GmTicket::FormatMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName) const
+std::string GmTicket::FormatMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName, const char* szCompletedName) const
{
std::stringstream ss;
ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTGUID, _id);
@@ -192,6 +192,8 @@ std::string GmTicket::FormatMessageString(ChatHandler& handler, const char* szCl
ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTUNASSIGNED, szUnassignedName);
if (szDeletedName)
ss << handler.PGetParseString(LANG_COMMAND_TICKETDELETED, szDeletedName);
+ if (szCompletedName)
+ ss << handler.PGetParseString(LANG_COMMAND_TICKETCOMPLETED, szCompletedName);
return ss.str();
}
diff --git a/src/server/game/Tickets/TicketMgr.h b/src/server/game/Tickets/TicketMgr.h
index 5ad44365e7f..8b1c8fbc0f9 100644
--- a/src/server/game/Tickets/TicketMgr.h
+++ b/src/server/game/Tickets/TicketMgr.h
@@ -142,7 +142,7 @@ public:
void TeleportTo(Player* player) const;
std::string FormatMessageString(ChatHandler& handler, bool detailed = false) const;
- std::string FormatMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName) const;
+ std::string FormatMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName, const char* szCompletedName) const;
void SetChatLog(std::list<uint32> time, std::string const& log);
std::string const& GetChatLog() const { return _chatLog; }
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 79dc565487d..5c65055f3c0 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1169,6 +1169,7 @@ void World::LoadConfigSettings(bool reload)
if (m_int_configs[CONFIG_PVP_TOKEN_COUNT] < 1)
m_int_configs[CONFIG_PVP_TOKEN_COUNT] = 1;
+ m_bool_configs[CONFIG_ALLOW_TRACK_BOTH_RESOURCES] = sConfigMgr->GetBoolDefault("AllowTrackBothResources", false);
m_bool_configs[CONFIG_NO_RESET_TALENT_COST] = sConfigMgr->GetBoolDefault("NoResetTalentsCost", false);
m_bool_configs[CONFIG_SHOW_KICK_IN_WORLD] = sConfigMgr->GetBoolDefault("ShowKickInWorld", false);
m_bool_configs[CONFIG_SHOW_MUTE_IN_WORLD] = sConfigMgr->GetBoolDefault("ShowMuteInWorld", false);
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 8a36a0af71a..05bfcc21462 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -156,6 +156,7 @@ enum WorldBoolConfigs
CONFIG_STATS_LIMITS_ENABLE,
CONFIG_INSTANCES_RESET_ANNOUNCE,
CONFIG_IP_BASED_ACTION_LOGGING,
+ CONFIG_ALLOW_TRACK_BOTH_RESOURCES,
BOOL_CONFIG_VALUE_COUNT
};
diff --git a/src/server/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp
index a90bbd69e24..6143a4ca344 100644
--- a/src/server/scripts/Commands/cs_ban.cpp
+++ b/src/server/scripts/Commands/cs_ban.cpp
@@ -287,7 +287,7 @@ public:
bool permanent = (fields[1].GetUInt64() == uint64(0));
std::string banTime = permanent ? handler->GetTrinityString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[1].GetUInt64(), true);
handler->PSendSysMessage(LANG_BANINFO_HISTORYENTRY,
- fields[0].GetCString(), banTime.c_str(), active ? handler->GetTrinityString(LANG_BANINFO_YES) : handler->GetTrinityString(LANG_BANINFO_NO), fields[4].GetCString(), fields[5].GetCString());
+ fields[0].GetCString(), banTime.c_str(), active ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO), fields[4].GetCString(), fields[5].GetCString());
}
while (result->NextRow());
@@ -340,7 +340,7 @@ public:
bool permanent = (fields[1].GetUInt32() == uint32(0));
std::string banTime = permanent ? handler->GetTrinityString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[1].GetUInt32(), true);
handler->PSendSysMessage(LANG_BANINFO_HISTORYENTRY,
- fields[0].GetCString(), banTime.c_str(), active ? handler->GetTrinityString(LANG_BANINFO_YES) : handler->GetTrinityString(LANG_BANINFO_NO), fields[4].GetCString(), fields[5].GetCString());
+ fields[0].GetCString(), banTime.c_str(), active ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO), fields[4].GetCString(), fields[5].GetCString());
}
while (result->NextRow());
diff --git a/src/server/scripts/Commands/cs_instance.cpp b/src/server/scripts/Commands/cs_instance.cpp
index b8d69c250bb..464d58ad908 100644
--- a/src/server/scripts/Commands/cs_instance.cpp
+++ b/src/server/scripts/Commands/cs_instance.cpp
@@ -29,6 +29,7 @@ EndScriptData */
#include "InstanceScript.h"
#include "MapManager.h"
#include "Player.h"
+#include "Language.h"
class instance_commandscript : public CommandScript
{
@@ -81,11 +82,11 @@ public:
{
InstanceSave* save = itr->second.save;
std::string timeleft = GetTimeString(save->GetResetTime() - time(NULL));
- handler->PSendSysMessage("map: %d inst: %d perm: %s diff: %d canReset: %s TTR: %s", itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str());
+ handler->PSendSysMessage(LANG_COMMAND_LIST_BIND_INFO, itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str());
counter++;
}
}
- handler->PSendSysMessage("player binds: %d", counter);
+ handler->PSendSysMessage(LANG_COMMAND_LIST_BIND_PLAYER_BINDS, counter);
counter = 0;
if (Group* group = player->GetGroup())
@@ -97,12 +98,12 @@ public:
{
InstanceSave* save = itr->second.save;
std::string timeleft = GetTimeString(save->GetResetTime() - time(NULL));
- handler->PSendSysMessage("map: %d inst: %d perm: %s diff: %d canReset: %s TTR: %s", itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str());
+ handler->PSendSysMessage(LANG_COMMAND_LIST_BIND_INFO, itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str());
counter++;
}
}
}
- handler->PSendSysMessage("group binds: %d", counter);
+ handler->PSendSysMessage(LANG_COMMAND_LIST_BIND_GROUP_BINDS, counter);
return true;
}
@@ -140,7 +141,7 @@ public:
if (itr->first != player->GetMapId() && (!MapId || MapId == itr->first) && (diff == -1 || diff == save->GetDifficulty()))
{
std::string timeleft = GetTimeString(save->GetResetTime() - time(NULL));
- handler->PSendSysMessage("unbinding map: %d inst: %d perm: %s diff: %d canReset: %s TTR: %s", itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str());
+ handler->PSendSysMessage(LANG_COMMAND_INST_UNBIND_UNBINDING, itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str());
player->UnbindInstance(itr, Difficulty(i));
counter++;
}
@@ -148,18 +149,18 @@ public:
++itr;
}
}
- handler->PSendSysMessage("instances unbound: %d", counter);
+ handler->PSendSysMessage(LANG_COMMAND_INST_UNBIND_UNBOUND, counter);
return true;
}
static bool HandleInstanceStatsCommand(ChatHandler* handler, char const* /*args*/)
{
- handler->PSendSysMessage("instances loaded: %d", sMapMgr->GetNumInstances());
- handler->PSendSysMessage("players in instances: %d", sMapMgr->GetNumPlayersInInstances());
- handler->PSendSysMessage("instance saves: %d", sInstanceSaveMgr->GetNumInstanceSaves());
- handler->PSendSysMessage("players bound: %d", sInstanceSaveMgr->GetNumBoundPlayersTotal());
- handler->PSendSysMessage("groups bound: %d", sInstanceSaveMgr->GetNumBoundGroupsTotal());
+ handler->PSendSysMessage(LANG_COMMAND_INST_STAT_LOADED_INST, sMapMgr->GetNumInstances());
+ handler->PSendSysMessage(LANG_COMMAND_INST_STAT_PLAYERS_IN, sMapMgr->GetNumPlayersInInstances());
+ handler->PSendSysMessage(LANG_COMMAND_INST_STAT_SAVES, sInstanceSaveMgr->GetNumInstanceSaves());
+ handler->PSendSysMessage(LANG_COMMAND_INST_STAT_PLAYERSBOUND, sInstanceSaveMgr->GetNumBoundPlayersTotal());
+ handler->PSendSysMessage(LANG_COMMAND_INST_STAT_GROUPSBOUND, sInstanceSaveMgr->GetNumBoundGroupsTotal());
return true;
}
@@ -170,14 +171,14 @@ public:
Map* map = player->GetMap();
if (!map->IsDungeon())
{
- handler->PSendSysMessage("Map is not a dungeon.");
+ handler->PSendSysMessage(LANG_NOT_DUNGEON);
handler->SetSentErrorMessage(true);
return false;
}
if (!((InstanceMap*)map)->GetInstanceScript())
{
- handler->PSendSysMessage("Map has no instance data.");
+ handler->PSendSysMessage(LANG_NO_INSTANCE_DATA);
handler->SetSentErrorMessage(true);
return false;
}
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 9cb7173556a..80b7710cd21 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -192,17 +192,17 @@ public:
if (haveVMap)
{
if (map->IsOutdoors(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ()))
- handler->PSendSysMessage("You are outdoors");
+ handler->PSendSysMessage(LANG_GPS_POSITION_OUTDOORS);
else
- handler->PSendSysMessage("You are indoors");
+ handler->PSendSysMessage(LANG_GPS_POSITION_INDOORS);
}
else
- handler->PSendSysMessage("no VMAP available for area info");
+ handler->PSendSysMessage(LANG_GPS_NO_VMAP);
handler->PSendSysMessage(LANG_MAP_POSITION,
- mapId, (mapEntry ? mapEntry->name[handler->GetSessionDbcLocale()] : "<unknown>"),
- zoneId, (zoneEntry ? zoneEntry->area_name[handler->GetSessionDbcLocale()] : "<unknown>"),
- areaId, (areaEntry ? areaEntry->area_name[handler->GetSessionDbcLocale()] : "<unknown>"),
+ mapId, (mapEntry ? mapEntry->name[handler->GetSessionDbcLocale()] : handler->GetTrinityString(LANG_UNKNOWN)),
+ zoneId, (zoneEntry ? zoneEntry->area_name[handler->GetSessionDbcLocale()] : handler->GetTrinityString(LANG_UNKNOWN)),
+ areaId, (areaEntry ? areaEntry->area_name[handler->GetSessionDbcLocale()] : handler->GetTrinityString(LANG_UNKNOWN)),
object->GetPhaseMask(),
object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(),
cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(),
@@ -808,7 +808,7 @@ public:
if (handler->HasLowerSecurity(target, 0))
return false;
- std::string kickReasonStr = "No reason";
+ std::string kickReasonStr = handler->GetTrinityString(LANG_NO_REASON);
if (*args != '\0')
{
char const* kickReason = strtok(NULL, "\r");
@@ -1441,22 +1441,22 @@ public:
std::string lastLogin = handler->GetTrinityString(LANG_ERROR);
uint32 failedLogins = 0;
uint32 latency = 0;
- std::string OS = "None";
+ std::string OS = handler->GetTrinityString(LANG_UNKNOWN);
// Mute data print variables
int64 muteTime = -1;
- std::string muteReason = "unknown";
- std::string muteBy = "unknown";
+ std::string muteReason = handler->GetTrinityString(LANG_NO_REASON);
+ std::string muteBy = handler->GetTrinityString(LANG_UNKNOWN);
// Ban data print variables
int64 banTime = -1;
- std::string banType = "None";
- std::string banReason = "Unknown";
- std::string bannedBy = "Unknown";
+ std::string banType = handler->GetTrinityString(LANG_UNKNOWN);
+ std::string banReason = handler->GetTrinityString(LANG_NO_REASON);
+ std::string bannedBy = handler->GetTrinityString(LANG_UNKNOWN);
// Character data print variables
uint8 raceid, classid = 0; //RACE_NONE, CLASS_NONE
- std::string raceStr, classStr = "None";
+ std::string raceStr, classStr = handler->GetTrinityString(LANG_UNKNOWN);
uint8 gender = 0;
int8 locale = handler->GetSessionDbcLocale();
uint32 totalPlayerTime = 0;
@@ -1470,8 +1470,8 @@ public:
uint32 mapId;
uint32 areaId;
uint32 phase = 0;
- std::string areaName = "<unknown>";
- std::string zoneName = "<unknown>";
+ std::string areaName = handler->GetTrinityString(LANG_UNKNOWN);
+ std::string zoneName = handler->GetTrinityString(LANG_UNKNOWN);
// Guild data print variables defined so that they exist, but are not necessarily used
uint32 guildId = 0;
@@ -1499,7 +1499,7 @@ public:
muteTime = target->GetSession()->m_muteTime;
mapId = target->GetMapId();
areaId = target->GetAreaId();
- alive = target->IsAlive() ? "Yes" : "No";
+ alive = target->IsAlive() ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO);
gender = target->getGender();
phase = target->GetPhaseMask();
}
@@ -1532,9 +1532,9 @@ public:
uint32 playerFlags = fields[10].GetUInt32();
if (!health || playerFlags & PLAYER_FLAGS_GHOST)
- alive = "No";
+ alive = handler->GetTrinityString(LANG_NO);
else
- alive = "Yes";
+ alive = handler->GetTrinityString(LANG_YES);
}
// Query the prepared statement for login data
@@ -1574,9 +1574,10 @@ public:
}
else
{
- eMail = "Unauthorized";
- lastIp = "Unauthorized";
- lastLogin = "Unauthorized";
+ eMail = handler->GetTrinityString(LANG_UNAUTHORIZED);
+ regMail = handler->GetTrinityString(LANG_UNAUTHORIZED);
+ lastIp = handler->GetTrinityString(LANG_UNAUTHORIZED);
+ lastLogin = handler->GetTrinityString(LANG_UNAUTHORIZED);
}
muteTime = fields[6].GetUInt64();
muteReason = fields[7].GetString();
@@ -1595,7 +1596,7 @@ public:
PreparedQueryResult result2 = LoginDatabase.Query(stmt2);
if (!result2)
{
- banType = "Character";
+ banType = handler->GetTrinityString(LANG_CHARACTER);
stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_BANS);
stmt->setUInt32(0, lowguid);
result2 = CharacterDatabase.Query(stmt);
@@ -1652,7 +1653,7 @@ public:
// Output III. LANG_PINFO_BANNED if ban exists and is applied
if (banTime >= 0)
- handler->PSendSysMessage(LANG_PINFO_BANNED, banType.c_str(), banReason.c_str(), banTime > 0 ? secsToTimeString(banTime - time(NULL), true).c_str() : "permanently", bannedBy.c_str());
+ handler->PSendSysMessage(LANG_PINFO_BANNED, banType.c_str(), banReason.c_str(), banTime > 0 ? secsToTimeString(banTime - time(NULL), true).c_str() : handler->GetTrinityString(LANG_PERMANENTLY), bannedBy.c_str());
// Output IV. LANG_PINFO_MUTED if mute is applied
if (muteTime > 0)
@@ -1671,7 +1672,7 @@ public:
handler->PSendSysMessage(LANG_PINFO_ACC_REGMAILS, regMail.c_str(), eMail.c_str());
// Output IX. LANG_PINFO_ACC_IP
- handler->PSendSysMessage(LANG_PINFO_ACC_IP, lastIp.c_str(), locked ? "Yes" : "No");
+ handler->PSendSysMessage(LANG_PINFO_ACC_IP, lastIp.c_str(), locked ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO));
// Output X. LANG_PINFO_CHR_LEVEL
if (level != sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
@@ -1710,7 +1711,7 @@ public:
}
if (target)
- handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->name[locale], (!zoneName.empty() ? zoneName.c_str() : "<Unknown>"), (!areaName.empty() ? areaName.c_str() : "<Unknown>"));
+ handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->name[locale], (!zoneName.empty() ? zoneName.c_str() : handler->GetTrinityString(LANG_UNKNOWN)), (!areaName.empty() ? areaName.c_str() : handler->GetTrinityString(LANG_UNKNOWN)));
// Output XVII. - XVIX. if they are not empty
if (!guildName.empty())
@@ -1790,7 +1791,7 @@ public:
return false;
char const* muteReason = strtok(NULL, "\r");
- std::string muteReasonStr = "No reason";
+ std::string muteReasonStr = handler->GetTrinityString(LANG_NO_REASON);
if (muteReason != NULL)
muteReasonStr = muteReason;
@@ -1818,7 +1819,7 @@ public:
if (handler->GetSession())
muteBy = handler->GetSession()->GetPlayerName();
else
- muteBy = "Console";
+ muteBy = handler->GetTrinityString(LANG_CONSOLE);
if (target)
{
diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp
index 14a68d1fdae..74a947e42e4 100644
--- a/src/server/scripts/Commands/cs_server.cpp
+++ b/src/server/scripts/Commands/cs_server.cpp
@@ -288,7 +288,7 @@ public:
return false;
sWorld->SetRecordDiffInterval(newTime);
- printf("Record diff every %u ms\n", newTime);
+ printf("Record diff every %i ms\n", newTime);
return true;
}
@@ -316,6 +316,9 @@ private:
if (!*args)
return false;
+ if (strlen(args) > 255)
+ return false;
+
// #delay [#exit_code] [reason]
char* delayStr = strtok((char*)args, " ");
if (!delayStr || !isNumeric(delayStr))
@@ -323,10 +326,7 @@ private:
char* exitCodeStr = nullptr;
- if (strlen(args) > 255)
- return false;
-
- char reason[255] = { 0 };
+ char reason[256] = { 0 };
while (char* nextToken = strtok(nullptr, " "))
{
@@ -335,8 +335,11 @@ private:
else
{
strcat(reason, nextToken);
- strcat(reason, " ");
- strcat(reason, strtok(nullptr, "\0"));
+ if (char* remainingTokens = strtok(nullptr, "\0"))
+ {
+ strcat(reason, " ");
+ strcat(reason, remainingTokens);
+ }
break;
}
}
diff --git a/src/server/scripts/Commands/cs_ticket.cpp b/src/server/scripts/Commands/cs_ticket.cpp
index a2f1c75106b..cbf0ae51a82 100644
--- a/src/server/scripts/Commands/cs_ticket.cpp
+++ b/src/server/scripts/Commands/cs_ticket.cpp
@@ -126,7 +126,7 @@ public:
ticket->SaveToDB(trans);
sTicketMgr->UpdateLastChange();
- std::string msg = ticket->FormatMessageString(*handler, NULL, target.c_str(), NULL, NULL);
+ std::string msg = ticket->FormatMessageString(*handler, NULL, target.c_str(), NULL, NULL, NULL);
handler->SendGlobalGMSysMessage(msg.c_str());
return true;
}
@@ -156,7 +156,7 @@ public:
sTicketMgr->CloseTicket(ticket->GetId(), player ? player->GetGUID() : -1);
sTicketMgr->UpdateLastChange();
- std::string msg = ticket->FormatMessageString(*handler, player ? player->GetName().c_str() : "Console", NULL, NULL, NULL);
+ std::string msg = ticket->FormatMessageString(*handler, player ? player->GetName().c_str() : "Console", NULL, NULL, NULL, NULL);
handler->SendGlobalGMSysMessage(msg.c_str());
// Inform player, who submitted this ticket, that it is closed
@@ -205,7 +205,7 @@ public:
ticket->SaveToDB(trans);
sTicketMgr->UpdateLastChange();
- std::string msg = ticket->FormatMessageString(*handler, NULL, ticket->GetAssignedToName().c_str(), NULL, NULL);
+ std::string msg = ticket->FormatMessageString(*handler, NULL, ticket->GetAssignedToName().c_str(), NULL, NULL, NULL);
msg += handler->PGetParseString(LANG_COMMAND_TICKETLISTADDCOMMENT, player ? player->GetName().c_str() : "Console", comment);
handler->SendGlobalGMSysMessage(msg.c_str());
@@ -239,6 +239,9 @@ public:
ticket->SetCompleted();
ticket->SaveToDB(trans);
+ std::string msg = ticket->FormatMessageString(*handler, NULL, NULL,
+ NULL, NULL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console");
+ handler->SendGlobalGMSysMessage(msg.c_str());
sTicketMgr->UpdateLastChange();
return true;
}
@@ -262,7 +265,7 @@ public:
return true;
}
- std::string msg = ticket->FormatMessageString(*handler, NULL, NULL, NULL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console");
+ std::string msg = ticket->FormatMessageString(*handler, NULL, NULL, NULL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", NULL);
handler->SendGlobalGMSysMessage(msg.c_str());
sTicketMgr->RemoveTicket(ticket->GetId());
@@ -394,7 +397,7 @@ public:
sTicketMgr->UpdateLastChange();
std::string msg = ticket->FormatMessageString(*handler, NULL, assignedTo.c_str(),
- handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", NULL);
+ handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", NULL, NULL);
handler->SendGlobalGMSysMessage(msg.c_str());
return true;
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
index 8bc969e9020..ca46ff36079 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
@@ -23,19 +23,16 @@ enum Spells
SPELL_ARCANE_EXPLOSION = 46608,
SPELL_CONE_OF_COLD = 38384,
SPELL_FIREBALL = 46988,
- SPELL_FROSTBOLT = 46987
+ SPELL_FROSTBOLT = 46987,
+ SPELL_SUMMON_WATER_ELEMENTAL = 45067,
+ SPELL_ICEBLOCK = 46604
};
-enum Yells
+enum Texts
{
- YELL_AGGRO = 0,
- YELL_EVADE = 1,
- YELL_SALVATION = 2,
-};
-
-enum Creatures
-{
- NPC_WATER_ELEMENTAL = 25040
+ SAY_AGGRO = 0,
+ SAY_EVADE = 1,
+ SAY_SALVATION = 2,
};
enum Action
@@ -43,64 +40,15 @@ enum Action
ACTION_BUFF_YELL = -30001 // shared from Battleground
};
-enum WaterElementalSpells
+enum Events
{
- SPELL_WATERBOLT = 46983
-};
-
-class npc_water_elemental : public CreatureScript
-{
-public:
- npc_water_elemental() : CreatureScript("npc_water_elemental") { }
-
- struct npc_water_elementalAI : public ScriptedAI
- {
- npc_water_elementalAI(Creature* creature) : ScriptedAI(creature)
- {
- waterBoltTimer = 3 * IN_MILLISECONDS;
- resetTimer = 5 * IN_MILLISECONDS;
- balindaGUID = 0;
- }
-
- uint32 waterBoltTimer;
- uint64 balindaGUID;
- uint32 resetTimer;
-
- void Reset() override
- {
- waterBoltTimer = 3 * IN_MILLISECONDS;
- resetTimer = 5 * IN_MILLISECONDS;
- balindaGUID = 0;
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- if (waterBoltTimer < diff)
- {
- DoCastVictim(SPELL_WATERBOLT);
- waterBoltTimer = 5 * IN_MILLISECONDS;
- } else waterBoltTimer -= diff;
-
- // check if creature is not outside of building
- if (resetTimer < diff)
- {
- if (Creature* pBalinda = ObjectAccessor::GetCreature(*me, balindaGUID))
- if (me->GetDistance2d(pBalinda->GetHomePosition().GetPositionX(), pBalinda->GetHomePosition().GetPositionY()) > 50)
- EnterEvadeMode();
- resetTimer = 5 * IN_MILLISECONDS;
- } else resetTimer -= diff;
-
- DoMeleeAttackIfReady();
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_water_elementalAI(creature);
- }
+ // Balinda
+ EVENT_ARCANE_EXPLOSION = 1,
+ EVENT_CONE_OF_COLD,
+ EVENT_FIREBOLT,
+ EVENT_FROSTBOLT,
+ EVENT_SUMMON_WATER_ELEMENTAL,
+ EVENT_CHECK_RESET, // Checks if Balinda or the Water Elemental are outside of building.
};
class boss_balinda : public CreatureScript
@@ -117,23 +65,10 @@ public:
void Initialize()
{
- arcaneExplosionTimer = urand(5 * IN_MILLISECONDS, 15 * IN_MILLISECONDS);
- coneOfColdTimer = 8 * IN_MILLISECONDS;
- fireBoltTimer = 1 * IN_MILLISECONDS;
- frostboltTimer = 4 * IN_MILLISECONDS;
- resetTimer = 5 * IN_MILLISECONDS;
- waterElementalTimer = 0;
+ WaterElementalGUID = 0;
+ HasCastIceblock = false;
}
- uint32 arcaneExplosionTimer;
- uint32 coneOfColdTimer;
- uint32 fireBoltTimer;
- uint32 frostboltTimer;
- uint32 resetTimer;
- uint32 waterElementalTimer;
-
- SummonList summons;
-
void Reset() override
{
Initialize();
@@ -143,22 +78,28 @@ public:
void EnterCombat(Unit* /*who*/) override
{
- Talk(YELL_AGGRO);
- }
-
- void JustRespawned() override
- {
- Reset();
+ Talk(SAY_AGGRO);
+ events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(5 * IN_MILLISECONDS, 15 * IN_MILLISECONDS));
+ events.ScheduleEvent(EVENT_CONE_OF_COLD, 8 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_FIREBOLT, 1 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_FROSTBOLT, 4 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SUMMON_WATER_ELEMENTAL, 3 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_CHECK_RESET, 5 * IN_MILLISECONDS);
}
void JustSummoned(Creature* summoned) override
{
- ENSURE_AI(npc_water_elemental::npc_water_elementalAI, summoned->AI())->balindaGUID = me->GetGUID();
summoned->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true));
summoned->setFaction(me->getFaction());
+ WaterElementalGUID = summoned->GetGUID();
summons.Summon(summoned);
}
+ void SummonedCreatureDespawn(Creature* summoned) override
+ {
+ summons.Despawn(summoned);
+ }
+
void JustDied(Unit* /*killer*/) override
{
summons.DespawnAll();
@@ -167,7 +108,16 @@ public:
void DoAction(int32 actionId) override
{
if (actionId == ACTION_BUFF_YELL)
- Talk(YELL_AGGRO);
+ Talk(SAY_AGGRO);
+ }
+
+ void DamageTaken(Unit* /*attacker*/, uint32& damage) override
+ {
+ if (me->HealthBelowPctDamaged(40, damage) && !HasCastIceblock)
+ {
+ DoCast(SPELL_ICEBLOCK);
+ HasCastIceblock = true;
+ }
}
void UpdateAI(uint32 diff) override
@@ -175,50 +125,60 @@ public:
if (!UpdateVictim())
return;
- if (waterElementalTimer < diff)
- {
- if (summons.empty())
- me->SummonCreature(NPC_WATER_ELEMENTAL, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45 * IN_MILLISECONDS);
- waterElementalTimer = 50 * IN_MILLISECONDS;
- } else waterElementalTimer -= diff;
-
- if (arcaneExplosionTimer < diff)
- {
- DoCastVictim(SPELL_ARCANE_EXPLOSION);
- arcaneExplosionTimer = urand(5 * IN_MILLISECONDS, 15 * IN_MILLISECONDS);
- } else arcaneExplosionTimer -= diff;
-
- if (coneOfColdTimer < diff)
- {
- DoCastVictim(SPELL_CONE_OF_COLD);
- coneOfColdTimer = urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
- } else coneOfColdTimer -= diff;
-
- if (fireBoltTimer < diff)
- {
- DoCastVictim(SPELL_FIREBALL);
- fireBoltTimer = urand(5 * IN_MILLISECONDS, 9 * IN_MILLISECONDS);
- } else fireBoltTimer -= diff;
+ events.Update(diff);
- if (frostboltTimer < diff)
- {
- DoCastVictim(SPELL_FROSTBOLT);
- frostboltTimer = urand(4 * IN_MILLISECONDS, 12 * IN_MILLISECONDS);
- } else frostboltTimer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- // check if creature is not outside of building
- if (resetTimer < diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 50)
+ switch (eventId)
{
- EnterEvadeMode();
- Talk(YELL_EVADE);
+ case EVENT_ARCANE_EXPLOSION:
+ DoCastVictim(SPELL_ARCANE_EXPLOSION);
+ events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(5 * IN_MILLISECONDS, 15 * IN_MILLISECONDS));
+ break;
+ case EVENT_CONE_OF_COLD:
+ DoCastVictim(SPELL_CONE_OF_COLD);
+ events.ScheduleEvent(EVENT_CONE_OF_COLD, urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS));
+ break;
+ case EVENT_FIREBOLT:
+ DoCastVictim(SPELL_FIREBALL);
+ events.ScheduleEvent(EVENT_FIREBOLT, urand(5 * IN_MILLISECONDS, 9 * IN_MILLISECONDS));
+ break;
+ case EVENT_FROSTBOLT:
+ DoCastVictim(SPELL_FROSTBOLT);
+ events.ScheduleEvent(EVENT_FROSTBOLT, urand(4 * IN_MILLISECONDS, 12 * IN_MILLISECONDS));
+ break;
+ case EVENT_SUMMON_WATER_ELEMENTAL:
+ if (summons.empty())
+ DoCast(SPELL_SUMMON_WATER_ELEMENTAL);
+ events.ScheduleEvent(EVENT_SUMMON_WATER_ELEMENTAL, 50 * IN_MILLISECONDS);
+ break;
+ case EVENT_CHECK_RESET:
+ if (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 50)
+ {
+ EnterEvadeMode();
+ Talk(SAY_EVADE);
+ }
+ if (Creature* elemental = ObjectAccessor::GetCreature(*me, WaterElementalGUID))
+ if (elemental->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 50)
+ elemental->AI()->EnterEvadeMode();
+ events.ScheduleEvent(EVENT_CHECK_RESET, 5 * IN_MILLISECONDS);
+ break;
+ default:
+ break;
}
- resetTimer = 5 * IN_MILLISECONDS;
- } else resetTimer -= diff;
+ }
DoMeleeAttackIfReady();
}
+
+ private:
+ EventMap events;
+ SummonList summons;
+ uint64 WaterElementalGUID;
+ bool HasCastIceblock;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -230,5 +190,4 @@ public:
void AddSC_boss_balinda()
{
new boss_balinda;
- new npc_water_elemental;
}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h
index ea3fd59490a..160c80fc4d1 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h
@@ -19,6 +19,8 @@
#ifndef DEF_BRD_H
#define DEF_BRD_H
+#define DataHeader "BRD"
+
enum FactionIds
{
FACTION_NEUTRAL = 734,
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp
index f51a2a95c81..67219a2990a 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp
@@ -117,6 +117,7 @@ public:
void Initialize() override
{
+ SetHeaders(DataHeader);
memset(&encounter, 0, sizeof(encounter));
EmperorGUID = 0;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h
index 2199e52129c..be8149fbdcc 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h
@@ -21,6 +21,7 @@
uint32 const EncounterCount = 23;
#define BRSScriptName "instance_blackrock_spire"
+#define DataHeader "BRS"
enum DataTypes
{
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
index 555eac21c43..e95fb8da42e 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
@@ -15,15 +15,14 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "ObjectMgr.h"
-#include "ScriptMgr.h"
-#include "ObjectDefines.h"
#include "Cell.h"
#include "CellImpl.h"
#include "GridNotifiers.h"
#include "GridNotifiersImpl.h"
#include "InstanceScript.h"
+#include "Player.h"
#include "ScriptedCreature.h"
+#include "ScriptMgr.h"
#include "blackrock_spire.h"
//uint32 const DragonspireRunes[7] = { GO_HALL_RUNE_1, GO_HALL_RUNE_2, GO_HALL_RUNE_3, GO_HALL_RUNE_4, GO_HALL_RUNE_5, GO_HALL_RUNE_6, GO_HALL_RUNE_7 };
@@ -51,6 +50,7 @@ public:
{
instance_blackrock_spireMapScript(InstanceMap* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
HighlordOmokk = 0;
ShadowHunterVoshgajin = 0;
@@ -502,50 +502,6 @@ public:
}
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "B S " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* strIn) override
- {
- if (!strIn)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
-
- OUT_LOAD_INST_DATA(strIn);
-
- char dataHead1, dataHead2;
-
- std::istringstream loadStream(strIn);
- loadStream >> dataHead1 >> dataHead2;
-
- if (dataHead1 == 'B' && dataHead2 == 'S')
- {
- for (uint8 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
-
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
protected:
EventMap Events;
uint64 HighlordOmokk;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h
index e07d1d987fc..1cf89a263ce 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h
@@ -21,6 +21,7 @@
uint32 const EncounterCount = 8;
#define BRLScriptName "instance_blackwing_lair"
+#define DataHeader "BWL"
enum BWLEncounter
{
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp
index 1a97f668558..9a6d0e9c224 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp
@@ -75,6 +75,9 @@ public:
{
Initialize();
+ Breath1_Spell = 0;
+ Breath2_Spell = 0;
+
// Select the 2 breaths that we are going to use until despawned
// 5 possiblities for the first breath, 4 for the second, 20 total possiblites
// This way we don't end up casting 2 of the same breath
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp
index be8bc34acf1..ae52e281c9d 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp
@@ -56,6 +56,7 @@ public:
{
instance_blackwing_lair_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
// Razorgore
EggCount = 0;
EggEvent = 0;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp
index 7dee91bfb6f..800b6bb0edc 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 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,19 +15,10 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Instance_Molten_Core
-SD%Complete: 0
-SDComment: Place Holder
-SDCategory: Molten Core
-EndScriptData */
-
-#include "ObjectMgr.h"
-#include "ScriptMgr.h"
#include "InstanceScript.h"
-#include "CreatureAI.h"
+#include "ScriptedCreature.h"
+#include "ScriptMgr.h"
#include "molten_core.h"
-#include "TemporarySummon.h"
Position const SummonPositions[10] =
{
@@ -53,30 +43,19 @@ class instance_molten_core : public InstanceMapScript
{
instance_molten_core_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(MAX_ENCOUNTER);
_golemaggTheIncineratorGUID = 0;
_majordomoExecutusGUID = 0;
_cacheOfTheFirelordGUID = 0;
- _executusSchedule = NULL;
- _deadBossCount = 0;
+ _executusSchedule = false;
_ragnarosAddDeaths = 0;
- _isLoading = false;
- _summonedExecutus = false;
}
- ~instance_molten_core_InstanceMapScript()
- {
- delete _executusSchedule;
- }
-
- void OnPlayerEnter(Player* /*player*/)
+ void OnPlayerEnter(Player* /*player*/) override
{
if (_executusSchedule)
- {
- SummonMajordomoExecutus(*_executusSchedule);
- delete _executusSchedule;
- _executusSchedule = NULL;
- }
+ SummonMajordomoExecutus();
}
void OnCreatureCreate(Creature* creature) override
@@ -141,19 +120,14 @@ class instance_molten_core : public InstanceMapScript
return 0;
}
- bool SetBossState(uint32 bossId, EncounterState state)
+ bool SetBossState(uint32 bossId, EncounterState state) override
{
if (!InstanceScript::SetBossState(bossId, state))
return false;
if (state == DONE && bossId < BOSS_MAJORDOMO_EXECUTUS)
- ++_deadBossCount;
-
- if (_isLoading)
- return true;
-
- if (_deadBossCount == 8)
- SummonMajordomoExecutus(false);
+ if (CheckMajordomoExecutus())
+ SummonMajordomoExecutus();
if (bossId == BOSS_MAJORDOMO_EXECUTUS && state == DONE)
DoRespawnGameObject(_cacheOfTheFirelordGUID, 7 * DAY);
@@ -161,13 +135,13 @@ class instance_molten_core : public InstanceMapScript
return true;
}
- void SummonMajordomoExecutus(bool done)
+ void SummonMajordomoExecutus()
{
- if (_summonedExecutus)
+ _executusSchedule = false;
+ if (_majordomoExecutusGUID)
return;
- _summonedExecutus = true;
- if (!done)
+ if (GetBossState(BOSS_MAJORDOMO_EXECUTUS) != DONE)
{
instance->SummonCreature(NPC_MAJORDOMO_EXECUTUS, SummonPositions[0]);
instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[1]);
@@ -180,76 +154,33 @@ class instance_molten_core : public InstanceMapScript
instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[8]);
}
else if (TempSummon* summon = instance->SummonCreature(NPC_MAJORDOMO_EXECUTUS, RagnarosTelePos))
- summon->AI()->DoAction(ACTION_START_RAGNAROS_ALT);
+ summon->AI()->DoAction(ACTION_START_RAGNAROS_ALT);
}
- std::string GetSaveData() override
+ bool CheckMajordomoExecutus() const
{
- OUT_SAVE_INST_DATA;
+ if (GetBossState(BOSS_RAGNAROS) == DONE)
+ return false;
- std::ostringstream saveStream;
- saveStream << "M C " << GetBossSaveData();
+ for (uint8 i = 0; i < BOSS_MAJORDOMO_EXECUTUS; ++i)
+ if (GetBossState(i) != DONE)
+ return false;
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
+ return true;
}
- void Load(char const* data)
+ void ReadSaveDataMore(std::istringstream& /*data*/) override
{
- if (!data)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
-
- _isLoading = true;
- OUT_LOAD_INST_DATA(data);
-
- char dataHead1, dataHead2;
-
- std::istringstream loadStream(data);
- loadStream >> dataHead1 >> dataHead2;
-
- if (dataHead1 == 'M' && dataHead2 == 'C')
- {
- EncounterState states[MAX_ENCOUNTER];
- uint8 executusCounter = 0;
-
- // need 2 loops to check spawning executus/ragnaros
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > TO_BE_DECIDED)
- tmpState = NOT_STARTED;
- states[i] = EncounterState(tmpState);
-
- if (tmpState == DONE && i < BOSS_MAJORDOMO_EXECUTUS)
- ++executusCounter;
- }
-
- if (executusCounter >= 8 && states[BOSS_RAGNAROS] != DONE)
- _executusSchedule = new bool(states[BOSS_MAJORDOMO_EXECUTUS] == DONE);
-
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- SetBossState(i, states[i]);
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- _isLoading = false;
+ if (CheckMajordomoExecutus())
+ _executusSchedule = true;
}
private:
uint64 _golemaggTheIncineratorGUID;
uint64 _majordomoExecutusGUID;
uint64 _cacheOfTheFirelordGUID;
- bool* _executusSchedule;
- uint8 _deadBossCount;
+ bool _executusSchedule;
uint8 _ragnarosAddDeaths;
- bool _isLoading;
- bool _summonedExecutus;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h
index 39d6cf40a8a..af0e0a89e45 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h
@@ -19,6 +19,8 @@
#ifndef DEF_MOLTEN_CORE_H
#define DEF_MOLTEN_CORE_H
+#define DataHeader "MC"
+
enum Encounters
{
BOSS_LUCIFRON = 0,
diff --git a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp
index b0222413513..7338620a8b2 100644
--- a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp
+++ b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp
@@ -133,7 +133,7 @@ public:
++uiHealth;
DoCastAOE(SPELL_SMITE_STOMP, false);
SetCombatMovement(false);
- if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_SMITE_CHEST)))
+ if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_SMITE_CHEST)))
{
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MovePoint(1, go->GetPositionX() - 3.0f, go->GetPositionY(), go->GetPositionZ());
diff --git a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h
index c3b09c76c68..b1ff0e03ff0 100644
--- a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h
+++ b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h
@@ -18,6 +18,8 @@
#ifndef DEF_DEADMINES_H
#define DEF_DEADMINES_H
+#define DataHeader "DM"
+
enum CannonState
{
CANNON_NOT_USED,
diff --git a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
index 050ef1eb642..c5f4f9cdbf9 100644
--- a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
+++ b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
@@ -74,6 +74,7 @@ class instance_deadmines : public InstanceMapScript
void Initialize() override
{
+ SetHeaders(DataHeader);
FactoryDoorGUID = 0;
IronCladDoorGUID = 0;
DefiasCannonGUID = 0;
diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
index 220cf0c92b4..d009986651a 100644
--- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
+++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
@@ -142,56 +142,48 @@ public:
uiPhase = uiPhaseStep;
}
- void CaveDestruction(bool bBool)
+ void CaveDestruction(bool isRight)
{
if (GoSummonList.empty())
return;
for (std::list<uint64>::const_iterator itr = GoSummonList.begin(); itr != GoSummonList.end(); ++itr)
{
- if (GameObject* go = GameObject::GetGameObject(*me, *itr))
- {
- if (go)
+ if (GameObject* go = ObjectAccessor::GetGameObject(*me, *itr))
+ {
+ if (Creature* trigger = go->SummonTrigger(go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0, 1))
{
- if (Creature* trigger = go->SummonTrigger(go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0, 1))
- {
- //visual effects are not working!
- trigger->CastSpell(trigger, 11542, true);
- trigger->CastSpell(trigger, 35470, true);
- }
- go->RemoveFromWorld();
- //go->CastSpell(me, 12158); makes all die?!
+ //visual effects are not working!
+ trigger->CastSpell(trigger, 11542, true);
+ trigger->CastSpell(trigger, 35470, true);
}
- }
+ go->RemoveFromWorld();
+ //go->CastSpell(me, 12158); makes all die?!
+ }
}
- if (bBool)
- {
- if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT)))
- instance->HandleGameObject(0, false, go);
- }else
- if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT)))
- instance->HandleGameObject(0, false, go);
+ if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(isRight ? DATA_GO_CAVE_IN_RIGHT : DATA_GO_CAVE_IN_LEFT)))
+ instance->HandleGameObject(0, false, go);
}
void SetInFace(bool isRight)
{
- if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(isRight ? DATA_GO_CAVE_IN_RIGHT : DATA_GO_CAVE_IN_LEFT)))
+ if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(isRight ? DATA_GO_CAVE_IN_RIGHT : DATA_GO_CAVE_IN_LEFT)))
me->SetFacingToObject(go);
}
void RestoreAll()
{
- if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT)))
+ if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT)))
instance->HandleGameObject(0, false, go);
- if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT)))
+ if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT)))
instance->HandleGameObject(0, false, go);
if (!GoSummonList.empty())
for (std::list<uint64>::const_iterator itr = GoSummonList.begin(); itr != GoSummonList.end(); ++itr)
{
- if (GameObject* go = GameObject::GetGameObject(*me, *itr))
+ if (GameObject* go = ObjectAccessor::GetGameObject(*me, *itr))
go->RemoveFromWorld();
}
@@ -406,7 +398,7 @@ public:
SetInFace(true);
Talk(SAY_BLASTMASTER_5);
Summon(1);
- if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT)))
+ if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT)))
instance->HandleGameObject(0, true, go);
NextStep(3000, true);
break;
@@ -452,7 +444,7 @@ public:
case 16:
Talk(SAY_BLASTMASTER_14);
SetInFace(false);
- if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT)))
+ if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT)))
instance->HandleGameObject(0, true, go);
NextStep(2000, true);
break;
diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.h b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.h
index 096b8910d5a..adac26efff5 100644
--- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.h
+++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.h
@@ -18,6 +18,8 @@
#ifndef DEF_GNOMEREGAN_H
#define DEF_GNOMEREGAN_H
+#define DataHeader "GNO"
+
enum GameObjectIds
{
GO_CAVE_IN_LEFT = 146085,
diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp
index b35601fcc6c..f8e00fab682 100644
--- a/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp
+++ b/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp
@@ -36,6 +36,7 @@ public:
{
instance_gnomeregan_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
}
uint32 m_auiEncounter[MAX_ENCOUNTER];
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
index 9084a6b0371..7ce11653567 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
@@ -81,6 +81,9 @@ public:
Initialize();
instance = creature->GetInstanceScript();
Intro = true;
+ RainBones = false;
+ Skeletons = false;
+ FlyTimer = 0;
}
void Initialize()
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp
index ce8223c90cf..7b51b61ba0a 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp
@@ -1068,6 +1068,7 @@ public:
EntryYellTimer = 1000;
AggroYellTimer = 10000;
IsFakingDeath = false;
+ ResurrectTimer = 0;
}
void Initialize()
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp
index 3300e92869b..8f6d142e22b 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp
@@ -82,6 +82,7 @@ public:
void Initialize() override
{
+ SetHeaders(DataHeader);
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
// 1 - OZ, 2 - HOOD, 3 - RAJ, this never gets altered.
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h
index 3812e06b442..eec7e461e9b 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h
+++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h
@@ -19,6 +19,8 @@
#ifndef DEF_KARAZHAN_H
#define DEF_KARAZHAN_H
+#define DataHeader "KZ"
+
enum DataTypes
{
TYPE_ATTUMEN = 1,
@@ -62,5 +64,4 @@ enum OperaEvents
EVENT_RAJ = 3
};
-#define ERROR_INST_DATA(a) TC_LOG_ERROR("scripts", "Instance Data for Karazhan not set properly. Encounter for Creature Entry %u may not work properly.", a->GetEntry());
#endif
diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp
index 65b3553fd87..01491c53f72 100644
--- a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp
@@ -45,6 +45,7 @@ class instance_magisters_terrace : public InstanceMapScript
{
instance_magisters_terrace_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
@@ -161,48 +162,6 @@ class instance_magisters_terrace : public InstanceMapScript
return true;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "M T " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* str) override
- {
- 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 == 'M' && dataHead2 == 'T')
- {
- 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;
- }
-
uint64 GetData64(uint32 type) const override
{
switch (type)
diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h
index 8b8d7d5b875..142453c2502 100644
--- a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h
@@ -19,6 +19,8 @@
#ifndef DEF_MAGISTERS_TERRACE_H
#define DEF_MAGISTERS_TERRACE_H
+#define DataHeader "MT"
+
uint32 const EncounterCount = 4;
enum DataTypes
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
index 7355674963a..58ebef77425 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
@@ -412,7 +412,7 @@ class npc_eye_of_acherus : public CreatureScript
{
if (movementType == WAYPOINT_MOTION_TYPE && pointId == POINT_EYE_MOVE_END - 1)
{
- me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
+ me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
me->RemoveAllAuras();
if (Player* owner = me->GetCharmerOrOwner()->ToPlayer())
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
index 08e3de1941a..ee624c4f6a5 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
@@ -389,7 +389,16 @@ public:
struct npc_scarlet_courierAI : public ScriptedAI
{
- npc_scarlet_courierAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_scarlet_courierAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ uiStage = 1;
+ uiStage_timer = 3000;
+ }
uint32 uiStage;
uint32 uiStage_timer;
@@ -397,8 +406,7 @@ public:
void Reset() override
{
me->Mount(14338); // not sure about this id
- uiStage = 1;
- uiStage_timer = 3000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
index e202e55e675..f6757afd5bc 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
@@ -312,6 +312,8 @@ public:
npc_highlord_darion_mograineAI(Creature* creature) : npc_escortAI(creature)
{
uiTirionGUID = 0;
+ uiAlexandrosGUID = 0;
+ uiDarionGUID = 0;
uiKorfaxGUID = 0;
uiMaxwellGUID = 0;
uiEligorGUID = 0;
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 43dee1338ef..8f61aadb99b 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp
@@ -46,7 +46,19 @@ public:
struct npc_valkyr_battle_maidenAI : public PassiveAI
{
- npc_valkyr_battle_maidenAI(Creature* creature) : PassiveAI(creature) { }
+ npc_valkyr_battle_maidenAI(Creature* creature) : PassiveAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ FlyBackTimer = 500;
+ phase = 0;
+ x = 0.f;
+ y = 0.f;
+ z = 0.f;
+ }
uint32 FlyBackTimer;
float x, y, z;
@@ -58,8 +70,6 @@ public:
me->SetVisible(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetCanFly(true);
- FlyBackTimer = 500;
- phase = 0;
me->GetPosition(x, y, z);
z += 4.0f;
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
index cad46b84748..0733640f4c3 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
@@ -232,7 +232,20 @@ public:
struct npc_headAI : public ScriptedAI
{
- npc_headAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_headAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ Phase = 0;
+ bodyGUID = 0;
+ die = false;
+ withbody = true;
+ wait = 1000;
+ laugh = urand(15000, 30000);
+ }
uint64 bodyGUID;
@@ -245,12 +258,7 @@ public:
void Reset() override
{
- Phase = 0;
- bodyGUID = 0;
- die = false;
- withbody = true;
- wait = 1000;
- laugh = urand(15000, 30000);
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
@@ -380,8 +388,31 @@ public:
{
boss_headless_horsemanAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
headGUID = 0;
+ PlayerGUID = 0;
+ id = 0;
+ whirlwind = 0;
+ wp_reached = false;
+ }
+
+ void Initialize()
+ {
+ Phase = 1;
+ conflagrate = 15000;
+ summonadds = 15000;
+ laugh = urand(16000, 20000);
+ cleave = 2000;
+ regen = 1000;
+ burn = 6000;
+ count = 0;
+ say_timer = 3000;
+
+ withhead = true;
+ returned = true;
+ burned = false;
+ IsFlying = false;
}
InstanceScript* instance;
@@ -410,20 +441,7 @@ public:
void Reset() override
{
- Phase = 1;
- conflagrate = 15000;
- summonadds = 15000;
- laugh = urand(16000, 20000);
- cleave = 2000;
- regen = 1000;
- burn = 6000;
- count = 0;
- say_timer = 3000;
-
- withhead = true;
- returned = true;
- burned = false;
- IsFlying = false;
+ Initialize();
DoCast(me, SPELL_HEAD);
if (headGUID)
{
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 a4a3660b360..78a317b216e 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp
@@ -51,9 +51,21 @@ public:
{
boss_high_inquisitor_fairbanksAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ CurseOfBlood_Timer = 10000;
+ DispelMagic_Timer = 30000;
+ Fear_Timer = 40000;
+ Heal_Timer = 30000;
+ Sleep_Timer = 30000;
+ Dispel_Timer = 20000;
+ PowerWordShield = false;
+ }
+
uint32 CurseOfBlood_Timer;
uint32 DispelMagic_Timer;
uint32 Fear_Timer;
@@ -65,13 +77,7 @@ public:
void Reset() override
{
- CurseOfBlood_Timer = 10000;
- DispelMagic_Timer = 30000;
- Fear_Timer = 40000;
- Heal_Timer = 30000;
- Sleep_Timer = 30000;
- Dispel_Timer = 20000;
- PowerWordShield = false;
+ Initialize();
me->SetStandState(UNIT_STAND_STATE_DEAD);
me->SetUInt32Value(UNIT_FIELD_BYTES_1, 7);
instance->SetBossState(DATA_HIGH_INQUISITOR_FAIRBANKS, NOT_STARTED);
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp
index a73cf946a7c..3e752858e63 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 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,13 +15,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Interrogator_Vishas
-SD%Complete: 100
-SDComment:
-SDCategory: Scarlet Monastery
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "scarlet_monastery.h"
@@ -38,88 +30,93 @@ enum Says
enum Spells
{
- SPELL_SHADOWWORDPAIN = 2767
+ SPELL_SHADOW_WORD_PAIN = 2767
};
-class boss_interrogator_vishas : public CreatureScript
+enum Events
{
-public:
- boss_interrogator_vishas() : CreatureScript("boss_interrogator_vishas") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<boss_interrogator_vishasAI>(creature);
- }
-
- struct boss_interrogator_vishasAI : public ScriptedAI
- {
- boss_interrogator_vishasAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = me->GetInstanceScript();
- }
-
- InstanceScript* instance;
+ EVENT_SHADOW_WORD_PAIN = 1
+};
- bool Yell30;
- bool Yell60;
- uint32 ShadowWordPain_Timer;
+class boss_interrogator_vishas : public CreatureScript
+{
+ public:
+ boss_interrogator_vishas() : CreatureScript("boss_interrogator_vishas") { }
- void Reset() override
+ struct boss_interrogator_vishasAI : public BossAI
{
- ShadowWordPain_Timer = 5000;
- Yell60 = false;
- Yell30 = false;
- instance->SetBossState(DATA_INTERROGATOR_VISHAS, NOT_STARTED);
- }
+ boss_interrogator_vishasAI(Creature* creature) : BossAI(creature, DATA_INTERROGATOR_VISHAS)
+ {
+ Initialize();
+ }
- void EnterCombat(Unit* /*who*/) override
- {
- Talk(SAY_AGGRO);
- instance->SetBossState(DATA_INTERROGATOR_VISHAS, IN_PROGRESS);
- }
+ void Initialize()
+ {
+ _yellCount = 0;
+ }
- void KilledUnit(Unit* /*Victim*/) override
- {
- Talk(SAY_KILL);
- }
+ void Reset() override
+ {
+ Initialize();
+ _Reset();
+ }
- void JustDied(Unit* /*killer*/) override
- {
- //Any other Actions to do with vorrel? setStandState?
- if (Creature* vorrel = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VORREL)))
- vorrel->AI()->Talk(SAY_TRIGGER_VORREL);
- instance->SetBossState(DATA_INTERROGATOR_VISHAS, DONE);
- }
+ void EnterCombat(Unit* /*who*/) override
+ {
+ Talk(SAY_AGGRO);
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 5000);
+ }
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
+ void KilledUnit(Unit* victim) override
+ {
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_KILL);
+ }
- //If we are low on hp Do sayings
- if (!Yell60 && !HealthAbovePct(60))
+ void JustDied(Unit* /*killer*/) override
{
- Talk(SAY_HEALTH1);
- Yell60 = true;
+ _JustDied();
+ if (Creature* vorrel = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VORREL)))
+ vorrel->AI()->Talk(SAY_TRIGGER_VORREL);
}
- if (!Yell30 && !HealthAbovePct(30))
+ void DamageTaken(Unit* /*attacker*/, uint32 &damage) override
{
- Talk(SAY_HEALTH2);
- Yell30 = true;
+ if (me->HealthBelowPctDamaged(60, damage) && _yellCount < 1)
+ {
+ Talk(SAY_HEALTH1);
+ ++_yellCount;
+ }
+
+ if (me->HealthBelowPctDamaged(30, damage) && _yellCount < 2)
+ {
+ Talk(SAY_HEALTH2);
+ ++_yellCount;
+ }
}
- //ShadowWordPain_Timer
- if (ShadowWordPain_Timer <= diff)
+ void ExecuteEvent(uint32 eventId) override
{
- DoCastVictim(SPELL_SHADOWWORDPAIN);
- ShadowWordPain_Timer = urand(5000, 15000);
+ switch (eventId)
+ {
+ case EVENT_SHADOW_WORD_PAIN:
+ DoCastVictim(SPELL_SHADOW_WORD_PAIN);
+ events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(5000, 15000));
+ break;
+ default:
+ break;
+ }
}
- else ShadowWordPain_Timer -= diff;
- DoMeleeAttackIfReady();
+ private:
+ uint8 _yellCount;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetInstanceAI<boss_interrogator_vishasAI>(creature);
}
- };
};
void AddSC_boss_interrogator_vishas()
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 a9988584edd..02f7c815414 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp
@@ -72,9 +72,19 @@ public:
{
boss_scarlet_commander_mograineAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ CrusaderStrike_Timer = 10000;
+ HammerOfJustice_Timer = 10000;
+ _bHasDied = false;
+ _bHeal = false;
+ _bFakeDeath = false;
+ }
+
InstanceScript* instance;
uint32 CrusaderStrike_Timer;
@@ -86,8 +96,7 @@ public:
void Reset() override
{
- CrusaderStrike_Timer = 10000;
- HammerOfJustice_Timer = 10000;
+ Initialize();
//Incase wipe during phase that mograine fake death
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -96,10 +105,6 @@ public:
if (me->IsAlive())
instance->SetBossState(DATA_MOGRAINE_AND_WHITE_EVENT, NOT_STARTED);
-
- _bHasDied = false;
- _bHeal = false;
- _bFakeDeath = false;
}
void JustReachedHome() override
@@ -230,9 +235,21 @@ public:
{
boss_high_inquisitor_whitemaneAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ Wait_Timer = 7000;
+ Heal_Timer = 10000;
+ PowerWordShield_Timer = 15000;
+ HolySmite_Timer = 6000;
+
+ _bCanResurrectCheck = false;
+ _bCanResurrect = false;
+ }
+
InstanceScript* instance;
uint32 Heal_Timer;
@@ -245,13 +262,7 @@ public:
void Reset() override
{
- Wait_Timer = 7000;
- Heal_Timer = 10000;
- PowerWordShield_Timer = 15000;
- HolySmite_Timer = 6000;
-
- _bCanResurrectCheck = false;
- _bCanResurrect = false;
+ Initialize();
if (me->IsAlive())
instance->SetBossState(DATA_MOGRAINE_AND_WHITE_EVENT, NOT_STARTED);
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp
index dc65bd42bf4..3a79dac3a90 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp
@@ -34,6 +34,7 @@ class instance_scarlet_monastery : public InstanceMapScript
{
instance_scarlet_monastery_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
@@ -155,50 +156,6 @@ class instance_scarlet_monastery : public InstanceMapScript
return 0;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "S M " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* str) override
- {
- 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 == 'M')
- {
- for (uint8 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
-
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
protected:
uint64 PumpkinShrineGUID;
uint64 HorsemanGUID;
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h b/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h
index a74efba751f..af716b5f448 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h
@@ -19,6 +19,8 @@
#define SCARLET_M_
#define SMScriptName "instance_scarlet_monastery"
+#define DataHeader "SM"
+
uint32 const EncounterCount = 10;
enum DataTypes
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp
index 9a1f8f14557..0386341ed0c 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp
@@ -162,52 +162,58 @@ class spell_shadow_portal : public SpellScriptLoader
{
PrepareSpellScript(spell_shadow_portal_SpellScript);
+ bool Load() override
+ {
+ _instance = GetCaster()->GetInstanceScript();
+ return _instance != nullptr;
+ }
+
void HandleCast(SpellEffIndex /*effIndex*/)
{
- Creature* caster = GetCaster()->ToCreature();
- int8 attempts = 0;
- int32 spell_to_cast =0;
+ Unit* caster = GetCaster();
+ uint8 attempts = 0;
+ uint32 spellId = 0;
- while (!spell_to_cast)
+ while (!spellId)
{
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;
+ if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetData64(GO_GATE_RAVENIAN)))
+ if (go->GetGoState() == GO_STATE_ACTIVE)
+ spellId = 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;
+ if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetData64(GO_GATE_THEOLEN)))
+ if (go->GetGoState() == GO_STATE_ACTIVE)
+ spellId = 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;
+ if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetData64(GO_GATE_MALICIA)))
+ if (go->GetGoState() == GO_STATE_ACTIVE)
+ spellId = 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;
+ if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetData64(GO_GATE_ILLUCIA)))
+ if (go->GetGoState() == GO_STATE_ACTIVE)
+ spellId = 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;
+ if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetData64(GO_GATE_BAROV)))
+ if (go->GetGoState() == GO_STATE_ACTIVE)
+ spellId = 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;
+ if (GameObject* go = ObjectAccessor::GetGameObject(*caster, _instance->GetData64(GO_GATE_POLKELT)))
+ if (go->GetGoState() == GO_STATE_ACTIVE)
+ spellId = SPELL_SHADOW_PORTAL_VAULTOFTHERAVENIAN;
break;
}
- if (spell_to_cast)
- GetHitUnit()->CastSpell(GetHitUnit(), spell_to_cast);
+ if (spellId)
+ GetHitUnit()->CastSpell(GetHitUnit(), spellId);
}
}
@@ -215,6 +221,9 @@ class spell_shadow_portal : public SpellScriptLoader
{
OnEffectHitTarget += SpellEffectFn(spell_shadow_portal_SpellScript::HandleCast, EFFECT_0, SPELL_EFFECT_DUMMY);
}
+
+ private:
+ InstanceScript* _instance;
};
SpellScript* GetSpellScript() const override
@@ -276,12 +285,17 @@ class spell_shadow_portal_rooms : public SpellScriptLoader
{
PrepareSpellScript(spell_shadow_portal_rooms_SpellScript);
+ bool Load() override
+ {
+ _instance = GetCaster()->GetInstanceScript();
+ return _instance != nullptr;
+ }
+
void HandleSendEvent(SpellEffIndex effIndex)
{
// If only one player in threat list fail spell
- Creature* Summoned = NULL;
- Creature* caster = GetCaster()->ToCreature();
+ Unit* caster = GetCaster();
int8 pos_to_summon = 0;
int8 phase_to_set = 0;
@@ -323,21 +337,19 @@ class spell_shadow_portal_rooms : public SpellScriptLoader
break;
}
- if (gate_to_close && (GetCaster()->GetMap()->GetId() == 289))
+ if (gate_to_close && (caster->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)
+ if (Creature* Summoned = caster->SummonCreature(NPC_RISEN_GUARDIAN, SummonPos[pos_to_summon++], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000))
{
Summoned->GetMotionMaster()->MoveRandom(5);
Summoned->AI()->SetData(0, phase_to_set);
}
}
- if (InstanceScript* instance = GetCaster()->GetInstanceScript())
- if (GameObject* gate = GameObject::GetGameObject(*caster, instance->GetData64(gate_to_close)))
- gate->SetGoState(GO_STATE_READY);
+ if (GameObject* gate = ObjectAccessor::GetGameObject(*caster, _instance->GetData64(gate_to_close)))
+ gate->SetGoState(GO_STATE_READY);
}
}
@@ -345,6 +357,9 @@ class spell_shadow_portal_rooms : public SpellScriptLoader
{
OnEffectHit += SpellEffectFn(spell_shadow_portal_rooms_SpellScript::HandleSendEvent, EFFECT_1, SPELL_EFFECT_SEND_EVENT);
}
+
+ private:
+ InstanceScript* _instance;
};
SpellScript* GetSpellScript() const override
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp
index 84ada04a989..4a9703b509b 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp
@@ -50,7 +50,16 @@ class boss_instructor_malicia : public CreatureScript
struct boss_instructormaliciaAI : public BossAI
{
- boss_instructormaliciaAI(Creature* creature) : BossAI(creature, DATA_INSTRUCTORMALICIA) { }
+ boss_instructormaliciaAI(Creature* creature) : BossAI(creature, DATA_INSTRUCTORMALICIA)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ FlashCounter = 0;
+ TouchCounter = 0;
+ }
uint32 FlashCounter;
uint32 TouchCounter;
@@ -58,8 +67,7 @@ class boss_instructor_malicia : public CreatureScript
void Reset() override
{
_Reset();
- FlashCounter = 0;
- TouchCounter = 0;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp
index 57331d84b82..b218e3f2978 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 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,23 +15,21 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_jandicebarov
-SD%Complete: 100
-SDComment:
-SDCategory: Scholomance
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
enum Spells
{
- SPELL_CURSEOFBLOOD = 24673,
- //SPELL_ILLUSION = 17773,
+ SPELL_CURSE_OF_BLOOD = 24673,
+ SPELL_ILLUSION = 17773,
+};
- // Spells of Illusion of Jandice Barov
- SPELL_CLEAVE = 15284
+enum Events
+{
+ EVENT_CURSE_OF_BLOOD = 1,
+ EVENT_ILLUSION,
+ EVENT_CLEAVE,
+ EVENT_SET_VISIBILITY
};
class boss_jandice_barov : public CreatureScript
@@ -40,173 +37,87 @@ class boss_jandice_barov : public CreatureScript
public:
boss_jandice_barov() : CreatureScript("boss_jandice_barov") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new boss_jandicebarovAI(creature);
- }
-
struct boss_jandicebarovAI : public ScriptedAI
{
- boss_jandicebarovAI(Creature* creature) : ScriptedAI(creature) { }
-
- uint32 CurseOfBlood_Timer;
- uint32 Illusion_Timer;
- //uint32 Illusioncounter;
- uint32 Invisible_Timer;
- bool Invisible;
+ boss_jandicebarovAI(Creature* creature) : ScriptedAI(creature), Summons(me) { }
void Reset() override
{
- CurseOfBlood_Timer = 15000;
- Illusion_Timer = 30000;
- Invisible_Timer = 3000; //Too much too low?
- Invisible = false;
+ events.Reset();
+ Summons.DespawnAll();
+ }
+
+ void JustSummoned(Creature* summoned) override
+ {
+ // Illusions should attack a random target.
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ summoned->AI()->AttackStart(target);
+
+ summoned->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true); // Not sure if this is correct.
+ Summons.Summon(summoned);
}
void EnterCombat(Unit* /*who*/) override
{
+ events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 15000);
+ events.ScheduleEvent(EVENT_ILLUSION, 30000);
}
- void SummonIllusions(Unit* victim)
+ void JustDied(Unit* /*killer*/) override
{
- if (Creature* Illusion = DoSpawnCreature(11439, float(irand(-9, 9)), float(irand(-9, 9)), 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000))
- Illusion->AI()->AttackStart(victim);
+ Summons.DespawnAll();
}
void UpdateAI(uint32 diff) override
{
- if (Invisible && Invisible_Timer <= diff)
- {
- //Become visible again
- me->setFaction(14);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->SetDisplayId(11073); //Jandice Model
- Invisible = false;
- } else if (Invisible)
- {
- Invisible_Timer -= diff;
- //Do nothing while invisible
- return;
- }
-
- //Return since we have no target
if (!UpdateVictim())
return;
- //CurseOfBlood_Timer
- if (CurseOfBlood_Timer <= diff)
- {
- //Cast
- DoCastVictim(SPELL_CURSEOFBLOOD);
+ events.Update(diff);
- //45 seconds
- CurseOfBlood_Timer = 30000;
- } else CurseOfBlood_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- //Illusion_Timer
- if (!Invisible && Illusion_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
-
- //Interrupt any spell casting
- me->InterruptNonMeleeSpells(false);
- me->setFaction(35);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->SetDisplayId(11686); // Invisible Model
- DoModifyThreatPercent(me->GetVictim(), -99);
-
- //Summon 10 Illusions attacking random gamers
- Unit* target = NULL;
- for (uint8 i = 0; i < 10; ++i)
+ switch (eventId)
{
- target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
- SummonIllusions(target);
+ case EVENT_CURSE_OF_BLOOD:
+ DoCastVictim(SPELL_CURSE_OF_BLOOD);
+ events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 30000);
+ break;
+ case EVENT_ILLUSION:
+ DoCast(SPELL_ILLUSION);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetDisplayId(11686); // Invisible Model
+ DoModifyThreatPercent(me->GetVictim(), -99);
+ events.ScheduleEvent(EVENT_SET_VISIBILITY, 3000);
+ events.ScheduleEvent(EVENT_ILLUSION, 25000);
+ break;
+ case EVENT_SET_VISIBILITY:
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetDisplayId(11073); //Jandice Model
+ break;
+ default:
+ break;
}
- Invisible = true;
- Invisible_Timer = 3000;
-
- //25 seconds until we should cast this agian
- Illusion_Timer = 25000;
- } else Illusion_Timer -= diff;
-
- // //Illusion_Timer
- // if (Illusion_Timer <= diff)
- // {
- // //Cast
- // DoCastVictim(SPELL_ILLUSION);
- //
- // //3 Illusion will be summoned
- // if (Illusioncounter < 3)
- // {
- // Illusion_Timer = 500;
- // ++Illusioncounter;
- // }
- // else {
- // //15 seconds until we should cast this again
- // Illusion_Timer = 15000;
- // Illusioncounter = 0;
- // }
- //
- // } else Illusion_Timer -= diff;
+ }
DoMeleeAttackIfReady();
}
- };
-};
-
-// Illusion of Jandice Barov Script
-
-class npc_illusionofjandicebarov : public CreatureScript
-{
-public:
- npc_illusionofjandicebarov() : CreatureScript("npc_illusionofjandicebarov") { }
+ private:
+ EventMap events;
+ SummonList Summons;
+ };
CreatureAI* GetAI(Creature* creature) const override
{
- return new npc_illusionofjandicebarovAI(creature);
+ return new boss_jandicebarovAI(creature);
}
-
- struct npc_illusionofjandicebarovAI : public ScriptedAI
- {
- npc_illusionofjandicebarovAI(Creature* creature) : ScriptedAI(creature) { }
-
- uint32 Cleave_Timer;
-
- void Reset() override
- {
- Cleave_Timer = urand(2000, 8000);
- me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);
- }
-
- void EnterCombat(Unit* /*who*/) override
- {
- }
-
- void UpdateAI(uint32 diff) override
- {
- //Return since we have no target
- if (!UpdateVictim())
- return;
-
- //Cleave_Timer
- if (Cleave_Timer <= diff)
- {
- //Cast
- DoCastVictim(SPELL_CLEAVE);
-
- //5-8 seconds
- Cleave_Timer = urand(5000, 8000);
- } else Cleave_Timer -= diff;
-
- DoMeleeAttackIfReady();
- }
- };
-
};
void AddSC_boss_jandicebarov()
{
new boss_jandice_barov();
- new npc_illusionofjandicebarov();
}
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp
index b88954bd1b7..099a69782b8 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 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,20 +15,31 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Kormok
-SD%Complete: 100
-SDComment:
-SDCategory: Scholomance
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "SpellScript.h"
+#include "scholomance.h"
enum Spells
{
- SPELL_SHADOWBOLTVOLLEY = 20741,
- SPELL_BONESHIELD = 27688
+ SPELL_SHADOWBOLT_VOLLEY = 20741,
+ SPELL_BONE_SHIELD = 27688,
+
+ SPELL_SUMMON_BONE_MAGES = 27695,
+
+ SPELL_SUMMON_BONE_MAGE_FRONT_LEFT = 27696,
+ SPELL_SUMMON_BONE_MAGE_FRONT_RIGHT = 27697,
+ SPELL_SUMMON_BONE_MAGE_BACK_RIGHT = 27698,
+ SPELL_SUMMON_BONE_MAGE_BACK_LEFT = 27699,
+
+ SPELL_SUMMON_BONE_MINIONS = 27687
+};
+
+enum Events
+{
+ EVENT_SHADOWBOLT_VOLLEY = 1,
+ EVENT_BONE_SHIELD,
+ EVENT_SUMMON_MINIONS
};
class boss_kormok : public CreatureScript
@@ -37,44 +47,43 @@ class boss_kormok : public CreatureScript
public:
boss_kormok() : CreatureScript("boss_kormok") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new boss_kormokAI(creature);
- }
-
struct boss_kormokAI : public ScriptedAI
{
- boss_kormokAI(Creature* creature) : ScriptedAI(creature) { }
+ boss_kormokAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
- uint32 ShadowVolley_Timer;
- uint32 BoneShield_Timer;
- uint32 Minion_Timer;
- uint32 Mage_Timer;
- bool Mages;
+ void Initialize()
+ {
+ Mages = false;
+ }
void Reset() override
{
- ShadowVolley_Timer = 10000;
- BoneShield_Timer = 2000;
- Minion_Timer = 15000;
- Mage_Timer = 0;
- Mages = false;
+ Initialize();
+ events.Reset();
}
void EnterCombat(Unit* /*who*/) override
{
+ events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 10000);
+ events.ScheduleEvent(EVENT_BONE_SHIELD, 2000);
+ events.ScheduleEvent(EVENT_SUMMON_MINIONS, 15000);
}
- void SummonMinions(Unit* victim)
+ void JustSummoned(Creature* summoned) override
{
- if (Creature* SummonedMinion = DoSpawnCreature(16119, float(irand(-7, 7)), float(irand(-7, 7)), 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 120000))
- SummonedMinion->AI()->AttackStart(victim);
+ summoned->AI()->AttackStart(me->GetVictim());
}
- void SummonMages(Unit* victim)
+ void DamageTaken(Unit* /*attacker*/, uint32& damage) override
{
- if (Creature* SummonedMage = DoSpawnCreature(16120, float(irand(-9, 9)), float(irand(-9, 9)), 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 120000))
- SummonedMage->AI()->AttackStart(victim);
+ if (me->HealthBelowPctDamaged(25, damage) && !Mages)
+ {
+ DoCast(SPELL_SUMMON_BONE_MAGES);
+ Mages = true;
+ }
}
void UpdateAI(uint32 diff) override
@@ -82,48 +91,132 @@ public:
if (!UpdateVictim())
return;
- //ShadowVolley_Timer
- if (ShadowVolley_Timer <= diff)
- {
- DoCastVictim(SPELL_SHADOWBOLTVOLLEY);
- ShadowVolley_Timer = 15000;
- } else ShadowVolley_Timer -= diff;
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- //BoneShield_Timer
- if (BoneShield_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- DoCastVictim(SPELL_BONESHIELD);
- BoneShield_Timer = 45000;
- } else BoneShield_Timer -= diff;
+ switch (eventId)
+ {
+ case EVENT_SHADOWBOLT_VOLLEY:
+ DoCastVictim(SPELL_SHADOWBOLT_VOLLEY);
+ events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 15000);
+ break;
+ case EVENT_BONE_SHIELD:
+ DoCastVictim(SPELL_BONE_SHIELD);
+ events.ScheduleEvent(EVENT_BONE_SHIELD, 45000);
+ break;
+ case EVENT_SUMMON_MINIONS:
+ DoCast(SPELL_SUMMON_BONE_MINIONS);
+ events.ScheduleEvent(EVENT_SUMMON_MINIONS, 12000);
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ EventMap events;
+ bool Mages;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new boss_kormokAI(creature);
+ }
+};
- //Minion_Timer
- if (Minion_Timer <= diff)
+uint32 const SummonMageSpells[4] =
+{
+ SPELL_SUMMON_BONE_MAGE_FRONT_LEFT,
+ SPELL_SUMMON_BONE_MAGE_FRONT_RIGHT,
+ SPELL_SUMMON_BONE_MAGE_BACK_RIGHT,
+ SPELL_SUMMON_BONE_MAGE_BACK_LEFT,
+};
+
+// 27695 - Summon Bone Mages
+class spell_kormok_summon_bone_mages : SpellScriptLoader
+{
+ public:
+ spell_kormok_summon_bone_mages() : SpellScriptLoader("spell_kormok_summon_bone_mages") { }
+
+ class spell_kormok_summon_bone_magesSpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_kormok_summon_bone_magesSpellScript);
+
+ bool Validate(SpellInfo const* /*spell*/) override
{
- //Cast
- SummonMinions(me->GetVictim());
- SummonMinions(me->GetVictim());
- SummonMinions(me->GetVictim());
- SummonMinions(me->GetVictim());
+ for (uint32 i = 0; i < 4; ++i)
+ if (!sSpellMgr->GetSpellInfo(SummonMageSpells[i]))
+ return false;
+ return true;
+ }
- Minion_Timer = 12000;
- } else Minion_Timer -= diff;
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ for (uint32 i = 0; i < 2; ++i)
+ GetCaster()->CastSpell(GetCaster(), SummonMageSpells[urand(0, 3)], true);
+ }
- //Summon 2 Bone Mages
- if (!Mages && HealthBelowPct(26))
+ void Register() override
{
- //Cast
- SummonMages(me->GetVictim());
- SummonMages(me->GetVictim());
- Mages = true;
+ OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_magesSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
+ };
- DoMeleeAttackIfReady();
+ SpellScript* GetSpellScript() const override
+ {
+ return new spell_kormok_summon_bone_magesSpellScript();
+ }
+};
+
+// 27687 - Summon Bone Minions
+class spell_kormok_summon_bone_minions : SpellScriptLoader
+{
+ public:
+ spell_kormok_summon_bone_minions() : SpellScriptLoader("spell_kormok_summon_bone_minions") { }
+
+ class spell_kormok_summon_bone_minionsSpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_kormok_summon_bone_minionsSpellScript);
+
+ bool Validate(SpellInfo const* /*spell*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_BONE_MINIONS))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ // Possible spells to handle this not found.
+ for (uint32 i = 0; i < 4; ++i)
+ GetCaster()->SummonCreature(NPC_BONE_MINION, GetCaster()->GetPositionX() + float(irand(-7, 7)), GetCaster()->GetPositionY() + float(irand(-7, 7)), GetCaster()->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 120000);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_minionsSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
+ SpellScript* GetSpellScript() const override
+ {
+ return new spell_kormok_summon_bone_minionsSpellScript();
+ }
};
void AddSC_boss_kormok()
{
new boss_kormok();
+ new spell_kormok_summon_bone_mages();
+ new spell_kormok_summon_bone_minions();
}
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp
index 2aecc8bd491..897799a708c 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 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,114 +15,108 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Ras_Frostwhisper
-SD%Complete: 100
-SDComment:
-SDCategory: Scholomance
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
enum Spells
{
SPELL_FROSTBOLT = 21369,
- SPELL_ICEARMOR = 18100, // This is actually a buff he gives himself
+ SPELL_ICE_ARMOR = 18100, // This is actually a buff he gives himself
SPELL_FREEZE = 18763,
SPELL_FEAR = 26070,
- SPELL_CHILLNOVA = 18099,
+ SPELL_CHILL_NOVA = 18099,
SPELL_FROSTVOLLEY = 8398
};
+enum Events
+{
+ EVENT_FROSTBOLT = 1,
+ EVENT_ICE_ARMOR,
+ EVENT_FREEZE,
+ EVENT_FEAR,
+ EVENT_CHILL_NOVA,
+ EVENT_FROSTVOLLEY
+};
+
class boss_boss_ras_frostwhisper : public CreatureScript
{
public:
boss_boss_ras_frostwhisper() : CreatureScript("boss_boss_ras_frostwhisper") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new boss_rasfrostAI(creature);
- }
-
struct boss_rasfrostAI : public ScriptedAI
{
boss_rasfrostAI(Creature* creature) : ScriptedAI(creature) { }
- uint32 IceArmor_Timer;
- uint32 Frostbolt_Timer;
- uint32 Freeze_Timer;
- uint32 Fear_Timer;
- uint32 ChillNova_Timer;
- uint32 FrostVolley_Timer;
-
void Reset() override
{
- IceArmor_Timer = 2000;
- Frostbolt_Timer = 8000;
- ChillNova_Timer = 12000;
- Freeze_Timer = 18000;
- FrostVolley_Timer = 24000;
- Fear_Timer = 45000;
-
- DoCast(me, SPELL_ICEARMOR, true);
+ events.Reset();
+ DoCast(me, SPELL_ICE_ARMOR);
}
- void EnterCombat(Unit* /*who*/) override { }
+ void EnterCombat(Unit* /*who*/) override
+ {
+ events.ScheduleEvent(EVENT_ICE_ARMOR, 2000);
+ events.ScheduleEvent(EVENT_FROSTBOLT, 8000);
+ events.ScheduleEvent(EVENT_CHILL_NOVA, 12000);
+ events.ScheduleEvent(EVENT_FREEZE, 18000);
+ events.ScheduleEvent(EVENT_FEAR, 45000);
+ }
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
- //IceArmor_Timer
- if (IceArmor_Timer <= diff)
- {
- DoCast(me, SPELL_ICEARMOR);
- IceArmor_Timer = 180000;
- } else IceArmor_Timer -= diff;
-
- //Frostbolt_Timer
- if (Frostbolt_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- DoCast(target, SPELL_FROSTBOLT);
-
- Frostbolt_Timer = 8000;
- } else Frostbolt_Timer -= diff;
-
- //Freeze_Timer
- if (Freeze_Timer <= diff)
- {
- DoCastVictim(SPELL_FREEZE);
- Freeze_Timer = 24000;
- } else Freeze_Timer -= diff;
-
- //Fear_Timer
- if (Fear_Timer <= diff)
- {
- DoCastVictim(SPELL_FEAR);
- Fear_Timer = 30000;
- } else Fear_Timer -= diff;
+ events.Update(diff);
- //ChillNova_Timer
- if (ChillNova_Timer <= diff)
- {
- DoCastVictim(SPELL_CHILLNOVA);
- ChillNova_Timer = 14000;
- } else ChillNova_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- //FrostVolley_Timer
- if (FrostVolley_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- DoCastVictim(SPELL_FROSTVOLLEY);
- FrostVolley_Timer = 15000;
- } else FrostVolley_Timer -= diff;
+ switch (eventId)
+ {
+ case EVENT_ICE_ARMOR:
+ DoCast(me, SPELL_ICE_ARMOR);
+ events.ScheduleEvent(EVENT_ICE_ARMOR, 180000);
+ break;
+ case EVENT_FROSTBOLT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
+ DoCast(target, SPELL_FROSTBOLT);
+ events.ScheduleEvent(EVENT_FROSTBOLT, 8000);
+ break;
+ case EVENT_FREEZE:
+ DoCastVictim(SPELL_FREEZE);
+ events.ScheduleEvent(EVENT_FREEZE, 24000);
+ break;
+ case EVENT_FEAR:
+ DoCastVictim(SPELL_FEAR);
+ events.ScheduleEvent(EVENT_FEAR, 30000);
+ break;
+ case EVENT_CHILL_NOVA:
+ DoCastVictim(SPELL_CHILL_NOVA);
+ events.ScheduleEvent(EVENT_CHILL_NOVA, 14000);
+ break;
+ case EVENT_FROSTVOLLEY:
+ DoCastVictim(SPELL_FROSTVOLLEY);
+ events.ScheduleEvent(EVENT_FROSTVOLLEY, 15000);
+ break;
+ default:
+ break;
+ }
+ }
DoMeleeAttackIfReady();
}
+
+ private:
+ EventMap events;
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new boss_rasfrostAI(creature);
+ }
};
void AddSC_boss_rasfrost()
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp
index c111eb103b4..792649f2998 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 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,95 +15,102 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Vectus
-SD%Complete: 100
-SDComment:
-SDCategory: Scholomance
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
enum Emotes
{
- EMOTE_FRENZY_KILL = 0
+ EMOTE_FRENZY = 0
};
enum Spells
{
SPELL_FLAMESTRIKE = 18399,
SPELL_BLAST_WAVE = 16046,
- SPELL_FIRESHIELD = 19626,
+ SPELL_FIRE_SHIELD = 19626,
SPELL_FRENZY = 8269 // 28371
};
+enum Events
+{
+ EVENT_FIRE_SHIELD = 1,
+ EVENT_BLAST_WAVE,
+ EVENT_FRENZY
+};
+
class boss_vectus : public CreatureScript
{
public:
boss_vectus() : CreatureScript("boss_vectus") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new boss_vectusAI(creature);
- }
-
struct boss_vectusAI : public ScriptedAI
{
boss_vectusAI(Creature* creature) : ScriptedAI(creature) { }
- uint32 m_uiFireShield_Timer;
- uint32 m_uiBlastWave_Timer;
- uint32 m_uiFrenzy_Timer;
-
void Reset() override
{
- m_uiFireShield_Timer = 2000;
- m_uiBlastWave_Timer = 14000;
- m_uiFrenzy_Timer = 0;
+ events.Reset();
}
- void UpdateAI(uint32 uiDiff) override
+ void EnterCombat(Unit* /*who*/) override
{
- if (!UpdateVictim())
- return;
+ events.ScheduleEvent(EVENT_FIRE_SHIELD, 2000);
+ events.ScheduleEvent(EVENT_BLAST_WAVE, 14000);
+ }
- //FireShield_Timer
- if (m_uiFireShield_Timer <= uiDiff)
+ void DamageTaken(Unit* /*attacker*/, uint32& damage) override
+ {
+ if (me->HealthBelowPctDamaged(25, damage))
{
- DoCast(me, SPELL_FIRESHIELD);
- m_uiFireShield_Timer = 90000;
+ DoCast(me, SPELL_FRENZY);
+ Talk(EMOTE_FRENZY);
+ events.ScheduleEvent(EVENT_FRENZY, 24000);
}
- else
- m_uiFireShield_Timer -= uiDiff;
+ }
- //BlastWave_Timer
- if (m_uiBlastWave_Timer <= uiDiff)
- {
- DoCastVictim(SPELL_BLAST_WAVE);
- m_uiBlastWave_Timer = 12000;
- }
- else
- m_uiBlastWave_Timer -= uiDiff;
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- //Frenzy_Timer
- if (HealthBelowPct(25))
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (m_uiFrenzy_Timer <= uiDiff)
+ switch (eventId)
{
- DoCast(me, SPELL_FRENZY);
- Talk(EMOTE_FRENZY_KILL);
-
- m_uiFrenzy_Timer = 24000;
+ case EVENT_FIRE_SHIELD:
+ DoCast(me, SPELL_FIRE_SHIELD);
+ events.ScheduleEvent(EVENT_FIRE_SHIELD, 90000);
+ break;
+ case EVENT_BLAST_WAVE:
+ DoCast(me, SPELL_BLAST_WAVE);
+ events.ScheduleEvent(EVENT_BLAST_WAVE, 12000);
+ case EVENT_FRENZY:
+ DoCast(me, SPELL_FRENZY);
+ Talk(EMOTE_FRENZY);
+ events.ScheduleEvent(EVENT_FRENZY, 24000);
+ break;
+ default:
+ break;
}
- else
- m_uiFrenzy_Timer -= uiDiff;
}
DoMeleeAttackIfReady();
}
+
+ private:
+ EventMap events;
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new boss_vectusAI(creature);
+ }
};
void AddSC_boss_vectus()
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
index 6bb8e301e86..f1959b6cf56 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
@@ -36,6 +36,7 @@ class instance_scholomance : public InstanceMapScript
{
instance_scholomance_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
GateKirtonosGUID = 0;
GateGandlingGUID = 0;
@@ -168,49 +169,9 @@ class instance_scholomance : public InstanceMapScript
instance->SummonCreature(NPC_DARKMASTER_GANDLING, GandlingLoc);
}
- std::string GetSaveData() override
+ void ReadSaveDataMore(std::istringstream& /*data*/) override
{
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "S O " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* str) override
- {
- 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;
+ CheckToSpawnGandling();
}
protected:
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h
index 9eb7c5e8f86..30d0e978145 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h
+++ b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h
@@ -18,6 +18,8 @@
#ifndef DEF_SCHOLOMANCE_H
#define DEF_SCHOLOMANCE_H
+#define DataHeader "SC"
+
uint32 const EncounterCount = 8;
enum DataTypes
@@ -34,7 +36,8 @@ enum DataTypes
enum CreatureIds
{
- NPC_DARKMASTER_GANDLING = 1853
+ NPC_DARKMASTER_GANDLING = 1853,
+ NPC_BONE_MINION = 16119
};
enum GameobjectIds
diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp
index c76637224ae..10c4aedf103 100644
--- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp
+++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp
@@ -96,6 +96,7 @@ public:
void Initialize() override
{
+ SetHeaders(DataHeader);
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
uiAshGUID = 0;
diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp
index fb839650b86..a6e77a234c6 100644
--- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp
+++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp
@@ -164,16 +164,22 @@ public:
{
npc_arugal_voidwalkerAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiDarkOffering = urand(200, 1000);
+ }
+
InstanceScript* instance;
uint32 uiDarkOffering;
void Reset() override
{
- uiDarkOffering = urand(200, 1000);
+ Initialize();
}
void UpdateAI(uint32 uiDiff) override
diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h
index 0b399dc4050..669dfc3975d 100644
--- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h
+++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h
@@ -19,6 +19,8 @@
#ifndef DEF_SHADOWFANG_H
#define DEF_SHADOWFANG_H
+#define DataHeader "SK"
+
enum DataTypes
{
TYPE_FREE_NPC = 1,
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp
index de54e87fc97..85f5b51b52e 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp
@@ -75,9 +75,19 @@ public:
{
boss_baron_rivendareAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
}
+ void Initialize()
+ {
+ ShadowBolt_Timer = 5000;
+ Cleave_Timer = 8000;
+ MortalStrike_Timer = 12000;
+ // RaiseDead_Timer = 30000;
+ SummonSkeletons_Timer = 34000;
+ }
+
InstanceScript* instance;
uint32 ShadowBolt_Timer;
@@ -88,11 +98,7 @@ public:
void Reset() override
{
- ShadowBolt_Timer = 5000;
- Cleave_Timer = 8000;
- MortalStrike_Timer = 12000;
- // RaiseDead_Timer = 30000;
- SummonSkeletons_Timer = 34000;
+ Initialize();
if (instance->GetData(TYPE_RAMSTEIN) == DONE)
instance->SetData(TYPE_BARON, NOT_STARTED);
}
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp
index a3eb66ac23c..fa8f0f39563 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp
@@ -49,9 +49,18 @@ public:
{
boss_baroness_anastariAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
}
+ void Initialize()
+ {
+ BansheeWail_Timer = 1000;
+ BansheeCurse_Timer = 11000;
+ Silence_Timer = 13000;
+ //Possess_Timer = 35000;
+ }
+
InstanceScript* instance;
uint32 BansheeWail_Timer;
@@ -61,10 +70,7 @@ public:
void Reset() override
{
- BansheeWail_Timer = 1000;
- BansheeCurse_Timer = 11000;
- Silence_Timer = 13000;
- //Possess_Timer = 35000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
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 14d2a9a9f26..063081021fd 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp
@@ -92,7 +92,18 @@ public:
struct boss_cannon_master_willeyAI : public ScriptedAI
{
- boss_cannon_master_willeyAI(Creature* creature) : ScriptedAI(creature) { }
+ boss_cannon_master_willeyAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ Shoot_Timer = 1000;
+ Pummel_Timer = 7000;
+ KnockAway_Timer = 11000;
+ SummonRifleman_Timer = 15000;
+ }
uint32 KnockAway_Timer;
uint32 Pummel_Timer;
@@ -101,10 +112,7 @@ public:
void Reset() override
{
- Shoot_Timer = 1000;
- Pummel_Timer = 7000;
- KnockAway_Timer = 11000;
- SummonRifleman_Timer = 15000;
+ Initialize();
}
void JustDied(Unit* /*killer*/) override
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp
index f0a8c5c418f..1c7af67190f 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp
@@ -81,7 +81,23 @@ public:
struct boss_dathrohan_balnazzarAI : public ScriptedAI
{
- boss_dathrohan_balnazzarAI(Creature* creature) : ScriptedAI(creature) { }
+ boss_dathrohan_balnazzarAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ m_uiCrusadersHammer_Timer = 8000;
+ m_uiCrusaderStrike_Timer = 12000;
+ m_uiMindBlast_Timer = 6000;
+ m_uiHolyStrike_Timer = 18000;
+ m_uiShadowShock_Timer = 4000;
+ m_uiPsychicScream_Timer = 16000;
+ m_uiDeepSleep_Timer = 20000;
+ m_uiMindControl_Timer = 10000;
+ m_bTransformed = false;
+ }
uint32 m_uiCrusadersHammer_Timer;
uint32 m_uiCrusaderStrike_Timer;
@@ -95,15 +111,7 @@ public:
void Reset() override
{
- m_uiCrusadersHammer_Timer = 8000;
- m_uiCrusaderStrike_Timer = 12000;
- m_uiMindBlast_Timer = 6000;
- m_uiHolyStrike_Timer = 18000;
- m_uiShadowShock_Timer = 4000;
- m_uiPsychicScream_Timer = 16000;
- m_uiDeepSleep_Timer = 20000;
- m_uiMindControl_Timer = 10000;
- m_bTransformed = false;
+ Initialize();
if (me->GetEntry() == NPC_BALNAZZAR)
me->UpdateEntry(NPC_DATHROHAN);
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp
index 8b6f2da87e4..ddd51320b1c 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp
@@ -53,7 +53,19 @@ public:
struct boss_magistrate_barthilasAI : public ScriptedAI
{
- boss_magistrate_barthilasAI(Creature* creature) : ScriptedAI(creature) { }
+ boss_magistrate_barthilasAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ DrainingBlow_Timer = 20000;
+ CrowdPummel_Timer = 15000;
+ MightyBlow_Timer = 10000;
+ FuriousAnger_Timer = 5000;
+ AngerCount = 0;
+ }
uint32 DrainingBlow_Timer;
uint32 CrowdPummel_Timer;
@@ -63,11 +75,7 @@ public:
void Reset() override
{
- DrainingBlow_Timer = 20000;
- CrowdPummel_Timer = 15000;
- MightyBlow_Timer = 10000;
- FuriousAnger_Timer = 5000;
- AngerCount = 0;
+ Initialize();
if (me->IsAlive())
me->SetDisplayId(MODEL_NORMAL);
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 b3fae9821aa..68193ffd0c2 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp
@@ -50,9 +50,17 @@ public:
{
boss_maleki_the_pallidAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
}
+ void Initialize()
+ {
+ Frostbolt_Timer = 1000;
+ IceTomb_Timer = 16000;
+ DrainLife_Timer = 31000;
+ }
+
InstanceScript* instance;
uint32 Frostbolt_Timer;
@@ -61,9 +69,7 @@ public:
void Reset() override
{
- Frostbolt_Timer = 1000;
- IceTomb_Timer = 16000;
- DrainLife_Timer = 31000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp
index 1b5127a5e1c..1d3e28946be 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp
@@ -49,9 +49,18 @@ public:
{
boss_nerubenkanAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
}
+ void Initialize()
+ {
+ CryptScarabs_Timer = 3000;
+ EncasingWebs_Timer = 7000;
+ PierceArmor_Timer = 19000;
+ RaiseUndeadScarab_Timer = 3000;
+ }
+
InstanceScript* instance;
uint32 EncasingWebs_Timer;
@@ -61,10 +70,7 @@ public:
void Reset() override
{
- CryptScarabs_Timer = 3000;
- EncasingWebs_Timer = 7000;
- PierceArmor_Timer = 19000;
- RaiseUndeadScarab_Timer = 3000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
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 dfc3e570e1b..0a09bc85ea3 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
@@ -65,9 +65,16 @@ public:
{
boss_silver_hand_bossesAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ HolyLight_Timer = 20000;
+ DivineShield_Timer = 20000;
+ }
+
InstanceScript* instance;
uint32 HolyLight_Timer;
@@ -75,8 +82,7 @@ public:
void Reset() override
{
- HolyLight_Timer = 20000;
- DivineShield_Timer = 20000;
+ Initialize();
switch (me->GetEntry())
{
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 df9b6a04af4..531a4f3887a 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp
@@ -52,9 +52,16 @@ public:
{
boss_ramstein_the_gorgerAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
}
+ void Initialize()
+ {
+ Trample_Timer = 3000;
+ Knockout_Timer = 12000;
+ }
+
InstanceScript* instance;
uint32 Trample_Timer;
@@ -62,8 +69,7 @@ public:
void Reset() override
{
- Trample_Timer = 3000;
- Knockout_Timer = 12000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
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 a45b3594da0..f721fca8aab 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp
@@ -48,15 +48,23 @@ public:
struct boss_timmy_the_cruelAI : public ScriptedAI
{
- boss_timmy_the_cruelAI(Creature* creature) : ScriptedAI(creature) { }
+ boss_timmy_the_cruelAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ RavenousClaw_Timer = 10000;
+ HasYelled = false;
+ }
uint32 RavenousClaw_Timer;
bool HasYelled;
void Reset() override
{
- RavenousClaw_Timer = 10000;
- HasYelled = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp
index ecdc66d3e0f..43ce4d05297 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp
@@ -49,6 +49,7 @@ class instance_stratholme : public InstanceMapScript
{
instance_stratholme_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
}
uint32 EncounterState[MAX_ENCOUNTER];
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp
index 4109328afda..9c733677b42 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp
@@ -81,38 +81,6 @@ public:
};
/*######
-## npc_freed_soul
-######*/
-enum FreedSoul
-{
- SAY_ZAPPED = 0
-};
-
-class npc_freed_soul : public CreatureScript
-{
-public:
- npc_freed_soul() : CreatureScript("npc_freed_soul") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_freed_soulAI(creature);
- }
-
- struct npc_freed_soulAI : public ScriptedAI
- {
- npc_freed_soulAI(Creature* creature) : ScriptedAI(creature) { }
-
- void Reset() override
- {
- Talk(SAY_ZAPPED);
- }
-
- void EnterCombat(Unit* /*who*/) override { }
- };
-
-};
-
-/*######
## npc_restless_soul
######*/
@@ -142,7 +110,17 @@ public:
struct npc_restless_soulAI : public ScriptedAI
{
- npc_restless_soulAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_restless_soulAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ Tagger = 0;
+ Die_Timer = 5000;
+ Tagged = false;
+ }
uint64 Tagger;
uint32 Die_Timer;
@@ -150,9 +128,7 @@ public:
void Reset() override
{
- Tagger = 0;
- Die_Timer = 5000;
- Tagged = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
@@ -173,6 +149,9 @@ public:
void JustSummoned(Creature* summoned) override
{
summoned->CastSpell(summoned, SPELL_SOUL_FREED, false);
+
+ if (Player* player = ObjectAccessor::GetPlayer(*me, Tagger))
+ summoned->GetMotionMaster()->MoveFollow(player, 0.0f, 0.0f);
}
void JustDied(Unit* /*killer*/) override
@@ -224,15 +203,23 @@ public:
struct npc_spectral_ghostly_citizenAI : public ScriptedAI
{
- npc_spectral_ghostly_citizenAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_spectral_ghostly_citizenAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ Die_Timer = 5000;
+ Tagged = false;
+ }
uint32 Die_Timer;
bool Tagged;
void Reset() override
{
- Die_Timer = 5000;
- Tagged = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
@@ -302,7 +289,6 @@ public:
void AddSC_stratholme()
{
new go_gauntlet_gate();
- new npc_freed_soul();
new npc_restless_soul();
new npc_spectral_ghostly_citizen();
}
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h
index 9e4c88f5856..687512ea92d 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h
+++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h
@@ -19,6 +19,8 @@
#ifndef DEF_STRATHOLME_H
#define DEF_STRATHOLME_H
+#define DataHeader "STR"
+
enum DataTypes
{
TYPE_BARON_RUN = 1,
diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp b/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp
index 789a5c3a874..ee16a662711 100644
--- a/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp
+++ b/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp
@@ -60,6 +60,7 @@ public:
{
instance_sunken_temple_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
}
uint64 GOAtalaiStatue1;
diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h
index 394b1e3e8ae..bfd99e2afdd 100644
--- a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h
+++ b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h
@@ -19,6 +19,8 @@
#ifndef DEF_SUNKEN_TEMPLE_H
#define DEF_SUNKEN_TEMPLE_H
+#define DataHeader "ST"
+
#define TROLLBOSS1_DEATH 1
#define TROLLBOSS2_DEATH 2
#define TROLLBOSS3_DEATH 3
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
index eb9b6c2a1df..4e401be7df3 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
@@ -70,10 +70,26 @@ public:
{
boss_brutallusAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
Intro = true;
}
+ void Initialize()
+ {
+ SlashTimer = 11000;
+ StompTimer = 30000;
+ BurnTimer = 60000;
+ BerserkTimer = 360000;
+
+ IntroPhase = 0;
+ IntroPhaseTimer = 0;
+ IntroFrostBoltTimer = 0;
+
+ IsIntro = false;
+ Enraged = false;
+ }
+
InstanceScript* instance;
uint32 SlashTimer;
@@ -91,17 +107,7 @@ public:
void Reset() override
{
- SlashTimer = 11000;
- StompTimer = 30000;
- BurnTimer = 60000;
- BerserkTimer = 360000;
-
- IntroPhase = 0;
- IntroPhaseTimer = 0;
- IntroFrostBoltTimer = 0;
-
- IsIntro = false;
- Enraged = false;
+ Initialize();
DoCast(me, SPELL_DUAL_WIELD, true);
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
index 3701d37ed7f..d2382cda37d 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
@@ -82,9 +82,22 @@ public:
{
boss_sacrolashAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ ShadowbladesTimer = 10000;
+ ShadownovaTimer = 30000;
+ ConfoundingblowTimer = 25000;
+ ShadowimageTimer = 20000;
+ ConflagrationTimer = 30000;
+ EnrageTimer = 360000;
+ SisterDeath = false;
+ Enraged = false;
+ }
+
InstanceScript* instance;
bool SisterDeath;
@@ -111,13 +124,7 @@ public:
if (!me->IsInCombat())
{
- ShadowbladesTimer = 10000;
- ShadownovaTimer = 30000;
- ConfoundingblowTimer = 25000;
- ShadowimageTimer = 20000;
- ConflagrationTimer = 30000;
- EnrageTimer = 360000;
- SisterDeath = false;
+ Initialize();
}
instance->SetBossState(DATA_EREDAR_TWINS, NOT_STARTED);
@@ -319,12 +326,27 @@ public:
{
boss_alythessAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
SetCombatMovement(false);
instance = creature->GetInstanceScript();
IntroStepCounter = 10;
}
+ void Initialize()
+ {
+ ConflagrationTimer = 45000;
+ BlazeTimer = 100;
+ PyrogenicsTimer = 15000;
+ ShadownovaTimer = 40000;
+ EnrageTimer = 360000;
+ FlamesearTimer = 15000;
+ IntroYellTimer = 10000;
+
+ SisterDeath = false;
+ Enraged = false;
+ }
+
InstanceScript* instance;
bool SisterDeath;
@@ -354,15 +376,7 @@ public:
if (!me->IsInCombat())
{
- ConflagrationTimer = 45000;
- BlazeTimer = 100;
- PyrogenicsTimer = 15000;
- ShadownovaTimer = 40000;
- EnrageTimer = 360000;
- FlamesearTimer = 15000;
- IntroYellTimer = 10000;
-
- SisterDeath = false;
+ Initialize();
}
instance->SetBossState(DATA_EREDAR_TWINS, NOT_STARTED);
@@ -635,7 +649,17 @@ public:
struct npc_shadow_imageAI : public ScriptedAI
{
- npc_shadow_imageAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_shadow_imageAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ ShadowfuryTimer = 5000 + (rand32() % 15000);
+ DarkstrikeTimer = 3000;
+ KillTimer = 15000;
+ }
uint32 ShadowfuryTimer;
uint32 KillTimer;
@@ -644,9 +668,7 @@ public:
void Reset() override
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- ShadowfuryTimer = 5000 + (rand32() % 15000);
- DarkstrikeTimer = 3000;
- KillTimer = 15000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
index 120d3a0b231..4b17f698553 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
@@ -116,7 +116,17 @@ public:
{
boss_felmystAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
+ uiBreathCount = 0;
+ breathX = 0.f;
+ breathY = 0.f;
+ }
+
+ void Initialize()
+ {
+ phase = PHASE_NONE;
+ uiFlightCount = 0;
}
InstanceScript* instance;
@@ -130,12 +140,10 @@ public:
void Reset() override
{
- phase = PHASE_NONE;
+ Initialize();
events.Reset();
- uiFlightCount = 0;
-
me->SetDisableGravity(true);
me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10);
me->SetFloatValue(UNIT_FIELD_COMBATREACH, 10);
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
index b7e03fe0459..3284febb9f3 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
@@ -107,13 +107,30 @@ public:
{
boss_kalecgosAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
- SathGUID = 0;
- DoorGUID = 0;
bJustReset = false;
me->setActive(true);
}
+ void Initialize()
+ {
+ SathGUID = 0;
+ ArcaneBuffetTimer = 8000;
+ FrostBreathTimer = 15000;
+ WildMagicTimer = 10000;
+ TailLashTimer = 25000;
+ SpectralBlastTimer = urand(20000, 25000);
+ CheckTimer = 1000;
+ ResetTimer = 30000;
+
+ TalkTimer = 0;
+ TalkSequence = 0;
+ isFriendly = false;
+ isEnraged = false;
+ isBanished = false;
+ }
+
InstanceScript* instance;
uint32 ArcaneBuffetTimer;
@@ -132,7 +149,6 @@ public:
bool bJustReset;
uint64 SathGUID;
- uint64 DoorGUID;
void Reset() override
{
@@ -151,19 +167,6 @@ public:
me->SetStandState(UNIT_STAND_STATE_SLEEP);
}
me->SetFullHealth(); //dunno why it does not resets health at evade..
- ArcaneBuffetTimer = 8000;
- FrostBreathTimer = 15000;
- WildMagicTimer = 10000;
- TailLashTimer = 25000;
- SpectralBlastTimer = urand(20000, 25000);
- CheckTimer = 1000;
- ResetTimer = 30000;
-
- TalkTimer = 0;
- TalkSequence = 0;
- isFriendly = false;
- isEnraged = false;
- isBanished = false;
}
void EnterEvadeMode() override
@@ -459,13 +462,13 @@ public:
boss_kalecAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
+ SathGUID = 0;
}
- void Reset() override
+ void Initialize()
{
- SathGUID = instance->GetData64(DATA_SATHROVARR);
-
RevitalizeTimer = 5000;
HeroicStrikeTimer = 3000;
YellTimer = 5000;
@@ -474,6 +477,13 @@ public:
isEnraged = false;
}
+ void Reset() override
+ {
+ SathGUID = instance->GetData64(DATA_SATHROVARR);
+
+ Initialize();
+ }
+
void DamageTaken(Unit* done_by, uint32 &damage) override
{
if (done_by->GetGUID() != SathGUID)
@@ -581,11 +591,23 @@ public:
{
boss_sathrovarrAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
KalecGUID = 0;
KalecgosGUID = 0;
}
+ void Initialize()
+ {
+ ShadowBoltTimer = urand(7, 10) * 1000;
+ AgonyCurseTimer = 20000;
+ CorruptionStrikeTimer = 13000;
+ CheckTimer = 1000;
+ ResetThreat = 1000;
+ isEnraged = false;
+ isBanished = false;
+ }
+
InstanceScript* instance;
uint32 CorruptionStrikeTimer;
@@ -613,13 +635,7 @@ public:
KalecGUID = 0;
}
- ShadowBoltTimer = urand(7, 10) * 1000;
- AgonyCurseTimer = 20000;
- CorruptionStrikeTimer = 13000;
- CheckTimer = 1000;
- ResetThreat = 1000;
- isEnraged = false;
- isBanished = false;
+ Initialize();
me->CastSpell(me, AURA_DEMONIC_VISUAL, true);
TeleportAllPlayersBack();
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
index 1f66f834b28..79ebfa7b62b 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
@@ -243,17 +243,23 @@ public:
{
boss_kalecgos_kjAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ OrbsEmpowered = 0;
+ EmpowerCount = 0;
+ }
+
InstanceScript* instance;
uint8 OrbsEmpowered;
uint8 EmpowerCount;
void Reset() override
{
- OrbsEmpowered = 0;
- EmpowerCount = 0;
+ Initialize();
me->SetDisableGravity(true);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->setActive(true);
@@ -393,11 +399,21 @@ public:
{
npc_kiljaeden_controllerAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
+ Initialize();
instance = creature->GetInstanceScript();
SetCombatMovement(false);
}
+ void Initialize()
+ {
+ phase = PHASE_DECEIVERS;
+ deceiverDeathCount = 0;
+ bSummonedDeceivers = false;
+ bKiljaedenDeath = false;
+ uiRandomSayTimer = 30000;
+ }
+
InstanceScript* instance;
SummonList summons;
@@ -419,14 +435,10 @@ public:
void Reset() override
{
- phase = PHASE_DECEIVERS;
+ Initialize();
if (Creature* pKalecKJ = ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_KALECGOS_KJ)))
ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalecKJ->AI())->ResetOrbs();
- deceiverDeathCount = 0;
- bSummonedDeceivers = false;
- bKiljaedenDeath = false;
- uiRandomSayTimer = 30000;
summons.DespawnAll();
}
@@ -489,11 +501,48 @@ public:
{
boss_kiljaedenAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
+ Initialize();
instance = creature->GetInstanceScript();
+ speechPhaseEnd = 0;
SetCombatMovement(false);
}
+ void Initialize()
+ {
+ TimerIsDeactivated[TIMER_SPEECH] = false;
+ Timer[TIMER_SPEECH] = 0;
+
+ //Phase 2 Timer
+ Timer[TIMER_SOUL_FLAY] = 11000;
+ Timer[TIMER_LEGION_LIGHTNING] = 30000;
+ Timer[TIMER_FIRE_BLOOM] = 20000;
+ Timer[TIMER_SUMMON_SHILEDORB] = 35000;
+
+ //Phase 3 Timer
+ Timer[TIMER_SHADOW_SPIKE] = 4000;
+ Timer[TIMER_FLAME_DART] = 3000;
+ Timer[TIMER_DARKNESS] = 45000;
+ Timer[TIMER_ORBS_EMPOWER] = 35000;
+
+ //Phase 4 Timer
+ Timer[TIMER_ARMAGEDDON] = 2000;
+
+ ActiveTimers = 5;
+ WaitTimer = 0;
+ speechCount = 0;
+ SpeechTimer = 0;
+
+ Phase = PHASE_NORMAL;
+
+ IsInDarkness = false;
+ IsWaiting = false;
+ OrbActivated = false;
+ SpeechBegins = true;
+
+ ChangeTimers(false, 0);
+ }
+
InstanceScript* instance;
SummonList summons;
@@ -520,41 +569,12 @@ public:
void Reset() override
{
- TimerIsDeactivated[TIMER_SPEECH] = false;
- Timer[TIMER_SPEECH] = 0;
-
- //Phase 2 Timer
- Timer[TIMER_SOUL_FLAY] = 11000;
- Timer[TIMER_LEGION_LIGHTNING] = 30000;
- Timer[TIMER_FIRE_BLOOM] = 20000;
- Timer[TIMER_SUMMON_SHILEDORB] = 35000;
-
- //Phase 3 Timer
- Timer[TIMER_SHADOW_SPIKE] = 4000;
- Timer[TIMER_FLAME_DART] = 3000;
- Timer[TIMER_DARKNESS] = 45000;
- Timer[TIMER_ORBS_EMPOWER] = 35000;
-
- //Phase 4 Timer
- Timer[TIMER_ARMAGEDDON] = 2000;
-
- ActiveTimers = 5;
- WaitTimer = 0;
- speechCount = 0;
- SpeechTimer = 0;
-
- Phase = PHASE_NORMAL;
-
- IsInDarkness = false;
- IsWaiting = false;
- OrbActivated = false;
- SpeechBegins = true;
+ Initialize();
if (Creature* pKalec = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KALECGOS_KJ)))
pKalec->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES);
me->SetFloatValue(UNIT_FIELD_COMBATREACH, 12);
- ChangeTimers(false, 0);
summons.DespawnAll();
}
@@ -890,9 +910,17 @@ public:
{
npc_hand_of_the_deceiverAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ /// @todo Timers!
+ ShadowBoltVolleyTimer = urand(8000, 14000); // So they don't all cast it in the same moment.
+ FelfirePortalTimer = 20000;
+ }
+
InstanceScript* instance;
uint32 ShadowBoltVolleyTimer;
@@ -900,9 +928,7 @@ public:
void Reset() override
{
- /// @todo Timers!
- ShadowBoltVolleyTimer = urand(8000, 14000); // So they don't all cast it in the same moment.
- FelfirePortalTimer = 20000;
+ Initialize();
instance->SetBossState(DATA_KILJAEDEN, NOT_STARTED);
}
@@ -989,14 +1015,20 @@ public:
{
npc_felfire_portalAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
SetCombatMovement(false);
}
+ void Initialize()
+ {
+ uiSpawnFiendTimer = 5000;
+ }
+
uint32 uiSpawnFiendTimer;
void Reset() override
{
- uiSpawnFiendTimer = 5000;
+ Initialize();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE);
}
@@ -1034,7 +1066,16 @@ public:
struct npc_volatile_felfire_fiendAI : public ScriptedAI
{
- npc_volatile_felfire_fiendAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_volatile_felfire_fiendAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ uiExplodeTimer = 2000;
+ bLockedTarget = false;
+ }
uint32 uiExplodeTimer;
@@ -1042,8 +1083,7 @@ public:
void Reset() override
{
- uiExplodeTimer = 2000;
- bLockedTarget = false;
+ Initialize();
}
void DamageTaken(Unit* /*done_by*/, uint32 &damage) override
@@ -1093,16 +1133,22 @@ public:
{
npc_armageddonAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
SetCombatMovement(false);
}
+ void Initialize()
+ {
+ spell = 0;
+ uiTimer = 0;
+ }
+
uint8 spell;
uint32 uiTimer;
void Reset() override
{
- spell = 0;
- uiTimer = 0;
+ Initialize();
}
void UpdateAI(uint32 diff) override
@@ -1150,7 +1196,22 @@ public:
{
npc_shield_orbAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
+ x = 0.f;
+ y = 0.f;
+ }
+
+ void Initialize()
+ {
+ bPointReached = true;
+ uiTimer = urand(500, 1000);
+ uiCheckTimer = 1000;
+ r = 17;
+ c = 0;
+ mx = ShieldOrbLocations[0][0];
+ my = ShieldOrbLocations[0][1];
+ bClockwise = roll_chance_i(50);
}
InstanceScript* instance;
@@ -1164,14 +1225,7 @@ public:
void Reset() override
{
me->SetDisableGravity(true);
- bPointReached = true;
- uiTimer = urand(500, 1000);
- uiCheckTimer = 1000;
- r = 17;
- c = 0;
- mx = ShieldOrbLocations[0][0];
- my = ShieldOrbLocations[0][1];
- bClockwise = roll_chance_i(50);
+ Initialize();
}
void UpdateAI(uint32 diff) override
@@ -1235,12 +1289,12 @@ public:
struct npc_sinster_reflectionAI : public ScriptedAI
{
- npc_sinster_reflectionAI(Creature* creature) : ScriptedAI(creature) { }
-
- uint8 victimClass;
- uint32 uiTimer[3];
+ npc_sinster_reflectionAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
uiTimer[0] = 0;
uiTimer[1] = 0;
@@ -1248,6 +1302,14 @@ public:
victimClass = 0;
}
+ uint8 victimClass;
+ uint32 uiTimer[3];
+
+ void Reset() override
+ {
+ Initialize();
+ }
+
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
index 6ccce62cb6f..823423fc3a8 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
@@ -74,71 +74,51 @@ enum Spells
SPELL_BLACKHOLE_GROW = 46228
};
-enum BossTimers
+enum Events
{
- TIMER_DARKNESS = 0,
- TIMER_HUMANOIDES = 1,
- TIMER_PHASE = 2,
- TIMER_SENTINEL = 3
+ // M'uru
+ EVENT_DARKNESS = 1,
+ EVENT_SUMMON_HUMANOIDS,
+ EVENT_SUMMON_SENTINEL,
+ EVENT_PHASE_TRANSITION, // Delayed phase transition.
+ EVENT_ENRAGE,
+
+ // Entropius
+ EVENT_SUMMON_BLACK_HOLE
};
-float DarkFiends[8][4] =
+enum Phases
{
- {1819.9f, 609.80f, 69.74f, 1.94f},
- {1829.39f, 617.89f, 69.73f, 2.61f},
- {1801.98f, 633.62f, 69.74f, 5.71f},
- {1830.88f, 629.99f, 69.73f, 3.52f},
- {1800.38f, 621.41f, 69.74f, 0.22f},
- {1808.3f, 612.45f, 69.73f, 1.02f},
- {1823.9f, 639.69f, 69.74f, 4.12f},
- {1811.85f, 640.46f, 69.73f, 4.97f}
+ PHASE_ONE = 1,
+ PHASE_TWO,
};
-float Humanoides[6][5] =
+enum CreatureGroups
{
- {NPC_FURY_MAGE, 1780.16f, 666.83f, 71.19f, 5.21f},
- {NPC_FURY_MAGE, 1847.93f, 600.30f, 71.30f, 2.57f},
- {NPC_BERSERKER, 1779.97f, 660.64f, 71.19f, 5.28f},
- {NPC_BERSERKER, 1786.2f, 661.01f, 71.19f, 4.51f},
- {NPC_BERSERKER, 1845.17f, 602.63f, 71.28f, 2.43f},
- {NPC_BERSERKER, 1842.91f, 599.93f, 71.23f, 2.44f}
+ CREATURE_GROUP_HUMANOIDS,
+ CREATURE_GROUP_DARKFIENDS
};
-uint32 EnrageTimer = 600000;
-
class boss_entropius : public CreatureScript
{
public:
boss_entropius() : CreatureScript("boss_entropius") { }
- struct boss_entropiusAI : public ScriptedAI
+ struct boss_entropiusAI : public BossAI
{
- boss_entropiusAI(Creature* creature) : ScriptedAI(creature), Summons(me)
- {
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
- SummonList Summons;
-
- uint32 BlackHoleSummonTimer;
+ boss_entropiusAI(Creature* creature) : BossAI(creature, DATA_MURU) { }
void Reset() override
{
- BlackHoleSummonTimer = 15000;
- DoCastAOE(SPELL_NEGATIVE_ENERGY_E, false);
-
- Summons.DespawnAll();
-
- instance->SetBossState(DATA_MURU, NOT_STARTED);
+ DoCastAOE(SPELL_NEGATIVE_ENERGY_E);
}
void EnterCombat(Unit* /*who*/) override
{
+ _EnterCombat();
DoCastAOE(SPELL_NEGATIVE_ENERGY_E, true);
- DoCast(me, SPELL_ENTROPIUS_SPAWN, false);
-
- instance->SetBossState(DATA_MURU, IN_PROGRESS);
+ DoCast(me, SPELL_ENTROPIUS_SPAWN);
+ events.ScheduleEvent(EVENT_SUMMON_BLACK_HOLE, 15000);
}
void JustSummoned(Creature* summoned) override
@@ -146,7 +126,7 @@ public:
switch (summoned->GetEntry())
{
case NPC_DARK_FIENDS:
- summoned->CastSpell(summoned, SPELL_DARKFIEND_VISUAL, false);
+ summoned->CastSpell(summoned, SPELL_DARKFIEND_VISUAL);
break;
case NPC_DARKNESS:
summoned->AddUnitState(UNIT_STATE_STUNNED);
@@ -156,42 +136,27 @@ public:
break;
}
summoned->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true));
- Summons.Summon(summoned);
+ summons.Summon(summoned);
}
- void JustDied(Unit* /*killer*/) override
+ void ExecuteEvent(uint32 eventId) override
{
- Summons.DespawnAll();
- instance->SetBossState(DATA_MURU, DONE);
+ if (eventId == EVENT_SUMMON_BLACK_HOLE)
+ {
+ if (Unit* random = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
+ DoCast(random, SPELL_DARKNESS_E);
+ if (Unit* random = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
+ random->CastSpell(random, SPELL_BLACKHOLE);
+ events.ScheduleEvent(EVENT_SUMMON_BLACK_HOLE, 15000);
+ }
}
- void UpdateAI(uint32 diff) override
+ void EnterEvadeMode() override
{
- if (!UpdateVictim())
- return;
-
- if (EnrageTimer < diff && !me->HasAura(SPELL_ENRAGE, 0))
- {
- DoCast(me, SPELL_ENRAGE, false);
- } else EnrageTimer -= diff;
-
- if (BlackHoleSummonTimer <= diff)
- {
- Unit* random = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
- if (!random)
- return;
-
- DoCast(random, SPELL_DARKNESS_E, false);
-
- random = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
- if (!random)
- return;
-
- random->CastSpell(random, SPELL_BLACKHOLE, false);
- BlackHoleSummonTimer = 15000;
- } else BlackHoleSummonTimer -= diff;
-
- DoMeleeAttackIfReady();
+ if (Creature* muru = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MURU)))
+ muru->AI()->Reset(); // Reset encounter.
+ me->DisappearAndDie();
+ summons.DespawnAll();
}
};
@@ -206,58 +171,51 @@ class boss_muru : public CreatureScript
public:
boss_muru() : CreatureScript("boss_muru") { }
- struct boss_muruAI : public ScriptedAI
+ struct boss_muruAI : public BossAI
{
- boss_muruAI(Creature* creature) : ScriptedAI(creature), Summons(creature)
+ boss_muruAI(Creature* creature) : BossAI(creature, DATA_MURU)
{
+ Initialize();
SetCombatMovement(false);
- instance = creature->GetInstanceScript();
}
- InstanceScript* instance;
- SummonList Summons;
-
- uint8 Phase;
- uint32 Timer[4];
-
- bool DarkFiend;
-
- void Reset() override
+ void Initialize()
{
DarkFiend = false;
- Phase = 1;
-
- EnrageTimer = 600000;
- Timer[TIMER_DARKNESS] = 45000;
- Timer[TIMER_HUMANOIDES] = 10000;
- Timer[TIMER_PHASE] = 2000;
- Timer[TIMER_SENTINEL] = 31500;
+ HasEnraged = false;
+ EntropiusGUID = 0;
+ }
+ void Reset() override
+ {
+ Initialize();
+ _Reset();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetVisible(true);
-
- Summons.DespawnAll();
- instance->SetBossState(DATA_MURU, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) override
{
- DoCastAOE(SPELL_NEGATIVE_ENERGY, false);
- instance->SetBossState(DATA_MURU, IN_PROGRESS);
+ _EnterCombat();
+ events.SetPhase(PHASE_ONE);
+ events.ScheduleEvent(EVENT_ENRAGE, 600000);
+ events.ScheduleEvent(EVENT_DARKNESS, 45000, 0, PHASE_ONE);
+ events.ScheduleEvent(EVENT_SUMMON_HUMANOIDS, 10000, 0, PHASE_ONE);
+ events.ScheduleEvent(EVENT_SUMMON_SENTINEL, 31500, 0, PHASE_ONE);
+ DoCastAOE(SPELL_NEGATIVE_ENERGY);
}
void DamageTaken(Unit* /*done_by*/, uint32 &damage) override
{
- if (damage > me->GetHealth() && Phase == 1)
+ if (damage > me->GetHealth() && events.IsInPhase(PHASE_ONE))
{
damage = 0;
- Phase = 2;
me->RemoveAllAuras();
- DoCast(me, SPELL_OPEN_ALL_PORTALS, false);
+ DoCast(me, SPELL_OPEN_ALL_PORTALS);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ events.SetPhase(PHASE_TWO);
+ events.ScheduleEvent(EVENT_PHASE_TRANSITION, 2000);
}
- if (Phase > 1 && Phase < 4)
- damage = 0;
}
void JustSummoned(Creature* summoned) override
@@ -266,96 +224,61 @@ public:
{
case NPC_ENTROPIUS:
me->SetVisible(false);
+ EntropiusGUID = summoned->GetGUID();
+ if (HasEnraged) // If we hit phase transition while enraged, enrage Entropius as well.
+ summoned->CastSpell(summoned, SPELL_ENRAGE);
break;
case NPC_DARK_FIENDS:
- summoned->CastSpell(summoned, SPELL_DARKFIEND_VISUAL, false);
+ summoned->CastSpell(summoned, SPELL_DARKFIEND_VISUAL);
break;
}
summoned->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true));
- Summons.Summon(summoned);
+ summons.Summon(summoned);
}
- void UpdateAI(uint32 diff) override
+ void ExecuteEvent(uint32 eventId) override
{
- if (!UpdateVictim())
- return;
-
- if (Phase == 3)
+ switch (eventId)
{
- if (Timer[TIMER_PHASE] <= diff)
- {
- switch (instance->GetBossState(DATA_MURU))
+ case EVENT_DARKNESS:
+ if (!DarkFiend)
{
- case NOT_STARTED:
- Reset();
- break;
- case DONE:
- Phase = 4;
- me->DisappearAndDie();
- break;
- default:
- break;
+ DarkFiend = true;
+ DoCastAOE(SPELL_DARKNESS);
}
- Timer[TIMER_PHASE] = 3000;
- } else Timer[TIMER_PHASE] -= diff;
- return;
- }
-
- if (EnrageTimer < diff && !me->HasAura(SPELL_ENRAGE, 0))
- {
- DoCast(me, SPELL_ENRAGE, false);
- } else EnrageTimer -= diff;
-
- for (uint8 i = 0; i < 4; ++i)
- {
- if (Timer[i] <= diff)
- {
- switch (i)
+ else
{
- case TIMER_DARKNESS:
- if (!DarkFiend)
- {
- DoCastAOE(SPELL_DARKNESS, false);
- Timer[TIMER_DARKNESS] = 3000;
- DarkFiend = true;
- }
- else
- {
- DarkFiend = false;
- for (uint8 j = 0; j < 8; ++j)
- me->SummonCreature(NPC_DARK_FIENDS, DarkFiends[j][0], DarkFiends[j][1], DarkFiends[j][2], DarkFiends[j][3], TEMPSUMMON_CORPSE_DESPAWN, 0);
- Timer[TIMER_DARKNESS] = 42000;
- }
- break;
- case TIMER_HUMANOIDES:
- for (uint8 j = 0; j < 6; ++j)
- me->SummonCreature(uint32(Humanoides[j][0]), Humanoides[j][1], Humanoides[j][2], Humanoides[j][3], Humanoides[j][4], TEMPSUMMON_CORPSE_DESPAWN, 0);
- Timer[TIMER_HUMANOIDES] = 60000;
- break;
- case TIMER_PHASE:
- me->RemoveAllAuras();
- DoCast(me, SPELL_SUMMON_ENTROPIUS, false);
- Timer[TIMER_PHASE] = 3000;
- Phase = 3;
- return;
- case TIMER_SENTINEL:
- DoCastAOE(SPELL_OPEN_PORTAL_2, false);
- Timer[TIMER_SENTINEL] = 30000;
- break;
+ DarkFiend = false;
+ me->SummonCreatureGroup(CREATURE_GROUP_DARKFIENDS);
}
+ events.ScheduleEvent(EVENT_DARKNESS, DarkFiend ? 3000 : 42000, 0, PHASE_ONE);
+ break;
+ case EVENT_SUMMON_HUMANOIDS:
+ me->SummonCreatureGroup(CREATURE_GROUP_DARKFIENDS);
+ events.ScheduleEvent(EVENT_SUMMON_HUMANOIDS, 60000, 0, PHASE_ONE);
+ break;
+ case EVENT_SUMMON_SENTINEL:
+ DoCastAOE(SPELL_OPEN_PORTAL_2);
+ events.ScheduleEvent(EVENT_SUMMON_SENTINEL, 30000, 0, PHASE_ONE);
+ break;
+ case EVENT_PHASE_TRANSITION:
+ DoCast(me, SPELL_SUMMON_ENTROPIUS);
+ break;
+ case EVENT_ENRAGE:
+ if (Creature* entropius = ObjectAccessor::GetCreature(*me, EntropiusGUID))
+ entropius->CastSpell(entropius, SPELL_ENRAGE);
+ DoCast(me, SPELL_ENRAGE);
+ HasEnraged = true;
+ break;
+ default:
break;
- }
- }
-
- // Timer
- for (uint8 i = 0; i < 4; ++i)
- {
- if (i != TIMER_PHASE)
- Timer[i] -= diff;
- else if (Phase == 2)
- Timer[i] -= diff;
}
}
+
+ private:
+ bool DarkFiend;
+ bool HasEnraged;
+ uint64 EntropiusGUID;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -378,10 +301,19 @@ public:
{
npc_muru_portalAI(Creature* creature) : ScriptedAI(creature), Summons(creature)
{
+ Initialize();
SetCombatMovement(false);
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ SummonTimer = 5000;
+
+ InAction = false;
+ SummonSentinel = false;
+ }
+
InstanceScript* instance;
SummonList Summons;
@@ -393,10 +325,7 @@ public:
void Reset() override
{
- SummonTimer = 5000;
-
- InAction = false;
- SummonSentinel = false;
+ Initialize();
me->AddUnitState(UNIT_STATE_STUNNED);
@@ -405,8 +334,8 @@ public:
void JustSummoned(Creature* summoned) override
{
- if (Player* Target = ObjectAccessor::GetPlayer(*me, instance->GetData64(DATA_PLAYER_GUID)))
- summoned->AI()->AttackStart(Target);
+ if (Player* target = ObjectAccessor::GetPlayer(*me, instance->GetData64(DATA_PLAYER_GUID)))
+ summoned->AI()->AttackStart(target);
Summons.Summon(summoned);
}
@@ -415,15 +344,15 @@ public:
{
float x, y, z, o;
me->GetHomePosition(x, y, z, o);
- DoTeleportTo(x, y, z);
+ me->NearTeleportTo(x, y, z, o);
InAction = true;
switch (Spell->Id)
{
case SPELL_OPEN_ALL_PORTALS:
- DoCastAOE(SPELL_OPEN_PORTAL, false);
+ DoCastAOE(SPELL_OPEN_PORTAL);
break;
case SPELL_OPEN_PORTAL_2:
- DoCastAOE(SPELL_OPEN_PORTAL, false);
+ DoCastAOE(SPELL_OPEN_PORTAL);
SummonSentinel = true;
break;
}
@@ -460,15 +389,23 @@ public:
struct npc_dark_fiendAI : public ScriptedAI
{
- npc_dark_fiendAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_dark_fiendAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ WaitTimer = 2000;
+ InAction = false;
+ }
uint32 WaitTimer;
bool InAction;
void Reset() override
{
- WaitTimer = 2000;
- InAction = false;
+ Initialize();
me->AddUnitState(UNIT_STATE_STUNNED);
}
@@ -521,25 +458,34 @@ public:
struct npc_void_sentinelAI : public ScriptedAI
{
- npc_void_sentinelAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_void_sentinelAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ PulseTimer = 3000;
+ VoidBlastTimer = 45000; //is this a correct timer?
+ }
uint32 PulseTimer;
uint32 VoidBlastTimer;
void Reset() override
{
- PulseTimer = 3000;
- VoidBlastTimer = 45000; //is this a correct timer?
+ Initialize();
float x, y, z, o;
me->GetHomePosition(x, y, z, o);
- DoTeleportTo(x, y, 71);
+ me->NearTeleportTo(x, y, 71, o);
}
- void JustDied(Unit* /*killer*/) override
+ void JustDied(Unit* killer) override
{
for (uint8 i = 0; i < 8; ++i)
- me->SummonCreature(NPC_VOID_SPAWN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), float(rand32() % 6), TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 180000);
+ if (Creature* temp = me->SummonCreature(NPC_VOID_SPAWN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), float(rand32() % 6), TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 180000))
+ temp->AI()->AttackStart(killer);
}
void UpdateAI(uint32 diff) override
@@ -578,9 +524,18 @@ public:
{
npc_blackholeAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ DespawnTimer = 15000;
+ SpellTimer = 5000;
+ Phase = 0;
+ NeedForAHack = 0;
+ }
+
InstanceScript* instance;
uint32 DespawnTimer;
@@ -590,10 +545,7 @@ public:
void Reset() override
{
- DespawnTimer = 15000;
- SpellTimer = 5000;
- Phase = 0;
- NeedForAHack = 0;
+ Initialize();
me->AddUnitState(UNIT_STATE_STUNNED);
DoCastAOE(SPELL_BLACKHOLE_SPAWN, true);
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp
index 5a411d504aa..2066c4309b2 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp
@@ -49,6 +49,7 @@ class instance_sunwell_plateau : public InstanceMapScript
{
instance_sunwell_plateau_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
@@ -212,67 +213,24 @@ class instance_sunwell_plateau : public InstanceMapScript
return 0;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "S P " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(char const* str) override
- {
- 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 == 'P')
- {
- for (uint32 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
- protected:
- uint64 KalecgosDragonGUID;
- uint64 KalecgosHumanGUID;
- uint64 SathrovarrGUID;
- uint64 BrutallusGUID;
- uint64 MadrigosaGUID;
- uint64 FelmystGUID;
- uint64 AlythessGUID;
- uint64 SacrolashGUID;
- uint64 MuruGUID;
- uint64 KilJaedenGUID;
- uint64 KilJaedenControllerGUID;
- uint64 AnveenaGUID;
- uint64 KalecgosKjGUID;
- uint32 SpectralPlayers;
-
- uint32 SpectralRealmTimer;
- std::vector<uint64> SpectralRealmList;
+ protected:
+ uint64 KalecgosDragonGUID;
+ uint64 KalecgosHumanGUID;
+ uint64 SathrovarrGUID;
+ uint64 BrutallusGUID;
+ uint64 MadrigosaGUID;
+ uint64 FelmystGUID;
+ uint64 AlythessGUID;
+ uint64 SacrolashGUID;
+ uint64 MuruGUID;
+ uint64 KilJaedenGUID;
+ uint64 KilJaedenControllerGUID;
+ uint64 AnveenaGUID;
+ uint64 KalecgosKjGUID;
+ uint32 SpectralPlayers;
+
+ uint32 SpectralRealmTimer;
+ std::vector<uint64> SpectralRealmList;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h
index d32cdb037b2..e6aed3eddf7 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h
@@ -19,6 +19,7 @@
#define SUNWELL_PLATEAU_H
#define SunwellPlateauScriptName "instance_sunwell_plateau"
+#define DataHeader "SWP"
uint32 const EncounterCount = 6;
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
index f06dc247883..f82d71901ac 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
@@ -64,9 +64,21 @@ class boss_archaedas : public CreatureScript
{
boss_archaedasAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiTremorTimer = 60000;
+ iAwakenTimer = 0;
+ uiWallMinionTimer = 10000;
+
+ bWakingUp = false;
+ bGuardiansAwake = false;
+ bVaultWalkersAwake = false;
+ }
+
uint32 uiTremorTimer;
int32 iAwakenTimer;
uint32 uiWallMinionTimer;
@@ -78,13 +90,7 @@ class boss_archaedas : public CreatureScript
void Reset() override
{
- uiTremorTimer = 60000;
- iAwakenTimer = 0;
- uiWallMinionTimer = 10000;
-
- bWakingUp = false;
- bGuardiansAwake = false;
- bVaultWalkersAwake = false;
+ Initialize();
instance->SetData(0, 5); // respawn any dead minions
me->setFaction(35);
@@ -224,9 +230,19 @@ class npc_archaedas_minions : public CreatureScript
{
npc_archaedas_minionsAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiArcing_Timer = 3000;
+ iAwakenTimer = 0;
+
+ bWakingUp = false;
+ bAmIAwake = false;
+ }
+
uint32 uiArcing_Timer;
int32 iAwakenTimer;
bool bWakingUp;
@@ -236,11 +252,7 @@ class npc_archaedas_minions : public CreatureScript
void Reset() override
{
- uiArcing_Timer = 3000;
- iAwakenTimer = 0;
-
- bWakingUp = false;
- bAmIAwake = false;
+ Initialize();
me->setFaction(35);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp b/src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp
index 13a475604a7..6062f01691c 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp
@@ -45,7 +45,17 @@ class boss_ironaya : public CreatureScript
struct boss_ironayaAI : public ScriptedAI
{
- boss_ironayaAI(Creature* creature) : ScriptedAI(creature) { }
+ boss_ironayaAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ uiArcingTimer = 3000;
+ bHasCastKnockaway = false;
+ bHasCastWstomp = false;
+ }
uint32 uiArcingTimer;
bool bHasCastWstomp;
@@ -53,9 +63,7 @@ class boss_ironaya : public CreatureScript
void Reset() override
{
- uiArcingTimer = 3000;
- bHasCastKnockaway = false;
- bHasCastWstomp = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp
index 56c84677181..17a6440702e 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp
@@ -49,6 +49,7 @@ class instance_uldaman : public InstanceMapScript
void Initialize() override
{
+ SetHeaders(DataHeader);
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
archaedasGUID = 0;
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
index fdb71cbbf83..236cc55eee8 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
@@ -54,13 +54,21 @@ class npc_jadespine_basilisk : public CreatureScript
struct npc_jadespine_basiliskAI : public ScriptedAI
{
- npc_jadespine_basiliskAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_jadespine_basiliskAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ uiCslumberTimer = 2000;
+ }
uint32 uiCslumberTimer;
void Reset() override
{
- uiCslumberTimer = 2000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h
index 6f17fae0162..8697172fcb9 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h
+++ b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h
@@ -19,6 +19,8 @@
#ifndef DEF_ULDAMAN_H
#define DEF_ULDAMAN_H
+#define DataHeader "UD"
+
#define MAX_ENCOUNTER 3
enum DataTypes
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
index b55a9cc74d6..b15fdd85a00 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
@@ -88,19 +88,24 @@ class boss_akilzon : public CreatureScript
{
boss_akilzonAI(Creature* creature) : BossAI(creature, DATA_AKILZONEVENT)
{
- memset(BirdGUIDs, 0, sizeof(BirdGUIDs));
+ Initialize();
}
- void Reset() override
+ void Initialize()
{
- _Reset();
-
TargetGUID = 0;
CloudGUID = 0;
CycloneGUID = 0;
memset(BirdGUIDs, 0, sizeof(BirdGUIDs));
StormCount = 0;
isRaining = false;
+ }
+
+ void Reset() override
+ {
+ _Reset();
+
+ Initialize();
SetWeather(WEATHER_STATE_FINE, 0.0f);
}
@@ -380,7 +385,17 @@ class npc_akilzon_eagle : public CreatureScript
struct npc_akilzon_eagleAI : public ScriptedAI
{
- npc_akilzon_eagleAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_akilzon_eagleAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ EagleSwoop_Timer = urand(5000, 10000);
+ arrived = true;
+ TargetGUID = 0;
+ }
uint32 EagleSwoop_Timer;
bool arrived;
@@ -388,9 +403,7 @@ class npc_akilzon_eagle : public CreatureScript
void Reset() override
{
- EagleSwoop_Timer = urand(5000, 10000);
- arrived = true;
- TargetGUID = 0;
+ Initialize();
me->SetDisableGravity(true);
}
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp
index 74ce267441f..0cf1f932f10 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp
@@ -74,7 +74,21 @@ class boss_halazzi : public CreatureScript
{
boss_halazziAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
+ Initialize();
instance = creature->GetInstanceScript();
+ Phase = PHASE_NONE;
+ FrenzyTimer = 0;
+ SaberlashTimer = 0;
+ ShockTimer = 0;
+ TotemTimer = 0;
+ }
+
+ void Initialize()
+ {
+ LynxGUID = 0;
+ TransformCount = 0;
+ BerserkTimer = 600000;
+ CheckTimer = 1000;
}
InstanceScript* instance;
@@ -96,10 +110,7 @@ class boss_halazzi : public CreatureScript
instance->SetData(DATA_HALAZZIEVENT, NOT_STARTED);
summons.DespawnAll();
- LynxGUID = 0;
- TransformCount = 0;
- BerserkTimer = 600000;
- CheckTimer = 1000;
+ Initialize();
DoCast(me, SPELL_DUAL_WIELD, true);
@@ -321,15 +332,23 @@ class npc_halazzi_lynx : public CreatureScript
struct npc_halazzi_lynxAI : public ScriptedAI
{
- npc_halazzi_lynxAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_halazzi_lynxAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ FrenzyTimer = urand(30000, 50000); //frenzy every 30-50 seconds
+ shredder_timer = 4000;
+ }
uint32 FrenzyTimer;
uint32 shredder_timer;
void Reset() override
{
- FrenzyTimer = urand(30000, 50000); //frenzy every 30-50 seconds
- shredder_timer = 4000;
+ Initialize();
}
void DamageTaken(Unit* /*done_by*/, uint32 &damage) override
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
index 0fee04f0d20..3c9d4397d24 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
@@ -254,10 +254,23 @@ class boss_hexlord_malacrass : public CreatureScript
{
boss_hex_lord_malacrassAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
SelectAddEntry();
for (uint8 i = 0; i < 4; ++i)
AddGUID[i] = 0;
+ PlayerGUID = 0;
+ PlayerClass = CLASS_NONE;
+ }
+
+ void Initialize()
+ {
+ SpiritBolts_Timer = 20000;
+ DrainPower_Timer = 60000;
+ SiphonSoul_Timer = 100000;
+ PlayerAbility_Timer = 99999;
+ CheckAddState_Timer = 5000;
+ ResetTimer = 5000;
}
InstanceScript* instance;
@@ -280,12 +293,7 @@ class boss_hexlord_malacrass : public CreatureScript
{
instance->SetData(DATA_HEXLORDEVENT, NOT_STARTED);
- SpiritBolts_Timer = 20000;
- DrainPower_Timer = 60000;
- SiphonSoul_Timer = 100000;
- PlayerAbility_Timer = 99999;
- CheckAddState_Timer = 5000;
- ResetTimer = 5000;
+ Initialize();
SpawnAdds();
@@ -523,15 +531,23 @@ class boss_thurg : public CreatureScript
struct boss_thurgAI : public boss_hexlord_addAI
{
- boss_thurgAI(Creature* creature) : boss_hexlord_addAI(creature) { }
+ boss_thurgAI(Creature* creature) : boss_hexlord_addAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ bloodlust_timer = 15000;
+ cleave_timer = 10000;
+ }
uint32 bloodlust_timer;
uint32 cleave_timer;
void Reset() override
{
- bloodlust_timer = 15000;
- cleave_timer = 10000;
+ Initialize();
boss_hexlord_addAI::Reset();
}
@@ -580,15 +596,23 @@ class boss_alyson_antille : public CreatureScript
struct boss_alyson_antilleAI : public boss_hexlord_addAI
{
//Holy Priest
- boss_alyson_antilleAI(Creature* creature) : boss_hexlord_addAI(creature) { }
+ boss_alyson_antilleAI(Creature* creature) : boss_hexlord_addAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ flashheal_timer = 2500;
+ dispelmagic_timer = 10000;
+ }
uint32 flashheal_timer;
uint32 dispelmagic_timer;
void Reset() override
{
- flashheal_timer = 2500;
- dispelmagic_timer = 10000;
+ Initialize();
//AcquireGUID();
@@ -667,13 +691,21 @@ class boss_alyson_antille : public CreatureScript
struct boss_gazakrothAI : public boss_hexlord_addAI
{
- boss_gazakrothAI(Creature* creature) : boss_hexlord_addAI(creature) { }
+ boss_gazakrothAI(Creature* creature) : boss_hexlord_addAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ firebolt_timer = 2000;
+ }
uint32 firebolt_timer;
void Reset() override
{
- firebolt_timer = 2000;
+ Initialize();
boss_hexlord_addAI::Reset();
}
@@ -718,15 +750,23 @@ class boss_lord_raadan : public CreatureScript
struct boss_lord_raadanAI : public boss_hexlord_addAI
{
- boss_lord_raadanAI(Creature* creature) : boss_hexlord_addAI(creature) { }
+ boss_lord_raadanAI(Creature* creature) : boss_hexlord_addAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ flamebreath_timer = 8000;
+ thunderclap_timer = 13000;
+ }
uint32 flamebreath_timer;
uint32 thunderclap_timer;
void Reset() override
{
- flamebreath_timer = 8000;
- thunderclap_timer = 13000;
+ Initialize();
boss_hexlord_addAI::Reset();
@@ -769,13 +809,21 @@ class boss_darkheart : public CreatureScript
struct boss_darkheartAI : public boss_hexlord_addAI
{
- boss_darkheartAI(Creature* creature) : boss_hexlord_addAI(creature) { }
+ boss_darkheartAI(Creature* creature) : boss_hexlord_addAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ psychicwail_timer = 8000;
+ }
uint32 psychicwail_timer;
void Reset() override
{
- psychicwail_timer = 8000;
+ Initialize();
boss_hexlord_addAI::Reset();
}
void UpdateAI(uint32 diff) override
@@ -811,13 +859,21 @@ class boss_slither : public CreatureScript
struct boss_slitherAI : public boss_hexlord_addAI
{
- boss_slitherAI(Creature* creature) : boss_hexlord_addAI(creature) { }
+ boss_slitherAI(Creature* creature) : boss_hexlord_addAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ venomspit_timer = 5000;
+ }
uint32 venomspit_timer;
void Reset() override
{
- venomspit_timer = 5000;
+ Initialize();
boss_hexlord_addAI::Reset();
}
@@ -869,13 +925,21 @@ class boss_fenstalker : public CreatureScript
struct boss_fenstalkerAI : public boss_hexlord_addAI
{
- boss_fenstalkerAI(Creature* creature) : boss_hexlord_addAI(creature) { }
+ boss_fenstalkerAI(Creature* creature) : boss_hexlord_addAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ volatileinf_timer = 15000;
+ }
uint32 volatileinf_timer;
void Reset() override
{
- volatileinf_timer = 15000;
+ Initialize();
boss_hexlord_addAI::Reset();
}
@@ -913,15 +977,23 @@ class boss_koragg : public CreatureScript
struct boss_koraggAI : public boss_hexlord_addAI
{
- boss_koraggAI(Creature* creature) : boss_hexlord_addAI(creature) { }
+ boss_koraggAI(Creature* creature) : boss_hexlord_addAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ coldstare_timer = 15000;
+ mightyblow_timer = 10000;
+ }
uint32 coldstare_timer;
uint32 mightyblow_timer;
void Reset() override
{
- coldstare_timer = 15000;
- mightyblow_timer = 10000;
+ Initialize();
boss_hexlord_addAI::Reset();
}
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
index d5260c18add..2e434ed6ab5 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
@@ -121,9 +121,29 @@ class boss_janalai : public CreatureScript
{
boss_janalaiAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ FireBreathTimer = 8000;
+ BombTimer = 30000;
+ BombSequenceTimer = 1000;
+ BombCount = 0;
+ HatcherTimer = 10000;
+ EnrageTimer = MINUTE * 5 * IN_MILLISECONDS;
+
+ noeggs = false;
+ isBombing = false;
+ enraged = false;
+
+ isFlameBreathing = false;
+
+ for (uint8 i = 0; i < 40; ++i)
+ FireBombGUIDs[i] = 0;
+ }
+
InstanceScript* instance;
uint32 FireBreathTimer;
@@ -145,21 +165,7 @@ class boss_janalai : public CreatureScript
{
instance->SetData(DATA_JANALAIEVENT, NOT_STARTED);
- FireBreathTimer = 8000;
- BombTimer = 30000;
- BombSequenceTimer = 1000;
- BombCount = 0;
- HatcherTimer = 10000;
- EnrageTimer = MINUTE*5*IN_MILLISECONDS;
-
- noeggs = false;
- isBombing =false;
- enraged = false;
-
- isFlameBreathing = false;
-
- for (uint8 i = 0; i < 40; ++i)
- FireBombGUIDs[i] = 0;
+ Initialize();
HatchAllEggs(1);
}
@@ -493,9 +499,20 @@ class npc_janalai_hatcher : public CreatureScript
{
npc_janalai_hatcherAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ waypoint = 0;
+ isHatching = false;
+ hasChangedSide = false;
+ WaitTimer = 1;
+ HatchNum = 0;
+ side = false;
+ }
+
InstanceScript* instance;
uint32 waypoint;
@@ -509,12 +526,8 @@ class npc_janalai_hatcher : public CreatureScript
void Reset() override
{
me->SetWalk(true);
+ Initialize();
side =(me->GetPositionY() < 1150);
- waypoint = 0;
- isHatching = false;
- hasChangedSide = false;
- WaitTimer = 1;
- HatchNum = 0;
}
bool HatchEggs(uint32 num)
@@ -626,15 +639,21 @@ class npc_janalai_hatchling : public CreatureScript
{
npc_janalai_hatchlingAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ BuffetTimer = 7000;
+ }
+
InstanceScript* instance;
uint32 BuffetTimer;
void Reset() override
{
- BuffetTimer = 7000;
+ Initialize();
if (me->GetPositionY() > 1150)
me->GetMotionMaster()->MovePoint(0, hatcherway[0][3][0] + rand32() % 4 - 2, 1150.0f + rand32() % 4 - 2, hatcherway[0][3][2]);
else
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
index 4909074b059..c9c028021f1 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
@@ -109,11 +109,28 @@ class boss_nalorakk : public CreatureScript
{
boss_nalorakkAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
+ inMove = false;
MoveEvent = true;
MovePhase = 0;
+ waitTimer = 0;
+ LaceratingSlash_Timer = 0;
+ RendFlesh_Timer = 0;
+ DeafeningRoar_Timer = 0;
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ Surge_Timer = urand(15000, 20000);
+ BrutalSwipe_Timer = urand(7000, 12000);
+ Mangle_Timer = urand(10000, 15000);
+ ShapeShift_Timer = urand(45000, 50000);
+ Berserk_Timer = 600000;
+
+ inBearForm = false;
+ }
+
InstanceScript* instance;
uint32 BrutalSwipe_Timer;
@@ -150,13 +167,7 @@ class boss_nalorakk : public CreatureScript
instance->SetData(DATA_NALORAKKEVENT, NOT_STARTED);
- Surge_Timer = urand(15000, 20000);
- BrutalSwipe_Timer = urand(7000, 12000);
- Mangle_Timer = urand(10000, 15000);
- ShapeShift_Timer = urand(45000, 50000);
- Berserk_Timer = 600000;
-
- inBearForm = false;
+ Initialize();
// me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122); /// @todo find the correct equipment id
}
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
index 6b0fc05ba3d..5b9957cb94d 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
@@ -136,8 +136,38 @@ class boss_zuljin : public CreatureScript
{
boss_zuljinAI(Creature* creature) : ScriptedAI(creature), Summons(me)
{
+ Initialize();
instance = creature->GetInstanceScript();
+ memset(SpiritGUID, 0, sizeof(SpiritGUID));
+ health_20 = 0;
}
+
+ void Initialize()
+ {
+ Phase = 0;
+
+ Intro_Timer = 37000;
+ Berserk_Timer = 600000;
+
+ Whirlwind_Timer = 7000;
+ Grievous_Throw_Timer = 8000;
+
+ Creeping_Paralysis_Timer = 7000;
+ Overpower_Timer = 0;
+
+ Claw_Rage_Timer = 5000;
+ Lynx_Rush_Timer = 14000;
+ Claw_Loop_Timer = 0;
+ Claw_Counter = 0;
+
+ Flame_Whirl_Timer = 5000;
+ Flame_Breath_Timer = 6000;
+ Pillar_Of_Fire_Timer = 7000;
+
+ ClawTargetGUID = 0;
+ TankGUID = 0;
+ }
+
InstanceScript* instance;
uint64 SpiritGUID[4];
@@ -171,30 +201,9 @@ class boss_zuljin : public CreatureScript
{
instance->SetData(DATA_ZULJINEVENT, NOT_STARTED);
- Phase = 0;
-
health_20 = me->CountPctFromMaxHealth(20);
- Intro_Timer = 37000;
- Berserk_Timer = 600000;
-
- Whirlwind_Timer = 7000;
- Grievous_Throw_Timer = 8000;
-
- Creeping_Paralysis_Timer = 7000;
- Overpower_Timer = 0;
-
- Claw_Rage_Timer = 5000;
- Lynx_Rush_Timer = 14000;
- Claw_Loop_Timer = 0;
- Claw_Counter = 0;
-
- Flame_Whirl_Timer = 5000;
- Flame_Breath_Timer = 6000;
- Pillar_Of_Fire_Timer = 7000;
-
- ClawTargetGUID = 0;
- TankGUID = 0;
+ Initialize();
Summons.DespawnAll();
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp
index 64ffddbbb6e..6081887e609 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp
@@ -92,6 +92,7 @@ class instance_zulaman : public InstanceMapScript
void Initialize() override
{
+ SetHeaders(DataHeader);
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
HarkorsSatchelGUID = 0;
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
index 5561ed3c2dd..6784ff086c7 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
@@ -131,38 +131,6 @@ class npc_zulaman_hostage : public CreatureScript
public:
npc_zulaman_hostage() : CreatureScript("npc_zulaman_hostage") { }
- struct npc_zulaman_hostageAI : public ScriptedAI
- {
- npc_zulaman_hostageAI(Creature* creature) : ScriptedAI(creature)
- {
- IsLoot = false;
- }
-
- bool IsLoot;
- uint64 PlayerGUID;
-
- void Reset() override { }
-
- void EnterCombat(Unit* /*who*/) override { }
-
- void JustDied(Unit* /*killer*/) override
- {
- if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID))
- player->SendLoot(me->GetGUID(), LOOT_CORPSE);
- }
-
- void UpdateAI(uint32 /*diff*/) override
- {
- if (IsLoot)
- DoCast(me, 7, false);
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_zulaman_hostageAI(creature);
- }
-
bool OnGossipHello(Player* player, Creature* creature) override
{
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HOSTAGE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
@@ -276,9 +244,17 @@ class npc_harrison_jones : public CreatureScript
{
npc_harrison_jonesAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ _gongEvent = 0;
+ _gongTimer = 0;
+ uiTargetGUID = 0;
+ }
+
InstanceScript* instance;
uint8 _gongEvent;
@@ -287,9 +263,7 @@ class npc_harrison_jones : public CreatureScript
void Reset() override
{
- _gongEvent = 0;
- _gongTimer = 0;
- uiTargetGUID = 0;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h
index 4d5938d7253..84e1c963832 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h
+++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h
@@ -19,6 +19,8 @@
#ifndef DEF_ZULAMAN_H
#define DEF_ZULAMAN_H
+#define DataHeader "ZA"
+
enum DataTypes
{
DATA_GONGEVENT = 0,
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
index 4ac34615498..0d780da6560 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
@@ -92,15 +92,25 @@ class boss_arlokk : public CreatureScript
struct boss_arlokkAI : public BossAI
{
- boss_arlokkAI(Creature* creature) : BossAI(creature, DATA_ARLOKK) { }
+ boss_arlokkAI(Creature* creature) : BossAI(creature, DATA_ARLOKK)
+ {
+ Initialize();
+ memset(_triggersSideAGUID, 0, sizeof(_triggersSideAGUID));
+ memset(_triggersSideBGUID, 0, sizeof(_triggersSideBGUID));
+ }
+
+ void Initialize()
+ {
+ _summonCountA = 0;
+ _summonCountB = 0;
+ }
void Reset() override
{
if (events.IsInPhase(PHASE_TWO))
me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack
_Reset();
- _summonCountA = 0;
- _summonCountB = 0;
+ Initialize();
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER));
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER));
me->SetWalk(false);
@@ -332,7 +342,10 @@ class npc_zulian_prowler : public CreatureScript
struct npc_zulian_prowlerAI : public ScriptedAI
{
- npc_zulian_prowlerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
+ npc_zulian_prowlerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
+ {
+ _sideData = 0;
+ }
void Reset() override
{
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp
index 7a16f670afe..f31477e8e35 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp
@@ -212,13 +212,21 @@ class npc_batrider : public CreatureScript
struct npc_batriderAI : public ScriptedAI
{
- npc_batriderAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_batriderAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ Bomb_Timer = 2000;
+ }
uint32 Bomb_Timer;
void Reset() override
{
- Bomb_Timer = 2000;
+ Initialize();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp
index f766a795658..d1c9579c027 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp
@@ -175,15 +175,21 @@ class npc_healing_ward : public CreatureScript
{
npc_healing_wardAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ Heal_Timer = 2000;
+ }
+
uint32 Heal_Timer;
InstanceScript* instance;
void Reset() override
{
- Heal_Timer = 2000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
@@ -216,13 +222,21 @@ class npc_shade_of_jindo : public CreatureScript
struct npc_shade_of_jindoAI : public ScriptedAI
{
- npc_shade_of_jindoAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_shade_of_jindoAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ ShadowShock_Timer = 1000;
+ }
uint32 ShadowShock_Timer;
void Reset() override
{
- ShadowShock_Timer = 1000;
+ Initialize();
DoCast(me, SPELL_INVISIBLE, true);
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
index 72ba9db3637..6244d2b72b1 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
@@ -112,14 +112,23 @@ class boss_mandokir : public CreatureScript
struct boss_mandokirAI : public BossAI
{
- boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR) { }
+ boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR)
+ {
+ Initialize();
+ memset(chainedSpirtGUIDs, 0, sizeof(chainedSpirtGUIDs));
+ }
+
+ void Initialize()
+ {
+ killCount = 0;
+ }
void Reset() override
{
if (me->GetPositionZ() > 140.0f)
{
_Reset();
- killCount = 0;
+ Initialize();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
events.ScheduleEvent(EVENT_CHECK_START, 1000);
if (Creature* speaker = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_VILEBRANCH_SPEAKER)))
@@ -300,13 +309,21 @@ class npc_ohgan : public CreatureScript
struct npc_ohganAI : public ScriptedAI
{
- npc_ohganAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
+ npc_ohganAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript())
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
SunderArmor_Timer = 5000;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void EnterCombat(Unit* /*who*/) override { }
void JustDied(Unit* /*killer*/) override
@@ -353,14 +370,22 @@ class npc_vilebranch_speaker : public CreatureScript
struct npc_vilebranch_speakerAI : public ScriptedAI
{
- npc_vilebranch_speakerAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
+ npc_vilebranch_speakerAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript())
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
demoralizing_Shout_Timer = urand(2000, 4000);
cleave_Timer = urand(5000, 8000);
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void EnterCombat(Unit* /*who*/) override { }
void JustDied(Unit* /*killer*/) override
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
index bbc1fb6c90e..8020bced16b 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
@@ -217,13 +217,21 @@ class npc_spawn_of_marli : public CreatureScript
struct npc_spawn_of_marliAI : public ScriptedAI
{
- npc_spawn_of_marliAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_spawn_of_marliAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ LevelUp_Timer = 3000;
+ }
uint32 LevelUp_Timer;
void Reset() override
{
- LevelUp_Timer = 3000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
index 015a2840a9c..4f907098ff4 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
@@ -45,7 +45,22 @@ class boss_renataki : public CreatureScript
struct boss_renatakiAI : public BossAI
{
- boss_renatakiAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { }
+ boss_renatakiAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ Invisible_Timer = urand(8000, 18000);
+ Ambush_Timer = 3000;
+ Visible_Timer = 4000;
+ Aggro_Timer = urand(15000, 25000);
+ ThousandBlades_Timer = urand(4000, 8000);
+
+ Invisible = false;
+ Ambushed = false;
+ }
uint32 Invisible_Timer;
uint32 Ambush_Timer;
@@ -59,14 +74,7 @@ class boss_renataki : public CreatureScript
void Reset() override
{
_Reset();
- Invisible_Timer = urand(8000, 18000);
- Ambush_Timer = 3000;
- Visible_Timer = 4000;
- Aggro_Timer = urand(15000, 25000);
- ThousandBlades_Timer = urand(4000, 8000);
-
- Invisible = false;
- Ambushed = false;
+ Initialize();
}
void JustDied(Unit* /*killer*/) override
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp
index 997818aced2..57a286c1e58 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp
@@ -83,7 +83,16 @@ class boss_thekal : public CreatureScript
struct boss_thekalAI : public BossAI
{
- boss_thekalAI(Creature* creature) : BossAI(creature, DATA_THEKAL) { }
+ boss_thekalAI(Creature* creature) : BossAI(creature, DATA_THEKAL)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ Enraged = false;
+ WasDead = false;
+ }
bool Enraged;
bool WasDead;
@@ -93,8 +102,7 @@ class boss_thekal : public CreatureScript
if (events.IsInPhase(PHASE_TWO))
me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack
_Reset();
- Enraged = false;
- WasDead = false;
+ Initialize();
}
void JustDied(Unit* /*killer*/) override
@@ -264,9 +272,21 @@ class npc_zealot_lorkhan : public CreatureScript
{
npc_zealot_lorkhanAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ Shield_Timer = 1000;
+ BloodLust_Timer = 16000;
+ GreaterHeal_Timer = 32000;
+ Disarm_Timer = 6000;
+ Check_Timer = 10000;
+
+ FakeDeath = false;
+ }
+
uint32 Shield_Timer;
uint32 BloodLust_Timer;
uint32 GreaterHeal_Timer;
@@ -279,13 +299,7 @@ class npc_zealot_lorkhan : public CreatureScript
void Reset() override
{
- Shield_Timer = 1000;
- BloodLust_Timer = 16000;
- GreaterHeal_Timer = 32000;
- Disarm_Timer = 6000;
- Check_Timer = 10000;
-
- FakeDeath = false;
+ Initialize();
instance->SetBossState(DATA_LORKHAN, NOT_STARTED);
@@ -412,9 +426,22 @@ class npc_zealot_zath : public CreatureScript
{
npc_zealot_zathAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ SweepingStrikes_Timer = 13000;
+ SinisterStrike_Timer = 8000;
+ Gouge_Timer = 25000;
+ Kick_Timer = 18000;
+ Blind_Timer = 5000;
+ Check_Timer = 10000;
+
+ FakeDeath = false;
+ }
+
uint32 SweepingStrikes_Timer;
uint32 SinisterStrike_Timer;
uint32 Gouge_Timer;
@@ -428,14 +455,7 @@ class npc_zealot_zath : public CreatureScript
void Reset() override
{
- SweepingStrikes_Timer = 13000;
- SinisterStrike_Timer = 8000;
- Gouge_Timer = 25000;
- Kick_Timer = 18000;
- Blind_Timer = 5000;
- Check_Timer = 10000;
-
- FakeDeath = false;
+ Initialize();
instance->SetBossState(DATA_ZATH, NOT_STARTED);
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp
index 7047d22c970..c7b8a16fae1 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp
@@ -90,7 +90,17 @@ class boss_venoxis : public CreatureScript
struct boss_venoxisAI : public BossAI
{
- boss_venoxisAI(Creature* creature) : BossAI(creature, DATA_VENOXIS) { }
+ boss_venoxisAI(Creature* creature) : BossAI(creature, DATA_VENOXIS)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _inMeleeRange = 0;
+ _transformed = false;
+ _frenzied = false;
+ }
void Reset() override
{
@@ -99,9 +109,7 @@ class boss_venoxis : public CreatureScript
me->RemoveAllAuras();
me->SetReactState(REACT_PASSIVE);
// set some internally used variables to their defaults
- _inMeleeRange = 0;
- _transformed = false;
- _frenzied = false;
+ Initialize();
events.SetPhase(PHASE_ONE);
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
index de1ed629a34..5aa37642798 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
@@ -41,6 +41,7 @@ class instance_zulgurub : public InstanceMapScript
{
instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
}
@@ -144,48 +145,6 @@ class instance_zulgurub : public InstanceMapScript
return 0;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "Z G " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* str) override
- {
- 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.
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
index a9386ff1782..8b9c776dd78 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
@@ -18,6 +18,8 @@
#ifndef DEF_ZULGURUB_H
#define DEF_ZULGURUB_H
+#define DataHeader "ZG"
+
uint32 const EncounterCount = 13;
#define ZGScriptName "instance_zulgurub"
diff --git a/src/server/scripts/EasternKingdoms/zone_duskwood.cpp b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp
index 4eaf98d0a0e..b42f09b009e 100644
--- a/src/server/scripts/EasternKingdoms/zone_duskwood.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp
@@ -55,12 +55,20 @@ public:
struct boss_twilight_corrupterAI : public ScriptedAI
{
- boss_twilight_corrupterAI(Creature* creature) : ScriptedAI(creature) { }
+ boss_twilight_corrupterAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ KillCount = 0;
+ }
void Reset() override
{
_events.Reset();
- KillCount = 0;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
index 86ddf33f2fd..268a78bb491 100644
--- a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
@@ -178,16 +178,22 @@ public:
{
npc_rinjiAI(Creature* creature) : npc_escortAI(creature)
{
+ Initialize();
_IsByOutrunner = false;
spawnId = 0;
}
- void Reset() override
+ void Initialize()
{
postEventCount = 0;
postEventTimer = 3000;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void JustRespawned() override
{
_IsByOutrunner = false;
diff --git a/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp b/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp
index fc8fdf41f51..4ce30bd5834 100644
--- a/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp
@@ -57,15 +57,23 @@ public:
struct npc_converted_sentryAI : public ScriptedAI
{
- npc_converted_sentryAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_converted_sentryAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ Credit = false;
+ Timer = 2500;
+ }
bool Credit;
uint32 Timer;
void Reset() override
{
- Credit = false;
- Timer = 2500;
+ Initialize();
}
void MoveInLineOfSight(Unit* /*who*/) override { }
diff --git a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
index 342bba3b729..5907b0b155f 100644
--- a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
@@ -45,14 +45,22 @@ public:
struct npc_corporal_keeshanAI : public npc_escortAI
{
- npc_corporal_keeshanAI(Creature* creature) : npc_escortAI(creature) { }
+ npc_corporal_keeshanAI(Creature* creature) : npc_escortAI(creature)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
timer = 0;
phase = 0;
mockingBlowTimer = 5000;
- shieldBashTimer = 8000;
+ shieldBashTimer = 8000;
+ }
+
+ void Reset() override
+ {
+ Initialize();
}
void sQuestAccept(Player* player, Quest const* quest)
diff --git a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
index 6bdf43c3305..84f650ec9f4 100644
--- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
@@ -188,7 +188,16 @@ public:
{
pyrewood_ambushAI(Creature* creature) : ScriptedAI(creature), Summons(me)
{
- QuestInProgress = false;
+ Initialize();
+ WaitTimer = WAIT_SECS;
+ QuestInProgress = false;
+ }
+
+ void Initialize()
+ {
+ Phase = 0;
+ KillCount = 0;
+ PlayerGUID = 0;
}
uint32 Phase;
@@ -205,9 +214,7 @@ public:
if (!QuestInProgress) //fix reset values (see UpdateVictim)
{
- Phase = 0;
- KillCount = 0;
- PlayerGUID = 0;
+ Initialize();
Summons.DespawnAll();
}
}
diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
index 16c66c5e4e3..ee29c0a7b6e 100644
--- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
@@ -233,7 +233,18 @@ public:
struct npc_lord_gregor_lescovarAI : public npc_escortAI
{
- npc_lord_gregor_lescovarAI(Creature* creature) : npc_escortAI(creature) { }
+ npc_lord_gregor_lescovarAI(Creature* creature) : npc_escortAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ uiTimer = 0;
+ uiPhase = 0;
+
+ MarzonGUID = 0;
+ }
uint32 uiTimer;
uint32 uiPhase;
@@ -242,10 +253,7 @@ public:
void Reset() override
{
- uiTimer = 0;
- uiPhase = 0;
-
- MarzonGUID = 0;
+ Initialize();
}
void EnterEvadeMode() override
@@ -486,15 +494,23 @@ public:
struct npc_tyrion_spybotAI : public npc_escortAI
{
- npc_tyrion_spybotAI(Creature* creature) : npc_escortAI(creature) { }
+ npc_tyrion_spybotAI(Creature* creature) : npc_escortAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ uiTimer = 0;
+ uiPhase = 0;
+ }
uint32 uiTimer;
uint32 uiPhase;
void Reset() override
{
- uiTimer = 0;
- uiPhase = 0;
+ Initialize();
}
void WaypointReached(uint32 waypointId) override
diff --git a/src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp b/src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp
index b52cb9fa1bf..d1bb7ae3c6a 100644
--- a/src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp
@@ -50,15 +50,21 @@ public:
{
npc_yennikuAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
bReset = false;
}
+ void Initialize()
+ {
+ Reset_Timer = 0;
+ }
+
uint32 Reset_Timer;
bool bReset;
void Reset() override
{
- Reset_Timer = 0;
+ Initialize();
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE);
}
diff --git a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
index 4d19256e5a1..f953742b864 100644
--- a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
@@ -68,7 +68,17 @@ public:
struct npc_calvin_montagueAI : public ScriptedAI
{
- npc_calvin_montagueAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_calvin_montagueAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ m_uiPhase = 0;
+ m_uiPhaseTimer = 5000;
+ m_uiPlayerGUID = 0;
+ }
uint32 m_uiPhase;
uint32 m_uiPhaseTimer;
@@ -76,9 +86,7 @@ public:
void Reset() override
{
- m_uiPhase = 0;
- m_uiPhaseTimer = 5000;
- m_uiPlayerGUID = 0;
+ Initialize();
me->RestoreFaction();
diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp
index 41e6bafd4a7..ea997c5563f 100644
--- a/src/server/scripts/EasternKingdoms/zone_undercity.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp
@@ -99,7 +99,23 @@ public:
struct npc_lady_sylvanas_windrunnerAI : public ScriptedAI
{
- npc_lady_sylvanas_windrunnerAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_lady_sylvanas_windrunnerAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ LamentEventTimer = 5000;
+ LamentEvent = false;
+ targetGUID = 0;
+
+ FadeTimer = 30000;
+ SummonSkeletonTimer = 20000;
+ BlackArrowTimer = 15000;
+ ShotTimer = 8000;
+ MultiShotTimer = 10000;
+ }
uint32 LamentEventTimer;
bool LamentEvent;
@@ -113,15 +129,7 @@ public:
void Reset() override
{
- LamentEventTimer = 5000;
- LamentEvent = false;
- targetGUID = 0;
-
- FadeTimer = 30000;
- SummonSkeletonTimer = 20000;
- BlackArrowTimer = 15000;
- ShotTimer = 8000;
- MultiShotTimer = 10000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
@@ -231,7 +239,18 @@ public:
struct npc_highborne_lamenterAI : public ScriptedAI
{
- npc_highborne_lamenterAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_highborne_lamenterAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ EventMoveTimer = 10000;
+ EventCastTimer = 17500;
+ EventMove = true;
+ EventCast = true;
+ }
uint32 EventMoveTimer;
uint32 EventCastTimer;
@@ -240,10 +259,7 @@ public:
void Reset() override
{
- EventMoveTimer = 10000;
- EventCastTimer = 17500;
- EventMove = true;
- EventCast = true;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
diff --git a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
index dbcf5998bdb..d242d17806c 100644
--- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
@@ -319,19 +319,24 @@ public:
struct npc_anchorite_truuenAI : public npc_escortAI
{
- npc_anchorite_truuenAI(Creature* creature) : npc_escortAI(creature) { }
+ npc_anchorite_truuenAI(Creature* creature) : npc_escortAI(creature)
+ {
+ Initialize();
+ UghostGUID = 0;
+ }
+
+ void Initialize()
+ {
+ m_uiChatTimer = 7000;
+ }
uint32 m_uiChatTimer;
uint64 UghostGUID;
- uint64 TheldanisGUID;
-
- Creature* Ughost;
- Creature* Theldanis;
void Reset() override
{
- m_uiChatTimer = 7000;
+ Initialize();
}
void JustSummoned(Creature* summoned) override
@@ -364,26 +369,25 @@ public:
Talk(SAY_WP_2);
break;
case 21:
- Theldanis = GetClosestCreatureWithEntry(me, NPC_THEL_DANIS, 150);
- if (Theldanis)
+ if (Creature* Theldanis = GetClosestCreatureWithEntry(me, NPC_THEL_DANIS, 150))
Theldanis->AI()->Talk(SAY_WP_3);
break;
case 23:
- Ughost = me->SummonCreature(NPC_GHOST_UTHER, 971.86f, -1825.42f, 81.99f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
- if (Ughost)
+ if (Creature* Ughost = me->SummonCreature(NPC_GHOST_UTHER, 971.86f, -1825.42f, 81.99f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
{
+ UghostGUID = Ughost->GetGUID();
Ughost->SetDisableGravity(true);
Ughost->AI()->Talk(SAY_WP_4, me);
}
m_uiChatTimer = 4000;
break;
case 24:
- if (Ughost)
+ if (Creature* Ughost = ObjectAccessor::GetCreature(*me, UghostGUID))
Ughost->AI()->Talk(SAY_WP_5, me);
m_uiChatTimer = 4000;
break;
case 25:
- if (Ughost)
+ if (Creature* Ughost = ObjectAccessor::GetCreature(*me, UghostGUID))
Ughost->AI()->Talk(SAY_WP_6, me);
m_uiChatTimer = 4000;
break;
diff --git a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp
index e6c844b1b1e..94cea417b04 100644
--- a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp
@@ -59,14 +59,22 @@ public:
struct npc_tapoke_slim_jahnAI : public npc_escortAI
{
- npc_tapoke_slim_jahnAI(Creature* creature) : npc_escortAI(creature) { }
+ npc_tapoke_slim_jahnAI(Creature* creature) : npc_escortAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ IsFriendSummoned = false;
+ }
bool IsFriendSummoned;
void Reset() override
{
if (!HasEscortState(STATE_ESCORT_ESCORTING))
- IsFriendSummoned = false;
+ Initialize();
}
void WaypointReached(uint32 waypointId) override
diff --git a/src/server/scripts/Events/childrens_week.cpp b/src/server/scripts/Events/childrens_week.cpp
index 683b8d36011..4bc0642e348 100644
--- a/src/server/scripts/Events/childrens_week.cpp
+++ b/src/server/scripts/Events/childrens_week.cpp
@@ -27,7 +27,7 @@ enum Orphans
ORPHAN_BLOOD_ELF = 22817,
ORPHAN_DRAENEI = 22818,
ORPHAN_HUMAN = 14305,
- ORPHAN_ORCISH = 14444,
+ ORPHAN_ORCISH = 14444
};
enum Texts
@@ -68,7 +68,7 @@ enum Texts
TEXT_ELDER_KEKEK_1 = 1,
TEXT_ALEXSTRASZA_2 = 2,
- TEXT_KRASUS_8 = 8,
+ TEXT_KRASUS_8 = 8
};
enum Quests
@@ -99,7 +99,7 @@ enum Quests
QUEST_NOW_WHEN_I_GROW_UP = 11975,
QUEST_HOME_OF_THE_BEAR_MEN = 13930,
QUEST_THE_DRAGON_QUEEN_ORACLE = 13954,
- QUEST_THE_DRAGON_QUEEN_WOLVAR = 13955,
+ QUEST_THE_DRAGON_QUEEN_WOLVAR = 13955
};
enum Areatriggers
@@ -120,7 +120,7 @@ enum Areatriggers
NPC_SPOREGGAR_CW_TRIGGER = 22829,
NPC_THRONE_OF_ELEMENTS_CW_TRIGGER = 22839,
NPC_SILVERMOON_01_CW_TRIGGER = 22866,
- NPC_KRASUS = 27990,
+ NPC_KRASUS = 27990
};
enum Misc
@@ -128,7 +128,7 @@ enum Misc
SPELL_SNOWBALL = 21343,
SPELL_ORPHAN_OUT = 58818,
- DISPLAY_INVISIBLE = 11686,
+ DISPLAY_INVISIBLE = 11686
};
uint64 getOrphanGUID(Player* player, uint32 orphan)
@@ -150,9 +150,12 @@ class npc_winterfin_playmate : public CreatureScript
struct npc_winterfin_playmateAI : public ScriptedAI
{
- npc_winterfin_playmateAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_winterfin_playmateAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
- void Reset()
+ void Initialize()
{
timer = 0;
phase = 0;
@@ -160,8 +163,12 @@ class npc_winterfin_playmate : public CreatureScript
orphanGUID = 0;
}
- void MoveInLineOfSight(Unit* who) override
+ void Reset() override
+ {
+ Initialize();
+ }
+ void MoveInLineOfSight(Unit* who) override
{
if (!phase && who && who->GetDistance2d(me) < 10.0f)
if (Player* player = who->ToPlayer())
@@ -174,7 +181,7 @@ class npc_winterfin_playmate : public CreatureScript
}
}
- void UpdateAI(uint32 diff)
+ void UpdateAI(uint32 diff) override
{
if (!phase)
return;
@@ -233,7 +240,7 @@ class npc_winterfin_playmate : public CreatureScript
};
- CreatureAI* GetAI(Creature* creature) const
+ CreatureAI* GetAI(Creature* creature) const override
{
return new npc_winterfin_playmateAI(creature);
}
@@ -249,9 +256,12 @@ class npc_snowfall_glade_playmate : public CreatureScript
struct npc_snowfall_glade_playmateAI : public ScriptedAI
{
- npc_snowfall_glade_playmateAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_snowfall_glade_playmateAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
- void Reset()
+ void Initialize()
{
timer = 0;
phase = 0;
@@ -259,6 +269,11 @@ class npc_snowfall_glade_playmate : public CreatureScript
orphanGUID = 0;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void MoveInLineOfSight(Unit* who) override
{
@@ -273,7 +288,7 @@ class npc_snowfall_glade_playmate : public CreatureScript
}
}
- void UpdateAI(uint32 diff)
+ void UpdateAI(uint32 diff) override
{
if (!phase)
return;
@@ -331,7 +346,7 @@ class npc_snowfall_glade_playmate : public CreatureScript
uint64 orphanGUID;
};
- CreatureAI* GetAI(Creature* pCreature) const
+ CreatureAI* GetAI(Creature* pCreature) const override
{
return new npc_snowfall_glade_playmateAI(pCreature);
}
@@ -349,10 +364,11 @@ class npc_the_biggest_tree : public CreatureScript
{
npc_the_biggest_treeAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
me->SetDisplayId(DISPLAY_INVISIBLE);
}
- void Reset()
+ void Initialize()
{
timer = 1000;
phase = 0;
@@ -360,8 +376,12 @@ class npc_the_biggest_tree : public CreatureScript
orphanGUID = 0;
}
- void MoveInLineOfSight(Unit* who) override
+ void Reset() override
+ {
+ Initialize();
+ }
+ void MoveInLineOfSight(Unit* who) override
{
if (!phase && who && who->GetDistance2d(me) < 10.0f)
if (Player* player = who->ToPlayer())
@@ -374,7 +394,7 @@ class npc_the_biggest_tree : public CreatureScript
}
}
- void UpdateAI(uint32 diff)
+ void UpdateAI(uint32 diff) override
{
if (!phase)
return;
@@ -421,7 +441,7 @@ class npc_the_biggest_tree : public CreatureScript
};
- CreatureAI* GetAI(Creature* creature) const
+ CreatureAI* GetAI(Creature* creature) const override
{
return new npc_the_biggest_treeAI(creature);
}
@@ -437,9 +457,12 @@ class npc_high_oracle_soo_roo : public CreatureScript
struct npc_high_oracle_soo_rooAI : public ScriptedAI
{
- npc_high_oracle_soo_rooAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_high_oracle_soo_rooAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
- void Reset()
+ void Initialize()
{
timer = 0;
phase = 0;
@@ -447,6 +470,11 @@ class npc_high_oracle_soo_roo : public CreatureScript
orphanGUID = 0;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void MoveInLineOfSight(Unit* who) override
{
@@ -461,7 +489,7 @@ class npc_high_oracle_soo_roo : public CreatureScript
}
}
- void UpdateAI(uint32 diff)
+ void UpdateAI(uint32 diff) override
{
if (!phase)
return;
@@ -510,7 +538,7 @@ class npc_high_oracle_soo_roo : public CreatureScript
};
- CreatureAI* GetAI(Creature* creature) const
+ CreatureAI* GetAI(Creature* creature) const override
{
return new npc_high_oracle_soo_rooAI(creature);
}
@@ -526,9 +554,12 @@ class npc_elder_kekek : public CreatureScript
struct npc_elder_kekekAI : public ScriptedAI
{
- npc_elder_kekekAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_elder_kekekAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
- void Reset()
+ void Initialize()
{
timer = 0;
phase = 0;
@@ -536,8 +567,12 @@ class npc_elder_kekek : public CreatureScript
orphanGUID = 0;
}
- void MoveInLineOfSight(Unit* who) override
+ void Reset() override
+ {
+ Initialize();
+ }
+ void MoveInLineOfSight(Unit* who) override
{
if (!phase && who && who->GetDistance2d(me) < 10.0f)
if (Player* player = who->ToPlayer())
@@ -550,7 +585,7 @@ class npc_elder_kekek : public CreatureScript
}
}
- void UpdateAI(uint32 diff)
+ void UpdateAI(uint32 diff) override
{
if (!phase)
return;
@@ -598,7 +633,7 @@ class npc_elder_kekek : public CreatureScript
};
- CreatureAI* GetAI(Creature* creature) const
+ CreatureAI* GetAI(Creature* creature) const override
{
return new npc_elder_kekekAI(creature);
}
@@ -615,9 +650,12 @@ class npc_the_etymidian : public CreatureScript
struct npc_the_etymidianAI : public ScriptedAI
{
- npc_the_etymidianAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_the_etymidianAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
- void Reset()
+ void Initialize()
{
timer = 0;
phase = 0;
@@ -625,8 +663,12 @@ class npc_the_etymidian : public CreatureScript
orphanGUID = 0;
}
- void MoveInLineOfSight(Unit* who) override
+ void Reset() override
+ {
+ Initialize();
+ }
+ void MoveInLineOfSight(Unit* who) override
{
if (!phase && who && who->GetDistance2d(me) < 10.0f)
if (Player* player = who->ToPlayer())
@@ -639,7 +681,7 @@ class npc_the_etymidian : public CreatureScript
}
}
- void UpdateAI(uint32 diff)
+ void UpdateAI(uint32 diff) override
{
if (!phase)
return;
@@ -695,7 +737,7 @@ class npc_the_etymidian : public CreatureScript
};
- CreatureAI* GetAI(Creature* creature) const
+ CreatureAI* GetAI(Creature* creature) const override
{
return new npc_the_etymidianAI(creature);
}
@@ -711,9 +753,12 @@ class npc_alexstraza_the_lifebinder : public CreatureScript
struct npc_alexstraza_the_lifebinderAI : public ScriptedAI
{
- npc_alexstraza_the_lifebinderAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_alexstraza_the_lifebinderAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
- void Reset()
+ void Initialize()
{
timer = 0;
phase = 0;
@@ -721,6 +766,11 @@ class npc_alexstraza_the_lifebinder : public CreatureScript
orphanGUID = 0;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void SetData(uint32 type, uint32 data) override
{
// Existing SmartAI
@@ -739,7 +789,6 @@ class npc_alexstraza_the_lifebinder : public CreatureScript
}
void MoveInLineOfSight(Unit* who) override
-
{
if (!phase && who && who->GetDistance2d(me) < 10.0f)
if (Player* player = who->ToPlayer())
@@ -761,7 +810,7 @@ class npc_alexstraza_the_lifebinder : public CreatureScript
}
}
- void UpdateAI(uint32 diff)
+ void UpdateAI(uint32 diff) override
{
if (!phase)
return;
@@ -856,7 +905,7 @@ class npc_alexstraza_the_lifebinder : public CreatureScript
};
- CreatureAI* GetAI(Creature* creature) const
+ CreatureAI* GetAI(Creature* creature) const override
{
return new npc_alexstraza_the_lifebinderAI(creature);
}
@@ -871,7 +920,7 @@ class at_bring_your_orphan_to : public AreaTriggerScript
public:
at_bring_your_orphan_to() : AreaTriggerScript("at_bring_your_orphan_to") { }
- bool OnTrigger(Player* player, AreaTriggerEntry const* trigger)
+ bool OnTrigger(Player* player, AreaTriggerEntry const* trigger) override
{
if (player->isDead() || !player->HasAura(SPELL_ORPHAN_OUT))
return false;
@@ -934,7 +983,6 @@ class npc_cw_area_trigger : public CreatureScript
}
void MoveInLineOfSight(Unit* who) override
-
{
if (who && me->GetDistance2d(who) < 20.0f)
if (Player* player = who->ToPlayer())
@@ -1009,7 +1057,7 @@ class npc_cw_area_trigger : public CreatureScript
}
};
- CreatureAI* GetAI(Creature* creature) const
+ CreatureAI* GetAI(Creature* creature) const override
{
return new npc_cw_area_triggerAI(creature);
}
@@ -1031,7 +1079,6 @@ class npc_grizzlemaw_cw_trigger : public CreatureScript
}
void MoveInLineOfSight(Unit* who) override
-
{
if (who && who->GetDistance2d(me) < 10.0f)
if (Player* player = who->ToPlayer())
@@ -1044,7 +1091,7 @@ class npc_grizzlemaw_cw_trigger : public CreatureScript
}
};
- CreatureAI* GetAI(Creature* creature) const
+ CreatureAI* GetAI(Creature* creature) const override
{
return new npc_grizzlemaw_cw_triggerAI(creature);
}
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp
index e7beb4cf454..f8ba2ab6646 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp
@@ -80,6 +80,7 @@ public:
{
npc_blackfathom_deeps_eventAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
if (creature->IsSummon())
{
creature->SetHomePosition(HomePosition);
@@ -89,6 +90,15 @@ public:
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ Flee = false;
+
+ ravageTimer = urand(5000, 8000);
+ frostNovaTimer = urand(9000, 12000);
+ frostBoltVolleyTimer = urand(2000, 4000);
+ }
+
InstanceScript* instance;
uint32 ravageTimer;
@@ -99,11 +109,7 @@ public:
void Reset() override
{
- Flee = false;
-
- ravageTimer = urand(5000, 8000);
- frostNovaTimer = urand(9000, 12000);
- frostBoltVolleyTimer = urand(2000, 4000);
+ Initialize();
}
void AttackPlayer()
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h
index 07a388043a6..3ac99a32861 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h
@@ -19,6 +19,8 @@
#ifndef BFD_H_
#define BFD_H_
+#define DataHeader "BFD"
+
enum Data64
{
DATA_SHRINE1,
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp
index f6c34c6b555..b510a84b949 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp
@@ -38,11 +38,19 @@ public:
struct boss_aku_maiAI : public BossAI
{
- boss_aku_maiAI(Creature* creature) : BossAI(creature, TYPE_AKU_MAI) { }
+ boss_aku_maiAI(Creature* creature) : BossAI(creature, TYPE_AKU_MAI)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
IsEnraged = false;
+ }
+
+ void Reset() override
+ {
+ Initialize();
_Reset();
}
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp
index 9e25de817fa..0eba1a14fa5 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_gelihast.cpp
@@ -38,16 +38,22 @@ public:
{
boss_gelihastAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ netTimer = urand(2000, 4000);
+ }
+
uint32 netTimer;
InstanceScript* instance;
void Reset() override
{
- netTimer = urand(2000, 4000);
+ Initialize();
instance->SetData(TYPE_GELIHAST, NOT_STARTED);
}
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp
index 37fac0fa7de..d5860e4dbf7 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/boss_kelris.cpp
@@ -43,9 +43,16 @@ public:
{
boss_kelrisAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ mindBlastTimer = urand(2000, 5000);
+ sleepTimer = urand(9000, 12000);
+ }
+
uint32 mindBlastTimer;
uint32 sleepTimer;
@@ -53,8 +60,7 @@ public:
void Reset() override
{
- mindBlastTimer = urand(2000, 5000);
- sleepTimer = urand(9000, 12000);
+ Initialize();
instance->SetData(TYPE_KELRIS, NOT_STARTED);
}
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp
index 940da4fcf52..28b414ba9ca 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp
@@ -81,6 +81,7 @@ public:
void Initialize() override
{
+ SetHeaders(DataHeader);
memset(&encounter, 0, sizeof(encounter));
twilightLordKelrisGUID = 0;
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp
index 7aaa2239745..782632602b3 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp
@@ -54,10 +54,20 @@ public:
{
boss_anetheronAI(Creature* creature) : hyjal_trashAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
go = false;
}
+ void Initialize()
+ {
+ SwarmTimer = 45000;
+ SleepTimer = 60000;
+ AuraTimer = 5000;
+ InfernoTimer = 45000;
+ damageTaken = 0;
+ }
+
uint32 SwarmTimer;
uint32 SleepTimer;
uint32 AuraTimer;
@@ -66,11 +76,7 @@ public:
void Reset() override
{
- damageTaken = 0;
- SwarmTimer = 45000;
- SleepTimer = 60000;
- AuraTimer = 5000;
- InfernoTimer = 45000;
+ Initialize();
if (IsEvent)
instance->SetData(DATA_ANETHERONEVENT, NOT_STARTED);
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp
index 576b3dbdb39..2885a838cee 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp
@@ -90,7 +90,13 @@ public:
{
npc_ancient_wispAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
+ }
+
+ void Initialize()
+ {
+ CheckTimer = 1000;
ArchimondeGUID = 0;
}
@@ -100,7 +106,7 @@ public:
void Reset() override
{
- CheckTimer = 1000;
+ Initialize();
ArchimondeGUID = instance->GetData64(DATA_ARCHIMONDE);
@@ -174,15 +180,23 @@ public:
struct npc_doomfire_targettingAI : public ScriptedAI
{
- npc_doomfire_targettingAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_doomfire_targettingAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ TargetGUID = 0;
+ ChangeTargetTimer = 5000;
+ }
uint64 TargetGUID;
uint32 ChangeTargetTimer;
void Reset() override
{
- TargetGUID = 0;
- ChangeTargetTimer = 5000;
+ Initialize();
}
void MoveInLineOfSight(Unit* who) override
@@ -244,9 +258,36 @@ public:
{
boss_archimondeAI(Creature* creature) : hyjal_trashAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ DoomfireSpiritGUID = 0;
+ damageTaken = 0;
+ WorldTreeGUID = 0;
+
+ DrainNordrassilTimer = 0;
+ FearTimer = 42000;
+ AirBurstTimer = 30000;
+ GripOfTheLegionTimer = urand(5000, 25000);
+ DoomfireTimer = 20000;
+ SoulChargeTimer = urand(2000, 30000);
+ SoulChargeCount = 0;
+ MeleeRangeCheckTimer = 15000;
+ HandOfDeathTimer = 2000;
+ WispCount = 0; // When ~30 wisps are summoned, Archimonde dies
+ EnrageTimer = 600000; // 10 minutes
+ CheckDistanceTimer = 30000; // This checks if he's too close to the World Tree (75 yards from a point on the tree), if true then he will enrage
+ SummonWispTimer = 0;
+
+ Enraged = false;
+ BelowTenPercent = false;
+ HasProtected = false;
+ IsChanneling = false;
+ }
+
InstanceScript* instance;
uint64 DoomfireSpiritGUID;
@@ -275,28 +316,7 @@ public:
{
instance->SetData(DATA_ARCHIMONDEEVENT, NOT_STARTED);
- DoomfireSpiritGUID = 0;
- damageTaken = 0;
- WorldTreeGUID = 0;
-
- DrainNordrassilTimer = 0;
- FearTimer = 42000;
- AirBurstTimer = 30000;
- GripOfTheLegionTimer = urand(5000, 25000);
- DoomfireTimer = 20000;
- SoulChargeTimer = urand(2000, 30000);
- SoulChargeCount = 0;
- MeleeRangeCheckTimer = 15000;
- HandOfDeathTimer = 2000;
- WispCount = 0; // When ~30 wisps are summoned, Archimonde dies
- EnrageTimer = 600000; // 10 minutes
- CheckDistanceTimer = 30000; // This checks if he's too close to the World Tree (75 yards from a point on the tree), if true then he will enrage
- SummonWispTimer = 0;
-
- Enraged = false;
- BelowTenPercent = false;
- HasProtected = false;
- IsChanneling = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp
index 38e398f3d5b..7e50fd7b775 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp
@@ -55,10 +55,22 @@ public:
{
boss_azgalorAI(Creature* creature) : hyjal_trashAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
go = false;
}
+ void Initialize()
+ {
+ damageTaken = 0;
+ RainTimer = 20000;
+ DoomTimer = 50000;
+ HowlTimer = 30000;
+ CleaveTimer = 10000;
+ EnrageTimer = 600000;
+ enraged = false;
+ }
+
uint32 RainTimer;
uint32 DoomTimer;
uint32 HowlTimer;
@@ -70,13 +82,7 @@ public:
void Reset() override
{
- damageTaken = 0;
- RainTimer = 20000;
- DoomTimer = 50000;
- HowlTimer = 30000;
- CleaveTimer = 10000;
- EnrageTimer = 600000;
- enraged = false;
+ Initialize();
if (IsEvent)
instance->SetData(DATA_AZGALOREVENT, NOT_STARTED);
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp
index c5fcb150d3f..d3c137b67e8 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp
@@ -56,10 +56,20 @@ public:
{
boss_kazrogalAI(Creature* creature) : hyjal_trashAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
go = false;
}
+ void Initialize()
+ {
+ damageTaken = 0;
+ CleaveTimer = 5000;
+ WarStompTimer = 15000;
+ MarkTimer = 45000;
+ MarkTimerBase = 45000;
+ }
+
uint32 CleaveTimer;
uint32 WarStompTimer;
uint32 MarkTimer;
@@ -68,11 +78,7 @@ public:
void Reset() override
{
- damageTaken = 0;
- CleaveTimer = 5000;
- WarStompTimer = 15000;
- MarkTimer = 45000;
- MarkTimerBase = 45000;
+ Initialize();
if (IsEvent)
instance->SetData(DATA_KAZROGALEVENT, NOT_STARTED);
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 c37b9d910e7..5ce9b30eb58 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp
@@ -51,10 +51,20 @@ public:
{
boss_rage_winterchillAI(Creature* creature) : hyjal_trashAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
go = false;
}
+ void Initialize()
+ {
+ damageTaken = 0;
+ FrostArmorTimer = 37000;
+ DecayTimer = 45000;
+ NovaTimer = 15000;
+ IceboltTimer = 10000;
+ }
+
uint32 FrostArmorTimer;
uint32 DecayTimer;
uint32 NovaTimer;
@@ -63,11 +73,7 @@ public:
void Reset() override
{
- damageTaken = 0;
- FrostArmorTimer = 37000;
- DecayTimer = 45000;
- NovaTimer = 15000;
- IceboltTimer = 10000;
+ Initialize();
if (IsEvent)
instance->SetData(DATA_RAGEWINTERCHILLEVENT, NOT_STARTED);
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h
index 7ea09d2cda1..c5f4d4ae679 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h
@@ -19,7 +19,7 @@
#ifndef DEF_HYJAL_H
#define DEF_HYJAL_H
-#define ERROR_INST_DATA "TSCR: Instance data not set properly for Mount Hyjal. Encounters will be buggy."
+#define DataHeader "HY"
uint32 const EncounterCount = 5;
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
index b9c6025b91c..a7fa54b12e1 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
@@ -317,6 +317,7 @@ float HordeFirePos[65][8]=//spawn points for the fire visuals (GO) in the horde
hyjalAI::hyjalAI(Creature* creature) : npc_escortAI(creature), Summons(me)
{
+ Initialize();
instance = creature->GetInstanceScript();
VeinsSpawned[0] = false;
VeinsSpawned[1] = false;
@@ -332,25 +333,15 @@ hyjalAI::hyjalAI(Creature* creature) : npc_escortAI(creature), Summons(me)
InfernalPoint = 0;
RespawnTimer = 10000;
DoRespawn = false;
- DoHide = false;
MassTeleportTimer = 0;
DoMassTeleport = false;
+ DummyGuid = 0;
}
-void hyjalAI::JustSummoned(Creature* summoned)
-{
- Summons.Summon(summoned);
-}
-
-void hyjalAI::SummonedCreatureDespawn(Creature* summoned)
-{
- Summons.Despawn(summoned);
-}
-
-void hyjalAI::Reset()
+void hyjalAI::Initialize()
{
IsDummy = false;
- me->setActive(true);
+
// GUIDs
PlayerGUID = 0;
BossGUID[0] = 0;
@@ -365,6 +356,39 @@ void hyjalAI::Reset()
WaveCount = 0;
EnemyCount = 0;
+ //Bools
+ EventBegun = false;
+ FirstBossDead = false;
+ SecondBossDead = false;
+ Summon = false;
+ bRetreat = false;
+ Debug = false;
+
+ //Visibility
+ DoHide = true;
+
+ //Initialize spells
+ memset(Spells, 0, sizeof(Spell) * HYJAL_AI_MAX_SPELLS);
+
+ Faction = 0;
+}
+
+void hyjalAI::JustSummoned(Creature* summoned)
+{
+ Summons.Summon(summoned);
+}
+
+void hyjalAI::SummonedCreatureDespawn(Creature* summoned)
+{
+ Summons.Despawn(summoned);
+}
+
+void hyjalAI::Reset()
+{
+ me->setActive(true);
+
+ Initialize();
+
// Set faction properly based on Creature entry
switch (me->GetEntry())
{
@@ -382,20 +406,9 @@ void hyjalAI::Reset()
break;
}
- //Bools
- EventBegun = false;
- FirstBossDead = false;
- SecondBossDead = false;
- Summon = false;
- bRetreat = false;
- Debug = false;
-
//Flags
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- //Initialize spells
- memset(Spells, 0, sizeof(Spell) * HYJAL_AI_MAX_SPELLS);
-
//Reset Instance Data for trash count
if ((!instance->GetData(DATA_ALLIANCE_RETREAT) && me->GetEntry() == JAINA) || (instance->GetData(DATA_ALLIANCE_RETREAT) && me->GetEntry() == THRALL))
{
@@ -405,9 +418,6 @@ void hyjalAI::Reset()
instance->DoUpdateWorldState(WORLD_STATE_ENEMYCOUNT, 0);
instance->SetData(DATA_RESET_TRASH_COUNT, 0);
}
-
- //Visibility
- DoHide = true;
}
void hyjalAI::EnterEvadeMode()
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h
index c91414eba9d..43afc58879c 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h
@@ -119,6 +119,8 @@ struct hyjalAI : public npc_escortAI
{
hyjalAI(Creature* creature);
+ void Initialize();
+
void Reset(); // Generically used to reset our variables. Do *not* call in EnterEvadeMode as this may make problems if the raid is still in combat
void EnterEvadeMode(); // Send creature back to spawn location and evade.
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
index 7537654c09c..8e1a78ea5f2 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
@@ -1135,9 +1135,15 @@ public:
{
npc_frost_wyrmAI(Creature* creature) : hyjal_trashAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
go = false;
- Reset();
+ }
+
+ void Initialize()
+ {
+ FrostBreathTimer = 5000;
+ MoveTimer = 0;
}
bool go;
@@ -1146,8 +1152,7 @@ public:
void Reset() override
{
- FrostBreathTimer = 5000;
- MoveTimer = 0;
+ Initialize();
me->SetDisableGravity(true);
}
@@ -1388,9 +1393,15 @@ public:
{
alliance_riflemanAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
SetCombatMovement(false);
}
+ void Initialize()
+ {
+ ExplodeTimer = 5000 + rand32() % 5000;
+ }
+
uint32 ExplodeTimer;
void JustDied(Unit* /*killer*/) override
@@ -1399,7 +1410,7 @@ public:
void Reset() override
{
- ExplodeTimer = 5000 + rand32() % 5000;
+ Initialize();
}
void MoveInLineOfSight(Unit* who) override
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
index b228cb91382..6c718a4a16a 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
@@ -59,6 +59,7 @@ public:
void Initialize() override
{
+ SetHeaders(DataHeader);
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
m_uiAncientGemGUID.clear();
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
index 44e1067498d..0a666488e84 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
@@ -59,9 +59,20 @@ public:
{
boss_epochAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiStep = 1;
+ uiStepTimer = 26000;
+ uiCurseOfExertionTimer = 9300;
+ uiTimeWarpTimer = 25300;
+ uiTimeStopTimer = 21300;
+ uiWoundingStrikeTimer = 5300;
+ }
+
uint8 uiStep;
uint32 uiStepTimer;
@@ -74,12 +85,7 @@ public:
void Reset() override
{
- uiStep = 1;
- uiStepTimer = 26000;
- uiCurseOfExertionTimer = 9300;
- uiTimeWarpTimer = 25300;
- uiTimeStopTimer = 21300;
- uiWoundingStrikeTimer = 5300;
+ Initialize();
instance->SetData(DATA_EPOCH_EVENT, NOT_STARTED);
}
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 6d36a933687..d9356b724c0 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
@@ -73,7 +73,21 @@ public:
{
boss_mal_ganisAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
+ uiOutroStep = 0;
+ }
+
+ void Initialize()
+ {
+ bYelled = false;
+ bYelled2 = false;
+ Phase = COMBAT;
+ uiCarrionSwarmTimer = 6000;
+ uiMindBlastTimer = 11000;
+ uiVampiricTouchTimer = urand(10000, 15000);
+ uiSleepTimer = urand(15000, 20000);
+ uiOutroTimer = 1000;
}
uint32 uiCarrionSwarmTimer;
@@ -93,16 +107,9 @@ public:
void Reset() override
{
- bYelled = false;
- bYelled2 = false;
- Phase = COMBAT;
- uiCarrionSwarmTimer = 6000;
- uiMindBlastTimer = 11000;
- uiVampiricTouchTimer = urand(10000, 15000);
- uiSleepTimer = urand(15000, 20000);
- uiOutroTimer = 1000;
-
- instance->SetData(DATA_MAL_GANIS_EVENT, NOT_STARTED);
+ Initialize();
+
+ instance->SetData(DATA_MAL_GANIS_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
index 4c26b30947f..c961bf9b2c6 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
@@ -58,10 +58,18 @@ public:
{
boss_meathookAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
Talk(SAY_SPAWN);
}
+ void Initialize()
+ {
+ uiChainTimer = urand(12000, 17000); //seen on video 13, 17, 15, 12, 16
+ uiDiseaseTimer = urand(2000, 4000); //approx 3s
+ uiFrenzyTimer = urand(21000, 26000); //made it up
+ }
+
uint32 uiChainTimer;
uint32 uiDiseaseTimer;
uint32 uiFrenzyTimer;
@@ -70,9 +78,7 @@ public:
void Reset() override
{
- uiChainTimer = urand(12000, 17000); //seen on video 13, 17, 15, 12, 16
- uiDiseaseTimer = urand(2000, 4000); //approx 3s
- uiFrenzyTimer = urand(21000, 26000); //made it up
+ Initialize();
instance->SetData(DATA_MEATHOOK_EVENT, NOT_STARTED);
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
index 7c299b1feaa..1c35a38a5e3 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
@@ -63,10 +63,20 @@ public:
{
boss_salrammAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
Talk(SAY_SPAWN);
}
+ void Initialize()
+ {
+ uiCurseFleshTimer = 30000; //30s DBM
+ uiExplodeGhoulTimer = urand(25000, 28000); //approx 6 sec after summon ghouls
+ uiShadowBoltTimer = urand(8000, 12000); // approx 10s
+ uiStealFleshTimer = 12345;
+ uiSummonGhoulsTimer = urand(19000, 24000); //on a video approx 24s after aggro
+ }
+
uint32 uiCurseFleshTimer;
uint32 uiExplodeGhoulTimer;
uint32 uiShadowBoltTimer;
@@ -77,13 +87,9 @@ public:
void Reset() override
{
- uiCurseFleshTimer = 30000; //30s DBM
- uiExplodeGhoulTimer = urand(25000, 28000); //approx 6 sec after summon ghouls
- uiShadowBoltTimer = urand(8000, 12000); // approx 10s
- uiStealFleshTimer = 12345;
- uiSummonGhoulsTimer = urand(19000, 24000); //on a video approx 24s after aggro
+ Initialize();
- instance->SetData(DATA_SALRAMM_EVENT, NOT_STARTED);
+ instance->SetData(DATA_SALRAMM_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) override
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 fd832051421..b8a9b295161 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
@@ -351,8 +351,37 @@ public:
{
npc_arthasAI(Creature* creature) : npc_escortAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
- Reset();
+ bStepping = false;
+ step = 0;
+ gossipStep = 0;
+ bossEvent = 0;
+ }
+
+ void Initialize()
+ {
+ utherGUID = 0;
+ jainaGUID = 0;
+
+ for (uint8 i = 0; i < 2; ++i)
+ citymenGUID[i] = 0;
+
+ for (uint8 i = 0; i < ENCOUNTER_WAVES_MAX_SPAWNS; ++i)
+ waveGUID[i] = 0;
+
+ for (uint8 i = 0; i < ENCOUNTER_DRACONIAN_NUMBER; ++i)
+ infiniteDraconianGUID[i] = 0;
+
+ stalkerGUID = 0;
+ bossGUID = 0;
+ epochGUID = 0;
+ malganisGUID = 0;
+ infiniteGUID = 0;
+
+ phaseTimer = 1000;
+ exorcismTimer = 7300;
+ wave = 0;
}
InstanceScript* instance;
@@ -361,7 +390,6 @@ public:
uint32 step;
uint32 phaseTimer;
uint32 gossipStep;
- uint32 playerFaction;
uint32 bossEvent;
uint32 wave;
@@ -381,23 +409,7 @@ public:
void Reset() override
{
- utherGUID = 0;
- jainaGUID = 0;
-
- for (uint8 i = 0; i < 2; ++i)
- citymenGUID[i] = 0;
-
- for (uint8 i = 0; i < ENCOUNTER_WAVES_MAX_SPAWNS; ++i)
- waveGUID[i] = 0;
-
- for (uint8 i = 0; i < ENCOUNTER_DRACONIAN_NUMBER; ++i)
- infiniteDraconianGUID[i] = 0;
-
- stalkerGUID = 0;
- bossGUID = 0;
- epochGUID = 0;
- malganisGUID = 0;
- infiniteGUID = 0;
+ Initialize();
instance->SetData(DATA_ARTHAS_EVENT, NOT_STARTED);
switch (instance->GetData(DATA_ARTHAS_EVENT))
@@ -410,9 +422,6 @@ public:
gossipStep = 0;
break;
}
- phaseTimer = 1000;
- exorcismTimer = 7300;
- wave = 0;
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h
index 649d9dbf803..e7d1033e55f 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h
@@ -18,6 +18,8 @@
#ifndef DEF_CULLING_OF_STRATHOLME_H
#define DEF_CULLING_OF_STRATHOLME_H
+#define DataHeader "CS"
+
enum Data
{
DATA_MEATHOOK_EVENT,
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
index 503166e0b12..7af2b3f63aa 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
@@ -54,6 +54,7 @@ class instance_culling_of_stratholme : public InstanceMapScript
{
instance_culling_of_stratholme_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
_arthasGUID = 0;
_meathookGUID = 0;
_salrammGUID = 0;
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 b63075b681a..611ef38d626 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp
@@ -61,9 +61,20 @@ public:
{
boss_captain_skarlocAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ Holy_Light_Timer = urand(20000, 30000);
+ Cleanse_Timer = 10000;
+ HammerOfJustice_Timer = urand(20000, 35000);
+ HolyShield_Timer = 240000;
+ DevotionAura_Timer = 3000;
+ Consecration_Timer = 8000;
+ }
+
InstanceScript* instance;
uint32 Holy_Light_Timer;
@@ -75,12 +86,7 @@ public:
void Reset() override
{
- Holy_Light_Timer = urand(20000, 30000);
- Cleanse_Timer = 10000;
- HammerOfJustice_Timer = urand(20000, 35000);
- HolyShield_Timer = 240000;
- DevotionAura_Timer = 3000;
- Consecration_Timer = 8000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
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 e27dec09802..1916e184dbb 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp
@@ -59,9 +59,18 @@ public:
{
boss_epoch_hunterAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ SandBreath_Timer = urand(8000, 16000);
+ ImpendingDeath_Timer = urand(25000, 30000);
+ WingBuffet_Timer = 35000;
+ Mda_Timer = 40000;
+ }
+
InstanceScript* instance;
uint32 SandBreath_Timer;
@@ -71,10 +80,7 @@ public:
void Reset() override
{
- SandBreath_Timer = urand(8000, 16000);
- ImpendingDeath_Timer = urand(25000, 30000);
- WingBuffet_Timer = 35000;
- Mda_Timer = 40000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
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 2cf5169b530..8d23cf0a3e4 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp
@@ -114,7 +114,21 @@ public:
struct boss_lieutenant_drakeAI : public ScriptedAI
{
- boss_lieutenant_drakeAI(Creature* creature) : ScriptedAI(creature) { }
+ boss_lieutenant_drakeAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ CanPatrol = true;
+ wpId = 0;
+
+ Whirlwind_Timer = 20000;
+ Fear_Timer = 30000;
+ MortalStrike_Timer = 45000;
+ ExplodingShout_Timer = 25000;
+ }
bool CanPatrol;
uint32 wpId;
@@ -126,13 +140,7 @@ public:
void Reset() override
{
- CanPatrol = true;
- wpId = 0;
-
- Whirlwind_Timer = 20000;
- Fear_Timer = 30000;
- MortalStrike_Timer = 45000;
- ExplodingShout_Timer = 25000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp
index 6fc36663c2a..32062be6f3c 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp
@@ -64,6 +64,7 @@ public:
void Initialize() override
{
+ SetHeaders(DataHeader);
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
mBarrelCount = 0;
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
index 1dc86cd4ad4..56e95fafece 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
@@ -276,11 +276,17 @@ public:
{
npc_thrall_old_hillsbradAI(Creature* creature) : npc_escortAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
HadMount = false;
me->setActive(true);
}
+ void Initialize()
+ {
+ LowHp = false;
+ }
+
InstanceScript* instance;
bool LowHp;
@@ -451,7 +457,7 @@ public:
void Reset() override
{
- LowHp = false;
+ Initialize();
if (HadMount)
DoMount();
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h
index 57b0a1fce85..b8a0909e99e 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h
@@ -19,6 +19,8 @@
#ifndef DEF_OLD_HILLSBRAD_H
#define DEF_OLD_HILLSBRAD_H
+#define DataHeader "OH"
+
enum DataTypes
{
TYPE_BARREL_DIVERSION = 1,
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp
index 3e776a0c905..35497b1f9ce 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp
@@ -94,6 +94,7 @@ public:
void Initialize() override
{
+ SetHeaders(DataHeader);
_medivhGUID = 0;
Clear();
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp
index a1c4f057161..1fa104ada00 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp
@@ -77,9 +77,19 @@ public:
{
npc_medivh_bmAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ SpellCorrupt_Timer = 0;
+ Check_Timer = 0;
+ Life75 = true;
+ Life50 = true;
+ Life25 = true;
+ }
+
InstanceScript* instance;
uint32 SpellCorrupt_Timer;
@@ -91,11 +101,7 @@ public:
void Reset() override
{
- SpellCorrupt_Timer = 0;
- Check_Timer = 0;
- Life75 = true;
- Life50 = true;
- Life25 = true;
+ Initialize();
if (instance->GetData(TYPE_MEDIVH) == IN_PROGRESS)
DoCast(me, SPELL_CHANNEL, true);
@@ -265,23 +271,28 @@ public:
{
npc_time_riftAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ TimeRiftWave_Timer = 15000;
+ mRiftWaveCount = 0;
+ mWaveId = 0;
+ }
+
InstanceScript* instance;
uint32 TimeRiftWave_Timer;
uint8 mRiftWaveCount;
- uint8 mPortalCount;
uint8 mWaveId;
void Reset() override
{
+ Initialize();
- TimeRiftWave_Timer = 15000;
- mRiftWaveCount = 0;
-
- mPortalCount = instance->GetData(DATA_PORTAL_COUNT);
+ uint8 mPortalCount = instance->GetData(DATA_PORTAL_COUNT);
if (mPortalCount < 6)
mWaveId = 0;
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h
index 25f10f22907..b236c5eaa6c 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h
@@ -19,6 +19,8 @@
#ifndef DEF_THEBLACKMORASS_H
#define DEF_THEBLACKMORASS_H
+#define DataHeader "TBM"
+
uint32 const EncounterCount = 2;
enum DataTypes
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 15330643bd3..b8eb489461c 100644
--- a/src/server/scripts/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp
+++ b/src/server/scripts/Kalimdor/Maraudon/boss_celebras_the_cursed.cpp
@@ -45,7 +45,17 @@ public:
struct celebras_the_cursedAI : public ScriptedAI
{
- celebras_the_cursedAI(Creature* creature) : ScriptedAI(creature) { }
+ celebras_the_cursedAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ WrathTimer = 8000;
+ EntanglingRootsTimer = 2000;
+ CorruptForcesTimer = 30000;
+ }
uint32 WrathTimer;
uint32 EntanglingRootsTimer;
@@ -53,9 +63,7 @@ public:
void Reset() override
{
- WrathTimer = 8000;
- EntanglingRootsTimer = 2000;
- CorruptForcesTimer = 30000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
diff --git a/src/server/scripts/Kalimdor/Maraudon/boss_landslide.cpp b/src/server/scripts/Kalimdor/Maraudon/boss_landslide.cpp
index 12016d2223a..59bcdc89171 100644
--- a/src/server/scripts/Kalimdor/Maraudon/boss_landslide.cpp
+++ b/src/server/scripts/Kalimdor/Maraudon/boss_landslide.cpp
@@ -45,7 +45,17 @@ public:
struct boss_landslideAI : public ScriptedAI
{
- boss_landslideAI(Creature* creature) : ScriptedAI(creature) { }
+ boss_landslideAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ KnockAwayTimer = 8000;
+ TrampleTimer = 2000;
+ LandslideTimer = 0;
+ }
uint32 KnockAwayTimer;
uint32 TrampleTimer;
@@ -53,9 +63,7 @@ public:
void Reset() override
{
- KnockAwayTimer = 8000;
- TrampleTimer = 2000;
- LandslideTimer = 0;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Kalimdor/Maraudon/boss_noxxion.cpp b/src/server/scripts/Kalimdor/Maraudon/boss_noxxion.cpp
index 8c7197b2942..a7aa487db90 100644
--- a/src/server/scripts/Kalimdor/Maraudon/boss_noxxion.cpp
+++ b/src/server/scripts/Kalimdor/Maraudon/boss_noxxion.cpp
@@ -44,7 +44,19 @@ public:
struct boss_noxxionAI : public ScriptedAI
{
- boss_noxxionAI(Creature* creature) : ScriptedAI(creature) { }
+ boss_noxxionAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ ToxicVolleyTimer = 7000;
+ UppercutTimer = 16000;
+ AddsTimer = 19000;
+ InvisibleTimer = 15000; //Too much too low?
+ Invisible = false;
+ }
uint32 ToxicVolleyTimer;
uint32 UppercutTimer;
@@ -54,11 +66,7 @@ public:
void Reset() override
{
- ToxicVolleyTimer = 7000;
- UppercutTimer = 16000;
- AddsTimer = 19000;
- InvisibleTimer = 15000; //Too much too low?
- Invisible = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
diff --git a/src/server/scripts/Kalimdor/Maraudon/boss_princess_theradras.cpp b/src/server/scripts/Kalimdor/Maraudon/boss_princess_theradras.cpp
index 0d48d8f43c6..a36e8f09d21 100644
--- a/src/server/scripts/Kalimdor/Maraudon/boss_princess_theradras.cpp
+++ b/src/server/scripts/Kalimdor/Maraudon/boss_princess_theradras.cpp
@@ -47,7 +47,18 @@ public:
struct boss_ptheradrasAI : public ScriptedAI
{
- boss_ptheradrasAI(Creature* creature) : ScriptedAI(creature) { }
+ boss_ptheradrasAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ DustfieldTimer = 8000;
+ BoulderTimer = 2000;
+ ThrashTimer = 5000;
+ RepulsiveGazeTimer = 23000;
+ }
uint32 DustfieldTimer;
uint32 BoulderTimer;
@@ -56,10 +67,7 @@ public:
void Reset() override
{
- DustfieldTimer = 8000;
- BoulderTimer = 2000;
- ThrashTimer = 5000;
- RepulsiveGazeTimer = 23000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
index f04b5634616..347c87b160b 100644
--- a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
+++ b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
@@ -111,6 +111,7 @@ static OnyxMove MoveData[8]=
Position const MiddleRoomLocation = {-23.6155f, -215.357f, -55.7344f, 0.0f};
Position const Phase2Location = {-80.924f, -214.299f, -82.942f, 0.0f};
+Position const Phase2Floating = { -80.924f, -214.299f, -57.942f, 0.0f };
Position const SpawnLocations[3]=
{
@@ -128,7 +129,7 @@ public:
struct boss_onyxiaAI : public BossAI
{
- boss_onyxiaAI(Creature* creature) : BossAI(creature, DATA_ONYXIA), Summons(me)
+ boss_onyxiaAI(Creature* creature) : BossAI(creature, DATA_ONYXIA)
{
Reset();
}
@@ -138,16 +139,16 @@ public:
if (!IsCombatMovementAllowed())
SetCombatMovement(true);
+ _Reset();
+
Phase = PHASE_START;
MovePoint = urand(0, 5);
PointData = GetMoveData();
- Summons.DespawnAll();
SummonWhelpCount = 0;
IsMoving = false;
- instance->SetBossState(DATA_ONYXIA, NOT_STARTED);
instance->SetData(DATA_ONYXIA_PHASE, Phase);
- instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
+ instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
void EnterCombat(Unit* /*who*/) override
@@ -155,20 +156,15 @@ public:
Talk(SAY_AGGRO);
me->SetInCombatWithZone();
- events.ScheduleEvent(EVENT_FLAME_BREATH, urand (10000, 20000));
- events.ScheduleEvent(EVENT_TAIL_SWEEP, urand (15000, 20000));
- events.ScheduleEvent(EVENT_CLEAVE, urand (2000, 5000));
- events.ScheduleEvent(EVENT_WING_BUFFET, urand (10000, 20000));
-
- instance->SetBossState(DATA_ONYXIA, IN_PROGRESS);
- instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
- }
+ events.Reset();
- void JustDied(Unit* /*killer*/) override
- {
- instance->SetBossState(DATA_ONYXIA, DONE);
+ events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 20000));
+ events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(15000, 20000));
+ events.ScheduleEvent(EVENT_CLEAVE, urand(2000, 5000));
+ events.ScheduleEvent(EVENT_WING_BUFFET, urand(10000, 20000));
- Summons.DespawnAll();
+ instance->SetBossState(DATA_ONYXIA, IN_PROGRESS);
+ instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
void JustSummoned(Creature* summoned) override
@@ -186,13 +182,9 @@ public:
summoned->setActive(true);
break;
}
- Summons.Summon(summoned);
+ summons.Summon(summoned);
}
- void SummonedCreatureDespawn(Creature* summon) override
- {
- Summons.Despawn(summon);
- }
void KilledUnit(Unit* /*victim*/) override
{
@@ -231,22 +223,43 @@ public:
}
break;
case 9:
- me->GetMotionMaster()->MoveChase(me->GetVictim());
- events.ScheduleEvent(EVENT_BELLOWING_ROAR, 1000);
+ me->SetCanFly(false);
+ me->SetDisableGravity(false);
+ me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
+ if (Creature* trigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_TRIGGER_GUID)))
+ me->Kill(trigger);
+ me->SetReactState(REACT_AGGRESSIVE);
+ // tank selection based on phase one. If tank is not there i take nearest one
+ if (Unit* tank = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_TANK_GUID)))
+ me->GetMotionMaster()->MoveChase(tank);
+ else if (Unit* newtarget = SelectTarget(SELECT_TARGET_NEAREST, 0))
+ me->GetMotionMaster()->MoveChase(newtarget);
+ events.ScheduleEvent(EVENT_BELLOWING_ROAR, 5000);
+ events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 20000));
+ events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(15000, 20000));
+ events.ScheduleEvent(EVENT_CLEAVE, urand(2000, 5000));
+ events.ScheduleEvent(EVENT_WING_BUFFET, urand(15000, 30000));
break;
case 10:
me->SetCanFly(true);
- me->GetMotionMaster()->MovePoint(11, Phase2Location.GetPositionX(), Phase2Location.GetPositionY(), Phase2Location.GetPositionZ()+25);
+ me->SetDisableGravity(true);
+ me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
+ me->SetFacingTo(me->GetOrientation() + float(M_PI));
+ if (Creature * trigger = me->SummonCreature(NPC_TRIGGER, MiddleRoomLocation, TEMPSUMMON_CORPSE_DESPAWN))
+ instance->SetData64(DATA_TRIGGER_GUID, trigger->GetGUID());
+ me->GetMotionMaster()->MoveTakeoff(11, Phase2Floating);
me->SetSpeed(MOVE_FLIGHT, 1.0f);
Talk(SAY_PHASE_2_TRANS);
instance->SetData(DATA_ONYXIA_PHASE, Phase);
events.ScheduleEvent(EVENT_WHELP_SPAWN, 5000);
events.ScheduleEvent(EVENT_LAIR_GUARD, 15000);
+ events.ScheduleEvent(EVENT_DEEP_BREATH, 75000);
+ events.ScheduleEvent(EVENT_MOVEMENT, 10000);
+ events.ScheduleEvent(EVENT_FIREBALL, 18000);
break;
case 11:
if (PointData)
me->GetMotionMaster()->MovePoint(PointData->LocId, PointData->fX, PointData->fY, PointData->fZ);
- me->GetMotionMaster()->Clear(false);
me->GetMotionMaster()->MoveIdle();
break;
default:
@@ -272,13 +285,13 @@ public:
(Spell->Id >= 22267 && Spell->Id <= 22268)) &&
(target->GetTypeId() == TYPEID_PLAYER))
{
- instance->SetData(DATA_SHE_DEEP_BREATH_MORE, FAIL);
+ instance->SetData(DATA_SHE_DEEP_BREATH_MORE, FAIL);
}
}
OnyxMove* GetMoveData()
{
- uint8 MaxCount = sizeof(MoveData)/sizeof(OnyxMove);
+ uint8 MaxCount = sizeof(MoveData) / sizeof(OnyxMove);
for (uint8 i = 0; i < MaxCount; ++i)
{
@@ -291,9 +304,9 @@ public:
void SetNextRandomPoint()
{
- uint8 MaxCount = sizeof(MoveData)/sizeof(OnyxMove);
+ uint8 MaxCount = sizeof(MoveData) / sizeof(OnyxMove);
- uint8 iTemp = urand(0, MaxCount-1);
+ uint8 iTemp = urand(0, MaxCount - 1);
if (iTemp >= MovePoint)
++iTemp;
@@ -312,15 +325,13 @@ public:
//Specific to PHASE_START || PHASE_END
if (Phase == PHASE_START)
{
- if (HealthBelowPct(60))
+ if (HealthBelowPct(65))
{
SetCombatMovement(false);
Phase = PHASE_BREATH;
- events.ScheduleEvent(EVENT_DEEP_BREATH, 85000);
- events.ScheduleEvent(EVENT_MOVEMENT, 14000);
- events.ScheduleEvent(EVENT_FIREBALL, 15000);
- events.ScheduleEvent(EVENT_LAIR_GUARD, 60000);
- events.ScheduleEvent(EVENT_WHELP_SPAWN, 60000);
+ instance->SetData64(DATA_TANK_GUID, me->GetVictim()->GetGUID());
+ me->SetReactState(REACT_PASSIVE);
+ me->AttackStop();
me->GetMotionMaster()->MovePoint(10, Phase2Location);
return;
}
@@ -347,19 +358,19 @@ public:
}
case EVENT_FLAME_BREATH: // Phase PHASE_START and PHASE_END
DoCastVictim(SPELL_FLAME_BREATH);
- events.ScheduleEvent(EVENT_FLAME_BREATH, urand (10000, 20000));
+ events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 20000));
break;
case EVENT_TAIL_SWEEP: // Phase PHASE_START and PHASE_END
DoCastAOE(SPELL_TAIL_SWEEP);
- events.ScheduleEvent(EVENT_TAIL_SWEEP, urand (15000, 20000));
+ events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(15000, 20000));
break;
case EVENT_CLEAVE: // Phase PHASE_START and PHASE_END
DoCastVictim(SPELL_CLEAVE);
- events.ScheduleEvent(EVENT_CLEAVE, urand (2000, 5000));
+ events.ScheduleEvent(EVENT_CLEAVE, urand(2000, 5000));
break;
case EVENT_WING_BUFFET: // Phase PHASE_START and PHASE_END
DoCastVictim(SPELL_WING_BUFFET);
- events.ScheduleEvent(EVENT_WING_BUFFET, urand (15000, 30000));
+ events.ScheduleEvent(EVENT_WING_BUFFET, urand(15000, 30000));
break;
default:
break;
@@ -374,15 +385,18 @@ public:
Phase = PHASE_END;
instance->SetData(DATA_ONYXIA_PHASE, PHASE_END);
Talk(SAY_PHASE_3_TRANS);
-
SetCombatMovement(true);
- me->SetCanFly(false);
IsMoving = false;
- me->GetMotionMaster()->MovePoint(9, me->GetHomePosition());
+ Position const pos = me->GetHomePosition();
+ me->GetMotionMaster()->MovePoint(9, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ() + 12.0f);
events.ScheduleEvent(EVENT_BELLOWING_ROAR, 30000);
return;
}
+ if (!me->isMoving())
+ if (Creature* trigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_TRIGGER_GUID)))
+ me->SetFacingToObject(trigger);
+
events.Update(diff);
while (uint32 eventId = events.ExecuteEvent())
@@ -398,8 +412,10 @@ public:
Talk(EMOTE_BREATH);
if (PointData) /// @todo: In what cases is this null? What should we do?
DoCast(me, PointData->SpellId);
- events.ScheduleEvent(EVENT_DEEP_BREATH, 70000);
+ events.ScheduleEvent(EVENT_DEEP_BREATH, 75000);
}
+ else
+ events.ScheduleEvent(EVENT_DEEP_BREATH, 1000);
break;
case EVENT_MOVEMENT: // Phase PHASE_BREATH
if (!IsMoving && !(me->HasUnitState(UNIT_STATE_CASTING)))
@@ -414,18 +430,21 @@ public:
IsMoving = true;
events.ScheduleEvent(EVENT_MOVEMENT, 25000);
}
+ else
+ events.ScheduleEvent(EVENT_MOVEMENT, 500);
break;
case EVENT_FIREBALL: // Phase PHASE_BREATH
- if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE)
+ if (!IsMoving)
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_FIREBALL);
-
events.ScheduleEvent(EVENT_FIREBALL, 8000);
}
+ else
+ events.ScheduleEvent(EVENT_FIREBALL, 1000);
break;
case EVENT_LAIR_GUARD: // Phase PHASE_BREATH
- me->SummonCreature(NPC_LAIRGUARD, SpawnLocations[2], TEMPSUMMON_CORPSE_DESPAWN);
+ me->SummonCreature(NPC_LAIRGUARD, SpawnLocations[2], TEMPSUMMON_CORPSE_DESPAWN);
events.ScheduleEvent(EVENT_LAIR_GUARD, 30000);
break;
case EVENT_WHELP_SPAWN: // Phase PHASE_BREATH
@@ -437,7 +456,7 @@ public:
events.ScheduleEvent(EVENT_WHELP_SPAWN, 90000);
}
else
- events.ScheduleEvent(EVENT_WHELP_SPAWN, 500);
+ events.ScheduleEvent(EVENT_WHELP_SPAWN, 500);
break;
default:
break;
@@ -447,7 +466,6 @@ public:
}
private:
- SummonList Summons;
OnyxMove* PointData;
uint8 Phase;
uint8 MovePoint;
diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp
index e6a08ade87f..61b57d181a3 100644
--- a/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp
+++ b/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp
@@ -50,9 +50,12 @@ public:
void Initialize() override
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
onyxiaGUID = 0;
+ triggerGUID = 0;
+ tankGUID = 0;
onyxiaLiftoffTimer = 0;
manyWhelpsCounter = 0;
eruptTimer = 0;
@@ -181,6 +184,12 @@ public:
FloorEruptionGUIDQueue.push(data);
eruptTimer = 2500;
break;
+ case DATA_TRIGGER_GUID:
+ triggerGUID = data;
+ break;
+ case DATA_TANK_GUID:
+ tankGUID = data;
+ break;
}
}
@@ -190,6 +199,13 @@ public:
{
case NPC_ONYXIA:
return onyxiaGUID;
+ break;
+ case DATA_TRIGGER_GUID:
+ return triggerGUID;
+ break;
+ case DATA_TANK_GUID:
+ return tankGUID;
+ break;
}
return 0;
@@ -250,59 +266,17 @@ public:
return false;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "O L " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* strIn) override
- {
- if (!strIn)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
-
- OUT_LOAD_INST_DATA(strIn);
-
- char dataHead1, dataHead2;
-
- std::istringstream loadStream(strIn);
- loadStream >> dataHead1 >> dataHead2;
-
- if (dataHead1 == 'O' && dataHead2 == 'L')
- {
- for (uint8 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
-
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
- protected:
- std::map<uint64, uint32> FloorEruptionGUID[2];
- std::queue<uint64> FloorEruptionGUIDQueue;
- uint64 onyxiaGUID;
- uint32 onyxiaLiftoffTimer;
- uint32 manyWhelpsCounter;
- uint32 eruptTimer;
- bool achievManyWhelpsHandleIt;
- bool achievSheDeepBreathMore;
+ protected:
+ std::map<uint64, uint32> FloorEruptionGUID[2];
+ std::queue<uint64> FloorEruptionGUIDQueue;
+ uint64 onyxiaGUID;
+ uint64 triggerGUID;
+ uint64 tankGUID;
+ uint32 onyxiaLiftoffTimer;
+ uint32 manyWhelpsCounter;
+ uint32 eruptTimer;
+ bool achievManyWhelpsHandleIt;
+ bool achievSheDeepBreathMore;
};
};
diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h b/src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h
index cacbd8b2787..0c423f35de6 100644
--- a/src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h
+++ b/src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h
@@ -18,6 +18,8 @@
#ifndef DEF_ONYXIAS_LAIR_H
#define DEF_ONYXIAS_LAIR_H
+#define DataHeader "OL"
+
uint32 const EncounterCount = 1;
enum DataTypes
@@ -35,7 +37,9 @@ enum Data32
enum Data64
{
DATA_ONYXIA_GUID = 0,
- DATA_FLOOR_ERUPTION_GUID = 1
+ DATA_FLOOR_ERUPTION_GUID = 1,
+ DATA_TRIGGER_GUID = 2,
+ DATA_TANK_GUID = 3
};
enum OnyxiaPhases
@@ -49,7 +53,8 @@ enum CreatureIds
{
NPC_WHELP = 11262,
NPC_LAIRGUARD = 36561,
- NPC_ONYXIA = 10184
+ NPC_ONYXIA = 10184,
+ NPC_TRIGGER = 14495
};
enum GameObjectIds
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 e0a30eba2c9..ba7934e18a3 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp
@@ -50,14 +50,22 @@ public:
struct boss_amnennar_the_coldbringerAI : public BossAI
{
- boss_amnennar_the_coldbringerAI(Creature* creature) : BossAI(creature, DATA_AMNENNAR_THE_COLD_BRINGER) { }
+ boss_amnennar_the_coldbringerAI(Creature* creature) : BossAI(creature, DATA_AMNENNAR_THE_COLD_BRINGER)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
- _Reset();
hp60Spectrals = false;
hp30Spectrals = false;
- hp50 = false;
+ hp50 = false;
+ }
+
+ void Reset() override
+ {
+ _Reset();
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
index f7f4b035614..ca5e6a9828c 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
@@ -53,6 +53,7 @@ public:
{
instance_razorfen_downs_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
}
@@ -167,62 +168,17 @@ public:
}
break;
}
-
}
-
- }
-
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "R D " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* str) override
- {
- 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 == 'R' && dataHead2 == 'D')
- {
- for (uint32 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
}
- protected:
- uint64 goGongGUID;
- uint16 gongWave;
- uint8 fiendsKilled;
- uint8 reaversKilled;
- uint8 summonLowRange;
- uint8 summonHighRange;
- uint32 summonCreature;
+ protected:
+ uint64 goGongGUID;
+ uint16 gongWave;
+ uint8 fiendsKilled;
+ uint8 reaversKilled;
+ uint8 summonLowRange;
+ uint8 summonHighRange;
+ uint32 summonCreature;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
index a9a5a82f127..d77c48b8af0 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
@@ -19,6 +19,7 @@
#define DEF_RAZORFEN_DOWNS_H
#define RFDScriptName "instance_razorfen_downs"
+#define DataHeader "RFD"
uint32 const EncounterCount = 5;
diff --git a/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp b/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp
index 705b0231e82..6f9ba0afa7b 100644
--- a/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp
@@ -49,6 +49,7 @@ public:
void Initialize() override
{
+ SetHeaders(DataHeader);
WardKeeperDeath = 0;
DoorWardGUID = 0;
}
diff --git a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.h b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.h
index 236d06fee52..6d960d6146d 100644
--- a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.h
+++ b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.h
@@ -19,5 +19,7 @@
#ifndef DEF_RAZORFEN_KRAUL_H
#define DEF_RAZORFEN_KRAUL_H
+#define DataHeader "RFK"
+
#define EVENT_WARD_KEEPER 1
#endif
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp
index 162ce9b5359..19cc5316fa4 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp
@@ -80,13 +80,19 @@ class boss_ayamiss : public CreatureScript
{
boss_ayamissAI(Creature* creature) : BossAI(creature, DATA_AYAMISS)
{
+ Initialize();
}
- void Reset() override
+ void Initialize()
{
- _Reset();
_phase = PHASE_AIR;
_enraged = false;
+ }
+
+ void Reset() override
+ {
+ _Reset();
+ Initialize();
SetCombatMovement(false);
}
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp
index ac490b1440d..cf6703a01f5 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp
@@ -69,6 +69,7 @@ class boss_buru : public CreatureScript
{
boss_buruAI(Creature* creature) : BossAI(creature, DATA_BURU)
{
+ _phase = 0;
}
void EnterEvadeMode() override
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp
index f0e582dee95..adb6723d2af 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp
@@ -53,12 +53,18 @@ class boss_kurinnaxx : public CreatureScript
{
boss_kurinnaxxAI(Creature* creature) : BossAI(creature, DATA_KURINNAXX)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _enraged = false;
}
void Reset() override
{
_Reset();
- _enraged = false;
+ Initialize();
events.ScheduleEvent(EVENT_MORTAL_WOUND, 8000);
events.ScheduleEvent(EVENT_SANDTRAP, urand(5000, 15000));
events.ScheduleEvent(EVENT_TRASH, 1000);
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp
index e123a84f88e..65de64fe6c5 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp
@@ -60,13 +60,19 @@ class boss_moam : public CreatureScript
{
boss_moamAI(Creature* creature) : BossAI(creature, DATA_MOAM)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _isStonePhase = false;
}
void Reset() override
{
_Reset();
me->SetPower(POWER_MANA, 0);
- _isStonePhase = false;
+ Initialize();
events.ScheduleEvent(EVENT_STONE_PHASE, 90000);
//events.ScheduleEvent(EVENT_WIDE_SLASH, 11000);
}
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp
index 256f76337b4..0180bbeddac 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp
@@ -88,9 +88,17 @@ class boss_ossirian : public CreatureScript
{
boss_ossirianAI(Creature* creature) : BossAI(creature, DATA_OSSIRIAN)
{
+ Initialize();
SaidIntro = false;
}
+ void Initialize()
+ {
+ CrystalIterator = 0;
+ TriggerGUID = 0;
+ CrystalGUID = 0;
+ }
+
uint64 TriggerGUID;
uint64 CrystalGUID;
uint8 CrystalIterator;
@@ -99,9 +107,7 @@ class boss_ossirian : public CreatureScript
void Reset() override
{
_Reset();
- CrystalIterator = 0;
- TriggerGUID = 0;
- CrystalGUID = 0;
+ Initialize();
}
void SpellHit(Unit* caster, SpellInfo const* spell) override
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp
index 0bb35f3842a..8369c343de4 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp
@@ -65,12 +65,18 @@ class boss_rajaxx : public CreatureScript
{
boss_rajaxxAI(Creature* creature) : BossAI(creature, DATA_RAJAXX)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ enraged = false;
}
void Reset() override
{
_Reset();
- enraged = false;
+ Initialize();
events.ScheduleEvent(EVENT_DISARM, 10000);
events.ScheduleEvent(EVENT_THUNDERCRASH, 12000);
}
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 3da7e5b833f..1b62527dab7 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp
@@ -28,6 +28,7 @@ class instance_ruins_of_ahnqiraj : public InstanceMapScript
{
instance_ruins_of_ahnqiraj_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(NUM_ENCOUNTER);
_kurinaxxGUID = 0;
@@ -101,49 +102,6 @@ class instance_ruins_of_ahnqiraj : public InstanceMapScript
return 0;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "R A" << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(char const* data)
- {
- if (!data)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
-
- OUT_LOAD_INST_DATA(data);
-
- char dataHead1, dataHead2;
-
- std::istringstream loadStream(data);
- loadStream >> dataHead1 >> dataHead2;
-
- if (dataHead1 == 'R' && dataHead2 == 'A')
- {
- for (uint8 i = 0; i < NUM_ENCOUNTER; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > TO_BE_DECIDED)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
private:
uint64 _kurinaxxGUID;
uint64 _rajaxxGUID;
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h
index 8d32bd61740..34c678474ec 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h
@@ -18,6 +18,8 @@
#ifndef DEF_RUINS_OF_AHNQIRAJ_H
#define DEF_RUINS_OF_AHNQIRAJ_H
+#define DataHeader "AQR"
+
enum DataTypes
{
DATA_KURINNAXX = 0,
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp
index 189cb7854ad..be103541989 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp
@@ -55,9 +55,20 @@ public:
{
boss_kriAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ Cleave_Timer = urand(4000, 8000);
+ ToxicVolley_Timer = urand(6000, 12000);
+ Check_Timer = 2000;
+
+ VemDead = false;
+ Death = false;
+ }
+
InstanceScript* instance;
uint32 Cleave_Timer;
@@ -69,12 +80,7 @@ public:
void Reset() override
{
- Cleave_Timer = urand(4000, 8000);
- ToxicVolley_Timer = urand(6000, 12000);
- Check_Timer = 2000;
-
- VemDead = false;
- Death = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
@@ -148,9 +154,19 @@ public:
{
boss_vemAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ Charge_Timer = urand(15000, 27000);
+ KnockBack_Timer = urand(8000, 20000);
+ Enrage_Timer = 120000;
+
+ Enraged = false;
+ }
+
InstanceScript* instance;
uint32 Charge_Timer;
@@ -161,11 +177,7 @@ public:
void Reset() override
{
- Charge_Timer = urand(15000, 27000);
- KnockBack_Timer = urand(8000, 20000);
- Enrage_Timer = 120000;
-
- Enraged = false;
+ Initialize();
}
void JustDied(Unit* /*killer*/) override
@@ -237,9 +249,19 @@ public:
{
boss_yaujAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ Heal_Timer = urand(25000, 40000);
+ Fear_Timer = urand(12000, 24000);
+ Check_Timer = 2000;
+
+ VemDead = false;
+ }
+
InstanceScript* instance;
uint32 Heal_Timer;
@@ -250,11 +272,7 @@ public:
void Reset() override
{
- Heal_Timer = urand(25000, 40000);
- Fear_Timer = urand(12000, 24000);
- Check_Timer = 2000;
-
- VemDead = false;
+ Initialize();
}
void JustDied(Unit* /*killer*/) override
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp
index 2cfd977fe99..c9795133d14 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp
@@ -160,11 +160,29 @@ public:
{
eye_of_cthunAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
SetCombatMovement(false);
}
+ void Initialize()
+ {
+ //Phase information
+ PhaseTimer = 50000; //First dark glare in 50 seconds
+
+ //Eye beam phase 50 seconds
+ BeamTimer = 3000;
+ EyeTentacleTimer = 45000; //Always spawns 5 seconds before Dark Beam
+ ClawTentacleTimer = 12500; //4 per Eye beam phase (unsure if they spawn during Dark beam)
+
+ //Dark Beam phase 35 seconds (each tick = 1 second, 35 ticks)
+ DarkGlareTick = 0;
+ DarkGlareTickTimer = 1000;
+ DarkGlareAngle = 0;
+ ClockWise = false;
+ }
+
InstanceScript* instance;
//Global variables
@@ -183,19 +201,7 @@ public:
void Reset() override
{
- //Phase information
- PhaseTimer = 50000; //First dark glare in 50 seconds
-
- //Eye beam phase 50 seconds
- BeamTimer = 3000;
- EyeTentacleTimer = 45000; //Always spawns 5 seconds before Dark Beam
- ClawTentacleTimer = 12500; //4 per Eye beam phase (unsure if they spawn during Dark beam)
-
- //Dark Beam phase 35 seconds (each tick = 1 second, 35 ticks)
- DarkGlareTick = 0;
- DarkGlareTickTimer = 1000;
- DarkGlareAngle = 0;
- ClockWise = false;
+ Initialize();
//Reset flags
me->RemoveAurasDueToSpell(SPELL_RED_COLORATION);
@@ -454,11 +460,34 @@ public:
{
cthunAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
SetCombatMovement(false);
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ //One random wisper every 90 - 300 seconds
+ WisperTimer = 90000;
+
+ //Phase information
+ PhaseTimer = 10000; //Emerge in 10 seconds
+
+ //No hold player for transition
+ HoldPlayer = 0;
+
+ //Body Phase
+ EyeTentacleTimer = 30000;
+ FleshTentaclesKilled = 0;
+ GiantClawTentacleTimer = 15000; //15 seconds into body phase (1 min repeat)
+ GiantEyeTentacleTimer = 45000; //15 seconds into body phase (1 min repeat)
+ StomachAcidTimer = 4000; //Every 4 seconds
+ StomachEnterTimer = 10000; //Every 10 seconds
+ StomachEnterVisTimer = 0; //Always 3.5 seconds after Stomach Enter Timer
+ StomachEnterTarget = 0; //Target to be teleported to stomach
+ }
+
InstanceScript* instance;
//Out of combat whisper timer
@@ -487,24 +516,7 @@ public:
void Reset() override
{
- //One random wisper every 90 - 300 seconds
- WisperTimer = 90000;
-
- //Phase information
- PhaseTimer = 10000; //Emerge in 10 seconds
-
- //No hold player for transition
- HoldPlayer = 0;
-
- //Body Phase
- EyeTentacleTimer = 30000;
- FleshTentaclesKilled = 0;
- GiantClawTentacleTimer = 15000; //15 seconds into body phase (1 min repeat)
- GiantEyeTentacleTimer = 45000; //15 seconds into body phase (1 min repeat)
- StomachAcidTimer = 4000; //Every 4 seconds
- StomachEnterTimer = 10000; //Every 10 seconds
- StomachEnterVisTimer = 0; //Always 3.5 seconds after Stomach Enter Timer
- StomachEnterTarget = 0; //Target to be teleported to stomach
+ Initialize();
//Clear players in stomach and outside
Stomach_Map.clear();
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp
index 5947c9860ec..b916f93aef7 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp
@@ -53,23 +53,25 @@ public:
struct boss_fankrissAI : public ScriptedAI
{
- boss_fankrissAI(Creature* creature) : ScriptedAI(creature) { }
+ boss_fankrissAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ MortalWound_Timer = urand(10000, 15000);
+ SpawnHatchlings_Timer = urand(6000, 12000);
+ SpawnSpawns_Timer = urand(15000, 45000);
+ }
uint32 MortalWound_Timer;
uint32 SpawnHatchlings_Timer;
uint32 SpawnSpawns_Timer;
- int Rand;
- float RandX;
- float RandY;
-
- Creature* Hatchling;
- Creature* Spawn;
void Reset() override
{
- MortalWound_Timer = urand(10000, 15000);
- SpawnHatchlings_Timer = urand(6000, 12000);
- SpawnSpawns_Timer = urand(15000, 45000);
+ Initialize();
}
void SummonSpawn(Unit* victim)
@@ -77,7 +79,10 @@ public:
if (!victim)
return;
- Rand = 10 + (rand32() % 10);
+ int Rand = 10 + (rand32() % 10);
+ float RandX = 0.f;
+ float RandY = 0.f;
+
switch (rand32() % 2)
{
case 0: RandX = 0.0f - Rand; break;
@@ -91,7 +96,7 @@ public:
case 1: RandY = 0.0f + Rand; break;
}
Rand = 0;
- Spawn = DoSpawnCreature(15630, RandX, RandY, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
+ Creature* Spawn = DoSpawnCreature(15630, RandX, RandY, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
if (Spawn)
Spawn->AI()->AttackStart(victim);
}
@@ -147,6 +152,7 @@ public:
if (DoGetThreat(target))
DoModifyThreatPercent(target, -100);
+ Creature* Hatchling = nullptr;
switch (urand(0, 2))
{
case 0:
@@ -166,7 +172,7 @@ public:
break;
case 1:
DoTeleportPlayer(target, -7990.135354f, 1155.1907f, -78.849319f, 2.608f);
- Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()-3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ Hatchling = me->SummonCreature(15962, target->GetPositionX() - 3, target->GetPositionY() - 3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
if (Hatchling)
Hatchling->AI()->AttackStart(target);
Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()+3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
@@ -181,7 +187,7 @@ public:
break;
case 2:
DoTeleportPlayer(target, -8159.7753f, 1127.9064f, -76.868660f, 0.675f);
- Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()-3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
+ Hatchling = me->SummonCreature(15962, target->GetPositionX() - 3, target->GetPositionY() - 3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
if (Hatchling)
Hatchling->AI()->AttackStart(target);
Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()+3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp
index 5cc1670d8fb..b5512f29589 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp
@@ -51,7 +51,23 @@ public:
struct boss_huhuranAI : public ScriptedAI
{
- boss_huhuranAI(Creature* creature) : ScriptedAI(creature) { }
+ boss_huhuranAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ Frenzy_Timer = urand(25000, 35000);
+ Wyvern_Timer = urand(18000, 28000);
+ Spit_Timer = 8000;
+ PoisonBolt_Timer = 4000;
+ NoxiousPoison_Timer = urand(10000, 20000);
+ FrenzyBack_Timer = 15000;
+
+ Frenzy = false;
+ Berserk = false;
+ }
uint32 Frenzy_Timer;
uint32 Wyvern_Timer;
@@ -65,15 +81,7 @@ public:
void Reset() override
{
- Frenzy_Timer = urand(25000, 35000);
- Wyvern_Timer = urand(18000, 28000);
- Spit_Timer = 8000;
- PoisonBolt_Timer = 4000;
- NoxiousPoison_Timer = urand(10000, 20000);
- FrenzyBack_Timer = 15000;
-
- Frenzy = false;
- Berserk = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp
index 26866de9aa8..092d7ed2a3b 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp
@@ -48,7 +48,23 @@ public:
struct boss_ouroAI : public ScriptedAI
{
- boss_ouroAI(Creature* creature) : ScriptedAI(creature) { }
+ boss_ouroAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ Sweep_Timer = urand(5000, 10000);
+ SandBlast_Timer = urand(20000, 35000);
+ Submerge_Timer = urand(90000, 150000);
+ Back_Timer = urand(30000, 45000);
+ ChangeTarget_Timer = urand(5000, 8000);
+ Spawn_Timer = urand(10000, 20000);
+
+ Enrage = false;
+ Submerged = false;
+ }
uint32 Sweep_Timer;
uint32 SandBlast_Timer;
@@ -62,15 +78,7 @@ public:
void Reset() override
{
- Sweep_Timer = urand(5000, 10000);
- SandBlast_Timer = urand(20000, 35000);
- Submerge_Timer = urand(90000, 150000);
- Back_Timer = urand(30000, 45000);
- ChangeTarget_Timer = urand(5000, 8000);
- Spawn_Timer = urand(10000, 20000);
-
- Enrage = false;
- Submerged = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp
index e9eb9d58ca8..b73a79506a9 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp
@@ -53,7 +53,25 @@ public:
struct boss_sarturaAI : public ScriptedAI
{
- boss_sarturaAI(Creature* creature) : ScriptedAI(creature) { }
+ boss_sarturaAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ WhirlWind_Timer = 30000;
+ WhirlWindRandom_Timer = urand(3000, 7000);
+ WhirlWindEnd_Timer = 15000;
+ AggroReset_Timer = urand(45000, 55000);
+ AggroResetEnd_Timer = 5000;
+ EnrageHard_Timer = 10 * 60000;
+
+ WhirlWind = false;
+ AggroReset = false;
+ Enraged = false;
+ EnragedHard = false;
+ }
uint32 WhirlWind_Timer;
uint32 WhirlWindRandom_Timer;
@@ -69,18 +87,7 @@ public:
void Reset() override
{
- WhirlWind_Timer = 30000;
- WhirlWindRandom_Timer = urand(3000, 7000);
- WhirlWindEnd_Timer = 15000;
- AggroReset_Timer = urand(45000, 55000);
- AggroResetEnd_Timer = 5000;
- EnrageHard_Timer = 10*60000;
-
- WhirlWind = false;
- AggroReset = false;
- Enraged = false;
- EnragedHard = false;
-
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
@@ -196,7 +203,23 @@ public:
struct npc_sartura_royal_guardAI : public ScriptedAI
{
- npc_sartura_royal_guardAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_sartura_royal_guardAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ WhirlWind_Timer = 30000;
+ WhirlWindRandom_Timer = urand(3000, 7000);
+ WhirlWindEnd_Timer = 15000;
+ AggroReset_Timer = urand(45000, 55000);
+ AggroResetEnd_Timer = 5000;
+ KnockBack_Timer = 10000;
+
+ WhirlWind = false;
+ AggroReset = false;
+ }
uint32 WhirlWind_Timer;
uint32 WhirlWindRandom_Timer;
@@ -210,15 +233,7 @@ public:
void Reset() override
{
- WhirlWind_Timer = 30000;
- WhirlWindRandom_Timer = urand(3000, 7000);
- WhirlWindEnd_Timer = 15000;
- AggroReset_Timer = urand(45000, 55000);
- AggroResetEnd_Timer = 5000;
- KnockBack_Timer = 10000;
-
- WhirlWind = false;
- AggroReset = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
index 51384cc117d..62de8fbd607 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
@@ -55,12 +55,20 @@ class boss_skeram : public CreatureScript
struct boss_skeramAI : public BossAI
{
- boss_skeramAI(Creature* creature) : BossAI(creature, DATA_SKERAM) { }
+ boss_skeramAI(Creature* creature) : BossAI(creature, DATA_SKERAM)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
_flag = 0;
_hpct = 75.0f;
+ }
+
+ void Reset() override
+ {
+ Initialize();
me->SetVisible(true);
}
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp
index 3e02406b93d..e65dbacc1f2 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp
@@ -69,9 +69,24 @@ struct boss_twinemperorsAI : public ScriptedAI
{
boss_twinemperorsAI(Creature* creature): ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ Heal_Timer = 0; // first heal immediately when they get close together
+ Teleport_Timer = TELEPORTTIME;
+ AfterTeleport = false;
+ tspellcast = false;
+ AfterTeleportTimer = 0;
+ Abuse_Bug_Timer = urand(10000, 17000);
+ BugsTimer = 2000;
+
+ DontYellWhenDead = false;
+ EnrageTimer = 15 * 60000;
+ }
+
InstanceScript* instance;
uint32 Heal_Timer;
@@ -89,16 +104,8 @@ struct boss_twinemperorsAI : public ScriptedAI
void TwinReset()
{
- Heal_Timer = 0; // first heal immediately when they get close together
- Teleport_Timer = TELEPORTTIME;
- AfterTeleport = false;
- tspellcast = false;
- AfterTeleportTimer = 0;
- Abuse_Bug_Timer = urand(10000, 17000);
- BugsTimer = 2000;
+ Initialize();
me->ClearUnitState(UNIT_STATE_STUNNED);
- DontYellWhenDead = false;
- EnrageTimer = 15*60000;
}
Creature* GetOtherBoss()
@@ -394,24 +401,26 @@ public:
struct boss_veknilashAI : public boss_twinemperorsAI
{
bool IAmVeklor() {return false;}
- boss_veknilashAI(Creature* creature) : boss_twinemperorsAI(creature) { }
+ boss_veknilashAI(Creature* creature) : boss_twinemperorsAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ UpperCut_Timer = urand(14000, 29000);
+ UnbalancingStrike_Timer = urand(8000, 18000);
+ Scarabs_Timer = urand(7000, 14000);
+ }
uint32 UpperCut_Timer;
uint32 UnbalancingStrike_Timer;
uint32 Scarabs_Timer;
- int Rand;
- int RandX;
- int RandY;
-
- Creature* Summoned;
void Reset() override
{
TwinReset();
- UpperCut_Timer = urand(14000, 29000);
- UnbalancingStrike_Timer = urand(8000, 18000);
- Scarabs_Timer = urand(7000, 14000);
-
+ Initialize();
//Added. Can be removed if its included in DB.
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);
}
@@ -480,25 +489,28 @@ public:
struct boss_veklorAI : public boss_twinemperorsAI
{
bool IAmVeklor() {return true;}
- boss_veklorAI(Creature* creature) : boss_twinemperorsAI(creature) { }
+ boss_veklorAI(Creature* creature) : boss_twinemperorsAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ ShadowBolt_Timer = 0;
+ Blizzard_Timer = urand(15000, 20000);
+ ArcaneBurst_Timer = 1000;
+ Scorpions_Timer = urand(7000, 14000);
+ }
uint32 ShadowBolt_Timer;
uint32 Blizzard_Timer;
uint32 ArcaneBurst_Timer;
uint32 Scorpions_Timer;
- int Rand;
- int RandX;
- int RandY;
-
- Creature* Summoned;
void Reset() override
{
TwinReset();
- ShadowBolt_Timer = 0;
- Blizzard_Timer = urand(15000, 20000);
- ArcaneBurst_Timer = 1000;
- Scorpions_Timer = urand(7000, 14000);
+ Initialize();
//Added. Can be removed if its included in DB.
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true);
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp
index a9ec3007e5d..7f223f21269 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp
@@ -91,15 +91,23 @@ class boss_viscidus : public CreatureScript
struct boss_viscidusAI : public BossAI
{
- boss_viscidusAI(Creature* creature) : BossAI(creature, DATA_VISCIDUS) { }
+ boss_viscidusAI(Creature* creature) : BossAI(creature, DATA_VISCIDUS)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
- _Reset();
_hitcounter = 0;
_phase = PHASE_FROST;
}
+ void Reset() override
+ {
+ _Reset();
+ Initialize();
+ }
+
void DamageTaken(Unit* attacker, uint32& /*damage*/) override
{
if (_phase != PHASE_MELEE)
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp
index 5780da5e759..e6d9bd86a4d 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp
@@ -58,6 +58,7 @@ class instance_temple_of_ahnqiraj : public InstanceMapScript
void Initialize() override
{
+ SetHeaders(DataHeader);
IsBossDied[0] = false;
IsBossDied[1] = false;
IsBossDied[2] = false;
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp
index a0d57481c75..b8f6c0ed80e 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp
@@ -92,8 +92,15 @@ public:
aqsentinelAI(Creature* creature) : ScriptedAI(creature)
{
- ClearBuddyList();
+ Initialize();
abselected = 0; // just initialization of variable
+ ability = 0;
+ }
+
+ void Initialize()
+ {
+ ClearBuddyList();
+ gatherOthersWhenAggro = true;
}
uint64 NearbyGUID[3];
@@ -183,8 +190,8 @@ public:
void GetOtherSentinels(Unit* who)
{
- bool *chosenAbilities = new bool[9];
- memset(chosenAbilities, 0, 9*sizeof(bool));
+ bool chosenAbilities[9];
+ memset(chosenAbilities, 0, sizeof(chosenAbilities));
selectAbility(pickAbilityRandom(chosenAbilities));
ClearBuddyList();
@@ -207,8 +214,6 @@ public:
DoYell("I dont have enough buddies.", LANG_NEUTRAL, 0);*/
SendMyListToBuddies();
CallBuddiesToAttack(who);
-
- delete[] chosenAbilities;
}
bool gatherOthersWhenAggro;
@@ -228,8 +233,7 @@ public:
}
}
}
- ClearBuddyList();
- gatherOthersWhenAggro = true;
+ Initialize();
}
void GainSentinelAbility(uint32 id)
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h
index fc858ced774..99ce6e738e8 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h
@@ -19,6 +19,8 @@
#ifndef DEF_TEMPLE_OF_AHNQIRAJ_H
#define DEF_TEMPLE_OF_AHNQIRAJ_H
+#define DataHeader "AQT"
+
enum DataTypes
{
DATA_SKERAM = 1,
diff --git a/src/server/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp b/src/server/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp
index 9b8397ec6cd..bb2fc8bca20 100644
--- a/src/server/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp
+++ b/src/server/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp
@@ -50,6 +50,7 @@ public:
void Initialize() override
{
+ SetHeaders(DataHeader);
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
yelled = false;
diff --git a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.h b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.h
index c331d5f43c1..87577f9abaf 100644
--- a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.h
+++ b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.h
@@ -19,6 +19,8 @@
#ifndef DEF_WAILING_CAVERNS_H
#define DEF_WAILING_CAVERNS_H
+#define DataHeader "WC"
+
enum DataTypes
{
TYPE_LORD_COBRAHN = 1,
diff --git a/src/server/scripts/Kalimdor/ZulFarrak/boss_zum_rah.cpp b/src/server/scripts/Kalimdor/ZulFarrak/boss_zum_rah.cpp
index f0035cc921c..4a2425d879f 100644
--- a/src/server/scripts/Kalimdor/ZulFarrak/boss_zum_rah.cpp
+++ b/src/server/scripts/Kalimdor/ZulFarrak/boss_zum_rah.cpp
@@ -59,16 +59,24 @@ public:
struct boss_zum_rahAI : public BossAI
{
- boss_zum_rahAI(Creature* creature) : BossAI(creature, DATA_ZUM_RAH) { }
+ boss_zum_rahAI(Creature* creature) : BossAI(creature, DATA_ZUM_RAH)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
- me->setFaction(ZUMRAH_FRIENDLY_FACTION); // areatrigger sets faction to enemy
_ward80 = false;
_ward40 = false;
_heal30 = false;
}
+ void Reset() override
+ {
+ me->setFaction(ZUMRAH_FRIENDLY_FACTION); // areatrigger sets faction to enemy
+ Initialize();
+ }
+
void EnterCombat(Unit* /*who*/) override
{
Talk(SAY_SANCT_INVADE);
diff --git a/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp
index 8139f45bf46..83f1724130c 100644
--- a/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp
+++ b/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp
@@ -126,6 +126,7 @@ public:
void Initialize() override
{
+ SetHeaders(DataHeader);
GahzRillaEncounter = NOT_STARTED;
ZumrahGUID = 0;
BlyGUID = 0;
diff --git a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp
index 7c02ecdb8f2..47d269a00ff 100644
--- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp
+++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp
@@ -104,8 +104,17 @@ public:
{
npc_sergeant_blyAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
postGossipStep = 0;
+ Text_Timer = 0;
+ PlayerGUID = 0;
+ }
+
+ void Initialize()
+ {
+ ShieldBash_Timer = 5000;
+ Revenge_Timer = 8000;
}
InstanceScript* instance;
@@ -118,8 +127,7 @@ public:
void Reset() override
{
- ShieldBash_Timer = 5000;
- Revenge_Timer = 8000;
+ Initialize();
me->setFaction(FACTION_FRIENDLY);
}
diff --git a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h
index 0d16c1d1ddd..3e742db02c0 100644
--- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h
+++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h
@@ -5,6 +5,8 @@
#ifndef DEF_ZF_H
#define DEF_ZF_H
+#define DataHeader "ZF"
+
enum zfEntries
{
ENTRY_ZUM_RAH = 7271,
diff --git a/src/server/scripts/Kalimdor/boss_azuregos.cpp b/src/server/scripts/Kalimdor/boss_azuregos.cpp
index db41213e94e..df0c9a9c16c 100644
--- a/src/server/scripts/Kalimdor/boss_azuregos.cpp
+++ b/src/server/scripts/Kalimdor/boss_azuregos.cpp
@@ -58,7 +58,10 @@ class boss_azuregos : public CreatureScript
struct boss_azuregosAI : public WorldBossAI
{
- boss_azuregosAI(Creature* creature) : WorldBossAI(creature) { }
+ boss_azuregosAI(Creature* creature) : WorldBossAI(creature)
+ {
+ _enraged = false;
+ }
void Reset() override
{
diff --git a/src/server/scripts/Kalimdor/zone_ashenvale.cpp b/src/server/scripts/Kalimdor/zone_ashenvale.cpp
index 2b8dbdaab6c..500739b9404 100644
--- a/src/server/scripts/Kalimdor/zone_ashenvale.cpp
+++ b/src/server/scripts/Kalimdor/zone_ashenvale.cpp
@@ -61,13 +61,21 @@ public:
struct npc_torekAI : public npc_escortAI
{
- npc_torekAI(Creature* creature) : npc_escortAI(creature) { }
+ npc_torekAI(Creature* creature) : npc_escortAI(creature)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
- rend_Timer = 5000;
+ rend_Timer = 5000;
thunderclap_Timer = 8000;
- _completed = false;
+ _completed = false;
+ }
+
+ void Reset() override
+ {
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
@@ -298,15 +306,23 @@ public:
struct npc_muglashAI : public npc_escortAI
{
- npc_muglashAI(Creature* creature) : npc_escortAI(creature) { }
+ npc_muglashAI(Creature* creature) : npc_escortAI(creature)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
eventTimer = 10000;
waveId = 0;
_isBrazierExtinguished = false;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void EnterCombat(Unit* /*who*/) override
{
if (Player* player = GetPlayerForEscort())
diff --git a/src/server/scripts/Kalimdor/zone_azshara.cpp b/src/server/scripts/Kalimdor/zone_azshara.cpp
index e62e17593ba..cec94617454 100644
--- a/src/server/scripts/Kalimdor/zone_azshara.cpp
+++ b/src/server/scripts/Kalimdor/zone_azshara.cpp
@@ -58,15 +58,23 @@ public:
struct npc_spitelashesAI : public ScriptedAI
{
- npc_spitelashesAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_spitelashesAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ morphtimer = 0;
+ spellhit = false;
+ }
uint32 morphtimer;
bool spellhit;
void Reset() override
{
- morphtimer = 0;
- spellhit = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
@@ -292,9 +300,12 @@ public:
struct npc_rizzle_sprysprocketAI : public ScriptedAI
{
- npc_rizzle_sprysprocketAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_rizzle_sprysprocketAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
SpellEscapeTimer = 1300;
TeleportTimer = 3500;
@@ -311,6 +322,11 @@ public:
Reached = false;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void EnterCombat(Unit* /*who*/) override { }
void AttackStart(Unit* who) override
@@ -475,7 +491,16 @@ public:
struct npc_depth_chargeAI : public ScriptedAI
{
- npc_depth_chargeAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_depth_chargeAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ WeMustDie = false;
+ WeMustDieTimer = 1000;
+ }
bool WeMustDie;
uint32 WeMustDieTimer;
@@ -485,8 +510,7 @@ public:
me->SetHover(true);
me->SetSwim(true);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- WeMustDie = false;
- WeMustDieTimer = 1000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
diff --git a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
index 6f02752d2fb..e6869dbf0f5 100644
--- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
+++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
@@ -61,7 +61,21 @@ public:
struct npc_draenei_survivorAI : public ScriptedAI
{
- npc_draenei_survivorAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_draenei_survivorAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ pCaster = 0;
+
+ SayThanksTimer = 0;
+ RunAwayTimer = 0;
+ SayHelpTimer = 10000;
+
+ CanSayHelp = true;
+ }
uint64 pCaster;
@@ -73,13 +87,7 @@ public:
void Reset() override
{
- pCaster = 0;
-
- SayThanksTimer = 0;
- RunAwayTimer = 0;
- SayHelpTimer = 10000;
-
- CanSayHelp = true;
+ Initialize();
DoCast(me, SPELL_IRRIDATION, true);
@@ -193,22 +201,28 @@ public:
{
npc_engineer_spark_overgrindAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
NormFaction = creature->getFaction();
NpcFlags = creature->GetUInt32Value(UNIT_NPC_FLAGS);
+ }
- if (creature->GetAreaId() == AREA_COVE || creature->GetAreaId() == AREA_ISLE)
+ void Initialize()
+ {
+ DynamiteTimer = 8000;
+ EmoteTimer = urand(120000, 150000);
+
+ if (me->GetAreaId() == AREA_COVE || me->GetAreaId() == AREA_ISLE)
IsTreeEvent = true;
+ else
+ IsTreeEvent = false;
}
void Reset() override
{
- DynamiteTimer = 8000;
- EmoteTimer = urand(120000, 150000);
+ Initialize();
me->setFaction(NormFaction);
me->SetUInt32Value(UNIT_NPC_FLAGS, NpcFlags);
-
- IsTreeEvent = false;
}
void EnterCombat(Unit* who) override
@@ -410,7 +424,18 @@ public:
struct npc_geezleAI : public ScriptedAI
{
- npc_geezleAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_geezleAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ SparkGUID = 0;
+ Step = 0;
+ EventStarted = false;
+ SayTimer = 0;
+ }
uint64 SparkGUID;
@@ -421,8 +446,7 @@ public:
void Reset() override
{
- SparkGUID = 0;
- Step = 0;
+ Initialize();
StartEvent();
}
@@ -582,15 +606,23 @@ public:
struct npc_death_ravagerAI : public ScriptedAI
{
- npc_death_ravagerAI(Creature* creature) : ScriptedAI(creature){ }
+ npc_death_ravagerAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ RendTimer = 30000;
+ EnragingBiteTimer = 20000;
+ }
uint32 RendTimer;
uint32 EnragingBiteTimer;
void Reset() override
{
- RendTimer = 30000;
- EnragingBiteTimer = 20000;
+ Initialize();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetReactState(REACT_PASSIVE);
@@ -648,7 +680,16 @@ class npc_stillpine_capitive : public CreatureScript
struct npc_stillpine_capitiveAI : public ScriptedAI
{
- npc_stillpine_capitiveAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_stillpine_capitiveAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _playerGUID = 0;
+ _movementComplete = false;
+ }
void Reset() override
{
@@ -658,8 +699,7 @@ class npc_stillpine_capitive : public CreatureScript
cage->SetGoState(GO_STATE_READY);
}
_events.Reset();
- _player = NULL;
- _movementComplete = false;
+ Initialize();
}
void StartMoving(Player* owner)
@@ -667,7 +707,7 @@ class npc_stillpine_capitive : public CreatureScript
if (owner)
{
Talk(CAPITIVE_SAY, owner);
- _player = owner;
+ _playerGUID = owner->GetGUID();
}
Position pos = me->GetNearPosition(3.0f, 0.0f);
me->GetMotionMaster()->MovePoint(POINT_INIT, pos);
@@ -678,7 +718,7 @@ class npc_stillpine_capitive : public CreatureScript
if (type != POINT_MOTION_TYPE || id != POINT_INIT)
return;
- if (_player)
+ if (Player* _player = ObjectAccessor::GetPlayer(*me, _playerGUID))
_player->KilledMonsterCredit(me->GetEntry(), me->GetGUID());
_movementComplete = true;
@@ -697,7 +737,7 @@ class npc_stillpine_capitive : public CreatureScript
}
private:
- Player* _player;
+ uint64 _playerGUID;
EventMap _events;
bool _movementComplete;
};
diff --git a/src/server/scripts/Kalimdor/zone_darkshore.cpp b/src/server/scripts/Kalimdor/zone_darkshore.cpp
index 43a533ada01..22c619f9a90 100644
--- a/src/server/scripts/Kalimdor/zone_darkshore.cpp
+++ b/src/server/scripts/Kalimdor/zone_darkshore.cpp
@@ -65,13 +65,21 @@ public:
struct npc_kerlonianAI : public FollowerAI
{
- npc_kerlonianAI(Creature* creature) : FollowerAI(creature) { }
+ npc_kerlonianAI(Creature* creature) : FollowerAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ FallAsleepTimer = urand(10000, 45000);
+ }
uint32 FallAsleepTimer;
void Reset() override
{
- FallAsleepTimer = urand(10000, 45000);
+ Initialize();
}
void MoveInLineOfSight(Unit* who) override
diff --git a/src/server/scripts/Kalimdor/zone_durotar.cpp b/src/server/scripts/Kalimdor/zone_durotar.cpp
index a1df70522a8..e2f8dd0854d 100644
--- a/src/server/scripts/Kalimdor/zone_durotar.cpp
+++ b/src/server/scripts/Kalimdor/zone_durotar.cpp
@@ -51,7 +51,17 @@ public:
struct npc_lazy_peonAI : public ScriptedAI
{
- npc_lazy_peonAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_lazy_peonAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ PlayerGUID = 0;
+ RebuffTimer = 0;
+ work = false;
+ }
uint64 PlayerGUID;
@@ -60,9 +70,7 @@ public:
void Reset() override
{
- PlayerGUID = 0;
- RebuffTimer = 0;
- work = false;
+ Initialize();
}
void MovementInform(uint32 /*type*/, uint32 id) override
@@ -360,6 +368,13 @@ class npc_troll_volunteer : public CreatureScript
{
npc_troll_volunteerAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
+ _mountModel = 0;
+ }
+
+ void Initialize()
+ {
+ _complete = false;
}
void InitializeAI() override
@@ -391,7 +406,7 @@ class npc_troll_volunteer : public CreatureScript
void Reset() override
{
- _complete = false;
+ Initialize();
me->AddAura(SPELL_VOLUNTEER_AURA, me);
me->AddAura(SPELL_MOUNTING_CHECK, me);
DoCast(me, SPELL_PETACT_AURA);
diff --git a/src/server/scripts/Kalimdor/zone_moonglade.cpp b/src/server/scripts/Kalimdor/zone_moonglade.cpp
index 0c07d5dc6df..268db8da779 100644
--- a/src/server/scripts/Kalimdor/zone_moonglade.cpp
+++ b/src/server/scripts/Kalimdor/zone_moonglade.cpp
@@ -298,9 +298,20 @@ public:
public:
npc_clintar_spiritAI(Creature* creature) : npc_escortAI(creature)
{
+ Initialize();
PlayerGUID = 0;
}
+ void Initialize()
+ {
+ Step = 0;
+ CurrWP = 0;
+ EventTimer = 0;
+ PlayerGUID = 0;
+ checkPlayerTimer = 1000;
+ EventOnWait = false;
+ }
+
uint8 Step;
uint32 CurrWP;
uint32 EventTimer;
@@ -313,14 +324,7 @@ public:
void Reset() override
{
if (!PlayerGUID)
- {
- Step = 0;
- CurrWP = 0;
- EventTimer = 0;
- PlayerGUID = 0;
- checkPlayerTimer = 1000;
- EventOnWait = false;
- }
+ Initialize();
}
void IsSummonedBy(Unit* /*summoner*/) override
diff --git a/src/server/scripts/Kalimdor/zone_mulgore.cpp b/src/server/scripts/Kalimdor/zone_mulgore.cpp
index fa35371f3f2..289d7282ac6 100644
--- a/src/server/scripts/Kalimdor/zone_mulgore.cpp
+++ b/src/server/scripts/Kalimdor/zone_mulgore.cpp
@@ -62,7 +62,19 @@ public:
struct npc_kyle_frenziedAI : public ScriptedAI
{
- npc_kyle_frenziedAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_kyle_frenziedAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ EventActive = false;
+ IsMovingToLunch = false;
+ PlayerGUID = 0;
+ EventTimer = 5000;
+ EventPhase = 0;
+ }
bool EventActive;
bool IsMovingToLunch;
@@ -72,11 +84,7 @@ public:
void Reset() override
{
- EventActive = false;
- IsMovingToLunch = false;
- PlayerGUID = 0;
- EventTimer = 5000;
- EventPhase = 0;
+ Initialize();
if (me->GetEntry() == NPC_KYLE_FRIENDLY)
me->UpdateEntry(NPC_KYLE_FRENZIED);
@@ -235,7 +243,17 @@ public:
struct npc_plains_visionAI : public ScriptedAI
{
- npc_plains_visionAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_plains_visionAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ WayPointId = 0;
+ newWaypoint = true;
+ amountWP = 49;
+ }
bool newWaypoint;
uint8 WayPointId;
@@ -243,9 +261,7 @@ public:
void Reset() override
{
- WayPointId = 0;
- newWaypoint = true;
- amountWP = 49;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
diff --git a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
index 5ae50ff7c8e..fd666b7fcd7 100644
--- a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
+++ b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
@@ -64,7 +64,19 @@ public:
struct npc_shenthulAI : public ScriptedAI
{
- npc_shenthulAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_shenthulAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ CanTalk = false;
+ CanEmote = false;
+ SaluteTimer = 6000;
+ ResetTimer = 0;
+ PlayerGUID = 0;
+ }
bool CanTalk;
bool CanEmote;
@@ -74,11 +86,7 @@ public:
void Reset() override
{
- CanTalk = false;
- CanEmote = false;
- SaluteTimer = 6000;
- ResetTimer = 0;
- PlayerGUID = 0;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
@@ -211,15 +219,23 @@ public:
struct npc_thrall_warchiefAI : public ScriptedAI
{
- npc_thrall_warchiefAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_thrall_warchiefAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ ChainLightningTimer = 2000;
+ ShockTimer = 8000;
+ }
uint32 ChainLightningTimer;
uint32 ShockTimer;
void Reset() override
{
- ChainLightningTimer = 2000;
- ShockTimer = 8000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp
index 3ddf97c164d..55f36779145 100644
--- a/src/server/scripts/Kalimdor/zone_silithus.cpp
+++ b/src/server/scripts/Kalimdor/zone_silithus.cpp
@@ -422,7 +422,23 @@ public:
struct npc_anachronos_the_ancientAI : public ScriptedAI
{
- npc_anachronos_the_ancientAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_anachronos_the_ancientAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ AnimationTimer = 1500;
+ AnimationCount = 0;
+ AnachronosQuestTriggerGUID = 0;
+ MerithraGUID = 0;
+ ArygosGUID = 0;
+ CaelestraszGUID = 0;
+ FandralGUID = 0;
+ PlayerGUID = 0;
+ eventEnd = false;
+ }
uint32 AnimationTimer;
uint8 AnimationCount;
@@ -437,15 +453,7 @@ public:
void Reset() override
{
- AnimationTimer = 1500;
- AnimationCount = 0;
- AnachronosQuestTriggerGUID = 0;
- MerithraGUID = 0;
- ArygosGUID = 0;
- CaelestraszGUID = 0;
- FandralGUID = 0;
- PlayerGUID = 0;
- eventEnd = false;
+ Initialize();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
@@ -750,7 +758,22 @@ public:
struct npc_qiraj_war_spawnAI : public ScriptedAI
{
- npc_qiraj_war_spawnAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_qiraj_war_spawnAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ SpellTimer1 = 0;
+ SpellTimer2 = 0;
+ SpellTimer3 = 0;
+ SpellTimer4 = 0;
+ }
+
+ void Initialize()
+ {
+ MobGUID = 0;
+ PlayerGUID = 0;
+ Timers = false;
+ hasTarget = false;
+ }
uint64 MobGUID;
uint64 PlayerGUID;
@@ -760,10 +783,7 @@ public:
void Reset() override
{
- MobGUID = 0;
- PlayerGUID = 0;
- Timers = false;
- hasTarget = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
@@ -863,7 +883,24 @@ public:
struct npc_anachronos_quest_triggerAI : public ScriptedAI
{
- npc_anachronos_quest_triggerAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_anachronos_quest_triggerAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ PlayerGUID = 0;
+
+ WaveTimer = 2000;
+ AnnounceTimer = 1000;
+ LiveCount = 0;
+ WaveCount = 0;
+
+ EventStarted = false;
+ Announced = false;
+ Failed = false;
+ }
uint64 PlayerGUID;
@@ -879,16 +916,7 @@ public:
void Reset() override
{
- PlayerGUID = 0;
-
- WaveTimer = 2000;
- AnnounceTimer = 1000;
- LiveCount = 0;
- WaveCount = 0;
-
- EventStarted = false;
- Announced = false;
- Failed = false;
+ Initialize();
me->SetVisible(false);
}
diff --git a/src/server/scripts/Kalimdor/zone_tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp
index 23e8e2f26ff..fce0608faaf 100644
--- a/src/server/scripts/Kalimdor/zone_tanaris.cpp
+++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp
@@ -64,7 +64,21 @@ public:
struct npc_aquementasAI : public ScriptedAI
{
- npc_aquementasAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_aquementasAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ SendItemTimer = 0;
+ SwitchFactionTimer = 10000;
+
+ isFriendly = true;
+
+ AquaJetTimer = 5000;
+ FrostShockTimer = 1000;
+ }
uint32 SendItemTimer;
uint32 SwitchFactionTimer;
@@ -75,13 +89,8 @@ public:
void Reset() override
{
- SendItemTimer = 0;
- SwitchFactionTimer = 10000;
+ Initialize();
me->setFaction(35);
- isFriendly = true;
-
- AquaJetTimer = 5000;
- FrostShockTimer = 1000;
}
void SendItem(Unit* receiver)
@@ -526,7 +535,19 @@ public:
struct npc_toogaAI : public FollowerAI
{
- npc_toogaAI(Creature* creature) : FollowerAI(creature) { }
+ npc_toogaAI(Creature* creature) : FollowerAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ CheckSpeechTimer = 2500;
+ PostEventTimer = 1000;
+ PhasePostEvent = 0;
+
+ TortaGUID = 0;
+ }
uint32 CheckSpeechTimer;
uint32 PostEventTimer;
@@ -536,11 +557,7 @@ public:
void Reset() override
{
- CheckSpeechTimer = 2500;
- PostEventTimer = 1000;
- PhasePostEvent = 0;
-
- TortaGUID = 0;
+ Initialize();
}
void MoveInLineOfSight(Unit* who) override
diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp
index b158422054f..ced964048c2 100644
--- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp
+++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp
@@ -200,9 +200,17 @@ public:
{
npc_taskmaster_fizzuleAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
factionNorm = creature->getFaction();
}
+ void Initialize()
+ {
+ IsFriend = false;
+ ResetTimer = 120000;
+ FlareCount = 0;
+ }
+
uint32 factionNorm;
bool IsFriend;
uint32 ResetTimer;
@@ -210,9 +218,7 @@ public:
void Reset() override
{
- IsFriend = false;
- ResetTimer = 120000;
- FlareCount = 0;
+ Initialize();
me->setFaction(factionNorm);
}
@@ -314,20 +320,12 @@ public:
struct npc_twiggy_flatheadAI : public ScriptedAI
{
- npc_twiggy_flatheadAI(Creature* creature) : ScriptedAI(creature) { }
-
- bool EventInProgress;
- bool EventGrate;
- bool EventBigWill;
- bool ChallengerDown[6];
- uint8 Wave;
- uint32 WaveTimer;
- uint32 ChallengerChecker;
- uint64 PlayerGUID;
- uint64 AffrayChallenger[6];
- uint64 BigWill;
+ npc_twiggy_flatheadAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
EventInProgress = false;
EventGrate = false;
@@ -345,6 +343,22 @@ public:
BigWill = 0;
}
+ bool EventInProgress;
+ bool EventGrate;
+ bool EventBigWill;
+ bool ChallengerDown[6];
+ uint8 Wave;
+ uint32 WaveTimer;
+ uint32 ChallengerChecker;
+ uint64 PlayerGUID;
+ uint64 AffrayChallenger[6];
+ uint64 BigWill;
+
+ void Reset() override
+ {
+ Initialize();
+ }
+
void MoveInLineOfSight(Unit* who) override
{
if (!who || !who->IsAlive() || EventInProgress)
diff --git a/src/server/scripts/Kalimdor/zone_thousand_needles.cpp b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp
index b36037d9995..9092d4e06e5 100644
--- a/src/server/scripts/Kalimdor/zone_thousand_needles.cpp
+++ b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp
@@ -324,14 +324,23 @@ public:
struct npc_pluckyAI : public ScriptedAI
{
- npc_pluckyAI(Creature* creature) : ScriptedAI(creature) { NormFaction = creature->getFaction(); }
+ npc_pluckyAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ NormFaction = creature->getFaction();
+ }
+
+ void Initialize()
+ {
+ ResetTimer = 120000;
+ }
uint32 NormFaction;
uint32 ResetTimer;
void Reset() override
{
- ResetTimer = 120000;
+ Initialize();
if (me->getFaction() != NormFaction)
me->setFaction(NormFaction);
diff --git a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
index 3b303ffa463..40b68270c9d 100644
--- a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
+++ b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
@@ -79,7 +79,19 @@ public:
struct npc_cairne_bloodhoofAI : public ScriptedAI
{
- npc_cairne_bloodhoofAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_cairne_bloodhoofAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ BerserkerChargeTimer = 30000;
+ CleaveTimer = 5000;
+ MortalStrikeTimer = 10000;
+ ThunderclapTimer = 15000;
+ UppercutTimer = 10000;
+ }
uint32 BerserkerChargeTimer;
uint32 CleaveTimer;
@@ -89,11 +101,7 @@ public:
void Reset() override
{
- BerserkerChargeTimer = 30000;
- CleaveTimer = 5000;
- MortalStrikeTimer = 10000;
- ThunderclapTimer = 15000;
- UppercutTimer = 10000;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
diff --git a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp
index a1e4467e9fb..ea4c743b8a5 100644
--- a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp
+++ b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp
@@ -77,7 +77,15 @@ public:
struct npc_ameAI : public npc_escortAI
{
- npc_ameAI(Creature* creature) : npc_escortAI(creature) { }
+ npc_ameAI(Creature* creature) : npc_escortAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ DemoralizingShoutTimer = 5000;
+ }
uint32 DemoralizingShoutTimer;
@@ -112,7 +120,7 @@ public:
void Reset() override
{
- DemoralizingShoutTimer = 5000;
+ Initialize();
}
void JustSummoned(Creature* summoned) override
@@ -194,7 +202,18 @@ public:
struct npc_ringoAI : public FollowerAI
{
- npc_ringoAI(Creature* creature) : FollowerAI(creature) { }
+ npc_ringoAI(Creature* creature) : FollowerAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ FaintTimer = urand(30000, 60000);
+ EndEventProgress = 0;
+ EndEventTimer = 1000;
+ SpraggleGUID = 0;
+ }
uint32 FaintTimer;
uint32 EndEventProgress;
@@ -204,10 +223,7 @@ public:
void Reset() override
{
- FaintTimer = urand(30000, 60000);
- EndEventProgress = 0;
- EndEventTimer = 1000;
- SpraggleGUID = 0;
+ Initialize();
}
void MoveInLineOfSight(Unit* who) override
diff --git a/src/server/scripts/Kalimdor/zone_winterspring.cpp b/src/server/scripts/Kalimdor/zone_winterspring.cpp
index 11b720ad8d5..58d9b115398 100644
--- a/src/server/scripts/Kalimdor/zone_winterspring.cpp
+++ b/src/server/scripts/Kalimdor/zone_winterspring.cpp
@@ -317,7 +317,17 @@ public:
npc_ranshallaAI(Creature* creature) : npc_escortAI(creature),
DialogueHelper(introDialogue)
{
- Reset();
+ Initialize();
+ _firstPriestessGUID = 0;
+ _secondPriestessGUID = 0;
+ _guardEluneGUID = 0;
+ _voiceEluneGUID = 0;
+ _altarGUID = 0;
+ }
+
+ void Initialize()
+ {
+ _delayTimer = 0;
}
uint32 _delayTimer;
@@ -330,7 +340,7 @@ public:
void Reset() override
{
- _delayTimer = 0;
+ Initialize();
}
// Called when the player activates the torch / altar
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h
index 3830ba3c8aa..0dc2d68319d 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h
@@ -19,6 +19,7 @@
#define AHNKAHET_H_
#define AhnKahetScriptName "instance_ahnkahet"
+#define DataHeader "AK"
uint32 const EncounterCount = 5;
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 d4dc5efb6d5..79449723a16 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
@@ -61,15 +61,23 @@ class boss_elder_nadox : public CreatureScript
struct boss_elder_nadoxAI : public BossAI
{
- boss_elder_nadoxAI(Creature* creature) : BossAI(creature, DATA_ELDER_NADOX) { }
+ boss_elder_nadoxAI(Creature* creature) : BossAI(creature, DATA_ELDER_NADOX)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
- _Reset();
GuardianSummoned = false;
GuardianDied = false;
}
+ void Reset() override
+ {
+ _Reset();
+ Initialize();
+ }
+
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
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 1c042f4d185..b200a4e9825 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp
@@ -63,9 +63,19 @@ public:
{
boss_volazjAI(Creature* creature) : ScriptedAI(creature), Summons(me)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiMindFlayTimer = 8 * IN_MILLISECONDS;
+ uiShadowBoltVolleyTimer = 5 * IN_MILLISECONDS;
+ uiShiverTimer = 15 * IN_MILLISECONDS;
+ // Used for Insanity handling
+ insanityHandled = 0;
+ }
+
InstanceScript* instance;
uint32 uiMindFlayTimer;
@@ -145,17 +155,13 @@ public:
void Reset() override
{
- uiMindFlayTimer = 8*IN_MILLISECONDS;
- uiShadowBoltVolleyTimer = 5*IN_MILLISECONDS;
- uiShiverTimer = 15*IN_MILLISECONDS;
+ Initialize();
instance->SetBossState(DATA_HERALD_VOLAZJ, NOT_STARTED);
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT);
// Visible for all players in insanity
me->SetPhaseMask((1|16|32|64|128|256), true);
- // Used for Insanity handling
- insanityHandled = 0;
ResetPlayersPhaseMask();
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 905761ce359..7ae8730d57b 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp
@@ -64,11 +64,27 @@ public:
{
boss_jedoga_shadowseekerAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
bFirstTime = true;
bPreDone = false;
}
+ void Initialize()
+ {
+ uiOpFerTimer = urand(15 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
+
+ uiCycloneTimer = 3 * IN_MILLISECONDS;
+ uiBoltTimer = 7 * IN_MILLISECONDS;
+ uiThunderTimer = 12 * IN_MILLISECONDS;
+
+ bOpFerok = false;
+ bOpFerokFail = false;
+ bOnGround = false;
+ bCanDown = false;
+ volunteerWork = true;
+ }
+
InstanceScript* instance;
uint32 uiOpFerTimer;
@@ -86,17 +102,7 @@ public:
void Reset() override
{
- uiOpFerTimer = urand(15*IN_MILLISECONDS, 20*IN_MILLISECONDS);
-
- uiCycloneTimer = 3*IN_MILLISECONDS;
- uiBoltTimer = 7*IN_MILLISECONDS;
- uiThunderTimer = 12*IN_MILLISECONDS;
-
- bOpFerok = false;
- bOpFerokFail = false;
- bOnGround = false;
- bCanDown = false;
- volunteerWork = true;
+ Initialize();
if (!bFirstTime)
instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, FAIL);
@@ -331,9 +337,16 @@ public:
{
npc_jedoga_initiandAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ bWalking = false;
+ bCheckTimer = 2 * IN_MILLISECONDS;
+ }
+
InstanceScript* instance;
uint32 bCheckTimer;
@@ -342,8 +355,7 @@ public:
void Reset() override
{
- bWalking = false;
- bCheckTimer = 2*IN_MILLISECONDS;
+ Initialize();
if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS)
{
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
index bf7b4355ea6..7c9ed240959 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
@@ -35,6 +35,7 @@ class instance_ahnkahet : public InstanceMapScript
{
instance_ahnkahet_InstanceScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
@@ -258,50 +259,15 @@ class instance_ahnkahet : public InstanceMapScript
return true;
}
- std::string GetSaveData() override
+ void WriteSaveDataMore(std::ostringstream& data) override
{
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "A K " << GetBossSaveData() << SpheresState[0] << ' ' << SpheresState[1];
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
+ data << SpheresState[0] << ' ' << SpheresState[1];
}
- void Load(char const* str) override
+ void ReadSaveDataMore(std::istringstream& data) override
{
- 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 == 'A' && dataHead2 == 'K')
- {
- for (uint32 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
-
- loadStream >> SpheresState[0];
- loadStream >> SpheresState[1];
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
+ data >> SpheresState[0];
+ data >> SpheresState[1];
}
protected:
@@ -317,7 +283,7 @@ class instance_ahnkahet : public InstanceMapScript
std::set<uint64> InitiandGUIDs;
- uint8 SpheresState[2];
+ uint32 SpheresState[2];
uint8 SwitchTrigger;
};
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h
index 674e5cf36bb..c274b283c1d 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h
@@ -19,6 +19,7 @@
#define AZJOL_NERUB_H_
#define AzjolNerubScriptName "instance_azjol_nerub"
+#define DataHeader "AN"
uint32 const EncounterCount = 3;
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
index bf5855c3318..49d0840f08a 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
@@ -87,7 +87,29 @@ public:
{
boss_anub_arakAI(Creature* creature) : ScriptedAI(creature), Summons(me)
{
+ Initialize();
instance = creature->GetInstanceScript();
+ GuardianSummoned = false;
+ VenomancerSummoned = false;
+ DatterSummoned = false;
+ UndergroundTimer = 0;
+ VenomancerTimer = 0;
+ DatterTimer = 0;
+ DelayTimer = 0;
+ ImpaleTarget = 0;
+ }
+
+ void Initialize()
+ {
+ CarrionBeetlesTimer = 8 * IN_MILLISECONDS;
+ LeechingSwarmTimer = 20 * IN_MILLISECONDS;
+ ImpaleTimer = 9 * IN_MILLISECONDS;
+ PoundTimer = 15 * IN_MILLISECONDS;
+
+ Phase = PHASE_MELEE;
+ UndergroundPhase = 0;
+ Channeling = false;
+ ImpalePhase = IMPALE_PHASE_TARGET;
}
InstanceScript* instance;
@@ -101,7 +123,6 @@ public:
uint32 CarrionBeetlesTimer;
uint32 LeechingSwarmTimer;
uint32 PoundTimer;
- uint32 SubmergeTimer;
uint32 UndergroundTimer;
uint32 VenomancerTimer;
uint32 DatterTimer;
@@ -115,15 +136,7 @@ public:
void Reset() override
{
- CarrionBeetlesTimer = 8*IN_MILLISECONDS;
- LeechingSwarmTimer = 20*IN_MILLISECONDS;
- ImpaleTimer = 9*IN_MILLISECONDS;
- PoundTimer = 15*IN_MILLISECONDS;
-
- Phase = PHASE_MELEE;
- UndergroundPhase = 0;
- Channeling = false;
- ImpalePhase = IMPALE_PHASE_TARGET;
+ Initialize();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
me->RemoveAura(SPELL_SUBMERGE);
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp
index 10d34be46b6..f8c5c63cf91 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp
@@ -54,11 +54,22 @@ public:
{
boss_hadronoxAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
fMaxDistance = 50.0f;
bFirstTime = true;
}
+ void Initialize()
+ {
+ uiAcidTimer = urand(10 * IN_MILLISECONDS, 14 * IN_MILLISECONDS);
+ uiLeechTimer = urand(3 * IN_MILLISECONDS, 9 * IN_MILLISECONDS);
+ uiPierceTimer = urand(1 * IN_MILLISECONDS, 3 * IN_MILLISECONDS);
+ uiGrabTimer = urand(15 * IN_MILLISECONDS, 19 * IN_MILLISECONDS);
+ uiDoorsTimer = urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS);
+ uiCheckDistanceTimer = 2 * IN_MILLISECONDS;
+ }
+
InstanceScript* instance;
uint32 uiAcidTimer;
@@ -77,12 +88,7 @@ public:
me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 9.0f);
me->SetFloatValue(UNIT_FIELD_COMBATREACH, 9.0f);
- uiAcidTimer = urand(10*IN_MILLISECONDS, 14*IN_MILLISECONDS);
- uiLeechTimer = urand(3*IN_MILLISECONDS, 9*IN_MILLISECONDS);
- uiPierceTimer = urand(1*IN_MILLISECONDS, 3*IN_MILLISECONDS);
- uiGrabTimer = urand(15*IN_MILLISECONDS, 19*IN_MILLISECONDS);
- uiDoorsTimer = urand(20*IN_MILLISECONDS, 30*IN_MILLISECONDS);
- uiCheckDistanceTimer = 2*IN_MILLISECONDS;
+ Initialize();
if (instance->GetBossState(DATA_HADRONOX) != DONE && !bFirstTime)
instance->SetBossState(DATA_HADRONOX, FAIL);
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 106d7e54150..1ae68f5a33e 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
@@ -37,6 +37,7 @@ class instance_azjol_nerub : public InstanceMapScript
{
instance_azjol_nerub_InstanceScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
@@ -128,49 +129,6 @@ class instance_azjol_nerub : public InstanceMapScript
return 0;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "A N " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(char const* str) override
- {
- 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 == 'A' && dataHead2 == 'N')
- {
- for (uint32 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
protected:
uint64 KrikthirGUID;
uint64 HadronoxGUID;
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
index 4c3ca322574..77ced6acef1 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
@@ -130,14 +130,22 @@ public:
struct boss_sartharionAI : public BossAI
{
- boss_sartharionAI(Creature* creature) : BossAI(creature, DATA_SARTHARION) { }
+ boss_sartharionAI(Creature* creature) : BossAI(creature, DATA_SARTHARION)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
- _isBerserk = false;
+ _isBerserk = false;
_isSoftEnraged = false;
_isHardEnraged = false;
- drakeCount = 0;
+ drakeCount = 0;
+ }
+
+ void Reset() override
+ {
+ Initialize();
if (me->HasAura(SPELL_TWILIGHT_REVENGE))
me->RemoveAurasDueToSpell(SPELL_TWILIGHT_REVENGE);
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp
index 0d07a9fde50..5e4a31d6b5e 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp
@@ -34,6 +34,7 @@ public:
void Initialize() override
{
+ SetHeaders(DataHeader);
sartharionGUID = 0;
tenebronGUID = 0;
shadronGUID = 0;
@@ -98,49 +99,6 @@ public:
return 0;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "O S " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* str) override
- {
- 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 == 'O' && dataHead2 == 'S')
- {
- for (uint32 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
protected:
uint64 sartharionGUID;
uint64 tenebronGUID;
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp
index 0a712b69771..58d7c6141b4 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp
@@ -161,19 +161,25 @@ struct dummy_dragonAI : public ScriptedAI
{
dummy_dragonAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ waypointId = 0;
+ portalRespawnTime = 30000;
+ _canMoveFree = false;
+ _canLoot = true;
+ }
+
void Reset() override
{
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
events.Reset();
- waypointId = 0;
- portalRespawnTime = 30000;
- _canMoveFree = false;
- _canLoot = true;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h
index f26ad3a45ed..341a5686e58 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h
+++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h
@@ -19,6 +19,7 @@
#define OBSIDIAN_SANCTUM_H_
#define OSScriptName "instance_obsidian_sanctum"
+#define DataHeader "OS"
uint32 const EncounterCount = 5;
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 69605574f86..4e02b3ad2e8 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
@@ -15,9 +15,9 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "ObjectMgr.h"
-#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "ScriptMgr.h"
+#include "SpellScript.h"
#include "SpellAuraEffects.h"
#include "ruby_sanctum.h"
@@ -73,15 +73,21 @@ class boss_baltharus_the_warborn : public CreatureScript
{
boss_baltharus_the_warbornAI(Creature* creature) : BossAI(creature, DATA_BALTHARUS_THE_WARBORN)
{
+ Initialize();
_introDone = false;
}
+ void Initialize()
+ {
+ _cloneCount = RAID_MODE<uint8>(1, 2, 2, 2);
+ }
+
void Reset() override
{
_Reset();
events.SetPhase(PHASE_INTRO);
events.ScheduleEvent(EVENT_OOC_CHANNEL, 0, 0, PHASE_INTRO);
- _cloneCount = RAID_MODE<uint8>(1, 2, 2, 2);
+ Initialize();
instance->SetData(DATA_BALTHARUS_SHARED_HEALTH, me->GetMaxHealth());
}
@@ -245,7 +251,7 @@ class npc_baltharus_the_warborn_clone : public CreatureScript
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
{
// Setting DATA_BALTHARUS_SHARED_HEALTH to 0 when killed would bug the boss.
- if (_instance && me->GetHealth() > damage)
+ if (me->GetHealth() > damage)
_instance->SetData(DATA_BALTHARUS_SHARED_HEALTH, me->GetHealth() - damage);
}
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 b5c20e95278..e41ea8de38b 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
@@ -204,12 +204,18 @@ class npc_onyx_flamecaller : public CreatureScript
{
npc_onyx_flamecallerAI(Creature* creature) : npc_escortAI(creature), _instance(creature->GetInstanceScript())
{
+ Initialize();
npc_escortAI::SetDespawnAtEnd(false);
}
- void Reset() override
+ void Initialize()
{
_lavaGoutCount = 0;
+ }
+
+ void Reset() override
+ {
+ Initialize();
me->setActive(true);
AddWaypoints();
Start(true, true);
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
index d08c6f66903..9d44e7d884f 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
@@ -262,9 +262,21 @@ struct generic_halionAI : public BossAI
}
}
+ bool CheckInRoom() override
+ {
+ // Rough radius, it is not an exactly perfect circle
+ if (me->GetDistance2d(HalionControllerSpawnPos.GetPositionX(), HalionControllerSpawnPos.GetPositionY()) > 48.5f)
+ {
+ if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_HALION_CONTROLLER)))
+ controller->AI()->EnterEvadeMode();
+ return false;
+ }
+ return true;
+ }
+
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING))
+ if (!UpdateVictim() || !CheckInRoom() || me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
@@ -394,13 +406,6 @@ class boss_halion : public CreatureScript
if (events.IsInPhase(PHASE_TWO))
return;
- // Rough radius, it is not an exactly perfect circle
- if (me->GetDistance2d(HalionControllerSpawnPos.GetPositionX(), HalionControllerSpawnPos.GetPositionY()) > 48.5f)
- {
- EnterEvadeMode();
- return;
- }
-
generic_halionAI::UpdateAI(diff);
}
@@ -596,16 +601,22 @@ class npc_halion_controller : public CreatureScript
npc_halion_controllerAI(Creature* creature) : ScriptedAI(creature),
_instance(creature->GetInstanceScript()), _summons(me)
{
+ Initialize();
me->SetPhaseMask(me->GetPhaseMask() | 0x20, true);
}
- void Reset() override
+ void Initialize()
{
- _summons.DespawnAll();
- _events.Reset();
_materialCorporealityValue = 5;
_materialDamageTaken = 0;
_twilightDamageTaken = 0;
+ }
+
+ void Reset() override
+ {
+ _summons.DespawnAll();
+ _events.Reset();
+ Initialize();
DoCast(me, SPELL_CLEAR_DEBUFFS);
}
@@ -1208,13 +1219,22 @@ class npc_living_ember : public CreatureScript
struct npc_living_emberAI : public ScriptedAI
{
- npc_living_emberAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_living_emberAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ _enrageTimer = 0;
+ }
- void Reset() override
+ void Initialize()
{
_hasEnraged = false;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void EnterCombat(Unit* /*who*/) override
{
_enrageTimer = 20000;
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 199337b0631..696d8e0f2a3 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
@@ -17,6 +17,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "SpellScript.h"
#include "ruby_sanctum.h"
enum Texts
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 eed8168eff8..be756a8ab36 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp
@@ -15,12 +15,13 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "ScriptMgr.h"
#include "InstanceScript.h"
-#include "ruby_sanctum.h"
#include "Player.h"
+#include "ScriptedCreature.h"
+#include "ScriptMgr.h"
#include "TemporarySummon.h"
#include "WorldPacket.h"
+#include "ruby_sanctum.h"
DoorData const doorData[] =
{
@@ -37,6 +38,7 @@ class instance_ruby_sanctum : public InstanceMapScript
{
instance_ruby_sanctum_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
BaltharusTheWarbornGUID = 0;
@@ -52,6 +54,7 @@ class instance_ruby_sanctum : public InstanceMapScript
BaltharusSharedHealth = 0;
FlameWallsGUID = 0;
FlameRingGUID = 0;
+ TwilightFlameRingGUID = 0;
memset(ZarithrianSpawnStalkerGUID, 0, 2 * sizeof(uint64));
memset(BurningTreeGUID, 0, 4 * sizeof(uint64));
@@ -294,17 +297,6 @@ class instance_ruby_sanctum : public InstanceMapScript
return BaltharusSharedHealth;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "R S " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
void FillInitialWorldStates(WorldPacket& data) override
{
data << uint32(WORLDSTATE_CORPOREALITY_MATERIAL) << uint32(50);
@@ -312,39 +304,6 @@ class instance_ruby_sanctum : public InstanceMapScript
data << uint32(WORLDSTATE_CORPOREALITY_TOGGLE) << uint32(0);
}
- void Load(char const* str) override
- {
- 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 == 'R' && dataHead2 == 'S')
- {
- for (uint8 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
-
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
protected:
uint64 BaltharusTheWarbornGUID;
uint64 GeneralZarithrianGUID;
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h
index 016d541cec9..055e04a1328 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h
@@ -18,12 +18,9 @@
#ifndef RUBY_SANCTUM_H_
#define RUBY_SANCTUM_H_
-#include "SpellScript.h"
-#include "Map.h"
-#include "Creature.h"
-#include "GameObjectAI.h"
-
#define RSScriptName "instance_ruby_sanctum"
+#define DataHeader "RS"
+
uint32 const EncounterCount = 4;
Position const HalionControllerSpawnPos = {3156.037f, 533.2656f, 72.97205f, 0.0f};
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 7e9e351ae9c..f2d2c3e3d5b 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp
@@ -156,11 +156,22 @@ public:
{
boss_eadricAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
creature->SetReactState(REACT_PASSIVE);
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
+ void Initialize()
+ {
+ uiVenganceTimer = 10000;
+ uiRadianceTimer = 16000;
+ uiHammerJusticeTimer = 25000;
+ uiResetTimer = 5000;
+
+ bDone = false;
+ }
+
InstanceScript* instance;
uint32 uiVenganceTimer;
@@ -172,12 +183,7 @@ public:
void Reset() override
{
- uiVenganceTimer = 10000;
- uiRadianceTimer = 16000;
- uiHammerJusticeTimer = 25000;
- uiResetTimer = 5000;
-
- bDone = false;
+ Initialize();
}
void DamageTaken(Unit* /*done_by*/, uint32 &damage) override
@@ -260,6 +266,7 @@ public:
{
boss_paletressAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
MemoryGUID = 0;
@@ -268,6 +275,18 @@ public:
creature->RestoreFaction();
}
+ void Initialize()
+ {
+ uiHolyFireTimer = urand(9000, 12000);
+ uiHolySmiteTimer = urand(5000, 7000);
+ uiRenewTimer = urand(2000, 5000);
+
+ uiResetTimer = 7000;
+
+ bHealth = false;
+ bDone = false;
+ }
+
InstanceScript* instance;
uint64 MemoryGUID;
@@ -283,14 +302,7 @@ public:
{
me->RemoveAllAuras();
- uiHolyFireTimer = urand(9000, 12000);
- uiHolySmiteTimer = urand(5000, 7000);
- uiRenewTimer = urand(2000, 5000);
-
- uiResetTimer = 7000;
-
- bHealth = false;
- bDone = false;
+ Initialize();
if (Creature* pMemory = ObjectAccessor::GetCreature(*me, MemoryGUID))
if (pMemory->IsAlive())
@@ -415,7 +427,17 @@ public:
struct npc_memoryAI : public ScriptedAI
{
- npc_memoryAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_memoryAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ uiOldWoundsTimer = 12000;
+ uiShadowPastTimer = 5000;
+ uiWakingNightmare = 7000;
+ }
uint32 uiOldWoundsTimer;
uint32 uiShadowPastTimer;
@@ -423,9 +445,7 @@ public:
void Reset() override
{
- uiOldWoundsTimer = 12000;
- uiShadowPastTimer = 5000;
- uiWakingNightmare = 7000;
+ Initialize();
}
void UpdateAI(uint32 uiDiff) override
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 a8aff70b034..e342b3bbfb1 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp
@@ -83,9 +83,31 @@ public:
{
boss_black_knightAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ bEventInProgress = false;
+ bEvent = false;
+ bSummonArmy = false;
+ bDeathArmyDone = false;
+
+ uiPhase = PHASE_UNDEAD;
+
+ uiIcyTouchTimer = urand(5000, 9000);
+ uiPlagueStrikeTimer = urand(10000, 13000);
+ uiDeathRespiteTimer = urand(15000, 16000);
+ uiObliterateTimer = urand(17000, 19000);
+ uiDesecration = urand(15000, 16000);
+ uiDeathArmyCheckTimer = 7000;
+ uiResurrectTimer = 4000;
+ uiGhoulExplodeTimer = 8000;
+ uiDeathBiteTimer = urand(2000, 4000);
+ uiMarkedDeathTimer = urand(5000, 7000);
+ }
+
InstanceScript* instance;
std::list<uint64> SummonList;
@@ -114,23 +136,7 @@ public:
me->SetDisplayId(me->GetNativeDisplayId());
me->ClearUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED);
- bEventInProgress = false;
- bEvent = false;
- bSummonArmy = false;
- bDeathArmyDone = false;
-
- uiPhase = PHASE_UNDEAD;
-
- uiIcyTouchTimer = urand(5000, 9000);
- uiPlagueStrikeTimer = urand(10000, 13000);
- uiDeathRespiteTimer = urand(15000, 16000);
- uiObliterateTimer = urand(17000, 19000);
- uiDesecration = urand(15000, 16000);
- uiDeathArmyCheckTimer = 7000;
- uiResurrectTimer = 4000;
- uiGhoulExplodeTimer = 8000;
- uiDeathBiteTimer = urand(2000, 4000);
- uiMarkedDeathTimer = urand(5000, 7000);
+ Initialize();
}
void RemoveSummons()
@@ -310,13 +316,21 @@ public:
struct npc_risen_ghoulAI : public ScriptedAI
{
- npc_risen_ghoulAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_risen_ghoulAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ uiAttackTimer = 3500;
+ }
uint32 uiAttackTimer;
void Reset() override
{
- uiAttackTimer = 3500;
+ Initialize();
}
void UpdateAI(uint32 uiDiff) override
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 7dd935e86f0..027238be6d3 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp
@@ -155,12 +155,20 @@ public:
{
generic_vehicleAI_toc5AI(Creature* creature) : npc_escortAI(creature)
{
+ Initialize();
SetDespawnAtEnd(false);
uiWaypointPath = 0;
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiChargeTimer = 5000;
+ uiShieldBreakerTimer = 8000;
+ uiBuffTimer = urand(30000, 60000);
+ }
+
InstanceScript* instance;
uint32 uiChargeTimer;
@@ -171,9 +179,7 @@ public:
void Reset() override
{
- uiChargeTimer = 5000;
- uiShieldBreakerTimer = 8000;
- uiBuffTimer = urand(30000, 60000);
+ Initialize();
}
void SetData(uint32 uiType, uint32 /*uiData*/) override
@@ -311,6 +317,7 @@ public:
{
boss_warrior_toc5AI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
bDone = false;
@@ -324,6 +331,13 @@ public:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
}
+ void Initialize()
+ {
+ uiBladeStormTimer = urand(15000, 20000);
+ uiInterceptTimer = 7000;
+ uiMortalStrikeTimer = urand(8000, 12000);
+ }
+
InstanceScript* instance;
uint8 uiPhase;
@@ -339,9 +353,7 @@ public:
void Reset() override
{
- uiBladeStormTimer = urand(15000, 20000);
- uiInterceptTimer = 7000;
- uiMortalStrikeTimer = urand(8000, 12000);
+ Initialize();
}
void JustReachedHome() override
@@ -443,6 +455,7 @@ public:
{
boss_mage_toc5AI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
bDone = false;
@@ -456,6 +469,14 @@ public:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
}
+ void Initialize()
+ {
+ uiFireBallTimer = 5000;
+ uiPolymorphTimer = 8000;
+ uiBlastWaveTimer = 12000;
+ uiHasteTimer = 22000;
+ }
+
InstanceScript* instance;
uint8 uiPhase;
@@ -471,10 +492,7 @@ public:
void Reset() override
{
- uiFireBallTimer = 5000;
- uiPolymorphTimer = 8000;
- uiBlastWaveTimer = 12000;
- uiHasteTimer = 22000;
+ Initialize();
}
void JustReachedHome() override
@@ -580,6 +598,7 @@ public:
{
boss_shaman_toc5AI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
bDone = false;
@@ -593,6 +612,14 @@ public:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
}
+ void Initialize()
+ {
+ uiChainLightningTimer = 16000;
+ uiHealingWaveTimer = 12000;
+ uiEartShieldTimer = urand(30000, 35000);
+ uiHexMendingTimer = urand(20000, 25000);
+ }
+
InstanceScript* instance;
uint8 uiPhase;
@@ -608,10 +635,7 @@ public:
void Reset() override
{
- uiChainLightningTimer = 16000;
- uiHealingWaveTimer = 12000;
- uiEartShieldTimer = urand(30000, 35000);
- uiHexMendingTimer = urand(20000, 25000);
+ Initialize();
}
void EnterCombat(Unit* who) override
@@ -725,6 +749,7 @@ public:
{
boss_hunter_toc5AI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
bDone = false;
@@ -738,6 +763,17 @@ public:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
}
+ void Initialize()
+ {
+ uiShootTimer = 12000;
+ uiMultiShotTimer = 0;
+ uiLightningArrowsTimer = 7000;
+
+ uiTargetGUID = 0;
+
+ bShoot = false;
+ }
+
InstanceScript* instance;
uint8 uiPhase;
@@ -755,13 +791,7 @@ public:
void Reset() override
{
- uiShootTimer = 12000;
- uiMultiShotTimer = 0;
- uiLightningArrowsTimer = 7000;
-
- uiTargetGUID = 0;
-
- bShoot = false;
+ Initialize();
}
void JustReachedHome() override
@@ -879,6 +909,7 @@ public:
{
boss_rouge_toc5AI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
bDone = false;
@@ -892,6 +923,13 @@ public:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
}
+ void Initialize()
+ {
+ uiEviscerateTimer = 8000;
+ uiFanKivesTimer = 14000;
+ uiPosionBottleTimer = 19000;
+ }
+
InstanceScript* instance;
uint8 uiPhase;
@@ -905,9 +943,7 @@ public:
void Reset() override
{
- uiEviscerateTimer = 8000;
- uiFanKivesTimer = 14000;
- uiPosionBottleTimer = 19000;
+ Initialize();
}
void JustReachedHome() override
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp
index 5209e8b2f94..021947db0f7 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp
@@ -68,6 +68,7 @@ public:
void Initialize() override
{
+ SetHeaders(DataHeader);
uiMovementDone = 0;
uiGrandChampionsDeaths = 0;
uiArgentSoldierDeaths = 0;
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 e0930a1ae2e..f601f06e16c 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
@@ -115,8 +115,6 @@ public:
uint64 uiVehicle2GUID;
uint64 uiVehicle3GUID;
- uint64 uiGrandChampionBoss1;
-
std::list<uint64> Champion1List;
std::list<uint64> Champion2List;
std::list<uint64> Champion3List;
@@ -140,7 +138,7 @@ public:
break;
case DATA_IN_POSITION: //movement done.
me->GetMotionMaster()->MovePoint(1, 735.81f, 661.92f, 412.39f);
- if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_MAIN_GATE)))
+ if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_MAIN_GATE)))
instance->HandleGameObject(go->GetGUID(), false);
NextStep(10000, false, 3);
break;
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h
index 2b69fcbcc08..4e3979dd0f9 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h
@@ -19,6 +19,8 @@
#ifndef DEF_TOC_H
#define DEF_TOC_H
+#define DataHeader "TC"
+
enum Data
{
BOSS_GRAND_CHAMPIONS,
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 7af55ec37ea..2f29e03a2f2 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
@@ -166,6 +166,13 @@ class boss_anubarak_trial : public CreatureScript
{
boss_anubarak_trialAI(Creature* creature) : BossAI(creature, BOSS_ANUBARAK)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _intro = true;
+ _reachedPhase3 = false;
}
void Reset() override
@@ -183,8 +190,7 @@ class boss_anubarak_trial : public CreatureScript
if (!IsHeroic())
events.ScheduleEvent(EVENT_SUMMON_FROST_SPHERE, 20*IN_MILLISECONDS);
- _intro = true;
- _reachedPhase3 = false;
+ Initialize();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
// clean up spawned Frost Spheres
std::list<Creature*> FrostSphereList;
@@ -436,13 +442,19 @@ class npc_swarm_scarab : public CreatureScript
{
npc_swarm_scarabAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
_instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ _determinationTimer = urand(5 * IN_MILLISECONDS, 60 * IN_MILLISECONDS);
+ }
+
void Reset() override
{
me->SetCorpseDelay(0);
- _determinationTimer = urand(5*IN_MILLISECONDS, 60*IN_MILLISECONDS);
+ Initialize();
DoCast(me, SPELL_ACID_MANDIBLE);
me->SetInCombatWithZone();
if (me->IsInCombat())
@@ -508,13 +520,19 @@ class npc_nerubian_burrower : public CreatureScript
{
npc_nerubian_burrowerAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
_instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ _submergeTimer = 30 * IN_MILLISECONDS;
+ }
+
void Reset() override
{
me->SetCorpseDelay(10);
- _submergeTimer = 30*IN_MILLISECONDS;
+ Initialize();
DoCast(me, SPELL_EXPOSE_WEAKNESS);
DoCast(me, SPELL_SPIDER_FRENZY);
DoCast(me, SPELL_AWAKENED);
@@ -669,12 +687,18 @@ class npc_anubarak_spike : public CreatureScript
{
npc_anubarak_spikeAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
}
- void Reset() override
+ void Initialize()
{
_phase = PHASE_NO_MOVEMENT;
_phaseSwitchTimer = 1;
+ }
+
+ void Reset() override
+ {
+ Initialize();
// make sure the spike has everyone on threat list
me->SetInCombatWithZone();
}
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 0a43c01081f..3d59f24b6dd 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp
@@ -348,10 +348,11 @@ class boss_toc_champion_controller : public CreatureScript
{
boss_toc_champion_controllerAI(Creature* creature) : ScriptedAI(creature), _summons(me)
{
+ Initialize();
_instance = creature->GetInstanceScript();
}
- void Reset() override
+ void Initialize()
{
_championsNotStarted = 0;
_championsFailed = 0;
@@ -359,6 +360,11 @@ class boss_toc_champion_controller : public CreatureScript
_inProgress = false;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
std::vector<uint32> SelectChampions(Team playerTeam)
{
std::vector<uint32> vHealersEntries;
@@ -1908,7 +1914,17 @@ class npc_toc_enh_shaman : public CreatureScript
struct npc_toc_enh_shamanAI : public boss_faction_championsAI
{
- npc_toc_enh_shamanAI(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE) { }
+ npc_toc_enh_shamanAI(Creature* creature) : boss_faction_championsAI(creature, AI_MELEE)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _totemCount = 0;
+ _totemOldCenterX = me->GetPositionX();
+ _totemOldCenterY = me->GetPositionY();
+ }
void Reset() override
{
@@ -1920,9 +1936,7 @@ class npc_toc_enh_shaman : public CreatureScript
events.ScheduleEvent(EVENT_DEPLOY_TOTEM, 1*IN_MILLISECONDS);
events.ScheduleEvent(EVENT_WINDFURY, urand(20*IN_MILLISECONDS, 50*IN_MILLISECONDS));
- _totemCount = 0;
- _totemOldCenterX = me->GetPositionX();
- _totemOldCenterY = me->GetPositionY();
+ Initialize();
SetEquipmentSlots(false, 51803, 48013, EQUIP_NO_CHANGE);
summons.DespawnAll();
}
@@ -2192,12 +2206,20 @@ class npc_toc_pet_hunter : public CreatureScript
struct npc_toc_pet_hunterAI : public boss_faction_championsAI
{
- npc_toc_pet_hunterAI(Creature* creature) : boss_faction_championsAI(creature, AI_PET) { }
+ npc_toc_pet_hunterAI(Creature* creature) : boss_faction_championsAI(creature, AI_PET)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _clawTimer = urand(5 * IN_MILLISECONDS, 10 * IN_MILLISECONDS);
+ }
void Reset() override
{
boss_faction_championsAI::Reset();
- _clawTimer = urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS);
+ Initialize();
}
void UpdateAI(uint32 diff) override
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 c0f7b2f1856..a8a370076a8 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp
@@ -315,12 +315,18 @@ class npc_fel_infernal : public CreatureScript
{
npc_fel_infernalAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
_instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ _felStreakTimer = 30 * IN_MILLISECONDS;
+ }
+
void Reset() override
{
- _felStreakTimer = 30*IN_MILLISECONDS;
+ Initialize();
me->SetInCombatWithZone();
}
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 9e75bef9735..f4112b7a43b 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
@@ -492,6 +492,18 @@ struct boss_jormungarAI : public BossAI
{
boss_jormungarAI(Creature* creature) : BossAI(creature, BOSS_BEASTS)
{
+ OtherWormEntry = 0;
+ ModelStationary = 0;
+ ModelMobile = 0;
+
+ BiteSpell = 0;
+ SpewSpell = 0;
+ SpitSpell = 0;
+ SpraySpell = 0;
+
+ Phase = PHASE_MOBILE;
+ Enraged = false;
+ WasMobile = false;
}
void Reset() override
@@ -780,12 +792,18 @@ class npc_slime_pool : public CreatureScript
{
npc_slime_poolAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
_instance = creature->GetInstanceScript();
}
- void Reset() override
+ void Initialize()
{
_cast = false;
+ }
+
+ void Reset() override
+ {
+ Initialize();
me->SetReactState(REACT_PASSIVE);
}
@@ -851,14 +869,11 @@ class boss_icehowl : public CreatureScript
{
boss_icehowlAI(Creature* creature) : BossAI(creature, BOSS_BEASTS)
{
+ Initialize();
}
- void Reset() override
+ void Initialize()
{
- events.ScheduleEvent(EVENT_FEROCIOUS_BUTT, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS));
- events.ScheduleEvent(EVENT_ARCTIC_BREATH, urand(15*IN_MILLISECONDS, 25*IN_MILLISECONDS));
- events.ScheduleEvent(EVENT_WHIRL, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS));
- events.ScheduleEvent(EVENT_MASSIVE_CRASH, 30*IN_MILLISECONDS);
_movementStarted = false;
_movementFinish = false;
_trampleCast = false;
@@ -869,6 +884,15 @@ class boss_icehowl : public CreatureScript
_stage = 0;
}
+ void Reset() override
+ {
+ events.ScheduleEvent(EVENT_FEROCIOUS_BUTT, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS));
+ events.ScheduleEvent(EVENT_ARCTIC_BREATH, urand(15*IN_MILLISECONDS, 25*IN_MILLISECONDS));
+ events.ScheduleEvent(EVENT_WHIRL, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS));
+ events.ScheduleEvent(EVENT_MASSIVE_CRASH, 30*IN_MILLISECONDS);
+ Initialize();
+ }
+
void JustDied(Unit* /*killer*/) override
{
_JustDied();
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 68de65f9f7b..1118c1ec27b 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
@@ -143,6 +143,33 @@ struct boss_twin_baseAI : public BossAI
{
boss_twin_baseAI(Creature* creature) : BossAI(creature, BOSS_VALKIRIES)
{
+ Initialize();
+ AuraState = AURA_STATE_NONE;
+
+ Stage = 0;
+
+ Weapon = 0;
+
+ VortexEmote = 0;
+ SisterNpcId = 0;
+ MyEmphatySpellId = 0;
+ OtherEssenceSpellId = 0;
+ SurgeSpellId = 0;
+ VortexSpellId = 0;
+ ShieldSpellId = 0;
+ TwinPactSpellId = 0;
+ SpikeSpellId = 0;
+ TouchSpellId = 0;
+ }
+
+ void Initialize()
+ {
+ IsBerserk = false;
+
+ SpecialAbilityTimer = 1 * MINUTE*IN_MILLISECONDS;
+ SpikeTimer = 20 * IN_MILLISECONDS;
+ TouchTimer = urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS);
+ BerserkTimer = IsHeroic() ? 6 * MINUTE*IN_MILLISECONDS : 10 * MINUTE*IN_MILLISECONDS;
}
void Reset() override
@@ -153,12 +180,7 @@ struct boss_twin_baseAI : public BossAI
/* Uncomment this once that they are floating above the ground
me->SetLevitate(true);
me->SetFlying(true); */
- IsBerserk = false;
-
- SpecialAbilityTimer = 1*MINUTE*IN_MILLISECONDS;
- SpikeTimer = 20*IN_MILLISECONDS;
- TouchTimer = urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS);
- BerserkTimer = IsHeroic() ? 6*MINUTE*IN_MILLISECONDS : 10*MINUTE*IN_MILLISECONDS;
+ Initialize();
summons.DespawnAll();
}
@@ -524,6 +546,12 @@ struct npc_unleashed_ballAI : public ScriptedAI
{
npc_unleashed_ballAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ RangeCheckTimer = 0.5*IN_MILLISECONDS;
}
void MoveToNextPoint()
@@ -548,7 +576,7 @@ struct npc_unleashed_ballAI : public ScriptedAI
me->SetCanFly(true);
SetCombatMovement(false);
MoveToNextPoint();
- RangeCheckTimer = 0.5*IN_MILLISECONDS;
+ Initialize();
}
void MovementInform(uint32 uiType, uint32 uiId) override
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 7cab84ee4a7..949ee652d81 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
@@ -33,6 +33,7 @@ class instance_trial_of_the_crusader : public InstanceMapScript
void Initialize() override
{
+ SetHeaders(DataHeader);
SetBossNumber(MAX_ENCOUNTERS);
TrialCounter = 50;
EventStage = 0;
@@ -95,11 +96,10 @@ class instance_trial_of_the_crusader : public InstanceMapScript
// make sure Anub'arak isnt missing and floor is destroyed after a crash
if (GetBossState(BOSS_LICH_KING) == DONE && TrialCounter && GetBossState(BOSS_ANUBARAK) != DONE)
{
- Creature* anubArak = ObjectAccessor::GetCreature(*player, GetData64(NPC_ANUBARAK));
- if (!anubArak)
+ if (Creature* anubArak = ObjectAccessor::GetCreature(*player, GetData64(NPC_ANUBARAK)))
anubArak = player->SummonCreature(NPC_ANUBARAK, AnubarakLoc[0].GetPositionX(), AnubarakLoc[0].GetPositionY(), AnubarakLoc[0].GetPositionZ(), 3, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME);
- if (GameObject* floor = GameObject::GetGameObject(*player, GetData64(GO_ARGENT_COLISEUM_FLOOR)))
+ if (GameObject* floor = ObjectAccessor::GetGameObject(*player, GetData64(GO_ARGENT_COLISEUM_FLOOR)))
floor->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED);
}
}
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 11548ba4b1c..b068b458073 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
@@ -201,7 +201,7 @@ class npc_announcer_toc10 : public CreatureScript
}
else if (instance->GetBossState(BOSS_LICH_KING) != DONE)
{
- if (GameObject* floor = GameObject::GetGameObject(*player, instance->GetData64(GO_ARGENT_COLISEUM_FLOOR)))
+ if (GameObject* floor = ObjectAccessor::GetGameObject(*player, instance->GetData64(GO_ARGENT_COLISEUM_FLOOR)))
floor->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED);
creature->CastSpell(creature, SPELL_CORPSE_TELEPORT, false);
@@ -240,7 +240,6 @@ class boss_lich_king_toc : public CreatureScript
void Reset() override
{
- _updateTimer = 0;
me->SetReactState(REACT_PASSIVE);
if (Creature* summoned = me->SummonCreature(NPC_TRIGGER, ToCCommonLoc[2].GetPositionX(), ToCCommonLoc[2].GetPositionY(), ToCCommonLoc[2].GetPositionZ(), 5, TEMPSUMMON_TIMED_DESPAWN, 1*MINUTE*IN_MILLISECONDS))
{
@@ -278,7 +277,7 @@ class boss_lich_king_toc : public CreatureScript
if (_instance->GetData(TYPE_EVENT_NPC) != NPC_LICH_KING)
return;
- _updateTimer = _instance->GetData(TYPE_EVENT_TIMER);
+ uint32 _updateTimer = _instance->GetData(TYPE_EVENT_TIMER);
if (_updateTimer <= uiDiff)
{
switch (_instance->GetData(TYPE_EVENT))
@@ -319,7 +318,7 @@ class boss_lich_king_toc : public CreatureScript
break;
case 5080:
{
- if (GameObject* go = GameObject::GetGameObject(*me, _instance->GetData64(GO_ARGENT_COLISEUM_FLOOR)))
+ if (GameObject* go = ObjectAccessor::GetGameObject(*me, _instance->GetData64(GO_ARGENT_COLISEUM_FLOOR)))
{
go->SetDisplayId(DISPLAYID_DESTROYED_FLOOR);
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED | GO_FLAG_NODESPAWN);
@@ -352,7 +351,6 @@ class boss_lich_king_toc : public CreatureScript
private:
InstanceScript* _instance;
- uint32 _updateTimer;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -370,7 +368,14 @@ class npc_fizzlebang_toc : public CreatureScript
{
npc_fizzlebang_tocAI(Creature* creature) : ScriptedAI(creature), _summons(me)
{
+ Initialize();
_instance = me->GetInstanceScript();
+ _triggerGUID = 0;
+ }
+
+ void Initialize()
+ {
+ _portalGUID = 0;
}
void JustDied(Unit* killer) override
@@ -388,7 +393,7 @@ class npc_fizzlebang_toc : public CreatureScript
void Reset() override
{
me->SetWalk(true);
- _portalGUID = 0;
+ Initialize();
me->GetMotionMaster()->MovePoint(1, ToCCommonLoc[10].GetPositionX(), ToCCommonLoc[10].GetPositionY()-60, ToCCommonLoc[10].GetPositionZ());
}
@@ -423,7 +428,7 @@ class npc_fizzlebang_toc : public CreatureScript
if (_instance->GetData(TYPE_EVENT_NPC) != NPC_FIZZLEBANG)
return;
- _updateTimer = _instance->GetData(TYPE_EVENT_TIMER);
+ uint32 _updateTimer = _instance->GetData(TYPE_EVENT_TIMER);
if (_updateTimer <= uiDiff)
{
switch (_instance->GetData(TYPE_EVENT))
@@ -521,7 +526,6 @@ class npc_fizzlebang_toc : public CreatureScript
private:
InstanceScript* _instance;
SummonList _summons;
- uint32 _updateTimer;
uint64 _portalGUID;
uint64 _triggerGUID;
};
@@ -556,7 +560,7 @@ class npc_tirion_toc : public CreatureScript
if (_instance->GetData(TYPE_EVENT_NPC) != NPC_TIRION)
return;
- _updateTimer = _instance->GetData(TYPE_EVENT_TIMER);
+ uint32 _updateTimer = _instance->GetData(TYPE_EVENT_TIMER);
if (_updateTimer <= uiDiff)
{
switch (_instance->GetData(TYPE_EVENT))
@@ -811,7 +815,6 @@ class npc_tirion_toc : public CreatureScript
}
private:
InstanceScript* _instance;
- uint32 _updateTimer;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -844,7 +847,7 @@ class npc_garrosh_toc : public CreatureScript
if (_instance->GetData(TYPE_EVENT_NPC) != NPC_GARROSH)
return;
- _updateTimer = _instance->GetData(TYPE_EVENT_TIMER);
+ uint32 _updateTimer = _instance->GetData(TYPE_EVENT_TIMER);
if (_updateTimer <= uiDiff)
{
switch (_instance->GetData(TYPE_EVENT))
@@ -895,7 +898,6 @@ class npc_garrosh_toc : public CreatureScript
}
private:
InstanceScript* _instance;
- uint32 _updateTimer;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -928,7 +930,7 @@ class npc_varian_toc : public CreatureScript
if (_instance->GetData(TYPE_EVENT_NPC) != NPC_VARIAN)
return;
- _updateTimer = _instance->GetData(TYPE_EVENT_TIMER);
+ uint32 _updateTimer = _instance->GetData(TYPE_EVENT_TIMER);
if (_updateTimer <= uiDiff)
{
switch (_instance->GetData(TYPE_EVENT))
@@ -979,7 +981,6 @@ class npc_varian_toc : public CreatureScript
}
private:
InstanceScript* _instance;
- uint32 _updateTimer;
};
CreatureAI* GetAI(Creature* creature) const override
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 dc0f390f8e0..cf08fb75228 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h
@@ -5,6 +5,8 @@
#ifndef DEF_CRUSADER_H
#define DEF_CRUSADER_H
+#define DataHeader "TCR"
+
enum DataTypes
{
BOSS_BEASTS = 0,
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp
index a1690598532..694e502e508 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp
@@ -58,10 +58,19 @@ class boss_king_dred : public CreatureScript
struct boss_king_dredAI : public BossAI
{
- boss_king_dredAI(Creature* creature) : BossAI(creature, DATA_KING_DRED) { }
+ boss_king_dredAI(Creature* creature) : BossAI(creature, DATA_KING_DRED)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ raptorsKilled = 0;
+ }
void Reset() override
{
+ Initialize();
_Reset();
}
@@ -166,16 +175,22 @@ class npc_drakkari_gutripper : public CreatureScript
{
npc_drakkari_gutripperAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
}
+ void Initialize()
+ {
+ GutRipTimer = urand(10000, 15000);
+ }
+
InstanceScript* instance;
uint32 GutRipTimer;
void Reset() override
{
- GutRipTimer = urand(10000, 15000);
+ Initialize();
}
void UpdateAI(uint32 diff) override
@@ -216,16 +231,22 @@ class npc_drakkari_scytheclaw : public CreatureScript
{
npc_drakkari_scytheclawAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiRendTimer = urand(10000, 15000);
+ }
+
InstanceScript* instance;
uint32 uiRendTimer;
void Reset() override
{
- uiRendTimer = urand(10000, 15000);
+ Initialize();
}
void UpdateAI(uint32 diff) override
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
index 4e9462a447f..6b26143745b 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
@@ -80,14 +80,23 @@ public:
struct boss_novosAI : public BossAI
{
- boss_novosAI(Creature* creature) : BossAI(creature, DATA_NOVOS) { }
+ boss_novosAI(Creature* creature) : BossAI(creature, DATA_NOVOS)
+ {
+ Initialize();
+ _bubbled = false;
+ }
+
+ void Initialize()
+ {
+ _ohNovos = true;
+ _crystalHandlerCount = 0;
+ }
void Reset() override
{
_Reset();
- _ohNovos = true;
- _crystalHandlerCount = 0;
+ Initialize();
SetCrystalsStatus(false);
SetSummonerStatus(false);
SetBubbled(false);
@@ -280,15 +289,23 @@ public:
struct npc_crystal_channel_targetAI : public ScriptedAI
{
- npc_crystal_channel_targetAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_crystal_channel_targetAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
_spell = 0;
_timer = 0;
_temp = 0;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void UpdateAI(uint32 diff) override
{
if (_spell)
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
index 13d968d9e06..a8f083c97ee 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
@@ -73,12 +73,20 @@ class boss_trollgore : public CreatureScript
struct boss_trollgoreAI : public BossAI
{
- boss_trollgoreAI(Creature* creature) : BossAI(creature, DATA_TROLLGORE) { }
+ boss_trollgoreAI(Creature* creature) : BossAI(creature, DATA_TROLLGORE)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _consumptionJunction = true;
+ }
void Reset() override
{
_Reset();
- _consumptionJunction = true;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
index b5e7be25d73..fd260e2c5ba 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
+++ b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
@@ -19,6 +19,7 @@
#define DRAK_THARON_KEEP_H_
#define DrakTharonKeepScriptName "instance_drak_tharon_keep"
+#define DataHeader "DTK"
uint32 const EncounterCount = 4;
diff --git a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
index d7c21991ca0..30b473b6ebc 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
@@ -29,6 +29,7 @@ class instance_drak_tharon_keep : public InstanceMapScript
{
instance_drak_tharon_keep_InstanceScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
TrollgoreGUID = 0;
@@ -159,49 +160,6 @@ class instance_drak_tharon_keep : public InstanceMapScript
novos->AI()->DoAction(ACTION_CRYSTAL_HANDLER_DIED);
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "D K " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(char const* str) override
- {
- 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 == 'D' && dataHead2 == 'K')
- {
- for (uint32 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
protected:
uint64 TrollgoreGUID;
uint64 NovosGUID;
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
index fe98f005bca..670591a058c 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
@@ -71,14 +71,6 @@ class boss_bronjahm : public CreatureScript
DoCast(me, SPELL_SOULSTORM_CHANNEL, true);
}
- void InitializeAI() override
- {
- if (!instance || static_cast<InstanceMap*>(me->GetMap())->GetScriptId() != sObjectMgr->GetScriptId(FoSScriptName))
- me->IsAIEnabled = false;
- else if (!me->isDead())
- Reset();
- }
-
void Reset() override
{
events.Reset();
@@ -188,7 +180,7 @@ class boss_bronjahm : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<boss_bronjahmAI>(creature);
+ return GetInstanceAI<boss_bronjahmAI>(creature, FoSScriptName);
}
};
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 a048abd6554..4b4fd398e72 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
@@ -130,14 +130,15 @@ class boss_devourer_of_souls : public CreatureScript
{
boss_devourer_of_soulsAI(Creature* creature) : BossAI(creature, DATA_DEVOURER_EVENT)
{
+ Initialize();
+ beamAngle = 0.f;
+ beamAngleDiff = 0.f;
+ wailingSoulTick = 0;
}
- void InitializeAI() override
+ void Initialize()
{
- if (!instance || static_cast<InstanceMap*>(me->GetMap())->GetScriptId() != sObjectMgr->GetScriptId(FoSScriptName))
- me->IsAIEnabled = false;
- else if (!me->isDead())
- Reset();
+ threeFaced = true;
}
void Reset() override
@@ -149,7 +150,7 @@ class boss_devourer_of_souls : public CreatureScript
events.Reset();
summons.DespawnAll();
- threeFaced = true;
+ Initialize();
instance->SetData(DATA_DEVOURER_EVENT, NOT_STARTED);
}
@@ -345,7 +346,7 @@ class boss_devourer_of_souls : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<boss_devourer_of_soulsAI>(creature);
+ return GetInstanceAI<boss_devourer_of_soulsAI>(creature, FoSScriptName);
}
};
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 fc9a786aab9..7a36dfe7fae 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp
@@ -80,10 +80,16 @@ public:
{
npc_sylvanas_fosAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
}
+ void Initialize()
+ {
+ phase = PHASE_NORMAL;
+ }
+
InstanceScript* instance;
EventMap events;
@@ -92,7 +98,7 @@ public:
void Reset() override
{
events.Reset();
- phase = PHASE_NORMAL;
+ Initialize();
}
void DoAction(int32 actionId) override
@@ -203,10 +209,16 @@ public:
{
npc_jaina_fosAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
}
+ void Initialize()
+ {
+ phase = PHASE_NORMAL;
+ }
+
InstanceScript* instance;
EventMap events;
@@ -215,7 +227,7 @@ public:
void Reset() override
{
events.Reset();
- phase = PHASE_NORMAL;
+ Initialize();
}
void DoAction(int32 actionId) override
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h
index 14220e26cdd..34340ae3018 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h
@@ -19,6 +19,7 @@
#define DEF_FORGE_OF_SOULS_H
#define FoSScriptName "instance_forge_of_souls"
+#define DataHeader "FOS"
enum Data
{
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp
index 964787777a7..f3034fa0796 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp
@@ -36,6 +36,7 @@ class instance_forge_of_souls : public InstanceMapScript
{
instance_forge_of_souls_InstanceScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(MAX_ENCOUNTER);
bronjahm = 0;
devourerOfSouls = 0;
@@ -110,47 +111,6 @@ class instance_forge_of_souls : public InstanceMapScript
return 0;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "F S " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* in) override
- {
- if (!in)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
-
- OUT_LOAD_INST_DATA(in);
-
- char dataHead1, dataHead2;
-
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2;
-
- if (dataHead1 == 'F' && dataHead2 == 'S')
- {
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++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:
uint64 bronjahm;
uint64 devourerOfSouls;
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp
index a5577b6a0ea..a014be4369e 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp
@@ -55,12 +55,20 @@ class boss_falric : public CreatureScript
struct boss_falricAI : public boss_horAI
{
- boss_falricAI(Creature* creature) : boss_horAI(creature, DATA_FALRIC) { }
+ boss_falricAI(Creature* creature) : boss_horAI(creature, DATA_FALRIC)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _hopelessnessCount = 0;
+ }
void Reset() override
{
boss_horAI::Reset();
- _hopelessnessCount = 0;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
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 a05035f7b44..578cf4f84fa 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
@@ -19,6 +19,7 @@
#define HALLS_OF_REFLECTION_H_
#define HoRScriptName "instance_halls_of_reflection"
+#define DataHeader "HOR"
uint32 const EncounterCount = 3;
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 6f33e80b92b..51502b8a336 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
@@ -82,6 +82,7 @@ class instance_halls_of_reflection : public InstanceMapScript
{
instance_halls_of_reflection_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
JainaOrSylvanasIntroGUID = 0;
@@ -709,61 +710,25 @@ class instance_halls_of_reflection : public InstanceMapScript
return 0;
}
- std::string GetSaveData() override
+ void WriteSaveDataMore(std::ostringstream& data) override
{
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "H R " << GetBossSaveData() << _introState << ' ' << _frostswornGeneralState;
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
+ data << _introState << ' ' << _frostswornGeneralState;
}
- void Load(char const* in) override
+ void ReadSaveDataMore(std::istringstream& data) override
{
- if (!in)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
-
- OUT_LOAD_INST_DATA(in);
-
- char dataHead1, dataHead2;
-
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2;
-
- if (dataHead1 == 'H' && dataHead2 == 'R')
- {
- for (uint8 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
-
- SetBossState(i, EncounterState(tmpState));
- }
-
- uint32 temp = 0;
- loadStream >> temp;
- if (temp == DONE)
- SetData(DATA_INTRO_EVENT, DONE);
- else
- SetData(DATA_INTRO_EVENT, NOT_STARTED);
-
- loadStream >> temp;
- if (temp == DONE)
- SetData(DATA_FROSTSWORN_GENERAL, DONE);
- else
- SetData(DATA_FROSTSWORN_GENERAL, NOT_STARTED);
- }
+ uint32 temp = 0;
+ data >> temp;
+ if (temp == DONE)
+ SetData(DATA_INTRO_EVENT, DONE);
else
- OUT_LOAD_INST_DATA_FAIL;
+ SetData(DATA_INTRO_EVENT, NOT_STARTED);
- OUT_LOAD_INST_DATA_COMPLETE;
+ data >> temp;
+ if (temp == DONE)
+ SetData(DATA_FROSTSWORN_GENERAL, DONE);
+ else
+ SetData(DATA_FROSTSWORN_GENERAL, NOT_STARTED);
}
private:
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 783f9e245c8..62a6ac41074 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
@@ -82,14 +82,22 @@ class boss_garfrost : public CreatureScript
struct boss_garfrostAI : public BossAI
{
- boss_garfrostAI(Creature* creature) : BossAI(creature, DATA_GARFROST) { }
+ boss_garfrostAI(Creature* creature) : BossAI(creature, DATA_GARFROST)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _permafrostStack = 0;
+ }
void Reset() override
{
_Reset();
events.SetPhase(PHASE_ONE);
SetEquipmentSlots(true);
- _permafrostStack = 0;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
index 3f8e1cc6ee0..5b147344a59 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
@@ -140,6 +140,7 @@ class boss_ick : public CreatureScript
boss_ickAI(Creature* creature) : BossAI(creature, DATA_ICK), _vehicle(creature->GetVehicleKit())
{
ASSERT(_vehicle);
+ _tempThreat = 0;
}
void Reset() override
@@ -286,14 +287,20 @@ class boss_krick : public CreatureScript
{
boss_krickAI(Creature* creature) : ScriptedAI(creature), _instanceScript(creature->GetInstanceScript()), _summons(creature)
{
+ Initialize();
}
- void Reset() override
+ void Initialize()
{
- _events.Reset();
_phase = PHASE_COMBAT;
_outroNpcGUID = 0;
_tyrannusGUID = 0;
+ }
+
+ void Reset() override
+ {
+ _events.Reset();
+ Initialize();
me->SetReactState(REACT_PASSIVE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
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 c4f46136bd9..f392b21b173 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
@@ -293,14 +293,20 @@ class boss_rimefang : public CreatureScript
boss_rimefangAI(Creature* creature) : ScriptedAI(creature), _vehicle(creature->GetVehicleKit())
{
ASSERT(_vehicle);
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _currentWaypoint = 0;
+ _hoarfrostTargetGUID = 0;
}
void Reset() override
{
_events.Reset();
_events.SetPhase(PHASE_NONE);
- _currentWaypoint = 0;
- _hoarfrostTargetGUID = 0;
+ Initialize();
me->SetCanFly(true);
me->SetReactState(REACT_PASSIVE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
index c2df16f03e1..d829b98f926 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
@@ -41,6 +41,7 @@ class instance_pit_of_saron : public InstanceMapScript
{
instance_pit_of_saron_InstanceScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(Doors);
_garfrostGUID = 0;
@@ -51,6 +52,7 @@ class instance_pit_of_saron : public InstanceMapScript
_jainaOrSylvanas1GUID = 0;
_jainaOrSylvanas2GUID = 0;
_teamInInstance = 0;
+ _tyrannusEventGUID = 0;
}
void OnPlayerEnter(Player* player) override
@@ -264,50 +266,6 @@ class instance_pit_of_saron : public InstanceMapScript
return 0;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "P S " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* in) override
- {
- if (!in)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
-
- OUT_LOAD_INST_DATA(in);
-
- char dataHead1, dataHead2;
-
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2;
-
- if (dataHead1 == 'P' && dataHead2 == 'S')
- {
- for (uint8 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:
uint64 _garfrostGUID;
uint64 _krickGUID;
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 7bd9325dd97..4d2ebd44db8 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp
@@ -113,13 +113,19 @@ class npc_iceborn_protodrake : public CreatureScript
npc_iceborn_protodrakeAI(Creature* creature) : ScriptedAI(creature), _vehicle(creature->GetVehicleKit())
{
ASSERT(_vehicle);
+ Initialize();
}
- void Reset() override
+ void Initialize()
{
_frostBreathCooldown = 5000;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void EnterCombat(Unit* /*who*/) override
{
_vehicle->RemoveAllPassengers();
@@ -161,13 +167,19 @@ class npc_geist_ambusher : public CreatureScript
{
npc_geist_ambusherAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
}
- void Reset() override
+ void Initialize()
{
_leapingFaceMaulCooldown = 9000;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void EnterCombat(Unit* who) override
{
if (who->GetTypeId() != TYPEID_PLAYER)
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h
index 2a2f6a25741..4f06c6b2a26 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h
@@ -19,6 +19,7 @@
#define PIT_OF_SARON_H_
#define PoSScriptName "instance_pit_of_saron"
+#define DataHeader "POS"
uint32 const EncounterCount = 3;
diff --git a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp
index 68929d2aa01..001f19679c4 100644
--- a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp
@@ -82,14 +82,14 @@ class boss_drakkari_colossus : public CreatureScript
{
boss_drakkari_colossusAI(Creature* creature) : BossAI(creature, DATA_DRAKKARI_COLOSSUS_EVENT)
{
+ Initialize();
me->SetReactState(REACT_PASSIVE);
introDone = false;
}
- void InitializeAI() override
+ void Initialize()
{
- if (!me->isDead())
- Reset();
+ phase = COLOSSUS_PHASE_NORMAL;
}
void Reset() override
@@ -106,7 +106,7 @@ class boss_drakkari_colossus : public CreatureScript
//events.Reset(); -> done in _Reset();
events.ScheduleEvent(EVENT_MIGHTY_BLOW, urand(10000, 30000));
- phase = COLOSSUS_PHASE_NORMAL;
+ Initialize();
// Note: This should not be called, but before use SetBossState function we should use BossAI
// in all the bosses of the instance
@@ -393,13 +393,19 @@ public:
{
npc_living_mojoAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ mojoWaveTimer = 2 * IN_MILLISECONDS;
+ mojoPuddleTimer = 7 * IN_MILLISECONDS;
+ }
+
void Reset() override
{
- mojoWaveTimer = 2*IN_MILLISECONDS;
- mojoPuddleTimer = 7*IN_MILLISECONDS;
+ Initialize();
}
void MoveMojos(Creature* boss)
diff --git a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp
index 8e0ff54e161..0783a79b381 100644
--- a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp
@@ -44,9 +44,20 @@ public:
{
boss_eckAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiBerserkTimer = urand(60 * IN_MILLISECONDS, 90 * IN_MILLISECONDS); //60-90 secs according to wowwiki
+ uiBiteTimer = 5 * IN_MILLISECONDS;
+ uiSpitTimer = 10 * IN_MILLISECONDS;
+ uiSpringTimer = 8 * IN_MILLISECONDS;
+
+ bBerserk = false;
+ }
+
uint32 uiBerserkTimer;
uint32 uiBiteTimer;
uint32 uiSpitTimer;
@@ -58,12 +69,7 @@ public:
void Reset() override
{
- uiBerserkTimer = urand(60*IN_MILLISECONDS, 90*IN_MILLISECONDS); //60-90 secs according to wowwiki
- uiBiteTimer = 5*IN_MILLISECONDS;
- uiSpitTimer = 10*IN_MILLISECONDS;
- uiSpringTimer = 8*IN_MILLISECONDS;
-
- bBerserk = false;
+ Initialize();
instance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, NOT_STARTED);
}
diff --git a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp
index f1c246dbbea..22e7ac280fd 100644
--- a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp
@@ -77,9 +77,26 @@ public:
{
boss_gal_darahAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiStampedeTimer = 10 * IN_MILLISECONDS;
+ uiWhirlingSlashTimer = 21 * IN_MILLISECONDS;
+ uiPunctureTimer = 10 * IN_MILLISECONDS;
+ uiEnrageTimer = 15 * IN_MILLISECONDS;
+ uiImpalingChargeTimer = 21 * IN_MILLISECONDS;
+ uiStompTimer = 25 * IN_MILLISECONDS;
+ uiTransformationTimer = 9 * IN_MILLISECONDS;
+ uiPhaseCounter = 0;
+
+ shareTheLove = 0;
+ bStartOfTransformation = true;
+ Phase = TROLL;
+ }
+
uint32 uiStampedeTimer;
uint32 uiWhirlingSlashTimer;
uint32 uiPunctureTimer;
@@ -100,21 +117,9 @@ public:
void Reset() override
{
- uiStampedeTimer = 10*IN_MILLISECONDS;
- uiWhirlingSlashTimer = 21*IN_MILLISECONDS;
- uiPunctureTimer = 10*IN_MILLISECONDS;
- uiEnrageTimer = 15*IN_MILLISECONDS;
- uiImpalingChargeTimer = 21*IN_MILLISECONDS;
- uiStompTimer = 25*IN_MILLISECONDS;
- uiTransformationTimer = 9*IN_MILLISECONDS;
- uiPhaseCounter = 0;
+ Initialize();
impaledList.clear();
- shareTheLove = 0;
-
- bStartOfTransformation = true;
-
- Phase = TROLL;
me->SetDisplayId(DISPLAY_TROLL);
diff --git a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp
index 7645d984aac..255a5ece261 100644
--- a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp
@@ -61,9 +61,19 @@ public:
{
boss_moorabiAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiGroundTremorTimer = 18 * IN_MILLISECONDS;
+ uiNumblingShoutTimer = 10 * IN_MILLISECONDS;
+ uiDeterminedStabTimer = 20 * IN_MILLISECONDS;
+ uiTransformationTImer = 12 * IN_MILLISECONDS;
+ bPhase = false;
+ }
+
InstanceScript* instance;
bool bPhase;
@@ -75,11 +85,7 @@ public:
void Reset() override
{
- uiGroundTremorTimer = 18*IN_MILLISECONDS;
- uiNumblingShoutTimer = 10*IN_MILLISECONDS;
- uiDeterminedStabTimer = 20*IN_MILLISECONDS;
- uiTransformationTImer = 12*IN_MILLISECONDS;
- bPhase = false;
+ Initialize();
instance->SetData(DATA_MOORABI_EVENT, NOT_STARTED);
}
diff --git a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp
index 98c8481b5ae..5db49415604 100644
--- a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp
@@ -83,9 +83,19 @@ public:
{
boss_slad_ranAI(Creature* creature) : ScriptedAI(creature), lSummons(me)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiPoisonNovaTimer = 10 * IN_MILLISECONDS;
+ uiPowerfullBiteTimer = 3 * IN_MILLISECONDS;
+ uiVenomBoltTimer = 15 * IN_MILLISECONDS;
+ uiSpawnTimer = 5 * IN_MILLISECONDS;
+ uiPhase = 0;
+ }
+
uint32 uiPoisonNovaTimer;
uint32 uiPowerfullBiteTimer;
uint32 uiVenomBoltTimer;
@@ -100,11 +110,7 @@ public:
void Reset() override
{
- uiPoisonNovaTimer = 10*IN_MILLISECONDS;
- uiPowerfullBiteTimer = 3*IN_MILLISECONDS;
- uiVenomBoltTimer = 15*IN_MILLISECONDS;
- uiSpawnTimer = 5*IN_MILLISECONDS;
- uiPhase = 0;
+ Initialize();
lWrappedPlayers.clear();
lSummons.DespawnAll();
diff --git a/src/server/scripts/Northrend/Gundrak/gundrak.h b/src/server/scripts/Northrend/Gundrak/gundrak.h
index 4cdbec3c157..8f269705a45 100644
--- a/src/server/scripts/Northrend/Gundrak/gundrak.h
+++ b/src/server/scripts/Northrend/Gundrak/gundrak.h
@@ -18,6 +18,8 @@
#ifndef DEF_GUNDRAK_H
#define DEF_GUNDRAK_H
+#define DataHeader "GD"
+
enum Data
{
DATA_SLAD_RAN_EVENT,
diff --git a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
index 273cc4361af..e5efdad27f3 100644
--- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
+++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
@@ -45,6 +45,7 @@ public:
{
instance_gundrak_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
isHeroic = map->IsHeroic();
}
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 a9088207ebe..4b3c50d1388 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
@@ -182,14 +182,20 @@ class boss_blood_council_controller : public CreatureScript
{
boss_blood_council_controllerAI(Creature* creature) : BossAI(creature, DATA_BLOOD_PRINCE_COUNCIL)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _invocationStage = 0;
+ _resetCounter = 0;
}
void Reset() override
{
events.Reset();
me->SetReactState(REACT_PASSIVE);
- _invocationStage = 0;
- _resetCounter = 0;
+ Initialize();
instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, NOT_STARTED);
}
@@ -504,7 +510,7 @@ class boss_prince_keleseth_icc : public CreatureScript
}
}
- bool CheckRoom()
+ bool CheckInRoom() override
{
if (!CheckBoundary(me))
{
@@ -523,7 +529,7 @@ class boss_prince_keleseth_icc : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckRoom())
+ if (!UpdateVictim() || !CheckInRoom())
return;
events.Update(diff);
@@ -723,7 +729,7 @@ class boss_prince_taldaram_icc : public CreatureScript
}
}
- bool CheckRoom()
+ bool CheckInRoom() override
{
if (!CheckBoundary(me))
{
@@ -742,7 +748,7 @@ class boss_prince_taldaram_icc : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckRoom())
+ if (!UpdateVictim() || !CheckInRoom())
return;
events.Update(diff);
@@ -962,7 +968,7 @@ class boss_prince_valanar_icc : public CreatureScript
}
}
- bool CheckRoom()
+ bool CheckInRoom() override
{
if (!CheckBoundary(me))
{
@@ -981,7 +987,7 @@ class boss_prince_valanar_icc : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckRoom())
+ if (!UpdateVictim() || !CheckInRoom())
return;
events.Update(diff);
@@ -1142,6 +1148,7 @@ class npc_ball_of_flame : public CreatureScript
npc_ball_of_flameAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
{
_despawnTimer = 0;
+ _chaseGUID = 0;
}
void Reset() override
@@ -1224,7 +1231,12 @@ class npc_kinetic_bomb : public CreatureScript
struct npc_kinetic_bombAI : public ScriptedAI
{
- npc_kinetic_bombAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_kinetic_bombAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _x = 0.f;
+ _y = 0.f;
+ _groundZ = 0.f;
+ }
void Reset() override
{
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 104a8357917..29d50f1db2a 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
@@ -143,6 +143,14 @@ class boss_blood_queen_lana_thel : public CreatureScript
{
boss_blood_queen_lana_thelAI(Creature* creature) : BossAI(creature, DATA_BLOOD_QUEEN_LANA_THEL)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _offtankGUID = 0;
+ _creditBloodQuickening = false;
+ _killMinchar = false;
}
void Reset() override
@@ -157,10 +165,8 @@ class boss_blood_queen_lana_thel : public CreatureScript
events.ScheduleEvent(EVENT_TWILIGHT_BLOODBOLT, urand(20000, 25000), EVENT_GROUP_NORMAL);
events.ScheduleEvent(EVENT_AIR_PHASE, 124000 + uint32(Is25ManRaid() ? 3000 : 0));
CleanAuras();
- _offtankGUID = 0;
_vampires.clear();
- _creditBloodQuickening = false;
- _killMinchar = false;
+ Initialize();
}
void EnterCombat(Unit* who) override
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
index 5ef84c7bb40..2909946a0db 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
@@ -249,18 +249,24 @@ class boss_deathbringer_saurfang : public CreatureScript
{
boss_deathbringer_saurfangAI(Creature* creature) : BossAI(creature, DATA_DEATHBRINGER_SAURFANG)
{
+ Initialize();
ASSERT(creature->GetVehicleKit()); // we dont actually use it, just check if exists
_introDone = false;
_fallenChampionCastCount = 0;
}
+ void Initialize()
+ {
+ _frenzied = false;
+ _dead = false;
+ }
+
void Reset() override
{
_Reset();
me->SetReactState(REACT_DEFENSIVE);
events.SetPhase(PHASE_COMBAT);
- _frenzied = false;
- _dead = false;
+ Initialize();
me->SetPower(POWER_ENERGY, 0);
DoCast(me, SPELL_ZERO_POWER, true);
DoCast(me, SPELL_BLOOD_LINK, true);
@@ -299,12 +305,6 @@ class boss_deathbringer_saurfang : public CreatureScript
_introDone = true;
- if (GameObject* teleporter = GameObject::GetGameObject(*me, instance->GetData64(GO_SCOURGE_TRANSPORTER_DEATHBRINGER)))
- {
- instance->HandleGameObject(0, false, teleporter);
- teleporter->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- }
-
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_SUMMON_BLOOD_BEAST, 30000, 0, PHASE_COMBAT);
events.ScheduleEvent(EVENT_BERSERK, IsHeroic() ? 360000 : 480000, 0, PHASE_COMBAT);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
index d59e723d070..bbdca1fa8c5 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
@@ -218,6 +218,14 @@ class boss_lady_deathwhisper : public CreatureScript
boss_lady_deathwhisperAI(Creature* creature) : BossAI(creature, DATA_LADY_DEATHWHISPER),
_dominateMindCount(RAID_MODE<uint8>(0, 1, 1, 3)), _introDone(false)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _waveCounter = 0;
+ _nextVengefulShadeTargetGUID = 0;
+ _darnavanGUID = 0;
}
void Reset() override
@@ -225,9 +233,7 @@ class boss_lady_deathwhisper : public CreatureScript
_Reset();
me->SetPower(POWER_MANA, me->GetMaxPower(POWER_MANA));
events.SetPhase(PHASE_ONE);
- _waveCounter = 0;
- _nextVengefulShadeTargetGUID = 0;
- _darnavanGUID = 0;
+ Initialize();
DoCast(me, SPELL_SHADOW_CHANNELING);
me->RemoveAurasDueToSpell(SPELL_BERSERK);
me->RemoveAurasDueToSpell(SPELL_MANA_BARRIER);
@@ -837,6 +843,13 @@ class npc_darnavan : public CreatureScript
{
npc_darnavanAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _canCharge = true;
+ _canShatter = true;
}
void Reset() override
@@ -846,8 +859,7 @@ class npc_darnavan : public CreatureScript
_events.ScheduleEvent(EVENT_DARNAVAN_INTIMIDATING_SHOUT, urand(20000, 25000));
_events.ScheduleEvent(EVENT_DARNAVAN_MORTAL_STRIKE, urand(25000, 30000));
_events.ScheduleEvent(EVENT_DARNAVAN_SUNDER_ARMOR, urand(5000, 8000));
- _canCharge = true;
- _canShatter = true;
+ Initialize();
}
void JustDied(Unit* killer) override
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
index 9d24ad062df..b7bf27177ea 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
@@ -133,6 +133,7 @@ class boss_lord_marrowgar : public CreatureScript
_coldflameLastPos.Relocate(creature);
_introDone = false;
_boneSlice = false;
+ _coldflameTarget = 0;
}
void Reset() override
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
index 11f20129b3e..c1a13c90780 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
@@ -223,6 +223,7 @@ class boss_professor_putricide : public CreatureScript
_baseSpeed(creature->GetSpeedRate(MOVE_RUN)), _experimentState(EXPERIMENT_STATE_OOZE)
{
_phase = PHASE_NONE;
+ _oozeFloodStage = 0;
}
void Reset() override
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index 76c5a93f9c5..3b65c10aaa9 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -221,6 +221,14 @@ class boss_sindragosa : public CreatureScript
{
boss_sindragosaAI(Creature* creature) : BossAI(creature, DATA_SINDRAGOSA), _summoned(false)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _mysticBuffetStack = 0;
+ _isInAirPhase = false;
+ _isThirdPhase = false;
}
void Reset() override
@@ -235,9 +243,7 @@ class boss_sindragosa : public CreatureScript
events.ScheduleEvent(EVENT_UNCHAINED_MAGIC, urand(9000, 14000), EVENT_GROUP_LAND_PHASE);
events.ScheduleEvent(EVENT_ICY_GRIP, 33500, EVENT_GROUP_LAND_PHASE);
events.ScheduleEvent(EVENT_AIR_PHASE, 50000);
- _mysticBuffetStack = 0;
- _isInAirPhase = false;
- _isThirdPhase = false;
+ Initialize();
if (!_summoned)
{
@@ -558,6 +564,7 @@ class npc_ice_tomb : public CreatureScript
npc_ice_tombAI(Creature* creature) : ScriptedAI(creature)
{
_trappedPlayerGUID = 0;
+ _existenceCheckTimer = 0;
SetCombatMovement(false);
}
@@ -765,6 +772,12 @@ class npc_rimefang : public CreatureScript
{
npc_rimefangAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _summoned(false)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _icyBlastCounter = 0;
}
void InitializeAI() override
@@ -783,7 +796,7 @@ class npc_rimefang : public CreatureScript
_events.ScheduleEvent(EVENT_FROST_BREATH_RIMEFANG, urand(12000, 15000));
_events.ScheduleEvent(EVENT_ICY_BLAST, urand(30000, 35000));
me->SetReactState(REACT_DEFENSIVE);
- _icyBlastCounter = 0;
+ Initialize();
if (!_summoned)
{
@@ -922,7 +935,14 @@ class npc_sindragosa_trash : public CreatureScript
{
npc_sindragosa_trashAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
_instance = creature->GetInstanceScript();
+ _frostwyrmId = 0;
+ }
+
+ void Initialize()
+ {
+ _isTaunted = false;
}
void InitializeAI() override
@@ -946,7 +966,7 @@ class npc_sindragosa_trash : public CreatureScript
_events.ScheduleEvent(EVENT_CONCUSSIVE_SHOCK, urand(8000, 10000));
}
- _isTaunted = false;
+ Initialize();
}
void JustRespawned() override
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 b72b953efb4..e2fe441dae2 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
@@ -504,6 +504,13 @@ class boss_the_lich_king : public CreatureScript
{
boss_the_lich_kingAI(Creature* creature) : BossAI(creature, DATA_THE_LICH_KING)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _necroticPlagueStack = 0;
+ _vileSpiritExplosions = 0;
}
void Reset() override
@@ -511,8 +518,7 @@ class boss_the_lich_king : public CreatureScript
_Reset();
me->SetReactState(REACT_PASSIVE);
events.SetPhase(PHASE_INTRO);
- _necroticPlagueStack = 0;
- _vileSpiritExplosions = 0;
+ Initialize();
SetEquipmentSlots(true);
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
index 0c504842c08..2d58a6eeb26 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
@@ -282,6 +282,17 @@ class boss_valithria_dreamwalker : public CreatureScript
boss_valithria_dreamwalkerAI(Creature* creature) : ScriptedAI(creature),
_instance(creature->GetInstanceScript()), _portalCount(RAID_MODE<uint32>(3, 8, 3, 8))
{
+ Initialize();
+ _spawnHealth = me->GetHealth();
+ }
+
+ void Initialize()
+ {
+ _missedPortals = 0;
+ _under25PercentTalkDone = false;
+ _over75PercentTalkDone = false;
+ _justDied = false;
+ _done = false;
}
void InitializeAI() override
@@ -305,11 +316,7 @@ class boss_valithria_dreamwalker : public CreatureScript
// Glyph of Dispel Magic - not a percent heal by effect, its cast with custom basepoints
me->ApplySpellImmune(0, IMMUNITY_ID, 56131, true);
_instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- _missedPortals = 0;
- _under25PercentTalkDone = false;
- _over75PercentTalkDone = false;
- _justDied = false;
- _done = false;
+ Initialize();
}
void AttackStart(Unit* /*target*/) override
@@ -680,6 +687,12 @@ class npc_risen_archmage : public CreatureScript
npc_risen_archmageAI(Creature* creature) : ScriptedAI(creature),
_instance(creature->GetInstanceScript())
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _canCallEnterCombat = true;
}
bool CanAIAttack(Unit const* target) const override
@@ -693,7 +706,7 @@ class npc_risen_archmage : public CreatureScript
_events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, urand(5000, 15000));
_events.ScheduleEvent(EVENT_MANA_VOID, urand(20000, 25000));
_events.ScheduleEvent(EVENT_COLUMN_OF_FROST, urand(10000, 20000));
- _canCallEnterCombat = true;
+ Initialize();
}
void EnterCombat(Unit* /*target*/) override
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
index e85ddc21dda..23569ba77c2 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
@@ -385,17 +385,23 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript
{
npc_highlord_tirion_fordringAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
{
+ Initialize();
}
- void Reset() override
+ void Initialize()
{
- _events.Reset();
_theLichKing = 0;
_bolvarFordragon = 0;
_factionNPC = 0;
_damnedKills = 0;
}
+ void Reset() override
+ {
+ _events.Reset();
+ Initialize();
+ }
+
// IMPORTANT NOTE: This is triggered from per-GUID scripts
// of The Damned SAI
void SetData(uint32 type, uint32 data) override
@@ -939,11 +945,18 @@ class npc_crok_scourgebane : public CreatureScript
_instance(creature->GetInstanceScript()), _respawnTime(creature->GetRespawnDelay()),
_corpseDelay(creature->GetCorpseDelay())
{
+ Initialize();
SetDespawnAtEnd(false);
SetDespawnAtFar(false);
_isEventActive = false;
_isEventDone = _instance->GetBossState(DATA_SISTER_SVALNA) == DONE;
+ _currentWPid = 0;
+ }
+
+ void Initialize()
+ {
_didUnderTenPercentText = false;
+ _wipeCheckTimer = 1000;
}
void Reset() override
@@ -952,8 +965,7 @@ class npc_crok_scourgebane : public CreatureScript
_events.ScheduleEvent(EVENT_SCOURGE_STRIKE, urand(7500, 12500));
_events.ScheduleEvent(EVENT_DEATH_STRIKE, urand(25000, 30000));
me->SetReactState(REACT_DEFENSIVE);
- _didUnderTenPercentText = false;
- _wipeCheckTimer = 1000;
+ Initialize();
}
void DoAction(int32 action) override
@@ -1647,12 +1659,18 @@ class npc_impaling_spear : public CreatureScript
{
npc_impaling_spearAI(Creature* creature) : CreatureAI(creature)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _vehicleCheckTimer = 500;
}
void Reset() override
{
me->SetReactState(REACT_PASSIVE);
- _vehicleCheckTimer = 500;
+ Initialize();
}
void UpdateAI(uint32 diff) override
@@ -2102,15 +2120,8 @@ class at_icc_shutdown_traps : public AreaTriggerScript
bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
{
if (InstanceScript* instance = player->GetInstanceScript())
- {
instance->SetData(DATA_UPPERSPIRE_TELE_ACT, DONE);
- uint64 teleporterGUID = instance->GetData64(GO_SCOURGE_TRANSPORTER_UPPERSPIRE);
- if (GameObject* go = instance->instance->GetGameObject(teleporterGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- }
- }
+
return true;
}
};
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
index fbd3a715fb8..5d2aa9ca02f 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
@@ -19,11 +19,9 @@
#define ICECROWN_CITADEL_H_
#include "SpellScript.h"
-#include "Map.h"
-#include "Creature.h"
-#include "SpellMgr.h"
#define ICCScriptName "instance_icecrown_citadel"
+#define DataHeader "IC"
uint32 const EncounterCount = 13;
uint32 const WeeklyNPCs = 9;
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp
index 469bfc1d310..af07375e14c 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp
@@ -15,12 +15,12 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "InstanceScript.h"
+#include "Player.h"
#include "ScriptedGossip.h"
#include "ScriptMgr.h"
-#include "InstanceScript.h"
-#include "icecrown_citadel.h"
#include "Spell.h"
-#include "Player.h"
+#include "icecrown_citadel.h"
#define GOSSIP_SENDER_ICC_PORT 631
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
index f7f8e3e2489..3f429183fa0 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
@@ -115,6 +115,7 @@ class instance_icecrown_citadel : public InstanceMapScript
{
instance_icecrown_citadel_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
TeamInInstance = 0;
@@ -173,6 +174,9 @@ class instance_icecrown_citadel : public InstanceMapScript
UpperSpireTeleporterActiveState = NOT_STARTED;
BloodQuickeningState = NOT_STARTED;
BloodQuickeningMinutes = 0;
+ FrozenBolvarGUID = 0;
+ PillarsChainedGUID = 0;
+ PillarsUnchainedGUID = 0;
}
// A function to help reduce the number of lines for teleporter management.
@@ -769,20 +773,6 @@ class instance_icecrown_citadel : public InstanceMapScript
return DeathbringerSaurfangEventGUID;
case GO_SAURFANG_S_DOOR:
return DeathbringerSaurfangDoorGUID;
- case GO_SCOURGE_TRANSPORTER_LICHKING:
- return TeleporterLichKingGUID;
- case GO_SCOURGE_TRANSPORTER_UPPERSPIRE:
- return TeleporterUpperSpireGUID;
- case GO_SCOURGE_TRANSPORTER_LIGHTSHAMMER:
- return TeleporterLightsHammerGUID;
- case GO_SCOURGE_TRANSPORTER_RAMPART:
- return TeleporterRampartsGUID;
- case GO_SCOURGE_TRANSPORTER_DEATHBRINGER:
- return TeleporterDeathBringerGUID;
- case GO_SCOURGE_TRANSPORTER_ORATORY:
- return TeleporterOratoryGUID;
- case GO_SCOURGE_TRANSPORTER_SINDRAGOSA:
- return TeleporterSindragosaGUID;
case DATA_FESTERGUT:
return FestergutGUID;
case DATA_ROTFACE:
@@ -907,7 +897,12 @@ class instance_icecrown_citadel : public InstanceMapScript
{
if (GameObject* teleporter = instance->GetGameObject(TeleporterDeathBringerGUID))
SetTeleporterState(teleporter, true);
-
+ break;
+ }
+ case IN_PROGRESS:
+ {
+ if (GameObject* teleporter = instance->GetGameObject(TeleporterDeathBringerGUID))
+ SetTeleporterState(teleporter, false);
break;
}
default:
@@ -1122,7 +1117,11 @@ class instance_icecrown_citadel : public InstanceMapScript
case DATA_UPPERSPIRE_TELE_ACT:
UpperSpireTeleporterActiveState = data;
if (UpperSpireTeleporterActiveState == DONE)
+ {
+ if (GameObject* go = instance->GetGameObject(TeleporterUpperSpireGUID))
+ SetTeleporterState(go, true);
SaveToDB();
+ }
break;
default:
break;
@@ -1324,64 +1323,32 @@ class instance_icecrown_citadel : public InstanceMapScript
}
}
- std::string GetSaveData() override
+ void WriteSaveDataMore(std::ostringstream& data) override
{
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "I C " << GetBossSaveData() << HeroicAttempts << ' '
- << ColdflameJetsState << ' ' << BloodQuickeningState << ' ' << BloodQuickeningMinutes << ' ' << UpperSpireTeleporterActiveState;
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
+ data << HeroicAttempts << ' '
+ << ColdflameJetsState << ' '
+ << BloodQuickeningState << ' '
+ << BloodQuickeningMinutes << ' '
+ << UpperSpireTeleporterActiveState;
}
- void Load(const char* str) override
+ void ReadSaveDataMore(std::istringstream& data) override
{
- 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 == 'I' && 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));
- }
-
- loadStream >> HeroicAttempts;
+ data >> HeroicAttempts;
- uint32 temp = 0;
- loadStream >> temp;
- if (temp == IN_PROGRESS)
- ColdflameJetsState = NOT_STARTED;
- else
- ColdflameJetsState = temp ? DONE : NOT_STARTED;
-
- loadStream >> temp;
- BloodQuickeningState = temp ? DONE : NOT_STARTED; // DONE means finished (not success/fail)
- loadStream >> BloodQuickeningMinutes;
-
- loadStream >> temp;
- UpperSpireTeleporterActiveState = temp ? DONE : NOT_STARTED;
- }
+ uint32 temp = 0;
+ data >> temp;
+ if (temp == IN_PROGRESS)
+ ColdflameJetsState = NOT_STARTED;
else
- OUT_LOAD_INST_DATA_FAIL;
+ ColdflameJetsState = temp ? DONE : NOT_STARTED;
+
+ data >> temp;
+ BloodQuickeningState = temp ? DONE : NOT_STARTED; // DONE means finished (not success/fail)
+ data >> BloodQuickeningMinutes;
- OUT_LOAD_INST_DATA_COMPLETE;
+ data >> temp;
+ UpperSpireTeleporterActiveState = temp ? DONE : NOT_STARTED;
}
void Update(uint32 diff) override
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
index 676e4134f11..35402771494 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
@@ -62,7 +62,15 @@ public:
struct boss_anubrekhanAI : public BossAI
{
- boss_anubrekhanAI(Creature* creature) : BossAI(creature, BOSS_ANUBREKHAN) { }
+ boss_anubrekhanAI(Creature* creature) : BossAI(creature, BOSS_ANUBREKHAN)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ hasTaunted = false;
+ }
bool hasTaunted;
@@ -70,7 +78,7 @@ public:
{
_Reset();
- hasTaunted = false;
+ Initialize();
if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)
{
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp
index e2ff68ab851..a8de1418cc4 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp
@@ -96,12 +96,25 @@ public:
{
boss_four_horsemenAI(Creature* creature) : BossAI(creature, BOSS_HORSEMEN)
{
+ Initialize();
id = Horsemen(0);
for (uint8 i = 0; i < 4; ++i)
if (me->GetEntry() == NPC_HORSEMEN[i])
id = Horsemen(i);
caster = (id == HORSEMEN_LADY || id == HORSEMEN_SIR);
+ }
+
+ void Initialize()
+ {
+ uiEventStarterGUID = 0;
+ nextWP = 0;
+ punishTimer = 2000;
+ nextMovementStarted = false;
+ movementCompleted = false;
+ movementStarted = false;
+ encounterActionAttack = false;
encounterActionReset = false;
+ doDelayPunish = false;
}
Horsemen id;
@@ -124,15 +137,7 @@ public:
instance->SetData(DATA_HORSEMEN0 + id, NOT_STARTED);
me->SetReactState(REACT_AGGRESSIVE);
- uiEventStarterGUID = 0;
- nextWP = 0;
- punishTimer = 2000;
- nextMovementStarted = false;
- movementCompleted = false;
- movementStarted = false;
- encounterActionAttack = false;
- encounterActionReset = false;
- doDelayPunish = false;
+ Initialize();
_Reset();
}
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
index 648fc3c87d2..de9d85db70b 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
@@ -162,7 +162,18 @@ class boss_gothik : public CreatureScript
struct boss_gothikAI : public BossAI
{
- boss_gothikAI(Creature* creature) : BossAI(creature, BOSS_GOTHIK) { }
+ boss_gothikAI(Creature* creature) : BossAI(creature, BOSS_GOTHIK)
+ {
+ Initialize();
+ waveCount = 0;
+ }
+
+ void Initialize()
+ {
+ mergedSides = false;
+ phaseTwo = false;
+ thirtyPercentReached = false;
+ }
uint32 waveCount;
typedef std::vector<Creature*> TriggerVct;
@@ -182,9 +193,7 @@ class boss_gothik : public CreatureScript
me->SetReactState(REACT_PASSIVE);
instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE);
_Reset();
- mergedSides = false;
- phaseTwo = false;
- thirtyPercentReached = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp
index 648da29ca66..2d0e8a6d2b2 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp
@@ -66,7 +66,13 @@ public:
struct boss_heiganAI : public BossAI
{
- boss_heiganAI(Creature* creature) : BossAI(creature, BOSS_HEIGAN) { }
+ boss_heiganAI(Creature* creature) : BossAI(creature, BOSS_HEIGAN)
+ {
+ eruptSection = 0;
+ eruptDirection = false;
+ safetyDance = false;
+ phase = PHASE_FIGHT;
+ }
uint32 eruptSection;
bool eruptDirection;
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
index 61ee650b37a..1c4320fd48b 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
@@ -263,9 +263,20 @@ public:
{
boss_kelthuzadAI(Creature* creature) : BossAI(creature, BOSS_KELTHUZAD), spawns(creature)
{
+ Initialize();
uiFaction = me->getFaction();
}
+ void Initialize()
+ {
+ nGuardiansOfIcecrownCount = 0;
+ uiGuardiansOfIcecrownTimer = 5000; // 5 seconds for summoning each Guardian of Icecrown in phase 3
+
+ Phase = 0;
+ nAbomination = 0;
+ nWeaver = 0;
+ }
+
uint32 Phase;
uint32 uiGuardiansOfIcecrownTimer;
uint32 uiFaction;
@@ -315,12 +326,7 @@ public:
portal->ResetDoorOrButton();
}
- nGuardiansOfIcecrownCount = 0;
- uiGuardiansOfIcecrownTimer = 5000; // 5 seconds for summoning each Guardian of Icecrown in phase 3
-
- Phase = 0;
- nAbomination = 0;
- nWeaver = 0;
+ Initialize();
}
void KilledUnit(Unit* /*victim*/) override
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp
index 9987802a165..736941949d1 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp
@@ -60,15 +60,21 @@ class boss_loatheb : public CreatureScript
{
boss_loathebAI(Creature* creature) : BossAI(creature, BOSS_LOATHEB)
{
+ Initialize();
}
- void Reset() override
+ void Initialize()
{
- _Reset();
_doomCounter = 0;
_sporeLoserData = true;
}
+ void Reset() override
+ {
+ _Reset();
+ Initialize();
+ }
+
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
index ea345c0dee0..0f5320a8fa1 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
@@ -375,7 +375,7 @@ class boss_sapphiron : public CreatureScript
for (IceBlockMap::const_iterator itr = _iceblocks.begin(); itr != _iceblocks.end(); ++itr)
{
- if (GameObject* go = GameObject::GetGameObject(*me, itr->second))
+ if (GameObject* go = ObjectAccessor::GetGameObject(*me, itr->second))
{
if (go->IsInBetween(me, target, 2.0f)
&& me->GetExactDist2d(target->GetPositionX(), target->GetPositionY()) - me->GetExactDist2d(go->GetPositionX(), go->GetPositionY()) < 5.0f)
diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
index e8ed181da5a..173b6e2d094 100644
--- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
@@ -107,6 +107,7 @@ class instance_naxxramas : public InstanceMapScript
{
instance_naxxramas_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
LoadMinionData(minionData);
@@ -427,50 +428,6 @@ class instance_naxxramas : public InstanceMapScript
return false;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "N X " << GetBossSaveData() << playerDied;
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* strIn) override
- {
- if (!strIn)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
-
- OUT_LOAD_INST_DATA(strIn);
-
- char dataHead1, dataHead2;
-
- std::istringstream loadStream(strIn);
- loadStream >> dataHead1 >> dataHead2;
-
- if (dataHead1 == 'N' && dataHead2 == 'X')
- {
- for (uint8 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
-
- SetBossState(i, EncounterState(tmpState));
- }
-
- loadStream >> playerDied;
- }
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
protected:
/* The Arachnid Quarter */
// Grand Widow Faerlina
diff --git a/src/server/scripts/Northrend/Naxxramas/naxxramas.h b/src/server/scripts/Northrend/Naxxramas/naxxramas.h
index b6e87504c77..8325271a403 100644
--- a/src/server/scripts/Northrend/Naxxramas/naxxramas.h
+++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.h
@@ -18,6 +18,8 @@
#ifndef DEF_NAXXRAMAS_H
#define DEF_NAXXRAMAS_H
+#define DataHeader "NAX"
+
uint32 const EncounterCount = 15;
enum Encounter
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 f94acf5d772..ef7dd743515 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h
@@ -18,6 +18,8 @@
#ifndef DEF_EYE_OF_ETERNITY_H
#define DEF_EYE_OF_ETERNITY_H
+#define DataHeader "EOE"
+
enum InstanceData
{
DATA_MALYGOS_EVENT,
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 8a1fb6a9829..1489b78159b 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
@@ -35,6 +35,7 @@ public:
{
instance_eye_of_eternity_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(MAX_ENCOUNTER);
vortexTriggers.clear();
@@ -278,65 +279,23 @@ public:
return 0;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "E E " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* str) override
- {
- 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 == 'E' && dataHead2 == 'E')
- {
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++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:
- std::list<uint64> vortexTriggers;
- std::list<uint64> portalTriggers;
- uint64 malygosGUID;
- uint64 irisGUID;
- uint64 lastPortalGUID;
- uint64 platformGUID;
- uint64 exitPortalGUID;
- uint64 heartOfMagicGUID;
- uint64 alexstraszaBunnyGUID;
- uint64 giftBoxBunnyGUID;
- Position focusingIrisPosition;
- Position exitPortalPosition;
+ private:
+ std::list<uint64> vortexTriggers;
+ std::list<uint64> portalTriggers;
+ uint64 malygosGUID;
+ uint64 irisGUID;
+ uint64 lastPortalGUID;
+ uint64 platformGUID;
+ uint64 exitPortalGUID;
+ uint64 heartOfMagicGUID;
+ uint64 alexstraszaBunnyGUID;
+ uint64 giftBoxBunnyGUID;
+ Position focusingIrisPosition;
+ Position exitPortalPosition;
};
};
void AddSC_instance_eye_of_eternity()
{
- new instance_eye_of_eternity();
+ new instance_eye_of_eternity();
}
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp
index f2118932d61..663f4bca6ac 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp
@@ -55,6 +55,7 @@ public:
void Initialize() override
{
+ SetHeaders(DataHeader);
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
Anomalus = 0;
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/nexus.h b/src/server/scripts/Northrend/Nexus/Nexus/nexus.h
index e9be1a32c2a..c9f5d44c932 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/nexus.h
+++ b/src/server/scripts/Northrend/Nexus/Nexus/nexus.h
@@ -18,6 +18,8 @@
#ifndef DEF_NEXUS_H
#define DEF_NEXUS_H
+#define DataHeader "NEX"
+
enum DataTypes
{
DATA_MAGUS_TELESTRA_EVENT,
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
index 2b15ddf32c4..b758f9c678c 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
@@ -40,6 +40,7 @@ class instance_oculus : public InstanceMapScript
{
instance_oculus_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
@@ -286,49 +287,6 @@ class instance_oculus : public InstanceMapScript
gwhelp->SetPhaseMask(1, true);
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "T O " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(char const* str) override
- {
- 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 == 'T' && 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));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
protected:
uint64 DrakosGUID;
uint64 VarosGUID;
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.h b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h
index f54b1c067f0..268cdb54e3e 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.h
+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h
@@ -19,6 +19,7 @@
#define OCULUS_H_
#define OculusScriptName "instance_oculus"
+#define DataHeader "OC"
uint32 const EncounterCount = 4;
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h
index cef99ce7abd..5dd2e48898b 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h
@@ -19,6 +19,7 @@
#define HALLS_OF_LIGHTNING_H_
#define HoLScriptName "instance_halls_of_lightning"
+#define DataHeader "HOL"
uint32 const EncounterCount = 4;
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp
index 2f5273f0296..0f44f935d24 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp
@@ -36,6 +36,7 @@ class instance_halls_of_lightning : public InstanceMapScript
{
instance_halls_of_lightning_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
@@ -136,49 +137,6 @@ class instance_halls_of_lightning : public InstanceMapScript
return 0;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "H L " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* str) override
- {
- 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 == 'H' && dataHead2 == 'L')
- {
- for (uint32 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
protected:
uint64 GeneralBjarngrimGUID;
uint64 VolkhanGUID;
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
index 3690557d91b..253fbc43a5d 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
@@ -19,6 +19,7 @@
#define HALLS_OF_STONE_H_
#define HoSScriptName "instance_halls_of_stone"
+#define DataHeader "HOS"
uint32 const EncounterCount = 4;
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
index 0c9492c87c0..b7aa606aeeb 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
@@ -15,11 +15,11 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "ScriptMgr.h"
#include "InstanceScript.h"
+#include "Player.h"
+#include "ScriptMgr.h"
#include "WorldSession.h"
#include "halls_of_stone.h"
-#include <Player.h>
DoorData const doorData[] =
{
@@ -36,6 +36,7 @@ class instance_halls_of_stone : public InstanceMapScript
{
instance_halls_of_stone_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
@@ -203,49 +204,6 @@ class instance_halls_of_stone : public InstanceMapScript
return true;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "H S " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(char const* str) override
- {
- 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 == 'H' && dataHead2 == 'S')
- {
- for (uint32 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
protected:
uint64 KrystallusGUID;
uint64 MaidenOfGriefGUID;
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
index a074ce28181..56f5c19c574 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
@@ -123,6 +123,7 @@ class instance_ulduar : public InstanceMapScript
void Initialize() override
{
+ SetHeaders(DataHeader);
SetBossNumber(MAX_ENCOUNTER);
LoadDoorData(doorData);
LoadMinionData(minionData);
@@ -1033,84 +1034,50 @@ class instance_ulduar : public InstanceMapScript
return false;
}
- std::string GetSaveData() override
+ void WriteSaveDataMore(std::ostringstream& data) override
{
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "U U " << GetBossSaveData() << GetData(DATA_COLOSSUS) << ' ' << _algalonTimer << ' ' << (_algalonSummoned ? 1 : 0);
+ data << GetData(DATA_COLOSSUS) << ' ' << _algalonTimer << ' ' << uint32(_algalonSummoned ? 1 : 0);
for (uint8 i = 0; i < 4; ++i)
- saveStream << ' ' << (KeeperGUIDs[i] ? 1 : 0);
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
+ data << ' ' << uint32(KeeperGUIDs[i] ? 1 : 0);
}
- void Load(char const* strIn) override
+ void ReadSaveDataMore(std::istringstream& data) override
{
- if (!strIn)
+ uint32 tempState;
+ data >> tempState;
+ if (tempState == IN_PROGRESS || tempState > SPECIAL)
+ tempState = NOT_STARTED;
+ SetData(DATA_COLOSSUS, tempState);
+
+ data >> _algalonTimer;
+ data >> tempState;
+ _algalonSummoned = tempState != 0;
+ if (_algalonSummoned && GetBossState(BOSS_ALGALON) != DONE)
{
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
-
- OUT_LOAD_INST_DATA(strIn);
-
- char dataHead1, dataHead2;
-
- std::istringstream loadStream(strIn);
- loadStream >> dataHead1 >> dataHead2;
-
- if (dataHead1 == 'U' && dataHead2 == 'U')
- {
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
-
- SetBossState(i, EncounterState(tmpState));
- }
-
- uint32 tempState;
- loadStream >> tempState;
- if (tempState == IN_PROGRESS || tempState > SPECIAL)
- tempState = NOT_STARTED;
- SetData(DATA_COLOSSUS, tempState);
-
- loadStream >> _algalonTimer;
- loadStream >> tempState;
- _algalonSummoned = tempState != 0;
- if (_algalonSummoned && GetBossState(BOSS_ALGALON) != DONE)
- {
- _summonAlgalon = true;
- if (_algalonTimer && _algalonTimer <= 60)
- {
- _events.ScheduleEvent(EVENT_UPDATE_ALGALON_TIMER, 60000);
- DoUpdateWorldState(WORLD_STATE_ALGALON_TIMER_ENABLED, 1);
- DoUpdateWorldState(WORLD_STATE_ALGALON_DESPAWN_TIMER, _algalonTimer);
- }
- }
-
- for (uint8 i = 0; i < 4; ++i)
+ _summonAlgalon = true;
+ if (_algalonTimer && _algalonTimer <= 60)
{
- loadStream >> tempState;
- _summonYSKeeper[i] = tempState != 0;
+ _events.ScheduleEvent(EVENT_UPDATE_ALGALON_TIMER, 60000);
+ DoUpdateWorldState(WORLD_STATE_ALGALON_TIMER_ENABLED, 1);
+ DoUpdateWorldState(WORLD_STATE_ALGALON_DESPAWN_TIMER, _algalonTimer);
}
+ }
- if (GetBossState(BOSS_FREYA) == DONE && !_summonYSKeeper[0])
- _summonObservationRingKeeper[0] = true;
- if (GetBossState(BOSS_HODIR) == DONE && !_summonYSKeeper[1])
- _summonObservationRingKeeper[1] = true;
- if (GetBossState(BOSS_THORIM) == DONE && !_summonYSKeeper[2])
- _summonObservationRingKeeper[2] = true;
- if (GetBossState(BOSS_MIMIRON) == DONE && !_summonYSKeeper[3])
- _summonObservationRingKeeper[3] = true;
+ for (uint8 i = 0; i < 4; ++i)
+ {
+ data >> tempState;
+ _summonYSKeeper[i] = tempState != 0;
}
- OUT_LOAD_INST_DATA_COMPLETE;
+ if (GetBossState(BOSS_FREYA) == DONE && !_summonYSKeeper[0])
+ _summonObservationRingKeeper[0] = true;
+ if (GetBossState(BOSS_HODIR) == DONE && !_summonYSKeeper[1])
+ _summonObservationRingKeeper[1] = true;
+ if (GetBossState(BOSS_THORIM) == DONE && !_summonYSKeeper[2])
+ _summonObservationRingKeeper[2] = true;
+ if (GetBossState(BOSS_MIMIRON) == DONE && !_summonYSKeeper[3])
+ _summonObservationRingKeeper[3] = true;
}
void Update(uint32 diff) override
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h
index 5dfc2b54f6e..9b95d7cf7b8 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h
@@ -19,6 +19,7 @@
#define DEF_ULDUAR_H
#define UlduarScriptName "instance_ulduar"
+#define DataHeader "UU"
extern Position const ObservationRingKeepersPos[4];
extern Position const YSKeepersPos[4];
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp
index 69229be1771..78df568d144 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp
@@ -41,6 +41,7 @@ class instance_utgarde_keep : public InstanceMapScript
{
instance_utgarde_keep_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
LoadMinionData(minionData);
@@ -191,53 +192,16 @@ class instance_utgarde_keep : public InstanceMapScript
}
}
- std::string GetSaveData() override
+ void WriteSaveDataMore(std::ostringstream& data) override
{
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "U K " << GetBossSaveData();
-
for (uint8 i = 0; i < 3; ++i)
- saveStream << Forges[i].Event << ' ';
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
+ data << Forges[i].Event << ' ';
}
- void Load(char const* str) override
+ void ReadSaveDataMore(std::istringstream& data) override
{
- 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 == 'U' && dataHead2 == 'K')
- {
- for (uint32 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
-
- for (uint8 i = 0; i < 3; ++i)
- loadStream >> Forges[i].Event;
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
+ for (uint8 i = 0; i < 3; ++i)
+ data >> Forges[i].Event;
}
protected:
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h
index 240cb8c65db..751239755cf 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h
@@ -19,6 +19,7 @@
#define UTGARDE_KEEP_H_
#define UKScriptName "instance_utgarde_keep"
+#define DataHeader "UK"
uint32 const EncounterCount = 3;
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
index 6eea38c32a3..1bc3f20c3fe 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
@@ -35,6 +35,7 @@ class instance_utgarde_pinnacle : public InstanceMapScript
{
instance_utgarde_pinnacle_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
@@ -181,49 +182,6 @@ class instance_utgarde_pinnacle : public InstanceMapScript
return 0;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "U P " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(char const* str) override
- {
- 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 == 'U' && dataHead2 == 'P')
- {
- for (uint32 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
protected:
uint64 SvalaSorrowgraveGUID;
uint64 GortokPalehoofGUID;
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
index 99acef0b2b3..cccfcede80b 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
@@ -19,6 +19,7 @@
#define UTGARDE_PINNACLE_H_
#define UPScriptName "instance_utgarde_pinnacle"
+#define DataHeader "UP"
uint32 const EncounterCount = 4;
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
index 1f5b16f1a46..959c8b7724d 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
@@ -35,6 +35,7 @@ class instance_vault_of_archavon : public InstanceMapScript
{
instance_vault_of_archavon_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
EmalonGUID = 0;
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h b/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h
index 4a8d52ac306..d321a7b8347 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h
+++ b/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h
@@ -18,6 +18,8 @@
#ifndef DEF_ARCHAVON_H
#define DEF_ARCHAVON_H
+#define DataHeader "VA"
+
uint32 const EncounterCount = 4;
enum Data
diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp
index c799a2f1813..9c81e664fd4 100644
--- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp
+++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp
@@ -170,6 +170,7 @@ public:
void Initialize() override
{
+ SetHeaders(DataHeader);
uiMoragg = 0;
uiErekem = 0;
uiIchoron = 0;
diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.h b/src/server/scripts/Northrend/VioletHold/violet_hold.h
index 96691f5e662..205fbec2487 100644
--- a/src/server/scripts/Northrend/VioletHold/violet_hold.h
+++ b/src/server/scripts/Northrend/VioletHold/violet_hold.h
@@ -18,6 +18,8 @@
#ifndef DEF_VIOLET_HOLD_H
#define DEF_VIOLET_HOLD_H
+#define DataHeader "VIO"
+
enum Data
{
DATA_1ST_BOSS_EVENT,
diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/auchenai_crypts.h b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/auchenai_crypts.h
index d741044eea7..c07c8365c2f 100644
--- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/auchenai_crypts.h
+++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/auchenai_crypts.h
@@ -19,6 +19,7 @@
#define AUCHENAI_CRYPTS_H_
#define ACScriptName "instance_auchenai_crypts"
+#define DataHeader "AC"
uint32 const EncounterCount = 2;
diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/instance_auchenai_crypts.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/instance_auchenai_crypts.cpp
index 4b8a764fa03..33c9aab0cf9 100644
--- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/instance_auchenai_crypts.cpp
+++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/instance_auchenai_crypts.cpp
@@ -28,6 +28,7 @@ class instance_auchenai_crypts : public InstanceMapScript
{
instance_auchenai_crypts_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
}
};
diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp
index b74c800c01b..d9a66f7b420 100644
--- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 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,27 +15,28 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Pandemonius
-SD%Complete: 75
-SDComment: Not known how void blast is done (amount of rapid cast seems to be related to players in party). All mobs remaining in surrounding area should aggro when engaged.
-SDCategory: Auchindoun, Mana Tombs
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "mana_tombs.h"
-enum Pandemonius
+enum Texts
{
SAY_AGGRO = 0,
SAY_KILL = 1,
SAY_DEATH = 2,
- EMOTE_DARK_SHELL = 3,
+ EMOTE_DARK_SHELL = 3
+};
+
+enum Spells
+{
+ SPELL_VOID_BLAST = 32325,
+ SPELL_DARK_SHELL = 32358
+};
- SPELL_VOID_BLAST = 32325,
- H_SPELL_VOID_BLAST = 38760,
- SPELL_DARK_SHELL = 32358,
- H_SPELL_DARK_SHELL = 38759
+enum Events
+{
+ EVENT_VOID_BLAST = 1,
+ EVENT_DARK_SHELL
};
@@ -45,26 +45,17 @@ class boss_pandemonius : public CreatureScript
public:
boss_pandemonius() : CreatureScript("boss_pandemonius") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new boss_pandemoniusAI(creature);
- }
-
- struct boss_pandemoniusAI : public ScriptedAI
+ struct boss_pandemoniusAI : public BossAI
{
- boss_pandemoniusAI(Creature* creature) : ScriptedAI(creature)
+ boss_pandemoniusAI(Creature* creature) : BossAI(creature, DATA_PANDEMONIUS)
{
+ VoidBlastCounter = 0;
}
- uint32 VoidBlast_Timer;
- uint32 DarkShell_Timer;
- uint32 VoidBlast_Counter;
-
void Reset() override
{
- VoidBlast_Timer = 8000 + rand32() % 15000;
- DarkShell_Timer = 20000;
- VoidBlast_Counter = 0;
+ _Reset();
+ VoidBlastCounter = 0;
}
void JustDied(Unit* /*killer*/) override
@@ -79,48 +70,54 @@ public:
void EnterCombat(Unit* /*who*/) override
{
+ _EnterCombat();
Talk(SAY_AGGRO);
+ events.ScheduleEvent(EVENT_DARK_SHELL, 20000);
+ events.ScheduleEvent(EVENT_VOID_BLAST, urand(8000, 23000));
}
- void UpdateAI(uint32 diff) override
+ void ExecuteEvent(uint32 eventId) override
{
- if (!UpdateVictim())
- return;
-
- if (VoidBlast_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- DoCast(target, SPELL_VOID_BLAST);
- VoidBlast_Timer = 500;
- ++VoidBlast_Counter;
- }
-
- if (VoidBlast_Counter == 5)
- {
- VoidBlast_Timer = 15000 + rand32() % 10000;
- VoidBlast_Counter = 0;
- }
- } else VoidBlast_Timer -= diff;
-
- if (!VoidBlast_Counter)
+ switch (eventId)
{
- if (DarkShell_Timer <= diff)
- {
+ case EVENT_VOID_BLAST:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ {
+ DoCast(target, SPELL_VOID_BLAST);
+ ++VoidBlastCounter;
+ }
+
+ if (VoidBlastCounter == 5)
+ {
+ VoidBlastCounter = 0;
+ events.ScheduleEvent(EVENT_VOID_BLAST, urand(15000, 25000));
+ }
+ else
+ {
+ events.ScheduleEvent(EVENT_VOID_BLAST, 500);
+ events.DelayEvents(EVENT_DARK_SHELL, 500);
+ }
+ break;
+ case EVENT_DARK_SHELL:
if (me->IsNonMeleeSpellCast(false))
me->InterruptNonMeleeSpells(true);
-
Talk(EMOTE_DARK_SHELL);
-
DoCast(me, SPELL_DARK_SHELL);
- DarkShell_Timer = 20000;
- } else DarkShell_Timer -= diff;
+ events.ScheduleEvent(EVENT_DARK_SHELL, 20000);
+ break;
+ default:
+ break;
}
-
- DoMeleeAttackIfReady();
}
+
+ private:
+ uint32 VoidBlastCounter;
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetManaTombsAI<boss_pandemoniusAI>(creature);
+ }
};
void AddSC_boss_pandemonius()
diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/instance_mana_tombs.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/instance_mana_tombs.cpp
index 48bea45a95b..4629aadb2bd 100644
--- a/src/server/scripts/Outland/Auchindoun/ManaTombs/instance_mana_tombs.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/instance_mana_tombs.cpp
@@ -28,6 +28,7 @@ class instance_mana_tombs : public InstanceMapScript
{
instance_mana_tombs_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
}
};
diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.h b/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.h
index 89eefa19d6a..7dd9e96a75e 100644
--- a/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.h
+++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.h
@@ -19,6 +19,7 @@
#define MANA_TOMBS_H_
#define MTScriptName "instance_mana_tombs"
+#define DataHeader "MT"
uint32 const EncounterCount = 4;
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
index 308e5e80105..53fbf8f0cf7 100644
--- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
@@ -34,6 +34,7 @@ class instance_sethekk_halls : public InstanceMapScript
{
instance_sethekk_halls_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
}
@@ -60,49 +61,6 @@ class instance_sethekk_halls : public InstanceMapScript
if (go->GetEntry() == GO_IKISS_DOOR)
AddDoor(go, false);
}
-
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "S H " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(char const* str) override
- {
- if (!str)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
-
- OUT_LOAD_INST_DATA(str);
-
- char dataHead1, dataHead2;
-
- std::istringstream loadStream(str);
- loadStream >> dataHead1 >> dataHead2;
-
- if (dataHead1 == 'S' && dataHead2 == 'H')
- {
- for (uint32 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h b/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h
index aeca1b88fcd..4b6bfab46cb 100644
--- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h
@@ -19,6 +19,7 @@
#define SETHEKK_HALLS_H_
#define SHScriptName "instance_sethekk_halls"
+#define DataHeader "SH"
uint32 const EncounterCount = 3;
diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp
index 4df80a0e15b..9bd985130a9 100644
--- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp
@@ -36,6 +36,7 @@ class instance_shadow_labyrinth : public InstanceMapScript
{
instance_shadow_labyrinth_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
@@ -134,49 +135,6 @@ class instance_shadow_labyrinth : public InstanceMapScript
return 0;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "S L " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(char const* str) override
- {
- 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 == 'L')
- {
- for (uint32 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
protected:
uint64 AmbassadorHellmawGUID;
uint64 GrandmasterVorpilGUID;
diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h
index d7ef52cc7a7..1fa70298d41 100644
--- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h
@@ -19,6 +19,7 @@
#define SHADOW_LABYRINTH_H_
#define SLScriptName "instance_shadow_labyrinth"
+#define DataHeader "SL"
uint32 const EncounterCount = 4;
diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.h b/src/server/scripts/Outland/BlackTemple/black_temple.h
index 4af561480be..bbad9ff7651 100644
--- a/src/server/scripts/Outland/BlackTemple/black_temple.h
+++ b/src/server/scripts/Outland/BlackTemple/black_temple.h
@@ -19,6 +19,7 @@
#define BLACK_TEMPLE_H_
#define BTScriptName "instance_black_temple"
+#define DataHeader "BT"
uint32 const EncounterCount = 9;
@@ -65,12 +66,15 @@ enum CreatureIds
NPC_ILLIDARI_COUNCIL = 23426,
NPC_BLOOD_ELF_COUNCIL_VOICE = 23499,
- NPC_ILLIDAN_STORMRAGE = 22917
+ NPC_ILLIDAN_STORMRAGE = 22917,
+
+ NPC_SUPREMUS_VOLCANO = 23085
};
enum GameObjectIds
{
GO_NAJENTUS_GATE = 185483,
+ GO_NAJENTUS_SPINE = 185584,
GO_SUPREMUS_GATE = 185882,
GO_SHADE_OF_AKAMA_DOOR = 185478,
GO_TERON_DOOR_1 = 185480,
diff --git a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp
index 3415451fef5..60162188f7e 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 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,7 +18,7 @@
/* ScriptData
SDName: Boss_Mother_Shahraz
SD%Complete: 80
-SDComment: Saber Lash missing, Fatal Attraction slightly incorrect; need to damage only if affected players are within range of each other
+SDComment: Fatal Attraction slightly incorrect; need to damage only if affected players are within range of each other
SDCategory: Black Temple
EndScriptData */
@@ -27,17 +26,19 @@ EndScriptData */
#include "ScriptedCreature.h"
#include "black_temple.h"
-enum MotherShahraz
+enum Texts
{
//Speech'n'Sounds
- SAY_TAUNT = 0,
- SAY_AGGRO = 1,
- SAY_SPELL = 2,
- SAY_SLAY = 3,
- SAY_ENRAGE = 4,
- SAY_DEATH = 5,
+ SAY_TAUNT = 0,
+ SAY_AGGRO = 1,
+ SAY_SPELL = 2,
+ SAY_SLAY = 3,
+ SAY_ENRAGE = 4,
+ SAY_DEATH = 5
+};
- //Spells
+enum Spells
+{
SPELL_BEAM_SINISTER = 40859,
SPELL_BEAM_VILE = 40860,
SPELL_BEAM_WICKED = 40861,
@@ -51,6 +52,26 @@ enum MotherShahraz
SPELL_BERSERK = 45078
};
+enum Events
+{
+ EVENT_RANDOM_BEAM = 1,
+ EVENT_PRISMATIC_SHIELD,
+ EVENT_FATAL_ATTRACTION,
+ EVENT_FATAL_ATTRACTION_EXPLOSION,
+ EVENT_SABER_SLASH,
+ EVENT_SILENCING_SHRIEK,
+ EVENT_RANDOM_TAUNT,
+ EVENT_BERSERK
+};
+
+enum Beams
+{
+ SINISTER_BEAM,
+ VILE_BEAM,
+ WICKED_BEAM,
+ SINFUL_BEAM
+};
+
uint32 PrismaticAuras[]=
{
40880, // Shadow
@@ -82,62 +103,41 @@ class boss_mother_shahraz : public CreatureScript
public:
boss_mother_shahraz() : CreatureScript("boss_mother_shahraz") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<boss_shahrazAI>(creature);
- }
-
- struct boss_shahrazAI : public ScriptedAI
+ struct boss_shahrazAI : public BossAI
{
- boss_shahrazAI(Creature* creature) : ScriptedAI(creature)
+ boss_shahrazAI(Creature* creature) : BossAI(creature, DATA_MOTHER_SHAHRAZ)
{
- instance = creature->GetInstanceScript();
+ Initialize();
}
- InstanceScript* instance;
-
- uint64 TargetGUID[3];
- uint32 BeamTimer;
- uint32 BeamCount;
- uint32 CurrentBeam;
- uint32 PrismaticShieldTimer;
- uint32 FatalAttractionTimer;
- uint32 FatalAttractionExplodeTimer;
- uint32 ShriekTimer;
- uint32 SaberTimer;
- uint32 RandomYellTimer;
- uint32 EnrageTimer;
- uint32 ExplosionCount;
-
- bool Enraged;
-
- void Reset() override
+ void Initialize()
{
- instance->SetBossState(DATA_MOTHER_SHAHRAZ, NOT_STARTED);
-
for (uint8 i = 0; i<3; ++i)
TargetGUID[i] = 0;
- BeamTimer = 20000; // Timers may be incorrect
BeamCount = 0;
- CurrentBeam = 0; // 0 - Sinister, 1 - Vile, 2 - Wicked, 3 - Sinful
- PrismaticShieldTimer = 0;
- FatalAttractionTimer = 60000;
- FatalAttractionExplodeTimer = 70000;
- ShriekTimer = 30000;
- SaberTimer = 35000;
- RandomYellTimer = urand(70, 111) * 1000;
- EnrageTimer = 600000;
+ CurrentBeam = SINISTER_BEAM; // 0 - Sinister, 1 - Vile, 2 - Wicked, 3 - Sinful
ExplosionCount = 0;
-
Enraged = false;
}
- void EnterCombat(Unit* /*who*/) override
+ void Reset() override
{
- instance->SetBossState(DATA_MOTHER_SHAHRAZ, IN_PROGRESS);
+ Initialize();
+ _Reset();
+ }
- DoZoneInCombat();
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_RANDOM_BEAM, 20000); // Timers may be incorrect
+ events.ScheduleEvent(EVENT_FATAL_ATTRACTION, 60000);
+ events.ScheduleEvent(EVENT_FATAL_ATTRACTION_EXPLOSION, 70000);
+ events.ScheduleEvent(EVENT_SILENCING_SHRIEK, 30000);
+ events.ScheduleEvent(EVENT_SABER_SLASH, 35000);
+ events.ScheduleEvent(EVENT_RANDOM_TAUNT, urand(70000, 111000));
+ events.ScheduleEvent(EVENT_PRISMATIC_SHIELD, 1000);
+ events.ScheduleEvent(EVENT_BERSERK, 600000);
Talk(SAY_AGGRO);
}
@@ -148,152 +148,136 @@ public:
void JustDied(Unit* /*killer*/) override
{
- instance->SetBossState(DATA_MOTHER_SHAHRAZ, DONE);
-
+ _JustDied();
Talk(SAY_DEATH);
}
void TeleportPlayers()
{
- uint32 random = rand32() % 7;
+ uint32 random = urand(0, 7);
float X = TeleportPoint[random].x;
float Y = TeleportPoint[random].y;
float Z = TeleportPoint[random].z;
for (uint8 i = 0; i < 3; ++i)
{
- Unit* unit = SelectTarget(SELECT_TARGET_RANDOM, 1);
- if (unit && unit->IsAlive() && (unit->GetTypeId() == TYPEID_PLAYER))
- {
- TargetGUID[i] = unit->GetGUID();
- unit->CastSpell(unit, SPELL_TELEPORT_VISUAL, true);
- DoTeleportPlayer(unit, X, Y, Z, unit->GetOrientation());
- }
+ if (Unit* unit = SelectTarget(SELECT_TARGET_RANDOM, 1))
+ if (unit->IsAlive() && unit->GetTypeId() == TYPEID_PLAYER)
+ {
+ TargetGUID[i] = unit->GetGUID();
+ unit->CastSpell(unit, SPELL_TELEPORT_VISUAL, true);
+ DoTeleportPlayer(unit, X, Y, Z, unit->GetOrientation());
+ }
}
}
- void UpdateAI(uint32 diff) override
+ void DamageTaken(Unit* /*attacker*/, uint32 &damage) override
{
- if (!UpdateVictim())
- return;
-
- if (HealthBelowPct(10) && !Enraged)
+ if (!Enraged && me->HealthBelowPctDamaged(10, damage))
{
Enraged = true;
DoCast(me, SPELL_ENRAGE, true);
Talk(SAY_ENRAGE);
}
+ }
- //Randomly cast one beam.
- if (BeamTimer <= diff)
- {
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (!target || !target->IsAlive())
- return;
-
- BeamTimer = 9000;
-
- switch (CurrentBeam)
- {
- case 0:
- DoCast(target, SPELL_BEAM_SINISTER);
- break;
- case 1:
- DoCast(target, SPELL_BEAM_VILE);
- break;
- case 2:
- DoCast(target, SPELL_BEAM_WICKED);
- break;
- case 3:
- DoCast(target, SPELL_BEAM_SINFUL);
- break;
- }
- ++BeamCount;
- uint32 Beam = CurrentBeam;
- if (BeamCount > 3)
- while (CurrentBeam == Beam)
- CurrentBeam = rand32() % 3;
-
- } else BeamTimer -= diff;
-
- // Random Prismatic Shield every 15 seconds.
- if (PrismaticShieldTimer <= diff)
- {
- uint32 random = rand32() % 6;
- if (PrismaticAuras[random])
- DoCast(me, PrismaticAuras[random]);
- PrismaticShieldTimer = 15000;
- } else PrismaticShieldTimer -= diff;
-
- // Select 3 random targets (can select same target more than once), teleport to a random location then make them cast explosions until they get away from each other.
- if (FatalAttractionTimer <= diff)
- {
- ExplosionCount = 0;
-
- TeleportPlayers();
-
- Talk(SAY_SPELL);
- FatalAttractionExplodeTimer = 2000;
- FatalAttractionTimer = urand(40, 71) * 1000;
- } else FatalAttractionTimer -= diff;
-
- if (FatalAttractionExplodeTimer <= diff)
+ void ExecuteEvent(uint32 eventId) override
+ {
+ switch (eventId)
{
- // Just make them explode three times... they're supposed to keep exploding while they are in range, but it'll take too much code. I'll try to think of an efficient way for it later.
- if (ExplosionCount < 3)
- {
- for (uint8 i = 0; i < 3; ++i)
+ case EVENT_RANDOM_BEAM:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
{
- if (TargetGUID[i])
+ switch (CurrentBeam)
{
- if (Unit* unit = ObjectAccessor::GetUnit(*me, TargetGUID[i]))
- unit->CastSpell(unit, SPELL_ATTRACTION, true);
- TargetGUID[i] = 0;
+ case SINISTER_BEAM:
+ DoCast(target, SPELL_BEAM_SINISTER);
+ break;
+ case VILE_BEAM:
+ DoCast(target, SPELL_BEAM_VILE);
+ break;
+ case WICKED_BEAM:
+ DoCast(target, SPELL_BEAM_WICKED);
+ break;
+ case SINFUL_BEAM:
+ DoCast(target, SPELL_BEAM_SINFUL);
+ break;
+ default:
+ break;
}
- }
- ++ExplosionCount;
- FatalAttractionExplodeTimer = 1000;
- }
- else
- {
- FatalAttractionExplodeTimer = FatalAttractionTimer + 2000;
+ ++BeamCount;
+ uint32 Beam = CurrentBeam;
+ if (BeamCount > 3)
+ while (CurrentBeam == Beam)
+ CurrentBeam = urand(0, 3);
+ }
+ events.ScheduleEvent(EVENT_RANDOM_BEAM, 9000);
+ break;
+ case EVENT_PRISMATIC_SHIELD:
+ // Random Prismatic Shield every 15 seconds.
+ DoCast(me, PrismaticAuras[urand(0, 6)]);
+ events.ScheduleEvent(EVENT_PRISMATIC_SHIELD, 15000);
+ break;
+ case EVENT_FATAL_ATTRACTION:
+ // Select 3 random targets (can select same target more than once), teleport to a random location then make them cast explosions until they get away from each other.
ExplosionCount = 0;
- }
- } else FatalAttractionExplodeTimer -= diff;
-
- if (ShriekTimer <= diff)
- {
- DoCastVictim(SPELL_SILENCING_SHRIEK);
- ShriekTimer = 25000 + rand32() % 10 * 1000;
- } else ShriekTimer -= diff;
-
- if (SaberTimer <= diff)
- {
- DoCastVictim(SPELL_SABER_LASH);
- SaberTimer = 25000 + rand32() % 10 * 1000;
- } else SaberTimer -= diff;
-
- //Enrage
- if (!me->HasAura(SPELL_BERSERK))
- {
- if (EnrageTimer <= diff)
- {
+ TeleportPlayers();
+ Talk(SAY_SPELL);
+ events.ScheduleEvent(EVENT_FATAL_ATTRACTION_EXPLOSION, 2000);
+ events.ScheduleEvent(EVENT_FATAL_ATTRACTION, 40000, 71000);
+ break;
+ case EVENT_FATAL_ATTRACTION_EXPLOSION:
+ // Just make them explode three times... they're supposed to keep exploding while they are in range, but it'll take too much code. I'll try to think of an efficient way for it later.
+ if (ExplosionCount < 3)
+ {
+ for (uint8 i = 0; i < 3; ++i)
+ {
+ if (TargetGUID[i])
+ {
+ if (Unit* unit = ObjectAccessor::GetUnit(*me, TargetGUID[i]))
+ unit->CastSpell(unit, SPELL_ATTRACTION, true);
+ TargetGUID[i] = 0;
+ }
+ }
+ ++ExplosionCount;
+ }
+ else
+ ExplosionCount = 0;
+ events.ScheduleEvent(EVENT_FATAL_ATTRACTION_EXPLOSION, ExplosionCount < 3 ? 1000 : events.GetTimeUntilEvent(EVENT_FATAL_ATTRACTION) + 2000);
+ break;
+ case EVENT_SILENCING_SHRIEK:
+ DoCastVictim(SPELL_SILENCING_SHRIEK);
+ events.ScheduleEvent(EVENT_SILENCING_SHRIEK, urand(25000, 35000));
+ break;
+ case EVENT_SABER_SLASH:
+ DoCastVictim(SPELL_SABER_LASH);
+ events.ScheduleEvent(EVENT_SABER_SLASH, urand(25000, 35000));
+ break;
+ case EVENT_RANDOM_TAUNT:
+ Talk(SAY_TAUNT);
+ events.ScheduleEvent(EVENT_RANDOM_TAUNT, urand(60000, 151000));
+ break;
+ case EVENT_BERSERK:
DoCast(me, SPELL_BERSERK);
Talk(SAY_ENRAGE);
- } else EnrageTimer -= diff;
+ break;
+ default:
+ break;
}
-
- //Random taunts
- if (RandomYellTimer <= diff)
- {
- Talk(SAY_TAUNT);
- RandomYellTimer = urand(60, 151) * 1000;
- } else RandomYellTimer -= diff;
-
- DoMeleeAttackIfReady();
}
+
+ private:
+ uint64 TargetGUID[3];
+ uint32 BeamCount;
+ uint32 CurrentBeam;
+ uint32 ExplosionCount;
+ bool Enraged;
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetBlackTempleAI<boss_shahrazAI>(creature);
+ }
};
void AddSC_boss_mother_shahraz()
diff --git a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp
index a705659337f..b9b654f8b95 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 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,46 +15,47 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Supremus
-SD%Complete: 95
-SDComment: Need to implement molten punch
-SDCategory: Black Temple
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "PassiveAI.h"
#include "black_temple.h"
-enum Supremus
+enum Texts
{
- EMOTE_NEW_TARGET = 0,
- EMOTE_PUNCH_GROUND = 1,
- EMOTE_GROUND_CRACK = 2,
-
- //Spells
- SPELL_MOLTEN_PUNCH = 40126,
- SPELL_HATEFUL_STRIKE = 41926,
- SPELL_MOLTEN_FLAME = 40980,
- SPELL_VOLCANIC_ERUPTION = 40117,
- SPELL_VOLCANIC_SUMMON = 40276,
- SPELL_BERSERK = 45078,
+ EMOTE_NEW_TARGET = 0,
+ EMOTE_PUNCH_GROUND = 1,
+ EMOTE_GROUND_CRACK = 2
+};
- CREATURE_VOLCANO = 23085,
- CREATURE_STALKER = 23095,
+enum Spells
+{
+ SPELL_MOLTEN_PUNCH = 40126,
+ SPELL_HATEFUL_STRIKE = 41926,
+ SPELL_MOLTEN_FLAME = 40980,
+ SPELL_VOLCANIC_ERUPTION = 40117,
+ SPELL_VOLCANIC_SUMMON = 40276,
+ SPELL_BERSERK = 45078
+};
- PHASE_STRIKE = 1,
- PHASE_CHASE = 2,
+enum Events
+{
+ EVENT_BERSERK = 1,
+ EVENT_SWITCH_PHASE,
+ EVENT_FLAME,
+ EVENT_VOLCANO,
+ EVENT_SWITCH_TARGET,
+ EVENT_HATEFUL_STRIKE
+};
- EVENT_BERSERK = 1,
- EVENT_SWITCH_PHASE = 2,
- EVENT_FLAME = 3,
- EVENT_VOLCANO = 4,
- EVENT_SWITCH_TARGET = 5,
- EVENT_HATEFUL_STRIKE = 6,
+enum Phases
+{
+ PHASE_STRIKE = 1,
+ PHASE_CHASE = 2
+};
- GCD_CAST = 1
+enum EventGroups
+{
+ GCD_CAST = 1
};
class molten_flame : public CreatureScript
@@ -88,38 +88,22 @@ class boss_supremus : public CreatureScript
public:
boss_supremus() : CreatureScript("boss_supremus") { }
- CreatureAI* GetAI(Creature* creature) const override
+ struct boss_supremusAI : public BossAI
{
- return GetInstanceAI<boss_supremusAI>(creature);
- }
-
- struct boss_supremusAI : public ScriptedAI
- {
- boss_supremusAI(Creature* creature) : ScriptedAI(creature), summons(me)
+ boss_supremusAI(Creature* creature) : BossAI(creature, DATA_SUPREMUS)
{
- instance = creature->GetInstanceScript();
+ phase = 0;
}
- InstanceScript* instance;
- EventMap events;
- SummonList summons;
- uint32 phase;
-
void Reset() override
{
- if (me->IsAlive())
- instance->SetBossState(DATA_SUPREMUS, NOT_STARTED);
-
+ _Reset();
phase = 0;
-
- events.Reset();
- summons.DespawnAll();
}
void EnterCombat(Unit* /*who*/) override
{
- instance->SetBossState(DATA_SUPREMUS, IN_PROGRESS);
-
+ _EnterCombat();
ChangePhase();
events.ScheduleEvent(EVENT_BERSERK, 900000, GCD_CAST);
events.ScheduleEvent(EVENT_FLAME, 20000, GCD_CAST);
@@ -152,23 +136,6 @@ public:
events.ScheduleEvent(EVENT_SWITCH_PHASE, 60000, GCD_CAST);
}
- void JustDied(Unit* /*killer*/) override
- {
- instance->SetBossState(DATA_SUPREMUS, DONE);
-
- summons.DespawnAll();
- }
-
- void JustSummoned(Creature* summon) override
- {
- summons.Summon(summon);
- }
-
- void SummonedCreatureDespawn(Creature* summon) override
- {
- summons.Despawn(summon);
- }
-
Unit* CalculateHatefulStrikeTarget()
{
uint32 health = 0;
@@ -192,63 +159,59 @@ public:
return target;
}
- void UpdateAI(uint32 diff) override
+ void ExecuteEvent(uint32 eventId) override
{
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- while (uint32 eventId = events.ExecuteEvent())
+ switch (eventId)
{
- switch (eventId)
- {
- case EVENT_BERSERK:
- DoCast(me, SPELL_BERSERK, true);
- break;
- case EVENT_FLAME:
- DoCast(me, SPELL_MOLTEN_PUNCH);
- events.DelayEvents(1500, GCD_CAST);
- events.ScheduleEvent(EVENT_FLAME, 20000, GCD_CAST);
- break;
- case EVENT_HATEFUL_STRIKE:
- if (Unit* target = CalculateHatefulStrikeTarget())
- DoCast(target, SPELL_HATEFUL_STRIKE);
- events.DelayEvents(1000, GCD_CAST);
- events.ScheduleEvent(EVENT_HATEFUL_STRIKE, 5000, GCD_CAST, PHASE_STRIKE);
- break;
- case EVENT_SWITCH_TARGET:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
- {
- DoResetThreat();
- me->AddThreat(target, 5000000.0f);
- Talk(EMOTE_NEW_TARGET);
- }
- events.ScheduleEvent(EVENT_SWITCH_TARGET, 10000, 0, PHASE_CHASE);
- break;
- case EVENT_VOLCANO:
+ case EVENT_BERSERK:
+ DoCast(me, SPELL_BERSERK, true);
+ break;
+ case EVENT_FLAME:
+ DoCast(me, SPELL_MOLTEN_PUNCH);
+ events.DelayEvents(1500, GCD_CAST);
+ events.ScheduleEvent(EVENT_FLAME, 20000, GCD_CAST);
+ break;
+ case EVENT_HATEFUL_STRIKE:
+ if (Unit* target = CalculateHatefulStrikeTarget())
+ DoCast(target, SPELL_HATEFUL_STRIKE);
+ events.DelayEvents(1000, GCD_CAST);
+ events.ScheduleEvent(EVENT_HATEFUL_STRIKE, 5000, GCD_CAST, PHASE_STRIKE);
+ break;
+ case EVENT_SWITCH_TARGET:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true);
- if (!target) target = me->GetVictim();
- if (target)
- {
- //DoCast(target, SPELL_VOLCANIC_SUMMON);//movement bugged
- me->SummonCreature(CREATURE_VOLCANO, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 30000);
- Talk(EMOTE_GROUND_CRACK);
- events.DelayEvents(1500, GCD_CAST);
- }
- events.ScheduleEvent(EVENT_VOLCANO, 10000, GCD_CAST, PHASE_CHASE);
- return;
+ DoResetThreat();
+ me->AddThreat(target, 5000000.0f);
+ Talk(EMOTE_NEW_TARGET);
}
- case EVENT_SWITCH_PHASE:
- ChangePhase();
- break;
- }
+ events.ScheduleEvent(EVENT_SWITCH_TARGET, 10000, 0, PHASE_CHASE);
+ break;
+ case EVENT_VOLCANO:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true))
+ {
+ //DoCast(target, SPELL_VOLCANIC_SUMMON);//movement bugged
+ me->SummonCreature(NPC_SUPREMUS_VOLCANO, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 30000);
+ Talk(EMOTE_GROUND_CRACK);
+ events.DelayEvents(1500, GCD_CAST);
+ }
+ events.ScheduleEvent(EVENT_VOLCANO, 10000, GCD_CAST, PHASE_CHASE);
+ return;
+ case EVENT_SWITCH_PHASE:
+ ChangePhase();
+ break;
+ default:
+ break;
}
-
- DoMeleeAttackIfReady();
}
+
+ private:
+ uint32 phase;
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetBlackTempleAI<boss_supremusAI>(creature);
+ }
};
class npc_volcano : public CreatureScript
@@ -256,11 +219,6 @@ class npc_volcano : public CreatureScript
public:
npc_volcano() : CreatureScript("npc_volcano") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_volcanoAI(creature);
- }
-
struct npc_volcanoAI : public ScriptedAI
{
npc_volcanoAI(Creature* creature) : ScriptedAI(creature)
@@ -282,7 +240,6 @@ public:
void MoveInLineOfSight(Unit* /*who*/) override { }
-
void DoAction(int32 /*info*/) override
{
me->RemoveAura(SPELL_VOLCANIC_ERUPTION);
@@ -298,6 +255,11 @@ public:
else wait -= diff;
}
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_volcanoAI(creature);
+ }
};
void AddSC_boss_supremus()
diff --git a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
index 64a6add9801..c998bfed2dc 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 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,20 +15,13 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Warlord_Najentus
-SD%Complete: 95
-SDComment:
-SDCategory: Black Temple
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "black_temple.h"
#include "Player.h"
#include "SpellInfo.h"
-enum Yells
+enum Texts
{
SAY_AGGRO = 0,
SAY_NEEDLE = 1,
@@ -51,11 +43,6 @@ enum Spells
};
-enum GameObjects
-{
- GOBJECT_SPINE = 185584
-};
-
enum Events
{
EVENT_BERSERK = 1,
@@ -65,7 +52,7 @@ enum Events
EVENT_SHIELD = 5
};
-enum Misc
+enum EventGroups
{
GCD_CAST = 1,
GCD_YELL = 2
@@ -76,30 +63,17 @@ class boss_najentus : public CreatureScript
public:
boss_najentus() : CreatureScript("boss_najentus") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<boss_najentusAI>(creature);
- }
-
- struct boss_najentusAI : public ScriptedAI
+ struct boss_najentusAI : public BossAI
{
- boss_najentusAI(Creature* creature) : ScriptedAI(creature)
+ boss_najentusAI(Creature* creature) : BossAI(creature, DATA_HIGH_WARLORD_NAJENTUS)
{
- instance = creature->GetInstanceScript();
+ SpineTargetGUID = 0;
}
- InstanceScript* instance;
- EventMap events;
-
- uint64 SpineTargetGUID;
-
void Reset() override
{
- events.Reset();
-
+ _Reset();
SpineTargetGUID = 0;
-
- instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, NOT_STARTED);
}
void KilledUnit(Unit* /*victim*/) override
@@ -110,8 +84,7 @@ public:
void JustDied(Unit* /*killer*/) override
{
- instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, DONE);
-
+ _JustDied();
Talk(SAY_DEATH);
}
@@ -127,10 +100,8 @@ public:
void EnterCombat(Unit* /*who*/) override
{
- instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, IN_PROGRESS);
-
+ _EnterCombat();
Talk(SAY_AGGRO);
- DoZoneInCombat();
events.ScheduleEvent(EVENT_BERSERK, 480000, GCD_CAST);
events.ScheduleEvent(EVENT_YELL, 45000 + (rand32() % 76) * 1000, GCD_YELL);
ResetTimer();
@@ -155,44 +126,40 @@ public:
events.RescheduleEvent(EVENT_SHIELD, 60000 + inc);
}
- void UpdateAI(uint32 diff) override
+ void ExecuteEvent(uint32 eventId) override
{
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- while (uint32 eventId = events.ExecuteEvent())
+ switch (eventId)
{
- switch (eventId)
- {
- case EVENT_SHIELD:
- DoCast(me, SPELL_TIDAL_SHIELD, true);
- ResetTimer(45000);
- break;
- case EVENT_BERSERK:
- Talk(SAY_ENRAGE);
- DoCast(me, SPELL_BERSERK, true);
- events.DelayEvents(15000, GCD_YELL);
- break;
- case EVENT_SPINE:
- {
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1);
- if (!target) target = me->GetVictim();
- if (target)
- {
- DoCast(target, SPELL_IMPALING_SPINE, true);
- SpineTargetGUID = target->GetGUID();
- //must let target summon, otherwise you cannot click the spine
- target->SummonGameObject(GOBJECT_SPINE, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), me->GetOrientation(), 0, 0, 0, 0, 30);
- Talk(SAY_NEEDLE);
- events.DelayEvents(1500, GCD_CAST);
- events.DelayEvents(15000, GCD_YELL);
- }
- events.ScheduleEvent(EVENT_SPINE, 21000, GCD_CAST);
- return;
- }
- case EVENT_NEEDLE:
+ case EVENT_SHIELD:
+ DoCast(me, SPELL_TIDAL_SHIELD, true);
+ ResetTimer(45000);
+ break;
+ case EVENT_BERSERK:
+ Talk(SAY_ENRAGE);
+ DoCast(me, SPELL_BERSERK, true);
+ events.DelayEvents(15000, GCD_YELL);
+ break;
+ case EVENT_SPINE:
+ {
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1);
+
+ if (!target)
+ target = me->GetVictim();
+
+ if (target)
+ {
+ DoCast(target, SPELL_IMPALING_SPINE, true);
+ SpineTargetGUID = target->GetGUID();
+ //must let target summon, otherwise you cannot click the spine
+ target->SummonGameObject(GO_NAJENTUS_SPINE, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), me->GetOrientation(), 0, 0, 0, 0, 30);
+ Talk(SAY_NEEDLE);
+ events.DelayEvents(1500, GCD_CAST);
+ events.DelayEvents(15000, GCD_YELL);
+ }
+ events.ScheduleEvent(EVENT_SPINE, 21000, GCD_CAST);
+ return;
+ }
+ case EVENT_NEEDLE:
{
//DoCast(me, SPELL_NEEDLE_SPINE, true);
std::list<Unit*> targets;
@@ -203,18 +170,24 @@ public:
events.DelayEvents(1500, GCD_CAST);
return;
}
- case EVENT_YELL:
- Talk(SAY_SPECIAL);
- events.ScheduleEvent(EVENT_YELL, urand(25000, 100000), GCD_YELL);
- events.DelayEvents(15000, GCD_YELL);
- break;
- }
+ case EVENT_YELL:
+ Talk(SAY_SPECIAL);
+ events.ScheduleEvent(EVENT_YELL, urand(25000, 100000), GCD_YELL);
+ events.DelayEvents(15000, GCD_YELL);
+ break;
+ default:
+ break;
}
-
- DoMeleeAttackIfReady();
}
+
+ private:
+ uint64 SpineTargetGUID;
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetBlackTempleAI<boss_najentusAI>(creature);
+ }
};
class go_najentus_spine : public GameObjectScript
diff --git a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp
index 5b91367a9c9..55ad45597ea 100644
--- a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp
+++ b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp
@@ -44,6 +44,7 @@ class instance_black_temple : public InstanceMapScript
{
instance_black_temple_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
@@ -202,49 +203,6 @@ class instance_black_temple : public InstanceMapScript
return 0;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "B T " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(char const* str) override
- {
- 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 == 'B' && dataHead2 == 'T')
- {
- for (uint32 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
protected:
uint64 NajentusGUID;
uint64 SupremusGUID;
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp
index bc557d97ef5..a3577f40d68 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp
@@ -87,6 +87,7 @@ class instance_serpent_shrine : public InstanceMapScript
{
instance_serpentshrine_cavern_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
}
void Initialize() override
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h
index f7f3bc9c24b..660ec6bfb3d 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h
@@ -19,6 +19,8 @@
#ifndef DEF_SERPENT_SHRINE_H
#define DEF_SERPENT_SHRINE_H
+#define DataHeader "SS"
+
enum WaterEventState
{
WATERSTATE_NONE = 0,
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp
index 19e8c5187ba..40bc8dd69d7 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp
@@ -55,6 +55,7 @@ class instance_steam_vault : public InstanceMapScript
{
instance_steam_vault_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
ThespiaGUID = 0;
@@ -156,56 +157,13 @@ class instance_steam_vault : public InstanceMapScript
return true;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "S V " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(char const* str) override
- {
- 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 == 'V')
- {
- for (uint32 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
- protected:
- uint64 ThespiaGUID;
- uint64 MekgineerGUID;
- uint64 KalithreshGUID;
+ protected:
+ uint64 ThespiaGUID;
+ uint64 MekgineerGUID;
+ uint64 KalithreshGUID;
- uint64 MainChambersDoorGUID;
- uint8 DistillerState;
+ uint64 MainChambersDoorGUID;
+ uint8 DistillerState;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h
index e1761c80769..58f71b047ef 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h
+++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h
@@ -19,6 +19,7 @@
#define DEF_STEAM_VAULT_H
#define SteamVaultScriptName "instance_steam_vault"
+#define DataHeader "SV"
uint32 const EncounterCount = 3;
diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h
index 101268727b0..3130737eed5 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h
@@ -21,6 +21,7 @@
uint32 const EncounterCount = 3;
#define SPScriptName "instance_the_slave_pens"
+#define DataHeader "SP"
enum DataTypes
{
diff --git a/src/server/scripts/Outland/GruulsLair/gruuls_lair.h b/src/server/scripts/Outland/GruulsLair/gruuls_lair.h
index 81644a01567..288601c4584 100644
--- a/src/server/scripts/Outland/GruulsLair/gruuls_lair.h
+++ b/src/server/scripts/Outland/GruulsLair/gruuls_lair.h
@@ -19,6 +19,7 @@
#define GRUULS_LAIR_H_
#define GLScriptName "instance_gruuls_lair"
+#define DataHeader "GL"
uint32 const EncounterCount = 2;
diff --git a/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp
index ae3971a943e..3337ce47fd6 100644
--- a/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp
+++ b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp
@@ -44,6 +44,7 @@ class instance_gruuls_lair : public InstanceMapScript
{
instance_gruuls_lair_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
LoadMinionData(minionData);
@@ -123,49 +124,6 @@ class instance_gruuls_lair : public InstanceMapScript
return 0;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "G L " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(char const* str) override
- {
- 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 == 'G' && dataHead2 == 'L')
- {
- for (uint32 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
protected:
uint64 MaulgarGUID;
};
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
index b2097c34b33..8bcfdf5558f 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
@@ -19,6 +19,8 @@
#define BLOOD_FURNACE_H_
#define BFScriptName "instance_blood_furnace"
+#define DataHeader "BF"
+
uint32 const EncounterCount = 3;
enum DataTypes
@@ -46,7 +48,8 @@ enum CreatureIds
NPC_THE_MAKER = 17381,
NPC_BROGGOK = 17380,
NPC_KELIDAN_THE_BREAKER = 17377,
- NPC_PRISONER = 17398
+ NPC_PRISONER = 17398,
+ NPC_BROGGOK_POISON_CLOUD = 17662
};
enum GameObjectIds
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
index 55e9801320f..bd16fe9edd2 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 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,13 +15,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Broggok
-SD%Complete: 70
-SDComment: pre-event not made
-SDCategory: Hellfire Citadel, Blood Furnace
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
@@ -43,6 +35,13 @@ enum Spells
SPELL_POISON_CLOUD_PASSIVE = 30914
};
+enum Events
+{
+ EVENT_SLIME_SPRAY = 1,
+ EVENT_POISON_BOLT,
+ EVENT_POISON_CLOUD,
+};
+
class boss_broggok : public CreatureScript
{
public:
@@ -52,17 +51,9 @@ class boss_broggok : public CreatureScript
{
boss_broggokAI(Creature* creature) : BossAI(creature, DATA_BROGGOK) { }
- uint32 AcidSpray_Timer;
- uint32 PoisonSpawn_Timer;
- uint32 PoisonBolt_Timer;
- bool canAttack;
-
void Reset() override
{
_Reset();
- AcidSpray_Timer = 10000;
- PoisonSpawn_Timer = 5000;
- PoisonBolt_Timer = 7000;
DoAction(ACTION_RESET_BROGGOK);
}
@@ -72,44 +63,35 @@ class boss_broggok : public CreatureScript
Talk(SAY_AGGRO);
}
- void UpdateAI(uint32 diff) override
+ void JustSummoned(Creature* summoned) override
{
- if (!UpdateVictim())
- return;
-
- if (!canAttack)
- return;
-
- if (AcidSpray_Timer <= diff)
- {
- DoCastVictim(SPELL_SLIME_SPRAY);
- AcidSpray_Timer = 4000 + rand32() % 8000;
- }
- else
- AcidSpray_Timer -=diff;
-
- if (PoisonBolt_Timer <= diff)
+ if (summoned->GetEntry() == NPC_BROGGOK_POISON_CLOUD)
{
- DoCastVictim(SPELL_POISON_BOLT);
- PoisonBolt_Timer = 4000 + rand32() % 8000;
+ summoned->SetReactState(REACT_PASSIVE);
+ summoned->CastSpell(summoned, SPELL_POISON_CLOUD_PASSIVE, true);
+ summons.Summon(summoned);
}
- else
- PoisonBolt_Timer -=diff;
-
- if (PoisonSpawn_Timer <= diff)
- {
- DoCast(me, SPELL_POISON_CLOUD);
- PoisonSpawn_Timer = 20000;
- }
- else
- PoisonSpawn_Timer -=diff;
-
- DoMeleeAttackIfReady();
}
- void JustDied(Unit* /*killer*/) override
+ void ExecuteEvent(uint32 eventId) override
{
- _JustDied();
+ switch (eventId)
+ {
+ case EVENT_SLIME_SPRAY:
+ DoCastVictim(SPELL_SLIME_SPRAY);
+ events.ScheduleEvent(EVENT_SLIME_SPRAY, urand(4000, 12000));
+ break;
+ case EVENT_POISON_BOLT:
+ DoCastVictim(SPELL_POISON_BOLT);
+ events.ScheduleEvent(EVENT_POISON_BOLT, urand(4000, 12000));
+ break;
+ case EVENT_POISON_CLOUD:
+ DoCast(me, SPELL_POISON_CLOUD);
+ events.ScheduleEvent(EVENT_POISON_CLOUD, 20000);
+ break;
+ default:
+ break;
+ }
}
void DoAction(int32 action) override
@@ -122,12 +104,13 @@ class boss_broggok : public CreatureScript
case ACTION_ACTIVATE_BROGGOK:
me->SetReactState(REACT_AGGRESSIVE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE);
- canAttack = true;
+ events.ScheduleEvent(EVENT_SLIME_SPRAY, 10000);
+ events.ScheduleEvent(EVENT_POISON_BOLT, 7000);
+ events.ScheduleEvent(EVENT_POISON_CLOUD, 5000);
break;
case ACTION_RESET_BROGGOK:
me->SetReactState(REACT_PASSIVE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE);
- canAttack = false;
break;
}
}
@@ -140,33 +123,6 @@ class boss_broggok : public CreatureScript
}
};
-class npc_broggok_poison_cloud : public CreatureScript
-{
- public:
- npc_broggok_poison_cloud() : CreatureScript("npc_broggok_poison_cloud") { }
-
- struct npc_broggok_poison_cloudAI : public ScriptedAI
- {
- npc_broggok_poison_cloudAI(Creature* creature) : ScriptedAI(creature)
- {
- SetCombatMovement(false);
- creature->SetReactState(REACT_PASSIVE);
- }
-
- void IsSummonedBy(Unit* /*summoner*/) override
- {
- DoCast(me, SPELL_POISON_CLOUD_PASSIVE, true);
- }
-
- void UpdateAI(uint32 /*diff*/) override { }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_broggok_poison_cloudAI(creature);
- }
-};
-
class go_broggok_lever : public GameObjectScript
{
public:
@@ -228,7 +184,6 @@ class spell_broggok_poison_cloud : public SpellScriptLoader
void AddSC_boss_broggok()
{
new boss_broggok();
- new npc_broggok_poison_cloud();
new go_broggok_lever();
new spell_broggok_poison_cloud();
}
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 53680739e55..67e09ba4ac9 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 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,13 +15,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_The_Maker
-SD%Complete: 80
-SDComment: Mind control no support
-SDCategory: Hellfire Citadel, Blood Furnace
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "blood_furnace.h"
@@ -42,6 +34,14 @@ enum Spells
SPELL_DOMINATION = 25772
};
+enum Events
+{
+ EVENT_ACID_SPRAY = 1,
+ EVENT_EXPLODING_BREAKER,
+ EVENT_DOMINATION,
+ EVENT_KNOCKDOWN
+};
+
class boss_the_maker : public CreatureScript
{
public:
@@ -51,24 +51,15 @@ class boss_the_maker : public CreatureScript
{
boss_the_makerAI(Creature* creature) : BossAI(creature, DATA_THE_MAKER) { }
- uint32 AcidSpray_Timer;
- uint32 ExplodingBreaker_Timer;
- uint32 Domination_Timer;
- uint32 Knockdown_Timer;
-
- void Reset() override
- {
- _Reset();
- AcidSpray_Timer = 15000;
- ExplodingBreaker_Timer = 6000;
- Domination_Timer = 120000;
- Knockdown_Timer = 10000;
- }
-
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
Talk(SAY_AGGRO);
+
+ events.ScheduleEvent(EVENT_ACID_SPRAY, 15000);
+ events.ScheduleEvent(EVENT_EXPLODING_BREAKER, 6000);
+ events.ScheduleEvent(EVENT_DOMINATION, 120000);
+ events.ScheduleEvent(EVENT_KNOCKDOWN, 10000);
}
void KilledUnit(Unit* who) override
@@ -83,49 +74,31 @@ class boss_the_maker : public CreatureScript
Talk(SAY_DIE);
}
- void UpdateAI(uint32 diff) override
+ void ExecuteEvent(uint32 eventId) override
{
- if (!UpdateVictim())
- return;
-
- if (AcidSpray_Timer <= diff)
- {
- DoCastVictim(SPELL_ACID_SPRAY);
- AcidSpray_Timer = 15000 + rand32() % 8000;
- }
- else
- AcidSpray_Timer -=diff;
-
- if (ExplodingBreaker_Timer <= diff)
+ switch (eventId)
{
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_EXPLODING_BREAKER);
- ExplodingBreaker_Timer = 4000 + rand32() % 8000;
+ case EVENT_ACID_SPRAY:
+ DoCastVictim(SPELL_ACID_SPRAY);
+ events.ScheduleEvent(EVENT_ACID_SPRAY, urand(15000, 23000));
+ break;
+ case EVENT_EXPLODING_BREAKER:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true))
+ DoCast(target, SPELL_EXPLODING_BREAKER);
+ events.ScheduleEvent(EVENT_EXPLODING_BREAKER, urand(4000, 12000));
+ break;
+ case EVENT_DOMINATION:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
+ DoCast(target, SPELL_DOMINATION);
+ events.ScheduleEvent(EVENT_DOMINATION, 120000);
+ break;
+ case EVENT_KNOCKDOWN:
+ DoCastVictim(SPELL_KNOCKDOWN);
+ events.ScheduleEvent(EVENT_KNOCKDOWN, urand(4000, 12000));
+ break;
+ default:
+ break;
}
- else
- ExplodingBreaker_Timer -=diff;
-
- /* // Disabled until Core Support for mind control
- if (domination_timer_timer <= diff)
- {
- Unit* target;
- target = SelectUnit(SELECT_TARGET_RANDOM, 0);
-
- DoCast(target, SPELL_DOMINATION);
-
- domination_timer = 120000;
- } else domination_timer -=diff;
- */
-
- if (Knockdown_Timer <= diff)
- {
- DoCastVictim(SPELL_KNOCKDOWN);
- Knockdown_Timer = 4000 + rand32() % 8000;
- }
- else
- Knockdown_Timer -=diff;
-
- DoMeleeAttackIfReady();
}
};
@@ -139,4 +112,3 @@ void AddSC_boss_the_maker()
{
new boss_the_maker();
}
-
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 4f1200be37b..d88594d9c1e 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
@@ -40,6 +40,7 @@ class instance_blood_furnace : public InstanceMapScript
{
instance_blood_furnace_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
@@ -322,49 +323,6 @@ class instance_blood_furnace : public InstanceMapScript
}
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "B F " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(char const* str) override
- {
- 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 == 'B' && dataHead2 == 'F')
- {
- for (uint32 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
protected:
uint64 TheMakerGUID;
uint64 BroggokGUID;
diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h
index 61252d16527..df34ab5fafb 100644
--- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h
@@ -19,6 +19,8 @@
#ifndef DEF_RAMPARTS_H
#define DEF_RAMPARTS_H
+#define DataHeader "HR"
+
uint32 const EncounterCount = 4;
enum DataTypes
diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp
index 9a0e7c22308..c8ffc7d495a 100644
--- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp
@@ -38,6 +38,7 @@ class instance_ramparts : public InstanceMapScript
void Initialize() override
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
felIronChestGUID = 0;
}
@@ -72,53 +73,9 @@ class instance_ramparts : public InstanceMapScript
return true;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "H R " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* strIn) override
- {
- if (!strIn)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
-
- OUT_LOAD_INST_DATA(strIn);
-
- char dataHead1, dataHead2;
-
- std::istringstream loadStream(strIn);
- loadStream >> dataHead1 >> dataHead2;
-
- if (dataHead1 == 'H' && dataHead2 == 'R')
- {
- for (uint8 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
-
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
- protected:
- uint64 felIronChestGUID;
- bool spawned;
+ protected:
+ uint64 felIronChestGUID;
+ bool spawned;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp
index 71d9203fcac..ae5ad009942 100644
--- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp
@@ -68,6 +68,7 @@ class instance_magtheridons_lair : public InstanceMapScript
void Initialize() override
{
+ SetHeaders(DataHeader);
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
MagtheridonGUID = 0;
diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h
index d3921a8709b..159962475ca 100644
--- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h
+++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h
@@ -19,6 +19,8 @@
#ifndef DEF_MAGTHERIDONS_LAIR_H
#define DEF_MAGTHERIDONS_LAIR_H
+#define DataHeader "ML"
+
enum DataTypes
{
DATA_MAGTHERIDON_EVENT = 1,
diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp
index a220f26e18b..8ee63ff03a2 100644
--- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp
@@ -43,6 +43,7 @@ class instance_shattered_halls : public InstanceMapScript
void Initialize() override
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
nethekurseGUID = 0;
nethekurseDoor1GUID = 0;
@@ -114,53 +115,10 @@ class instance_shattered_halls : public InstanceMapScript
return 0;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "S H " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* strIn) override
- {
- if (!strIn)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
-
- OUT_LOAD_INST_DATA(strIn);
-
- char dataHead1, dataHead2;
-
- std::istringstream loadStream(strIn);
- loadStream >> dataHead1 >> dataHead2;
-
- if (dataHead1 == 'S' && dataHead2 == 'H')
- {
- for (uint8 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
- protected:
- uint64 nethekurseGUID;
- uint64 nethekurseDoor1GUID;
- uint64 nethekurseDoor2GUID;
+ protected:
+ uint64 nethekurseGUID;
+ uint64 nethekurseDoor1GUID;
+ uint64 nethekurseDoor2GUID;
};
};
diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h
index 10e944d5bc4..d0490676bdd 100644
--- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h
@@ -19,6 +19,8 @@
#ifndef DEF_SHATTERED_H
#define DEF_SHATTERED_H
+#define DataHeader "SH"
+
uint32 const EncounterCount = 3;
enum DataTypes
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp
index 0da16967a49..07cbd68f741 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp
@@ -62,6 +62,7 @@ class instance_the_eye : public InstanceMapScript
void Initialize() override
{
+ SetHeaders(DataHeader);
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
ThaladredTheDarkener = 0;
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h
index 52061a54591..6b1cd89abf6 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h
+++ b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h
@@ -19,6 +19,8 @@
#ifndef DEF_THE_EYE_H
#define DEF_THE_EYE_H
+#define DataHeader "TE"
+
enum DataTypes
{
DATA_ALAREVENT = 1,
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
index 4dddee83459..c620a17f7b6 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
@@ -37,6 +37,7 @@ class instance_mechanar : public InstanceMapScript
{
instance_mechanar_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
}
@@ -88,49 +89,6 @@ class instance_mechanar : public InstanceMapScript
return true;
}
-
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "M C " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* str) override
- {
- 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 == '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;
- }
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h b/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h
index 34346e163c7..0d823dac325 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h
@@ -18,6 +18,8 @@
#ifndef DEF_MECHANAR_H
#define DEF_MECHANAR_H
+#define DataHeader "MR"
+
uint32 const EncounterCount = 5;
enum DataTypes
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h
index 889a900653f..5b1695f4cfb 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h
@@ -19,6 +19,7 @@
#define ARCATRAZ_H
#define ArcatrazScriptName "instance_arcatraz"
+#define DataHeader "AZ"
uint32 const EncounterCount = 4;
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
index a6d0b348984..b092243637b 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
@@ -35,6 +35,7 @@ class instance_arcatraz : public InstanceMapScript
{
instance_arcatraz_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
@@ -191,49 +192,6 @@ class instance_arcatraz : public InstanceMapScript
return true;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "A Z " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(char const* str) override
- {
- 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 == 'A' && dataHead2 == 'Z')
- {
- for (uint32 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
protected:
uint64 DalliahGUID;
uint64 SoccothratesGUID;
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp b/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp
index f8929f7e42a..eb46211fa59 100644
--- a/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp
@@ -28,6 +28,7 @@ class instance_the_botanica : public InstanceMapScript
{
instance_the_botanica_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetHeaders(DataHeader);
CommanderSarannisGUID = 0;
HighBotanistFreywinnGUID = 0;
ThorngrinTheTenderGUID = 0;
@@ -100,50 +101,6 @@ class instance_the_botanica : public InstanceMapScript
return true;
}
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "B O " << GetBossSaveData();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(char const* str) override
- {
- 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 == 'B' && dataHead2 == 'O')
- {
- for (uint8 i = 0; i < EncounterCount; ++i)
- {
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
-
- SetBossState(i, EncounterState(tmpState));
- }
- }
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
protected:
uint64 CommanderSarannisGUID;
uint64 HighBotanistFreywinnGUID;
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/the_botanica.h b/src/server/scripts/Outland/TempestKeep/botanica/the_botanica.h
index ed0d6b0c98a..68d869520ce 100644
--- a/src/server/scripts/Outland/TempestKeep/botanica/the_botanica.h
+++ b/src/server/scripts/Outland/TempestKeep/botanica/the_botanica.h
@@ -19,6 +19,8 @@
#ifndef DEF_THE_BOTANICA_H
#define DEF_THE_BOTANICA_H
+#define DataHeader "BC"
+
uint32 const EncounterCount = 5;
enum DataTypes
diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
index b9b87fd5d6a..db34665e641 100644
--- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
+++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
@@ -19,7 +19,7 @@
/* ScriptData
SDName: Shadowmoon_Valley
SD%Complete: 100
-SDComment: Quest support: 10519, 10583, 10601, 10804, 10854, 10458, 10481, 10480, 10781, 10451. Vendor Drake Dealer Hurlunk.
+SDComment: Quest support: 10583, 10601, 10804, 10854, 10458, 10481, 10480, 10781, 10451. Vendor Drake Dealer Hurlunk.
SDCategory: Shadowmoon Valley
EndScriptData */
@@ -29,7 +29,6 @@ npc_enslaved_netherwing_drake
npc_drake_dealer_hurlunk
npcs_flanis_swiftwing_and_kagrosh
npc_karynaku
-npc_oronok_tornheart
npc_overlord_morghor
npc_earthmender_wilda
npc_torloth_the_magnificent
@@ -492,81 +491,6 @@ public:
};
/*######
-## npc_oronok
-######*/
-
-#define GOSSIP_ORONOK1 "I am ready to hear your story, Oronok."
-#define GOSSIP_ORONOK2 "How do I find the cipher?"
-#define GOSSIP_ORONOK3 "How do you know all of this?"
-#define GOSSIP_ORONOK4 "Yet what? What is it, Oronok?"
-#define GOSSIP_ORONOK5 "Continue, please."
-#define GOSSIP_ORONOK6 "So what of the cipher now? And your boys?"
-#define GOSSIP_ORONOK7 "I will find your boys and the cipher, Oronok."
-
-class npc_oronok_tornheart : public CreatureScript
-{
-public:
- npc_oronok_tornheart() : CreatureScript("npc_oronok_tornheart") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- player->PlayerTalkClass->ClearMenus();
- switch (action)
- {
- case GOSSIP_ACTION_TRADE:
- player->GetSession()->SendListInventory(creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF:
- player->ADD_GOSSIP_ITEM(0, GOSSIP_ORONOK2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- player->SEND_GOSSIP_MENU(10313, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+1:
- player->ADD_GOSSIP_ITEM(0, GOSSIP_ORONOK3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- player->SEND_GOSSIP_MENU(10314, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- player->ADD_GOSSIP_ITEM(0, GOSSIP_ORONOK4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
- player->SEND_GOSSIP_MENU(10315, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- player->ADD_GOSSIP_ITEM(0, GOSSIP_ORONOK5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4);
- player->SEND_GOSSIP_MENU(10316, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- player->ADD_GOSSIP_ITEM(0, GOSSIP_ORONOK6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
- player->SEND_GOSSIP_MENU(10317, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+5:
- player->ADD_GOSSIP_ITEM(0, GOSSIP_ORONOK7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6);
- player->SEND_GOSSIP_MENU(10318, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+6:
- player->CLOSE_GOSSIP_MENU();
- player->AreaExploredOrEventHappens(10519);
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
- if (creature->IsVendor())
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
-
- if (player->GetQuestStatus(10519) == QUEST_STATUS_INCOMPLETE)
- {
- player->ADD_GOSSIP_ITEM(0, GOSSIP_ORONOK1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- player->SEND_GOSSIP_MENU(10312, creature->GetGUID());
- }else
- player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
-
- return true;
- }
-};
-
-/*####
# npc_karynaku
####*/
@@ -1909,7 +1833,6 @@ void AddSC_shadowmoon_valley()
new npc_drake_dealer_hurlunk();
new npcs_flanis_swiftwing_and_kagrosh();
new npc_karynaku();
- new npc_oronok_tornheart();
new npc_overlord_morghor();
new npc_earthmender_wilda();
new npc_lord_illidan_stormrage();
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 86ef8bdc8cc..84e36b55c2c 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -2573,16 +2573,15 @@ class spell_gen_oracle_wolvar_reputation : public SpellScriptLoader
{
Player* player = GetCaster()->ToPlayer();
uint32 factionId = GetSpellInfo()->Effects[effIndex].CalcValue();
- int32 repChange = GetSpellInfo()->Effects[EFFECT_1].CalcValue();
+ int32 repChange = GetSpellInfo()->Effects[EFFECT_1].CalcValue();
FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId);
-
if (!factionEntry)
return;
// Set rep to baserep + basepoints (expecting spillover for oposite faction -> become hated)
// Not when player already has equal or higher rep with this faction
- if (player->GetReputationMgr().GetBaseReputation(factionEntry) < repChange)
+ if (player->GetReputationMgr().GetReputation(factionEntry) < repChange)
player->GetReputationMgr().SetReputation(factionEntry, repChange);
// EFFECT_INDEX_2 most likely update at war state, we already handle this in SetReputation
diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp
index f17aac51519..e135bb08e73 100644
--- a/src/server/scripts/Spells/spell_quest.cpp
+++ b/src/server/scripts/Spells/spell_quest.cpp
@@ -21,15 +21,16 @@
* Scriptnames of files in this file should be prefixed with "spell_q#questID_".
*/
+#include "CellImpl.h"
+#include "CreatureTextMgr.h"
+#include "GridNotifiers.h"
+#include "GridNotifiersImpl.h"
#include "Player.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
#include "Vehicle.h"
-#include "GridNotifiers.h"
-#include "GridNotifiersImpl.h"
-#include "CellImpl.h"
class spell_generic_quest_update_entry_SpellScript : public SpellScript
{
@@ -1115,12 +1116,12 @@ class spell_q9452_cast_net: public SpellScriptLoader
}
};
-#define SAY_1 "Sons of Hodir! I humbly present to you..."
-#define SAY_2 "The Helm of Hodir!"
-
enum HodirsHelm
{
- NPC_KILLCREDIT = 30210 // Hodir's Helm KC Bunny
+ SAY_1 = 1,
+ SAY_2 = 2,
+ NPC_KILLCREDIT = 30210, // Hodir's Helm KC Bunny
+ NPC_ICE_SPIKE_BUNNY = 30215
};
class spell_q12987_read_pronouncement : public SpellScriptLoader
@@ -1137,9 +1138,12 @@ public:
// player must cast kill credit and do emote text, according to sniff
if (Player* target = GetTarget()->ToPlayer())
{
- target->MonsterWhisper(SAY_1, target, true);
- target->KilledMonsterCredit(NPC_KILLCREDIT, 0);
- target->MonsterWhisper(SAY_2, target, true);
+ if (Creature* trigger = target->FindNearestCreature(NPC_ICE_SPIKE_BUNNY, 25.0f))
+ {
+ sCreatureTextMgr->SendChat(trigger, SAY_1, target, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, target);
+ target->KilledMonsterCredit(NPC_KILLCREDIT);
+ sCreatureTextMgr->SendChat(trigger, SAY_2, target, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, target);
+ }
}
}
@@ -2096,7 +2100,7 @@ class spell_q12641_death_comes_from_on_high : public SpellScriptLoader
}
};
-// 52694 - Recall Eye of Acherus
+// 52694 - Recall Eye of Acherus
class spell_q12641_recall_eye_of_acherus : public SpellScriptLoader
{
public:
diff --git a/src/server/scripts/World/boss_emerald_dragons.cpp b/src/server/scripts/World/boss_emerald_dragons.cpp
index 23e373312cb..a00c9465a05 100644
--- a/src/server/scripts/World/boss_emerald_dragons.cpp
+++ b/src/server/scripts/World/boss_emerald_dragons.cpp
@@ -587,7 +587,7 @@ class boss_taerar : public CreatureScript
void Reset() override
{
me->RemoveAurasDueToSpell(SPELL_SHADE);
-
+
Initialize();
emerald_dragonAI::Reset();
diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp
index 3c3f0c2c26b..7ba043f2a2e 100644
--- a/src/server/scripts/World/go_scripts.cpp
+++ b/src/server/scripts/World/go_scripts.cpp
@@ -36,7 +36,6 @@ go_jotunheim_cage
go_table_theka
go_soulwell
go_bashir_crystalforge
-go_ethereal_teleport_pad
go_soulwell
go_dragonflayer_cage
go_tadpole_cage
@@ -841,32 +840,6 @@ public:
};
/*######
-## go_ethereal_teleport_pad
-######*/
-
-enum EtherealTeleportPad
-{
- NPC_IMAGE_WIND_TRADER = 20518,
- ITEM_TELEPORTER_POWER_PACK = 28969,
-};
-
-class go_ethereal_teleport_pad : public GameObjectScript
-{
-public:
- go_ethereal_teleport_pad() : GameObjectScript("go_ethereal_teleport_pad") { }
-
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- if (!player->HasItemCount(ITEM_TELEPORTER_POWER_PACK))
- return false;
-
- go->SummonCreature(NPC_IMAGE_WIND_TRADER, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
-
- return true;
- }
-};
-
-/*######
## go_soulwell
######*/
@@ -1334,7 +1307,6 @@ void AddSC_go_scripts()
new go_jotunheim_cage();
new go_table_theka();
new go_inconspicuous_landmark();
- new go_ethereal_teleport_pad();
new go_soulwell();
new go_tadpole_cage();
new go_dragonflayer_cage();
diff --git a/src/server/shared/Configuration/Config.cpp b/src/server/shared/Configuration/Config.cpp
index 6b83f562520..21bbd063b53 100644
--- a/src/server/shared/Configuration/Config.cpp
+++ b/src/server/shared/Configuration/Config.cpp
@@ -59,7 +59,7 @@ bool ConfigMgr::LoadInitial(std::string const& file, std::string& error)
bool ConfigMgr::Reload(std::string& error)
{
- return LoadInitial(_filename.c_str(), error);
+ return LoadInitial(_filename, error);
}
std::string ConfigMgr::GetStringDefault(std::string const& name, const std::string& def)
diff --git a/src/server/shared/Database/Field.h b/src/server/shared/Database/Field.h
index 5f427a5871b..2e888be5ed3 100644
--- a/src/server/shared/Database/Field.h
+++ b/src/server/shared/Database/Field.h
@@ -50,7 +50,7 @@ class Field
if (data.raw)
return *reinterpret_cast<uint8*>(data.value);
- return static_cast<uint8>(atol((char*)data.value));
+ return static_cast<uint8>(strtoul((char*)data.value, nullptr, 10));
}
int8 GetInt8() const
@@ -68,7 +68,7 @@ class Field
if (data.raw)
return *reinterpret_cast<int8*>(data.value);
- return static_cast<int8>(atol((char*)data.value));
+ return static_cast<int8>(strtol((char*)data.value, NULL, 10));
}
uint16 GetUInt16() const
@@ -86,7 +86,7 @@ class Field
if (data.raw)
return *reinterpret_cast<uint16*>(data.value);
- return static_cast<uint16>(atol((char*)data.value));
+ return static_cast<uint16>(strtoul((char*)data.value, nullptr, 10));
}
int16 GetInt16() const
@@ -104,7 +104,7 @@ class Field
if (data.raw)
return *reinterpret_cast<int16*>(data.value);
- return static_cast<int16>(atol((char*)data.value));
+ return static_cast<int16>(strtol((char*)data.value, NULL, 10));
}
uint32 GetUInt32() const
@@ -122,7 +122,7 @@ class Field
if (data.raw)
return *reinterpret_cast<uint32*>(data.value);
- return static_cast<uint32>(atol((char*)data.value));
+ return static_cast<uint32>(strtoul((char*)data.value, nullptr, 10));
}
int32 GetInt32() const
@@ -140,7 +140,7 @@ class Field
if (data.raw)
return *reinterpret_cast<int32*>(data.value);
- return static_cast<int32>(atol((char*)data.value));
+ return static_cast<int32>(strtol((char*)data.value, NULL, 10));
}
uint64 GetUInt64() const
@@ -158,7 +158,7 @@ class Field
if (data.raw)
return *reinterpret_cast<uint64*>(data.value);
- return static_cast<uint64>(atol((char*)data.value));
+ return static_cast<uint64>(strtoull((char*)data.value, nullptr, 10));
}
int64 GetInt64() const
@@ -176,7 +176,7 @@ class Field
if (data.raw)
return *reinterpret_cast<int64*>(data.value);
- return static_cast<int64>(strtol((char*)data.value, NULL, 10));
+ return static_cast<int64>(strtoll((char*)data.value, NULL, 10));
}
float GetFloat() const
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index 9a78d74bb45..b49f9ebd9ec 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -2432,6 +2432,20 @@ CharDelete.KeepDays = 30
###################################################################################################
# CUSTOM SERVER OPTIONS
#
+# AllowTrackBothResources
+# Description: Allows players to track herbs and minerals at the same time (if they have the skills)
+# Default: 0 (do not allow)
+# 1 (allow)
+#
+# Note: The following are client limitations and cannot be coded for:
+# * The minimap tracking icon will display whichever skill is activated second
+# * The minimap tracking list will only show a check mark next to the last skill activated (sometimes this
+# bugs out and doesn't switch the check mark. It has no effect on the actual tracking though).
+# * The minimap dots are yellow for both resources
+
+AllowTrackBothResources = 0
+
+#
# PlayerStart.AllReputation
# Description: Players will start with most of the high level reputations that are needed
# for items, mounts etc.
@@ -2630,11 +2644,7 @@ UI.ShowQuestLevelsInDialogs = 0
#
###################################################################################################
-###################################
-# Auction House Bot Configuration #
-###################################
-
-###################################################################################################################
+###################################################################################################
# AUCTION HOUSE BOT SETTINGS
#
# AuctionHouseBot.Update.Interval
@@ -2857,7 +2867,10 @@ AuctionHouseBot.Class.Key = 1
AuctionHouseBot.Class.Misc = 5
AuctionHouseBot.Class.Glyph = 3
-###################################################################################################################
+#
+###################################################################################################
+
+###################################################################################################
#
# AHBot ITEM FINE TUNING
# The following are usefull for limiting what character levels can
@@ -2929,9 +2942,9 @@ AuctionHouseBot.forceIncludeItems = ""
AuctionHouseBot.forceExcludeItems = ""
#
-###################################################################################################################
+###################################################################################################
-###################################################################################################################
+###################################################################################################
# AHBot Buyer config
#
# AuctionHouseBot.Buyer.Enabled
@@ -2979,7 +2992,7 @@ AuctionHouseBot.Buyer.Horde.Chance.Ratio = 3
AuctionHouseBot.Buyer.Neutral.Chance.Ratio = 3
#
-###################################################################################################################
+###################################################################################################
###################################################################################################
# LOGGING SYSTEM SETTINGS
@@ -3135,6 +3148,7 @@ Log.Async.Enable = 0
# 1 - (Enabled)
Allow.IP.Based.Action.Logging = 0
+
#
###################################################################################################
diff --git a/src/tools/vmap4_extractor/model.cpp b/src/tools/vmap4_extractor/model.cpp
index 519f59cb086..64b2923b345 100644
--- a/src/tools/vmap4_extractor/model.cpp
+++ b/src/tools/vmap4_extractor/model.cpp
@@ -143,7 +143,7 @@ Vec3D fixCoordSystem2(Vec3D v)
}
ModelInstance::ModelInstance(MPQFile& f, char const* ModelInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile)
- : scale(0), flags(0)
+ : id(0), scale(0), flags(0)
{
float ff[3];
f.read(&id, 4);