mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-21 17:54:48 +01:00
Scripts/UtgardeKeep: fixed some issues on Ingvar the Plunderer
Closes #10859
This commit is contained in:
@@ -18,28 +18,25 @@
|
||||
/* ScriptData
|
||||
SDName: Boss_Ingvar_The_Plunderer
|
||||
SD%Complete: 95
|
||||
SDComment: Some Problems with Annhylde Movement, Blizzlike Timers (just shadow axe summon needs a new timer)
|
||||
SDCategory: Udgarde Keep
|
||||
SDComment: Blizzlike Timers (just shadow axe summon needs a new timer)
|
||||
SDCategory: Utgarde Keep
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "SpellScript.h"
|
||||
#include "SpellAuraEffects.h"
|
||||
#include "utgarde_keep.h"
|
||||
|
||||
enum Yells
|
||||
{
|
||||
// Ingvar (Human)
|
||||
SAY_AGGRO_1 = 0,
|
||||
SAY_SLAY_1 = 1,
|
||||
SAY_DEATH_1 = 2,
|
||||
|
||||
// Ingvar (Undead)
|
||||
SAY_AGGRO_2 = 3,
|
||||
SAY_SLAY_2 = 4,
|
||||
SAY_DEATH_2 = 5,
|
||||
// Ingvar (Human/Undead)
|
||||
SAY_AGGRO = 0,
|
||||
SAY_SLAY = 1,
|
||||
SAY_DEATH = 2,
|
||||
|
||||
// Annhylde The Caller
|
||||
YELL_RESURRECT = 0
|
||||
YELL_RESURRECT = 0
|
||||
};
|
||||
|
||||
enum Events
|
||||
@@ -83,8 +80,10 @@ enum Spells
|
||||
SPELL_DARK_SMASH = 42723,
|
||||
SPELL_DREADFUL_ROAR = 42729,
|
||||
SPELL_WOE_STRIKE = 42730,
|
||||
SPELL_WOE_STRIKE_EFFECT = 42739,
|
||||
|
||||
SPELL_SHADOW_AXE_SUMMON = 42748,
|
||||
SPELL_SHADOW_AXE_PERIODIC_DAMAGE = 42750,
|
||||
|
||||
// Spells for Annhylde
|
||||
SPELL_SCOURG_RESURRECTION_HEAL = 42704, // Heal Max + DummyAura
|
||||
@@ -105,16 +104,14 @@ class boss_ingvar_the_plunderer : public CreatureScript
|
||||
|
||||
struct boss_ingvar_the_plundererAI : public BossAI
|
||||
{
|
||||
boss_ingvar_the_plundererAI(Creature* creature) : BossAI(creature, DATA_INGVAR)
|
||||
{
|
||||
_isUndead = false;
|
||||
}
|
||||
boss_ingvar_the_plundererAI(Creature* creature) : BossAI(creature, DATA_INGVAR) { }
|
||||
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
_isUndead = false;
|
||||
if (me->GetEntry() != NPC_INGVAR)
|
||||
me->UpdateEntry(NPC_INGVAR);
|
||||
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE);
|
||||
|
||||
_Reset();
|
||||
events.SetPhase(PHASE_HUMAN);
|
||||
@@ -132,12 +129,12 @@ class boss_ingvar_the_plunderer : public CreatureScript
|
||||
me->RemoveAllAuras();
|
||||
DoCast(me, SPELL_INGVAR_FEIGN_DEATH, true);
|
||||
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE);
|
||||
|
||||
events.SetPhase(PHASE_EVENT);
|
||||
events.ScheduleEvent(EVENT_SUMMON_BANSHEE, 3 * IN_MILLISECONDS, 0, PHASE_EVENT);
|
||||
|
||||
Talk(SAY_DEATH_1);
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
if (events.IsInPhase(PHASE_EVENT))
|
||||
@@ -152,26 +149,22 @@ class boss_ingvar_the_plunderer : public CreatureScript
|
||||
|
||||
void StartZombiePhase()
|
||||
{
|
||||
_isUndead = true;
|
||||
me->RemoveAura(SPELL_INGVAR_FEIGN_DEATH);
|
||||
DoCast(me, SPELL_INGVAR_TRANSFORM, true); /// @todo: should be death persistent
|
||||
DoCast(me, SPELL_INGVAR_TRANSFORM, true);
|
||||
me->UpdateEntry(NPC_INGVAR_UNDEAD);
|
||||
events.ScheduleEvent(EVENT_JUST_TRANSFORMED, 2 * IN_MILLISECONDS, 0, PHASE_EVENT);
|
||||
|
||||
Talk(SAY_AGGRO_2);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE
|
||||
{
|
||||
_EnterCombat();
|
||||
|
||||
if (!_isUndead)
|
||||
Talk(SAY_AGGRO_1);
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) OVERRIDE
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH_2);
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void ScheduleSecondPhase()
|
||||
@@ -183,9 +176,10 @@ class boss_ingvar_the_plunderer : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_SHADOW_AXE, 30*IN_MILLISECONDS, 0, PHASE_UNDEAD);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(_isUndead ? SAY_SLAY_1 : SAY_SLAY_2);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) OVERRIDE
|
||||
@@ -220,7 +214,7 @@ class boss_ingvar_the_plunderer : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_SMASH, urand(12, 16)*IN_MILLISECONDS, 0, PHASE_HUMAN);
|
||||
break;
|
||||
case EVENT_JUST_TRANSFORMED:
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE);
|
||||
DoZoneInCombat();
|
||||
ScheduleSecondPhase();
|
||||
return;
|
||||
@@ -241,20 +235,18 @@ class boss_ingvar_the_plunderer : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10, 14)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
|
||||
break;
|
||||
case EVENT_SHADOW_AXE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1))
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
|
||||
DoCast(target, SPELL_SHADOW_AXE_SUMMON);
|
||||
|
||||
events.ScheduleEvent(EVENT_SHADOW_AXE, 30*IN_MILLISECONDS, 0, PHASE_UNDEAD);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!events.IsInPhase(PHASE_EVENT))
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
bool _isUndead;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
@@ -279,12 +271,8 @@ class npc_annhylde_the_caller : public CreatureScript
|
||||
{
|
||||
_events.Reset();
|
||||
|
||||
//! HACK: Creature's can't have MOVEMENTFLAG_FLYING
|
||||
me->SetHover(true);
|
||||
|
||||
me->GetPosition(x, y, z);
|
||||
DoTeleportTo(x+1, y, z+30);
|
||||
me->GetMotionMaster()->MovePoint(1, x, y, z+15);
|
||||
me->GetMotionMaster()->MovePoint(1, x, y, z - 15.0f);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id) OVERRIDE
|
||||
@@ -339,7 +327,7 @@ class npc_annhylde_the_caller : public CreatureScript
|
||||
ingvar->AI()->DoAction(ACTION_START_PHASE_2);
|
||||
}
|
||||
|
||||
me->GetMotionMaster()->MovePoint(2, x+1, y, z+30);
|
||||
me->GetMotionMaster()->MovePoint(2, x, y, z + 15.0f);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -359,52 +347,112 @@ class npc_annhylde_the_caller : public CreatureScript
|
||||
}
|
||||
};
|
||||
|
||||
enum ShadowAxe
|
||||
{
|
||||
SPELL_SHADOW_AXE_DAMAGE = 42750,
|
||||
H_SPELL_SHADOW_AXE_DAMAGE = 59719,
|
||||
POINT_TARGET = 28
|
||||
};
|
||||
|
||||
class npc_ingvar_throw_dummy : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_ingvar_throw_dummy() : CreatureScript("npc_ingvar_throw_dummy") { }
|
||||
public:
|
||||
npc_ingvar_throw_dummy() : CreatureScript("npc_ingvar_throw_dummy") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new npc_ingvar_throw_dummyAI(creature);
|
||||
}
|
||||
|
||||
struct npc_ingvar_throw_dummyAI : public ScriptedAI
|
||||
{
|
||||
npc_ingvar_throw_dummyAI(Creature* creature) : ScriptedAI(creature)
|
||||
struct npc_ingvar_throw_dummyAI : public ScriptedAI
|
||||
{
|
||||
}
|
||||
npc_ingvar_throw_dummyAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
if (Creature* target = me->FindNearestCreature(NPC_THROW_TARGET, 50.0f))
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
float x, y, z;
|
||||
target->GetPosition(x, y, z);
|
||||
me->GetMotionMaster()->MoveCharge(x, y, z, 42.0f, POINT_TARGET);
|
||||
target->DisappearAndDie();
|
||||
}
|
||||
else
|
||||
me->DisappearAndDie();
|
||||
}
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
|
||||
void MovementInform(uint32 type, uint32 id) OVERRIDE
|
||||
{
|
||||
if (type == EFFECT_MOTION_TYPE && id == POINT_TARGET)
|
||||
{
|
||||
DoCast(me, SPELL_SHADOW_AXE_DAMAGE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
me->DespawnOrUnsummon(10000);
|
||||
if (Creature* target = me->FindNearestCreature(NPC_THROW_TARGET, 200.0f))
|
||||
{
|
||||
float x, y, z;
|
||||
target->GetPosition(x, y, z);
|
||||
me->GetMotionMaster()->MoveCharge(x, y, z);
|
||||
target->DespawnOrUnsummon();
|
||||
}
|
||||
else
|
||||
me->DespawnOrUnsummon();
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id) OVERRIDE
|
||||
{
|
||||
if (type == EFFECT_MOTION_TYPE && id == EVENT_CHARGE)
|
||||
{
|
||||
me->CastSpell(me, SPELL_SHADOW_AXE_PERIODIC_DAMAGE, true);
|
||||
me->DespawnOrUnsummon(10000);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new npc_ingvar_throw_dummyAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
// 42912 - Summon Banshee
|
||||
class spell_ingvar_summon_banshee : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_ingvar_summon_banshee() : SpellScriptLoader("spell_ingvar_summon_banshee") { }
|
||||
|
||||
class spell_ingvar_summon_banshee_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_ingvar_summon_banshee_SpellScript);
|
||||
|
||||
void SetDest(SpellDestination& dest)
|
||||
{
|
||||
dest.RelocateOffset({ 0.0f, 0.0f, 30.0f, 0.0f });
|
||||
}
|
||||
|
||||
void Register() OVERRIDE
|
||||
{
|
||||
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_ingvar_summon_banshee_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_BACK);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const OVERRIDE
|
||||
{
|
||||
return new spell_ingvar_summon_banshee_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
// 42730, 59735 - Woe Strike
|
||||
class spell_ingvar_woe_strike : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_ingvar_woe_strike() : SpellScriptLoader("spell_ingvar_woe_strike") { }
|
||||
|
||||
class spell_ingvar_woe_strike_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_ingvar_woe_strike_AuraScript);
|
||||
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
|
||||
{
|
||||
if (!sSpellMgr->GetSpellInfo(SPELL_WOE_STRIKE_EFFECT))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CheckProc(ProcEventInfo& eventInfo)
|
||||
{
|
||||
return eventInfo.GetHealInfo()->GetHeal();
|
||||
}
|
||||
|
||||
void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
GetTarget()->CastSpell(eventInfo.GetActor(), SPELL_WOE_STRIKE_EFFECT, true, NULL, aurEff);
|
||||
}
|
||||
|
||||
void Register() OVERRIDE
|
||||
{
|
||||
DoCheckProc += AuraCheckProcFn(spell_ingvar_woe_strike_AuraScript::CheckProc);
|
||||
OnEffectProc += AuraEffectProcFn(spell_ingvar_woe_strike_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const OVERRIDE
|
||||
{
|
||||
return new spell_ingvar_woe_strike_AuraScript();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_boss_ingvar_the_plunderer()
|
||||
@@ -412,4 +460,6 @@ void AddSC_boss_ingvar_the_plunderer()
|
||||
new boss_ingvar_the_plunderer();
|
||||
new npc_annhylde_the_caller();
|
||||
new npc_ingvar_throw_dummy();
|
||||
new spell_ingvar_summon_banshee();
|
||||
new spell_ingvar_woe_strike();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user