Scripts/UtgardeKeep: fixed some issues on Ingvar the Plunderer

Closes #10859
This commit is contained in:
joschiwald
2014-04-17 00:09:43 +02:00
parent 07fd33fa2a
commit 0a014e1431
3 changed files with 158 additions and 85 deletions

View File

@@ -0,0 +1,29 @@
DELETE FROM `spelldifficulty_dbc` WHERE `id`=42739;
INSERT INTO `spelldifficulty_dbc` (`id`, `spellid0`, `spellid1`) VALUES
(42739,42739,59736);
DELETE FROM `spell_script_names` WHERE `spell_id` IN (42730,59735,42912);
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
(42730,'spell_ingvar_woe_strike'),
(59735,'spell_ingvar_woe_strike'),
(42912,'spell_ingvar_summon_banshee');
UPDATE `creature_text` SET `entry`=23980, `groupid`=`groupid`-3 WHERE `entry`=23954 AND `groupid` IN (3,4,5);
UPDATE `creature_template` SET `flags_extra`=0 WHERE `entry` IN (23997,31835);
UPDATE `creature_template` SET `mingold`=0, `maxgold`=0, `lootid`=0 WHERE `entry` IN (23954,31673);
UPDATE `creature_template` SET `mingold`=4056, `maxgold`=6760, `lootid`=23980 WHERE `entry`=23980;
UPDATE `creature_template` SET `mingold`=8112, `maxgold`=13520, `lootid`=31674 WHERE `entry`=31674;
UPDATE `creature_loot_template` SET `entry`=23980 WHERE `entry`=23954;
UPDATE `creature_loot_template` SET `entry`=31674 WHERE `entry`=31673;
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=1 AND `SourceGroup` IN (23980,31674,23954,31673);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(1,23980,43228,0,0,1,0,57940,0,0,0,0,0,'','Can loot Stone Keeper''s Shard only with aura Essence of Wintergrasp'),
(1,31674,43228,0,0,1,0,57940,0,0,0,0,0,'','Can loot Stone Keeper''s Shard only with aura Essence of Wintergrasp');
UPDATE `instance_encounters` SET `creditEntry`=23980 WHERE `entry` IN (575,576);
UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry` IN (24068,31655);

View File

@@ -2913,15 +2913,9 @@ void SpellMgr::LoadSpellInfoCorrections()
case 53096: // Quetz'lun's Judgment
spellInfo->MaxAffectedTargets = 1;
break;
case 42730:
spellInfo->Effects[EFFECT_1].TriggerSpell = 42739;
break;
case 42436: // Drink! (Brewfest)
spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY);
break;
case 59735:
spellInfo->Effects[EFFECT_1].TriggerSpell = 59736;
break;
case 52611: // Summon Skeletons
case 52612: // Summon Skeletons
spellInfo->Effects[EFFECT_0].MiscValueB = 64;

View File

@@ -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();
}