diff options
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 |