Core/Scripts: Fixed issues in Gal'darah fight

Closes #16219

* Added DespawnAtEvadeMethod
* Fixed Agro
* Implemented Stampede
* Fixed Rhino Spirit flags
* Updated codestyle
This commit is contained in:
Keader
2017-01-09 11:36:51 -03:00
parent d61daf23cc
commit a884660d50
3 changed files with 79 additions and 42 deletions

View File

@@ -20,8 +20,6 @@
#include "SpellScript.h"
#include "gundrak.h"
/// @todo: implement stampede
enum Spells
{
SPELL_IMPALING_CHARGE = 54956,
@@ -33,7 +31,13 @@ enum Spells
SPELL_ENRAGE = 55285,
SPELL_HEARTH_BEAM_VISUAL = 54988,
SPELL_TRANSFORM_RHINO = 55297,
SPELL_TRANSFORM_BACK = 55299
SPELL_TRANSFORM_BACK = 55299,
// Rhino Spirit
SPELL_STAMPEDE_SPIRIT = 55221,
SPELL_STAMPEDE_SPIRIT_2 = 55219,
SPELL_STAMPEDE_SPIRIT_CHARGE = 59823
};
enum Yells
@@ -79,40 +83,39 @@ class boss_gal_darah : public CreatureScript
struct boss_gal_darahAI : public BossAI
{
boss_gal_darahAI(Creature* creature) : BossAI(creature, DATA_GAL_DARAH)
{
Initialize();
}
void Initialize()
{
_phaseCounter = 0;
}
void InitializeAI() override
{
BossAI::InitializeAI();
DoCastAOE(SPELL_HEARTH_BEAM_VISUAL, true);
}
boss_gal_darahAI(Creature* creature) : BossAI(creature, DATA_GAL_DARAH), _phaseCounter(0) { }
void Reset() override
{
Initialize();
_Reset();
impaledPlayers.clear();
_impaledPlayers.clear();
_phaseCounter = 0;
DoCastAOE(SPELL_HEARTH_BEAM_VISUAL, true);
}
void JustReachedHome() override
void JustSummoned(Creature* summon) override
{
_JustReachedHome();
DoCastAOE(SPELL_HEARTH_BEAM_VISUAL, true);
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(SELECT_TARGET_RANDOM, 0))
summon->CastSpell(target, SPELL_STAMPEDE_SPIRIT_CHARGE);
}
}
void EnterEvadeMode(EvadeReason /*why*/) override
{
summons.DespawnAll();
_DespawnAtEvade();
}
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
Talk(SAY_AGGRO);
me->InterruptNonMeleeSpells(false);
SetPhase(PHASE_TROLL);
}
@@ -122,14 +125,14 @@ class boss_gal_darah : public CreatureScript
switch (phase)
{
case PHASE_TROLL:
events.ScheduleEvent(EVENT_STAMPEDE, 10 * IN_MILLISECONDS, 0, PHASE_TROLL);
events.ScheduleEvent(EVENT_WHIRLING_SLASH, 21 * IN_MILLISECONDS, 0, 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, 25 * IN_MILLISECONDS, 0, PHASE_RHINO);
events.ScheduleEvent(EVENT_IMPALING_CHARGE, 21 * IN_MILLISECONDS, 0, PHASE_RHINO);
events.ScheduleEvent(EVENT_ENRAGE, 15 * IN_MILLISECONDS, 0, PHASE_RHINO);
events.ScheduleEvent(EVENT_PUNCTURE, 10 * IN_MILLISECONDS, 0, 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;
}
}
@@ -140,14 +143,14 @@ class boss_gal_darah : public CreatureScript
{
if (Unit* target = ObjectAccessor::GetUnit(*me, guid))
Talk(EMOTE_IMPALE, target);
impaledPlayers.insert(guid);
_impaledPlayers.insert(guid);
}
}
uint32 GetData(uint32 type) const override
{
if (type == DATA_SHARE_THE_LOVE)
return impaledPlayers.size();
return _impaledPlayers.size();
return 0;
}
@@ -179,30 +182,30 @@ class boss_gal_darah : public CreatureScript
DoCast(target, SPELL_IMPALING_CHARGE);
if (++_phaseCounter >= 2)
events.ScheduleEvent(EVENT_TRANSFORM, 5 * IN_MILLISECONDS);
events.ScheduleEvent(eventId, 31 * IN_MILLISECONDS, 0, PHASE_RHINO);
events.Repeat(Seconds(31));
break;
case EVENT_STOMP:
DoCastAOE(SPELL_STOMP);
events.ScheduleEvent(eventId, 20 * IN_MILLISECONDS, 0, PHASE_RHINO);
events.Repeat(Seconds(20));
break;
case EVENT_PUNCTURE:
DoCastVictim(SPELL_PUNCTURE);
events.ScheduleEvent(eventId, 8 * IN_MILLISECONDS, 0, PHASE_RHINO);
events.Repeat(Seconds(8));
break;
case EVENT_STAMPEDE:
Talk(SAY_SUMMON_RHINO);
DoCast(me, SPELL_STAMPEDE);
events.ScheduleEvent(eventId, 15 * IN_MILLISECONDS, 0, PHASE_TROLL);
DoCastAOE(SPELL_STAMPEDE);
events.Repeat(Seconds(15));
break;
case EVENT_WHIRLING_SLASH:
DoCastVictim(SPELL_WHIRLING_SLASH);
if (++_phaseCounter >= 2)
events.ScheduleEvent(EVENT_TRANSFORM, 5 * IN_MILLISECONDS);
events.ScheduleEvent(eventId, 21 * IN_MILLISECONDS, 0, PHASE_TROLL);
events.Repeat(Seconds(21));
break;
case EVENT_ENRAGE:
DoCast(me, SPELL_ENRAGE);
events.ScheduleEvent(eventId, 20 * IN_MILLISECONDS, 0, PHASE_RHINO);
DoCastSelf(SPELL_ENRAGE);
events.Repeat(Seconds(20));
break;
case EVENT_TRANSFORM:
if (events.IsInPhase(PHASE_TROLL))
@@ -225,7 +228,7 @@ class boss_gal_darah : public CreatureScript
}
private:
std::set<uint64> impaledPlayers;
GuidSet _impaledPlayers;
uint8 _phaseCounter;
};
@@ -279,6 +282,34 @@ class spell_gal_darah_impaling_charge : public SpellScriptLoader
}
};
// 59823 - Stampede (Rhino Spirit Charge)
class spell_gal_darah_stampede_charge : public SpellScriptLoader
{
public:
spell_gal_darah_stampede_charge() : SpellScriptLoader("spell_gal_darah_stampede_charge") { }
class spell_gal_darah_stampede_charge_SpellScript : public SpellScript
{
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);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_gal_darah_stampede_charge_SpellScript();
}
};
class achievement_share_the_love : public AchievementCriteriaScript
{
public:
@@ -301,5 +332,6 @@ void AddSC_boss_gal_darah()
{
new boss_gal_darah();
new spell_gal_darah_impaling_charge();
new spell_gal_darah_stampede_charge();
new achievement_share_the_love();
}

View File

@@ -57,7 +57,8 @@ enum CreatureIds
NPC_DRAKKARI_COLOSSUS = 29307,
NPC_RUIN_DWELLER = 29920,
NPC_ECK_THE_FEROCIOUS = 29932,
NPC_ALTAR_TRIGGER = 30298
NPC_ALTAR_TRIGGER = 30298,
NPC_RHINO_SPIRIT = 29791
};
enum GameObjectIds