diff options
Diffstat (limited to 'src/server')
| -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);  | 
