aboutsummaryrefslogtreecommitdiff
path: root/src/game/CreatureAI.cpp
diff options
context:
space:
mode:
authormegamage <none@none>2009-01-08 21:48:38 -0600
committermegamage <none@none>2009-01-08 21:48:38 -0600
commit2377f49ea86b5c6a7f29b5d1949cd90b1594b660 (patch)
treed0d62dd56391544b4a09d0be189d28fefd339769 /src/game/CreatureAI.cpp
parentb57516e170cb3dd09ee7d4335dee0f8bbbc4a1df (diff)
*Update charm and possess code.
--HG-- branch : trunk
Diffstat (limited to 'src/game/CreatureAI.cpp')
-rw-r--r--src/game/CreatureAI.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/game/CreatureAI.cpp b/src/game/CreatureAI.cpp
index ad663d13b38..71046e2f154 100644
--- a/src/game/CreatureAI.cpp
+++ b/src/game/CreatureAI.cpp
@@ -19,7 +19,45 @@
*/
#include "CreatureAI.h"
+#include "Creature.h"
+#include "Pet.h"
+#include "SpellAuras.h"
CreatureAI::~CreatureAI()
{
}
+
+SimpleCharmedAI::SimpleCharmedAI(Unit &u) : me(u)
+{
+}
+
+void SimpleCharmedAI::UpdateAI(const uint32 /*diff*/)
+{
+ Creature *charmer = (Creature*)me.GetCharmer();
+
+ //kill self if charm aura has infinite duration
+ if(charmer->IsInEvadeMode())
+ {
+ Unit::AuraList const& auras = me.GetAurasByType(SPELL_AURA_MOD_CHARM);
+ for(Unit::AuraList::const_iterator iter = auras.begin(); iter != auras.end(); ++iter)
+ if((*iter)->GetCasterGUID() == charmer->GetGUID() && (*iter)->IsPermanent())
+ {
+ charmer->Kill(&me);
+ return;
+ }
+ }
+
+ if(!charmer->isInCombat())
+ me.GetMotionMaster()->MoveFollow(charmer, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
+
+ Unit *target = me.getVictim();
+ if(!target || !charmer->canAttack(target))
+ {
+ target = charmer->SelectNearestTarget();
+ if(!target)
+ return;
+
+ me.GetMotionMaster()->MoveChase(target);
+ me.Attack(target, true);
+ }
+}