diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp index 8077b64d2..c5028772f 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp @@ -15,9 +15,7 @@ * with this program. If not, see . */ -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "naxxramas.h" +#include "boss_anubrekhan.h" enum Says { @@ -60,188 +58,174 @@ enum Misc ACHIEV_TIMED_START_EVENT = 9891 }; -class boss_anubrekhan : public CreatureScript +CreatureAI* boss_anubrekhan::GetAI(Creature* pCreature) const { -public: - boss_anubrekhan() : CreatureScript("boss_anubrekhan") { } + return GetNaxxramasAI(pCreature); +} - CreatureAI* GetAI(Creature* pCreature) const override +boss_anubrekhan::boss_anubrekhanAI::boss_anubrekhanAI(Creature* c) : BossAI(c, BOSS_ANUB), summons(me) +{ + pInstance = c->GetInstanceScript(); + sayGreet = false; +} + +void boss_anubrekhan::boss_anubrekhanAI::SummonCryptGuards() +{ + if (Is25ManRaid()) { - return GetNaxxramasAI(pCreature); + me->SummonCreature(NPC_CRYPT_GUARD, 3299.732f, -3502.489f, 287.077f, 2.378f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000); + me->SummonCreature(NPC_CRYPT_GUARD, 3299.086f, -3450.929f, 287.077f, 3.999f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000); + } +} + +void boss_anubrekhan::boss_anubrekhanAI::Reset() +{ + BossAI::Reset(); + events.Reset(); + summons.DespawnAll(); + SummonCryptGuards(); + if (pInstance) + { + if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_ANUB_GATE))) + { + go->SetGoState(GO_STATE_ACTIVE); + } + } +} + +void boss_anubrekhan::boss_anubrekhanAI::JustSummoned(Creature* cr) +{ + if (me->IsInCombat()) + { + cr->SetInCombatWithZone(); + if (cr->GetEntry() == NPC_CRYPT_GUARD) + { + cr->AI()->Talk(EMOTE_SPAWN, me); + } + } + summons.Summon(cr); +} + +void boss_anubrekhan::boss_anubrekhanAI::SummonedCreatureDies(Creature* cr, Unit*) +{ + if (cr->GetEntry() == NPC_CRYPT_GUARD) + { + cr->CastSpell(cr, SPELL_SUMMON_CORPSE_SCRABS_10, true, nullptr, nullptr, me->GetGUID()); + cr->AI()->Talk(EMOTE_SCARAB); + } +} + +void boss_anubrekhan::boss_anubrekhanAI::SummonedCreatureDespawn(Creature* cr) +{ + summons.Despawn(cr); +} + +void boss_anubrekhan::boss_anubrekhanAI::JustDied(Unit* killer) +{ + BossAI::JustDied(killer); + summons.DespawnAll(); + if (pInstance) + { + pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + } +} + +void boss_anubrekhan::boss_anubrekhanAI::KilledUnit(Unit* victim) +{ + if (victim->GetTypeId() != TYPEID_PLAYER) + return; + + Talk(SAY_SLAY); + victim->CastSpell(victim, SPELL_SUMMON_CORPSE_SCRABS_5, true, nullptr, nullptr, me->GetGUID()); + if (pInstance) + { + pInstance->SetData(DATA_IMMORTAL_FAIL, 0); + } +} + +void boss_anubrekhan::boss_anubrekhanAI::JustEngagedWith(Unit* who) +{ + BossAI::JustEngagedWith(who); + me->CallForHelp(30.0f); + Talk(SAY_AGGRO); + if (pInstance) + { + if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_ANUB_GATE))) + { + go->SetGoState(GO_STATE_READY); + } + } + events.ScheduleEvent(EVENT_IMPALE, 15s); + events.ScheduleEvent(EVENT_LOCUST_SWARM, 70s, 120s); + events.ScheduleEvent(EVENT_BERSERK, 10min); + if (!summons.HasEntry(NPC_CRYPT_GUARD)) + { + SummonCryptGuards(); + } + if (!Is25ManRaid()) + { + events.ScheduleEvent(EVENT_SPAWN_GUARD, 15s, 20s); + } +} + +void boss_anubrekhan::boss_anubrekhanAI::MoveInLineOfSight(Unit* who) +{ + if (!sayGreet && who->GetTypeId() == TYPEID_PLAYER) + { + Talk(SAY_GREET); + sayGreet = true; + } + ScriptedAI::MoveInLineOfSight(who); +} + +void boss_anubrekhan::boss_anubrekhanAI::UpdateAI(uint32 diff) +{ + if (!me->IsInCombat() && sayGreet) + { + for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr) + { + if (pInstance) + { + if (Creature* cr = pInstance->instance->GetCreature(*itr)) + { + if (cr->IsInCombat()) + DoZoneInCombat(); + } + } + } } - struct boss_anubrekhanAI : public BossAI + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - explicit boss_anubrekhanAI(Creature* c) : BossAI(c, BOSS_ANUB), summons(me) - { - pInstance = c->GetInstanceScript(); - sayGreet = false; - } - - InstanceScript* pInstance; - EventMap events; - SummonList summons; - bool sayGreet; - - void SummonCryptGuards() - { - if (Is25ManRaid()) + case EVENT_IMPALE: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) { - me->SummonCreature(NPC_CRYPT_GUARD, 3299.732f, -3502.489f, 287.077f, 2.378f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000); - me->SummonCreature(NPC_CRYPT_GUARD, 3299.086f, -3450.929f, 287.077f, 3.999f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000); + me->CastSpell(target, RAID_MODE(SPELL_IMPALE_10, SPELL_IMPALE_25), false); } - } - - void Reset() override - { - BossAI::Reset(); - events.Reset(); - summons.DespawnAll(); - SummonCryptGuards(); - if (pInstance) - { - if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_ANUB_GATE))) - { - go->SetGoState(GO_STATE_ACTIVE); - } - } - } - - void JustSummoned(Creature* cr) override - { - if (me->IsInCombat()) - { - cr->SetInCombatWithZone(); - if (cr->GetEntry() == NPC_CRYPT_GUARD) - { - cr->AI()->Talk(EMOTE_SPAWN, me); - } - } - summons.Summon(cr); - } - - void SummonedCreatureDies(Creature* cr, Unit*) override - { - if (cr->GetEntry() == NPC_CRYPT_GUARD) - { - cr->CastSpell(cr, SPELL_SUMMON_CORPSE_SCRABS_10, true, nullptr, nullptr, me->GetGUID()); - cr->AI()->Talk(EMOTE_SCARAB); - } - } - - void SummonedCreatureDespawn(Creature* cr) override - { - summons.Despawn(cr); - } - - void JustDied(Unit* killer) override - { - BossAI::JustDied(killer); - summons.DespawnAll(); - if (pInstance) - { - pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); - } - } - - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - - Talk(SAY_SLAY); - victim->CastSpell(victim, SPELL_SUMMON_CORPSE_SCRABS_5, true, nullptr, nullptr, me->GetGUID()); - if (pInstance) - { - pInstance->SetData(DATA_IMMORTAL_FAIL, 0); - } - } - - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - me->CallForHelp(30.0f); - Talk(SAY_AGGRO); - if (pInstance) - { - if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_ANUB_GATE))) - { - go->SetGoState(GO_STATE_READY); - } - } - events.ScheduleEvent(EVENT_IMPALE, 15s); - events.ScheduleEvent(EVENT_LOCUST_SWARM, 70s, 120s); - events.ScheduleEvent(EVENT_BERSERK, 10min); - if (!summons.HasEntry(NPC_CRYPT_GUARD)) - { - SummonCryptGuards(); - } - if (!Is25ManRaid()) - { - events.ScheduleEvent(EVENT_SPAWN_GUARD, 15s, 20s); - } - } - - void MoveInLineOfSight(Unit* who) override - { - if (!sayGreet && who->GetTypeId() == TYPEID_PLAYER) - { - Talk(SAY_GREET); - sayGreet = true; - } - ScriptedAI::MoveInLineOfSight(who); - } - - void UpdateAI(uint32 diff) override - { - if (!me->IsInCombat() && sayGreet) - { - for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr) - { - if (pInstance) - { - if (Creature* cr = pInstance->instance->GetCreature(*itr)) - { - if (cr->IsInCombat()) - DoZoneInCombat(); - } - } - } - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_IMPALE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - { - me->CastSpell(target, RAID_MODE(SPELL_IMPALE_10, SPELL_IMPALE_25), false); - } - events.Repeat(20s); - break; - case EVENT_LOCUST_SWARM: - Talk(EMOTE_LOCUST); - me->CastSpell(me, RAID_MODE(SPELL_LOCUST_SWARM_10, SPELL_LOCUST_SWARM_25), false); - events.ScheduleEvent(EVENT_SPAWN_GUARD, 3s); - events.Repeat(90s); - break; - case EVENT_SPAWN_GUARD: - me->SummonCreature(NPC_CRYPT_GUARD, 3331.217f, -3476.607f, 287.074f, 3.269f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000); - break; - case EVENT_BERSERK: - me->CastSpell(me, SPELL_BERSERK, true); - break; - } - DoMeleeAttackIfReady(); - } - }; -}; + events.Repeat(20s); + break; + case EVENT_LOCUST_SWARM: + Talk(EMOTE_LOCUST); + me->CastSpell(me, RAID_MODE(SPELL_LOCUST_SWARM_10, SPELL_LOCUST_SWARM_25), false); + events.ScheduleEvent(EVENT_SPAWN_GUARD, 3s); + events.Repeat(90s); + break; + case EVENT_SPAWN_GUARD: + me->SummonCreature(NPC_CRYPT_GUARD, 3331.217f, -3476.607f, 287.074f, 3.269f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000); + break; + case EVENT_BERSERK: + me->CastSpell(me, SPELL_BERSERK, true); + break; + } + DoMeleeAttackIfReady(); +} void AddSC_boss_anubrekhan() { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.h b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.h new file mode 100644 index 000000000..a9032b117 --- /dev/null +++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.h @@ -0,0 +1,46 @@ +#ifndef BOSS_ANUBREKHAN_H_ +#define BOSS_ANUBREKHAN_H_ + +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "naxxramas.h" + +class boss_anubrekhan : public CreatureScript +{ +public: + boss_anubrekhan() : CreatureScript("boss_anubrekhan") { } + + CreatureAI* GetAI(Creature* pCreature) const override; + + struct boss_anubrekhanAI : public BossAI + { + explicit boss_anubrekhanAI(Creature* c); + + InstanceScript* pInstance; + EventMap events; + SummonList summons; + bool sayGreet; + + void SummonCryptGuards(); + + void Reset() override; + + void JustSummoned(Creature* cr) override; + + void SummonedCreatureDies(Creature* cr, Unit*) override; + + void SummonedCreatureDespawn(Creature* cr) override; + + void JustDied(Unit* killer) override; + + void KilledUnit(Unit* victim) override; + + void JustEngagedWith(Unit* who) override; + + void MoveInLineOfSight(Unit* who) override; + + void UpdateAI(uint32 diff) override; + }; +}; + +#endif \ No newline at end of file diff --git a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp index 2a2fb4ef7..686968709 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp @@ -17,6 +17,252 @@ #include "boss_grobbulus.h" +enum Spells +{ + SPELL_POISON_CLOUD = 28240, + SPELL_MUTATING_INJECTION = 28169, + SPELL_MUTATING_EXPLOSION = 28206, + SPELL_SLIME_SPRAY_10 = 28157, + SPELL_SLIME_SPRAY_25 = 54364, + SPELL_POISON_CLOUD_DAMAGE_AURA_10 = 28158, + SPELL_POISON_CLOUD_DAMAGE_AURA_25 = 54362, + SPELL_BERSERK = 26662, + SPELL_BOMBARD_SLIME = 28280 +}; + +enum Emotes +{ + EMOTE_SLIME = 0 +}; + +enum Events +{ + EVENT_BERSERK = 1, + EVENT_POISON_CLOUD = 2, + EVENT_SLIME_SPRAY = 3, + EVENT_MUTATING_INJECTION = 4 +}; + +enum Misc +{ + NPC_FALLOUT_SLIME = 16290, + NPC_SEWAGE_SLIME = 16375, + NPC_STICHED_GIANT = 16025 +}; + +CreatureAI* boss_grobbulus::GetAI(Creature* pCreature) const +{ + return GetNaxxramasAI(pCreature); +} + +boss_grobbulus::boss_grobbulusAI::boss_grobbulusAI(Creature* c) : BossAI(c, BOSS_GROBBULUS), summons(me) +{ + pInstance = me->GetInstanceScript(); +} + +void boss_grobbulus::boss_grobbulusAI::Reset() +{ + BossAI::Reset(); + events.Reset(); + summons.DespawnAll(); + dropSludgeTimer = 0; +} + +void boss_grobbulus::boss_grobbulusAI::PullChamberAdds() +{ + std::list StichedGiants; + me->GetCreaturesWithEntryInRange(StichedGiants, 300.0f, NPC_STICHED_GIANT); + for (std::list::const_iterator itr = StichedGiants.begin(); itr != StichedGiants.end(); ++itr) + { + (*itr)->ToCreature()->AI()->AttackStart(me->GetVictim()); + } +} + +void boss_grobbulus::boss_grobbulusAI::JustEngagedWith(Unit* who) +{ + BossAI::JustEngagedWith(who); + PullChamberAdds(); + me->SetInCombatWithZone(); + events.ScheduleEvent(EVENT_POISON_CLOUD, 15s); + events.ScheduleEvent(EVENT_MUTATING_INJECTION, 20s); + events.ScheduleEvent(EVENT_SLIME_SPRAY, 10s); + events.ScheduleEvent(EVENT_BERSERK, RAID_MODE(720000, 540000)); +} + +void boss_grobbulus::boss_grobbulusAI::SpellHitTarget(Unit* target, SpellInfo const* spellInfo) +{ + if (spellInfo->Id == RAID_MODE(SPELL_SLIME_SPRAY_10, SPELL_SLIME_SPRAY_25) && target->GetTypeId() == TYPEID_PLAYER) + { + me->SummonCreature(NPC_FALLOUT_SLIME, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); + } +} + +void boss_grobbulus::boss_grobbulusAI::JustSummoned(Creature* cr) +{ + if (cr->GetEntry() == NPC_FALLOUT_SLIME) + { + cr->SetInCombatWithZone(); + } + summons.Summon(cr); +} + +void boss_grobbulus::boss_grobbulusAI::SummonedCreatureDespawn(Creature* summon) +{ + summons.Despawn(summon); +} + +void boss_grobbulus::boss_grobbulusAI::JustDied(Unit* killer) +{ + BossAI::JustDied(killer); + summons.DespawnAll(); +} + +void boss_grobbulus::boss_grobbulusAI::KilledUnit(Unit* who) +{ + if (who->GetTypeId() == TYPEID_PLAYER && pInstance) + { + pInstance->SetData(DATA_IMMORTAL_FAIL, 0); + } +} + +void boss_grobbulus::boss_grobbulusAI::UpdateAI(uint32 diff) +{ + dropSludgeTimer += diff; + if (!me->IsInCombat() && dropSludgeTimer >= 5000) + { + if (me->IsWithinDist3d(3178, -3305, 319, 5.0f) && !summons.HasEntry(NPC_SEWAGE_SLIME)) + { + me->CastSpell(3128.96f + irand(-20, 20), -3312.96f + irand(-20, 20), 293.25f, SPELL_BOMBARD_SLIME, false); + } + dropSludgeTimer = 0; + } + + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_POISON_CLOUD: + me->CastSpell(me, SPELL_POISON_CLOUD, true); + events.Repeat(15s); + break; + case EVENT_BERSERK: + me->CastSpell(me, SPELL_BERSERK, true); + break; + case EVENT_SLIME_SPRAY: + Talk(EMOTE_SLIME); + me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_SLIME_SPRAY_10, SPELL_SLIME_SPRAY_25), false); + events.Repeat(20s); + break; + case EVENT_MUTATING_INJECTION: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true, true, -SPELL_MUTATING_INJECTION)) + { + me->CastSpell(target, SPELL_MUTATING_INJECTION, false); + } + events.RepeatEvent(6000 + uint32(120 * me->GetHealthPct())); + break; + } + DoMeleeAttackIfReady(); +} + +CreatureAI* boss_grobbulus_poison_cloud::GetAI(Creature* pCreature) const +{ + return GetNaxxramasAI(pCreature); +} + +void boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::Reset() +{ + sizeTimer = 0; + auraVisualTimer = 1; + me->SetFloatValue(UNIT_FIELD_COMBATREACH, 2.0f); + me->SetFaction(FACTION_BOOTY_BAY); +} + +void boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::KilledUnit(Unit* who) +{ + if (who->GetTypeId() == TYPEID_PLAYER && me->GetInstanceScript()) + { + me->GetInstanceScript()->SetData(DATA_IMMORTAL_FAIL, 0); + } +} + +void boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::UpdateAI(uint32 diff) +{ + if (auraVisualTimer) // this has to be delayed to be visible + { + auraVisualTimer += diff; + if (auraVisualTimer >= 1000) + { + me->CastSpell(me, (me->GetMap()->Is25ManRaid() ? SPELL_POISON_CLOUD_DAMAGE_AURA_25 : SPELL_POISON_CLOUD_DAMAGE_AURA_10), true); + auraVisualTimer = 0; + } + } + sizeTimer += diff; // increase size to 15yd in 60 seconds, 0.00025 is the growth of size in 1ms + me->SetFloatValue(UNIT_FIELD_COMBATREACH, 2.0f + (0.00025f * sizeTimer)); +} + +void spell_grobbulus_poison::spell_grobbulus_poison_SpellScript::FilterTargets(std::list& targets) +{ + std::list tmplist; + for (auto& target : targets) + { + if (GetCaster()->IsWithinDist3d(target, 0.0f)) + { + tmplist.push_back(target); + } + } + targets.clear(); + for (auto& itr : tmplist) + { + targets.push_back(itr); + } +} + +void spell_grobbulus_poison::spell_grobbulus_poison_SpellScript::Register() +{ + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_grobbulus_poison_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); +} + +SpellScript* spell_grobbulus_poison::GetSpellScript() const +{ + return new spell_grobbulus_poison_SpellScript(); +} + +bool spell_grobbulus_mutating_injection::spell_grobbulus_mutating_injection_AuraScript::Validate(SpellInfo const* /*spellInfo*/) +{ + return ValidateSpellInfo({ SPELL_MUTATING_EXPLOSION }); +} + +void spell_grobbulus_mutating_injection::spell_grobbulus_mutating_injection_AuraScript::HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +{ + switch (GetTargetApplication()->GetRemoveMode()) + { + case AURA_REMOVE_BY_ENEMY_SPELL: + case AURA_REMOVE_BY_EXPIRE: + if (auto caster = GetCaster()) + { + caster->CastSpell(GetTarget(), SPELL_MUTATING_EXPLOSION, true); + } + break; + default: + return; + } +} + +void spell_grobbulus_mutating_injection::spell_grobbulus_mutating_injection_AuraScript::Register() +{ + AfterEffectRemove += AuraEffectRemoveFn(spell_grobbulus_mutating_injection_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); +} + +AuraScript* spell_grobbulus_mutating_injection::GetAuraScript() const +{ + return new spell_grobbulus_mutating_injection_AuraScript(); +} + void AddSC_boss_grobbulus() { new boss_grobbulus(); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.h b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.h index d41b0322c..41e00a6f4 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.h +++ b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.h @@ -9,169 +9,41 @@ #include "SpellScript.h" #include "naxxramas.h" -enum Spells -{ - SPELL_POISON_CLOUD = 28240, - SPELL_MUTATING_INJECTION = 28169, - SPELL_MUTATING_EXPLOSION = 28206, - SPELL_SLIME_SPRAY_10 = 28157, - SPELL_SLIME_SPRAY_25 = 54364, - SPELL_POISON_CLOUD_DAMAGE_AURA_10 = 28158, - SPELL_POISON_CLOUD_DAMAGE_AURA_25 = 54362, - SPELL_BERSERK = 26662, - SPELL_BOMBARD_SLIME = 28280 -}; -enum Emotes -{ - EMOTE_SLIME = 0 -}; - -enum Events -{ - EVENT_BERSERK = 1, - EVENT_POISON_CLOUD = 2, - EVENT_SLIME_SPRAY = 3, - EVENT_MUTATING_INJECTION = 4 -}; - -enum Misc -{ - NPC_FALLOUT_SLIME = 16290, - NPC_SEWAGE_SLIME = 16375, - NPC_STICHED_GIANT = 16025 -}; class boss_grobbulus : public CreatureScript { public: boss_grobbulus() : CreatureScript("boss_grobbulus") { } - CreatureAI* GetAI(Creature* pCreature) const override - { - return GetNaxxramasAI(pCreature); - } + CreatureAI* GetAI(Creature* pCreature) const override; struct boss_grobbulusAI : public BossAI { - explicit boss_grobbulusAI(Creature* c) : BossAI(c, BOSS_GROBBULUS), summons(me) - { - pInstance = me->GetInstanceScript(); - } + explicit boss_grobbulusAI(Creature* c); EventMap events; SummonList summons; InstanceScript* pInstance; uint32 dropSludgeTimer{}; - void Reset() override - { - BossAI::Reset(); - events.Reset(); - summons.DespawnAll(); - dropSludgeTimer = 0; - } + void Reset() override; - void PullChamberAdds() - { - std::list StichedGiants; - me->GetCreaturesWithEntryInRange(StichedGiants, 300.0f, NPC_STICHED_GIANT); - for (std::list::const_iterator itr = StichedGiants.begin(); itr != StichedGiants.end(); ++itr) - { - (*itr)->ToCreature()->AI()->AttackStart(me->GetVictim()); - } - } + void PullChamberAdds(); - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - PullChamberAdds(); - me->SetInCombatWithZone(); - events.ScheduleEvent(EVENT_POISON_CLOUD, 15s); - events.ScheduleEvent(EVENT_MUTATING_INJECTION, 20s); - events.ScheduleEvent(EVENT_SLIME_SPRAY, 10s); - events.ScheduleEvent(EVENT_BERSERK, RAID_MODE(720000, 540000)); - } + void JustEngagedWith(Unit* who) override; - void SpellHitTarget(Unit* target, SpellInfo const* spellInfo) override - { - if (spellInfo->Id == RAID_MODE(SPELL_SLIME_SPRAY_10, SPELL_SLIME_SPRAY_25) && target->GetTypeId() == TYPEID_PLAYER) - { - me->SummonCreature(NPC_FALLOUT_SLIME, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); - } - } + void SpellHitTarget(Unit* target, SpellInfo const* spellInfo) override; - void JustSummoned(Creature* cr) override - { - if (cr->GetEntry() == NPC_FALLOUT_SLIME) - { - cr->SetInCombatWithZone(); - } - summons.Summon(cr); - } + void JustSummoned(Creature* cr) override; - void SummonedCreatureDespawn(Creature* summon) override - { - summons.Despawn(summon); - } + void SummonedCreatureDespawn(Creature* summon) override; - void JustDied(Unit* killer) override - { - BossAI::JustDied(killer); - summons.DespawnAll(); - } + void JustDied(Unit* killer) override; - void KilledUnit(Unit* who) override - { - if (who->GetTypeId() == TYPEID_PLAYER && pInstance) - { - pInstance->SetData(DATA_IMMORTAL_FAIL, 0); - } - } + void KilledUnit(Unit* who) override; - void UpdateAI(uint32 diff) override - { - dropSludgeTimer += diff; - if (!me->IsInCombat() && dropSludgeTimer >= 5000) - { - if (me->IsWithinDist3d(3178, -3305, 319, 5.0f) && !summons.HasEntry(NPC_SEWAGE_SLIME)) - { - me->CastSpell(3128.96f + irand(-20, 20), -3312.96f + irand(-20, 20), 293.25f, SPELL_BOMBARD_SLIME, false); - } - dropSludgeTimer = 0; - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_POISON_CLOUD: - me->CastSpell(me, SPELL_POISON_CLOUD, true); - events.Repeat(15s); - break; - case EVENT_BERSERK: - me->CastSpell(me, SPELL_BERSERK, true); - break; - case EVENT_SLIME_SPRAY: - Talk(EMOTE_SLIME); - me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_SLIME_SPRAY_10, SPELL_SLIME_SPRAY_25), false); - events.Repeat(20s); - break; - case EVENT_MUTATING_INJECTION: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true, true, -SPELL_MUTATING_INJECTION)) - { - me->CastSpell(target, SPELL_MUTATING_INJECTION, false); - } - events.RepeatEvent(6000 + uint32(120 * me->GetHealthPct())); - break; - } - DoMeleeAttackIfReady(); - } + void UpdateAI(uint32 diff) override; }; }; @@ -180,10 +52,7 @@ class boss_grobbulus_poison_cloud : public CreatureScript public: boss_grobbulus_poison_cloud() : CreatureScript("boss_grobbulus_poison_cloud") { } - CreatureAI* GetAI(Creature* pCreature) const override - { - return GetNaxxramasAI(pCreature); - } + CreatureAI* GetAI(Creature* pCreature) const override; struct boss_grobbulus_poison_cloudAI : public NullCreatureAI { @@ -192,36 +61,11 @@ public: uint32 sizeTimer{}; uint32 auraVisualTimer{}; - void Reset() override - { - sizeTimer = 0; - auraVisualTimer = 1; - me->SetFloatValue(UNIT_FIELD_COMBATREACH, 2.0f); - me->SetFaction(FACTION_BOOTY_BAY); - } + void Reset() override; - void KilledUnit(Unit* who) override - { - if (who->GetTypeId() == TYPEID_PLAYER && me->GetInstanceScript()) - { - me->GetInstanceScript()->SetData(DATA_IMMORTAL_FAIL, 0); - } - } + void KilledUnit(Unit* who) override; - void UpdateAI(uint32 diff) override - { - if (auraVisualTimer) // this has to be delayed to be visible - { - auraVisualTimer += diff; - if (auraVisualTimer >= 1000) - { - me->CastSpell(me, (me->GetMap()->Is25ManRaid() ? SPELL_POISON_CLOUD_DAMAGE_AURA_25 : SPELL_POISON_CLOUD_DAMAGE_AURA_10), true); - auraVisualTimer = 0; - } - } - sizeTimer += diff; // increase size to 15yd in 60 seconds, 0.00025 is the growth of size in 1ms - me->SetFloatValue(UNIT_FIELD_COMBATREACH, 2.0f + (0.00025f * sizeTimer)); - } + void UpdateAI(uint32 diff) override; }; }; @@ -234,33 +78,12 @@ public: { PrepareSpellScript(spell_grobbulus_poison_SpellScript); - void FilterTargets(std::list& targets) - { - std::list tmplist; - for (auto& target : targets) - { - if (GetCaster()->IsWithinDist3d(target, 0.0f)) - { - tmplist.push_back(target); - } - } - targets.clear(); - for (auto& itr : tmplist) - { - targets.push_back(itr); - } - } + void FilterTargets(std::list& targets); - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_grobbulus_poison_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } + void Register() override; }; - SpellScript* GetSpellScript() const override - { - return new spell_grobbulus_poison_SpellScript(); - } + SpellScript* GetSpellScript() const override; }; class spell_grobbulus_mutating_injection : public SpellScriptLoader @@ -272,37 +95,14 @@ class spell_grobbulus_mutating_injection : public SpellScriptLoader { PrepareAuraScript(spell_grobbulus_mutating_injection_AuraScript); - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MUTATING_EXPLOSION }); - } + bool Validate(SpellInfo const* /*spellInfo*/) override; - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - switch (GetTargetApplication()->GetRemoveMode()) - { - case AURA_REMOVE_BY_ENEMY_SPELL: - case AURA_REMOVE_BY_EXPIRE: - if (auto caster = GetCaster()) - { - caster->CastSpell(GetTarget(), SPELL_MUTATING_EXPLOSION, true); - } - break; - default: - return; - } - } + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/); - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_grobbulus_mutating_injection_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } + void Register() override; }; - AuraScript* GetAuraScript() const override - { - return new spell_grobbulus_mutating_injection_AuraScript(); - } + AuraScript* GetAuraScript() const override; }; #endif \ No newline at end of file diff --git a/src/server/scripts/Northrend/Naxxramas/boss_heigan.h b/src/server/scripts/Northrend/Naxxramas/boss_heigan.h index 4758f4e6b..d74cf3527 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_heigan.h +++ b/src/server/scripts/Northrend/Naxxramas/boss_heigan.h @@ -1,5 +1,5 @@ -#ifndef BOSSHEIGAN_H_ -#define BOSSHEIGAN_H_ +#ifndef BOSS_HEIGAN_H_ +#define BOSS_HEIGAN_H_ #include "Player.h" #include "ScriptMgr.h"