diff options
Diffstat (limited to 'src/game/CreatureAI.h')
-rw-r--r-- | src/game/CreatureAI.h | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/game/CreatureAI.h b/src/game/CreatureAI.h new file mode 100644 index 00000000000..185fb571bb2 --- /dev/null +++ b/src/game/CreatureAI.h @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef MANGOS_CREATUREAI_H +#define MANGOS_CREATUREAI_H + +#include "Common.h" +#include "Platform/Define.h" +#include "Policies/Singleton.h" +#include "Dynamic/ObjectRegistry.h" +#include "Dynamic/FactoryHolder.h" + +class Unit; +class Creature; +struct SpellEntry; + +#define TIME_INTERVAL_LOOK 5000 +#define VISIBILITY_RANGE 10000 + +class MANGOS_DLL_SPEC CreatureAI +{ + public: + + virtual ~CreatureAI(); + + // Called if IsVisible(Unit *who) is true at each *who move + virtual void MoveInLineOfSight(Unit *) = 0; + + // Called at each attack of m_creature by any victim + virtual void AttackStart(Unit *) = 0; + + // Called at stopping attack by any attacker + virtual void EnterEvadeMode() = 0; + + // Called at any heal cast/item used (call non implemented) + virtual void HealBy(Unit * /*healer*/, uint32 /*amount_healed*/) {} + + // Called at any Damage to any victim (before damage apply) + virtual void DamageDeal(Unit * /*done_to*/, uint32 & /*damage*/) {} + + // Called at any Damage from any attacker (before damage apply) + virtual void DamageTaken(Unit *done_by, uint32 & /*damage*/) { AttackedBy(done_by); } + + // Is unit visible for MoveInLineOfSight + virtual bool IsVisible(Unit *) const = 0; + + // Called at World update tick + virtual void UpdateAI(const uint32 diff ) = 0; + + // Called when the creature is killed + virtual void JustDied(Unit *) {} + + // Called when the creature kills a unit + virtual void KilledUnit(Unit *) {} + + // Called when the creature summon successfully other creature + virtual void JustSummoned(Creature* ) {} + + virtual void SummonedCreatureDespawn(Creature* /*unit*/) {} + + // Called when hit by a spell + virtual void SpellHit(Unit*, const SpellEntry*) {} + + // Called when vitim entered water and creature can not enter water + virtual bool canReachByRangeAttack(Unit*) { return false; } + + // Called when the creature is attacked + virtual void AttackedBy(Unit * /*attacker*/) {} + + // Called when creature is spawned or respawned (for reseting variables) + virtual void JustRespawned() {} + + // Called at waypoint reached or point movement finished + virtual void MovementInform(uint32 /*MovementType*/, uint32 /*Data*/) {} +}; + +struct SelectableAI : public FactoryHolder<CreatureAI>, public Permissible<Creature> +{ + + SelectableAI(const char *id) : FactoryHolder<CreatureAI>(id) {} +}; + +template<class REAL_AI> +struct CreatureAIFactory : public SelectableAI +{ + CreatureAIFactory(const char *name) : SelectableAI(name) {} + + CreatureAI* Create(void *) const; + + int Permit(const Creature *c) const { return REAL_AI::Permissible(c); } +}; + +enum Permitions +{ + PERMIT_BASE_NO = -1, + PERMIT_BASE_IDLE = 1, + PERMIT_BASE_REACTIVE = 100, + PERMIT_BASE_PROACTIVE = 200, + PERMIT_BASE_FACTION_SPECIFIC = 400, + PERMIT_BASE_SPECIAL = 800 +}; + +typedef FactoryHolder<CreatureAI> CreatureAICreator; +typedef FactoryHolder<CreatureAI>::FactoryHolderRegistry CreatureAIRegistry; +typedef FactoryHolder<CreatureAI>::FactoryHolderRepository CreatureAIRepository; +#endif |