Core/Scripts Update boss Skadi the Ruthless (#19114)

This commit is contained in:
Gustavo
2017-02-12 06:43:55 -02:00
committed by Keader
parent 865a3a47ea
commit 4536846d7d
2 changed files with 207 additions and 161 deletions

View File

@@ -0,0 +1,54 @@
SET @PATH := 2689300;
DELETE FROM `waypoint_data` WHERE `id` IN(@PATH, @PATH+1, @PATH+2);
DELETE FROM `script_spline_chain_meta` WHERE `entry`=26893;
INSERT INTO `script_spline_chain_meta` (`entry`,`chainId`,`splineId`,`expectedDuration`,`msUntilNext`) VALUES
(26893, 1, 0, 15064, 0),
(26893, 2, 0, 3397, 0),
(26893, 3, 0, 4472, 0),
(26893, 4, 0, 23930, 0),
(26893, 5, 0, 24026, 0);
DELETE FROM `script_spline_chain_waypoints` WHERE `entry`=26893;
INSERT INTO `script_spline_chain_waypoints` (`entry`,`chainId`,`splineId`,`wpId`,`x`,`y`,`z`) VALUES
(26893, 1, 0, 0, 341.74110, -516.95450, 104.66950), -- INITIAL
(26893, 1, 0, 1, 310.21650, -510.53020, 120.54870),
(26893, 1, 0, 2, 300.86850, -520.32490, 133.36640),
(26893, 1, 0, 3, 298.34470, -529.48180, 137.28310),
(26893, 1, 0, 4, 309.09590, -540.31950, 134.97740),
(26893, 1, 0, 5, 323.64150, -547.97150, 130.31060),
(26893, 1, 0, 6, 357.07800, -549.15970, 116.31050),
(26893, 1, 0, 7, 401.25730, -550.27680, 114.92160),
(26893, 1, 0, 8, 464.50620, -555.94420, 114.44940),
(26893, 1, 0, 9, 496.19200, -556.96280, 114.86610),
(26893, 1, 0, 10, 523.20110, -548.99160, 114.86610),
(26893, 2, 0, 0, 520.48270, -541.56330, 119.84160), -- BREACH RIGHT
(26893, 2, 0, 1, 496.43400, -517.57800, 120.00000),
(26893, 3, 0, 0, 520.48270, -541.56330, 119.84160), -- BREACH LEFT
(26893, 3, 0, 1, 500.24300, -501.69300, 120.00000),
(26893, 4, 0, 0, 496.43400, -517.57800, 120.00000), -- RIGHT
(26893, 4, 0, 1, 453.12420, -517.17000, 120.02730),
(26893, 4, 0, 2, 388.33120, -514.37680, 121.11930),
(26893, 4, 0, 3, 340.27520, -512.09260, 122.31380),
(26893, 4, 0, 4, 313.07560, -509.13800, 125.17500),
(26893, 4, 0, 5, 296.69640, -522.67050, 133.70260),
(26893, 4, 0, 6, 301.29570, -549.45830, 137.42490),
(26893, 4, 0, 7, 335.07460, -552.12110, 119.84160),
(26893, 4, 0, 8, 397.62370, -553.92030, 119.84160),
(26893, 4, 0, 9, 459.63210, -558.00780, 119.84160),
(26893, 4, 0, 10, 505.54580, -568.78150, 119.84160),
(26893, 4, 0, 11, 518.09900, -560.84990, 119.84160),
(26893, 4, 0, 12, 520.48270, -541.56330, 119.84160),
(26893, 5, 0, 0, 500.24300, -501.69300, 120.00000), -- LEFT
(26893, 5, 0, 1, 451.98240, -509.25080, 120.02730),
(26893, 5, 0, 2, 399.26070, -510.07190, 121.11930),
(26893, 5, 0, 3, 350.60990, -508.39010, 122.31380),
(26893, 5, 0, 4, 325.82170, -506.77690, 125.17500),
(26893, 5, 0, 5, 301.29410, -516.67060, 133.70260),
(26893, 5, 0, 6, 301.29570, -549.45830, 137.42490),
(26893, 5, 0, 7, 335.07460, -552.12110, 119.84160),
(26893, 5, 0, 8, 397.62370, -553.92030, 119.84160),
(26893, 5, 0, 9, 459.63210, -558.00780, 119.84160),
(26893, 5, 0, 10, 505.54580, -568.78150, 119.84160),
(26893, 5, 0, 11, 518.09900, -560.84990, 119.84160),
(26893, 5, 0, 12, 520.48270, -541.56330, 119.84160);

View File

@@ -34,12 +34,10 @@ enum Spells
SPELL_SKADI_TELEPORT = 61790,
SPELL_LAUNCH_HARPOON = 48642,
SPELL_SUMMON_GAUNLET_MOBS_PERIODIC = 59275,
SPELL_FREEZING_CLOUD = 47579,
SPELL_RIDE_GRAUF = 61791,
SPELL_FREEZING_CLOUD = 47579,
SPELL_FREEZING_CLOUD_RIGHT_PERIODIC = 47592,
SPELL_FREEZING_CLOUD_LEFT_PERIODIC = 47590,
SPELL_FREEZING_CLOUD_RIGHT = 47593,
SPELL_FREEZING_CLOUD_LEFT = 47563,
SPELL_FREEZING_CLOUD_RIGHT_AREA = 47594,
SPELL_FREEZING_CLOUD_LEFT_AREA = 47574,
SPELL_SUMMON_YMIRJAR_WARRIOR_W = 48631,
@@ -60,64 +58,66 @@ enum Spells
SPELL_SUMMON_HARPOON = 56789,
};
enum Yells
enum Texts
{
SAY_AGGRO = 0,
SAY_KILL = 1,
SAY_DEATH = 3,
SAY_DRAKE_DEATH = 5,
SAY_DRAKE_BREATH = 6
};
enum Emotes
{
EMOTE_BREATH = 0,
EMOTE_ON_RANGE
};
enum Data
{
DATA_LOVE_TO_SKADI = 0,
FIRST_WAVE_MAX_WARRIORS = 10,
FIRST_WAVE_SIZE = 13,
GRAUF_PATH_INITIAL = 2689300,
GRAUF_PATH_RIGHT = 2689301,
GRAUF_PATH_LEFT = 2689302,
ACHIEV_LODI_DODI_WE_LOVES_THE_SKADI = 17726,
SAY_AGGRO = 0,
SAY_KILL = 1,
SAY_DEATH = 3,
SAY_DRAKE_DEATH = 5,
SAY_DRAKE_BREATH = 6,
EMOTE_BREATH = 0,
EMOTE_ON_RANGE = 1
};
enum Points
{
POINT_0 = 0,
POINT_1 = 1,
POINT_9 = 9,
POINT_11 = 11,
POINT_LEFT = 21,
POINT_RIGHT = 22
POINT_0 = 0,
POINT_1 = 1,
POINT_2 = 2,
POINT_BREACH = 0,
POINT_LEFT = 1,
POINT_RIGHT = 2
};
enum SplineChainIds
{
SPLINE_CHAIN_INITIAL = 1,
SPLINE_CHAIN_BREACH_RIGHT = 2,
SPLINE_CHAIN_BREACH_LEFT = 3,
SPLINE_CHAIN_RIGHT = 4,
SPLINE_CHAIN_LEFT = 5
};
enum Actions
{
ACTION_START_ENCOUNTER = 0,
ACTION_FLAME,
ACTION_START_ENCOUNTER = 0,
ACTION_DRAKE_BREATH,
ACTION_GAUNTLET_END,
ACTION_HARPOON_HIT,
};
enum CombatPhase
{
PHASE_FLYING = 0,
PHASE_FLYING = 0,
PHASE_GROUND
};
Position const BreachPoint = { 0.0f, 0.0f, 0.0f, 2.670354f };
enum MiscData
{
DATA_LOVE_TO_SKADI = 0,
FIRST_WAVE_MAX_WARRIORS = 10,
FIRST_WAVE_SIZE = 13,
ACHIEV_LODI_DODI_WE_LOVES_THE_SKADI = 17726,
};
float const BreachPoint = 2.670354f;
float const BreathPointRight = 3.124139f;
float const BreathPointLeft = 3.228859f;
Position const SecondaryWavesInitialPoint = { 478.7434f, -505.5758f, 104.7237f };
Position const SecondaryWavesFinalPoint = { 318.177f, -503.8898f, 104.5326f };
Position const SpawnLoc = { 477.5808f, -484.5591f, 104.8221f, 4.677482f };
Position const GraufLoc = { 341.7411f, -516.9545f, 104.6695f, 3.124139f };
Position const BreathPointRight = { 496.434f, -517.578f, 120.0f, 3.124139f };
Position const BreathPointLeft = { 500.243f, -501.693f, 120.0f, 3.228859f };
Position const FirstWaveLocations[FIRST_WAVE_SIZE] =
{
{ 458.5323f, -516.2537f, 104.617f },
@@ -150,8 +150,8 @@ public:
void Initialize()
{
firstWaveSummoned = false;
harpoonHit = 0;
loveSkadi = 0;
_harpoonHit = 0;
_loveSkadi = 0;
_phase = PHASE_GROUND;
scheduler.SetValidator([this]
{
@@ -252,9 +252,9 @@ public:
if (Creature* combatTrigger = me->SummonCreature(NPC_COMBAT_TRIGGER, SpawnLoc))
combatTrigger->AI()->DoZoneInCombat();
break;
case ACTION_FLAME:
if (loveSkadi == 1)
loveSkadi++;
case ACTION_DRAKE_BREATH:
if (_loveSkadi == 1)
_loveSkadi++;
Talk(SAY_DRAKE_BREATH);
break;
case ACTION_GAUNTLET_END:
@@ -285,9 +285,9 @@ public:
});
break;
case ACTION_HARPOON_HIT:
harpoonHit++;
if (harpoonHit == 1)
loveSkadi = 1;
_harpoonHit++;
if (_harpoonHit == 1)
_loveSkadi = 1;
break;
}
}
@@ -295,7 +295,7 @@ public:
uint32 GetData(uint32 id) const override
{
if (id == DATA_LOVE_TO_SKADI)
return loveSkadi;
return _loveSkadi;
return 0;
}
@@ -315,8 +315,8 @@ public:
private:
CombatPhase _phase;
uint8 harpoonHit;
uint8 loveSkadi;
uint8 _harpoonHit;
uint8 _loveSkadi;
bool firstWaveSummoned;
};
@@ -333,16 +333,13 @@ public:
struct npc_graufAI : public ScriptedAI
{
npc_graufAI(Creature* creature) : ScriptedAI(creature)
{
_isFirstFly = true;
_instance = me->GetInstanceScript();
}
npc_graufAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
void Reset() override
{
me->SetReactState(REACT_PASSIVE);
me->setRegeneratingHealth(false);
me->SetSpeedRate(MOVE_RUN, 2.5f);
}
void JustDied(Unit* /*killer*/) override
@@ -350,7 +347,7 @@ public:
if (Creature* skadi = _instance->GetCreature(DATA_SKADI_THE_RUTHLESS))
skadi->AI()->DoAction(ACTION_GAUNTLET_END);
me->DespawnOrUnsummon(6000);
me->DespawnOrUnsummon(Seconds(6));
}
void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override
@@ -370,50 +367,45 @@ public:
_scheduler.Schedule(Seconds(2), [this](TaskContext /*context*/)
{
me->GetMotionMaster()->MovePath(GRAUF_PATH_INITIAL, false);
me->GetMotionMaster()->MoveAlongSplineChain(POINT_BREACH, SPLINE_CHAIN_INITIAL, false);
});
}
void MovementInform(uint32 type, uint32 pointId) override
{
if (type != POINT_MOTION_TYPE && type != WAYPOINT_MOTION_TYPE)
if (type != SPLINE_CHAIN_MOTION_TYPE)
return;
switch (pointId)
{
case POINT_9:
if (!_isFirstFly)
break;
_isFirstFly = false;
// no break
case POINT_11:
case POINT_BREACH:
_scheduler
.Schedule(Milliseconds(1), [this](TaskContext /*context*/)
{
me->SetFacingTo(BreachPoint.GetOrientation());
me->SetFacingTo(BreachPoint);
Talk(EMOTE_ON_RANGE);
})
.Schedule(Seconds(10), [this](TaskContext /*context*/)
{
if (RAND(POINT_LEFT,POINT_RIGHT) == POINT_LEFT)
me->GetMotionMaster()->MovePoint(POINT_LEFT, BreathPointLeft);
if (RAND(POINT_LEFT, POINT_RIGHT) == POINT_LEFT)
me->GetMotionMaster()->MoveAlongSplineChain(POINT_LEFT, SPLINE_CHAIN_BREACH_LEFT, false);
else
me->GetMotionMaster()->MovePoint(POINT_RIGHT, BreathPointRight);
me->GetMotionMaster()->MoveAlongSplineChain(POINT_RIGHT, SPLINE_CHAIN_BREACH_RIGHT, false);
});
break;
case POINT_LEFT:
_scheduler
.Schedule(Milliseconds(1), [this](TaskContext /*context*/)
{
me->SetFacingTo(BreathPointLeft.GetOrientation());
me->SetFacingTo(BreathPointLeft);
Talk(EMOTE_BREATH);
})
.Schedule(Seconds(2), [this](TaskContext /*context*/)
{
me->GetMotionMaster()->MovePath(GRAUF_PATH_LEFT, false);
me->GetMotionMaster()->MoveAlongSplineChain(POINT_BREACH, SPLINE_CHAIN_LEFT, false);
DoCast(SPELL_FREEZING_CLOUD_LEFT_PERIODIC);
if (Creature* skadi = _instance->GetCreature(DATA_SKADI_THE_RUTHLESS))
skadi->AI()->DoAction(ACTION_FLAME);
skadi->AI()->DoAction(ACTION_DRAKE_BREATH);
})
.Schedule(Seconds(10), [this](TaskContext /*context*/)
{
@@ -424,23 +416,23 @@ public:
_scheduler
.Schedule(Milliseconds(1), [this](TaskContext /*context*/)
{
me->SetFacingTo(BreathPointRight.GetOrientation());
me->SetFacingTo(BreathPointRight);
Talk(EMOTE_BREATH);
})
.Schedule(Seconds(2), [this](TaskContext /*context*/)
{
me->GetMotionMaster()->MovePath(GRAUF_PATH_RIGHT, false);
me->GetMotionMaster()->MoveAlongSplineChain(POINT_BREACH, SPLINE_CHAIN_RIGHT, false);
DoCast(SPELL_FREEZING_CLOUD_RIGHT_PERIODIC);
if (Creature* skadi = _instance->GetCreature(DATA_SKADI_THE_RUTHLESS))
skadi->AI()->DoAction(ACTION_FLAME);
skadi->AI()->DoAction(ACTION_DRAKE_BREATH);
})
.Schedule(Seconds(10), [this](TaskContext /*context*/)
{
me->RemoveAurasDueToSpell(SPELL_FREEZING_CLOUD_RIGHT_PERIODIC);
});
break;
default:
break;
default:
break;
}
}
@@ -459,7 +451,6 @@ public:
private:
TaskScheduler _scheduler;
InstanceScript* _instance;
bool _isFirstFly;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -505,11 +496,11 @@ struct npc_skadi_trashAI : public ScriptedAI
case POINT_1:
_scheduler.Schedule(Seconds(1), [this](TaskContext /*context*/)
{
me->GetMotionMaster()->MovePoint(POINT_9, SecondaryWavesFinalPoint);
me->GetMotionMaster()->MovePoint(POINT_2, SecondaryWavesFinalPoint);
});
break;
case POINT_9:
DoZoneInCombat(me, 200);
case POINT_2:
DoZoneInCombat();
break;
default:
break;
@@ -634,80 +625,80 @@ public:
class spell_freezing_cloud_area_right : public SpellScriptLoader
{
public:
spell_freezing_cloud_area_right() : SpellScriptLoader("spell_freezing_cloud_area_right") { }
public:
spell_freezing_cloud_area_right() : SpellScriptLoader("spell_freezing_cloud_area_right") { }
class spell_freezing_cloud_area_right_SpellScript : public SpellScript
{
PrepareSpellScript(spell_freezing_cloud_area_right_SpellScript);
bool Validate(SpellInfo const* /*spell*/) override
class spell_freezing_cloud_area_right_SpellScript : public SpellScript
{
if (!sSpellMgr->GetSpellInfo(SPELL_FREEZING_CLOUD))
return false;
return true;
}
PrepareSpellScript(spell_freezing_cloud_area_right_SpellScript);
void FilterTargets(std::list<WorldObject*>& targets)
bool Validate(SpellInfo const* /*spell*/) override
{
if (!sSpellMgr->GetSpellInfo(SPELL_FREEZING_CLOUD))
return false;
return true;
}
void FilterTargets(std::list<WorldObject*>& targets)
{
targets.remove_if([](WorldObject* obj) { return obj->GetPositionY() > -511.0f; });
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
GetHitUnit()->CastSpell(GetHitUnit(), SPELL_FREEZING_CLOUD, true);
}
void Register() override
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_freezing_cloud_area_right_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
OnEffectHitTarget += SpellEffectFn(spell_freezing_cloud_area_right_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
}
};
SpellScript* GetSpellScript() const override
{
targets.remove_if([](WorldObject* obj) { return obj->GetPositionY() > -511.0f; });
return new spell_freezing_cloud_area_right_SpellScript();
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
GetHitUnit()->CastSpell(GetHitUnit(), SPELL_FREEZING_CLOUD, true);
}
void Register() override
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_freezing_cloud_area_right_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
OnEffectHitTarget += SpellEffectFn(spell_freezing_cloud_area_right_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_freezing_cloud_area_right_SpellScript();
}
};
class spell_freezing_cloud_area_left : public SpellScriptLoader
{
public:
spell_freezing_cloud_area_left() : SpellScriptLoader("spell_freezing_cloud_area_left") { }
public:
spell_freezing_cloud_area_left() : SpellScriptLoader("spell_freezing_cloud_area_left") { }
class spell_freezing_cloud_area_left_SpellScript : public SpellScript
{
PrepareSpellScript(spell_freezing_cloud_area_left_SpellScript);
bool Validate(SpellInfo const* /*spell*/) override
class spell_freezing_cloud_area_left_SpellScript : public SpellScript
{
if (!sSpellMgr->GetSpellInfo(SPELL_FREEZING_CLOUD))
return false;
return true;
}
PrepareSpellScript(spell_freezing_cloud_area_left_SpellScript);
void FilterTargets(std::list<WorldObject*>& targets)
bool Validate(SpellInfo const* /*spell*/) override
{
if (!sSpellMgr->GetSpellInfo(SPELL_FREEZING_CLOUD))
return false;
return true;
}
void FilterTargets(std::list<WorldObject*>& targets)
{
targets.remove_if([](WorldObject* obj) { return obj->GetPositionY() < -511.0f; });
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
GetHitUnit()->CastSpell(GetHitUnit(), SPELL_FREEZING_CLOUD, true);
}
void Register() override
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_freezing_cloud_area_left_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
OnEffectHitTarget += SpellEffectFn(spell_freezing_cloud_area_left_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
}
};
SpellScript* GetSpellScript() const override
{
targets.remove_if([](WorldObject* obj) { return obj->GetPositionY() < -511.0f; });
return new spell_freezing_cloud_area_left_SpellScript();
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
GetHitUnit()->CastSpell(GetHitUnit(), SPELL_FREEZING_CLOUD, true);
}
void Register() override
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_freezing_cloud_area_left_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
OnEffectHitTarget += SpellEffectFn(spell_freezing_cloud_area_left_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_freezing_cloud_area_left_SpellScript();
}
};
class spell_freezing_cloud_damage : public SpellScriptLoader
@@ -920,20 +911,20 @@ class spell_summon_gauntlet_mobs_periodic : public SpellScriptLoader
class achievement_girl_love_to_skadi : public AchievementCriteriaScript
{
public:
achievement_girl_love_to_skadi() : AchievementCriteriaScript("achievement_girl_love_to_skadi") { }
public:
achievement_girl_love_to_skadi() : AchievementCriteriaScript("achievement_girl_love_to_skadi") { }
bool OnCheck(Player* /*player*/, Unit* target) override
{
if (!target)
return false;
if (Creature* skadi = target->ToCreature())
if (skadi->AI()->GetData(DATA_LOVE_TO_SKADI) == 1)
return true;
bool OnCheck(Player* /*player*/, Unit* target) override
{
if (!target)
return false;
if (Creature* skadi = target->ToCreature())
if (skadi->AI()->GetData(DATA_LOVE_TO_SKADI) == 1)
return true;
return false;
}
}
};
class at_skadi_gaunlet : public AreaTriggerScript
@@ -943,15 +934,16 @@ class at_skadi_gaunlet : public AreaTriggerScript
bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
{
if (InstanceScript* instance = player->GetInstanceScript())
{
if (instance->GetBossState(DATA_SKADI_THE_RUTHLESS) == NOT_STARTED)
if (Creature* skadi = instance->GetCreature(DATA_SKADI_THE_RUTHLESS))
{
skadi->AI()->DoAction(ACTION_START_ENCOUNTER);
return true;
}
}
InstanceScript* instance = player->GetInstanceScript();
if (!instance || player->IsGameMaster())
return true;
if (instance->GetBossState(DATA_SKADI_THE_RUTHLESS) == NOT_STARTED)
if (Creature* skadi = instance->GetCreature(DATA_SKADI_THE_RUTHLESS))
{
skadi->AI()->DoAction(ACTION_START_ENCOUNTER);
return true;
}
return true;
}