diff options
author | offl <11556157+offl@users.noreply.github.com> | 2021-04-20 17:38:07 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-20 17:38:07 +0300 |
commit | ab46e6587f43ee95c759dae3157dcc80f860f8e1 (patch) | |
tree | acb9f959d2ff0c3bb3dedbcff42267582502911f /src | |
parent | ebf05f1c4ecd1302253a5e166fef17f0e3a846aa (diff) |
Scripts/Gundrak: Update Galdarah to new model (#26436)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp | 379 |
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(); } |