Scripts/HoS: Update Krystallus to new model (#26421)

This commit is contained in:
offl
2021-04-16 20:14:29 +03:00
committed by GitHub
parent 7bd3a36d52
commit 19606ea1e7
2 changed files with 108 additions and 139 deletions

View File

@@ -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
void Reset() override
{
_Reset();
}
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);
}
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())
{
boss_krystallusAI(Creature* creature) : BossAI(creature, DATA_KRYSTALLUS) { }
void Reset() override
switch (eventId)
{
_Reset();
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;
}
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);
}
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 JustDied(Unit* /*killer*/) override
{
Talk(SAY_DEATH);
_JustDied();
}
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_KILL);
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetHallsOfStoneAI<boss_krystallusAI>(creature);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_DEATH);
_JustDied();
}
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_KILL);
}
};
class spell_krystallus_shatter : public SpellScriptLoader
class spell_krystallus_shatter : public SpellScript
{
public:
spell_krystallus_shatter() : SpellScriptLoader("spell_krystallus_shatter") { }
PrepareSpellScript(spell_krystallus_shatter);
class spell_krystallus_shatter_SpellScript : public SpellScript
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (Unit* target = GetHitUnit())
{
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 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();
target->RemoveAurasDueToSpell(SPELL_STONED);
target->CastSpell(nullptr, SPELL_SHATTER_EFFECT, true);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_krystallus_shatter::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
class spell_krystallus_shatter_effect : public SpellScriptLoader
class spell_krystallus_shatter_effect : public SpellScript
{
public:
spell_krystallus_shatter_effect() : SpellScriptLoader("spell_krystallus_shatter_effect") { }
PrepareSpellScript(spell_krystallus_shatter_effect);
class spell_krystallus_shatter_effect_SpellScript : public SpellScript
{
PrepareSpellScript(spell_krystallus_shatter_effect_SpellScript);
void CalculateDamage()
{
if (!GetHitUnit())
return;
void CalculateDamage()
{
if (!GetHitUnit())
return;
float radius = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster());
if (!radius)
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)));
}
float distance = GetCaster()->GetDistance2d(GetHitUnit());
if (distance > 1.0f)
SetHitDamage(int32(GetHitDamage() * ((radius - distance) / radius)));
}
void Register() override
{
OnHit += SpellHitFn(spell_krystallus_shatter_effect_SpellScript::CalculateDamage);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_krystallus_shatter_effect_SpellScript();
}
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);
}

View File

@@ -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_