Scripts/Gundrak: Update Galdarah to new model (#26436)

This commit is contained in:
offl
2021-04-20 17:38:07 +03:00
committed by GitHub
parent ebf05f1c4e
commit ab46e6587f

View File

@@ -81,238 +81,205 @@ enum Misc
DATA_SHARE_THE_LOVE = 1
};
class boss_gal_darah : public CreatureScript
struct boss_gal_darah : public BossAI
{
public:
boss_gal_darah() : CreatureScript("boss_gal_darah") { }
boss_gal_darah(Creature* creature) : BossAI(creature, DATA_GAL_DARAH), _phaseCounter(0) { }
struct boss_gal_darahAI : public BossAI
void Reset() override
{
_Reset();
_impaledPlayers.clear();
_phaseCounter = 0;
DoCastAOE(SPELL_HEARTH_BEAM_VISUAL, true);
}
void JustSummoned(Creature* summon) override
{
BossAI::JustSummoned(summon);
if (summon->GetEntry() == NPC_RHINO_SPIRIT)
{
boss_gal_darahAI(Creature* creature) : BossAI(creature, DATA_GAL_DARAH), _phaseCounter(0) { }
void Reset() override
{
_Reset();
_impaledPlayers.clear();
_phaseCounter = 0;
DoCastAOE(SPELL_HEARTH_BEAM_VISUAL, true);
}
void JustSummoned(Creature* summon) override
{
BossAI::JustSummoned(summon);
if (summon->GetEntry() == NPC_RHINO_SPIRIT)
{
summon->CastSpell(summon, SPELL_STAMPEDE_SPIRIT, true);
summon->CastSpell(summon, SPELL_STAMPEDE_SPIRIT_2, true);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
summon->CastSpell(target, SPELL_STAMPEDE_SPIRIT_CHARGE);
}
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
_EnterEvadeMode();
summons.DespawnAll();
_DespawnAtEvade();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
me->InterruptNonMeleeSpells(false);
SetPhase(PHASE_TROLL);
}
void SetPhase(CombatPhase phase)
{
events.SetPhase(phase);
switch (phase)
{
case PHASE_TROLL:
events.ScheduleEvent(EVENT_STAMPEDE, Seconds(10), 0, PHASE_TROLL);
events.ScheduleEvent(EVENT_WHIRLING_SLASH, Seconds(21), 0, PHASE_TROLL);
break;
case PHASE_RHINO:
events.ScheduleEvent(EVENT_STOMP, Seconds(25), 0, PHASE_RHINO);
events.ScheduleEvent(EVENT_IMPALING_CHARGE, Seconds(21), 0, PHASE_RHINO);
events.ScheduleEvent(EVENT_ENRAGE, Seconds(15), 0, PHASE_RHINO);
events.ScheduleEvent(EVENT_PUNCTURE, Seconds(10), 0, PHASE_RHINO);
break;
}
}
void SetGUID(ObjectGuid const& guid, int32 id) override
{
if (id == DATA_SHARE_THE_LOVE)
{
if (Unit* target = ObjectAccessor::GetUnit(*me, guid))
Talk(EMOTE_IMPALE, target);
_impaledPlayers.insert(guid);
}
}
uint32 GetData(uint32 type) const override
{
if (type == DATA_SHARE_THE_LOVE)
return _impaledPlayers.size();
return 0;
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
Talk(SAY_DEATH);
DoCastSelf(SPELL_CLEAR_PUNCTURE, true);
}
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
}
void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_TRANSFORM_BACK)
me->RemoveAurasDueToSpell(SPELL_TRANSFORM_RHINO);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_IMPALING_CHARGE:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 60.0f, true))
DoCast(target, SPELL_IMPALING_CHARGE);
if (++_phaseCounter >= 2)
events.ScheduleEvent(EVENT_TRANSFORM, 5s);
events.Repeat(Seconds(31));
break;
case EVENT_STOMP:
DoCastAOE(SPELL_STOMP);
events.Repeat(Seconds(20));
break;
case EVENT_PUNCTURE:
DoCastVictim(SPELL_PUNCTURE);
events.Repeat(Seconds(8));
break;
case EVENT_STAMPEDE:
Talk(SAY_SUMMON_RHINO);
DoCastAOE(SPELL_STAMPEDE);
events.Repeat(Seconds(15));
break;
case EVENT_WHIRLING_SLASH:
DoCastVictim(SPELL_WHIRLING_SLASH);
if (++_phaseCounter >= 2)
events.ScheduleEvent(EVENT_TRANSFORM, 5s);
events.Repeat(Seconds(21));
break;
case EVENT_ENRAGE:
DoCastSelf(SPELL_ENRAGE);
events.Repeat(Seconds(20));
break;
case EVENT_TRANSFORM:
if (events.IsInPhase(PHASE_TROLL))
{
Talk(SAY_TRANSFORM_1);
DoCast(me, SPELL_TRANSFORM_RHINO);
SetPhase(PHASE_RHINO);
}
else if (events.IsInPhase(PHASE_RHINO))
{
Talk(SAY_TRANSFORM_2);
DoCast(me, SPELL_TRANSFORM_BACK);
SetPhase(PHASE_TROLL);
}
_phaseCounter = 0;
break;
default:
break;
}
}
private:
GuidSet _impaledPlayers;
uint8 _phaseCounter;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetGundrakAI<boss_gal_darahAI>(creature);
summon->CastSpell(summon, SPELL_STAMPEDE_SPIRIT, true);
summon->CastSpell(summon, SPELL_STAMPEDE_SPIRIT_2, true);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
summon->CastSpell(target, SPELL_STAMPEDE_SPIRIT_CHARGE);
}
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
_EnterEvadeMode();
summons.DespawnAll();
_DespawnAtEvade();
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
me->InterruptNonMeleeSpells(false);
SetPhase(PHASE_TROLL);
}
void SetPhase(CombatPhase phase)
{
events.SetPhase(phase);
switch (phase)
{
case PHASE_TROLL:
events.ScheduleEvent(EVENT_STAMPEDE, Seconds(10), 0, PHASE_TROLL);
events.ScheduleEvent(EVENT_WHIRLING_SLASH, Seconds(21), 0, PHASE_TROLL);
break;
case PHASE_RHINO:
events.ScheduleEvent(EVENT_STOMP, Seconds(25), 0, PHASE_RHINO);
events.ScheduleEvent(EVENT_IMPALING_CHARGE, Seconds(21), 0, PHASE_RHINO);
events.ScheduleEvent(EVENT_ENRAGE, Seconds(15), 0, PHASE_RHINO);
events.ScheduleEvent(EVENT_PUNCTURE, Seconds(10), 0, PHASE_RHINO);
break;
}
}
void SetGUID(ObjectGuid const& guid, int32 id) override
{
if (id == DATA_SHARE_THE_LOVE)
{
if (Unit* target = ObjectAccessor::GetUnit(*me, guid))
Talk(EMOTE_IMPALE, target);
_impaledPlayers.insert(guid);
}
}
uint32 GetData(uint32 type) const override
{
if (type == DATA_SHARE_THE_LOVE)
return _impaledPlayers.size();
return 0;
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
Talk(SAY_DEATH);
DoCastSelf(SPELL_CLEAR_PUNCTURE, true);
}
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
}
void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_TRANSFORM_BACK)
me->RemoveAurasDueToSpell(SPELL_TRANSFORM_RHINO);
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_IMPALING_CHARGE:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 60.0f, true))
DoCast(target, SPELL_IMPALING_CHARGE);
if (++_phaseCounter >= 2)
events.ScheduleEvent(EVENT_TRANSFORM, 5s);
events.Repeat(Seconds(31));
break;
case EVENT_STOMP:
DoCastAOE(SPELL_STOMP);
events.Repeat(Seconds(20));
break;
case EVENT_PUNCTURE:
DoCastVictim(SPELL_PUNCTURE);
events.Repeat(Seconds(8));
break;
case EVENT_STAMPEDE:
Talk(SAY_SUMMON_RHINO);
DoCastAOE(SPELL_STAMPEDE);
events.Repeat(Seconds(15));
break;
case EVENT_WHIRLING_SLASH:
DoCastVictim(SPELL_WHIRLING_SLASH);
if (++_phaseCounter >= 2)
events.ScheduleEvent(EVENT_TRANSFORM, 5s);
events.Repeat(Seconds(21));
break;
case EVENT_ENRAGE:
DoCastSelf(SPELL_ENRAGE);
events.Repeat(Seconds(20));
break;
case EVENT_TRANSFORM:
if (events.IsInPhase(PHASE_TROLL))
{
Talk(SAY_TRANSFORM_1);
DoCast(me, SPELL_TRANSFORM_RHINO);
SetPhase(PHASE_RHINO);
}
else if (events.IsInPhase(PHASE_RHINO))
{
Talk(SAY_TRANSFORM_2);
DoCast(me, SPELL_TRANSFORM_BACK);
SetPhase(PHASE_TROLL);
}
_phaseCounter = 0;
break;
default:
break;
}
}
private:
GuidSet _impaledPlayers;
uint8 _phaseCounter;
};
// 54956, 59827 - Impaling Charge
class spell_gal_darah_impaling_charge : public SpellScriptLoader
class spell_gal_darah_impaling_charge : public SpellScript
{
public:
spell_gal_darah_impaling_charge() : SpellScriptLoader("spell_gal_darah_impaling_charge") { }
PrepareSpellScript(spell_gal_darah_impaling_charge);
class spell_gal_darah_impaling_charge_SpellScript : public SpellScript
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_IMPALING_CHARGE_CONTROL_VEHICLE });
}
bool Load() override
{
return GetCaster()->GetVehicleKit() && GetCaster()->GetEntry() == NPC_GAL_DARAH;
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (Unit* target = GetHitUnit())
{
PrepareSpellScript(spell_gal_darah_impaling_charge_SpellScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_IMPALING_CHARGE_CONTROL_VEHICLE });
}
bool Load() override
{
return GetCaster()->GetVehicleKit() && GetCaster()->GetEntry() == NPC_GAL_DARAH;
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (Unit* target = GetHitUnit())
{
Unit* caster = GetCaster();
target->CastSpell(caster, SPELL_IMPALING_CHARGE_CONTROL_VEHICLE, true);
caster->ToCreature()->AI()->SetGUID(target->GetGUID(), DATA_SHARE_THE_LOVE);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_gal_darah_impaling_charge_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_CHARGE);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_gal_darah_impaling_charge_SpellScript();
Unit* caster = GetCaster();
target->CastSpell(caster, SPELL_IMPALING_CHARGE_CONTROL_VEHICLE, true);
caster->ToCreature()->AI()->SetGUID(target->GetGUID(), DATA_SHARE_THE_LOVE);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_gal_darah_impaling_charge::HandleScript, EFFECT_0, SPELL_EFFECT_CHARGE);
}
};
// 55220 - Stampede (Rhino Spirit Charge)
// 59823 - Stampede (Rhino Spirit Charge)
class spell_gal_darah_stampede_charge : public SpellScriptLoader
class spell_gal_darah_stampede_charge : public SpellScript
{
public:
spell_gal_darah_stampede_charge() : SpellScriptLoader("spell_gal_darah_stampede_charge") { }
PrepareSpellScript(spell_gal_darah_stampede_charge);
class spell_gal_darah_stampede_charge_SpellScript : public SpellScript
void OnHit(SpellEffIndex /*effIndex*/)
{
PrepareSpellScript(spell_gal_darah_stampede_charge_SpellScript);
if (Creature* caster = GetCaster()->ToCreature())
caster->DespawnOrUnsummon(Seconds(1));
}
void OnHit(SpellEffIndex /*effIndex*/)
{
if (Creature* caster = GetCaster()->ToCreature())
caster->DespawnOrUnsummon(Seconds(1));
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_gal_darah_stampede_charge_SpellScript::OnHit, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE);
}
};
SpellScript* GetSpellScript() const override
void Register() override
{
return new spell_gal_darah_stampede_charge_SpellScript();
OnEffectHitTarget += SpellEffectFn(spell_gal_darah_stampede_charge::OnHit, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE);
}
};
@@ -358,9 +325,9 @@ class achievement_share_the_love : public AchievementCriteriaScript
void AddSC_boss_gal_darah()
{
new boss_gal_darah();
new spell_gal_darah_impaling_charge();
new spell_gal_darah_stampede_charge();
RegisterGundrakCreatureAI(boss_gal_darah);
RegisterSpellScript(spell_gal_darah_impaling_charge);
RegisterSpellScript(spell_gal_darah_stampede_charge);
RegisterSpellScript(spell_gal_darah_clear_puncture);
new achievement_share_the_love();
}