aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeader <keader.android@gmail.com>2017-01-09 11:36:51 -0300
committerShauren <shauren.trinity@gmail.com>2019-06-15 18:41:09 +0200
commit7c760ad992e042b95d92b391099f1563ebf7514f (patch)
treee4ef0b3c7161108bf3174d3dbf32c4f58d029810 /src
parenta71eab95f5750b630668856d93e00a36fb038529 (diff)
Core/Scripts: Fixed issues in Gal'darah fight
Closes #16219 * Added DespawnAtEvadeMethod * Fixed Agro * Implemented Stampede * Fixed Rhino Spirit flags * Updated codestyle (cherrypicked from a884660d50f2056927f856344856b6dbf73135ab)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp108
-rw-r--r--src/server/scripts/Northrend/Gundrak/gundrak.h3
2 files changed, 72 insertions, 39 deletions
diff --git a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp
index f59ac68c11b..3dc9fe8b3d9 100644
--- a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp
@@ -22,8 +22,6 @@
#include "SpellInfo.h"
#include "SpellScript.h"
-/// @todo: implement stampede
-
enum Spells
{
SPELL_IMPALING_CHARGE = 54956,
@@ -35,7 +33,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
@@ -81,40 +85,39 @@ class boss_gal_darah : public CreatureScript
struct boss_gal_darahAI : public BossAI
{
- boss_gal_darahAI(Creature* creature) : BossAI(creature, DATA_GAL_DARAH)
- {
- Initialize();
- }
+ boss_gal_darahAI(Creature* creature) : BossAI(creature, DATA_GAL_DARAH), _phaseCounter(0) { }
- void Initialize()
+ void Reset() override
{
+ _Reset();
+ _impaledPlayers.clear();
_phaseCounter = 0;
- }
-
- void InitializeAI() override
- {
- BossAI::InitializeAI();
DoCastAOE(SPELL_HEARTH_BEAM_VISUAL, true);
}
- void Reset() override
+ void JustSummoned(Creature* summon) override
{
- Initialize();
- _Reset();
- impaledPlayers.clear();
+ 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 JustReachedHome() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
- _JustReachedHome();
- DoCastAOE(SPELL_HEARTH_BEAM_VISUAL, true);
+ summons.DespawnAll();
+ _DespawnAtEvade();
}
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
Talk(SAY_AGGRO);
-
+ me->InterruptNonMeleeSpells(false);
SetPhase(PHASE_TROLL);
}
@@ -124,14 +127,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;
}
}
@@ -142,14 +145,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;
}
@@ -181,30 +184,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))
@@ -227,7 +230,7 @@ class boss_gal_darah : public CreatureScript
}
private:
- GuidSet 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();
}
diff --git a/src/server/scripts/Northrend/Gundrak/gundrak.h b/src/server/scripts/Northrend/Gundrak/gundrak.h
index 4af24309542..80ff063ecd1 100644
--- a/src/server/scripts/Northrend/Gundrak/gundrak.h
+++ b/src/server/scripts/Northrend/Gundrak/gundrak.h
@@ -59,7 +59,8 @@ enum GDCreatureIds
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 GDGameObjectIds