aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsirikfoll <sirikfoll@hotmail.com>2018-06-22 13:47:02 -0300
committersirikfoll <sirikfoll@hotmail.com>2018-06-22 13:47:02 -0300
commit35ba5aa138edc84dfdeb48ace88b12d521d31fa3 (patch)
tree1dfeb960d33d55613bf0f56db280704294c0f8fa
parenteb6e240fd1508ff62055e45c97a4534903280e66 (diff)
Scripts/TheSlavePens: Boss Ahune fixes and updates
Fixes some visual problems Fixes encounter start Updated codestyle Closes #22071
-rw-r--r--sql/updates/world/3.3.5/2018_06_22_00_world.sql13
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp1223
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp113
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h6
4 files changed, 577 insertions, 778 deletions
diff --git a/sql/updates/world/3.3.5/2018_06_22_00_world.sql b/sql/updates/world/3.3.5/2018_06_22_00_world.sql
new file mode 100644
index 00000000000..c867ed561c2
--- /dev/null
+++ b/sql/updates/world/3.3.5/2018_06_22_00_world.sql
@@ -0,0 +1,13 @@
+DELETE FROM `creature` WHERE `guid` IN(73427,73428);
+INSERT INTO `creature` (`guid`,`id`,`map`,`zoneId`,`areaId`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`,`ScriptName`,`VerifiedBuild`) VALUES
+(73427,26121,547,0,0,1,1,0,0,-69.8121,-162.4954,-2.30451,1.710423,300,0,0,1,1,0,0,0,0,'',0),
+(73428,26120,547,0,0,1,1,0,0,-98.1029,-230.7864,-10.8085,1.448623,300,0,0,1,1,0,0,0,0,'',0);
+
+DELETE FROM `game_event_creature` WHERE `eventEntry`=1 AND `guid` IN(73427,73428);
+INSERT INTO `game_event_creature` (`eventEntry`, `guid`) VALUES
+(1,73427),
+(1,73428);
+
+DELETE FROM `creature_template_movement` WHERE `CreatureId`=26120;
+INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`) VALUES
+(26120,0,0,1,0);
diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp
index 25b8832901e..ec905fd47b2 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp
@@ -108,35 +108,36 @@ enum Says
enum Events
{
- EVENT_EMERGE = 1,
- EVENT_INITIAL_EMERGE = 2,
- EVENT_SYNCH_HEALTH = 3,
- EVENT_LOOKFOROPENING_0 = 4,
- EVENT_LOOKFOROPENING_1 = 5,
- EVENT_LOOKFOROPENING_2 = 6,
- EVENT_SUMMON_HAILSTONE = 7,
- EVENT_SUMMON_COLDWEAVE = 8,
- EVENT_SUMMON_FROSTWIND = 9,
- EVENT_SUMMON_AHUNE = 10,
- EVENT_CLOSE_OPENING = 11,
- EVENT_AHUNE_PHASE_ONE = 12,
- EVENT_AHUNE_PHASE_TWO = 13,
- EVENT_START_LOOKING_FOR_OPENING = 14,
- EVENT_STOP_LOOKING_FOR_OPENING = 15
+ EVENT_EMERGE = 1,
+ EVENT_INITIAL_EMERGE,
+ EVENT_SYNCH_HEALTH,
+ EVENT_LOOKFOROPENING_0,
+ EVENT_LOOKFOROPENING_1,
+ EVENT_LOOKFOROPENING_2,
+ EVENT_SUMMON_HAILSTONE,
+ EVENT_SUMMON_COLDWEAVE,
+ EVENT_SUMMON_FROSTWIND,
+ EVENT_SUMMON_AHUNE,
+ EVENT_CLOSE_OPENING,
+ EVENT_AHUNE_PHASE_ONE,
+ EVENT_AHUNE_PHASE_TWO,
+ EVENT_START_LOOKING_FOR_OPENING,
+ EVENT_STOP_LOOKING_FOR_OPENING
};
enum Actions
{
- ACTION_START_EVENT = -2574500,
- ACTION_AHUNE_RETREAT = -2586500,
- ACTION_AHUNE_RESURFACE = -2586501,
- ACTION_EMOTE_RESURFACE = -2575400
+ ACTION_START_EVENT = -2574500,
+ ACTION_STOP_EVENT = -2574501,
+ ACTION_AHUNE_RETREAT = -2586500,
+ ACTION_AHUNE_RESURFACE = -2586501,
+ ACTION_EMOTE_RESURFACE = -2575400
};
enum Phases
{
- PHASE_ONE = 0,
- PHASE_TWO = 1
+ PHASE_ONE = 0,
+ PHASE_TWO = 1
};
enum Points
@@ -148,7 +149,7 @@ enum Points
enum Misc
{
- MAX_FLAMECALLERS = 3
+ MAX_FLAMECALLERS = 3
};
Position const SummonPositions[] =
@@ -157,9 +158,7 @@ Position const SummonPositions[] =
{ -98.0151f, -230.4555f, -1.21089f, 1.797689f }, // Frozen Core
{ -143.172f, -147.6801f, -3.16113f, 4.852015f }, // Bonfire Bunny 000
{ -134.304f, -145.7803f, -1.70332f, 4.677482f }, // Bonfire Bunny 001
- { -125.036f, -144.2065f, -1.91660f, 4.991642f }, // Bonfire Bunny 002
- { -69.8121f, -162.4954f, -2.30451f, 1.710423f }, // Wisp Source Bunny
- { -98.1029f, -230.7864f, -10.8085f, 1.448623f } // Wisp Dest Bunny
+ { -125.036f, -144.2065f, -1.91660f, 4.991642f } // Bonfire Bunny 002
};
Position const FlameCallerSpots[] =
@@ -169,487 +168,428 @@ Position const FlameCallerSpots[] =
{ -129.0413f, -132.1494f, -2.09285f, 5.460842f }
};
-class boss_ahune : public CreatureScript
+struct boss_ahune : public BossAI
{
-public:
- boss_ahune() : CreatureScript("boss_ahune") { }
-
- struct boss_ahuneAI : public BossAI
+ boss_ahune(Creature* creature) : BossAI(creature, DATA_AHUNE)
{
- boss_ahuneAI(Creature* creature) : BossAI(creature, DATA_AHUNE)
- {
- me->SetControlled(true, UNIT_STATE_ROOT);
- }
-
- void JustEngagedWith(Unit* /*who*/) override
- {
- _JustEngagedWith();
- events.ScheduleEvent(EVENT_INITIAL_EMERGE, Milliseconds(4));
- events.ScheduleEvent(EVENT_SYNCH_HEALTH, Seconds(3));
- }
-
- void EnterEvadeMode(EvadeReason /*why*/) override
- {
- if (Creature* ahuneBunny = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_AHUNE_BUNNY)))
- ahuneBunny->AI()->EnterEvadeMode();
- summons.DespawnAll();
- me->DespawnOrUnsummon();
- }
+ me->SetControlled(true, UNIT_STATE_ROOT);
+ }
- void JustDied(Unit* /*killer*/) override
- {
- instance->DoCastSpellOnPlayers(SPELL_AHUNE_ACHIEVEMENT);
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ _JustEngagedWith();
+ events.ScheduleEvent(EVENT_INITIAL_EMERGE, 4ms);
+ events.ScheduleEvent(EVENT_SYNCH_HEALTH, 3s);
+ }
- if (Creature* ahuneBunny = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_AHUNE_BUNNY)))
- Unit::Kill(me, ahuneBunny);
- if (Creature* frozenCore = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_FROZEN_CORE)))
- Unit::Kill(me, frozenCore);
+ void EnterEvadeMode(EvadeReason /*why*/) override
+ {
+ if (Creature* ahuneBunny = instance->GetCreature(DATA_AHUNE_BUNNY))
+ ahuneBunny->AI()->DoAction(ACTION_STOP_EVENT);
+ summons.DespawnAll();
+ me->DespawnOrUnsummon();
+ }
- Map::PlayerList const& players = me->GetMap()->GetPlayers();
- if (!players.isEmpty())
- {
- if (Group* group = players.begin()->GetSource()->GetGroup())
- if (group->isLFGGroup())
- sLFGMgr->FinishDungeon(group->GetGUID(), 286, me->GetMap());
- }
+ void JustDied(Unit* /*killer*/) override
+ {
+ instance->DoCastSpellOnPlayers(SPELL_AHUNE_ACHIEVEMENT);
- _JustDied();
- }
+ if (Creature* ahuneBunny = instance->GetCreature(DATA_AHUNE_BUNNY))
+ Unit::Kill(me, ahuneBunny);
+ if (Creature* frozenCore = instance->GetCreature(DATA_FROZEN_CORE))
+ Unit::Kill(me, frozenCore);
- void DoAction(int32 action) override
+ Map::PlayerList const& players = me->GetMap()->GetPlayers();
+ if (!players.isEmpty())
{
- if (action == ACTION_AHUNE_RETREAT)
- {
- Submerge();
- events.ScheduleEvent(EVENT_EMERGE, Seconds(35));
- }
+ if (Group* group = players.begin()->GetSource()->GetGroup())
+ if (group->isLFGGroup())
+ sLFGMgr->FinishDungeon(group->GetGUID(), 286, me->GetMap());
}
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_INITIAL_EMERGE:
- DoCast(me, SPELL_STAND);
- DoCast(me, SPELL_AHUNE_SPANKY_HANDS);
- DoCast(me, SPELL_AHUNES_SHIELD);
- break;
- case EVENT_EMERGE:
- Emerge();
- break;
- case EVENT_SYNCH_HEALTH:
- if (Creature* frozenCore = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_FROZEN_CORE)))
- DoCast(frozenCore, SPELL_SYNCH_HEALTH, true);
- else
- DoCast(me, SPELL_SUICIDE);
- events.Repeat(Seconds(3));
- break;
- default:
- break;
- }
- }
- DoMeleeAttackIfReady();
- }
+ _JustDied();
+ }
- void Emerge()
+ void DoAction(int32 action) override
+ {
+ if (action == ACTION_AHUNE_RETREAT)
{
- if (Creature* frozenCore = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_FROZEN_CORE)))
- frozenCore->AI()->DoAction(ACTION_AHUNE_RESURFACE);
-
- DoCast(me, SPELL_AHUNES_SHIELD);
- me->RemoveAurasDueToSpell(SPELL_AHUNE_SELF_STUN);
- me->RemoveAurasDueToSpell(SPELL_STAY_SUBMERGED);
- DoCast(me, SPELL_STAND);
- DoCast(me, SPELL_RESURFACE, true);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- events.ScheduleEvent(EVENT_SYNCH_HEALTH, Seconds(3));
+ Submerge();
+ events.ScheduleEvent(EVENT_EMERGE, Seconds(35));
}
+ }
- void Submerge()
- {
- if (Creature* frozenCore = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_FROZEN_CORE)))
- frozenCore->AI()->DoAction(ACTION_AHUNE_RETREAT);
- me->RemoveAurasDueToSpell(SPELL_AHUNES_SHIELD);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_31);
- DoCast(me, SPELL_SUBMERGED, true);
- DoCast(me, SPELL_AHUNE_SELF_STUN, true);
- DoCast(me, SPELL_STAY_SUBMERGED, true);
- me->HandleEmoteCommand(EMOTE_ONESHOT_SUBMERGE);
- events.Reset();
+ void ExecuteEvent(uint32 eventId) override
+ {
+ switch (eventId)
+ {
+ case EVENT_INITIAL_EMERGE:
+ DoCastSelf(SPELL_STAND);
+ DoCastSelf(SPELL_AHUNE_SPANKY_HANDS);
+ DoCastSelf(SPELL_AHUNES_SHIELD);
+ break;
+ case EVENT_EMERGE:
+ Emerge();
+ break;
+ case EVENT_SYNCH_HEALTH:
+ if (Creature* frozenCore = instance->GetCreature(DATA_FROZEN_CORE))
+ DoCast(frozenCore, SPELL_SYNCH_HEALTH, true);
+ else
+ DoCastSelf(SPELL_SUICIDE);
+ events.Repeat(3s);
+ break;
+ default:
+ break;
}
- };
+ }
- CreatureAI* GetAI(Creature* creature) const override
+ void Emerge()
{
- return GetSlavePensAI<boss_ahuneAI>(creature);
+ if (Creature* frozenCore = instance->GetCreature(DATA_FROZEN_CORE))
+ frozenCore->AI()->DoAction(ACTION_AHUNE_RESURFACE);
+
+ DoCastSelf(SPELL_AHUNES_SHIELD);
+ me->RemoveAurasDueToSpell(SPELL_AHUNE_SELF_STUN);
+ me->RemoveAurasDueToSpell(SPELL_STAY_SUBMERGED);
+ DoCastSelf(SPELL_STAND);
+ DoCastSelf(SPELL_RESURFACE, true);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ events.ScheduleEvent(EVENT_SYNCH_HEALTH, 3s);
+ }
+
+ void Submerge()
+ {
+ if (Creature* frozenCore = instance->GetCreature(DATA_FROZEN_CORE))
+ frozenCore->AI()->DoAction(ACTION_AHUNE_RETREAT);
+ me->RemoveAurasDueToSpell(SPELL_AHUNES_SHIELD);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_31);
+ DoCastSelf(SPELL_SUBMERGED, true);
+ DoCastSelf(SPELL_AHUNE_SELF_STUN, true);
+ DoCastSelf(SPELL_STAY_SUBMERGED, true);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_SUBMERGE);
+ events.Reset();
}
};
-class npc_frozen_core : public CreatureScript
+struct npc_frozen_core : public ScriptedAI
{
-public:
- npc_frozen_core() : CreatureScript("npc_frozen_core") { }
+ npc_frozen_core(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = me->GetInstanceScript();
+ Initialize();
+ }
- struct npc_frozen_coreAI : public ScriptedAI
+ void Initialize()
{
- npc_frozen_coreAI(Creature* creature) : ScriptedAI(creature)
- {
- _instance = me->GetInstanceScript();
- Initialize();
- }
+ me->SetReactState(REACT_PASSIVE);
+ me->SetRegenerateHealth(false);
+ DoCastSelf(SPELL_FROZEN_CORE_GETS_HIT);
+ DoCastSelf(SPELL_ICE_SPEAR_AURA);
+ }
- void Initialize()
- {
- me->SetReactState(REACT_PASSIVE);
- me->SetRegenerateHealth(false);
- DoCast(me, SPELL_FROZEN_CORE_GETS_HIT);
- DoCast(me, SPELL_ICE_SPEAR_AURA);
- }
+ void JustDied(Unit* /*killer*/) override
+ {
+ if (Creature* ahune = _instance->GetCreature(DATA_AHUNE))
+ Unit::Kill(me, ahune);
- void JustDied(Unit* /*killer*/) override
- {
- if (Creature* ahune = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_AHUNE)))
- Unit::Kill(me, ahune);
+ DoCast(SPELL_SUMMON_LOOT_MISSILE);
+ DoCast(SPELL_MINION_DESPAWNER);
+ }
- DoCast(SPELL_SUMMON_LOOT_MISSILE);
- DoCast(SPELL_MINION_DESPAWNER);
+ void DoAction(int32 action) override
+ {
+ if (action == ACTION_AHUNE_RETREAT)
+ {
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetImmuneToPC(false);
+ me->RemoveAurasDueToSpell(SPELL_ICE_SPEAR_AURA);
+ _events.ScheduleEvent(EVENT_SYNCH_HEALTH, 3s, 0, PHASE_TWO);
}
-
- void DoAction(int32 action) override
+ else if (action == ACTION_AHUNE_RESURFACE)
{
- if (action == ACTION_AHUNE_RETREAT)
- {
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->SetImmuneToPC(false);
- me->RemoveAurasDueToSpell(SPELL_ICE_SPEAR_AURA);
- _events.ScheduleEvent(EVENT_SYNCH_HEALTH, Seconds(3), 0, PHASE_TWO);
- }
- else if (action == ACTION_AHUNE_RESURFACE)
- {
- _events.Reset();
- DoCast(me, SPELL_ICE_SPEAR_AURA);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->SetImmuneToPC(true);
- }
+ _events.Reset();
+ DoCastSelf(SPELL_ICE_SPEAR_AURA);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetImmuneToPC(true);
}
+ }
- void UpdateAI(uint32 diff) override
- {
- _events.Update(diff);
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
- while (uint32 eventId = _events.ExecuteEvent())
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
{
- switch (eventId)
- {
- case EVENT_SYNCH_HEALTH:
- if (Creature* ahune = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_AHUNE)))
- DoCast(ahune, SPELL_SYNCH_HEALTH, true);
- else
- DoCast(me, SPELL_SUICIDE);
- _events.Repeat(Seconds(3));
- break;
- default:
- break;
- }
+ case EVENT_SYNCH_HEALTH:
+ if (Creature* ahune = _instance->GetCreature(DATA_AHUNE))
+ DoCast(ahune, SPELL_SYNCH_HEALTH, true);
+ else
+ DoCastSelf(SPELL_SUICIDE);
+ _events.Repeat(3s);
+ break;
+ default:
+ break;
}
}
+ }
- private:
- InstanceScript* _instance;
- EventMap _events;
- };
+private:
+ InstanceScript * _instance;
+ EventMap _events;
+};
- CreatureAI* GetAI(Creature* creature) const override
+struct npc_ahune_bunny : public ScriptedAI
+{
+ npc_ahune_bunny(Creature* creature) : ScriptedAI(creature), _summons(me)
{
- return GetSlavePensAI<npc_frozen_coreAI>(creature);
+ _instance = me->GetInstanceScript();
+ _submerged = false;
}
-};
-class npc_ahune_bunny : public CreatureScript
-{
-public:
- npc_ahune_bunny() : CreatureScript("npc_ahune_bunny") { }
+ void JustSummoned(Creature* summon) override
+ {
+ if (summon->GetEntry() == NPC_AHUNE)
+ return;
+
+ DoZoneInCombat(summon);
+ _summons.Summon(summon);
+ }
- struct npc_ahune_bunnyAI : public ScriptedAI
+ void JustDied(Unit* /*killer*/) override
{
- npc_ahune_bunnyAI(Creature* creature) : ScriptedAI(creature), _summons(me)
- {
- _instance = me->GetInstanceScript();
- _submerged = false;
- }
+ _summons.DespawnAll();
+ ResetFlameCallers();
+ }
- void JustSummoned(Creature* summon) override
+ void DoAction(int32 action) override
+ {
+ if (action == ACTION_START_EVENT)
{
- if (summon->GetEntry() == NPC_AHUNE)
- return;
+ DoCastSelf(SPELL_SUMMONING_VISUAL_1);
+ me->SummonCreature(NPC_SHAMAN_BONFIRE_BUNNY_000, SummonPositions[2], TEMPSUMMON_MANUAL_DESPAWN);
+ me->SummonCreature(NPC_SHAMAN_BONFIRE_BUNNY_001, SummonPositions[3], TEMPSUMMON_MANUAL_DESPAWN);
+ me->SummonCreature(NPC_SHAMAN_BONFIRE_BUNNY_002, SummonPositions[4], TEMPSUMMON_MANUAL_DESPAWN);
- DoZoneInCombat(summon);
- _summons.Summon(summon);
- }
+ for (uint8 counter = 0; counter < MAX_FLAMECALLERS; ++counter)
+ if (Creature* flameCaller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FLAMECALLER_000 + counter)))
+ flameCaller->GetMotionMaster()->MovePoint(counter, FlameCallerSpots[counter].GetPosition());
- void JustDied(Unit* /*killer*/) override
- {
- _summons.DespawnAll();
- ResetFlameCallers();
+ _submerged = false;
+ _events.Reset();
+ _events.SetPhase(PHASE_ONE);
+ _events.ScheduleEvent(EVENT_SUMMON_AHUNE, 10s);
+ _events.ScheduleEvent(EVENT_START_LOOKING_FOR_OPENING, 14s, 0, PHASE_ONE);
+ _events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, 22s, 0, PHASE_ONE);
+ _events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, 14s, 0, PHASE_ONE);
+ _events.ScheduleEvent(EVENT_AHUNE_PHASE_TWO, 108s, 0, PHASE_ONE);
}
-
- void EnterEvadeMode(EvadeReason /*why*/) override
+ else if (action == ACTION_STOP_EVENT)
{
- _EnterEvadeMode();
_summons.DespawnAll();
+ _events.Reset();
ResetFlameCallers();
me->SummonGameObject(GO_ICE_STONE, -69.90455f, -162.2449f, -2.366563f, 2.426008f, QuaternionData(0.0f, 0.0f, 0.9366722f, 0.3502074f), 0);
}
+ }
- void DoAction(int32 action) override
- {
- if (action == ACTION_START_EVENT)
- {
- DoCast(me, SPELL_SUMMONING_VISUAL_1);
- me->SummonCreature(NPC_WHISP_SOURCE_BUNNY, SummonPositions[5], TEMPSUMMON_MANUAL_DESPAWN);
- me->SummonCreature(NPC_WHISP_DEST_BUNNY, SummonPositions[6], TEMPSUMMON_MANUAL_DESPAWN);
- me->SummonCreature(NPC_SHAMAN_BONFIRE_BUNNY_000, SummonPositions[2], TEMPSUMMON_MANUAL_DESPAWN);
- me->SummonCreature(NPC_SHAMAN_BONFIRE_BUNNY_001, SummonPositions[3], TEMPSUMMON_MANUAL_DESPAWN);
- me->SummonCreature(NPC_SHAMAN_BONFIRE_BUNNY_002, SummonPositions[4], TEMPSUMMON_MANUAL_DESPAWN);
-
- for (uint8 counter = 0; counter < MAX_FLAMECALLERS; ++counter)
- if (Creature* flameCaller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FLAMECALLER_000 + counter)))
- flameCaller->GetMotionMaster()->MovePoint(counter, FlameCallerSpots[counter].GetPosition());
-
- _submerged = false;
- _events.Reset();
- _events.SetPhase(PHASE_ONE);
- _events.ScheduleEvent(EVENT_SUMMON_AHUNE, Seconds(10));
- _events.ScheduleEvent(EVENT_START_LOOKING_FOR_OPENING, Seconds(14), 0, PHASE_ONE);
- _events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, Seconds(22), 0, PHASE_ONE);
- _events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, Seconds(14), 0, PHASE_ONE);
- _events.ScheduleEvent(EVENT_AHUNE_PHASE_TWO, Seconds(108), 0, PHASE_ONE);
- }
- }
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
- void UpdateAI(uint32 diff) override
+ while (uint32 eventId = _events.ExecuteEvent())
{
- if (!UpdateVictim())
- return;
-
- _events.Update(diff);
-
- while (uint32 eventId = _events.ExecuteEvent())
+ switch (eventId)
{
- switch (eventId)
- {
- case EVENT_START_LOOKING_FOR_OPENING:
- Talk(EMOTE_EARTHEN_ASSAULT);
- for (uint8 counter = 0; counter < MAX_FLAMECALLERS; ++counter)
- if (Creature* flamecaller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FLAMECALLER_000 + counter)))
- DoCast(flamecaller, SPELL_SHAMANS_LOOK_FOR_OPENING, true);
- break;
- case EVENT_SUMMON_HAILSTONE:
- DoCast(SPELL_SUMMON_HAILSTONE);
- break;
- case EVENT_SUMMON_COLDWEAVE:
- DoCast(SPELL_SUMMON_COLDWEAVE);
- DoCast(SPELL_SUMMON_COLDWEAVE);
- _events.Repeat(Seconds(8));
- if (_submerged)
- _events.ScheduleEvent(EVENT_SUMMON_FROSTWIND, Seconds(4), 0, PHASE_ONE);
- break;
- case EVENT_SUMMON_FROSTWIND:
- DoCast(SPELL_SUMMON_FROSTWIND);
- break;
- case EVENT_SUMMON_AHUNE:
- if (TempSummon* ahune = me->SummonCreature(NPC_AHUNE, SummonPositions[0], TEMPSUMMON_DEAD_DESPAWN))
- {
- ahune->SummonCreature(NPC_FROZEN_CORE, SummonPositions[1], TEMPSUMMON_CORPSE_DESPAWN);
- DoZoneInCombat(ahune);
- DoCast(ahune, SPELL_RESURFACE);
- }
- break;
- case EVENT_CLOSE_OPENING:
- if (Creature* flamecaller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FLAMECALLER_000)))
- flamecaller->AI()->DoAction(ACTION_EMOTE_RESURFACE);
- DoCast(SPELL_CLOSE_OPENING_VISUAL);
- DoCast(me, SPELL_ICE_BOMBARD);
- break;
- case EVENT_AHUNE_PHASE_TWO:
- if (Creature* flamecaller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FLAMECALLER_000)))
- DoCast(flamecaller, SPELL_FOUND_OPENING);
- if (Creature* ahune = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_AHUNE)))
- ahune->AI()->DoAction(ACTION_AHUNE_RETREAT);
- _events.Reset();
- _events.SetPhase(PHASE_TWO);
- _events.ScheduleEvent(EVENT_CLOSE_OPENING, Seconds(25), 0, PHASE_TWO);
- _events.ScheduleEvent(EVENT_AHUNE_PHASE_ONE, Seconds(35), 0, PHASE_TWO);
- break;
- case EVENT_AHUNE_PHASE_ONE:
- _submerged = true;
- _events.Reset();
- _events.SetPhase(PHASE_ONE);
- _events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, Seconds(8), 0, PHASE_ONE);
- _events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, Seconds(5), 0, PHASE_ONE);
- _events.ScheduleEvent(EVENT_START_LOOKING_FOR_OPENING, Seconds(5), 0, PHASE_ONE);
- _events.ScheduleEvent(EVENT_AHUNE_PHASE_TWO, Seconds(100), 0, PHASE_ONE);
- break;
- default:
- break;
- }
+ case EVENT_START_LOOKING_FOR_OPENING:
+ Talk(EMOTE_EARTHEN_ASSAULT);
+ for (uint8 counter = 0; counter < MAX_FLAMECALLERS; ++counter)
+ if (Creature* flamecaller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FLAMECALLER_000 + counter)))
+ DoCast(flamecaller, SPELL_SHAMANS_LOOK_FOR_OPENING, true);
+ break;
+ case EVENT_SUMMON_HAILSTONE:
+ DoCast(SPELL_SUMMON_HAILSTONE);
+ break;
+ case EVENT_SUMMON_COLDWEAVE:
+ DoCast(SPELL_SUMMON_COLDWEAVE);
+ DoCast(SPELL_SUMMON_COLDWEAVE);
+ _events.Repeat(8s);
+ if (_submerged)
+ _events.ScheduleEvent(EVENT_SUMMON_FROSTWIND, 4s, 0, PHASE_ONE);
+ break;
+ case EVENT_SUMMON_FROSTWIND:
+ DoCast(SPELL_SUMMON_FROSTWIND);
+ break;
+ case EVENT_SUMMON_AHUNE:
+ if (TempSummon* ahune = me->SummonCreature(NPC_AHUNE, SummonPositions[0], TEMPSUMMON_DEAD_DESPAWN))
+ {
+ ahune->SummonCreature(NPC_FROZEN_CORE, SummonPositions[1], TEMPSUMMON_CORPSE_DESPAWN);
+ DoZoneInCombat(ahune);
+ DoCast(ahune, SPELL_RESURFACE);
+ }
+ break;
+ case EVENT_CLOSE_OPENING:
+ if (Creature* flamecaller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FLAMECALLER_000)))
+ flamecaller->AI()->DoAction(ACTION_EMOTE_RESURFACE);
+ DoCast(SPELL_CLOSE_OPENING_VISUAL);
+ DoCastSelf(SPELL_ICE_BOMBARD);
+ break;
+ case EVENT_AHUNE_PHASE_TWO:
+ if (Creature* flamecaller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FLAMECALLER_000)))
+ DoCast(flamecaller, SPELL_FOUND_OPENING);
+ if (Creature* ahune = _instance->GetCreature(DATA_AHUNE))
+ ahune->AI()->DoAction(ACTION_AHUNE_RETREAT);
+ _events.Reset();
+ _events.SetPhase(PHASE_TWO);
+ _events.ScheduleEvent(EVENT_CLOSE_OPENING, 25s, 0, PHASE_TWO);
+ _events.ScheduleEvent(EVENT_AHUNE_PHASE_ONE, 35s, 0, PHASE_TWO);
+ break;
+ case EVENT_AHUNE_PHASE_ONE:
+ _submerged = true;
+ _events.Reset();
+ _events.SetPhase(PHASE_ONE);
+ _events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, 8s, 0, PHASE_ONE);
+ _events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, 5s, 0, PHASE_ONE);
+ _events.ScheduleEvent(EVENT_START_LOOKING_FOR_OPENING, 5s, 0, PHASE_ONE);
+ _events.ScheduleEvent(EVENT_AHUNE_PHASE_TWO, 100s, 0, PHASE_ONE);
+ break;
+ default:
+ break;
}
}
+ }
- void ResetFlameCallers()
- {
- for (uint8 counter = 0; counter < MAX_FLAMECALLERS; ++counter)
- if (Creature* flamecaller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FLAMECALLER_000 + counter)))
- flamecaller->AI()->EnterEvadeMode();
- }
-
- private:
- InstanceScript* _instance;
- EventMap _events;
- SummonList _summons;
- bool _submerged;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
+ void ResetFlameCallers()
{
- return GetSlavePensAI<npc_ahune_bunnyAI>(creature);
+ for (uint8 counter = 0; counter < MAX_FLAMECALLERS; ++counter)
+ if (Creature* flamecaller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FLAMECALLER_000 + counter)))
+ flamecaller->AI()->EnterEvadeMode();
}
+
+private:
+ InstanceScript * _instance;
+ EventMap _events;
+ SummonList _summons;
+ bool _submerged;
};
-class npc_earthen_ring_flamecaller : public CreatureScript
+struct npc_earthen_ring_flamecaller : public ScriptedAI
{
-public:
- npc_earthen_ring_flamecaller() : CreatureScript("npc_earthen_ring_flamecaller") { }
+ npc_earthen_ring_flamecaller(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = me->GetInstanceScript();
+ _mySpot = 0;
+ }
- struct npc_earthen_ring_flamecallerAI : public ScriptedAI
+ void Reset() override
{
- npc_earthen_ring_flamecallerAI(Creature* creature) : ScriptedAI(creature)
- {
- _instance = me->GetInstanceScript();
- _mySpot = 0;
- }
+ _events.Reset();
+ }
- void Reset() override
- {
- _events.Reset();
- }
+ void MovementInform(uint32 motionType, uint32 pointId) override
+ {
+ if (motionType != POINT_MOTION_TYPE)
+ return;
+
+ switch (pointId)
+ {
+ case POINT_FLAMECALLER_000:
+ _mySpot = POINT_FLAMECALLER_000;
+ me->SetOrientation(FlameCallerSpots[_mySpot].GetOrientation());
+ break;
+ case POINT_FLAMECALLER_001:
+ _mySpot = POINT_FLAMECALLER_001;
+ me->SetOrientation(FlameCallerSpots[_mySpot].GetOrientation());
+ break;
+ case POINT_FLAMECALLER_002:
+ _mySpot = POINT_FLAMECALLER_002;
+ me->SetOrientation(FlameCallerSpots[_mySpot].GetOrientation());
+ break;
+ default:
+ break;
+ }
+
+ DoCastSelf(SPELL_FIND_OPENING_CHANNEL);
+ }
- void MovementInform(uint32 motionType, uint32 pointId) override
+ void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) override
+ {
+ switch (spellInfo->Id)
{
- if (motionType != POINT_MOTION_TYPE)
- return;
+ case SPELL_SHAMANS_LOOK_FOR_OPENING:
+ _events.ScheduleEvent(EVENT_LOOKFOROPENING_0, 17s);
+ break;
+ case SPELL_FOUND_OPENING:
+ Talk(EMOTE_RETREAT);
+ break;
+ default:
+ break;
+ }
+ }
- switch (pointId)
- {
- case POINT_FLAMECALLER_000:
- _mySpot = POINT_FLAMECALLER_000;
- me->SetOrientation(FlameCallerSpots[_mySpot].GetOrientation());
- break;
- case POINT_FLAMECALLER_001:
- _mySpot = POINT_FLAMECALLER_001;
- me->SetOrientation(FlameCallerSpots[_mySpot].GetOrientation());
- break;
- case POINT_FLAMECALLER_002:
- _mySpot = POINT_FLAMECALLER_002;
- me->SetOrientation(FlameCallerSpots[_mySpot].GetOrientation());
- break;
- default:
- break;
- }
+ void DoAction(int action) override
+ {
+ if (action == ACTION_EMOTE_RESURFACE)
+ Talk(EMOTE_RESURFACE);
+ }
- DoCast(me, SPELL_FIND_OPENING_CHANNEL);
- }
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
- void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) override
+ while (uint32 eventId = _events.ExecuteEvent())
{
- switch (spellInfo->Id)
+ switch (eventId)
{
- case SPELL_SHAMANS_LOOK_FOR_OPENING:
- _events.ScheduleEvent(EVENT_LOOKFOROPENING_0, Seconds(17));
+ case EVENT_LOOKFOROPENING_0:
+ LookOpening(true, 0);
+ _events.ScheduleEvent(EVENT_LOOKFOROPENING_1, 26s);
+ break;
+ case EVENT_LOOKFOROPENING_1:
+ LookOpening(true, 1);
+ _events.ScheduleEvent(EVENT_LOOKFOROPENING_2, 25s);
+ break;
+ case EVENT_LOOKFOROPENING_2:
+ LookOpening(true, 2);
+ _events.ScheduleEvent(EVENT_STOP_LOOKING_FOR_OPENING, 27s);
break;
- case SPELL_FOUND_OPENING:
- Talk(EMOTE_RETREAT);
+ case EVENT_STOP_LOOKING_FOR_OPENING:
+ LookOpening(false, _mySpot);
break;
default:
break;
}
}
+ }
- void DoAction(int action) override
- {
- if (action == ACTION_EMOTE_RESURFACE)
- Talk(EMOTE_RESURFACE);
- }
-
- void UpdateAI(uint32 diff) override
- {
- _events.Update(diff);
+ void LookOpening(bool activate, uint8 spot)
+ {
+ if (_mySpot != spot)
+ return;
- while (uint32 eventId = _events.ExecuteEvent())
+ if (Creature* bonfireBunny = _instance->GetCreature(DATA_BONFIRE_BUNNY_000 + spot))
+ if (Creature* beamBunny = _instance->GetCreature(DATA_BEAM_BUNNY_000 + spot))
{
- switch (eventId)
+ if (activate)
{
- case EVENT_LOOKFOROPENING_0:
- LookOpening(true, 0);
- _events.ScheduleEvent(EVENT_LOOKFOROPENING_1, Seconds(26));
- break;
- case EVENT_LOOKFOROPENING_1:
- LookOpening(true, 1);
- _events.ScheduleEvent(EVENT_LOOKFOROPENING_2, Seconds(25));
- break;
- case EVENT_LOOKFOROPENING_2:
- LookOpening(true, 2);
- _events.ScheduleEvent(EVENT_STOP_LOOKING_FOR_OPENING, Seconds(27));
- break;
- case EVENT_STOP_LOOKING_FOR_OPENING:
- LookOpening(false, _mySpot);
- break;
- default:
- break;
+ DoCast(bonfireBunny, SPELL_FIND_OPENING_TRIGGER);
+ bonfireBunny->CastSpell(beamBunny, SPELL_FIND_OPENING_VISUAL, true);
}
- }
- }
-
- void LookOpening(bool activate, uint8 spot)
- {
- if (_mySpot != spot)
- return;
-
- if (Creature* bonfireBunny = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_BONFIRE_BUNNY_000 + spot)))
- if (Creature* beamBunny = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_BEAM_BUNNY_000 + spot)))
+ else
{
- if (activate)
- {
- DoCast(bonfireBunny, SPELL_FIND_OPENING_TRIGGER);
- bonfireBunny->CastSpell(beamBunny, SPELL_FIND_OPENING_VISUAL, true);
- }
- else
- {
- DoCast(me, SPELL_FIND_OPENING_CHANNEL);
- bonfireBunny->CastStop();
- beamBunny->RemoveAurasDueToSpell(SPELL_FIND_OPENING_BEAM_END);
- }
+ DoCastSelf(SPELL_FIND_OPENING_CHANNEL);
+ bonfireBunny->CastStop();
+ beamBunny->RemoveAurasDueToSpell(SPELL_FIND_OPENING_BEAM_END);
}
- }
-
- private:
- EventMap _events;
- InstanceScript* _instance;
- uint8 _mySpot;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetSlavePensAI<npc_earthen_ring_flamecallerAI>(creature);
+ }
}
+
+private:
+ EventMap _events;
+ InstanceScript* _instance;
+ uint8 _mySpot;
};
class go_ahune_ice_stone : public GameObjectScript
@@ -659,25 +599,24 @@ public:
struct go_ahune_ice_stoneAI : public GameObjectAI
{
- go_ahune_ice_stoneAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
-
- InstanceScript* instance;
+ go_ahune_ice_stoneAI(GameObject* go) : GameObjectAI(go), _instance(go->GetInstanceScript()) { }
bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
ClearGossipMenuFor(player);
- if (Creature* ahuneBunny = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_AHUNE_BUNNY)))
- {
+ if (Creature* ahuneBunny = _instance->GetCreature(DATA_AHUNE_BUNNY))
ahuneBunny->AI()->DoAction(ACTION_START_EVENT);
- ahuneBunny->AI()->DoZoneInCombat();
- }
- if (Creature* luma = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_LUMA_SKYMOTHER)))
+
+ if (Creature* luma = _instance->GetCreature(DATA_LUMA_SKYMOTHER))
luma->CastSpell(player, SPELL_SUMMONING_RHYME_AURA, true);
CloseGossipMenuFor(player);
me->Delete();
return true;
}
+
+ private:
+ InstanceScript* _instance;
};
GameObjectAI* GetAI(GameObject* go) const override
@@ -687,365 +626,259 @@ public:
};
// 46430 - Synch Health
-class spell_ahune_synch_health : public SpellScriptLoader
+class spell_ahune_synch_health : public SpellScript
{
-public:
- spell_ahune_synch_health() : SpellScriptLoader("spell_ahune_synch_health") { }
+ PrepareSpellScript(spell_ahune_synch_health);
- class spell_ahune_synch_health_SpellScript : public SpellScript
+ void HandleScript(SpellEffIndex /*effIndex*/)
{
- PrepareSpellScript(spell_ahune_synch_health_SpellScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SYNCH_HEALTH });
- }
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- if (Unit* target = GetHitUnit())
- if (Unit* caster = GetCaster())
- target->SetHealth(caster->GetHealth());
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_ahune_synch_health_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
+ GetHitUnit()->SetHealth(GetCaster()->GetHealth());
+ }
- SpellScript* GetSpellScript() const override
+ void Register() override
{
- return new spell_ahune_synch_health_SpellScript();
+ OnEffectHitTarget += SpellEffectFn(spell_ahune_synch_health::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
// 45926 - Summoning Rhyme Aura
-class spell_summoning_rhyme_aura : public SpellScriptLoader
+class spell_summoning_rhyme_aura : public AuraScript
{
-public:
- spell_summoning_rhyme_aura() : SpellScriptLoader("spell_summoning_rhyme_aura") { }
+ PrepareAuraScript(spell_summoning_rhyme_aura);
- class spell_summoning_rhyme_aura_AuraScript : public AuraScript
+ bool Validate(SpellInfo const* /*spellInfo*/) override
{
- PrepareAuraScript(spell_summoning_rhyme_aura_AuraScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_FORCE_WHISP_FLIGHT, SPELL_SUMMONING_RHYME_BONFIRE });
- }
-
- void PeriodicTick(AuraEffect const* aurEff)
- {
- if (!GetCaster())
- return;
-
- Creature* caster = GetCaster()->ToCreature();
- Player* player = GetTarget()->ToPlayer();
-
- if (!caster || !player)
- return;
-
- player->CastSpell(player, SPELL_FORCE_WHISP_FLIGHT);
-
- switch (aurEff->GetTickNumber())
- {
- case 1:
- sCreatureTextMgr->SendChat(caster, SAY_PLAYER_TEXT_1, nullptr, CHAT_MSG_SAY, LANG_UNIVERSAL, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, player);
- player->CastSpell(player, SPELL_SUMMONING_RHYME_BONFIRE, true);
- break;
- case 2:
- sCreatureTextMgr->SendChat(caster, SAY_PLAYER_TEXT_2, nullptr, CHAT_MSG_SAY, LANG_UNIVERSAL, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, player);
- break;
- case 3:
- sCreatureTextMgr->SendChat(caster, SAY_PLAYER_TEXT_3, nullptr, CHAT_MSG_SAY, LANG_UNIVERSAL, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, player);
- Remove();
- break;
- }
- }
+ return ValidateSpellInfo({ SPELL_FORCE_WHISP_FLIGHT, SPELL_SUMMONING_RHYME_BONFIRE });
+ }
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_summoning_rhyme_aura_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ void PeriodicTick(AuraEffect const* aurEff)
+ {
+ if (!GetCaster())
+ return;
+
+ Creature* caster = GetCaster()->ToCreature();
+ Player* player = GetTarget()->ToPlayer();
+ if (!caster || !player)
+ return;
+
+ player->CastSpell(player, SPELL_FORCE_WHISP_FLIGHT);
+
+ switch (aurEff->GetTickNumber())
+ {
+ case 1:
+ sCreatureTextMgr->SendChat(caster, SAY_PLAYER_TEXT_1, nullptr, CHAT_MSG_SAY, LANG_UNIVERSAL, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, player);
+ player->CastSpell(player, SPELL_SUMMONING_RHYME_BONFIRE, true);
+ break;
+ case 2:
+ sCreatureTextMgr->SendChat(caster, SAY_PLAYER_TEXT_2, nullptr, CHAT_MSG_SAY, LANG_UNIVERSAL, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, player);
+ break;
+ case 3:
+ sCreatureTextMgr->SendChat(caster, SAY_PLAYER_TEXT_3, nullptr, CHAT_MSG_SAY, LANG_UNIVERSAL, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, player);
+ Remove();
+ break;
}
- };
+ }
- AuraScript* GetAuraScript() const override
+ void Register() override
{
- return new spell_summoning_rhyme_aura_AuraScript();
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_summoning_rhyme_aura::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
// 46878 - Summon Ice Spear Delayer
-class spell_summon_ice_spear_delayer : public SpellScriptLoader
+class spell_summon_ice_spear_delayer : public AuraScript
{
-public:
- spell_summon_ice_spear_delayer() : SpellScriptLoader("spell_summon_ice_spear_delayer") { }
+ PrepareAuraScript(spell_summon_ice_spear_delayer);
- class spell_summon_ice_spear_delayer_AuraScript : public AuraScript
+ bool Validate(SpellInfo const* /*spellInfo*/) override
{
- PrepareAuraScript(spell_summon_ice_spear_delayer_AuraScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SUMMON_ICE_SPEAR_GO, SPELL_ICE_SPEAR_KNOCKBACK });
- }
-
- void PeriodicTick(AuraEffect const* aurEff)
- {
- if (Unit* tmpCaster = GetCaster())
- if (Creature* caster = tmpCaster->ToCreature())
- switch (aurEff->GetTickNumber())
- {
- case 1:
- caster->CastSpell(caster, SPELL_SUMMON_ICE_SPEAR_GO);
- break;
- case 3:
- if (GameObject* spike = caster->FindNearestGameObject(GO_ICE_SPEAR, 3.0f))
- spike->UseDoorOrButton();
- caster->AI()->DoCastAOE(SPELL_ICE_SPEAR_KNOCKBACK, true);
- break;
- case 5:
- if (GameObject* spike = caster->FindNearestGameObject(GO_ICE_SPEAR, 3.0f))
- spike->Delete();
- caster->DespawnOrUnsummon();
- break;
- default:
- break;
- }
- }
+ return ValidateSpellInfo({ SPELL_SUMMON_ICE_SPEAR_GO, SPELL_ICE_SPEAR_KNOCKBACK });
+ }
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_summon_ice_spear_delayer_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
- };
+ void PeriodicTick(AuraEffect const* aurEff)
+ {
+ if (Unit* tmpCaster = GetCaster())
+ if (Creature* caster = tmpCaster->ToCreature())
+ switch (aurEff->GetTickNumber())
+ {
+ case 1:
+ caster->CastSpell(caster, SPELL_SUMMON_ICE_SPEAR_GO);
+ break;
+ case 3:
+ if (GameObject* spike = caster->FindNearestGameObject(GO_ICE_SPEAR, 3.0f))
+ spike->UseDoorOrButton();
+ caster->AI()->DoCastAOE(SPELL_ICE_SPEAR_KNOCKBACK, true);
+ break;
+ case 5:
+ if (GameObject* spike = caster->FindNearestGameObject(GO_ICE_SPEAR, 3.0f))
+ spike->Delete();
+ caster->DespawnOrUnsummon();
+ break;
+ default:
+ break;
+ }
+ }
- AuraScript* GetAuraScript() const override
+ void Register() override
{
- return new spell_summon_ice_spear_delayer_AuraScript();
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_summon_ice_spear_delayer::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
// 46371 - Ice Spear Control Aura
-class spell_ice_spear_control_aura : public SpellScriptLoader
+class spell_ice_spear_control_aura : public AuraScript
{
-public:
- spell_ice_spear_control_aura() : SpellScriptLoader("spell_ice_spear_control_aura") { }
+ PrepareAuraScript(spell_ice_spear_control_aura);
- class spell_ice_spear_control_aura_AuraScript : public AuraScript
+ bool Validate(SpellInfo const* /*spellInfo*/) override
{
- PrepareAuraScript(spell_ice_spear_control_aura_AuraScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_ICE_SPEAR_TARGET_PICKER });
- }
-
- void PeriodicTick(AuraEffect const* /*aurEff*/)
- {
- if (Unit* caster = GetCaster())
- caster->CastSpell(caster, SPELL_ICE_SPEAR_TARGET_PICKER);
- }
+ return ValidateSpellInfo({ SPELL_ICE_SPEAR_TARGET_PICKER });
+ }
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_ice_spear_control_aura_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
- };
+ void PeriodicTick(AuraEffect const* /*aurEff*/)
+ {
+ if (Unit* caster = GetCaster())
+ caster->CastSpell(caster, SPELL_ICE_SPEAR_TARGET_PICKER);
+ }
- AuraScript* GetAuraScript() const override
+ void Register() override
{
- return new spell_ice_spear_control_aura_AuraScript();
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_ice_spear_control_aura::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
// 46372 - Ice Spear Target Picker
-class spell_ice_spear_target_picker : public SpellScriptLoader
+class spell_ice_spear_target_picker : public SpellScript
{
-public:
- spell_ice_spear_target_picker() : SpellScriptLoader("spell_ice_spear_target_picker") { }
+ PrepareSpellScript(spell_ice_spear_target_picker);
- class spell_ice_spear_target_picker_SpellScript : public SpellScript
+ bool Validate(SpellInfo const* /*spellInfo*/) override
{
- PrepareSpellScript(spell_ice_spear_target_picker_SpellScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SUMMON_ICE_SPEAR_BUNNY });
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- if (targets.empty())
- return;
+ return ValidateSpellInfo({ SPELL_SUMMON_ICE_SPEAR_BUNNY });
+ }
- WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
- targets.clear();
- targets.push_back(target);
- }
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ if (targets.empty())
+ return;
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_SUMMON_ICE_SPEAR_BUNNY, true);
- }
+ WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
+ targets.clear();
+ targets.push_back(target);
+ }
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_ice_spear_target_picker_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
- OnEffectHitTarget += SpellEffectFn(spell_ice_spear_target_picker_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
- };
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ GetCaster()->CastSpell(GetHitUnit(), SPELL_SUMMON_ICE_SPEAR_BUNNY, true);
+ }
- SpellScript* GetSpellScript() const override
+ void Register() override
{
- return new spell_ice_spear_target_picker_SpellScript();
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_ice_spear_target_picker::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
+ OnEffectHitTarget += SpellEffectFn(spell_ice_spear_target_picker::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
// 46320 - Spell Slippery Floor Periodic
-class spell_slippery_floor_periodic : public SpellScriptLoader
+class spell_slippery_floor_periodic : public SpellScript
{
-public:
- spell_slippery_floor_periodic() : SpellScriptLoader("spell_slippery_floor_periodic") { }
+ PrepareSpellScript(spell_slippery_floor_periodic);
- class spell_slippery_floor_periodic_SpellScript : public SpellScript
+ bool Validate(SpellInfo const* /*spellInfo*/) override
{
- PrepareSpellScript(spell_slippery_floor_periodic_SpellScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SLIPPERY_FLOOR_SLIP });
- }
-
- void HandleScriptEffect(SpellEffIndex /*effIndex*/)
- {
- if (Unit* target = GetHitUnit())
- if (target->isMoving())
- {
- target->CastSpell(target, SPELL_SLIPPERY_FLOOR_SLIP, true);
- target->CastSpell(target, SPELL_SLIPPERY_FLOOR_YOU_SLIPPED, true);
- }
- }
+ return ValidateSpellInfo({ SPELL_SLIPPERY_FLOOR_SLIP });
+ }
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_slippery_floor_periodic_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
+ void HandleScriptEffect(SpellEffIndex /*effIndex*/)
+ {
+ if (Unit* target = GetHitUnit())
+ if (target->isMoving())
+ {
+ target->CastSpell(target, SPELL_SLIPPERY_FLOOR_SLIP, true);
+ target->CastSpell(target, SPELL_SLIPPERY_FLOOR_YOU_SLIPPED, true);
+ }
+ }
- SpellScript* GetSpellScript() const override
+ void Register() override
{
- return new spell_slippery_floor_periodic_SpellScript();
+ OnEffectHitTarget += SpellEffectFn(spell_slippery_floor_periodic::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
// 46146 - Ahune Spanky Hands
-class spell_ahune_spanky_hands : public SpellScriptLoader
+class spell_ahune_spanky_hands : public AuraScript
{
-public:
- spell_ahune_spanky_hands() : SpellScriptLoader("spell_ahune_spanky_hands") { }
+ PrepareAuraScript(spell_ahune_spanky_hands);
- class spell_ahune_spanky_hands_AuraScript : public AuraScript
+ bool Validate(SpellInfo const* /*spellInfo*/) override
{
- PrepareAuraScript(spell_ahune_spanky_hands_AuraScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_COLD_SLAP });
- }
-
- void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_COLD_SLAP, true);
- }
+ return ValidateSpellInfo({ SPELL_COLD_SLAP });
+ }
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_ahune_spanky_hands_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
- };
+ void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_COLD_SLAP, true);
+ }
- AuraScript* GetAuraScript() const override
+ void Register() override
{
- return new spell_ahune_spanky_hands_AuraScript();
+ OnEffectProc += AuraEffectProcFn(spell_ahune_spanky_hands::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
}
};
-class spell_ahune_minion_despawner : public SpellScriptLoader
+// 46843 - Minion Despawner
+class spell_ahune_minion_despawner : public SpellScript
{
-public:
- spell_ahune_minion_despawner() : SpellScriptLoader("spell_ahune_minion_despawner") { }
+ PrepareSpellScript(spell_ahune_minion_despawner);
- class spell_ahune_minion_despawner_SpellScript : public SpellScript
+ void HandleScript(SpellEffIndex /*effIndex*/)
{
- PrepareSpellScript(spell_ahune_minion_despawner_SpellScript);
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- if (GetHitCreature())
- GetHitCreature()->DespawnOrUnsummon();
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_ahune_minion_despawner_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
- }
- };
+ if (GetHitCreature())
+ GetHitCreature()->DespawnOrUnsummon();
+ }
- SpellScript* GetSpellScript() const override
+ void Register() override
{
- return new spell_ahune_minion_despawner_SpellScript();
+ OnEffectHitTarget += SpellEffectFn(spell_ahune_minion_despawner::HandleScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
}
};
// 46398 - Spell Ice Bombardment Dest Picker
-class spell_ice_bombardment_dest_picker : public SpellScriptLoader
+class spell_ice_bombardment_dest_picker : public SpellScript
{
-public:
- spell_ice_bombardment_dest_picker() : SpellScriptLoader("spell_ice_bombardment_dest_picker") { }
+ PrepareSpellScript(spell_ice_bombardment_dest_picker);
- class spell_ice_bombardment_dest_picker_SpellScript : public SpellScript
+ bool Validate(SpellInfo const* /*spellInfo*/) override
{
- PrepareSpellScript(spell_ice_bombardment_dest_picker_SpellScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_ICE_BOMBARDMENT });
- }
-
- void HandleScriptEffect(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetHitDest()->GetPosition(), SPELL_ICE_BOMBARDMENT, true);
- }
+ return ValidateSpellInfo({ SPELL_ICE_BOMBARDMENT });
+ }
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_ice_bombardment_dest_picker_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
- };
+ void HandleScriptEffect(SpellEffIndex /*effIndex*/)
+ {
+ GetCaster()->CastSpell(GetHitDest()->GetPosition(), SPELL_ICE_BOMBARDMENT, true);
+ }
- SpellScript* GetSpellScript() const override
+ void Register() override
{
- return new spell_ice_bombardment_dest_picker_SpellScript();
+ OnEffectHit += SpellEffectFn(spell_ice_bombardment_dest_picker::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
void AddSC_boss_ahune()
{
- new boss_ahune();
- new npc_frozen_core();
- new npc_earthen_ring_flamecaller();
- new npc_ahune_bunny();
+ RegisterSlavePensCreatureAI(boss_ahune);
+ RegisterSlavePensCreatureAI(npc_frozen_core);
+ RegisterSlavePensCreatureAI(npc_earthen_ring_flamecaller);
+ RegisterSlavePensCreatureAI(npc_ahune_bunny);
new go_ahune_ice_stone();
- new spell_ahune_synch_health();
- new spell_summoning_rhyme_aura();
- new spell_summon_ice_spear_delayer();
- new spell_ice_spear_control_aura();
- new spell_slippery_floor_periodic();
- new spell_ahune_spanky_hands();
- new spell_ahune_minion_despawner();
- new spell_ice_spear_target_picker();
- new spell_ice_bombardment_dest_picker();
+ RegisterSpellScript(spell_ahune_synch_health);
+ RegisterAuraScript(spell_summoning_rhyme_aura);
+ RegisterAuraScript(spell_summon_ice_spear_delayer);
+ RegisterAuraScript(spell_ice_spear_control_aura);
+ RegisterSpellScript(spell_ice_spear_target_picker);
+ RegisterSpellScript(spell_slippery_floor_periodic);
+ RegisterAuraScript(spell_ahune_spanky_hands);
+ RegisterSpellScript(spell_ahune_minion_despawner);
+ RegisterSpellScript(spell_ice_bombardment_dest_picker);
}
diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp
index 23f09fdfd6f..bb5153304a7 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp
@@ -28,6 +28,21 @@ gets instead the deserter debuff.
#include "Map.h"
#include "the_slave_pens.h"
+ObjectData const creatureData[] =
+{
+ { NPC_AHUNE, DATA_AHUNE },
+ { NPC_FROZEN_CORE, DATA_FROZEN_CORE },
+ { NPC_AHUNE_LOC_BUNNY, DATA_AHUNE_BUNNY },
+ { NPC_SHAMAN_BONFIRE_BUNNY_000, DATA_BONFIRE_BUNNY_000 },
+ { NPC_SHAMAN_BONFIRE_BUNNY_001, DATA_BONFIRE_BUNNY_001 },
+ { NPC_SHAMAN_BONFIRE_BUNNY_002, DATA_BONFIRE_BUNNY_002 },
+ { NPC_SHAMAN_BEAM_BUNNY_000, DATA_BEAM_BUNNY_000 },
+ { NPC_SHAMAN_BEAM_BUNNY_001, DATA_BEAM_BUNNY_001 },
+ { NPC_SHAMAN_BEAM_BUNNY_002, DATA_BEAM_BUNNY_002 },
+ { NPC_LUMA_SKYMOTHER, DATA_LUMA_SKYMOTHER },
+ { 0, 0, }
+};
+
class instance_the_slave_pens : public InstanceMapScript
{
public:
@@ -38,66 +53,30 @@ public:
instance_the_slave_pens_InstanceMapScript(Map* map) : InstanceScript(map)
{
counter = DATA_FLAMECALLER_000;
+ LoadObjectData(creatureData, nullptr);
}
void OnCreatureCreate(Creature* creature) override
{
- switch (creature->GetEntry())
- {
- case NPC_AHUNE:
- AhuneGUID = creature->GetGUID();
- break;
- case NPC_FROZEN_CORE:
- FrozenCoreGUID = creature->GetGUID();
- break;
- case NPC_AHUNE_LOC_BUNNY:
- AhuneBunnyGUID = creature->GetGUID();
- break;
- case NPC_SHAMAN_BONFIRE_BUNNY_000:
- BonfireBunnyGUIDs[0] = creature->GetGUID();
- break;
- case NPC_SHAMAN_BONFIRE_BUNNY_001:
- BonfireBunnyGUIDs[1] = creature->GetGUID();
- break;
- case NPC_SHAMAN_BONFIRE_BUNNY_002:
- BonfireBunnyGUIDs[2] = creature->GetGUID();
- break;
- case NPC_SHAMAN_BEAM_BUNNY_000:
- BeamBunnyGUIDs[0] = creature->GetGUID();
- break;
- case NPC_SHAMAN_BEAM_BUNNY_001:
- BeamBunnyGUIDs[1] = creature->GetGUID();
- break;
- case NPC_SHAMAN_BEAM_BUNNY_002:
- BeamBunnyGUIDs[2] = creature->GetGUID();
- break;
- case NPC_LUMA_SKYMOTHER:
- LumaGUID = creature->GetGUID();
- break;
- case NPC_EARTHEN_RING_FLAMECALLER:
- SetGuidData(counter, creature->GetGUID());
- ++counter;
- break;
- default:
- break;
- }
- }
+ InstanceScript::OnCreatureCreate(creature);
- void SetGuidData(uint32 data, ObjectGuid guid) override
- {
- switch (data)
+ if (creature->GetEntry() == NPC_EARTHEN_RING_FLAMECALLER)
{
- case DATA_FLAMECALLER_000:
- FlameCallerGUIDs[0] = guid;
- break;
- case DATA_FLAMECALLER_001:
- FlameCallerGUIDs[1] = guid;
- break;
- case DATA_FLAMECALLER_002:
- FlameCallerGUIDs[2] = guid;
- break;
- default:
- break;
+ switch (counter)
+ {
+ case DATA_FLAMECALLER_000:
+ FlameCallerGUIDs[0] = creature->GetGUID();
+ break;
+ case DATA_FLAMECALLER_001:
+ FlameCallerGUIDs[1] = creature->GetGUID();
+ break;
+ case DATA_FLAMECALLER_002:
+ FlameCallerGUIDs[2] = creature->GetGUID();
+ break;
+ default:
+ break;
+ }
+ ++counter;
}
}
@@ -105,32 +84,12 @@ public:
{
switch (type)
{
- case DATA_AHUNE:
- return AhuneGUID;
- case DATA_AHUNE_BUNNY:
- return AhuneBunnyGUID;
- case DATA_FROZEN_CORE:
- return FrozenCoreGUID;
case DATA_FLAMECALLER_000:
return FlameCallerGUIDs[0];
case DATA_FLAMECALLER_001:
return FlameCallerGUIDs[1];
case DATA_FLAMECALLER_002:
return FlameCallerGUIDs[2];
- case DATA_BONFIRE_BUNNY_000:
- return BonfireBunnyGUIDs[0];
- case DATA_BONFIRE_BUNNY_001:
- return BonfireBunnyGUIDs[1];
- case DATA_BONFIRE_BUNNY_002:
- return BonfireBunnyGUIDs[2];
- case DATA_BEAM_BUNNY_000:
- return BeamBunnyGUIDs[0];
- case DATA_BEAM_BUNNY_001:
- return BeamBunnyGUIDs[1];
- case DATA_BEAM_BUNNY_002:
- return BeamBunnyGUIDs[2];
- case DATA_LUMA_SKYMOTHER:
- return LumaGUID;
default:
break;
}
@@ -138,13 +97,7 @@ public:
}
protected:
- ObjectGuid AhuneGUID;
- ObjectGuid AhuneBunnyGUID;
- ObjectGuid FrozenCoreGUID;
- ObjectGuid LumaGUID;
ObjectGuid FlameCallerGUIDs[3];
- ObjectGuid BonfireBunnyGUIDs[3];
- ObjectGuid BeamBunnyGUIDs[3];
uint8 counter;
};
diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h
index 2ea69ce5453..593066a1c56 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h
@@ -57,9 +57,7 @@ enum SPCreaturesIds
NPC_SHAMAN_BONFIRE_BUNNY_002 = 25973,
NPC_SHAMAN_BEAM_BUNNY_000 = 25964,
NPC_SHAMAN_BEAM_BUNNY_001 = 25965,
- NPC_SHAMAN_BEAM_BUNNY_002 = 25966,
- NPC_WHISP_DEST_BUNNY = 26120,
- NPC_WHISP_SOURCE_BUNNY = 26121
+ NPC_SHAMAN_BEAM_BUNNY_002 = 25966
};
enum SPGameObjectIds
@@ -74,4 +72,6 @@ inline AI* GetSlavePensAI(T* obj)
return GetInstanceAI<AI>(obj, SPScriptName);
}
+#define RegisterSlavePensCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetSlavePensAI)
+
#endif // SLAVE_PENS_H