diff options
-rw-r--r-- | src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp | 172 | ||||
-rw-r--r-- | src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h | 2 |
2 files changed, 75 insertions, 99 deletions
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp index 5525c0494a6..34038bf8b85 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp @@ -85,129 +85,103 @@ class go_blackfathom_fire : public GameObjectScript } }; -class npc_blackfathom_deeps_event : public CreatureScript +enum Events { -public: - npc_blackfathom_deeps_event() : CreatureScript("npc_blackfathom_deeps_event") { } + EVENT_RAVAGE = 1, + EVENT_FROST_NOVA, + EVENT_FROST_BOLT_VOLLEY +}; - CreatureAI* GetAI(Creature* creature) const override - { - return GetBlackfathomDeepsAI<npc_blackfathom_deeps_eventAI>(creature); - } +struct npc_blackfathom_deeps_event : public ScriptedAI +{ + npc_blackfathom_deeps_event(Creature* creature) : ScriptedAI(creature), _instance(me->GetInstanceScript()), _flee(false) { } - struct npc_blackfathom_deeps_eventAI : public ScriptedAI + void JustEngagedWith(Unit* /*who*/) override { - npc_blackfathom_deeps_eventAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - if (creature->IsSummon()) - creature->SetHomePosition(HomePosition); - - instance = creature->GetInstanceScript(); - } + _flee = false; - void Initialize() + switch (me->GetEntry()) { - Flee = false; - - ravageTimer = urand(5000, 8000); - frostNovaTimer = urand(9000, 12000); - frostBoltVolleyTimer = urand(2000, 4000); + case NPC_AKU_MAI_SNAPJAW: + _events.ScheduleEvent(EVENT_RAVAGE, 5s, 8s); + break; + case NPC_AKU_MAI_SERVANT: + _events.ScheduleEvent(EVENT_FROST_NOVA, 9s, 12s); + _events.ScheduleEvent(EVENT_FROST_BOLT_VOLLEY, 2s, 4s); + break; + default: + break; } + } + + void EnterEvadeMode(EvadeReason why) override + { + _events.Reset(); + ScriptedAI::EnterEvadeMode(why); + } - InstanceScript* instance; + void IsSummonedBy(WorldObject* /*summoner*/) override + { + DoZoneInCombat(); + } - uint32 ravageTimer; - uint32 frostNovaTimer; - uint32 frostBoltVolleyTimer; + void JustDied(Unit* /*killer*/) override + { + if (me->IsSummon()) //we are not a normal spawn. + _instance->SetData(DATA_EVENT, _instance->GetData(DATA_EVENT) + 1); + } - bool Flee; + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (me->GetEntry() != NPC_MURKSHALLOW_SOFTSHELL && me->GetEntry() != NPC_BARBED_CRUSTACEAN) + return; - void Reset() override + if (!_flee && me->HealthBelowPctDamaged(15, damage)) { - Initialize(); - AttackPlayer(); + _flee = true; + me->DoFleeToGetAssistance(); } + } - void AttackPlayer() - { - Map::PlayerList const& PlList = me->GetMap()->GetPlayers(); + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - if (PlList.isEmpty()) - return; + _events.Update(diff); - for (Map::PlayerList::const_iterator i = PlList.begin(); i != PlList.end(); ++i) - { - if (Player* player = i->GetSource()) - { - if (player->IsGameMaster()) - continue; - - if (player->IsAlive()) - { - me->SetInCombatWith(player); - player->SetInCombatWith(me); - AddThreat(player, 0.0f); - } - } - } - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void UpdateAI(uint32 diff) override + while (uint32 eventId = _events.ExecuteEvent()) { - if (!UpdateVictim()) - return; - - switch (me->GetEntry()) + switch (eventId) { - case NPC_AKU_MAI_SNAPJAW: - { - if (ravageTimer <= diff) - { - DoCastVictim(SPELL_RAVAGE); - ravageTimer = urand(9000, 14000); - } else ravageTimer -= diff; + case EVENT_RAVAGE: + DoCastVictim(SPELL_RAVAGE); + _events.Repeat(9s, 14s); + break; + case EVENT_FROST_NOVA: + DoCastAOE(SPELL_FROST_NOVA, false); + _events.Repeat(25s, 30s); break; - } - case NPC_MURKSHALLOW_SOFTSHELL: - case NPC_BARBED_CRUSTACEAN: - { - if (!Flee && HealthBelowPct(15)) - { - Flee = true; - me->DoFleeToGetAssistance(); - } + case EVENT_FROST_BOLT_VOLLEY: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_FROST_BOLT_VOLLEY); + _events.Repeat(5s, 8s); break; - } - case NPC_AKU_MAI_SERVANT: - { - if (frostBoltVolleyTimer <= diff) - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - DoCast(target, SPELL_FROST_BOLT_VOLLEY); - frostBoltVolleyTimer = urand(5000, 8000); - } - else frostBoltVolleyTimer -= diff; - - if (frostNovaTimer <= diff) - { - DoCastAOE(SPELL_FROST_NOVA, false); - frostNovaTimer = urand(25000, 30000); - } - else frostNovaTimer -= diff; + default: break; - } } - - DoMeleeAttackIfReady(); } - void JustDied(Unit* /*killer*/) override - { - if (me->IsSummon()) //we are not a normal spawn. - instance->SetData(DATA_EVENT, instance->GetData(DATA_EVENT) + 1); - } - }; + DoMeleeAttackIfReady(); + } + +private: + EventMap _events; + InstanceScript* _instance; + bool _flee; }; enum Morridune @@ -262,6 +236,6 @@ void AddSC_blackfathom_deeps() { new go_blackfathom_altar(); new go_blackfathom_fire(); - new npc_blackfathom_deeps_event(); + RegisterBlackfathomDeepsCreatureAI(npc_blackfathom_deeps_event); new npc_morridune(); } diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h index 1645c51d6bc..659f918782e 100644 --- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h +++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h @@ -76,4 +76,6 @@ inline AI* GetBlackfathomDeepsAI(T* obj) return GetInstanceAI<AI>(obj, BFDScriptName); } +#define RegisterBlackfathomDeepsCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetBlackfathomDeepsAI) + #endif // BFD_H_ |