diff options
12 files changed, 276 insertions, 308 deletions
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp index 6d83a03d636..4d67e50144e 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp @@ -16,7 +16,6 @@ */ #include "ScriptMgr.h" -#include "InstanceScript.h" #include "ScriptedCreature.h" #include "SpellInfo.h" #include "stratholme.h" @@ -62,23 +61,10 @@ uint32 const RaiseDeadSpells[6] = struct boss_baron_rivendare : public BossAI { public: - boss_baron_rivendare(Creature* creature) : BossAI(creature, TYPE_BARON), RaiseDead(false) { } - - void Reset() override - { - // needed until re-write of instance scripts is done - if (instance->GetData(TYPE_RAMSTEIN) == DONE) - instance->SetData(TYPE_BARON, NOT_STARTED); - - BossAI::Reset(); - } + boss_baron_rivendare(Creature* creature) : BossAI(creature, BOSS_RIVENDARE), RaiseDead(false) { } void JustEngagedWith(Unit* who) override { - // needed until re-write of instance scripts is done - if (instance->GetData(TYPE_BARON) == NOT_STARTED) - instance->SetData(TYPE_BARON, IN_PROGRESS); - events.ScheduleEvent(EVENT_SHADOWBOLT, 5s); events.ScheduleEvent(EVENT_CLEAVE, 8s); events.ScheduleEvent(EVENT_MORTALSTRIKE, 12s); @@ -87,14 +73,6 @@ public: BossAI::JustEngagedWith(who); } - void JustDied(Unit* killer) override - { - // needed until re-write of instance scripts is done - instance->SetData(TYPE_BARON, DONE); - - BossAI::JustDied(killer); - } - void UpdateAI(uint32 diff) override { if (!UpdateVictim()) diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp index 241af832759..dd2a0214de8 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_baroness_anastari.cpp @@ -43,12 +43,14 @@ enum BaronessAnastariEvents struct boss_baroness_anastari : public BossAI { - boss_baroness_anastari(Creature* creature) : BossAI(creature, TYPE_BARONESS) { } + boss_baroness_anastari(Creature* creature) : BossAI(creature, BOSS_BARONESS_ANASTARI) { } ObjectGuid _possessedTargetGuid; void Reset() override { + _Reset(); + _possessedTargetGuid.Clear(); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSSESS); @@ -66,13 +68,6 @@ struct boss_baroness_anastari : public BossAI events.ScheduleEvent(EVENT_SPELL_POSSESS, 20s, 30s); } - void JustDied(Unit* /*killer*/) override - { - // needed until crystals implemented, - // see line 305 instance_stratholme.cpp - instance->SetData(TYPE_BARONESS, IN_PROGRESS); - } - void UpdateAI(uint32 diff) override { if (!UpdateVictim()) 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 03726b6124b..5259ab5f260 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp @@ -41,21 +41,18 @@ enum WilleyEvents }; // 10997 - Cannon Master Willey -struct boss_cannon_master_willey : public ScriptedAI +struct boss_cannon_master_willey : public BossAI { - boss_cannon_master_willey(Creature* creature) : ScriptedAI(creature) { } + boss_cannon_master_willey(Creature* creature) : BossAI(creature, BOSS_CANNON_MASTER_WILLEY) { } - void Reset() override + void JustEngagedWith(Unit* who) override { - _events.Reset(); - } + BossAI::JustEngagedWith(who); - void JustEngagedWith(Unit* /*who*/) override - { - _events.ScheduleEvent(EVENT_SHOOT, 0s); - _events.ScheduleEvent(EVENT_KNOCK_AWAY, 10s, 20s); - _events.ScheduleEvent(EVENT_PUMMEL, 10s, 15s); - _events.ScheduleEvent(EVENT_SUMMON_RIFLEMAN, 5s, 10s); + events.ScheduleEvent(EVENT_SHOOT, 0s); + events.ScheduleEvent(EVENT_KNOCK_AWAY, 10s, 20s); + events.ScheduleEvent(EVENT_PUMMEL, 10s, 15s); + events.ScheduleEvent(EVENT_SUMMON_RIFLEMAN, 5s, 10s); } void AttackStart(Unit* who) override @@ -68,30 +65,30 @@ struct boss_cannon_master_willey : public ScriptedAI if (!UpdateVictim()) return; - _events.Update(diff); + events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - while (uint32 eventId = _events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_SHOOT: DoCastVictim(SPELL_SHOOT); - _events.Repeat(2s, 4s); + events.Repeat(2s, 4s); break; case EVENT_KNOCK_AWAY: DoCastVictim(SPELL_KNOCK_AWAY); - _events.Repeat(15s, 25s); + events.Repeat(15s, 25s); break; case EVENT_PUMMEL: DoCastVictim(SPELL_PUMMEL); - _events.Repeat(10s, 15s); + events.Repeat(10s, 15s); break; case EVENT_SUMMON_RIFLEMAN: DoCastSelf(SPELL_SUMMON_RIFLEMAN); - _events.Repeat(15s, 25s); + events.Repeat(15s, 25s); break; default: break; @@ -103,9 +100,6 @@ struct boss_cannon_master_willey : public ScriptedAI DoMeleeAttackIfReady(); } - -private: - EventMap _events; }; void AddSC_boss_cannon_master_willey() diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp index 3d8ad605753..705d829ae09 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp @@ -74,13 +74,14 @@ enum DathrohanMisc }; // 10812 - Grand Crusader Dathrohan -struct boss_dathrohan_balnazzar : public ScriptedAI +struct boss_dathrohan_balnazzar : public BossAI { - boss_dathrohan_balnazzar(Creature* creature) : ScriptedAI(creature), _transformed(false) { } + boss_dathrohan_balnazzar(Creature* creature) : BossAI(creature, BOSS_BALNAZZAR), _transformed(false) { } void Reset() override { - _events.Reset(); + BossAI::Reset(); + _transformed = false; if (me->GetEntry() == NPC_BALNAZZAR) @@ -89,14 +90,16 @@ struct boss_dathrohan_balnazzar : public ScriptedAI SetEquipmentSlots(true); } - void JustEngagedWith(Unit* /*who*/) override + void JustEngagedWith(Unit* who) override { + BossAI::JustEngagedWith(who); + Talk(SAY_AGGRO); - _events.ScheduleEvent(EVENT_CRUSADERS_HAMMER, 15s, 25s); - _events.ScheduleEvent(EVENT_CRUSADER_STRIKE, 5s, 10s); - _events.ScheduleEvent(EVENT_HOLY_STRIKE, 10s, 20s); - _events.ScheduleEvent(EVENT_MIND_BLAST, 5s, 15s); + events.ScheduleEvent(EVENT_CRUSADERS_HAMMER, 15s, 25s); + events.ScheduleEvent(EVENT_CRUSADER_STRIKE, 5s, 10s); + events.ScheduleEvent(EVENT_HOLY_STRIKE, 10s, 20s); + events.ScheduleEvent(EVENT_MIND_BLAST, 5s, 15s); } void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override @@ -104,12 +107,14 @@ struct boss_dathrohan_balnazzar : public ScriptedAI if (!_transformed && me->HealthBelowPctDamaged(40, damage)) { _transformed = true; - _events.ScheduleEvent(EVENT_TRANSFORM_1, 0s); + events.ScheduleEvent(EVENT_TRANSFORM_1, 0s); } } - void JustDied(Unit* /*killer*/) override + void JustDied(Unit* killer) override { + BossAI::JustDied(killer); + Talk(SAY_DEATH); me->SummonCreatureGroup(SUMMON_GROUP_DEATH); } @@ -119,78 +124,78 @@ struct boss_dathrohan_balnazzar : public ScriptedAI if (!UpdateVictim()) return; - _events.Update(diff); + events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - while (uint32 eventId = _events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_CRUSADERS_HAMMER: DoCastSelf(SPELL_CRUSADERS_HAMMER); - _events.Repeat(20s, 30s); + events.Repeat(20s, 30s); break; case EVENT_CRUSADER_STRIKE: DoCastVictim(SPELL_CRUSADER_STRIKE); - _events.Repeat(10s, 20s); + events.Repeat(10s, 20s); break; case EVENT_HOLY_STRIKE: DoCastVictim(SPELL_HOLY_STRIKE); - _events.Repeat(10s, 15s); + events.Repeat(10s, 15s); break; case EVENT_MIND_BLAST: DoCastVictim(SPELL_MIND_BLAST); - _events.Repeat(10s, 15s); + events.Repeat(10s, 15s); break; case EVENT_SHADOW_SHOCK: DoCastSelf(SPELL_SHADOW_SHOCK); - _events.Repeat(10s, 15s); + events.Repeat(10s, 15s); break; case EVENT_PSYCHIC_SCREAM: DoCastSelf(SPELL_PSYCHIC_SCREAM); - _events.Repeat(20s, 30s); + events.Repeat(20s, 30s); break; case EVENT_SLEEP: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) DoCast(target, SPELL_SLEEP); - _events.Repeat(15s, 20s); + events.Repeat(15s, 20s); break; case EVENT_DOMINATION: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) DoCast(target, SPELL_DOMINATION); - _events.Repeat(20s, 25s); + events.Repeat(20s, 25s); break; case EVENT_TRANSFORM_1: - _events.CancelEvent(EVENT_CRUSADERS_HAMMER); - _events.CancelEvent(EVENT_CRUSADER_STRIKE); - _events.CancelEvent(EVENT_HOLY_STRIKE); - _events.CancelEvent(EVENT_MIND_BLAST); + events.CancelEvent(EVENT_CRUSADERS_HAMMER); + events.CancelEvent(EVENT_CRUSADER_STRIKE); + events.CancelEvent(EVENT_HOLY_STRIKE); + events.CancelEvent(EVENT_MIND_BLAST); DoCastSelf(SPELL_BALNAZZAR_TRANSFORM); me->SetReactState(REACT_PASSIVE); - _events.ScheduleEvent(EVENT_TRANSFORM_2, 2s); + events.ScheduleEvent(EVENT_TRANSFORM_2, 2s); break; case EVENT_TRANSFORM_2: me->UpdateEntry(NPC_BALNAZZAR); me->SetReactState(REACT_PASSIVE); SetEquipmentSlots(false, EQUIP_UNEQUIP); - _events.ScheduleEvent(EVENT_TRANSFORM_3, 2s); + events.ScheduleEvent(EVENT_TRANSFORM_3, 2s); break; case EVENT_TRANSFORM_3: Talk(SAY_TRANSFORM); - _events.ScheduleEvent(EVENT_TRANSFORM_4, 4s); + events.ScheduleEvent(EVENT_TRANSFORM_4, 4s); break; case EVENT_TRANSFORM_4: me->SetReactState(REACT_AGGRESSIVE); - _events.ScheduleEvent(EVENT_MIND_BLAST, 5s, 15s); - _events.ScheduleEvent(EVENT_SHADOW_SHOCK, 10s, 15s); - _events.ScheduleEvent(EVENT_PSYCHIC_SCREAM, 15s, 25s); - _events.ScheduleEvent(EVENT_SLEEP, 5s, 15s); - _events.ScheduleEvent(EVENT_DOMINATION, 15s, 25s); + events.ScheduleEvent(EVENT_MIND_BLAST, 5s, 15s); + events.ScheduleEvent(EVENT_SHADOW_SHOCK, 10s, 15s); + events.ScheduleEvent(EVENT_PSYCHIC_SCREAM, 15s, 25s); + events.ScheduleEvent(EVENT_SLEEP, 5s, 15s); + events.ScheduleEvent(EVENT_DOMINATION, 15s, 25s); break; default: break; @@ -205,7 +210,6 @@ struct boss_dathrohan_balnazzar : public ScriptedAI private: bool _transformed; - EventMap _events; }; void AddSC_boss_dathrohan_balnazzar() diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp index b70fb048ad9..f6ab4f6b195 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp @@ -42,25 +42,24 @@ enum BarthilasEvents }; // 10435 - Magistrate Barthilas -struct boss_magistrate_barthilas : public ScriptedAI +struct boss_magistrate_barthilas : public BossAI { - boss_magistrate_barthilas(Creature* creature) : ScriptedAI(creature) { } + boss_magistrate_barthilas(Creature* creature) : BossAI(creature, BOSS_MAGISTRATE_BARTHILAS) { } - void Reset() override + void JustEngagedWith(Unit* who) override { - _events.Reset(); - } + BossAI::JustEngagedWith(who); - void JustEngagedWith(Unit* /*who*/) override - { - _events.ScheduleEvent(EVENT_FURIOUS_ANGER, 0s, 4s); - _events.ScheduleEvent(EVENT_DRAINING_BLOW, 0s, 5s); - _events.ScheduleEvent(EVENT_CROWD_PUMMEL, 15s, 20s); - _events.ScheduleEvent(EVENT_MIGHTY_BLOW, 15s, 25s); + events.ScheduleEvent(EVENT_FURIOUS_ANGER, 0s, 4s); + events.ScheduleEvent(EVENT_DRAINING_BLOW, 0s, 5s); + events.ScheduleEvent(EVENT_CROWD_PUMMEL, 15s, 20s); + events.ScheduleEvent(EVENT_MIGHTY_BLOW, 15s, 25s); } - void JustDied(Unit* /*killer*/) override + void JustDied(Unit* killer) override { + BossAI::JustDied(killer); + DoCastSelf(SPELL_TRANSFORMATION, true); } @@ -69,30 +68,30 @@ struct boss_magistrate_barthilas : public ScriptedAI if (!UpdateVictim()) return; - _events.Update(diff); + events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - while (uint32 eventId = _events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_FURIOUS_ANGER: DoCastSelf(SPELL_FURIOUS_ANGER); - _events.Repeat(4s); + events.Repeat(4s); break; case EVENT_DRAINING_BLOW: DoCastVictim(SPELL_DRAINING_BLOW); - _events.Repeat(2s, 14s); + events.Repeat(2s, 14s); break; case EVENT_CROWD_PUMMEL: DoCastSelf(SPELL_CROWD_PUMMEL); - _events.Repeat(25s, 30s); + events.Repeat(25s, 30s); break; case EVENT_MIGHTY_BLOW: DoCastVictim(SPELL_MIGHTY_BLOW); - _events.Repeat(10s, 15s); + events.Repeat(10s, 15s); break; default: break; @@ -104,9 +103,6 @@ struct boss_magistrate_barthilas : public ScriptedAI DoMeleeAttackIfReady(); } - -private: - EventMap _events; }; void AddSC_boss_magistrate_barthilas() 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 7631032302e..208a3fb0d9c 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp @@ -42,27 +42,25 @@ enum MalekiEvents }; // 10438 - Maleki the Pallid -struct boss_maleki_the_pallid : public ScriptedAI +struct boss_maleki_the_pallid : public BossAI { - boss_maleki_the_pallid(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + boss_maleki_the_pallid(Creature* creature) : BossAI(creature, BOSS_MALEKI_THE_PALLID) { } void Reset() override { - _events.Reset(); + BossAI::Reset(); + DoCastSelf(SPELL_FROST_ARMOR); } - void JustEngagedWith(Unit* /*who*/) override + void JustEngagedWith(Unit* who) override { - _events.ScheduleEvent(EVENT_FROSTBOLT, 0s, 8s); - _events.ScheduleEvent(EVENT_DRAIN_LIFE, 20s, 25s); - _events.ScheduleEvent(EVENT_DRAIN_MANA, 15s, 25s); - _events.ScheduleEvent(EVENT_ICE_TOMB, 10s, 20s); - } + BossAI::JustEngagedWith(who); - void JustDied(Unit* /*killer*/) override - { - _instance->SetData(TYPE_PALLID, IN_PROGRESS); + events.ScheduleEvent(EVENT_FROSTBOLT, 0s, 8s); + events.ScheduleEvent(EVENT_DRAIN_LIFE, 20s, 25s); + events.ScheduleEvent(EVENT_DRAIN_MANA, 15s, 25s); + events.ScheduleEvent(EVENT_ICE_TOMB, 10s, 20s); } void UpdateAI(uint32 diff) override @@ -70,34 +68,34 @@ struct boss_maleki_the_pallid : public ScriptedAI if (!UpdateVictim()) return; - _events.Update(diff); + events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - while (uint32 eventId = _events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_FROSTBOLT: DoCastVictim(SPELL_FROSTBOLT); - _events.Repeat(2s, 8s); + events.Repeat(2s, 8s); break; case EVENT_DRAIN_LIFE: DoCastVictim(SPELL_DRAIN_LIFE); - _events.Repeat(20s, 30s); + events.Repeat(20s, 30s); break; case EVENT_DRAIN_MANA: { Unit* target = me->GetVictim(); if (target && target->GetPowerType() == POWER_MANA) DoCast(target, SPELL_DRAIN_MANA); - _events.Repeat(15s, 20s); + events.Repeat(15s, 20s); break; } case EVENT_ICE_TOMB: DoCastVictim(SPELL_ICE_TOMB); - _events.Repeat(15s, 25s); + events.Repeat(15s, 25s); break; default: break; @@ -106,10 +104,6 @@ struct boss_maleki_the_pallid : public ScriptedAI DoMeleeAttackIfReady(); } - -private: - EventMap _events; - InstanceScript* _instance; }; void AddSC_boss_maleki_the_pallid() diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp index 4d22f887b3e..147d01d66e3 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_nerubenkan.cpp @@ -20,7 +20,6 @@ */ #include "ScriptMgr.h" -#include "InstanceScript.h" #include "ScriptedCreature.h" #include "stratholme.h" @@ -41,26 +40,18 @@ enum NerubenkanEvents }; // 10437 - Nerub'enkan -struct boss_nerubenkan : public ScriptedAI +struct boss_nerubenkan : public BossAI { - boss_nerubenkan(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + boss_nerubenkan(Creature* creature) : BossAI(creature, BOSS_NERUB_ENKAN) { } - void Reset() override + void JustEngagedWith(Unit* who) override { - _events.Reset(); - } - - void JustEngagedWith(Unit* /*who*/) override - { - _events.ScheduleEvent(EVENT_CRYPT_SCARABS, 0s); - _events.ScheduleEvent(EVENT_ENCASING_WEBS, 5s, 10s); - _events.ScheduleEvent(EVENT_PIERCE_ARMOR, 5s, 20s); - _events.ScheduleEvent(EVENT_RAISE_SCARAB, 6s, 12s); - } + BossAI::JustEngagedWith(who); - void JustDied(Unit* /*killer*/) override - { - _instance->SetData(TYPE_NERUB, IN_PROGRESS); + events.ScheduleEvent(EVENT_CRYPT_SCARABS, 0s); + events.ScheduleEvent(EVENT_ENCASING_WEBS, 5s, 10s); + events.ScheduleEvent(EVENT_PIERCE_ARMOR, 5s, 20s); + events.ScheduleEvent(EVENT_RAISE_SCARAB, 6s, 12s); } void UpdateAI(uint32 diff) override @@ -68,30 +59,30 @@ struct boss_nerubenkan : public ScriptedAI if (!UpdateVictim()) return; - _events.Update(diff); + events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - while (uint32 eventId = _events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_CRYPT_SCARABS: DoCastVictim(SPELL_CRYPT_SCARABS); - _events.Repeat(2s, 10s); + events.Repeat(2s, 10s); break; case EVENT_ENCASING_WEBS: DoCastVictim(SPELL_ENCASING_WEBS); - _events.Repeat(6s, 10s); + events.Repeat(6s, 10s); break; case EVENT_PIERCE_ARMOR: DoCastVictim(SPELL_PIERCE_ARMOR); - _events.Repeat(10s, 20s); + events.Repeat(10s, 20s); break; case EVENT_RAISE_SCARAB: DoCastSelf(SPELL_RAISE_SCARAB); - _events.Repeat(25s, 30s); + events.Repeat(25s, 30s); break; default: break; @@ -100,10 +91,6 @@ struct boss_nerubenkan : public ScriptedAI DoMeleeAttackIfReady(); } - -private: - EventMap _events; - InstanceScript* _instance; }; void AddSC_boss_nerubenkan() diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_postmaster_malown.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_postmaster_malown.cpp index cc46fc37a2f..d61a30db0c9 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_postmaster_malown.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_postmaster_malown.cpp @@ -49,7 +49,7 @@ enum MalownEvents // 11143 - Postmaster Malown struct boss_postmaster_malown : public BossAI { - boss_postmaster_malown(Creature* creature) : BossAI(creature, TYPE_MALOWN) { } + boss_postmaster_malown(Creature* creature) : BossAI(creature, BOSS_POSTMASTER_MALOWN) { } void Reset() override { 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 41faa239cb5..63840c528fc 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp @@ -21,7 +21,6 @@ */ #include "ScriptMgr.h" -#include "InstanceScript.h" #include "ScriptedCreature.h" #include "stratholme.h" @@ -45,28 +44,31 @@ enum RamsteinMisc }; // 10439 - Ramstein the Gorger -struct boss_ramstein_the_gorger : public ScriptedAI +struct boss_ramstein_the_gorger : public BossAI { - boss_ramstein_the_gorger(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + boss_ramstein_the_gorger(Creature* creature) : BossAI(creature, BOSS_RAMSTEIN_THE_GORGER) { } void Reset() override { - _events.Reset(); + BossAI::Reset(); + DoCastSelf(SPELL_FLURRY); } - void JustEngagedWith(Unit* /*who*/) override + void JustEngagedWith(Unit* who) override { - _events.ScheduleEvent(EVENT_TRAMPLE, 10s, 15s); - _events.ScheduleEvent(EVENT_KNOCKOUT, 10s, 20s); + BossAI::JustEngagedWith(who); + + events.ScheduleEvent(EVENT_TRAMPLE, 10s, 15s); + events.ScheduleEvent(EVENT_KNOCKOUT, 10s, 20s); } - void JustDied(Unit* /*killer*/) override + void JustDied(Unit* killer) override { + BossAI::JustDied(killer); + me->SummonCreatureGroup(SUMMON_GROUP_SENTRY); me->SummonCreatureGroup(SUMMON_GROUP_UNDEAD); - - _instance->SetData(TYPE_RAMSTEIN, DONE); } void UpdateAI(uint32 diff) override @@ -74,22 +76,22 @@ struct boss_ramstein_the_gorger : public ScriptedAI if (!UpdateVictim()) return; - _events.Update(diff); + events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - while (uint32 eventId = _events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_TRAMPLE: DoCastSelf(SPELL_TRAMPLE); - _events.Repeat(10s, 25s); + events.Repeat(10s, 25s); break; case EVENT_KNOCKOUT: DoCastVictim(SPELL_KNOCKOUT); - _events.Repeat(15s, 20s); + events.Repeat(15s, 20s); break; default: break; @@ -101,10 +103,6 @@ struct boss_ramstein_the_gorger : public ScriptedAI DoMeleeAttackIfReady(); } - -private: - EventMap _events; - InstanceScript* _instance; }; void AddSC_boss_ramstein_the_gorger() 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 be9f85b0e83..c9b878b2d94 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp @@ -40,21 +40,24 @@ enum TimmyEvents }; // 10808 - Timmy the Cruel -struct boss_timmy_the_cruel : public ScriptedAI +struct boss_timmy_the_cruel : public BossAI { - boss_timmy_the_cruel(Creature* creature) : ScriptedAI(creature) { } + boss_timmy_the_cruel(Creature* creature) : BossAI(creature, BOSS_TIMMY_THE_CRUEL) { } void Reset() override { - _events.Reset(); + BossAI::Reset(); + DoCastSelf(SPELL_THRASH); } - void JustEngagedWith(Unit* /*who*/) override + void JustEngagedWith(Unit* who) override { + BossAI::JustEngagedWith(who); + Talk(SAY_AGGRO); - _events.ScheduleEvent(EVENT_RAVENOUS_CLAW, 10s, 15s); + events.ScheduleEvent(EVENT_RAVENOUS_CLAW, 10s, 15s); } void UpdateAI(uint32 diff) override @@ -62,18 +65,18 @@ struct boss_timmy_the_cruel : public ScriptedAI if (!UpdateVictim()) return; - _events.Update(diff); + events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - while (uint32 eventId = _events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_RAVENOUS_CLAW: DoCastVictim(SPELL_RAVENOUS_CLAW); - _events.Repeat(10s, 15s); + events.Repeat(10s, 15s); break; default: break; @@ -85,9 +88,6 @@ struct boss_timmy_the_cruel : public ScriptedAI DoMeleeAttackIfReady(); } - -private: - EventMap _events; }; void AddSC_boss_timmy_the_cruel() diff --git a/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp index 59f4ede242b..0c003e5adfa 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp @@ -84,21 +84,22 @@ class instance_stratholme : public InstanceMapScript instance_stratholme_InstanceMapScript(InstanceMap* map) : InstanceScript(map) { SetHeaders(DataHeader); - - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - EncounterState[i] = NOT_STARTED; + SetBossNumber(MAX_ENCOUNTER); for (uint8 i = 0; i < 5; ++i) IsSilverHandDead[i] = false; timmySpawned = false; scarletsKilled = 0; + brokenCrystals = 0; + baronRunState = NOT_STARTED; events.ScheduleEvent(EVENT_RAT_TRAP_CLOSE, 15s); } - uint32 EncounterState[MAX_ENCOUNTER]; uint8 scarletsKilled; + int32 brokenCrystals; + EncounterState baronRunState; bool IsSilverHandDead[5]; bool timmySpawned; @@ -148,6 +149,20 @@ class instance_stratholme : public InstanceMapScript } break; } + case NPC_HEARTHSINGER_FORRESTEN: + SetBossState(BOSS_HEARTHSINGER_FORRESTEN, DONE); + break; + case NPC_COMMANDER_MALOR: + SetBossState(BOSS_COMMANDER_MALOR, DONE); + break; + case NPC_INSTRUCTOR_GALFORD: + SetBossState(BOSS_INSTRUCTOR_GALFORD, DONE); + break; + case NPC_THE_UNFORGIVEN: + SetBossState(BOSS_THE_UNFORGIVEN, DONE); + break; + default: + break; case NPC_PLAGUED_RAT: { for (GateTrapData& trapGate : TrapGates) @@ -167,8 +182,7 @@ class instance_stratholme : public InstanceMapScript bool StartSlaugtherSquare() { - //change to DONE when crystals implemented - if (EncounterState[1] == IN_PROGRESS && EncounterState[2] == IN_PROGRESS && EncounterState[3] == IN_PROGRESS) + if (brokenCrystals >= 3) { HandleGameObject(portGauntletGUID, true); HandleGameObject(portSlaugtherGUID, true); @@ -264,37 +278,37 @@ class instance_stratholme : public InstanceMapScript break; case GO_ZIGGURAT1: ziggurat1GUID = go->GetGUID(); - if (GetData(TYPE_BARONESS) == IN_PROGRESS) + if (GetBossState(BOSS_BARONESS_ANASTARI) == DONE) HandleGameObject(ObjectGuid::Empty, true, go); break; case GO_ZIGGURAT2: ziggurat2GUID = go->GetGUID(); - if (GetData(TYPE_NERUB) == IN_PROGRESS) + if (GetBossState(BOSS_NERUB_ENKAN) == DONE) HandleGameObject(ObjectGuid::Empty, true, go); break; case GO_ZIGGURAT3: ziggurat3GUID = go->GetGUID(); - if (GetData(TYPE_PALLID) == IN_PROGRESS) + if (GetBossState(BOSS_MALEKI_THE_PALLID) == DONE) HandleGameObject(ObjectGuid::Empty, true, go); break; case GO_ZIGGURAT4: ziggurat4GUID = go->GetGUID(); - if (GetData(TYPE_BARON) == DONE || GetData(TYPE_RAMSTEIN) == DONE) + if (GetBossState(BOSS_RIVENDARE) == DONE || GetBossState(BOSS_RAMSTEIN_THE_GORGER) == DONE) HandleGameObject(ObjectGuid::Empty, true, go); break; case GO_ZIGGURAT5: ziggurat5GUID = go->GetGUID(); - if (GetData(TYPE_BARON) == DONE || GetData(TYPE_RAMSTEIN) == DONE) + if (GetBossState(BOSS_RIVENDARE) == DONE || GetBossState(BOSS_RAMSTEIN_THE_GORGER) == DONE) HandleGameObject(ObjectGuid::Empty, true, go); break; case GO_PORT_GAUNTLET: portGauntletGUID = go->GetGUID(); - if (GetData(TYPE_BARONESS) == IN_PROGRESS && GetData(TYPE_NERUB) == IN_PROGRESS && GetData(TYPE_PALLID) == IN_PROGRESS) + if (brokenCrystals >= 3) HandleGameObject(ObjectGuid::Empty, true, go); break; case GO_PORT_SLAUGTHER: portSlaugtherGUID = go->GetGUID(); - if (GetData(TYPE_BARONESS) == IN_PROGRESS && GetData(TYPE_NERUB) == IN_PROGRESS && GetData(TYPE_PALLID) == IN_PROGRESS) + if (brokenCrystals >= 3) HandleGameObject(ObjectGuid::Empty, true, go); break; case GO_PORT_ELDERS: @@ -318,6 +332,72 @@ class instance_stratholme : public InstanceMapScript } } + bool SetBossState(uint32 id, EncounterState state) override + { + if (!InstanceScript::SetBossState(id, state)) + return false; + + switch (id) + { + case BOSS_BARONESS_ANASTARI: + if (state == DONE) + { + HandleGameObject(ziggurat1GUID, true); + + //remove when crystals implemented + ++brokenCrystals; + StartSlaugtherSquare(); + } + break; + case BOSS_NERUB_ENKAN: + if (state == DONE) + { + HandleGameObject(ziggurat2GUID, true); + + //remove when crystals implemented + ++brokenCrystals; + StartSlaugtherSquare(); + } + break; + case BOSS_MALEKI_THE_PALLID: + if (state == DONE) + { + HandleGameObject(ziggurat3GUID, true); + + //remove when crystals implemented + ++brokenCrystals; + StartSlaugtherSquare(); + } + break; + case BOSS_RAMSTEIN_THE_GORGER: + if (state == NOT_STARTED) + HandleGameObject(portGauntletGUID, true); + + if (state == DONE) + { + events.ScheduleEvent(EVENT_SLAUGHTER_SQUARE, 1min); + TC_LOG_DEBUG("scripts", "Instance Stratholme: Slaugther event will continue in 1 minute."); + } + break; + case BOSS_RIVENDARE: + HandleGameObject(ziggurat4GUID, GetBossState(BOSS_RAMSTEIN_THE_GORGER) == DONE && state != IN_PROGRESS); + HandleGameObject(ziggurat5GUID, GetBossState(BOSS_RAMSTEIN_THE_GORGER) == DONE && state != IN_PROGRESS); + if (state == DONE) + { + HandleGameObject(portGauntletGUID, true); + if (GetData(TYPE_BARON_RUN) == IN_PROGRESS) + DoRemoveAurasDueToSpellOnPlayers(SPELL_BARON_ULTIMATUM); + + SetData(TYPE_BARON_RUN, DONE); + } + break; + default: + break; + } + + return true; + } + void SetData(uint32 type, uint32 data) override { switch (type) @@ -326,9 +406,9 @@ class instance_stratholme : public InstanceMapScript switch (data) { case IN_PROGRESS: - if (EncounterState[0] == IN_PROGRESS || EncounterState[0] == FAIL) + if (baronRunState == IN_PROGRESS || baronRunState == FAIL) break; - EncounterState[0] = data; + baronRunState = IN_PROGRESS; events.ScheduleEvent(EVENT_BARON_RUN, 45min); TC_LOG_DEBUG("scripts", "Instance Stratholme: Baron run in progress."); break; @@ -336,10 +416,10 @@ class instance_stratholme : public InstanceMapScript DoRemoveAurasDueToSpellOnPlayers(SPELL_BARON_ULTIMATUM); if (Creature* ysida = instance->GetCreature(ysidaGUID)) ysida->CastSpell(ysida, SPELL_PERM_FEIGN_DEATH, true); - EncounterState[0] = data; + baronRunState = FAIL; break; case DONE: - EncounterState[0] = data; + baronRunState = DONE; if (Creature* ysida = instance->GetCreature(ysidaGUID)) { @@ -374,33 +454,6 @@ class instance_stratholme : public InstanceMapScript break; } break; - case TYPE_BARONESS: - EncounterState[1] = data; - if (data == IN_PROGRESS) - { - HandleGameObject(ziggurat1GUID, true); - //change to DONE when crystals implemented - StartSlaugtherSquare(); - } - break; - case TYPE_NERUB: - EncounterState[2] = data; - if (data == IN_PROGRESS) - { - HandleGameObject(ziggurat2GUID, true); - //change to DONE when crystals implemented - StartSlaugtherSquare(); - } - break; - case TYPE_PALLID: - EncounterState[3] = data; - if (data == IN_PROGRESS) - { - HandleGameObject(ziggurat3GUID, true); - //change to DONE when crystals implemented - StartSlaugtherSquare(); - } - break; case TYPE_RAMSTEIN: if (data == IN_PROGRESS) { @@ -425,37 +478,6 @@ class instance_stratholme : public InstanceMapScript else TC_LOG_DEBUG("scripts", "Instance Stratholme: {} Abomnation left to kill.", count); } - - if (data == NOT_STARTED) - HandleGameObject(portGauntletGUID, true); - - if (data == DONE) - { - events.ScheduleEvent(EVENT_SLAUGHTER_SQUARE, 1min); - TC_LOG_DEBUG("scripts", "Instance Stratholme: Slaugther event will continue in 1 minute."); - } - EncounterState[4] = data; - break; - case TYPE_BARON: - if (data == IN_PROGRESS) - { - HandleGameObject(ziggurat4GUID, false); - HandleGameObject(ziggurat5GUID, false); - } - if (data == DONE || data == NOT_STARTED) - { - HandleGameObject(ziggurat4GUID, true); - HandleGameObject(ziggurat5GUID, true); - } - if (data == DONE) - { - HandleGameObject(portGauntletGUID, true); - if (GetData(TYPE_BARON_RUN) == IN_PROGRESS) - DoRemoveAurasDueToSpellOnPlayers(SPELL_BARON_ULTIMATUM); - - SetData(TYPE_BARON_RUN, DONE); - } - EncounterState[5] = data; break; case TYPE_SH_AELMAR: IsSilverHandDead[0] = (data) ? true : false; @@ -472,47 +494,9 @@ class instance_stratholme : public InstanceMapScript case TYPE_SH_VICAR: IsSilverHandDead[4] = (data) ? true : false; break; + default: + break; } - - if (data == DONE) - SaveToDB(); - } - - std::string GetSaveData() override - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << EncounterState[0] << ' ' << EncounterState[1] << ' ' << EncounterState[2] << ' ' - << EncounterState[3] << ' ' << EncounterState[4] << ' ' << EncounterState[5]; - - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } - - void Load(char const* in) override - { - if (!in) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } - - OUT_LOAD_INST_DATA(in); - - std::istringstream loadStream(in); - loadStream >> EncounterState[0] >> EncounterState[1] >> EncounterState[2] >> EncounterState[3] - >> EncounterState[4] >> EncounterState[5]; - - // Do not reset 1, 2 and 3. they are not set to done, yet . - if (EncounterState[0] == IN_PROGRESS) - EncounterState[0] = NOT_STARTED; - if (EncounterState[4] == IN_PROGRESS) - EncounterState[4] = NOT_STARTED; - if (EncounterState[5] == IN_PROGRESS) - EncounterState[5] = NOT_STARTED; - - OUT_LOAD_INST_DATA_COMPLETE; } uint32 GetData(uint32 type) const override @@ -524,17 +508,19 @@ class instance_stratholme : public InstanceMapScript return 1; return 0; case TYPE_BARON_RUN: - return EncounterState[0]; + return baronRunState; case TYPE_BARONESS: - return EncounterState[1]; + return GetBossState(BOSS_BARONESS_ANASTARI); case TYPE_NERUB: - return EncounterState[2]; + return GetBossState(BOSS_NERUB_ENKAN); case TYPE_PALLID: - return EncounterState[3]; + return GetBossState(BOSS_MALEKI_THE_PALLID); case TYPE_RAMSTEIN: - return EncounterState[4]; + return GetBossState(BOSS_RAMSTEIN_THE_GORGER); case TYPE_BARON: - return EncounterState[5]; + return GetBossState(BOSS_RIVENDARE); + default: + break; } return 0; } @@ -549,6 +535,8 @@ class instance_stratholme : public InstanceMapScript return ysidaTriggerGUID; case NPC_YSIDA: return ysidaGUID; + default: + break; } return ObjectGuid::Empty; } @@ -611,6 +599,18 @@ class instance_stratholme : public InstanceMapScript } } } + + void ReadSaveDataMore(std::istringstream& /*data*/) override + { + if (GetBossState(BOSS_BARONESS_ANASTARI) == DONE) + ++brokenCrystals; + if (GetBossState(BOSS_NERUB_ENKAN) == DONE) + ++brokenCrystals; + if (GetBossState(BOSS_MALEKI_THE_PALLID) == DONE) + ++brokenCrystals; + + baronRunState = FAIL; + } }; InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h index fa0554c5c67..68c6ce2d094 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h +++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h @@ -23,6 +23,26 @@ #define StratholmeScriptName "instance_stratholme" #define DataHeader "STR" +enum STRBossIds +{ + BOSS_HEARTHSINGER_FORRESTEN = 0, + BOSS_TIMMY_THE_CRUEL = 1, + BOSS_COMMANDER_MALOR = 2, + BOSS_CANNON_MASTER_WILLEY = 3, + BOSS_INSTRUCTOR_GALFORD = 4, + BOSS_BALNAZZAR = 5, + BOSS_THE_UNFORGIVEN = 6, + BOSS_BARONESS_ANASTARI = 7, + BOSS_NERUB_ENKAN = 8, + BOSS_MALEKI_THE_PALLID = 9, + BOSS_MAGISTRATE_BARTHILAS = 10, + BOSS_RAMSTEIN_THE_GORGER = 11, + BOSS_RIVENDARE = 12, + BOSS_POSTMASTER_MALOWN = 13, + + MAX_ENCOUNTER +}; + enum STRDataTypes { TYPE_BARON_RUN = 1, @@ -32,8 +52,6 @@ enum STRDataTypes TYPE_RAMSTEIN = 5, TYPE_BARON = 6, - TYPE_MALOWN = 7, - DATA_BARON = 10, DATA_YSIDA_TRIGGER = 11, @@ -47,6 +65,11 @@ enum STRDataTypes enum STRCreatureIds { + NPC_HEARTHSINGER_FORRESTEN = 10558, + NPC_COMMANDER_MALOR = 11032, + NPC_INSTRUCTOR_GALFORD = 10811, + NPC_THE_UNFORGIVEN = 10516, + NPC_CRYSTAL = 10415, // ziggurat crystal NPC_BARON = 10440, // ziggurat crystal NPC_YSIDA_TRIGGER = 16100, // ziggurat crystal @@ -106,7 +129,6 @@ enum STRMisc { //! amount of crusade monsters required to be killed in order for timmy the cruel to spawn TIMMY_THE_CRUEL_CRUSADERS_REQUIRED = 15, - MAX_ENCOUNTER = 6 }; template <class AI, class T> |