fix(scripts/UtgardeKeep): Improve Dalronn & Skarvald (#5044)

This commit is contained in:
Silker
2021-03-28 15:30:52 -06:00
committed by GitHub
parent 9ca4a23ef3
commit 7a5e4be7a2

View File

@@ -8,49 +8,49 @@
enum eTexts
{
//signed for 24200, but used by 24200, 27390
// Skarvald
YELL_SKARVALD_AGGRO = 0,
YELL_SKARVALD_DAL_DIED = 1,
YELL_SKARVALD_SKA_DIEDFIRST = 2,
YELL_SKARVALD_KILL = 3,
YELL_SKARVALD_DAL_DIEDFIRST = 4,
//signed for 24201, but used by 24201, 27389
// Dalronn
YELL_DALRONN_AGGRO = 0,
YELL_DALRONN_SKA_DIED = 1,
YELL_DALRONN_DAL_DIEDFIRST = 2,
YELL_DALRONN_KILL = 3,
YELL_DALRONN_SKA_DIEDFIRST = 4,
YELL_DALRONN_SKA_DIEDFIRST = 4
};
enum eSpells
{
// Skarvald:
// Skarvald
SPELL_CHARGE = 43651,
SPELL_STONE_STRIKE = 48583,
SPELL_ENRAGE = 48193,
SPELL_SUMMON_SKARVALD_GHOST = 48613,
// Dalronn:
// Dalronn
SPELL_SHADOW_BOLT_N = 43649,
SPELL_SHADOW_BOLT_H = 59575,
SPELL_DEBILITATE = 43650,
SPELL_SUMMON_SKELETONS = 52611,
SPELL_SUMMON_DALRONN_GHOST = 48612,
SPELL_SUMMON_DALRONN_GHOST = 48612
};
#define SPELL_SHADOW_BOLT DUNGEON_MODE(SPELL_SHADOW_BOLT_N, SPELL_SHADOW_BOLT_H)
enum eEvents
{
EVENT_SPELL_CHARGE = 1,
EVENT_SPELL_STONE_STRIKE,
EVENT_SPELL_SHADOW_BOLT,
EVENT_SPELL_DEBILITATE,
EVENT_SPELL_SUMMON_SKELETONS,
// Skarvald
EVENT_SHARVALD_CHARGE = 1,
EVENT_STONE_STRIKE,
EVENT_ENRAGE,
// Dalronn
EVENT_SHADOW_BOLT,
EVENT_DEBILITATE,
EVENT_SUMMON_SKELETONS,
EVENT_YELL_DALRONN_AGGRO,
EVENT_MATE_DIED,
EVENT_MATE_DIED
};
class boss_skarvald_the_constructor : public CreatureScript
@@ -77,22 +77,26 @@ public:
{
me->SetLootMode(0);
events.Reset();
if( me->GetEntry() == NPC_SKARVALD )
if (me->GetEntry() == NPC_SKARVALD)
{
if (pInstance)
{
pInstance->SetData(DATA_DALRONN_AND_SKARVALD, NOT_STARTED);
}
}
else // NPC_SKARVALD_GHOST
if( Unit* target = me->SelectNearestTarget(50.0f) )
{
if (Unit* target = me->SelectNearestTarget(50.0f))
{
me->AddThreat(target, 0.0f);
AttackStart(target);
}
}
}
void DoAction(int32 param) override
{
switch(param)
switch (param)
{
case 1:
events.RescheduleEvent(EVENT_MATE_DIED, 3500);
@@ -103,39 +107,48 @@ public:
void EnterCombat(Unit* who) override
{
events.Reset();
events.RescheduleEvent(EVENT_SPELL_CHARGE, 5000);
events.RescheduleEvent(EVENT_SPELL_STONE_STRIKE, 10000);
events.RescheduleEvent(EVENT_SHARVALD_CHARGE, 5000);
events.RescheduleEvent(EVENT_STONE_STRIKE, 10000);
if (me->GetEntry() == NPC_SKARVALD)
{
Talk(YELL_SKARVALD_AGGRO);
if (IsHeroic())
{
events.ScheduleEvent(EVENT_ENRAGE, 1000);
}
}
if (pInstance)
{
pInstance->SetData(DATA_DALRONN_AND_SKARVALD, IN_PROGRESS);
if( Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_DALRONN)) )
if( !c->IsInCombat() && who )
if (Creature* dalronn = pInstance->instance->GetCreature(pInstance->GetData64(DATA_DALRONN)))
{
if (!dalronn->IsInCombat() && who)
{
c->AddThreat(who, 0.0f);
c->AI()->AttackStart(who);
dalronn->AddThreat(who, 0.0f);
dalronn->AI()->AttackStart(who);
}
}
}
}
void KilledUnit(Unit* /*victim*/) override
{
if (me->GetEntry() == NPC_SKARVALD)
{
Talk(YELL_SKARVALD_KILL);
}
}
void JustDied(Unit* /*Killer*/) override
{
if( me->GetEntry() != NPC_SKARVALD )
if (me->GetEntry() != NPC_SKARVALD)
return;
if( pInstance )
if (pInstance)
{
if( Creature* dalronn = pInstance->instance->GetCreature(pInstance->GetData64(DATA_DALRONN)) )
if (Creature* dalronn = pInstance->instance->GetCreature(pInstance->GetData64(DATA_DALRONN)))
{
if( dalronn->isDead() )
if (dalronn->isDead())
{
Talk(YELL_SKARVALD_SKA_DIEDFIRST);
pInstance->SetData(DATA_DALRONN_AND_SKARVALD, DONE);
@@ -149,7 +162,6 @@ public:
}
}
}
me->CastSpell((Unit*)nullptr, SPELL_SUMMON_SKARVALD_GHOST, true);
}
@@ -160,18 +172,18 @@ public:
events.Update(diff);
if( me->HasUnitState(UNIT_STATE_CASTING) )
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch( events.ExecuteEvent() )
switch (events.ExecuteEvent())
{
case 0:
break;
case EVENT_MATE_DIED:
Talk(YELL_SKARVALD_DAL_DIEDFIRST);
break;
case EVENT_SPELL_CHARGE:
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, (IsHeroic() ? 100.0f : 30.0f), true) )
case EVENT_SHARVALD_CHARGE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, (IsHeroic() ? 100.0f : 30.0f), true))
{
ScriptedAI::DoResetThreat();
me->AddThreat(target, 10000.0f);
@@ -179,17 +191,26 @@ public:
}
events.RepeatEvent(urand(5000, 10000));
break;
case EVENT_SPELL_STONE_STRIKE:
if( me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim()) )
case EVENT_STONE_STRIKE:
if (me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim()))
{
me->CastSpell(me->GetVictim(), SPELL_STONE_STRIKE, false);
events.RepeatEvent(urand(5000, 10000));
}
else
{
events.RepeatEvent(3000);
}
break;
case EVENT_ENRAGE:
if (me->GetHealthPct() <= 60)
{
me->CastSpell(me, SPELL_ENRAGE, true);
break;
}
events.RepeatEvent(1000);
break;
}
DoMeleeAttackIfReady();
}
};
@@ -221,22 +242,26 @@ public:
me->SetLootMode(0);
events.Reset();
summons.DespawnAll();
if( me->GetEntry() == NPC_DALRONN )
if (me->GetEntry() == NPC_DALRONN)
{
if (pInstance)
{
pInstance->SetData(DATA_DALRONN_AND_SKARVALD, NOT_STARTED);
}
}
else // NPC_DALRONN_GHOST
if( Unit* target = me->SelectNearestTarget(50.0f) )
{
if (Unit* target = me->SelectNearestTarget(50.0f))
{
me->AddThreat(target, 0.0f);
AttackStart(target);
}
}
}
void DoAction(int32 param) override
{
switch(param)
switch (param)
{
case -1:
summons.DespawnAll();
@@ -250,46 +275,54 @@ public:
void EnterCombat(Unit* who) override
{
events.Reset();
events.RescheduleEvent(EVENT_SPELL_SHADOW_BOLT, 1000);
events.RescheduleEvent(EVENT_SPELL_DEBILITATE, 5000);
if( IsHeroic() )
events.RescheduleEvent(EVENT_SPELL_SUMMON_SKELETONS, 10000);
events.RescheduleEvent(EVENT_SHADOW_BOLT, 1000);
events.RescheduleEvent(EVENT_DEBILITATE, 5000);
if (IsHeroic())
{
events.RescheduleEvent(EVENT_SUMMON_SKELETONS, 10000);
}
if (me->GetEntry() == NPC_DALRONN)
{
events.RescheduleEvent(EVENT_YELL_DALRONN_AGGRO, 4999);
}
if (pInstance)
{
pInstance->SetData(DATA_DALRONN_AND_SKARVALD, IN_PROGRESS);
if( Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_SKARVALD)) )
if( !c->IsInCombat() && who )
if (Creature* skarvald = pInstance->instance->GetCreature(pInstance->GetData64(DATA_SKARVALD)))
{
if (!skarvald->IsInCombat() && who)
{
c->AddThreat(who, 0.0f);
c->AI()->AttackStart(who);
skarvald->AddThreat(who, 0.0f);
skarvald->AI()->AttackStart(who);
}
}
}
}
void KilledUnit(Unit* /*victim*/) override
{
if (me->GetEntry() == NPC_DALRONN)
{
Talk(YELL_DALRONN_KILL);
}
}
void JustSummoned(Creature* s) override
void JustSummoned(Creature* minions) override
{
summons.Summon(s);
summons.Summon(minions);
minions->SetInCombatWithZone();
}
void JustDied(Unit* /*Killer*/) override
{
if( me->GetEntry() != NPC_DALRONN )
if (me->GetEntry() != NPC_DALRONN)
return;
if( pInstance )
if (pInstance)
{
if( Creature* skarvald = pInstance->instance->GetCreature(pInstance->GetData64(DATA_SKARVALD)) )
if (Creature* skarvald = pInstance->instance->GetCreature(pInstance->GetData64(DATA_SKARVALD)))
{
if( skarvald->isDead() )
if (skarvald->isDead())
{
Talk(YELL_DALRONN_DAL_DIEDFIRST);
pInstance->SetData(DATA_DALRONN_AND_SKARVALD, DONE);
@@ -312,11 +345,10 @@ public:
return;
events.Update(diff);
if( me->HasUnitState(UNIT_STATE_CASTING) )
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch( events.ExecuteEvent() )
switch (events.ExecuteEvent())
{
case 0:
break;
@@ -326,26 +358,29 @@ public:
case EVENT_MATE_DIED:
Talk(YELL_DALRONN_SKA_DIEDFIRST);
break;
case EVENT_SPELL_SHADOW_BOLT:
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 42.0f, true) )
me->CastSpell(target, SPELL_SHADOW_BOLT, false);
events.RepeatEvent(2500);
case EVENT_SHADOW_BOLT:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
{
me->CastSpell(target, DUNGEON_MODE(SPELL_SHADOW_BOLT_N, SPELL_SHADOW_BOLT_H), false);
}
events.RepeatEvent(2050);
break;
case EVENT_SPELL_DEBILITATE:
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true) )
case EVENT_DEBILITATE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true))
{
me->CastSpell(target, SPELL_DEBILITATE, false);
events.RepeatEvent(urand(5000, 10000));
}
else
{
events.RepeatEvent(3000);
}
break;
case EVENT_SPELL_SUMMON_SKELETONS:
case EVENT_SUMMON_SKELETONS:
me->CastSpell((Unit*)nullptr, SPELL_SUMMON_SKELETONS, false);
events.RepeatEvent(urand(20000, 30000));
break;
}
DoMeleeAttackIfReady();
}
};