diff options
| author | megamage <none@none> | 2008-11-24 17:15:41 -0600 |
|---|---|---|
| committer | megamage <none@none> | 2008-11-24 17:15:41 -0600 |
| commit | f7e5b2ba69605b23ef918e53922839888983cacf (patch) | |
| tree | cce8bfc7d12750f919f83509af16b16867be0626 /src/game/Player.cpp | |
| parent | 7312c5034e9e98dcf935c21ced806278514fe862 (diff) | |
*Implement simple charmed AI for players charmed by creatures.
--HG--
branch : trunk
Diffstat (limited to 'src/game/Player.cpp')
| -rw-r--r-- | src/game/Player.cpp | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 1f17a75819d..c081d6cc8a4 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -1016,12 +1016,12 @@ void Player::Update( uint32 p_time ) CheckExploreSystem(); - /*if(isCharmed()) + if(isCharmed()) { if(Unit *charmer = GetCharmer()) - if(charmer->GetTypeId() == TYPEID_UNIT && ((Creature*)charmer)->AI()) - ((Creature*)charmer)->AI()->UpdateCharmedAI(this, p_time); - }*/ + if(charmer->GetTypeId() == TYPEID_UNIT && charmer->isAlive()) + UpdateCharmedAI(); + } // Update items that have just a limited lifetime if (now>m_Last_tick) @@ -19051,3 +19051,35 @@ bool Player::isTotalImmunity() } return false; } + +void Player::UpdateCharmedAI() +{ + //This should only called in Player::Update + Creature *charmer = (Creature*)GetCharmer(); + + //kill self if charm aura has infinite duration + if(charmer->IsInEvadeMode()) + { + AuraList const& auras = GetAurasByType(SPELL_AURA_MOD_CHARM); + for(AuraList::const_iterator iter = auras.begin(); iter != auras.end(); ++iter) + if((*iter)->GetCasterGUID() == charmer->GetGUID() && (*iter)->IsPermanent()) + { + charmer->DealDamage(this, GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + return; + } + } + + if(!charmer->isInCombat()) + GetMotionMaster()->MoveFollow(charmer, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + + Unit *target = getVictim(); + if(!target || !charmer->canAttack(target)) + { + target = charmer->SelectNearestTarget(); + if(!target) + return; + + GetMotionMaster()->MoveChase(target); + Attack(target, true); + } +}
\ No newline at end of file |
