aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp597
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp107
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp107
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h3
4 files changed, 382 insertions, 432 deletions
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
index 5084ee2d34c..6f5ffb831df 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
@@ -89,234 +89,224 @@ Position const PosMoveOnSpawn[1] =
float const DamageIncrease = 35.0f;
float const DamageDecrease = 100.f / (1.f + DamageIncrease / 100.f) - 100.f;
-class boss_arlokk : public CreatureScript
+struct boss_arlokk : public BossAI
{
- public: boss_arlokk() : CreatureScript("boss_arlokk") { }
-
- struct boss_arlokkAI : public BossAI
+ boss_arlokk(Creature* creature) : BossAI(creature, DATA_ARLOKK)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _summonCountA = 0;
+ _summonCountB = 0;
+ }
+
+ void Reset() override
+ {
+ if (events.IsInPhase(PHASE_TWO))
+ me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageDecrease); // hack
+ _Reset();
+ Initialize();
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER));
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER));
+ me->SetWalk(false);
+ me->GetMotionMaster()->MovePoint(0, PosMoveOnSpawn[0]);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 7s, 9s, 0, PHASE_ONE);
+ events.ScheduleEvent(EVENT_GOUGE, 12s, 15s, 0, PHASE_ONE);
+ events.ScheduleEvent(EVENT_SUMMON_PROWLERS, 6s, 0, PHASE_ALL);
+ events.ScheduleEvent(EVENT_MARK_OF_ARLOKK, 9s, 11s, 0, PHASE_ALL);
+ events.ScheduleEvent(EVENT_TRANSFORM, 15s, 20s, 0, PHASE_ONE);
+ Talk(SAY_AGGRO);
+
+ // Sets up list of Panther spawners to cast on
+ std::list<Creature*> triggerList;
+ GetCreatureListWithEntryInGrid(triggerList, me, NPC_PANTHER_TRIGGER, 100.0f);
+ if (!triggerList.empty())
{
- boss_arlokkAI(Creature* creature) : BossAI(creature, DATA_ARLOKK)
- {
- Initialize();
- }
-
- void Initialize()
- {
- _summonCountA = 0;
- _summonCountB = 0;
- }
-
- void Reset() override
- {
- if (events.IsInPhase(PHASE_TWO))
- me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageDecrease); // hack
- _Reset();
- Initialize();
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER));
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER));
- me->SetWalk(false);
- me->GetMotionMaster()->MovePoint(0, PosMoveOnSpawn[0]);
- }
-
- void JustDied(Unit* /*killer*/) override
+ uint8 sideA = 0;
+ uint8 sideB = 0;
+ for (std::list<Creature*>::const_iterator itr = triggerList.begin(); itr != triggerList.end(); ++itr)
{
- _JustDied();
- Talk(SAY_DEATH);
- }
-
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 7s, 9s, 0, PHASE_ONE);
- events.ScheduleEvent(EVENT_GOUGE, 12s, 15s, 0, PHASE_ONE);
- events.ScheduleEvent(EVENT_SUMMON_PROWLERS, 6s, 0, PHASE_ALL);
- events.ScheduleEvent(EVENT_MARK_OF_ARLOKK, 9s, 11s, 0, PHASE_ALL);
- events.ScheduleEvent(EVENT_TRANSFORM, 15s, 20s, 0, PHASE_ONE);
- Talk(SAY_AGGRO);
-
- // Sets up list of Panther spawners to cast on
- std::list<Creature*> triggerList;
- GetCreatureListWithEntryInGrid(triggerList, me, NPC_PANTHER_TRIGGER, 100.0f);
- if (!triggerList.empty())
+ if (Creature* trigger = *itr)
{
- uint8 sideA = 0;
- uint8 sideB = 0;
- for (std::list<Creature*>::const_iterator itr = triggerList.begin(); itr != triggerList.end(); ++itr)
+ if (trigger->GetPositionY() < -1625.0f)
{
- if (Creature* trigger = *itr)
- {
- if (trigger->GetPositionY() < -1625.0f)
- {
- _triggersSideAGUID[sideA] = trigger->GetGUID();
- ++sideA;
- }
- else
- {
- _triggersSideBGUID[sideB] = trigger->GetGUID();
- ++sideB;
- }
- }
+ _triggersSideAGUID[sideA] = trigger->GetGUID();
+ ++sideA;
+ }
+ else
+ {
+ _triggersSideBGUID[sideB] = trigger->GetGUID();
+ ++sideB;
}
}
}
-
- void EnterEvadeMode(EvadeReason why) override
- {
- BossAI::EnterEvadeMode(why);
- if (GameObject* object = instance->GetGameObject(DATA_GONG_BETHEKK))
- object->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- me->DespawnOrUnsummon(4s);
- }
-
- void SetData(uint32 id, uint32 /*value*/) override
- {
- if (id == 1)
- --_summonCountA;
- else if (id == 2)
- --_summonCountB;
- }
-
- void UpdateAI(uint32 diff) override
+ }
+ }
+
+ void EnterEvadeMode(EvadeReason why) override
+ {
+ BossAI::EnterEvadeMode(why);
+ if (GameObject* object = instance->GetGameObject(DATA_GONG_BETHEKK))
+ object->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ me->DespawnOrUnsummon(4s);
+ }
+
+ void SetData(uint32 id, uint32 /*value*/) override
+ {
+ if (id == 1)
+ --_summonCountA;
+ else if (id == 2)
+ --_summonCountB;
+ }
+
+ 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 (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
+ case EVENT_SHADOW_WORD_PAIN:
+ DoCastVictim(SPELL_SHADOW_WORD_PAIN, true);
+ events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 5s, 7s, 0, PHASE_ONE);
+ break;
+ case EVENT_GOUGE:
+ DoCastVictim(SPELL_GOUGE, true);
+ break;
+ case EVENT_SUMMON_PROWLERS:
+ if (_summonCountA < MAX_PROWLERS_PER_SIDE)
{
- case EVENT_SHADOW_WORD_PAIN:
- DoCastVictim(SPELL_SHADOW_WORD_PAIN, true);
- events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 5s, 7s, 0, PHASE_ONE);
- break;
- case EVENT_GOUGE:
- DoCastVictim(SPELL_GOUGE, true);
- break;
- case EVENT_SUMMON_PROWLERS:
- if (_summonCountA < MAX_PROWLERS_PER_SIDE)
- {
- if (Unit* trigger = ObjectAccessor::GetUnit(*me, _triggersSideAGUID[urand(0, 4)]))
- {
- trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER);
- ++_summonCountA;
- }
- }
- if (_summonCountB < MAX_PROWLERS_PER_SIDE)
- {
- if (Unit* trigger = ObjectAccessor::GetUnit(*me, _triggersSideBGUID[urand(0, 4)]))
- {
- trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER);
- ++_summonCountB;
- }
- }
- events.ScheduleEvent(EVENT_SUMMON_PROWLERS, 6s, 0, PHASE_ALL);
- break;
- case EVENT_MARK_OF_ARLOKK:
- {
- Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, urand(1, 3), 0.0f, false, true, -SPELL_MARK_OF_ARLOKK);
- if (!target)
- target = me->GetVictim();
- if (target)
- {
- DoCast(target, SPELL_MARK_OF_ARLOKK, true);
- Talk(SAY_FEAST_PROWLER, target);
- }
- events.ScheduleEvent(EVENT_MARK_OF_ARLOKK, 120s, 130s);
- break;
- }
- case EVENT_TRANSFORM:
+ if (Unit* trigger = ObjectAccessor::GetUnit(*me, _triggersSideAGUID[urand(0, 4)]))
{
- DoCast(me, SPELL_PANTHER_TRANSFORM); // SPELL_AURA_TRANSFORM
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(EQUIP_UNEQUIP));
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(EQUIP_UNEQUIP));
- /*
- CreatureTemplate const* cinfo = me->GetCreatureTemplate();
- me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35)));
- me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
- me->UpdateDamagePhysical(BASE_ATTACK);
- */
- me->AttackStop();
- ResetThreatList();
- me->SetReactState(REACT_PASSIVE);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
- DoCast(me, SPELL_VANISH_VISUAL);
- DoCast(me, SPELL_VANISH);
- events.ScheduleEvent(EVENT_VANISH, 1s, 0, PHASE_ONE);
- break;
+ trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER);
+ ++_summonCountA;
}
- case EVENT_VANISH:
- DoCast(me, SPELL_SUPER_INVIS);
- me->SetWalk(false);
- me->GetMotionMaster()->MovePoint(0, frand(-11551.0f, -11508.0f), frand(-1638.0f, -1617.0f), me->GetPositionZ());
- events.ScheduleEvent(EVENT_VANISH_2, 9s, 0, PHASE_ONE);
- break;
- case EVENT_VANISH_2:
- DoCast(me, SPELL_VANISH);
- DoCast(me, SPELL_SUPER_INVIS);
- events.ScheduleEvent(EVENT_VISIBLE, 7s, 10s, 0, PHASE_ONE);
- break;
- case EVENT_VISIBLE:
- me->SetReactState(REACT_AGGRESSIVE);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- AttackStart(target);
- me->RemoveAura(SPELL_SUPER_INVIS);
- me->RemoveAura(SPELL_VANISH);
- events.ScheduleEvent(EVENT_RAVAGE, 10s, 14s, 0, PHASE_TWO);
- events.ScheduleEvent(EVENT_TRANSFORM_BACK, 15s, 18s, 0, PHASE_TWO);
- events.SetPhase(PHASE_TWO);
- me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageIncrease); // hack
- break;
- case EVENT_RAVAGE:
- DoCastVictim(SPELL_RAVAGE, true);
- events.ScheduleEvent(EVENT_RAVAGE, 10s, 14s, 0, PHASE_TWO);
- break;
- case EVENT_TRANSFORM_BACK:
+ }
+ if (_summonCountB < MAX_PROWLERS_PER_SIDE)
+ {
+ if (Unit* trigger = ObjectAccessor::GetUnit(*me, _triggersSideBGUID[urand(0, 4)]))
{
- me->RemoveAura(SPELL_PANTHER_TRANSFORM); // SPELL_AURA_TRANSFORM
- DoCast(me, SPELL_VANISH_VISUAL);
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER));
- me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER));
- /*
- CreatureTemplate const* cinfo = me->GetCreatureTemplate();
- me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg));
- me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg));
- me->UpdateDamagePhysical(BASE_ATTACK);
- */
- me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageDecrease); // hack
- events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 4s, 7s, 0, PHASE_ONE);
- events.ScheduleEvent(EVENT_GOUGE, 12s, 15s, 0, PHASE_ONE);
- events.ScheduleEvent(EVENT_TRANSFORM, 16s, 20s, 0, PHASE_ONE);
- events.SetPhase(PHASE_ONE);
- break;
+ trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER);
+ ++_summonCountB;
}
- default:
- break;
}
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ events.ScheduleEvent(EVENT_SUMMON_PROWLERS, 6s, 0, PHASE_ALL);
+ break;
+ case EVENT_MARK_OF_ARLOKK:
+ {
+ Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, urand(1, 3), 0.0f, false, true, -SPELL_MARK_OF_ARLOKK);
+ if (!target)
+ target = me->GetVictim();
+ if (target)
+ {
+ DoCast(target, SPELL_MARK_OF_ARLOKK, true);
+ Talk(SAY_FEAST_PROWLER, target);
+ }
+ events.ScheduleEvent(EVENT_MARK_OF_ARLOKK, 120s, 130s);
+ break;
}
-
- DoMeleeAttackIfReady();
+ case EVENT_TRANSFORM:
+ {
+ DoCast(me, SPELL_PANTHER_TRANSFORM); // SPELL_AURA_TRANSFORM
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(EQUIP_UNEQUIP));
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(EQUIP_UNEQUIP));
+ /*
+ CreatureTemplate const* cinfo = me->GetCreatureTemplate();
+ me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35)));
+ me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
+ me->UpdateDamagePhysical(BASE_ATTACK);
+ */
+ me->AttackStop();
+ ResetThreatList();
+ me->SetReactState(REACT_PASSIVE);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
+ DoCast(me, SPELL_VANISH_VISUAL);
+ DoCast(me, SPELL_VANISH);
+ events.ScheduleEvent(EVENT_VANISH, 1s, 0, PHASE_ONE);
+ break;
+ }
+ case EVENT_VANISH:
+ DoCast(me, SPELL_SUPER_INVIS);
+ me->SetWalk(false);
+ me->GetMotionMaster()->MovePoint(0, frand(-11551.0f, -11508.0f), frand(-1638.0f, -1617.0f), me->GetPositionZ());
+ events.ScheduleEvent(EVENT_VANISH_2, 9s, 0, PHASE_ONE);
+ break;
+ case EVENT_VANISH_2:
+ DoCast(me, SPELL_VANISH);
+ DoCast(me, SPELL_SUPER_INVIS);
+ events.ScheduleEvent(EVENT_VISIBLE, 7s, 10s, 0, PHASE_ONE);
+ break;
+ case EVENT_VISIBLE:
+ me->SetReactState(REACT_AGGRESSIVE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
+ AttackStart(target);
+ me->RemoveAura(SPELL_SUPER_INVIS);
+ me->RemoveAura(SPELL_VANISH);
+ events.ScheduleEvent(EVENT_RAVAGE, 10s, 14s, 0, PHASE_TWO);
+ events.ScheduleEvent(EVENT_TRANSFORM_BACK, 15s, 18s, 0, PHASE_TWO);
+ events.SetPhase(PHASE_TWO);
+ me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageIncrease); // hack
+ break;
+ case EVENT_RAVAGE:
+ DoCastVictim(SPELL_RAVAGE, true);
+ events.ScheduleEvent(EVENT_RAVAGE, 10s, 14s, 0, PHASE_TWO);
+ break;
+ case EVENT_TRANSFORM_BACK:
+ {
+ me->RemoveAura(SPELL_PANTHER_TRANSFORM); // SPELL_AURA_TRANSFORM
+ DoCast(me, SPELL_VANISH_VISUAL);
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER));
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER));
+ /*
+ CreatureTemplate const* cinfo = me->GetCreatureTemplate();
+ me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg));
+ me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg));
+ me->UpdateDamagePhysical(BASE_ATTACK);
+ */
+ me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageDecrease); // hack
+ events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 4s, 7s, 0, PHASE_ONE);
+ events.ScheduleEvent(EVENT_GOUGE, 12s, 15s, 0, PHASE_ONE);
+ events.ScheduleEvent(EVENT_TRANSFORM, 16s, 20s, 0, PHASE_ONE);
+ events.SetPhase(PHASE_ONE);
+ break;
+ }
+ default:
+ break;
}
- private:
- uint8 _summonCountA;
- uint8 _summonCountB;
- ObjectGuid _triggersSideAGUID[5];
- ObjectGuid _triggersSideBGUID[5];
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetZulGurubAI<boss_arlokkAI>(creature);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
+
+ DoMeleeAttackIfReady();
+ }
+
+private:
+ uint8 _summonCountA;
+ uint8 _summonCountB;
+ ObjectGuid _triggersSideAGUID[5];
+ ObjectGuid _triggersSideBGUID[5];
};
/*######
@@ -340,95 +330,85 @@ Position const PosProwlerCenter[1] =
{ -11556.7f, -1631.344f, 41.2994f, 0.0f }
};
-class npc_zulian_prowler : public CreatureScript
+struct npc_zulian_prowler : public ScriptedAI
{
- public: npc_zulian_prowler() : CreatureScript("npc_zulian_prowler") { }
-
- struct npc_zulian_prowlerAI : public ScriptedAI
+ npc_zulian_prowler(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
+ {
+ _sideData = 0;
+ }
+
+ void Reset() override
+ {
+ if (me->GetPositionY() < -1625.0f)
+ _sideData = 1;
+ else
+ _sideData = 2;
+
+ DoCast(me, SPELL_SNEAK_RANK_1_1);
+ DoCast(me, SPELL_SNEAK_RANK_1_2);
+
+ if (Creature* arlokk = _instance->GetCreature(DATA_ARLOKK))
+ if (arlokk->IsAlive())
+ me->GetMotionMaster()->MovePoint(0, arlokk->GetPosition());
+
+ _events.ScheduleEvent(EVENT_ATTACK, 6s);
+ }
+
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ me->GetMotionMaster()->Clear();
+ me->RemoveAura(SPELL_SNEAK_RANK_1_1);
+ me->RemoveAura(SPELL_SNEAK_RANK_1_2);
+ }
+
+ void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
+ {
+ Unit* unitCaster = caster->ToUnit();
+ if (!unitCaster)
+ return;
+
+ if (spellInfo->Id == SPELL_MARK_OF_ARLOKK_TRIGGER) // Should only hit if line of sight
+ me->Attack(unitCaster, true);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ if (Creature* arlokk = _instance->GetCreature(DATA_ARLOKK))
{
- npc_zulian_prowlerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
- {
- _sideData = 0;
- }
-
- void Reset() override
- {
- if (me->GetPositionY() < -1625.0f)
- _sideData = 1;
- else
- _sideData = 2;
-
- DoCast(me, SPELL_SNEAK_RANK_1_1);
- DoCast(me, SPELL_SNEAK_RANK_1_2);
-
- if (Creature* arlokk = _instance->GetCreature(DATA_ARLOKK))
- if (arlokk->IsAlive())
- me->GetMotionMaster()->MovePoint(0, arlokk->GetPosition());
-
- _events.ScheduleEvent(EVENT_ATTACK, 6s);
- }
-
- void JustEngagedWith(Unit* /*who*/) override
- {
- me->GetMotionMaster()->Clear();
- me->RemoveAura(SPELL_SNEAK_RANK_1_1);
- me->RemoveAura(SPELL_SNEAK_RANK_1_2);
- }
-
- void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
- {
- Unit* unitCaster = caster->ToUnit();
- if (!unitCaster)
- return;
+ if (arlokk->IsAlive())
+ arlokk->GetAI()->SetData(_sideData, 0);
+ }
+ me->DespawnOrUnsummon(4s);
+ }
- if (spellInfo->Id == SPELL_MARK_OF_ARLOKK_TRIGGER) // Should only hit if line of sight
- me->Attack(unitCaster, true);
- }
+ void UpdateAI(uint32 diff) override
+ {
+ if (UpdateVictim())
+ {
+ DoMeleeAttackIfReady();
+ return;
+ }
- void JustDied(Unit* /*killer*/) override
- {
- if (Creature* arlokk = _instance->GetCreature(DATA_ARLOKK))
- {
- if (arlokk->IsAlive())
- arlokk->GetAI()->SetData(_sideData, 0);
- }
- me->DespawnOrUnsummon(4s);
- }
+ _events.Update(diff);
- void UpdateAI(uint32 diff) override
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
{
- if (UpdateVictim())
- {
- DoMeleeAttackIfReady();
- return;
- }
-
- _events.Update(diff);
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_ATTACK:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0.0f, 100, false))
- me->Attack(target, true);
- break;
- default:
- break;
- }
- }
+ case EVENT_ATTACK:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0.0f, 100, false))
+ me->Attack(target, true);
+ break;
+ default:
+ break;
}
-
- private:
- int32 _sideData;
- EventMap _events;
- InstanceScript* _instance;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetZulGurubAI<npc_zulian_prowlerAI>(creature);
}
+ }
+
+private:
+ int32 _sideData;
+ EventMap _events;
+ InstanceScript* _instance;
};
/*######
@@ -440,33 +420,22 @@ Position const PosSummonArlokk[1] =
{ -11507.22f, -1628.062f, 41.38264f, 3.159046f }
};
-class go_gong_of_bethekk : public GameObjectScript
+struct go_gong_of_bethekk : public GameObjectAI
{
- public:
- go_gong_of_bethekk() : GameObjectScript("go_gong_of_bethekk") { }
-
- struct go_gong_of_bethekkAI : public GameObjectAI
- {
- go_gong_of_bethekkAI(GameObject* go) : GameObjectAI(go) { }
-
- bool OnGossipHello(Player* /*player*/) override
- {
- me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- me->SendCustomAnim(0);
- me->SummonCreature(NPC_ARLOKK, PosSummonArlokk[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10min);
- return true;
- }
- };
-
- GameObjectAI* GetAI(GameObject* go) const override
- {
- return GetZulGurubAI<go_gong_of_bethekkAI>(go);
- }
+ go_gong_of_bethekk(GameObject* go) : GameObjectAI(go) { }
+
+ bool OnGossipHello(Player* /*player*/) override
+ {
+ me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ me->SendCustomAnim(0);
+ me->SummonCreature(NPC_ARLOKK, PosSummonArlokk[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10min);
+ return true;
+ }
};
void AddSC_boss_arlokk()
{
- new boss_arlokk();
- new npc_zulian_prowler();
- new go_gong_of_bethekk();
+ RegisterZulGurubCreatureAI(boss_arlokk);
+ RegisterZulGurubCreatureAI(npc_zulian_prowler);
+ RegisterZulGurubGameObjectAI(go_gong_of_bethekk);
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp
index 30c94bc3417..fc195a24e89 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp
@@ -33,78 +33,67 @@ enum Events
EVENT_SLAM = 3
};
-class boss_gahzranka : public CreatureScript // gahzranka
+struct boss_gahzranka : public BossAI
{
- public:
- boss_gahzranka() : CreatureScript("boss_gahzranka") { }
+ boss_gahzranka(Creature* creature) : BossAI(creature, DATA_GAHZRANKA) { }
- struct boss_gahzrankaAI : public BossAI
- {
- boss_gahzrankaAI(Creature* creature) : BossAI(creature, DATA_GAHZRANKA) { }
+ void Reset() override
+ {
+ _Reset();
+ }
- void Reset() override
- {
- _Reset();
- }
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ }
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- }
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ events.ScheduleEvent(EVENT_FROSTBREATH, 8s);
+ events.ScheduleEvent(EVENT_MASSIVEGEYSER, 25s);
+ events.ScheduleEvent(EVENT_SLAM, 15s);
+ }
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- events.ScheduleEvent(EVENT_FROSTBREATH, 8s);
- events.ScheduleEvent(EVENT_MASSIVEGEYSER, 25s);
- events.ScheduleEvent(EVENT_SLAM, 15s);
- }
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
+ events.Update(diff);
- events.Update(diff);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_FROSTBREATH:
- DoCastVictim(SPELL_FROSTBREATH, true);
- events.ScheduleEvent(EVENT_FROSTBREATH, 7s, 11s);
- break;
- case EVENT_MASSIVEGEYSER:
- DoCastVictim(SPELL_MASSIVEGEYSER, true);
- events.ScheduleEvent(EVENT_MASSIVEGEYSER, 22s, 32s);
- break;
- case EVENT_SLAM:
- DoCastVictim(SPELL_SLAM, true);
- events.ScheduleEvent(EVENT_SLAM, 12s, 20s);
- break;
- default:
- break;
- }
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- }
-
- DoMeleeAttackIfReady();
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_FROSTBREATH:
+ DoCastVictim(SPELL_FROSTBREATH, true);
+ events.ScheduleEvent(EVENT_FROSTBREATH, 7s, 11s);
+ break;
+ case EVENT_MASSIVEGEYSER:
+ DoCastVictim(SPELL_MASSIVEGEYSER, true);
+ events.ScheduleEvent(EVENT_MASSIVEGEYSER, 22s, 32s);
+ break;
+ case EVENT_SLAM:
+ DoCastVictim(SPELL_SLAM, true);
+ events.ScheduleEvent(EVENT_SLAM, 12s, 20s);
+ break;
+ default:
+ break;
}
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetZulGurubAI<boss_gahzrankaAI>(creature);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
+
+ DoMeleeAttackIfReady();
+ }
};
void AddSC_boss_gahzranka()
{
- new boss_gahzranka();
+ RegisterZulGurubCreatureAI(boss_gahzranka);
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp
index 4e56eb23ed2..1a4c67d3a3f 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp
@@ -31,81 +31,70 @@ enum Events
EVENT_GROUND_TREMOR = 2
};
-class boss_grilek : public CreatureScript // grilek
+struct boss_grilek : public BossAI
{
- public:
- boss_grilek() : CreatureScript("boss_grilek") { }
+ boss_grilek(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { }
- struct boss_grilekAI : public BossAI
- {
- boss_grilekAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { }
+ void Reset() override
+ {
+ _Reset();
+ }
- void Reset() override
- {
- _Reset();
- }
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ }
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- }
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ events.ScheduleEvent(EVENT_AVATAR, 15s, 25s);
+ events.ScheduleEvent(EVENT_GROUND_TREMOR, 15s, 25s);
+ }
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- events.ScheduleEvent(EVENT_AVATAR, 15s, 25s);
- events.ScheduleEvent(EVENT_GROUND_TREMOR, 15s, 25s);
- }
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
+ events.Update(diff);
- events.Update(diff);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_AVATAR:
+ DoCast(me, SPELL_AVATAR);
+ if (Unit* victim = me->GetVictim())
{
- case EVENT_AVATAR:
- DoCast(me, SPELL_AVATAR);
- if (Unit* victim = me->GetVictim())
- {
- if (GetThreat(victim))
- ModifyThreatByPercent(victim, -50);
- }
-
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1))
- AttackStart(target);
- events.ScheduleEvent(EVENT_AVATAR, 25s, 35s);
- break;
- case EVENT_GROUND_TREMOR:
- DoCastVictim(SPELL_GROUND_TREMOR, true);
- events.ScheduleEvent(EVENT_GROUND_TREMOR, 12s, 16s);
- break;
- default:
- break;
+ if (GetThreat(victim))
+ ModifyThreatByPercent(victim, -50);
}
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- }
-
- DoMeleeAttackIfReady();
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1))
+ AttackStart(target);
+ events.ScheduleEvent(EVENT_AVATAR, 25s, 35s);
+ break;
+ case EVENT_GROUND_TREMOR:
+ DoCastVictim(SPELL_GROUND_TREMOR, true);
+ events.ScheduleEvent(EVENT_GROUND_TREMOR, 12s, 16s);
+ break;
+ default:
+ break;
}
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetZulGurubAI<boss_grilekAI>(creature);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
+
+ DoMeleeAttackIfReady();
+ }
};
void AddSC_boss_grilek()
{
- new boss_grilek();
+ RegisterZulGurubCreatureAI(boss_grilek);
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
index 6cfa2710fc6..31461fd7d6e 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
@@ -83,4 +83,7 @@ inline AI* GetZulGurubAI(T* obj)
return GetInstanceAI<AI>(obj, ZGScriptName);
}
+#define RegisterZulGurubCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetZulGurubAI)
+#define RegisterZulGurubGameObjectAI(ai_name) RegisterGameObjectAIWithFactory(ai_name, GetZulGurubAI)
+
#endif