aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2021-04-16 20:14:29 +0300
committerGitHub <noreply@github.com>2021-04-16 20:14:29 +0300
commit19606ea1e7daadde9aa5ee7169565d5ec727b7e7 (patch)
treec1dcaba43f520d691eb85787cdba6d8a5be2494c /src
parent7bd3a36d52277a9d438538b50b97a6dcf6d25020 (diff)
Scripts/HoS: Update Krystallus to new model (#26421)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp243
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h2
2 files changed, 107 insertions, 138 deletions
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp
index 2d45f54ca74..d948491732e 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp
@@ -49,167 +49,134 @@ enum Events
EVENT_SHATTER
};
-class boss_krystallus : public CreatureScript
+struct boss_krystallus : public BossAI
{
- public:
- boss_krystallus() : CreatureScript("boss_krystallus") { }
+ boss_krystallus(Creature* creature) : BossAI(creature, DATA_KRYSTALLUS) { }
- struct boss_krystallusAI : public BossAI
- {
- boss_krystallusAI(Creature* creature) : BossAI(creature, DATA_KRYSTALLUS) { }
+ void Reset() override
+ {
+ _Reset();
+ }
- void Reset() override
- {
- _Reset();
- }
+ void JustEngagedWith(Unit* who) override
+ {
+ Talk(SAY_AGGRO);
+ BossAI::JustEngagedWith(who);
- void JustEngagedWith(Unit* who) override
- {
- Talk(SAY_AGGRO);
- BossAI::JustEngagedWith(who);
-
- events.ScheduleEvent(EVENT_BOULDER_TOSS, 3s, 9s);
- events.ScheduleEvent(EVENT_GROUND_SLAM, 15s, 18s);
- events.ScheduleEvent(EVENT_STOMP, 20s, 29s);
- if (IsHeroic())
- events.ScheduleEvent(EVENT_GROUND_SPIKE, 9s, 14s);
- }
+ events.ScheduleEvent(EVENT_BOULDER_TOSS, 3s, 9s);
+ events.ScheduleEvent(EVENT_GROUND_SLAM, 15s, 18s);
+ events.ScheduleEvent(EVENT_STOMP, 20s, 29s);
+ if (IsHeroic())
+ events.ScheduleEvent(EVENT_GROUND_SPIKE, 9s, 14s);
+ }
- void UpdateAI(uint32 diff) override
- {
- // Return since we have no target
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_BOULDER_TOSS:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true))
- DoCast(target, SPELL_BOULDER_TOSS);
- events.ScheduleEvent(EVENT_BOULDER_TOSS, 9s, 15s);
- break;
- case EVENT_GROUND_SPIKE:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
- DoCast(target, SPELL_GROUND_SPIKE);
- events.ScheduleEvent(EVENT_GROUND_SPIKE, 12s, 17s);
- break;
- case EVENT_GROUND_SLAM:
- DoCast(me, SPELL_GROUND_SLAM);
- events.ScheduleEvent(EVENT_SHATTER, 10s);
- events.ScheduleEvent(EVENT_GROUND_SLAM, 15s, 18s);
- break;
- case EVENT_STOMP:
- DoCast(me, SPELL_STOMP);
- events.ScheduleEvent(EVENT_STOMP, 20s, 29s);
- break;
- case EVENT_SHATTER:
- DoCast(me, SPELL_SHATTER);
- break;
- default:
- break;
- }
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- }
-
- DoMeleeAttackIfReady();
- }
+ void UpdateAI(uint32 diff) override
+ {
+ // Return since we have no target
+ if (!UpdateVictim())
+ return;
- void JustDied(Unit* /*killer*/) override
- {
- Talk(SAY_DEATH);
- _JustDied();
- }
+ events.Update(diff);
- void KilledUnit(Unit* victim) override
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- if (victim->GetTypeId() == TYPEID_PLAYER)
- Talk(SAY_KILL);
+ case EVENT_BOULDER_TOSS:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true))
+ DoCast(target, SPELL_BOULDER_TOSS);
+ events.ScheduleEvent(EVENT_BOULDER_TOSS, 9s, 15s);
+ break;
+ case EVENT_GROUND_SPIKE:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
+ DoCast(target, SPELL_GROUND_SPIKE);
+ events.ScheduleEvent(EVENT_GROUND_SPIKE, 12s, 17s);
+ break;
+ case EVENT_GROUND_SLAM:
+ DoCast(me, SPELL_GROUND_SLAM);
+ events.ScheduleEvent(EVENT_SHATTER, 10s);
+ events.ScheduleEvent(EVENT_GROUND_SLAM, 15s, 18s);
+ break;
+ case EVENT_STOMP:
+ DoCast(me, SPELL_STOMP);
+ events.ScheduleEvent(EVENT_STOMP, 20s, 29s);
+ break;
+ case EVENT_SHATTER:
+ DoCast(me, SPELL_SHATTER);
+ break;
+ default:
+ break;
}
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetHallsOfStoneAI<boss_krystallusAI>(creature);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
-};
-class spell_krystallus_shatter : public SpellScriptLoader
-{
- public:
- spell_krystallus_shatter() : SpellScriptLoader("spell_krystallus_shatter") { }
+ DoMeleeAttackIfReady();
+ }
- class spell_krystallus_shatter_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_krystallus_shatter_SpellScript);
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- if (Unit* target = GetHitUnit())
- {
- target->RemoveAurasDueToSpell(SPELL_STONED);
- target->CastSpell(nullptr, SPELL_SHATTER_EFFECT, true);
- }
- }
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEATH);
+ _JustDied();
+ }
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_krystallus_shatter_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_krystallus_shatter_SpellScript();
- }
+ void KilledUnit(Unit* victim) override
+ {
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_KILL);
+ }
};
-class spell_krystallus_shatter_effect : public SpellScriptLoader
+class spell_krystallus_shatter : public SpellScript
{
- public:
- spell_krystallus_shatter_effect() : SpellScriptLoader("spell_krystallus_shatter_effect") { }
+ PrepareSpellScript(spell_krystallus_shatter);
- class spell_krystallus_shatter_effect_SpellScript : public SpellScript
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ if (Unit* target = GetHitUnit())
{
- PrepareSpellScript(spell_krystallus_shatter_effect_SpellScript);
-
- void CalculateDamage()
- {
- if (!GetHitUnit())
- return;
-
- float radius = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster());
- if (!radius)
- return;
-
- float distance = GetCaster()->GetDistance2d(GetHitUnit());
- if (distance > 1.0f)
- SetHitDamage(int32(GetHitDamage() * ((radius - distance) / radius)));
- }
+ target->RemoveAurasDueToSpell(SPELL_STONED);
+ target->CastSpell(nullptr, SPELL_SHATTER_EFFECT, true);
+ }
+ }
- void Register() override
- {
- OnHit += SpellHitFn(spell_krystallus_shatter_effect_SpellScript::CalculateDamage);
- }
- };
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_krystallus_shatter::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+};
- SpellScript* GetSpellScript() const override
- {
- return new spell_krystallus_shatter_effect_SpellScript();
- }
+class spell_krystallus_shatter_effect : public SpellScript
+{
+ PrepareSpellScript(spell_krystallus_shatter_effect);
+
+ void CalculateDamage()
+ {
+ if (!GetHitUnit())
+ return;
+
+ float radius = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster());
+ if (!radius)
+ return;
+
+ float distance = GetCaster()->GetDistance2d(GetHitUnit());
+ if (distance > 1.0f)
+ SetHitDamage(int32(GetHitDamage() * ((radius - distance) / radius)));
+ }
+
+ void Register() override
+ {
+ OnHit += SpellHitFn(spell_krystallus_shatter_effect::CalculateDamage);
+ }
};
void AddSC_boss_krystallus()
{
- new boss_krystallus();
- new spell_krystallus_shatter();
- new spell_krystallus_shatter_effect();
+ RegisterHallsOfStoneCreatureAI(boss_krystallus);
+ RegisterSpellScript(spell_krystallus_shatter);
+ RegisterSpellScript(spell_krystallus_shatter_effect);
}
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
index 9cbf93e9866..187ece05c7a 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
@@ -75,4 +75,6 @@ inline AI* GetHallsOfStoneAI(T* obj)
return GetInstanceAI<AI>(obj, HoSScriptName);
}
+#define RegisterHallsOfStoneCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetHallsOfStoneAI)
+
#endif // HALLS_OF_STONE_H_