aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2025-05-17 14:03:45 +0300
committerGitHub <noreply@github.com>2025-05-17 13:03:45 +0200
commit86f8a1e43f4b09ebd808d8b27ee8532839bf6f78 (patch)
tree658ca07bdedf47252bd080578a4487412625d069 /src
parentf7f64edbbe03f0ee30c00e78cbef59222acfb066 (diff)
Scripts/TheArcatraz: Modernize scripts (#30945)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp356
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp36
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;