Core/Scripts Improve Jormungars fight

This commit is contained in:
Keader
2016-04-17 15:10:13 -03:00
committed by Aokromes
parent afc0718191
commit 62b97ff51d
2 changed files with 169 additions and 21 deletions

View File

@@ -0,0 +1,19 @@
DELETE FROM `spell_script_names` where `ScriptName` IN ('spell_burning_spray','spell_paralytic_spray','spell_jormungars_paralytic_toxin');
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(66902,'spell_burning_spray'), -- Burning Spray 10m normal
(67627,'spell_burning_spray'), -- Burning Spray 25m normal
(67628,'spell_burning_spray'), -- Burning Spray 10m heroic
(67629,'spell_burning_spray'), -- Burning Spray 25m heroic
(66901,'spell_paralytic_spray'), -- Paralytic Spray 10m normal
(67615,'spell_paralytic_spray'), -- Paralytic Spray 25m normal
(67616,'spell_paralytic_spray'), -- Paralytic Spray 10m heroic
(67617,'spell_paralytic_spray'), -- Paralytic Spray 25m heroic
(66823,'spell_jormungars_paralytic_toxin'), -- Paralytic Toxin 10m normal
(67618,'spell_jormungars_paralytic_toxin'), -- Paralytic Toxin 25m normal
(67619,'spell_jormungars_paralytic_toxin'), -- Paralytic Toxin 10m heroic
(67620,'spell_jormungars_paralytic_toxin'); -- Paralytic Toxin 25m heroic
-- Acidmaw missing text
DELETE FROM `creature_text` where entry = 35144 AND groupid = 1;
INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
(35144, 1, 0, 'You have been infected with a Paralytic Toxin!', 42, 0, 0, 0, 0, 0, 'Acidmaw - Special Attack');

View File

