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