aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2021-04-20 17:34:57 +0300
committerGitHub <noreply@github.com>2021-04-20 17:34:57 +0300
commit5d3bafdbab095c3b58e2f41eed7f9f4c7bf6ba91 (patch)
tree83aa170885d3db6f5fb8d4706b762cdcf1297e24
parent055784d097435166d06dd75577f59024a90c6694 (diff)
Scripts/HoS: Update Sjonnir to new model (#26433)
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp377
1 files changed, 172 insertions, 205 deletions
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
index a94b96d3d09..58654003721 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
@@ -72,230 +72,197 @@ Position const PipeLocations[] =
Position const CenterPoint = { 1295.21f, 667.157f, 189.691f, 0.0f };
-class boss_sjonnir : public CreatureScript
+struct boss_sjonnir : public BossAI
{
- public:
- boss_sjonnir() : CreatureScript("boss_sjonnir") { }
-
- struct boss_sjonnirAI : public BossAI
+ boss_sjonnir(Creature* creature) : BossAI(creature, DATA_SJONNIR)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ abuseTheOoze = 0;
+ }
+
+ void Reset() override
+ {
+ _Reset();
+ Initialize();
+ }
+
+ void JustEngagedWith(Unit* who) override
+ {
+ if (!instance->CheckRequiredBosses(DATA_SJONNIR, who->ToPlayer()))
{
- boss_sjonnirAI(Creature* creature) : BossAI(creature, DATA_SJONNIR)
- {
- Initialize();
- }
-
- void Initialize()
- {
- abuseTheOoze = 0;
- }
-
- void Reset() override
- {
- _Reset();
- Initialize();
- }
+ EnterEvadeMode();
+ return;
+ }
- void JustEngagedWith(Unit* who) override
+ BossAI::JustEngagedWith(who);
+ Talk(SAY_AGGRO);
+
+ events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 3s, 8s);
+ events.ScheduleEvent(EVENT_LIGHTNING_SHIELD, 20s, 25s);
+ events.ScheduleEvent(EVENT_STATIC_CHARGE, 20s, 25s);
+ events.ScheduleEvent(EVENT_LIGHTNING_RING, 30s, 35s);
+ events.ScheduleEvent(EVENT_SUMMON, 5s);
+ events.ScheduleEvent(EVENT_FRENZY, 5min);
+ }
+
+ void JustSummoned(Creature* summon) override
+ {
+ summon->GetMotionMaster()->MovePoint(0, CenterPoint);
+ /*if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
+ summon->AI()->AttackStart(target);*/
+ summons.Summon(summon);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
+ void KilledUnit(Unit* who) override
+ {
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
+
+ void DoAction(int32 action) override
+ {
+ if (action == ACTION_OOZE_DEAD)
+ ++abuseTheOoze;
+ }
+
+ uint32 GetData(uint32 type) const override
+ {
+ if (type == DATA_ABUSE_THE_OOZE)
+ return abuseTheOoze;
+
+ return 0;
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- if (!instance->CheckRequiredBosses(DATA_SJONNIR, who->ToPlayer()))
+ case EVENT_CHAIN_LIGHTNING:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
+ DoCast(target, SPELL_CHAIN_LIGHTING);
+ events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 10s, 15s);
+ break;
+ case EVENT_LIGHTNING_SHIELD:
+ DoCast(me, SPELL_LIGHTING_SHIELD);
+ break;
+ case EVENT_STATIC_CHARGE:
+ DoCastVictim(SPELL_STATIC_CHARGE);
+ events.ScheduleEvent(EVENT_STATIC_CHARGE, 20s, 25s);
+ break;
+ case EVENT_LIGHTNING_RING:
+ DoCast(me, SPELL_LIGHTING_RING);
+ events.ScheduleEvent(EVENT_LIGHTNING_RING, 30s, 35s);
+ break;
+ case EVENT_SUMMON:
{
- EnterEvadeMode();
- return;
+ uint8 summonPipe = urand(0, 1);
+ if (HealthAbovePct(75))
+ me->SummonCreature(NPC_FORGED_IRON_DWARF, PipeLocations[summonPipe], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s);
+ else if (HealthAbovePct(50))
+ me->SummonCreature(NPC_FORGED_IRON_TROGG, PipeLocations[summonPipe], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s);
+ else if (HealthAbovePct(25))
+ me->SummonCreature(NPC_MALFORMED_OOZE, PipeLocations[summonPipe], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s);
+ else
+ me->SummonCreature(NPC_EARTHEN_DWARF, PipeLocations[summonPipe], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s);
+
+ events.ScheduleEvent(EVENT_SUMMON, 20s);
+ break;
}
-
- BossAI::JustEngagedWith(who);
- Talk(SAY_AGGRO);
-
- events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 3s, 8s);
- events.ScheduleEvent(EVENT_LIGHTNING_SHIELD, 20s, 25s);
- events.ScheduleEvent(EVENT_STATIC_CHARGE, 20s, 25s);
- events.ScheduleEvent(EVENT_LIGHTNING_RING, 30s, 35s);
- events.ScheduleEvent(EVENT_SUMMON, 5s);
- events.ScheduleEvent(EVENT_FRENZY, 5min);
+ case EVENT_FRENZY:
+ /// @todo: add emote
+ DoCast(me, SPELL_FRENZY, true);
+ break;
+ default:
+ break;
}
- void JustSummoned(Creature* summon) override
- {
- summon->GetMotionMaster()->MovePoint(0, CenterPoint);
- /*if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
- summon->AI()->AttackStart(target);*/
- summons.Summon(summon);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- Talk(SAY_DEATH);
- }
-
- void KilledUnit(Unit* who) override
- {
- if (who->GetTypeId() == TYPEID_PLAYER)
- Talk(SAY_SLAY);
- }
-
- void DoAction(int32 action) override
- {
- if (action == ACTION_OOZE_DEAD)
- ++abuseTheOoze;
- }
-
- uint32 GetData(uint32 type) const override
- {
- if (type == DATA_ABUSE_THE_OOZE)
- return abuseTheOoze;
-
- return 0;
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_CHAIN_LIGHTNING:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
- DoCast(target, SPELL_CHAIN_LIGHTING);
- events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 10s, 15s);
- break;
- case EVENT_LIGHTNING_SHIELD:
- DoCast(me, SPELL_LIGHTING_SHIELD);
- break;
- case EVENT_STATIC_CHARGE:
- DoCastVictim(SPELL_STATIC_CHARGE);
- events.ScheduleEvent(EVENT_STATIC_CHARGE, 20s, 25s);
- break;
- case EVENT_LIGHTNING_RING:
- DoCast(me, SPELL_LIGHTING_RING);
- events.ScheduleEvent(EVENT_LIGHTNING_RING, 30s, 35s);
- break;
- case EVENT_SUMMON:
- {
- uint8 summonPipe = urand(0, 1);
- if (HealthAbovePct(75))
- me->SummonCreature(NPC_FORGED_IRON_DWARF, PipeLocations[summonPipe], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s);
- else if (HealthAbovePct(50))
- me->SummonCreature(NPC_FORGED_IRON_TROGG, PipeLocations[summonPipe], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s);
- else if (HealthAbovePct(25))
- me->SummonCreature(NPC_MALFORMED_OOZE, PipeLocations[summonPipe], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s);
- else
- me->SummonCreature(NPC_EARTHEN_DWARF, PipeLocations[summonPipe], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s);
-
- events.ScheduleEvent(EVENT_SUMMON, 20s);
- break;
- }
- case EVENT_FRENZY:
- /// @todo: add emote
- DoCast(me, SPELL_FRENZY, true);
- break;
- default:
- break;
- }
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- }
-
- DoMeleeAttackIfReady();
- }
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ }
- private:
- uint8 abuseTheOoze;
- };
+ DoMeleeAttackIfReady();
+ }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetHallsOfStoneAI<boss_sjonnirAI>(creature);
- }
+ private:
+ uint8 abuseTheOoze;
};
-class npc_malformed_ooze : public CreatureScript
+struct npc_malformed_ooze : public ScriptedAI
{
- public:
- npc_malformed_ooze() : CreatureScript("npc_malformed_ooze") { }
-
- struct npc_malformed_oozeAI : public ScriptedAI
+ npc_malformed_ooze(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _mergeTimer = 10000;
+ }
+
+ void Reset() override
+ {
+ Initialize();
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (_mergeTimer <= diff)
{
- npc_malformed_oozeAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- }
-
- void Initialize()
- {
- _mergeTimer = 10000;
- }
-
- void Reset() override
+ if (Creature* temp = me->FindNearestCreature(NPC_MALFORMED_OOZE, 3.0f, true))
{
- Initialize();
+ DoSpawnCreature(NPC_IRON_SLUDGE, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20s);
+ temp->DisappearAndDie();
+ me->DisappearAndDie();
}
+ _mergeTimer = 3000;
+ }
+ else
+ _mergeTimer -= diff;
- void UpdateAI(uint32 diff) override
- {
- if (_mergeTimer <= diff)
- {
- if (Creature* temp = me->FindNearestCreature(NPC_MALFORMED_OOZE, 3.0f, true))
- {
- DoSpawnCreature(NPC_IRON_SLUDGE, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20s);
- temp->DisappearAndDie();
- me->DisappearAndDie();
- }
- _mergeTimer = 3000;
- }
- else
- _mergeTimer -= diff;
-
- if (!UpdateVictim())
- return;
-
- DoMeleeAttackIfReady();
- }
+ if (!UpdateVictim())
+ return;
- private:
- uint32 _mergeTimer;
- };
+ DoMeleeAttackIfReady();
+ }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetHallsOfStoneAI<npc_malformed_oozeAI>(creature);
- }
+private:
+ uint32 _mergeTimer;
};
-class npc_iron_sludge : public CreatureScript
+struct npc_iron_sludge : public ScriptedAI
{
- public:
- npc_iron_sludge() : CreatureScript("npc_iron_sludge") { }
-
- struct npc_iron_sludgeAI : public ScriptedAI
- {
- npc_iron_sludgeAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
-
- void JustDied(Unit* /*killer*/) override
- {
- if (Creature* sjonnir = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SJONNIR)))
- sjonnir->AI()->DoAction(ACTION_OOZE_DEAD);
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetHallsOfStoneAI<npc_iron_sludgeAI>(creature);
- }
+ npc_iron_sludge(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = creature->GetInstanceScript();
+ }
+
+ InstanceScript* instance;
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ if (Creature* sjonnir = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SJONNIR)))
+ sjonnir->AI()->DoAction(ACTION_OOZE_DEAD);
+ }
};
class achievement_abuse_the_ooze : public AchievementCriteriaScript
@@ -320,8 +287,8 @@ class achievement_abuse_the_ooze : public AchievementCriteriaScript
void AddSC_boss_sjonnir()
{
- new boss_sjonnir();
- new npc_malformed_ooze();
- new npc_iron_sludge();
+ RegisterHallsOfStoneCreatureAI(boss_sjonnir);
+ RegisterHallsOfStoneCreatureAI(npc_malformed_ooze);
+ RegisterHallsOfStoneCreatureAI(npc_iron_sludge);
new achievement_abuse_the_ooze();
}