aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2021-04-20 17:38:07 +0300
committerGitHub <noreply@github.com>2021-04-20 17:38:07 +0300
commitab46e6587f43ee95c759dae3157dcc80f860f8e1 (patch)
treeacb9f959d2ff0c3bb3dedbcff42267582502911f
parentebf05f1c4ecd1302253a5e166fef17f0e3a846aa (diff)
Scripts/Gundrak: Update Galdarah to new model (#26436)
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp379
1 files changed, 173 insertions, 206 deletions
diff --git a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp
index 135ff7cc4ba..56b4ce8b369 100644
--- a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp
@@ -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
- {
- 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 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 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 EnterEvadeMode(EvadeReason /*why*/) override
+ {
+ _EnterEvadeMode();
+ summons.DespawnAll();
+ _DespawnAtEvade();
+ }
- 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;
- }
- }
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ Talk(SAY_AGGRO);
+ me->InterruptNonMeleeSpells(false);
+ SetPhase(PHASE_TROLL);
+ }
- private:
- GuidSet _impaledPlayers;
- uint8 _phaseCounter;
- };
+ 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;
+ }
+ }
- CreatureAI* GetAI(Creature* creature) const override
+ void SetGUID(ObjectGuid const& guid, int32 id) override
+ {
+ if (id == DATA_SHARE_THE_LOVE)
{
- return GetGundrakAI<boss_gal_darahAI>(creature);
+ if (Unit* target = ObjectAccessor::GetUnit(*me, guid))
+ Talk(EMOTE_IMPALE, target);
+ _impaledPlayers.insert(guid);
}
-};
+ }
-// 54956, 59827 - Impaling Charge
-class spell_gal_darah_impaling_charge : public SpellScriptLoader
-{
- public:
- spell_gal_darah_impaling_charge() : SpellScriptLoader("spell_gal_darah_impaling_charge") { }
+ uint32 GetData(uint32 type) const override
+ {
+ if (type == DATA_SHARE_THE_LOVE)
+ return _impaledPlayers.size();
- class spell_gal_darah_impaling_charge_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_gal_darah_impaling_charge_SpellScript);
+ return 0;
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ DoCastSelf(SPELL_CLEAR_PUNCTURE, true);
+ }
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_IMPALING_CHARGE_CONTROL_VEHICLE });
- }
+ void KilledUnit(Unit* victim) override
+ {
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
- bool Load() override
- {
- return GetCaster()->GetVehicleKit() && GetCaster()->GetEntry() == NPC_GAL_DARAH;
- }
+ void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
+ {
+ if (spellInfo->Id == SPELL_TRANSFORM_BACK)
+ me->RemoveAurasDueToSpell(SPELL_TRANSFORM_RHINO);
+ }
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- if (Unit* target = GetHitUnit())
+ 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))
{
- Unit* caster = GetCaster();
- target->CastSpell(caster, SPELL_IMPALING_CHARGE_CONTROL_VEHICLE, true);
- caster->ToCreature()->AI()->SetGUID(target->GetGUID(), DATA_SHARE_THE_LOVE);
+ Talk(SAY_TRANSFORM_2);
+ DoCast(me, SPELL_TRANSFORM_BACK);
+ SetPhase(PHASE_TROLL);
}
- }
+ _phaseCounter = 0;
+ break;
+ default:
+ break;
+ }
+ }
+
+private:
+ GuidSet _impaledPlayers;
+ uint8 _phaseCounter;
+};
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_gal_darah_impaling_charge_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_CHARGE);
- }
- };
+// 54956, 59827 - Impaling Charge
+class spell_gal_darah_impaling_charge : public SpellScript
+{
+ PrepareSpellScript(spell_gal_darah_impaling_charge);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_IMPALING_CHARGE_CONTROL_VEHICLE });
+ }
- SpellScript* GetSpellScript() const override
+ bool Load() override
+ {
+ return GetCaster()->GetVehicleKit() && GetCaster()->GetEntry() == NPC_GAL_DARAH;
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ if (Unit* target = GetHitUnit())
{
- 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);
-
- 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);
- }
- };
+ if (Creature* caster = GetCaster()->ToCreature())
+ caster->DespawnOrUnsummon(Seconds(1));
+ }
- 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();
}