diff options
-rw-r--r-- | src/server/game/AI/ScriptedAI/ScriptedCreature.cpp | 59 | ||||
-rw-r--r-- | src/server/game/AI/ScriptedAI/ScriptedCreature.h | 30 |
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); |