@@ -25,6 +25,7 @@
#include "Vehicle.h"
#include "Player.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
enum Yells
{
@@ -33,6 +34,7 @@ enum Yells
// Acidmaw & Dreadscale
EMOTE_ENRAGE = 0,
SAY_SPECIAL = 1,
// Icehowl
EMOTE_TRAMPLE_START = 0,
@@ -78,22 +80,29 @@ enum BossSpells
SPELL_FIRE_BOMB_DOT = 66318,
SPELL_HEAD_CRACK = 66407,
//Acidmaw & Dreadscale
SPELL_ACID_SPIT = 66880,
SPELL_PARALYTIC_SPRAY = 66901,
SPELL_ACID_SPEW = 66819,
SPELL_PARALYTIC_BITE = 66824,
SPELL_SWEEP_0 = 66794,
//Acidmaw & Dreadscale Generic
SPELL_SWEEP = 66794,
SUMMON_SLIME_POOL = 66883,
SPELL_FIRE_SPIT = 66796,
SPELL_MOLTEN_SPEW = 66821,
SPELL_BURNING_BITE = 66879,
SPELL_BURNING_SPRAY = 66902,
SPELL_SWEEP_1 = 67646,
SPELL_EMERGE_0 = 66947,
SPELL_SUBMERGE_0 = 66948,
SPELL_EMERGE = 66947,
SPELL_SUBMERGE = 66948,
SPELL_ENRAGE = 68335,
SPELL_SLIME_POOL_EFFECT = 66882, //In 60s it diameter grows from 10y to 40y (r=r+0.25 per second)
SPELL_GROUND_VISUAL_0 = 66969,
SPELL_GROUND_VISUAL_1 = 68302,
SPELL_HATE_TO_ZERO = 63984,
//Acidmaw
SPELL_ACID_SPIT = 66880,
SPELL_PARALYTIC_SPRAY = 66901,
SPELL_PARALYTIC_BITE = 66824, //Paralytic Toxin
SPELL_ACID_SPEW = 66818,
SPELL_PARALYSIS = 66830,
SPELL_PARALYTIC_TOXIN = 66823,
//Dreadscale
SPELL_BURNING_BITE = 66879, // Burning Bile
SPELL_MOLTEN_SPEW = 66821,
SPELL_FIRE_SPIT = 66796,
SPELL_BURNING_SPRAY = 66902,
SPELL_BURNING_BILE = 66869,
//Icehowl
SPELL_FEROCIOUS_BUTT = 66770,
@@ -549,7 +558,7 @@ struct boss_jormungarAI : public BossAI
if (!Enraged && instance->GetData(TYPE_NORTHREND_BEASTS) == SNAKES_SPECIAL)
{
me->RemoveAurasDueToSpell(SPELL_SUBMERGE_0);
me->RemoveAurasDueToSpell(SPELL_SUBMERGE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
DoCast(SPELL_ENRAGE);
Enraged = true;
@@ -589,7 +598,8 @@ struct boss_jormungarAI : public BossAI
acidmaw->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
acidmaw->SetReactState(REACT_AGGRESSIVE);
acidmaw->SetInCombatWithZone();
acidmaw->CastSpell(acidmaw, SPELL_EMERGE_0);
acidmaw->CastSpell(acidmaw, SPELL_EMERGE);
acidmaw->CastSpell(acidmaw, SPELL_GROUND_VISUAL_1, true);
}
return;
case EVENT_SPRAY:
@@ -598,7 +608,7 @@ struct boss_jormungarAI : public BossAI
events.ScheduleEvent(EVENT_SPRAY, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS), 0, PHASE_STATIONARY);
return;
case EVENT_SWEEP:
DoCastAOE(SPELL_SWEEP_0);
DoCastAOE(SPELL_SWEEP);
events.ScheduleEvent(EVENT_SWEEP, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS), 0, PHASE_STATIONARY);
return;
default:
@@ -608,13 +618,14 @@ struct boss_jormungarAI : public BossAI
if (events.IsInPhase(PHASE_MOBILE))
DoMeleeAttackIfReady();
if (events.IsInPhase(PHASE_STATIONARY))
DoSpellAttackIfReady(SpitSpell);
DoCastVictim(SpitSpell);
}
void Submerge()
{
DoCast(me, SPELL_SUBMERGE_0);
me->RemoveAurasDueToSpell(SPELL_EMERGE_0);
DoCast(me, SPELL_SUBMERGE);
DoCast(me, SPELL_GROUND_VISUAL_0, true);
me->RemoveAurasDueToSpell(SPELL_EMERGE);
me->SetInCombatWithZone();
events.SetPhase(PHASE_SUBMERGED);
events.ScheduleEvent(EVENT_EMERGE, 5*IN_MILLISECONDS, 0, PHASE_SUBMERGED);
@@ -625,9 +636,11 @@ struct boss_jormungarAI : public BossAI
void Emerge()
{
DoCast(me, SPELL_EMERGE_0);
DoCast(me, SPELL_EMERGE);
DoCastAOE(SPELL_HATE_TO_ZERO, true);
me->SetDisplayId(ModelMobile);
me->RemoveAurasDueToSpell(SPELL_SUBMERGE_0);
me->RemoveAurasDueToSpell(SPELL_SUBMERGE);
me->RemoveAurasDueToSpell(SPELL_GROUND_VISUAL_0);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
// if the worm was mobile before submerging, make him stationary now
@@ -636,6 +649,7 @@ struct boss_jormungarAI : public BossAI
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
SetCombatMovement(false);
me->SetDisplayId(ModelStationary);
me->CastSpell(me, SPELL_GROUND_VISUAL_1, true);
events.SetPhase(PHASE_STATIONARY);
events.ScheduleEvent(EVENT_SUBMERGE, 45*IN_MILLISECONDS, 0, PHASE_STATIONARY);
events.ScheduleEvent(EVENT_SPIT, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS), 0, PHASE_STATIONARY);
@@ -648,6 +662,7 @@ struct boss_jormungarAI : public BossAI
SetCombatMovement(true);
me->GetMotionMaster()->MoveChase(me->GetVictim());
me->SetDisplayId(ModelMobile);
me->RemoveAurasDueToSpell(SPELL_GROUND_VISUAL_1);
events.SetPhase(PHASE_MOBILE);
events.ScheduleEvent(EVENT_SUBMERGE, 45*IN_MILLISECONDS, 0, PHASE_MOBILE);
events.ScheduleEvent(EVENT_BITE, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS), 0, PHASE_MOBILE);
@@ -1122,6 +1137,117 @@ class boss_icehowl : public CreatureScript
}
};
class spell_jormungars_paralytic_toxin : public SpellScriptLoader
{
public:
spell_jormungars_paralytic_toxin() : SpellScriptLoader("spell_jormungars_paralytic_toxin") { }
class spell_jormungars_paralytic_toxin_AuraScript : public AuraScript
{
PrepareAuraScript(spell_jormungars_paralytic_toxin_AuraScript);
bool Validate(SpellInfo const* /*spell*/)
{
if (!sSpellMgr->GetSpellInfo(SPELL_PARALYSIS))
return false;
return true;
}
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Unit* caster = GetCaster();
if (caster && caster->GetEntry() == NPC_ACIDMAW)
{
if (Creature* acidMaw = caster->ToCreature())
acidMaw->AI()->Talk(SAY_SPECIAL, GetTarget());
}
}
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
GetTarget()->RemoveAurasDueToSpell(SPELL_PARALYSIS);
}
void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated)
{
if (!canBeRecalculated)
amount = aurEff->GetAmount();
canBeRecalculated = false;
}
void HandleDummy(AuraEffect const* /*aurEff*/)
{
if (AuraEffect* slowEff = GetEffect(EFFECT_0))
{
int32 newAmount = slowEff->GetAmount() - 10;
if (newAmount < -100)
newAmount = -100;
slowEff->ChangeAmount(newAmount);
if (newAmount <= -100 && !GetTarget()->HasAura(SPELL_PARALYSIS))
GetTarget()->CastSpell(GetTarget(), SPELL_PARALYSIS, true, NULL, slowEff, GetCasterGUID());
}
}
void Register()
{
AfterEffectApply += AuraEffectApplyFn(spell_jormungars_paralytic_toxin_AuraScript::OnApply, EFFECT_0, SPELL_AURA_MOD_DECREASE_SPEED, AURA_EFFECT_HANDLE_REAL);
AfterEffectRemove += AuraEffectRemoveFn(spell_jormungars_paralytic_toxin_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_DECREASE_SPEED, AURA_EFFECT_HANDLE_REAL);
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_jormungars_paralytic_toxin_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_DECREASE_SPEED);
OnEffectPeriodic += AuraEffectPeriodicFn(spell_jormungars_paralytic_toxin_AuraScript::HandleDummy, EFFECT_2, SPELL_AURA_PERIODIC_DUMMY);
}
};
AuraScript* GetAuraScript() const
{
return new spell_jormungars_paralytic_toxin_AuraScript();
}
};
class spell_snakes_spray : public SpellScriptLoader
{
public:
spell_snakes_spray(const char* name, uint32 spellId) : SpellScriptLoader(name), _spellId(spellId) { }
class spell_snakes_spray_SpellScript : public SpellScript
{
PrepareSpellScript(spell_snakes_spray_SpellScript);
public:
spell_snakes_spray_SpellScript(uint32 spellId) : SpellScript(), _spellId(spellId) { }
bool Validate(SpellInfo const* /*spell*/)
{
if (!sSpellMgr->GetSpellInfo(_spellId))
return false;
return true;
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (Player* target = GetHitPlayer())
GetCaster()->CastSpell(target, _spellId, true);
}
void Register()
{
OnEffectHitTarget += SpellEffectFn(spell_snakes_spray_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
}
private:
uint32 _spellId;
};
SpellScript* GetSpellScript() const
{
return new spell_snakes_spray_SpellScript(_spellId);
}
private:
uint32 _spellId;
};
void AddSC_boss_northrend_beasts()
{
new boss_gormok();
@@ -1132,6 +1258,9 @@ void AddSC_boss_northrend_beasts()
new boss_acidmaw();
new boss_dreadscale();
new npc_slime_pool();
new spell_jormungars_paralytic_toxin();
new spell_snakes_spray("spell_burning_spray", SPELL_BURNING_BILE);
new spell_snakes_spray("spell_paralytic_spray", SPELL_PARALYTIC_TOXIN);
new boss_icehowl();
}