aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp345
1 files changed, 167 insertions, 178 deletions
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
index 6f7a1d0b238..6cd73d9e0f0 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
@@ -99,217 +99,206 @@ enum Misc
DATA_KINGS_BANE = 2157
};
-class boss_ymiron : public CreatureScript
+struct boss_ymiron : public BossAI
{
-public:
- boss_ymiron() : CreatureScript("boss_ymiron") { }
-
- struct boss_ymironAI : public BossAI
+ boss_ymiron(Creature* creature) : BossAI(creature, DATA_KING_YMIRON)
{
- boss_ymironAI(Creature* creature) : BossAI(creature, DATA_KING_YMIRON)
- {
- Initialize();
- // This ensures a random sequence of ancestors. Not sure if the order should change on reset or not, reason why this is left out of Initialize().
- for (int i = 0; i < 4; ++i)
- ActiveOrder[i] = i;
- for (int i = 0; i < 3; ++i)
- {
- int r = i + (rand32() % (4 - i));
- int temp = ActiveOrder[i];
- ActiveOrder[i] = ActiveOrder[r];
- ActiveOrder[r] = temp;
- }
- }
-
- void Initialize()
+ Initialize();
+ // This ensures a random sequence of ancestors. Not sure if the order should change on reset or not, reason why this is left out of Initialize().
+ for (int i = 0; i < 4; ++i)
+ ActiveOrder[i] = i;
+ for (int i = 0; i < 3; ++i)
{
- kingsBane = true;
- ActivedNumber = 0;
- HealthAmountModifier = 1;
- HealthAmountMultipler = DUNGEON_MODE(20, 25);
- ActiveAncestorGUID.Clear();
- SpiritFountGUID.Clear();
+ int r = i + (rand32() % (4 - i));
+ int temp = ActiveOrder[i];
+ ActiveOrder[i] = ActiveOrder[r];
+ ActiveOrder[r] = temp;
}
+ }
- void Reset() override
- {
- _Reset();
- Initialize();
- me->SetReactState(REACT_AGGRESSIVE);
- }
+ void Initialize()
+ {
+ kingsBane = true;
+ ActivedNumber = 0;
+ HealthAmountModifier = 1;
+ HealthAmountMultipler = DUNGEON_MODE(20, 25);
+ ActiveAncestorGUID.Clear();
+ SpiritFountGUID.Clear();
+ }
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- Talk(SAY_AGGRO);
- events.ScheduleEvent(EVENT_BANE, 18s, 23s, EVENT_GROUP_BASE_SPELLS);
- events.ScheduleEvent(EVENT_FETID_ROT, 8s, 13s, EVENT_GROUP_BASE_SPELLS);
- events.ScheduleEvent(EVENT_DARK_SLASH, 28s, 33s, EVENT_GROUP_BASE_SPELLS);
- events.ScheduleEvent(EVENT_ANCESTORS_VENGEANCE, DUNGEON_MODE(60s, 45s), EVENT_GROUP_BASE_SPELLS);
- }
+ void Reset() override
+ {
+ _Reset();
+ Initialize();
+ me->SetReactState(REACT_AGGRESSIVE);
+ }
- void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
- {
- if (target->GetTypeId() == TYPEID_PLAYER && spellInfo->Id == SPELL_BANE_HIT)
- kingsBane = false;
- }
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ Talk(SAY_AGGRO);
+ events.ScheduleEvent(EVENT_BANE, 18s, 23s, EVENT_GROUP_BASE_SPELLS);
+ events.ScheduleEvent(EVENT_FETID_ROT, 8s, 13s, EVENT_GROUP_BASE_SPELLS);
+ events.ScheduleEvent(EVENT_DARK_SLASH, 28s, 33s, EVENT_GROUP_BASE_SPELLS);
+ events.ScheduleEvent(EVENT_ANCESTORS_VENGEANCE, DUNGEON_MODE(60s, 45s), EVENT_GROUP_BASE_SPELLS);
+ }
- uint32 GetData(uint32 type) const override
- {
- if (type == DATA_KINGS_BANE)
- return kingsBane ? 1 : 0;
+ void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
+ {
+ if (target->GetTypeId() == TYPEID_PLAYER && spellInfo->Id == SPELL_BANE_HIT)
+ kingsBane = false;
+ }
- return 0;
- }
+ uint32 GetData(uint32 type) const override
+ {
+ if (type == DATA_KINGS_BANE)
+ return kingsBane ? 1 : 0;
- void MovementInform(uint32 type, uint32 pointId) override
- {
- if (type != POINT_MOTION_TYPE)
- return;
+ return 0;
+ }
- if (pointId == POINT_BOAT) // Check might not be needed.
- {
- Talk(ActiveBoat[ActiveOrder[ActivedNumber]].say);
- if (Creature* ancestor = me->SummonCreature(ActiveBoat[ActiveOrder[ActivedNumber]].npc, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnX, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnY, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnZ, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnO, TEMPSUMMON_CORPSE_DESPAWN))
- {
- DoCast(ancestor, SPELL_CHANNEL_YMIRON_TO_SPIRIT);
- ancestor->CastSpell(me, SPELL_CHANNEL_SPIRIT_TO_YMIRON, true);
- ancestor->AddUnitFlag(UnitFlags(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE));
- ancestor->SetDisableGravity(true);
- ActiveAncestorGUID = ancestor->GetGUID();
- }
- events.ScheduleEvent(EVENT_RESUME_COMBAT, 5s);
- }
- }
+ void MovementInform(uint32 type, uint32 pointId) override
+ {
+ if (type != POINT_MOTION_TYPE)
+ return;
- void JustSummoned(Creature* summon) override
+ if (pointId == POINT_BOAT) // Check might not be needed.
{
- switch (summon->GetEntry())
+ Talk(ActiveBoat[ActiveOrder[ActivedNumber]].say);
+ if (Creature* ancestor = me->SummonCreature(ActiveBoat[ActiveOrder[ActivedNumber]].npc, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnX, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnY, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnZ, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnO, TEMPSUMMON_CORPSE_DESPAWN))
{
- case NPC_SPIRIT_FOUNT:
- summon->CastSpell(summon, SPELL_SPIRIT_FOUNT, true);
- summon->SetDisplayId(11686);
- SpiritFountGUID = summon->GetGUID();
- break;
- case NPC_AVENGING_SPIRIT:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- {
- AddThreat(target, 0.0f, summon);
- summon->AI()->AttackStart(target);
- }
- break;
- default:
- break;
+ DoCast(ancestor, SPELL_CHANNEL_YMIRON_TO_SPIRIT);
+ ancestor->CastSpell(me, SPELL_CHANNEL_SPIRIT_TO_YMIRON, true);
+ ancestor->AddUnitFlag(UnitFlags(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE));
+ ancestor->SetDisableGravity(true);
+ ActiveAncestorGUID = ancestor->GetGUID();
}
-
- summons.Summon(summon);
+ events.ScheduleEvent(EVENT_RESUME_COMBAT, 5s);
}
+ }
- void DamageTaken(Unit* /*attacker*/, uint32& damage) override
+ void JustSummoned(Creature* summon) override
+ {
+ switch (summon->GetEntry())
{
- if (me->HealthBelowPctDamaged(100 - HealthAmountMultipler * HealthAmountModifier, damage) && !(damage >= me->GetHealth()))
- {
- uint8 Order = HealthAmountModifier - 1;
- ++HealthAmountModifier;
+ case NPC_SPIRIT_FOUNT:
+ summon->CastSpell(summon, SPELL_SPIRIT_FOUNT, true);
+ summon->SetDisplayId(11686);
+ SpiritFountGUID = summon->GetGUID();
+ break;
+ case NPC_AVENGING_SPIRIT:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
+ {
+ AddThreat(target, 0.0f, summon);
+ summon->AI()->AttackStart(target);
+ }
+ break;
+ default:
+ break;
+ }
- me->InterruptNonMeleeSpells(true);
- DoCast(me, SPELL_SCREAMS_OF_THE_DEAD);
+ summons.Summon(summon);
+ }
- me->AttackStop();
- me->SetReactState(REACT_PASSIVE);
- me->GetMotionMaster()->MovePoint(POINT_BOAT, ActiveBoat[ActiveOrder[Order]].MoveX, ActiveBoat[ActiveOrder[Order]].MoveY, ActiveBoat[ActiveOrder[Order]].MoveZ);
+ void DamageTaken(Unit* /*attacker*/, uint32& damage) override
+ {
+ if (me->HealthBelowPctDamaged(100 - HealthAmountMultipler * HealthAmountModifier, damage) && !(damage >= me->GetHealth()))
+ {
+ uint8 Order = HealthAmountModifier - 1;
+ ++HealthAmountModifier;
- DespawnBoatGhosts(ActiveAncestorGUID);
- DespawnBoatGhosts(SpiritFountGUID);
+ me->InterruptNonMeleeSpells(true);
+ DoCast(me, SPELL_SCREAMS_OF_THE_DEAD);
- events.CancelEvent(ActiveBoat[ActiveOrder[ActivedNumber]].event); // Cancels the event started on the previous transition.
- events.DelayEvents(10s, EVENT_GROUP_BASE_SPELLS);
+ me->AttackStop();
+ me->SetReactState(REACT_PASSIVE);
+ me->GetMotionMaster()->MovePoint(POINT_BOAT, ActiveBoat[ActiveOrder[Order]].MoveX, ActiveBoat[ActiveOrder[Order]].MoveY, ActiveBoat[ActiveOrder[Order]].MoveZ);
- ActivedNumber = Order;
- }
- }
+ DespawnBoatGhosts(ActiveAncestorGUID);
+ DespawnBoatGhosts(SpiritFountGUID);
- void ExecuteEvent(uint32 eventId) override
- {
- switch (eventId)
- {
- case EVENT_BANE:
- DoCast(SPELL_BANE);
- events.ScheduleEvent(EVENT_BANE, 20s, 25s);
- break;
- case EVENT_FETID_ROT:
- DoCastVictim(SPELL_FETID_ROT);
- events.ScheduleEvent(EVENT_FETID_ROT, 10s, 15s);
- break;
- case EVENT_DARK_SLASH:
- DoCastVictim(SPELL_DARK_SLASH);
- events.ScheduleEvent(EVENT_DARK_SLASH, 30s, 35s);
- break;
- case EVENT_ANCESTORS_VENGEANCE:
- DoCast(me, SPELL_ANCESTORS_VENGEANCE);
- events.ScheduleEvent(EVENT_ANCESTORS_VENGEANCE, DUNGEON_MODE(randtime(60s, 65s), randtime(45s, 50s)));
- break;
- case EVENT_RESUME_COMBAT:
- me->SetReactState(REACT_AGGRESSIVE);
- events.ScheduleEvent(ActiveBoat[ActiveOrder[ActivedNumber]].event, 5s);
- break;
- case EVENT_BJORN_SPIRIT_FOUNT:
- DoCast(SPELL_SUMMON_SPIRIT_FOUNT);
- break;
- case EVENT_HALDOR_SPIRIT_STRIKE:
- DoCastVictim(SPELL_SPIRIT_STRIKE);
- events.ScheduleEvent(EVENT_HALDOR_SPIRIT_STRIKE, 5s);
- break;
- case EVENT_RANULF_SPIRIT_BURST:
- DoCast(me, SPELL_SPIRIT_BURST);
- events.ScheduleEvent(EVENT_RANULF_SPIRIT_BURST, 10s);
- break;
- case EVENT_TORGYN_SUMMON_AVENGING_SPIRITS:
- for (uint8 i = 0; i < 4; ++i)
- DoCast(SPELL_SUMMON_AVENGING_SPIRIT);
- events.ScheduleEvent(EVENT_TORGYN_SUMMON_AVENGING_SPIRITS, 15s);
- break;
- default:
- break;
- }
- }
+ events.CancelEvent(ActiveBoat[ActiveOrder[ActivedNumber]].event); // Cancels the event started on the previous transition.
+ events.DelayEvents(10s, EVENT_GROUP_BASE_SPELLS);
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- Talk(SAY_DEATH);
+ ActivedNumber = Order;
}
+ }
- void KilledUnit(Unit* who) override
+ void ExecuteEvent(uint32 eventId) override
+ {
+ switch (eventId)
{
- if (who->GetTypeId() == TYPEID_PLAYER)
- Talk(SAY_SLAY);
+ case EVENT_BANE:
+ DoCast(SPELL_BANE);
+ events.ScheduleEvent(EVENT_BANE, 20s, 25s);
+ break;
+ case EVENT_FETID_ROT:
+ DoCastVictim(SPELL_FETID_ROT);
+ events.ScheduleEvent(EVENT_FETID_ROT, 10s, 15s);
+ break;
+ case EVENT_DARK_SLASH:
+ DoCastVictim(SPELL_DARK_SLASH);
+ events.ScheduleEvent(EVENT_DARK_SLASH, 30s, 35s);
+ break;
+ case EVENT_ANCESTORS_VENGEANCE:
+ DoCast(me, SPELL_ANCESTORS_VENGEANCE);
+ events.ScheduleEvent(EVENT_ANCESTORS_VENGEANCE, DUNGEON_MODE(randtime(60s, 65s), randtime(45s, 50s)));
+ break;
+ case EVENT_RESUME_COMBAT:
+ me->SetReactState(REACT_AGGRESSIVE);
+ events.ScheduleEvent(ActiveBoat[ActiveOrder[ActivedNumber]].event, 5s);
+ break;
+ case EVENT_BJORN_SPIRIT_FOUNT:
+ DoCast(SPELL_SUMMON_SPIRIT_FOUNT);
+ break;
+ case EVENT_HALDOR_SPIRIT_STRIKE:
+ DoCastVictim(SPELL_SPIRIT_STRIKE);
+ events.ScheduleEvent(EVENT_HALDOR_SPIRIT_STRIKE, 5s);
+ break;
+ case EVENT_RANULF_SPIRIT_BURST:
+ DoCast(me, SPELL_SPIRIT_BURST);
+ events.ScheduleEvent(EVENT_RANULF_SPIRIT_BURST, 10s);
+ break;
+ case EVENT_TORGYN_SUMMON_AVENGING_SPIRITS:
+ for (uint8 i = 0; i < 4; ++i)
+ DoCast(SPELL_SUMMON_AVENGING_SPIRIT);
+ events.ScheduleEvent(EVENT_TORGYN_SUMMON_AVENGING_SPIRITS, 15s);
+ break;
+ default:
+ break;
}
+ }
- void DespawnBoatGhosts(ObjectGuid& CreatureGUID)
- {
- // @todo: fire visual after ancestor despawns.
- if (!CreatureGUID.IsEmpty())
- if (Creature* temp = ObjectAccessor::GetCreature(*me, CreatureGUID))
- temp->DisappearAndDie();
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
- CreatureGUID.Clear();
- }
+ void KilledUnit(Unit* who) override
+ {
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
- private:
- bool kingsBane; // Achievement King's Bane
- uint8 ActiveOrder[4];
- uint8 ActivedNumber;
- uint32 HealthAmountModifier;
- uint32 HealthAmountMultipler;
- ObjectGuid ActiveAncestorGUID;
- ObjectGuid SpiritFountGUID;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
+ void DespawnBoatGhosts(ObjectGuid& CreatureGUID)
{
- return GetUtgardePinnacleAI<boss_ymironAI>(creature);
+ // @todo: fire visual after ancestor despawns.
+ if (!CreatureGUID.IsEmpty())
+ if (Creature* temp = ObjectAccessor::GetCreature(*me, CreatureGUID))
+ temp->DisappearAndDie();
+
+ CreatureGUID.Clear();
}
+
+private:
+ bool kingsBane; // Achievement King's Bane
+ uint8 ActiveOrder[4];
+ uint8 ActivedNumber;
+ uint32 HealthAmountModifier;
+ uint32 HealthAmountMultipler;
+ ObjectGuid ActiveAncestorGUID;
+ ObjectGuid SpiritFountGUID;
};
// 48292 - Dark Slash
@@ -349,7 +338,7 @@ class achievement_kings_bane : public AchievementCriteriaScript
void AddSC_boss_ymiron()
{
- new boss_ymiron();
+ RegisterUtgardePinnacleCreatureAI(boss_ymiron);
RegisterSpellScript(spell_dark_slash);
new achievement_kings_bane();
}