mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-16 02:20:27 +00:00
fix(scripts/UtgardeKeep): Improve Dalronn & Skarvald (#5044)
This commit is contained in:
@@ -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();
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user