mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-18 00:18:43 +01:00
Scripts/Gundrak: Update Galdarah to new model (#26436)
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user