diff options
| author | offl <11556157+offl@users.noreply.github.com> | 2025-05-17 14:03:45 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-17 13:03:45 +0200 |
| commit | 86f8a1e43f4b09ebd808d8b27ee8532839bf6f78 (patch) | |
| tree | 658ca07bdedf47252bd080578a4487412625d069 /src | |
| parent | f7f64edbbe03f0ee30c00e78cbef59222acfb066 (diff) | |
Scripts/TheArcatraz: Modernize scripts (#30945)
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp | 356 | ||||
| -rw-r--r-- | src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp | 36 |
2 files changed, 217 insertions, 175 deletions
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp index df75ec83c98..2dcad062e32 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp @@ -15,147 +15,155 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Harbinger_Skyriss -SD%Complete: 45 -SDComment: CombatAI not fully implemented. Timers will need adjustments. Need more docs on how event fully work. Reset all event and force start over if fail at one point? -SDCategory: Tempest Keep, The Arcatraz -EndScriptData */ - -/* ContentData -boss_harbinger_skyriss -boss_harbinger_skyriss_illusion -EndContentData */ +/* Need more docs on how event fully work. Reset all event and force start over if fail at one point? */ #include "ScriptMgr.h" +#include "SpellInfo.h" +#include "SpellScript.h" #include "arcatraz.h" #include "InstanceScript.h" #include "ObjectAccessor.h" #include "ScriptedCreature.h" -enum Says +enum SkyrissTexts { - SAY_INTRO = 0, - SAY_AGGRO = 1, - SAY_KILL = 2, - SAY_MIND = 3, - SAY_FEAR = 4, - SAY_IMAGE = 5, - SAY_DEATH = 6 + SAY_INTRO = 0, + SAY_AGGRO = 1, + SAY_KILL = 2, + SAY_MIND = 3, + SAY_FEAR = 4, + SAY_IMAGE = 5, + SAY_DEATH = 6 }; -enum Spells +enum SkyrissSpells { - SPELL_FEAR = 39415, - SPELL_MIND_REND = 36924, - H_SPELL_MIND_REND = 39017, - SPELL_DOMINATION = 37162, - H_SPELL_DOMINATION = 39019, - H_SPELL_MANA_BURN = 39020, - SPELL_66_ILLUSION = 36931, //entry 21466 - SPELL_33_ILLUSION = 36932, //entry 21467 - - SPELL_MIND_REND_IMAGE = 36929, - H_SPELL_MIND_REND_IMAGE = 39021 + // Intro + SPELL_SIMPLE_TELEPORT = 12980, + SPELL_MIND_REND_COSMETIC = 36859, + // Combat + SPELL_FEAR = 39415, + SPELL_MIND_REND = 36924, + SPELL_DOMINATION = 37162, + SPELL_DOMINATION_H = 39019, + SPELL_MANA_BURN = 39020, + + SPELL_SUMMON_66_ILLUSION = 36931, + SPELL_SUMMON_33_ILLUSION = 36932, + + SPELL_BIRTH = 26262, + SPELL_BLINK_VISUAL = 36937, + SPELL_66_HEALTH = 36928, + SPELL_33_HEALTH = 36930, + SPELL_MIND_REND_IMAGE = 36929, + SPELL_MIND_REND_IMAGE_H = 39021 }; +enum SkyrissEvents +{ + EVENT_MIND_REND = 1, + EVENT_FEAR, + EVENT_DOMINATION, + EVENT_MANA_BURN, + EVENT_SUMMON_66, + EVENT_SUMMON_33 +}; + +enum SkyrissMisc +{ + NPC_ILLUSION_66 = 21466, + NPC_ILLUSION_33 = 21467 +}; + +enum SkyrissPhases : uint8 +{ + PHASE_NONE = 0, + PHASE_HEALTH_66, + PHASE_HEALTH_33 +}; + +// 20912 - Harbinger Skyriss struct boss_harbinger_skyriss : public BossAI { - boss_harbinger_skyriss(Creature* creature) : BossAI(creature, DATA_HARBINGER_SKYRISS) - { - Initialize(); - Intro = false; - } + boss_harbinger_skyriss(Creature* creature) : BossAI(creature, DATA_HARBINGER_SKYRISS), _intro(false), _phase(PHASE_NONE) { } void Initialize() { - IsImage33 = false; - IsImage66 = false; - Intro_Phase = 1; Intro_Timer = 5000; - MindRend_Timer = 3000; - Fear_Timer = 15000; - Domination_Timer = 30000; - ManaBurn_Timer = 25000; } - bool Intro; - bool IsImage33; - bool IsImage66; - uint32 Intro_Phase; uint32 Intro_Timer; - uint32 MindRend_Timer; - uint32 Fear_Timer; - uint32 Domination_Timer; - uint32 ManaBurn_Timer; void Reset() override { + DoCastSelf(SPELL_SIMPLE_TELEPORT); _Reset(); - - me->SetImmuneToAll(!Intro); + _intro = false; + _phase = PHASE_NONE; + me->SetImmuneToAll(!_intro); Initialize(); } - void MoveInLineOfSight(Unit* who) override - { - if (!Intro) - return; - - ScriptedAI::MoveInLineOfSight(who); - } - - void JustEngagedWith(Unit* /*who*/) override { } - - void JustDied(Unit* /*killer*/) override + void JustEngagedWith(Unit* who) override { - Talk(SAY_DEATH); - _JustDied(); + BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_MIND_REND, 2s, 10s); + events.ScheduleEvent(EVENT_FEAR, 10s, 20s); + events.ScheduleEvent(EVENT_DOMINATION, 30s, 40s); + if (IsHeroic()) + events.ScheduleEvent(EVENT_MANA_BURN, 25s); } - void JustSummoned(Creature* summon) override + void OnSpellCast(SpellInfo const* spell) override { - if (!summon) - return; - if (IsImage66) - summon->SetHealth(summon->CountPctFromMaxHealth(33)); - else - summon->SetHealth(summon->CountPctFromMaxHealth(66)); - if (me->GetVictim()) - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - summon->AI()->AttackStart(target); - - summons.Summon(summon); - summon->SetImmuneToAll(false); + switch (spell->Id) + { + case SPELL_FEAR: + Talk(SAY_FEAR); + break; + case SPELL_DOMINATION: + case SPELL_DOMINATION_H: + Talk(SAY_MIND); + break; + default: + break; + } } void KilledUnit(Unit* victim) override { - //won't yell killing pet/other unit + // Won't yell killing pet/other unit if (victim->GetEntry() == NPC_ALPHA_POD_TARGET) return; Talk(SAY_KILL); } - void DoSplit(uint32 val) + void DamageTaken(Unit* /*killer*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override { - if (me->IsNonMeleeSpellCast(false)) - me->InterruptNonMeleeSpells(false); - - Talk(SAY_IMAGE); + if (_phase < PHASE_HEALTH_66 && me->HealthBelowPctDamaged(66, damage)) + { + _phase++; + events.ScheduleEvent(EVENT_SUMMON_66, 0s); + } + if (_phase < PHASE_HEALTH_33 && me->HealthBelowPctDamaged(33, damage)) + { + _phase++; + events.ScheduleEvent(EVENT_SUMMON_33, 0s); + } + } - if (val == 66) - DoCast(me, SPELL_66_ILLUSION); - else - DoCast(me, SPELL_33_ILLUSION); + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + _JustDied(); } void UpdateAI(uint32 diff) override { - if (!Intro) + if (!_intro) { if (Intro_Timer <= diff) { @@ -181,107 +189,145 @@ struct boss_harbinger_skyriss : public BossAI break; case 3: me->SetImmuneToAll(false); - Intro = true; + _intro = true; break; } } else Intro_Timer -=diff; } + if (!UpdateVictim()) return; - if (!IsImage66 && !HealthAbovePct(66)) - { - DoSplit(66); - IsImage66 = true; - } - if (!IsImage33 && !HealthAbovePct(33)) - { - DoSplit(33); - IsImage33 = true; - } - - if (MindRend_Timer <= diff) - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, SPELL_MIND_REND); - else - DoCastVictim(SPELL_MIND_REND); + events.Update(diff); - MindRend_Timer = 8000; - } - else - MindRend_Timer -=diff; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (Fear_Timer <= diff) + while (uint32 eventId = events.ExecuteEvent()) { - if (me->IsNonMeleeSpellCast(false)) - return; + switch (eventId) + { + case EVENT_MIND_REND: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_MIND_REND); + events.Repeat(8s, 12s); + break; + case EVENT_FEAR: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_FEAR); + events.Repeat(25s, 35s); + break; + case EVENT_DOMINATION: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_DOMINATION); + events.Repeat(30s, 40s); + break; + case EVENT_MANA_BURN: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_MANA_BURN); + events.Repeat(15s, 30s); + break; + case EVENT_SUMMON_66: + Talk(SAY_IMAGE); + DoCastSelf(SPELL_SUMMON_66_ILLUSION); + DoCastSelf(SPELL_BLINK_VISUAL); + break; + case EVENT_SUMMON_33: + Talk(SAY_IMAGE); + DoCastSelf(SPELL_SUMMON_33_ILLUSION); + DoCastSelf(SPELL_BLINK_VISUAL); + break; + default: + break; + } - Talk(SAY_FEAR); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, SPELL_FEAR); - else - DoCastVictim(SPELL_FEAR); + DoMeleeAttackIfReady(); + } - Fear_Timer = 25000; - } - else - Fear_Timer -=diff; +private: + bool _intro; + uint8 _phase; +}; - if (Domination_Timer <= diff) - { - if (me->IsNonMeleeSpellCast(false)) - return; +// 21466, 21467 - Harbinger Skyriss +struct boss_harbinger_skyriss_illusion : public ScriptedAI +{ + boss_harbinger_skyriss_illusion(Creature* creature) : ScriptedAI(creature) { } - Talk(SAY_MIND); + void Reset() override + { + _scheduler.CancelAll(); + me->SetCorpseDelay(0, true); + } - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, SPELL_DOMINATION); - else - DoCastVictim(SPELL_DOMINATION); + void JustAppeared() override + { + DoZoneInCombat(); + // Should be in this sniffed order but makes it ignore other spell casts, so disabled + // DoCastSelf(SPELL_BIRTH); + DoCastSelf(SPELL_BLINK_VISUAL); - Domination_Timer = 16000 + rand32() % 16000; + switch (me->GetEntry()) + { + case NPC_ILLUSION_66: + DoCastSelf(SPELL_66_HEALTH); + break; + case NPC_ILLUSION_33: + DoCastSelf(SPELL_33_HEALTH); + break; + default: + break; } - else - Domination_Timer -=diff; - if (IsHeroic()) + _scheduler.Schedule(2s, 10s, [this](TaskContext task) { - if (ManaBurn_Timer <= diff) - { - if (me->IsNonMeleeSpellCast(false)) - return; + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, IsHeroic() ? SPELL_MIND_REND_IMAGE_H : SPELL_MIND_REND_IMAGE); + task.Repeat(8s, 12s); + }); + } - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, H_SPELL_MANA_BURN); + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - ManaBurn_Timer = 16000 + rand32() % 16000; - } - else - ManaBurn_Timer -=diff; - } - DoMeleeAttackIfReady(); + _scheduler.Update(diff, [this] + { + DoMeleeAttackIfReady(); + }); } + +private: + TaskScheduler _scheduler; }; -struct boss_harbinger_skyriss_illusion : public ScriptedAI +// 36928 - 66% Health +// 36930 - 33% Health +class spell_harbinger_skyriss_health : public SpellScript { - boss_harbinger_skyriss_illusion(Creature* creature) : ScriptedAI(creature) { } + PrepareSpellScript(spell_harbinger_skyriss_health); - void Reset() override + void HandleScript(SpellEffIndex /*effIndex*/) { - me->SetImmuneToPC(false); - me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE | UNIT_FLAG_NON_ATTACKABLE); + GetCaster()->SetHealth(GetCaster()->CountPctFromMaxHealth(uint32(GetEffectValue()))); } - void JustEngagedWith(Unit* /*who*/) override { } + void Register() override + { + OnEffectHit += SpellEffectFn(spell_harbinger_skyriss_health::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; void AddSC_boss_harbinger_skyriss() { RegisterArcatrazCreatureAI(boss_harbinger_skyriss); RegisterArcatrazCreatureAI(boss_harbinger_skyriss_illusion); + RegisterSpellScript(spell_harbinger_skyriss_health); } diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp index 5693d7a32c5..bc6793779f2 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp @@ -19,7 +19,7 @@ #include "ScriptedCreature.h" #include "arcatraz.h" -enum Say +enum ZerekethTexts { SAY_AGGRO = 0, SAY_SLAY = 1, @@ -27,35 +27,25 @@ enum Say SAY_DEATH = 3 }; -enum Spells +enum ZerekethSpells { SPELL_VOID_ZONE = 36119, SPELL_SHADOW_NOVA = 36127, SPELL_SEED_OF_CORRUPTION = 36123 }; -enum Events +enum ZerekethEvents { EVENT_VOID_ZONE = 1, - EVENT_SHADOW_NOVA = 2, - EVENT_SEED_OF_CORRUPTION = 3 + EVENT_SHADOW_NOVA, + EVENT_SEED_OF_CORRUPTION }; +// 20870 - Zereketh the Unbound struct boss_zereketh_the_unbound : public BossAI { boss_zereketh_the_unbound(Creature* creature) : BossAI(creature, DATA_ZEREKETH) { } - void Reset() override - { - _Reset(); - } - - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - } - void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); @@ -70,6 +60,12 @@ struct boss_zereketh_the_unbound : public BossAI Talk(SAY_SLAY); } + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + } + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -87,17 +83,17 @@ struct boss_zereketh_the_unbound : public BossAI case EVENT_VOID_ZONE: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100, true)) DoCast(target, SPELL_VOID_ZONE); - events.ScheduleEvent(EVENT_VOID_ZONE, 6s, 10s); + events.Repeat(6s, 10s); break; case EVENT_SHADOW_NOVA: - DoCastVictim(SPELL_SHADOW_NOVA, true); + DoCastVictim(SPELL_SHADOW_NOVA); Talk(SAY_SHADOW_NOVA); - events.ScheduleEvent(EVENT_SHADOW_NOVA, 6s, 10s); + events.Repeat(6s, 10s); break; case EVENT_SEED_OF_CORRUPTION: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100, true)) DoCast(target, SPELL_SEED_OF_CORRUPTION); - events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, 12s, 20s); + events.Repeat(12s, 20s); break; default: break; |
