diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp index 1f5698cf6..66d4429ec 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp @@ -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(); } };