aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.cpp59
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.h30
2 files changed, 89 insertions, 0 deletions
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
index 51e377c21d5..56b1327bc45 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
@@ -505,6 +505,8 @@ void Scripted_NoMovementAI::AttackStart(Unit* target)
DoStartNoMovement(target);
}
+// BossAI - for instanced bosses
+
BossAI::BossAI(Creature* creature, uint32 bossId) : ScriptedAI(creature),
instance(creature->GetInstanceScript()),
summons(creature),
@@ -640,6 +642,63 @@ void BossAI::UpdateAI(uint32 const diff)
DoMeleeAttackIfReady();
}
+// WorldBossAI - for non-instanced bosses
+
+WorldBossAI::WorldBossAI(Creature* creature) :
+ ScriptedAI(creature),
+ summons(creature)
+{
+}
+
+void WorldBossAI::_Reset()
+{
+ if (!me->isAlive())
+ return;
+
+ events.Reset();
+ summons.DespawnAll();
+}
+
+void WorldBossAI::_JustDied()
+{
+ events.Reset();
+ summons.DespawnAll();
+}
+
+void WorldBossAI::_EnterCombat()
+{
+ me->setActive(true);
+ DoZoneInCombat();
+}
+
+void WorldBossAI::JustSummoned(Creature* summon)
+{
+ summons.Summon(summon);
+ if (me->isInCombat())
+ DoZoneInCombat(summon);
+}
+
+void WorldBossAI::SummonedCreatureDespawn(Creature* summon)
+{
+ summons.Despawn(summon);
+}
+
+void WorldBossAI::UpdateAI(uint32 const diff)
+{
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STAT_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ ExecuteEvent(eventId);
+
+ DoMeleeAttackIfReady();
+}
+
// SD2 grid searchers.
Creature* GetClosestCreatureWithEntry(WorldObject* source, uint32 entry, float maxSearchRange, bool alive /*= true*/)
{
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h
index 041d4a3c671..b124f8d2fd6 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h
@@ -305,6 +305,36 @@ class BossAI : public ScriptedAI
uint32 const _bossId;
};
+class WorldBossAI : public ScriptedAI
+{
+ public:
+ WorldBossAI(Creature* creature);
+ virtual ~WorldBossAI() {}
+
+ void JustSummoned(Creature* summon);
+ void SummonedCreatureDespawn(Creature* summon);
+
+ virtual void UpdateAI(uint32 const diff);
+
+ // Hook used to execute events scheduled into EventMap without the need
+ // to override UpdateAI
+ // note: You must re-schedule the event within this method if the event
+ // is supposed to run more than once
+ virtual void ExecuteEvent(uint32 const /*eventId*/) { }
+
+ void Reset() { _Reset(); }
+ void EnterCombat(Unit* /*who*/) { _EnterCombat(); }
+ void JustDied(Unit* /*killer*/) { _JustDied(); }
+
+ protected:
+ void _Reset();
+ void _EnterCombat();
+ void _JustDied();
+
+ EventMap events;
+ SummonList summons;
+};
+
// SD2 grid searchers.
Creature* GetClosestCreatureWithEntry(WorldObject* source, uint32 entry, float maxSearchRange, bool alive = true);
GameObject* GetClosestGameObjectWithEntry(WorldObject* source, uint32 entry, float maxSearchRange);