diff options
5 files changed, 455 insertions, 505 deletions
diff --git a/sql/updates/world/3.3.5/2025_06_10_04_world.sql b/sql/updates/world/3.3.5/2025_06_10_04_world.sql new file mode 100644 index 00000000000..22b10d634e4 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_06_10_04_world.sql @@ -0,0 +1,12 @@ +-- +DELETE FROM `creature_text` WHERE `CreatureID` IN (17377,17653); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(17377,0,0,"Who dares interrupt--What is this; what have you done? You'll ruin everything!",14,0,100,0,0,10164,15130,0,"kelidan SAY_WAKE"), +(17377,1,0,"Closer! Come closer... and burn!",14,0,100,0,0,10165,15132,0,"kelidan SAY_NOVA"), +(17377,2,0,"Just as you deserve!",14,0,100,0,0,10169,17670,0,"kelidan SAY_SLAY_1"), +(17377,2,1,"Your friends will soon be joining you!",14,0,100,0,0,10170,17671,0,"kelidan SAY_SLAY_2"), +(17377,3,0,"Good...luck. You'll need it.",14,0,100,0,0,10171,17672,0,"kelidan SAY_DEATH"), + +(17653,0,0,"You mustn't let him loose!",14,0,100,0,0,10166,17673,0,"Shadowmoon Channeler SAY_AGGRO_1"), +(17653,0,1,"Ignorant whelps!",14,0,100,0,0,10167,17674,0,"Shadowmoon Channeler SAY_AGGRO_2"), +(17653,0,2,"You fools! He'll kill us all!",14,0,100,0,0,10168,17675,0,"Shadowmoon Channeler SAY_AGGRO_3"); diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h index 5420e9b9681..de6d9e04db6 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h @@ -91,5 +91,6 @@ inline AI* GetBloodFurnaceAI(T* obj) } #define RegisterBloodFurnaceCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetBloodFurnaceAI) +#define RegisterBloodFurnaceGameObjectAI(ai_name) RegisterGameObjectAIWithFactory(ai_name, GetBloodFurnaceAI) #endif // BLOOD_FURNACE_H_ diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp index 57d19f73a37..068b70116b7 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp @@ -26,12 +26,12 @@ #include "SpellAuraEffects.h" #include "SpellScript.h" -enum Yells +enum BroggokTexts { - SAY_AGGRO = 0 + SAY_AGGRO = 0 }; -enum Spells +enum BroggokSpells { SPELL_SLIME_SPRAY = 30913, SPELL_POISON_CLOUD = 30916, @@ -46,107 +46,98 @@ enum Spells SPELL_CHARGE = 22120 }; -enum Events +enum BroggokEvents { - EVENT_SLIME_SPRAY = 1, + EVENT_SLIME_SPRAY = 1, EVENT_POISON_BOLT, EVENT_POISON_CLOUD, }; -class boss_broggok : public CreatureScript +// 17380 - Broggok +struct boss_broggok : public BossAI { - public: - boss_broggok() : CreatureScript("boss_broggok") { } + boss_broggok(Creature* creature) : BossAI(creature, DATA_BROGGOK) { } - struct boss_broggokAI : public BossAI - { - boss_broggokAI(Creature* creature) : BossAI(creature, DATA_BROGGOK) { } - - void Reset() override - { - _Reset(); - DoAction(ACTION_RESET_BROGGOK); - } - - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - Talk(SAY_AGGRO); - } - - void JustSummoned(Creature* summoned) override - { - if (summoned->GetEntry() == NPC_BROGGOK_POISON_CLOUD) - { - summoned->SetReactState(REACT_PASSIVE); - summoned->CastSpell(summoned, SPELL_POISON_CLOUD_PASSIVE, true); - summons.Summon(summoned); - } - else if (summoned->GetEntry() == NPC_INCOMBAT_TRIGGER) - { - summoned->SetReactState(REACT_PASSIVE); - DoZoneInCombat(summoned); - summons.Summon(summoned); - } - } + void Reset() override + { + _Reset(); + DoAction(ACTION_RESET_BROGGOK); + } - void ExecuteEvent(uint32 eventId) override - { - switch (eventId) - { - case EVENT_SLIME_SPRAY: - DoCastVictim(SPELL_SLIME_SPRAY); - events.ScheduleEvent(EVENT_SLIME_SPRAY, 4s, 12s); - break; - case EVENT_POISON_BOLT: - DoCastVictim(SPELL_POISON_BOLT); - events.ScheduleEvent(EVENT_POISON_BOLT, 4s, 12s); - break; - case EVENT_POISON_CLOUD: - DoCast(me, SPELL_POISON_CLOUD); - events.ScheduleEvent(EVENT_POISON_CLOUD, 20s); - break; - default: - break; - } - } + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_SLIME_SPRAY, 10s); + events.ScheduleEvent(EVENT_POISON_BOLT, 7s); + events.ScheduleEvent(EVENT_POISON_CLOUD, 5s); + } - void DoAction(int32 action) override - { - switch (action) + void JustSummoned(Creature* summoned) override + { + if (summoned->GetEntry() == NPC_BROGGOK_POISON_CLOUD) + { + summoned->SetReactState(REACT_PASSIVE); + summoned->CastSpell(summoned, SPELL_POISON_CLOUD_PASSIVE, true); + summons.Summon(summoned); + } + else if (summoned->GetEntry() == NPC_INCOMBAT_TRIGGER) + { + summoned->SetReactState(REACT_PASSIVE); + DoZoneInCombat(summoned); + summons.Summon(summoned); + } + } + + void DoAction(int32 action) override + { + switch (action) + { + case ACTION_PREPARE_BROGGOK: + DoCastSelf(SPELL_SUMMON_INCOMBAT_TRIGGER); + break; + case ACTION_ACTIVATE_BROGGOK: + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE); + DoZoneInCombat(); + break; + case ACTION_RESET_BROGGOK: + me->SetReactState(REACT_PASSIVE); + me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE); + summons.DespawnAll(); + instance->SetBossState(DATA_BROGGOK, NOT_STARTED); + if (GameObject * lever = instance->GetGameObject(DATA_BROGGOK_LEVER)) { - case ACTION_PREPARE_BROGGOK: - DoCastSelf(SPELL_SUMMON_INCOMBAT_TRIGGER); - break; - case ACTION_ACTIVATE_BROGGOK: - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE); - DoZoneInCombat(); - events.ScheduleEvent(EVENT_SLIME_SPRAY, 10s); - events.ScheduleEvent(EVENT_POISON_BOLT, 7s); - events.ScheduleEvent(EVENT_POISON_CLOUD, 5s); - break; - case ACTION_RESET_BROGGOK: - me->SetReactState(REACT_PASSIVE); - me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE); - summons.DespawnAll(); - instance->SetBossState(DATA_BROGGOK, NOT_STARTED); - if (GameObject * lever = instance->GetGameObject(DATA_BROGGOK_LEVER)) - { - lever->RemoveFlag(GO_FLAG_NOT_SELECTABLE | GO_FLAG_IN_USE); - lever->SetGoState(GO_STATE_READY); - } - break; - default: - break; + lever->RemoveFlag(GO_FLAG_NOT_SELECTABLE | GO_FLAG_IN_USE); + lever->SetGoState(GO_STATE_READY); } - } - }; + break; + default: + break; + } + } - CreatureAI* GetAI(Creature* creature) const override + void ExecuteEvent(uint32 eventId) override + { + switch (eventId) { - return GetBloodFurnaceAI<boss_broggokAI>(creature); + case EVENT_SLIME_SPRAY: + DoCastVictim(SPELL_SLIME_SPRAY); + events.Repeat(4s, 12s); + break; + case EVENT_POISON_BOLT: + DoCastVictim(SPELL_POISON_BOLT); + events.Repeat(4s, 12s); + break; + case EVENT_POISON_CLOUD: + DoCastSelf(SPELL_POISON_CLOUD); + events.Repeat(20s); + break; + default: + break; } + } }; static Emote const PrisionersEmotes[] = @@ -204,6 +195,7 @@ protected: TaskScheduler scheduler; }; +// 17398 - Nascent Fel Orc struct npc_nascent_fel_orc : public BroggokPrisionersAI { npc_nascent_fel_orc(Creature* creature) : BroggokPrisionersAI(creature) { } @@ -223,6 +215,7 @@ struct npc_nascent_fel_orc : public BroggokPrisionersAI }; +// 17429 - Fel Orc Neophyte struct npc_fel_orc_neophyte : public BroggokPrisionersAI { npc_fel_orc_neophyte(Creature* creature) : BroggokPrisionersAI(creature) { } @@ -242,82 +235,61 @@ struct npc_fel_orc_neophyte : public BroggokPrisionersAI }; -class go_broggok_lever : public GameObjectScript +// 181982 - Cell Door Lever +struct go_broggok_lever : public GameObjectAI { - public: - go_broggok_lever() : GameObjectScript("go_broggok_lever") { } + go_broggok_lever(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - struct go_broggok_leverAI : public GameObjectAI - { - go_broggok_leverAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - - InstanceScript* instance; - - bool OnGossipHello(Player* /*player*/) override - { - if (instance->GetBossState(DATA_BROGGOK) != DONE && instance->GetBossState(DATA_BROGGOK) != IN_PROGRESS) - { - instance->SetBossState(DATA_BROGGOK, IN_PROGRESS); - if (Creature* broggok = instance->GetCreature(DATA_BROGGOK)) - broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK); - } - - me->SetFlag(GO_FLAG_NOT_SELECTABLE | GO_FLAG_IN_USE); - me->SetGoState(GO_STATE_ACTIVE); - - return true; - } - }; + InstanceScript* instance; - GameObjectAI* GetAI(GameObject* go) const override + bool OnGossipHello(Player* /*player*/) override + { + if (instance->GetBossState(DATA_BROGGOK) != DONE && instance->GetBossState(DATA_BROGGOK) != IN_PROGRESS) { - return GetBloodFurnaceAI<go_broggok_leverAI>(go); + instance->SetBossState(DATA_BROGGOK, IN_PROGRESS); + if (Creature* broggok = instance->GetCreature(DATA_BROGGOK)) + broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK); } + + me->SetFlag(GO_FLAG_NOT_SELECTABLE | GO_FLAG_IN_USE); + me->SetGoState(GO_STATE_ACTIVE); + + return true; + } }; // 30914, 38462 - Poison -class spell_broggok_poison_cloud : public SpellScriptLoader +class spell_broggok_poison_cloud : public AuraScript { - public: - spell_broggok_poison_cloud() : SpellScriptLoader("spell_broggok_poison_cloud") { } + PrepareAuraScript(spell_broggok_poison_cloud); - class spell_broggok_poison_cloud_AuraScript : public AuraScript - { - PrepareAuraScript(spell_broggok_poison_cloud_AuraScript); - - bool Validate(SpellInfo const* spellInfo) override - { - return ValidateSpellInfo({ spellInfo->GetEffect(EFFECT_0).TriggerSpell }); - } - - void PeriodicTick(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (!aurEff->GetTotalTicks()) - return; - - uint32 triggerSpell = aurEff->GetSpellEffectInfo().TriggerSpell; - int32 mod = int32(((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 10000 * 2 / 3); - GetTarget()->CastSpell(nullptr, triggerSpell, CastSpellExtraArgs(aurEff).AddSpellMod(SPELLVALUE_RADIUS_MOD, mod)); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_broggok_poison_cloud_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_broggok_poison_cloud_AuraScript(); - } + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo({ spellInfo->GetEffect(EFFECT_0).TriggerSpell }); + } + + void PeriodicTick(AuraEffect const* aurEff) + { + PreventDefaultAction(); + if (!aurEff->GetTotalTicks()) + return; + + uint32 triggerSpell = aurEff->GetSpellEffectInfo().TriggerSpell; + int32 mod = int32(((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 10000 * 2 / 3); + GetTarget()->CastSpell(nullptr, triggerSpell, CastSpellExtraArgs(aurEff).AddSpellMod(SPELLVALUE_RADIUS_MOD, mod)); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_broggok_poison_cloud::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } }; void AddSC_boss_broggok() { - new boss_broggok(); + RegisterBloodFurnaceCreatureAI(boss_broggok); RegisterBloodFurnaceCreatureAI(npc_nascent_fel_orc); RegisterBloodFurnaceCreatureAI(npc_fel_orc_neophyte); - new go_broggok_lever(); - new spell_broggok_poison_cloud(); + RegisterBloodFurnaceGameObjectAI(go_broggok_lever); + RegisterSpellScript(spell_broggok_poison_cloud); } diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp index b29fb0598ca..1a0bb7a8ba4 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp @@ -15,6 +15,8 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ +/* Find a more elegant way to handle channelers */ + #include "ScriptMgr.h" #include "blood_furnace.h" #include "ObjectAccessor.h" @@ -22,354 +24,327 @@ #include "SpellAuras.h" #include "TemporarySummon.h" -enum Kelidan +enum KelidanTexts { SAY_WAKE = 0, - SAY_ADD_AGGRO = 1, - SAY_KILL = 2, - SAY_NOVA = 3, - SAY_DIE = 4, + SAY_NOVA = 1, + SAY_SLAY = 2, + SAY_DEATH = 3, + + SAY_AGGRO = 0 +}; +enum KelidanSpells +{ SPELL_CORRUPTION = 30938, SPELL_EVOCATION = 30935, SPELL_FIRE_NOVA = 33132, - H_SPELL_FIRE_NOVA = 37371, + SPELL_FIRE_NOVA_H = 37371, SPELL_SHADOW_BOLT_VOLLEY = 28599, - H_SPELL_SHADOW_BOLT_VOLLEY = 40070, + SPELL_SHADOW_BOLT_VOLLEY_H = 40070, SPELL_BURNING_NOVA = 30940, SPELL_VORTEX = 37370, - ENTRY_KELIDAN = 17377, - ENTRY_CHANNELER = 17653, + // Shadowmoon Channeler + SPELL_SHADOW_BOLT = 12739, + SPELL_SHADOW_BOLT_H = 15472, - ACTION_ACTIVATE_ADDS = 92 + SPELL_MARK_OF_SHADOW = 30937, + SPELL_CHANNELING = 39123 }; -const float ShadowmoonChannelers[5][4]= +enum KelidanMisc { - {302.0f, -87.0f, -24.4f, 0.157f}, - {321.0f, -63.5f, -24.6f, 4.887f}, - {346.0f, -74.5f, -24.6f, 3.595f}, - {344.0f, -103.5f, -24.5f, 2.356f}, - {316.0f, -109.0f, -24.6f, 1.257f} + NPC_KELIDAN = 17377, + NPC_CHANNELER = 17653 }; -class boss_kelidan_the_breaker : public CreatureScript +Position const ShadowmoonChannelers[5] = { - public: - boss_kelidan_the_breaker() : CreatureScript("boss_kelidan_the_breaker") { } + { 301.988f, -86.7465f, -24.4517f, 0.15708f }, + { 320.750f, -63.6121f, -24.6361f, 4.88692f }, + { 345.848f, -74.4559f, -24.6402f, 3.59538f }, + { 343.584f, -103.631f, -24.5688f, 2.35619f }, + { 316.274f, -108.877f, -24.6027f, 1.25664f } +}; - struct boss_kelidan_the_breakerAI : public BossAI +// 17377 - Keli'dan the Breaker +struct boss_kelidan_the_breaker : public BossAI +{ + boss_kelidan_the_breaker(Creature* creature) : BossAI(creature, DATA_KELIDAN_THE_BREAKER) + { + Initialize(); + Firenova_Timer = 0; + } + + void Initialize() + { + ShadowVolley_Timer = 1000; + BurningNova_Timer = 15000; + Corruption_Timer = 5000; + check_Timer = 0; + Firenova = false; + } + + uint32 ShadowVolley_Timer; + uint32 BurningNova_Timer; + uint32 Firenova_Timer; + uint32 Corruption_Timer; + uint32 check_Timer; + bool Firenova; + ObjectGuid Channelers[5]; + + void Reset() override + { + _Reset(); + Initialize(); + SummonChannelers(); + me->SetImmuneToNPC(true); + me->SetReactState(REACT_PASSIVE); + me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + Talk(SAY_WAKE); + if (me->IsNonMeleeSpellCast(false)) + me->InterruptNonMeleeSpells(true); + DoStartMovement(who); + } + + void KilledUnit(Unit* /*victim*/) override + { + if (rand32() % 2) + return; + + Talk(SAY_SLAY); + } + + void ChannelerEngaged(Unit* who) + { + for (uint8 i = 0; i<5; ++i) { - boss_kelidan_the_breakerAI(Creature* creature) : BossAI(creature, DATA_KELIDAN_THE_BREAKER) - { - Initialize(); - Firenova_Timer = 0; - } - - void Initialize() - { - ShadowVolley_Timer = 1000; - BurningNova_Timer = 15000; - Corruption_Timer = 5000; - check_Timer = 0; - Firenova = false; - addYell = false; - } - - uint32 ShadowVolley_Timer; - uint32 BurningNova_Timer; - uint32 Firenova_Timer; - uint32 Corruption_Timer; - uint32 check_Timer; - bool Firenova; - bool addYell; - ObjectGuid Channelers[5]; - - void Reset() override - { - _Reset(); - Initialize(); - SummonChannelers(); - me->SetReactState(REACT_PASSIVE); - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->SetImmuneToAll(true); - } - - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - Talk(SAY_WAKE); - if (me->IsNonMeleeSpellCast(false)) - me->InterruptNonMeleeSpells(true); - DoStartMovement(who); - } - - void KilledUnit(Unit* /*victim*/) override - { - if (rand32() % 2) - return; - - Talk(SAY_KILL); - } - - void ChannelerEngaged(Unit* who) - { - if (who && !addYell) - { - addYell = true; - Talk(SAY_ADD_AGGRO); - } - for (uint8 i = 0; i<5; ++i) - { - Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]); - if (who && channeler && !channeler->IsInCombat()) - channeler->AI()->AttackStart(who); - } - } + Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]); + if (who && channeler && !channeler->IsInCombat()) + channeler->AI()->AttackStart(who); + } + } - void ChannelerDied(Unit* killer) - { - for (uint8 i = 0; i < 5; ++i) - { - Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]); - if (channeler && channeler->IsAlive()) - return; - } - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->SetImmuneToAll(false); - if (killer) - AttackStart(killer); - } + void ChannelerDied(Unit* killer) + { + for (uint8 i = 0; i < 5; ++i) + { + Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]); + if (channeler && channeler->IsAlive()) + return; + } + me->SetReactState(REACT_AGGRESSIVE); + me->SetImmuneToNPC(false); + me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + if (killer) + AttackStart(killer); + } + + ObjectGuid GetChanneled(Creature* channeler1) + { + SummonChannelers(); + if (!channeler1) + return ObjectGuid::Empty; + + uint8 i; + for (i = 0; i < 5; ++i) + { + Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]); + if (channeler && channeler->GetGUID() == channeler1->GetGUID()) + break; + } + return Channelers[(i + 2) % 5]; + } - ObjectGuid GetChanneled(Creature* channeler1) - { - SummonChannelers(); - if (!channeler1) - return ObjectGuid::Empty; + void SummonChannelers() + { + for (uint8 i = 0; i < 5; ++i) + { + Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]); + if (!channeler || channeler->isDead()) + channeler = me->SummonCreature(NPC_CHANNELER, ShadowmoonChannelers[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5min); + if (channeler) + Channelers[i] = channeler->GetGUID(); + else + Channelers[i].Clear(); + } + } - uint8 i; - for (i = 0; i < 5; ++i) - { - Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]); - if (channeler && channeler->GetGUID() == channeler1->GetGUID()) - break; - } - return Channelers[(i + 2) % 5]; - } + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + } - void SummonChannelers() + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + { + if (check_Timer <= diff) { - for (uint8 i = 0; i < 5; ++i) - { - Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]); - if (!channeler || channeler->isDead()) - channeler = me->SummonCreature(ENTRY_CHANNELER, ShadowmoonChannelers[i][0], ShadowmoonChannelers[i][1], ShadowmoonChannelers[i][2], ShadowmoonChannelers[i][3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5min); - if (channeler) - Channelers[i] = channeler->GetGUID(); - else - Channelers[i].Clear(); - } + if (!me->IsNonMeleeSpellCast(false)) + DoCast(me, SPELL_EVOCATION); + check_Timer = 5000; } + else + check_Timer -= diff; + return; + } - void JustDied(Unit* /*killer*/) override + if (Firenova) + { + if (Firenova_Timer <= diff) { - _JustDied(); - Talk(SAY_DIE); + DoCast(me, SPELL_FIRE_NOVA, true); + Firenova = false; + ShadowVolley_Timer = 2000; } + else + Firenova_Timer -=diff; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - { - if (check_Timer <= diff) - { - if (!me->IsNonMeleeSpellCast(false)) - DoCast(me, SPELL_EVOCATION); - check_Timer = 5000; - } - else - check_Timer -= diff; - return; - } - - if (Firenova) - { - if (Firenova_Timer <= diff) - { - DoCast(me, SPELL_FIRE_NOVA, true); - Firenova = false; - ShadowVolley_Timer = 2000; - } - else - Firenova_Timer -=diff; - - return; - } - - if (ShadowVolley_Timer <= diff) - { - DoCast(me, SPELL_SHADOW_BOLT_VOLLEY); - ShadowVolley_Timer = 5000 + rand32() % 8000; - } - else - ShadowVolley_Timer -=diff; - - if (Corruption_Timer <= diff) - { - DoCast(me, SPELL_CORRUPTION); - Corruption_Timer = 30000 + rand32() % 20000; - } - else - Corruption_Timer -=diff; + return; + } - if (BurningNova_Timer <= diff) - { - if (me->IsNonMeleeSpellCast(false)) - me->InterruptNonMeleeSpells(true); + if (ShadowVolley_Timer <= diff) + { + DoCast(me, SPELL_SHADOW_BOLT_VOLLEY); + ShadowVolley_Timer = 5000 + rand32() % 8000; + } + else + ShadowVolley_Timer -=diff; - Talk(SAY_NOVA); + if (Corruption_Timer <= diff) + { + DoCast(me, SPELL_CORRUPTION); + Corruption_Timer = 30000 + rand32() % 20000; + } + else + Corruption_Timer -=diff; - me->AddAura(SPELL_BURNING_NOVA, me); + if (BurningNova_Timer <= diff) + { + if (me->IsNonMeleeSpellCast(false)) + me->InterruptNonMeleeSpells(true); - if (IsHeroic()) - DoTeleportAll(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); + Talk(SAY_NOVA); - BurningNova_Timer = 20000 + rand32() % 8000; - Firenova_Timer= 5000; - Firenova = true; - } - else - BurningNova_Timer -=diff; + me->AddAura(SPELL_BURNING_NOVA, me); - DoMeleeAttackIfReady(); - } - }; + if (IsHeroic()) + DoTeleportAll(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); - CreatureAI* GetAI(Creature* creature) const override - { - return GetBloodFurnaceAI<boss_kelidan_the_breakerAI>(creature); + BurningNova_Timer = 20000 + rand32() % 8000; + Firenova_Timer= 5000; + Firenova = true; } -}; - -/*###### -## npc_shadowmoon_channeler -######*/ - -enum Shadowmoon -{ - SPELL_SHADOW_BOLT = 12739, - H_SPELL_SHADOW_BOLT = 15472, + else + BurningNova_Timer -=diff; - SPELL_MARK_OF_SHADOW = 30937, - SPELL_CHANNELING = 39123 + DoMeleeAttackIfReady(); + } }; -class npc_shadowmoon_channeler : public CreatureScript +// 17653 - Shadowmoon Channeler +struct npc_shadowmoon_channeler : public ScriptedAI { - public: - - npc_shadowmoon_channeler() : CreatureScript("npc_shadowmoon_channeler") { } - - struct npc_shadowmoon_channelerAI : public ScriptedAI + npc_shadowmoon_channeler(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } + + void Initialize() + { + ShadowBolt_Timer = 1000 + rand32() % 1000; + MarkOfShadow_Timer = 5000 + rand32() % 2000; + check_Timer = 0; + } + + uint32 ShadowBolt_Timer; + uint32 MarkOfShadow_Timer; + uint32 check_Timer; + + void Reset() override + { + Initialize(); + if (me->IsNonMeleeSpellCast(false)) + me->InterruptNonMeleeSpells(true); + } + + void JustEngagedWith(Unit* who) override + { + Talk(SAY_AGGRO); + + if (Creature* Kelidan = me->FindNearestCreature(NPC_KELIDAN, 100)) + ENSURE_AI(boss_kelidan_the_breaker, Kelidan->AI())->ChannelerEngaged(who); + if (me->IsNonMeleeSpellCast(false)) + me->InterruptNonMeleeSpells(true); + DoStartMovement(who); + } + + void JustDied(Unit* killer) override + { + if (!killer) + return; + + if (Creature* Kelidan = me->FindNearestCreature(NPC_KELIDAN, 100)) + ENSURE_AI(boss_kelidan_the_breaker, Kelidan->AI())->ChannelerDied(killer); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) { - npc_shadowmoon_channelerAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } - - void Initialize() - { - ShadowBolt_Timer = 1000 + rand32() % 1000; - MarkOfShadow_Timer = 5000 + rand32() % 2000; - check_Timer = 0; - } - - uint32 ShadowBolt_Timer; - uint32 MarkOfShadow_Timer; - uint32 check_Timer; - - void Reset() override - { - Initialize(); - if (me->IsNonMeleeSpellCast(false)) - me->InterruptNonMeleeSpells(true); - } - - void JustEngagedWith(Unit* who) override - { - if (Creature* Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100)) - ENSURE_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerEngaged(who); - if (me->IsNonMeleeSpellCast(false)) - me->InterruptNonMeleeSpells(true); - DoStartMovement(who); - } - - void JustDied(Unit* killer) override - { - if (!killer) - return; - - if (Creature* Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100)) - ENSURE_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerDied(killer); - } - - void UpdateAI(uint32 diff) override + if (check_Timer <= diff) { - if (!UpdateVictim()) + if (!me->IsNonMeleeSpellCast(false)) { - if (check_Timer <= diff) + if (Creature* Kelidan = me->FindNearestCreature(NPC_KELIDAN, 100)) { - if (!me->IsNonMeleeSpellCast(false)) - { - if (Creature* Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100)) - { - ObjectGuid channeler = ENSURE_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->GetChanneled(me); - if (Unit* channeled = ObjectAccessor::GetUnit(*me, channeler)) - DoCast(channeled, SPELL_CHANNELING); - } - } - check_Timer = 5000; + ObjectGuid channeler = ENSURE_AI(boss_kelidan_the_breaker, Kelidan->AI())->GetChanneled(me); + if (Unit* channeled = ObjectAccessor::GetUnit(*me, channeler)) + DoCast(channeled, SPELL_CHANNELING); } - else - check_Timer -= diff; - - return; } + check_Timer = 5000; + } + else + check_Timer -= diff; - if (MarkOfShadow_Timer <= diff) - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - DoCast(target, SPELL_MARK_OF_SHADOW); - MarkOfShadow_Timer = 15000 + rand32() % 5000; - } - else - MarkOfShadow_Timer -=diff; - - if (ShadowBolt_Timer <= diff) - { - DoCastVictim(SPELL_SHADOW_BOLT); - ShadowBolt_Timer = 5000 + rand32() % 1000; - } - else - ShadowBolt_Timer -=diff; + return; + } - DoMeleeAttackIfReady(); - } - }; + if (MarkOfShadow_Timer <= diff) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_MARK_OF_SHADOW); + MarkOfShadow_Timer = 15000 + rand32() % 5000; + } + else + MarkOfShadow_Timer -=diff; - CreatureAI* GetAI(Creature* creature) const override + if (ShadowBolt_Timer <= diff) { - return GetBloodFurnaceAI<npc_shadowmoon_channelerAI>(creature); + DoCastVictim(SPELL_SHADOW_BOLT); + ShadowBolt_Timer = 5000 + rand32() % 1000; } + else + ShadowBolt_Timer -=diff; + + DoMeleeAttackIfReady(); + } }; void AddSC_boss_kelidan_the_breaker() { - new boss_kelidan_the_breaker(); - new npc_shadowmoon_channeler(); + RegisterBloodFurnaceCreatureAI(boss_kelidan_the_breaker); + RegisterBloodFurnaceCreatureAI(npc_shadowmoon_channeler); } 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 d310c4ccf7c..8a1106ed2b7 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp @@ -19,14 +19,14 @@ #include "ScriptedCreature.h" #include "blood_furnace.h" -enum Yells +enum MakerTexts { SAY_AGGRO = 0, - SAY_KILL = 1, - SAY_DIE = 2 + SAY_SLAY = 1, + SAY_DEATH = 2 }; -enum Spells +enum MakerSpells { SPELL_ACID_SPRAY = 38153, SPELL_EXPLODING_BREAKER = 30925, @@ -34,7 +34,7 @@ enum Spells SPELL_DOMINATION = 25772 }; -enum Events +enum MakerEvents { EVENT_ACID_SPRAY = 1, EVENT_EXPLODING_BREAKER, @@ -42,73 +42,63 @@ enum Events EVENT_KNOCKDOWN }; -class boss_the_maker : public CreatureScript +// 17381 - The Maker +struct boss_the_maker : public BossAI { - public: - boss_the_maker() : CreatureScript("boss_the_maker") { } + boss_the_maker(Creature* creature) : BossAI(creature, DATA_THE_MAKER) { } - struct boss_the_makerAI : public BossAI - { - boss_the_makerAI(Creature* creature) : BossAI(creature, DATA_THE_MAKER) { } - - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_ACID_SPRAY, 15s); - events.ScheduleEvent(EVENT_EXPLODING_BREAKER, 6s); - events.ScheduleEvent(EVENT_DOMINATION, 120s); - events.ScheduleEvent(EVENT_KNOCKDOWN, 10s); - } + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + Talk(SAY_AGGRO); - void KilledUnit(Unit* who) override - { - if (who->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } + events.ScheduleEvent(EVENT_ACID_SPRAY, 15s); + events.ScheduleEvent(EVENT_EXPLODING_BREAKER, 6s); + events.ScheduleEvent(EVENT_DOMINATION, 120s); + events.ScheduleEvent(EVENT_KNOCKDOWN, 10s); + } - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DIE); - } + void KilledUnit(Unit* who) override + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } - void ExecuteEvent(uint32 eventId) override - { - switch (eventId) - { - case EVENT_ACID_SPRAY: - DoCastVictim(SPELL_ACID_SPRAY); - events.ScheduleEvent(EVENT_ACID_SPRAY, 15s, 23s); - break; - case EVENT_EXPLODING_BREAKER: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true)) - DoCast(target, SPELL_EXPLODING_BREAKER); - events.ScheduleEvent(EVENT_EXPLODING_BREAKER, 4s, 12s); - break; - case EVENT_DOMINATION: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true)) - DoCast(target, SPELL_DOMINATION); - events.ScheduleEvent(EVENT_DOMINATION, 120s); - break; - case EVENT_KNOCKDOWN: - DoCastVictim(SPELL_KNOCKDOWN); - events.ScheduleEvent(EVENT_KNOCKDOWN, 4s, 12s); - break; - default: - break; - } - } - }; + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + } - CreatureAI* GetAI(Creature* creature) const override + void ExecuteEvent(uint32 eventId) override + { + switch (eventId) { - return GetBloodFurnaceAI<boss_the_makerAI>(creature); + case EVENT_ACID_SPRAY: + DoCastVictim(SPELL_ACID_SPRAY); + events.Repeat(15s, 23s); + break; + case EVENT_EXPLODING_BREAKER: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true)) + DoCast(target, SPELL_EXPLODING_BREAKER); + events.Repeat(4s, 12s); + break; + case EVENT_DOMINATION: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true)) + DoCast(target, SPELL_DOMINATION); + events.Repeat(120s); + break; + case EVENT_KNOCKDOWN: + DoCastVictim(SPELL_KNOCKDOWN); + events.Repeat(4s, 12s); + break; + default: + break; } + } }; void AddSC_boss_the_maker() { - new boss_the_maker(); + RegisterBloodFurnaceCreatureAI(boss_the_maker); } |