aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp172
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h2
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_