aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp1104
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h4
2 files changed, 515 insertions, 593 deletions
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
index 3e4fcfe3d94..7fc3fb836d9 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
@@ -15,14 +15,14 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "ScriptMgr.h"
+#include "pit_of_saron.h"
#include "InstanceScript.h"
#include "Map.h"
#include "MotionMaster.h"
#include "ObjectAccessor.h"
-#include "pit_of_saron.h"
#include "Player.h"
#include "ScriptedCreature.h"
+#include "ScriptMgr.h"
#include "SpellInfo.h"
#include "SpellScript.h"
#include "TemporarySummon.h"
@@ -30,712 +30,630 @@
enum Spells
{
- SPELL_MIGHTY_KICK = 69021, //ick's spell
- SPELL_SHADOW_BOLT = 69028, //krick's spell
- SPELL_TOXIC_WASTE = 69024, //krick's spell
- SPELL_EXPLOSIVE_BARRAGE_KRICK = 69012, //special spell 1
- SPELL_EXPLOSIVE_BARRAGE_ICK = 69263, //special spell 1
- SPELL_POISON_NOVA = 68989, //special spell 2
- SPELL_PURSUIT = 68987, //special spell 3
-
- SPELL_EXPLOSIVE_BARRAGE_SUMMON = 69015,
- SPELL_EXPLODING_ORB = 69017, //visual on exploding orb
- SPELL_AUTO_GROW = 69020, //grow effect on exploding orb
- SPELL_HASTY_GROW = 44851, //need to check growing stacks
- SPELL_EXPLOSIVE_BARRAGE_DAMAGE = 69019, //damage done by orb while exploding
-
- SPELL_STRANGULATING = 69413, //krick's selfcast in intro
- SPELL_SUICIDE = 7,
- SPELL_KRICK_KILL_CREDIT = 71308,
- SPELL_NECROMANTIC_POWER = 69753
+ SPELL_MIGHTY_KICK = 69021, // ick's spell
+ SPELL_SHADOW_BOLT = 69028, // krick's spell
+ SPELL_TOXIC_WASTE = 69024, // krick's spell
+ SPELL_EXPLOSIVE_BARRAGE_KRICK = 69012, // special spell 1
+ SPELL_EXPLOSIVE_BARRAGE_ICK = 69263, // special spell 1
+ SPELL_POISON_NOVA = 68989, // special spell 2
+ SPELL_PURSUIT = 68987, // special spell 3
+
+ SPELL_EXPLOSIVE_BARRAGE_SUMMON = 69015,
+ SPELL_EXPLODING_ORB = 69017, // visual on exploding orb
+ SPELL_AUTO_GROW = 69020, // grow effect on exploding orb
+ SPELL_HASTY_GROW = 44851, // need to check growing stacks
+ SPELL_EXPLOSIVE_BARRAGE_DAMAGE = 69019, // damage done by orb while exploding
+
+ SPELL_STRANGULATING = 69413, // krick's selfcast in intro
+ SPELL_SUICIDE = 7,
+ SPELL_KRICK_KILL_CREDIT = 71308,
+ SPELL_NECROMANTIC_POWER = 69753
};
enum Yells
{
// Krick
- SAY_KRICK_AGGRO = 0,
- SAY_KRICK_SLAY = 1,
- SAY_KRICK_BARRAGE_1 = 2,
- SAY_KRICK_BARRAGE_2 = 3,
- SAY_KRICK_POISON_NOVA = 4,
- SAY_KRICK_CHASE = 5,
- SAY_KRICK_OUTRO_1 = 6,
- SAY_KRICK_OUTRO_3 = 7,
- SAY_KRICK_OUTRO_5 = 8,
- SAY_KRICK_OUTRO_8 = 9,
+ SAY_KRICK_AGGRO = 0,
+ SAY_KRICK_SLAY = 1,
+ SAY_KRICK_BARRAGE_1 = 2,
+ SAY_KRICK_BARRAGE_2 = 3,
+ SAY_KRICK_POISON_NOVA = 4,
+ SAY_KRICK_CHASE = 5,
+ SAY_KRICK_OUTRO_1 = 6,
+ SAY_KRICK_OUTRO_3 = 7,
+ SAY_KRICK_OUTRO_5 = 8,
+ SAY_KRICK_OUTRO_8 = 9,
// Ick
- SAY_ICK_POISON_NOVA = 0,
- SAY_ICK_CHASE_1 = 1,
+ SAY_ICK_POISON_NOVA = 0,
+ SAY_ICK_CHASE_1 = 1,
// OUTRO
- SAY_JAYNA_OUTRO_2 = 0,
- SAY_JAYNA_OUTRO_4 = 1,
- SAY_JAYNA_OUTRO_10 = 2,
- SAY_SYLVANAS_OUTRO_2 = 0,
- SAY_SYLVANAS_OUTRO_4 = 1,
- SAY_SYLVANAS_OUTRO_10 = 2,
- SAY_TYRANNUS_OUTRO_7 = 1,
- SAY_TYRANNUS_OUTRO_9 = 2
+ SAY_JAYNA_OUTRO_2 = 0,
+ SAY_JAYNA_OUTRO_4 = 1,
+ SAY_JAYNA_OUTRO_10 = 2,
+ SAY_SYLVANAS_OUTRO_2 = 0,
+ SAY_SYLVANAS_OUTRO_4 = 1,
+ SAY_SYLVANAS_OUTRO_10 = 2,
+ SAY_TYRANNUS_OUTRO_7 = 1,
+ SAY_TYRANNUS_OUTRO_9 = 2
};
enum Events
{
- EVENT_MIGHTY_KICK = 1,
- EVENT_SHADOW_BOLT = 2,
- EVENT_TOXIC_WASTE = 3,
- EVENT_SPECIAL = 4, //special spell selection (one of event 5, 6 or 7)
- EVENT_PURSUIT = 5,
- EVENT_POISON_NOVA = 6,
- EVENT_EXPLOSIVE_BARRAGE = 7,
+ EVENT_MIGHTY_KICK = 1,
+ EVENT_SHADOW_BOLT,
+ EVENT_TOXIC_WASTE,
+ EVENT_SPECIAL, // special spell selection (one of event EVENT_PURSUIT, EVENT_POISON_NOVA or EVENT_EXPLOSIVE_BARRAGE)
+ EVENT_PURSUIT,
+ EVENT_POISON_NOVA,
+ EVENT_EXPLOSIVE_BARRAGE,
// Krick OUTRO
- EVENT_OUTRO_1 = 8,
- EVENT_OUTRO_2 = 9,
- EVENT_OUTRO_3 = 10,
- EVENT_OUTRO_4 = 11,
- EVENT_OUTRO_5 = 12,
- EVENT_OUTRO_6 = 13,
- EVENT_OUTRO_7 = 14,
- EVENT_OUTRO_8 = 15,
- EVENT_OUTRO_9 = 16,
- EVENT_OUTRO_10 = 17,
- EVENT_OUTRO_11 = 18,
- EVENT_OUTRO_12 = 19,
- EVENT_OUTRO_13 = 20,
- EVENT_OUTRO_END = 21
+ EVENT_OUTRO_1,
+ EVENT_OUTRO_2,
+ EVENT_OUTRO_3,
+ EVENT_OUTRO_4,
+ EVENT_OUTRO_5,
+ EVENT_OUTRO_6,
+ EVENT_OUTRO_7,
+ EVENT_OUTRO_8,
+ EVENT_OUTRO_9,
+ EVENT_OUTRO_10,
+ EVENT_OUTRO_11,
+ EVENT_OUTRO_12,
+ EVENT_OUTRO_13,
+ EVENT_OUTRO_END
};
enum KrickPhase
{
- PHASE_COMBAT = 1,
- PHASE_OUTRO = 2
+ PHASE_COMBAT = 1,
+ PHASE_OUTRO = 2
};
enum Actions
{
- ACTION_OUTRO = 1,
+ ACTION_OUTRO = 1,
ACTION_STORE_OLD_TARGET,
ACTION_RESET_THREAT
};
enum Points
{
- POINT_KRICK_INTRO = 364770,
- POINT_KRICK_DEATH = 364771
+ POINT_KRICK_INTRO = 364770,
+ POINT_KRICK_DEATH = 364771
};
-static const Position outroPos[8] =
+static Position const outroPos[8] =
{
- {828.9342f, 118.6247f, 509.5190f, 0.0000000f}, // Krick's Outro Position
- {841.0100f, 196.2450f, 573.9640f, 0.2046099f}, // Scourgelord Tyrannus Outro Position (Tele to...)
- {777.2274f, 119.5521f, 510.0363f, 6.0562930f}, // Sylvanas / Jaine Outro Spawn Position (NPC_SYLVANAS_PART1)
- {823.3984f, 114.4907f, 509.4899f, 0.0000000f}, // Sylvanas / Jaine Outro Move Position (1)
- {835.5887f, 139.4345f, 530.9526f, 0.0000000f}, // Tyrannus fly down Position (not sniffed)
- {828.9342f, 118.6247f, 514.5190f, 0.0000000f}, // Krick's Choke Position
- {828.9342f, 118.6247f, 509.4958f, 0.0000000f}, // Kirck's Death Position
- {914.4820f, 143.1602f, 633.3624f, 0.0000000f} // Tyrannus fly up (not sniffed)
+ { 828.9342f, 118.6247f, 509.5190f, 0.0000000f }, // Krick's Outro Position
+ { 841.0100f, 196.2450f, 573.9640f, 0.2046099f }, // Scourgelord Tyrannus Outro Position (Tele to...)
+ { 777.2274f, 119.5521f, 510.0363f, 6.0562930f }, // Sylvanas / Jaine Outro Spawn Position (NPC_SYLVANAS_PART1)
+ { 823.3984f, 114.4907f, 509.4899f, 0.0000000f }, // Sylvanas / Jaine Outro Move Position (1)
+ { 835.5887f, 139.4345f, 530.9526f, 0.0000000f }, // Tyrannus fly down Position (not sniffed)
+ { 828.9342f, 118.6247f, 514.5190f, 0.0000000f }, // Krick's Choke Position
+ { 828.9342f, 118.6247f, 509.4958f, 0.0000000f }, // Kirck's Death Position
+ { 914.4820f, 143.1602f, 633.3624f, 0.0000000f } // Tyrannus fly up (not sniffed)
};
-class boss_ick : public CreatureScript
+struct boss_ick : public BossAI
{
- public:
- boss_ick() : CreatureScript("boss_ick") { }
-
- struct boss_ickAI : public BossAI
+ boss_ick(Creature* creature) : BossAI(creature, DATA_ICK)
+ {
+ _tempThreat = 0.0f;
+ }
+
+ void Reset() override
+ {
+ events.Reset();
+ instance->SetBossState(DATA_ICK, NOT_STARTED);
+ _oldTargetGUID.Clear();
+ _tempThreat = 0.0f;
+ }
+
+ Creature* GetKrick()
+ {
+ return ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KRICK));
+ }
+
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ _JustEngagedWith();
+
+ if (Creature* krick = GetKrick())
+ krick->AI()->Talk(SAY_KRICK_AGGRO);
+
+ events.ScheduleEvent(EVENT_MIGHTY_KICK, 20s);
+ events.ScheduleEvent(EVENT_TOXIC_WASTE, 5s);
+ events.ScheduleEvent(EVENT_SHADOW_BOLT, 10s);
+ events.ScheduleEvent(EVENT_SPECIAL, 30s, 35s);
+ }
+
+ void EnterEvadeMode(EvadeReason why) override
+ {
+ me->GetMotionMaster()->Clear();
+ ScriptedAI::EnterEvadeMode(why);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ if (Creature* krick = GetKrick())
{
- boss_ickAI(Creature* creature) : BossAI(creature, DATA_ICK)
- {
- _tempThreat = 0.0f;
- }
+ if (Vehicle* _vehicle = me->GetVehicleKit())
+ _vehicle->RemoveAllPassengers();
+ if (krick->AI())
+ krick->AI()->DoAction(ACTION_OUTRO);
+ }
- void Reset() override
- {
- events.Reset();
- instance->SetBossState(DATA_ICK, NOT_STARTED);
- _oldTargetGUID.Clear();
- _tempThreat = 0.0f;
- }
+ instance->SetBossState(DATA_ICK, DONE);
+ }
- Creature* GetKrick()
+ void DoAction(int32 actionId) override
+ {
+ if (actionId == ACTION_STORE_OLD_TARGET)
+ {
+ if (Unit* victim = me->GetVictim())
{
- return ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KRICK));
+ _oldTargetGUID = victim->GetGUID();
+ _tempThreat = GetThreat(victim);
}
-
- void JustEngagedWith(Unit* /*who*/) override
+ }
+ else if (actionId == ACTION_RESET_THREAT)
+ {
+ if (Unit* oldTarget = ObjectAccessor::GetUnit(*me, _oldTargetGUID))
{
- _JustEngagedWith();
-
- if (Creature* krick = GetKrick())
- krick->AI()->Talk(SAY_KRICK_AGGRO);
-
- events.ScheduleEvent(EVENT_MIGHTY_KICK, 20s);
- events.ScheduleEvent(EVENT_TOXIC_WASTE, 5s);
- events.ScheduleEvent(EVENT_SHADOW_BOLT, 10s);
- events.ScheduleEvent(EVENT_SPECIAL, 30s, 35s);
- }
+ if (Unit* current = me->GetVictim())
+ ModifyThreatByPercent(current, -100);
- void EnterEvadeMode(EvadeReason why) override
- {
- me->GetMotionMaster()->Clear();
- ScriptedAI::EnterEvadeMode(why);
+ AddThreat(oldTarget, _tempThreat);
+ AttackStart(oldTarget);
+ _oldTargetGUID.Clear();
+ _tempThreat = 0.0f;
}
+ }
+ }
- void JustDied(Unit* /*killer*/) override
- {
- if (Creature* krick = GetKrick())
- {
- if (Vehicle* _vehicle = me->GetVehicleKit())
- _vehicle->RemoveAllPassengers();
- if (krick->AI())
- krick->AI()->DoAction(ACTION_OUTRO);
- }
-
- instance->SetBossState(DATA_ICK, DONE);
- }
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- void DoAction(int32 actionId) override
- {
- if (actionId == ACTION_STORE_OLD_TARGET)
- {
- if (Unit* victim = me->GetVictim())
- {
- _oldTargetGUID = victim->GetGUID();
- _tempThreat = GetThreat(victim);
- }
- }
- else if (actionId == ACTION_RESET_THREAT)
- {
- if (Unit* oldTarget = ObjectAccessor::GetUnit(*me, _oldTargetGUID))
- {
- if (Unit* current = me->GetVictim())
- ModifyThreatByPercent(current, -100);
+ events.Update(diff);
- AddThreat(oldTarget, _tempThreat);
- AttackStart(oldTarget);
- _oldTargetGUID.Clear();
- _tempThreat = 0.0f;
- }
- }
- }
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- void UpdateAI(uint32 diff) override
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- if (!UpdateVictim())
+ case EVENT_TOXIC_WASTE:
+ if (Creature* krick = GetKrick())
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ krick->CastSpell(target, SPELL_TOXIC_WASTE);
+ events.ScheduleEvent(EVENT_TOXIC_WASTE, 7s, 10s);
+ break;
+ case EVENT_SHADOW_BOLT:
+ if (Creature* krick = GetKrick())
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
+ krick->CastSpell(target, SPELL_SHADOW_BOLT);
+ events.ScheduleEvent(EVENT_SHADOW_BOLT, 15s);
return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
+ case EVENT_MIGHTY_KICK:
+ DoCastVictim(SPELL_MIGHTY_KICK);
+ events.ScheduleEvent(EVENT_MIGHTY_KICK, 25s);
return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
+ case EVENT_SPECIAL:
+ //select one of these three special events
+ events.ScheduleEvent(RAND(EVENT_EXPLOSIVE_BARRAGE, EVENT_POISON_NOVA, EVENT_PURSUIT), 1000);
+ events.ScheduleEvent(EVENT_SPECIAL, 23s, 28s);
+ break;
+ case EVENT_EXPLOSIVE_BARRAGE:
+ if (Creature* krick = GetKrick())
{
- case EVENT_TOXIC_WASTE:
- if (Creature* krick = GetKrick())
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- krick->CastSpell(target, SPELL_TOXIC_WASTE);
- events.ScheduleEvent(EVENT_TOXIC_WASTE, 7s, 10s);
- break;
- case EVENT_SHADOW_BOLT:
- if (Creature* krick = GetKrick())
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
- krick->CastSpell(target, SPELL_SHADOW_BOLT);
- events.ScheduleEvent(EVENT_SHADOW_BOLT, 15s);
- return;
- case EVENT_MIGHTY_KICK:
- DoCastVictim(SPELL_MIGHTY_KICK);
- events.ScheduleEvent(EVENT_MIGHTY_KICK, 25s);
- return;
- case EVENT_SPECIAL:
- //select one of these three special events
- events.ScheduleEvent(RAND(EVENT_EXPLOSIVE_BARRAGE, EVENT_POISON_NOVA, EVENT_PURSUIT), 1000);
- events.ScheduleEvent(EVENT_SPECIAL, 23s, 28s);
- break;
- case EVENT_EXPLOSIVE_BARRAGE:
- if (Creature* krick = GetKrick())
- {
- krick->AI()->Talk(SAY_KRICK_BARRAGE_1);
- krick->AI()->Talk(SAY_KRICK_BARRAGE_2);
- krick->CastSpell(krick, SPELL_EXPLOSIVE_BARRAGE_KRICK, true);
- DoCastAOE(SPELL_EXPLOSIVE_BARRAGE_ICK);
- }
- events.DelayEvents(20000);
- break;
- case EVENT_POISON_NOVA:
- if (Creature* krick = GetKrick())
- krick->AI()->Talk(SAY_KRICK_POISON_NOVA);
-
- Talk(SAY_ICK_POISON_NOVA);
- DoCastAOE(SPELL_POISON_NOVA);
- break;
- case EVENT_PURSUIT:
- if (Creature* krick = GetKrick())
- krick->AI()->Talk(SAY_KRICK_CHASE);
- DoCastSelf(SPELL_PURSUIT, { SPELLVALUE_MAX_TARGETS, 1 });
- break;
- default:
- break;
+ krick->AI()->Talk(SAY_KRICK_BARRAGE_1);
+ krick->AI()->Talk(SAY_KRICK_BARRAGE_2);
+ krick->CastSpell(krick, SPELL_EXPLOSIVE_BARRAGE_KRICK, true);
+ DoCastAOE(SPELL_EXPLOSIVE_BARRAGE_ICK);
}
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- }
-
- DoMeleeAttackIfReady();
+ events.DelayEvents(20000);
+ break;
+ case EVENT_POISON_NOVA:
+ if (Creature* krick = GetKrick())
+ krick->AI()->Talk(SAY_KRICK_POISON_NOVA);
+
+ Talk(SAY_ICK_POISON_NOVA);
+ DoCastAOE(SPELL_POISON_NOVA);
+ break;
+ case EVENT_PURSUIT:
+ if (Creature* krick = GetKrick())
+ krick->AI()->Talk(SAY_KRICK_CHASE);
+ DoCastSelf(SPELL_PURSUIT, { SPELLVALUE_MAX_TARGETS, 1 });
+ break;
+ default:
+ break;
}
- private:
- float _tempThreat;
- ObjectGuid _oldTargetGUID;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetPitOfSaronAI<boss_ickAI>(creature);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
+
+ DoMeleeAttackIfReady();
+ }
+
+private:
+ float _tempThreat;
+ ObjectGuid _oldTargetGUID;
};
-class boss_krick : public CreatureScript
+struct boss_krick : public ScriptedAI
{
- public:
- boss_krick() : CreatureScript("boss_krick") { }
-
- struct boss_krickAI : public ScriptedAI
+ boss_krick(Creature* creature) : ScriptedAI(creature), _instanceScript(creature->GetInstanceScript()), _summons(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _phase = PHASE_COMBAT;
+ _outroNpcGUID.Clear();
+ _tyrannusGUID.Clear();
+ }
+
+ void Reset() override
+ {
+ _events.Reset();
+ Initialize();
+
+ me->SetReactState(REACT_PASSIVE);
+ me->AddUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
+ }
+
+ Creature* GetIck()
+ {
+ return ObjectAccessor::GetCreature(*me, _instanceScript->GetGuidData(DATA_ICK));
+ }
+
+ void KilledUnit(Unit* victim) override
+ {
+ if (victim->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ Talk(SAY_KRICK_SLAY);
+ }
+
+ void JustSummoned(Creature* summon) override
+ {
+ _summons.Summon(summon);
+ if (summon->GetEntry() == NPC_EXPLODING_ORB)
{
- boss_krickAI(Creature* creature) : ScriptedAI(creature), _instanceScript(creature->GetInstanceScript()), _summons(creature)
- {
- Initialize();
- }
+ summon->CastSpell(summon, SPELL_EXPLODING_ORB, true);
+ summon->CastSpell(summon, SPELL_AUTO_GROW, true);
+ }
+ }
- void Initialize()
- {
- _phase = PHASE_COMBAT;
- _outroNpcGUID.Clear();
- _tyrannusGUID.Clear();
- }
+ void DoAction(int32 actionId) override
+ {
+ if (actionId == ACTION_OUTRO)
+ {
+ Creature* tyrannusPtr = ObjectAccessor::GetCreature(*me, _instanceScript->GetGuidData(DATA_TYRANNUS_EVENT));
+ if (tyrannusPtr)
+ tyrannusPtr->NearTeleportTo(outroPos[1].GetPositionX(), outroPos[1].GetPositionY(), outroPos[1].GetPositionZ(), outroPos[1].GetOrientation());
+ else
+ tyrannusPtr = me->SummonCreature(NPC_TYRANNUS_EVENTS, outroPos[1], TEMPSUMMON_MANUAL_DESPAWN);
+
+ tyrannusPtr->SetCanFly(true);
+ me->GetMotionMaster()->MovePoint(POINT_KRICK_INTRO, outroPos[0].GetPositionX(), outroPos[0].GetPositionY(), outroPos[0].GetPositionZ());
+ tyrannusPtr->SetFacingToObject(me);
+ }
+ }
- void Reset() override
- {
- _events.Reset();
- Initialize();
+ void MovementInform(uint32 type, uint32 id) override
+ {
+ if (type != POINT_MOTION_TYPE || id != POINT_KRICK_INTRO)
+ return;
- me->SetReactState(REACT_PASSIVE);
- me->AddUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
- }
+ Talk(SAY_KRICK_OUTRO_1);
+ _phase = PHASE_OUTRO;
+ _events.Reset();
+ _events.ScheduleEvent(EVENT_OUTRO_1, 1000);
- Creature* GetIck()
- {
- return ObjectAccessor::GetCreature(*me, _instanceScript->GetGuidData(DATA_ICK));
- }
+ // Clear combat
+ me->CombatStop();
+ }
- void KilledUnit(Unit* victim) override
- {
- if (victim->GetTypeId() != TYPEID_PLAYER)
- return;
+ void UpdateAI(uint32 diff) override
+ {
+ if (_phase != PHASE_OUTRO)
+ return;
- Talk(SAY_KRICK_SLAY);
- }
+ _events.Update(diff);
- void JustSummoned(Creature* summon) override
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
{
- _summons.Summon(summon);
- if (summon->GetEntry() == NPC_EXPLODING_ORB)
+ case EVENT_OUTRO_1:
{
- summon->CastSpell(summon, SPELL_EXPLODING_ORB, true);
- summon->CastSpell(summon, SPELL_AUTO_GROW, true);
- }
- }
+ if (Creature* temp = ObjectAccessor::GetCreature(*me, _instanceScript->GetGuidData(DATA_JAINA_SYLVANAS_1)))
+ temp->DespawnOrUnsummon();
- void DoAction(int32 actionId) override
- {
- if (actionId == ACTION_OUTRO)
- {
- Creature* tyrannusPtr = ObjectAccessor::GetCreature(*me, _instanceScript->GetGuidData(DATA_TYRANNUS_EVENT));
- if (tyrannusPtr)
- tyrannusPtr->NearTeleportTo(outroPos[1].GetPositionX(), outroPos[1].GetPositionY(), outroPos[1].GetPositionZ(), outroPos[1].GetOrientation());
+ Creature* jainaOrSylvanas = nullptr;
+ if (_instanceScript->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ jainaOrSylvanas = me->SummonCreature(NPC_JAINA_PART1, outroPos[2], TEMPSUMMON_MANUAL_DESPAWN);
else
- tyrannusPtr = me->SummonCreature(NPC_TYRANNUS_EVENTS, outroPos[1], TEMPSUMMON_MANUAL_DESPAWN);
-
- tyrannusPtr->SetCanFly(true);
- me->GetMotionMaster()->MovePoint(POINT_KRICK_INTRO, outroPos[0].GetPositionX(), outroPos[0].GetPositionY(), outroPos[0].GetPositionZ());
- tyrannusPtr->SetFacingToObject(me);
- }
- }
-
- void MovementInform(uint32 type, uint32 id) override
- {
- if (type != POINT_MOTION_TYPE || id != POINT_KRICK_INTRO)
- return;
-
- Talk(SAY_KRICK_OUTRO_1);
- _phase = PHASE_OUTRO;
- _events.Reset();
- _events.ScheduleEvent(EVENT_OUTRO_1, 1000);
-
- // Clear combat
- me->CombatStop();
- }
+ jainaOrSylvanas = me->SummonCreature(NPC_SYLVANAS_PART1, outroPos[2], TEMPSUMMON_MANUAL_DESPAWN);
- void UpdateAI(uint32 diff) override
- {
- if (_phase != PHASE_OUTRO)
- return;
-
- _events.Update(diff);
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
+ if (jainaOrSylvanas)
{
- case EVENT_OUTRO_1:
- {
- if (Creature* temp = ObjectAccessor::GetCreature(*me, _instanceScript->GetGuidData(DATA_JAINA_SYLVANAS_1)))
- temp->DespawnOrUnsummon();
-
- Creature* jainaOrSylvanas = nullptr;
- if (_instanceScript->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- jainaOrSylvanas = me->SummonCreature(NPC_JAINA_PART1, outroPos[2], TEMPSUMMON_MANUAL_DESPAWN);
- else
- jainaOrSylvanas = me->SummonCreature(NPC_SYLVANAS_PART1, outroPos[2], TEMPSUMMON_MANUAL_DESPAWN);
-
- if (jainaOrSylvanas)
- {
- jainaOrSylvanas->GetMotionMaster()->MovePoint(0, outroPos[3]);
- _outroNpcGUID = jainaOrSylvanas->GetGUID();
- }
- _events.ScheduleEvent(EVENT_OUTRO_2, 6000);
- break;
- }
- case EVENT_OUTRO_2:
- if (Creature* jainaOrSylvanas = ObjectAccessor::GetCreature(*me, _outroNpcGUID))
- {
- jainaOrSylvanas->SetFacingToObject(me);
- me->SetFacingToObject(jainaOrSylvanas);
- if (_instanceScript->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- jainaOrSylvanas->AI()->Talk(SAY_JAYNA_OUTRO_2);
- else
- jainaOrSylvanas->AI()->Talk(SAY_SYLVANAS_OUTRO_2);
- }
- _events.ScheduleEvent(EVENT_OUTRO_3, 5000);
- break;
- case EVENT_OUTRO_3:
- Talk(SAY_KRICK_OUTRO_3);
- _events.ScheduleEvent(EVENT_OUTRO_4, 18000);
- break;
- case EVENT_OUTRO_4:
- if (Creature* jainaOrSylvanas = ObjectAccessor::GetCreature(*me, _outroNpcGUID))
- {
- if (_instanceScript->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- jainaOrSylvanas->AI()->Talk(SAY_JAYNA_OUTRO_4);
- else
- jainaOrSylvanas->AI()->Talk(SAY_SYLVANAS_OUTRO_4);
- }
- _events.ScheduleEvent(EVENT_OUTRO_5, 5000);
- break;
- case EVENT_OUTRO_5:
- Talk(SAY_KRICK_OUTRO_5);
- _events.ScheduleEvent(EVENT_OUTRO_6, 1000);
- break;
- case EVENT_OUTRO_6:
- if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _instanceScript->GetGuidData(DATA_TYRANNUS_EVENT)))
- {
- tyrannus->SetSpeedRate(MOVE_FLIGHT, 3.5f);
- tyrannus->GetMotionMaster()->MovePoint(1, outroPos[4]);
- _tyrannusGUID = tyrannus->GetGUID();
- }
- _events.ScheduleEvent(EVENT_OUTRO_7, 5000);
- break;
- case EVENT_OUTRO_7:
- if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _tyrannusGUID))
- tyrannus->AI()->Talk(SAY_TYRANNUS_OUTRO_7);
- _events.ScheduleEvent(EVENT_OUTRO_8, 5000);
- break;
- case EVENT_OUTRO_8:
- //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
- me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
- me->GetMotionMaster()->MovePoint(0, outroPos[5]);
- DoCast(me, SPELL_STRANGULATING);
- _events.ScheduleEvent(EVENT_OUTRO_9, 2000);
- break;
- case EVENT_OUTRO_9:
- Talk(SAY_KRICK_OUTRO_8);
- /// @todo Tyrannus starts killing Krick.
- // there shall be some visual spell effect
- if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _tyrannusGUID))
- tyrannus->CastSpell(me, SPELL_NECROMANTIC_POWER, true); //not sure if it's the right spell :/
- _events.ScheduleEvent(EVENT_OUTRO_10, 1000);
- break;
- case EVENT_OUTRO_10:
- //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
- me->RemoveUnitMovementFlag(MOVEMENTFLAG_FLYING);
- me->AddUnitMovementFlag(MOVEMENTFLAG_FALLING_FAR);
- me->GetMotionMaster()->MovePoint(0, outroPos[6]);
- _events.ScheduleEvent(EVENT_OUTRO_11, 2000);
- break;
- case EVENT_OUTRO_11:
- DoCast(me, SPELL_KRICK_KILL_CREDIT); // don't really know if we need it
- me->SetStandState(UNIT_STAND_STATE_DEAD);
- me->SetHealth(0);
- _events.ScheduleEvent(EVENT_OUTRO_12, 3000);
- break;
- case EVENT_OUTRO_12:
- if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _tyrannusGUID))
- tyrannus->AI()->Talk(SAY_TYRANNUS_OUTRO_9);
- _events.ScheduleEvent(EVENT_OUTRO_13, 2000);
- break;
- case EVENT_OUTRO_13:
- if (Creature* jainaOrSylvanas = ObjectAccessor::GetCreature(*me, _outroNpcGUID))
- {
- if (_instanceScript->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- jainaOrSylvanas->AI()->Talk(SAY_JAYNA_OUTRO_10);
- else
- jainaOrSylvanas->AI()->Talk(SAY_SYLVANAS_OUTRO_10);
- }
- // End of OUTRO. for now...
- _events.ScheduleEvent(EVENT_OUTRO_END, 3s);
- if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _tyrannusGUID))
- tyrannus->GetMotionMaster()->MovePoint(0, outroPos[7]);
- break;
- case EVENT_OUTRO_END:
- if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _tyrannusGUID))
- tyrannus->DespawnOrUnsummon();
-
- me->DisappearAndDie();
- break;
- default:
- break;
+ jainaOrSylvanas->GetMotionMaster()->MovePoint(0, outroPos[3]);
+ _outroNpcGUID = jainaOrSylvanas->GetGUID();
}
+ _events.ScheduleEvent(EVENT_OUTRO_2, 6000);
+ break;
}
- }
-
- private:
- InstanceScript* _instanceScript;
- SummonList _summons;
- EventMap _events;
-
- KrickPhase _phase;
- ObjectGuid _outroNpcGUID;
- ObjectGuid _tyrannusGUID;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetPitOfSaronAI<boss_krickAI>(creature);
- }
-};
-
-class spell_krick_explosive_barrage : public SpellScriptLoader
-{
- public:
- spell_krick_explosive_barrage() : SpellScriptLoader("spell_krick_explosive_barrage") { }
-
- class spell_krick_explosive_barrage_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_krick_explosive_barrage_AuraScript);
-
- void HandlePeriodicTick(AuraEffect const* /*aurEff*/)
- {
- PreventDefaultAction();
- if (Unit* caster = GetCaster())
- if (caster->GetTypeId() == TYPEID_UNIT)
+ case EVENT_OUTRO_2:
+ if (Creature* jainaOrSylvanas = ObjectAccessor::GetCreature(*me, _outroNpcGUID))
{
- Map::PlayerList const& players = caster->GetMap()->GetPlayers();
- for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
- if (Player* player = itr->GetSource())
- if (player->IsWithinDist(caster, 60.0f)) // don't know correct range
- caster->CastSpell(player, SPELL_EXPLOSIVE_BARRAGE_SUMMON, true);
+ jainaOrSylvanas->SetFacingToObject(me);
+ me->SetFacingToObject(jainaOrSylvanas);
+ if (_instanceScript->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ jainaOrSylvanas->AI()->Talk(SAY_JAYNA_OUTRO_2);
+ else
+ jainaOrSylvanas->AI()->Talk(SAY_SYLVANAS_OUTRO_2);
}
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_krick_explosive_barrage_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
- }
- };
-
- AuraScript* GetAuraScript() const override
- {
- return new spell_krick_explosive_barrage_AuraScript();
- }
-};
-
-class spell_ick_explosive_barrage : public SpellScriptLoader
-{
- public:
- spell_ick_explosive_barrage() : SpellScriptLoader("spell_ick_explosive_barrage") { }
-
- class spell_ick_explosive_barrage_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_ick_explosive_barrage_AuraScript);
-
- void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (Unit* caster = GetCaster())
- if (caster->GetTypeId() == TYPEID_UNIT)
+ _events.ScheduleEvent(EVENT_OUTRO_3, 5000);
+ break;
+ case EVENT_OUTRO_3:
+ Talk(SAY_KRICK_OUTRO_3);
+ _events.ScheduleEvent(EVENT_OUTRO_4, 18000);
+ break;
+ case EVENT_OUTRO_4:
+ if (Creature* jainaOrSylvanas = ObjectAccessor::GetCreature(*me, _outroNpcGUID))
{
- caster->GetMotionMaster()->Clear();
- caster->GetMotionMaster()->MoveIdle();
+ if (_instanceScript->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ jainaOrSylvanas->AI()->Talk(SAY_JAYNA_OUTRO_4);
+ else
+ jainaOrSylvanas->AI()->Talk(SAY_SYLVANAS_OUTRO_4);
}
- }
-
- void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (Unit* caster = GetCaster())
- if (caster->GetTypeId() == TYPEID_UNIT)
+ _events.ScheduleEvent(EVENT_OUTRO_5, 5000);
+ break;
+ case EVENT_OUTRO_5:
+ Talk(SAY_KRICK_OUTRO_5);
+ _events.ScheduleEvent(EVENT_OUTRO_6, 1000);
+ break;
+ case EVENT_OUTRO_6:
+ if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _instanceScript->GetGuidData(DATA_TYRANNUS_EVENT)))
{
- caster->GetMotionMaster()->Clear();
- caster->GetMotionMaster()->MoveChase(caster->GetVictim());
+ tyrannus->SetSpeedRate(MOVE_FLIGHT, 3.5f);
+ tyrannus->GetMotionMaster()->MovePoint(1, outroPos[4]);
+ _tyrannusGUID = tyrannus->GetGUID();
}
+ _events.ScheduleEvent(EVENT_OUTRO_7, 5000);
+ break;
+ case EVENT_OUTRO_7:
+ if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _tyrannusGUID))
+ tyrannus->AI()->Talk(SAY_TYRANNUS_OUTRO_7);
+ _events.ScheduleEvent(EVENT_OUTRO_8, 5000);
+ break;
+ case EVENT_OUTRO_8:
+ //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
+ me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
+ me->GetMotionMaster()->MovePoint(0, outroPos[5]);
+ DoCast(me, SPELL_STRANGULATING);
+ _events.ScheduleEvent(EVENT_OUTRO_9, 2000);
+ break;
+ case EVENT_OUTRO_9:
+ Talk(SAY_KRICK_OUTRO_8);
+ /// @todo Tyrannus starts killing Krick.
+ // there shall be some visual spell effect
+ if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _tyrannusGUID))
+ tyrannus->CastSpell(me, SPELL_NECROMANTIC_POWER, true); //not sure if it's the right spell :/
+ _events.ScheduleEvent(EVENT_OUTRO_10, 1000);
+ break;
+ case EVENT_OUTRO_10:
+ //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
+ me->RemoveUnitMovementFlag(MOVEMENTFLAG_FLYING);
+ me->AddUnitMovementFlag(MOVEMENTFLAG_FALLING_FAR);
+ me->GetMotionMaster()->MovePoint(0, outroPos[6]);
+ _events.ScheduleEvent(EVENT_OUTRO_11, 2000);
+ break;
+ case EVENT_OUTRO_11:
+ DoCast(me, SPELL_KRICK_KILL_CREDIT); // don't really know if we need it
+ me->SetStandState(UNIT_STAND_STATE_DEAD);
+ me->SetHealth(0);
+ _events.ScheduleEvent(EVENT_OUTRO_12, 3000);
+ break;
+ case EVENT_OUTRO_12:
+ if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _tyrannusGUID))
+ tyrannus->AI()->Talk(SAY_TYRANNUS_OUTRO_9);
+ _events.ScheduleEvent(EVENT_OUTRO_13, 2000);
+ break;
+ case EVENT_OUTRO_13:
+ if (Creature* jainaOrSylvanas = ObjectAccessor::GetCreature(*me, _outroNpcGUID))
+ {
+ if (_instanceScript->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ jainaOrSylvanas->AI()->Talk(SAY_JAYNA_OUTRO_10);
+ else
+ jainaOrSylvanas->AI()->Talk(SAY_SYLVANAS_OUTRO_10);
+ }
+ // End of OUTRO. for now...
+ _events.ScheduleEvent(EVENT_OUTRO_END, 3s);
+ if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _tyrannusGUID))
+ tyrannus->GetMotionMaster()->MovePoint(0, outroPos[7]);
+ break;
+ case EVENT_OUTRO_END:
+ if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _tyrannusGUID))
+ tyrannus->DespawnOrUnsummon();
+
+ me->DisappearAndDie();
+ break;
+ default:
+ break;
}
+ }
+ }
- void Register() override
- {
- AfterEffectApply += AuraEffectApplyFn(spell_ick_explosive_barrage_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_ick_explosive_barrage_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
- };
+private:
+ InstanceScript* _instanceScript;
+ SummonList _summons;
+ EventMap _events;
- AuraScript* GetAuraScript() const override
- {
- return new spell_ick_explosive_barrage_AuraScript();
- }
+ KrickPhase _phase;
+ ObjectGuid _outroNpcGUID;
+ ObjectGuid _tyrannusGUID;
};
-class spell_exploding_orb_hasty_grow : public SpellScriptLoader
+class spell_krick_explosive_barrage : public AuraScript
{
- public:
- spell_exploding_orb_hasty_grow() : SpellScriptLoader("spell_exploding_orb_hasty_grow") { }
-
- class spell_exploding_orb_hasty_grow_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_exploding_orb_hasty_grow_AuraScript);
-
- void OnStackChange(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetStackAmount() == 15)
- {
- Unit* target = GetTarget(); // store target because aura gets removed
- target->CastSpell(target, SPELL_EXPLOSIVE_BARRAGE_DAMAGE, false);
- target->RemoveAurasDueToSpell(SPELL_HASTY_GROW);
- target->RemoveAurasDueToSpell(SPELL_AUTO_GROW);
- target->RemoveAurasDueToSpell(SPELL_EXPLODING_ORB);
- if (Creature* creature = target->ToCreature())
- creature->DespawnOrUnsummon();
- }
- }
+ PrepareAuraScript(spell_krick_explosive_barrage);
- void Register() override
+ void HandlePeriodicTick(AuraEffect const* /*aurEff*/)
+ {
+ PreventDefaultAction();
+ if (Unit* caster = GetCaster())
+ if (caster->GetTypeId() == TYPEID_UNIT)
{
- AfterEffectApply += AuraEffectApplyFn(spell_exploding_orb_hasty_grow_AuraScript::OnStackChange, EFFECT_0, SPELL_AURA_MOD_SCALE, AURA_EFFECT_HANDLE_REAPPLY);
+ Map::PlayerList const& players = caster->GetMap()->GetPlayers();
+ for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
+ if (Player* player = itr->GetSource())
+ if (player->IsWithinDist(caster, 60.0f)) // don't know correct range
+ caster->CastSpell(player, SPELL_EXPLOSIVE_BARRAGE_SUMMON, true);
}
- };
+ }
- AuraScript* GetAuraScript() const override
- {
- return new spell_exploding_orb_hasty_grow_AuraScript();
- }
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_krick_explosive_barrage::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
+ }
};
-class spell_krick_pursuit : public SpellScriptLoader
+class spell_ick_explosive_barrage : public AuraScript
{
- public:
- spell_krick_pursuit() : SpellScriptLoader("spell_krick_pursuit") { }
-
- class spell_krick_pursuit_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_krick_pursuit_SpellScript);
+ PrepareAuraScript(spell_ick_explosive_barrage);
- void HandleScriptEffect(SpellEffIndex /*effIndex*/)
+ void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Unit* caster = GetCaster())
+ if (caster->GetTypeId() == TYPEID_UNIT)
{
- Unit* target = GetHitUnit();
- if (Creature* ick = GetCaster()->ToCreature())
- {
- ick->AI()->Talk(SAY_ICK_CHASE_1, target);
- ick->AddAura(GetSpellInfo()->Id, target);
- ick->AI()->DoAction(ACTION_STORE_OLD_TARGET);
- ick->GetThreatManager().AddThreat(target, float(GetEffectValue()), GetSpellInfo(), true, true);
- ick->AI()->AttackStart(target);
- }
+ caster->GetMotionMaster()->Clear();
+ caster->GetMotionMaster()->MoveIdle();
}
+ }
- void Register() override
+ void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Unit* caster = GetCaster())
+ if (caster->GetTypeId() == TYPEID_UNIT)
{
- OnEffectHitTarget += SpellEffectFn(spell_krick_pursuit_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
+ caster->GetMotionMaster()->Clear();
+ caster->GetMotionMaster()->MoveChase(caster->GetVictim());
}
- };
+ }
- class spell_krick_pursuit_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_krick_pursuit_AuraScript);
-
- void HandleExtraEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (Unit* caster = GetCaster())
- if (Creature* creCaster = caster->ToCreature())
- creCaster->AI()->DoAction(ACTION_RESET_THREAT);
- }
+ void Register() override
+ {
+ AfterEffectApply += AuraEffectApplyFn(spell_ick_explosive_barrage::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_ick_explosive_barrage::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+};
- void Register() override
- {
- AfterEffectRemove += AuraEffectRemoveFn(spell_krick_pursuit_AuraScript::HandleExtraEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
- };
+class spell_exploding_orb_hasty_grow : public AuraScript
+{
+ PrepareAuraScript(spell_exploding_orb_hasty_grow);
- SpellScript* GetSpellScript() const override
+ void OnStackChange(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (GetStackAmount() == 15)
{
- return new spell_krick_pursuit_SpellScript();
+ Unit* target = GetTarget(); // store target because aura gets removed
+ target->CastSpell(target, SPELL_EXPLOSIVE_BARRAGE_DAMAGE, false);
+ target->RemoveAurasDueToSpell(SPELL_HASTY_GROW);
+ target->RemoveAurasDueToSpell(SPELL_AUTO_GROW);
+ target->RemoveAurasDueToSpell(SPELL_EXPLODING_ORB);
+ if (Creature* creature = target->ToCreature())
+ creature->DespawnOrUnsummon();
}
+ }
- AuraScript* GetAuraScript() const override
- {
- return new spell_krick_pursuit_AuraScript();
- }
+ void Register() override
+ {
+ AfterEffectApply += AuraEffectApplyFn(spell_exploding_orb_hasty_grow::OnStackChange, EFFECT_0, SPELL_AURA_MOD_SCALE, AURA_EFFECT_HANDLE_REAPPLY);
+ }
};
-class spell_krick_pursuit_confusion : public SpellScriptLoader
+class spell_krick_pursuit : public SpellScript
{
- public:
- spell_krick_pursuit_confusion() : SpellScriptLoader("spell_krick_pursuit_confusion") { }
+ PrepareSpellScript(spell_krick_pursuit);
- class spell_krick_pursuit_confusion_AuraScript : public AuraScript
+ void HandleScriptEffect(SpellEffIndex /*effIndex*/)
+ {
+ Unit* target = GetHitUnit();
+ if (Creature* ick = GetCaster()->ToCreature())
{
- PrepareAuraScript(spell_krick_pursuit_confusion_AuraScript);
-
- void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
- GetTarget()->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true);
- }
+ ick->AI()->Talk(SAY_ICK_CHASE_1, target);
+ ick->AddAura(GetSpellInfo()->Id, target);
+ ick->AI()->DoAction(ACTION_STORE_OLD_TARGET);
+ ick->GetThreatManager().AddThreat(target, float(GetEffectValue()), GetSpellInfo(), true, true);
+ ick->AI()->AttackStart(target);
+ }
+ }
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
- GetTarget()->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
- }
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_krick_pursuit::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+};
- void Register() override
- {
- OnEffectApply += AuraEffectApplyFn(spell_krick_pursuit_confusion_AuraScript::OnApply, EFFECT_2, SPELL_AURA_LINKED, AURA_EFFECT_HANDLE_REAL);
- OnEffectRemove += AuraEffectRemoveFn(spell_krick_pursuit_confusion_AuraScript::OnRemove, EFFECT_2, SPELL_AURA_LINKED, AURA_EFFECT_HANDLE_REAL);
- }
- };
+class spell_krick_pursuit_AuraScript : public AuraScript
+{
+ PrepareAuraScript(spell_krick_pursuit_AuraScript);
+
+ void HandleExtraEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Unit* caster = GetCaster())
+ if (Creature* creCaster = caster->ToCreature())
+ creCaster->AI()->DoAction(ACTION_RESET_THREAT);
+ }
+
+ void Register() override
+ {
+ AfterEffectRemove += AuraEffectRemoveFn(spell_krick_pursuit_AuraScript::HandleExtraEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+};
- AuraScript* GetAuraScript() const override
- {
- return new spell_krick_pursuit_confusion_AuraScript();
- }
+class spell_krick_pursuit_confusion : public AuraScript
+{
+ PrepareAuraScript(spell_krick_pursuit_confusion);
+
+ void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ GetTarget()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
+ GetTarget()->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true);
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ GetTarget()->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
+ GetTarget()->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
+ }
+
+ void Register() override
+ {
+ OnEffectApply += AuraEffectApplyFn(spell_krick_pursuit_confusion::OnApply, EFFECT_2, SPELL_AURA_LINKED, AURA_EFFECT_HANDLE_REAL);
+ OnEffectRemove += AuraEffectRemoveFn(spell_krick_pursuit_confusion::OnRemove, EFFECT_2, SPELL_AURA_LINKED, AURA_EFFECT_HANDLE_REAL);
+ }
};
void AddSC_boss_ick()
{
- new boss_ick();
- new boss_krick();
- new spell_krick_explosive_barrage();
- new spell_ick_explosive_barrage();
- new spell_exploding_orb_hasty_grow();
- new spell_krick_pursuit();
- new spell_krick_pursuit_confusion();
+ RegisterPitOfSaronCreatureAI(boss_ick);
+ RegisterPitOfSaronCreatureAI(boss_krick);
+ RegisterAuraScript(spell_krick_explosive_barrage);
+ RegisterAuraScript(spell_ick_explosive_barrage);
+ RegisterAuraScript(spell_exploding_orb_hasty_grow);
+ RegisterSpellAndAuraScriptPair(spell_krick_pursuit, spell_krick_pursuit_AuraScript);
+ RegisterAuraScript(spell_krick_pursuit_confusion);
}
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h
index e721d9fc9e6..79d24822577 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h
@@ -110,6 +110,8 @@ enum SpellsIcicle
SPELL_DONT_LOOK_UP_ACHIEV_CREDIT = 72845
};
+class Creature;
+
class ScheduledIcicleSummons : public BasicEvent
{
public:
@@ -127,4 +129,6 @@ inline AI* GetPitOfSaronAI(T* obj)
return GetInstanceAI<AI>(obj, PoSScriptName);
}
+#define RegisterPitOfSaronCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetPitOfSaronAI)
+
#endif // PIT_OF_SARON_H_