*Implement simple charmed AI for players charmed by creatures.

--HG--
branch : trunk
This commit is contained in:
megamage
2008-11-24 17:15:41 -06:00
parent 7312c5034e
commit f7e5b2ba69
4 changed files with 51 additions and 27 deletions
+10 -3
View File
@@ -141,16 +141,23 @@ void ScriptedAI::UpdateAI(const uint32 diff)
void ScriptedAI::EnterEvadeMode() void ScriptedAI::EnterEvadeMode()
{ {
m_creature->InterruptNonMeleeSpells(true); //m_creature->InterruptNonMeleeSpells(true);
m_creature->RemoveAllAuras(); m_creature->RemoveAllAuras();
m_creature->DeleteThreatList(); m_creature->DeleteThreatList();
m_creature->CombatStop(); m_creature->CombatStop();
m_creature->LoadCreaturesAddon(); m_creature->LoadCreaturesAddon();
m_creature->SetLootRecipient(NULL);
if(m_creature->isAlive()) if(m_creature->isAlive())
{
if(Unit* owner = m_creature->GetOwner())
{
if(owner->isAlive())
m_creature->GetMotionMaster()->MoveFollow(owner,PET_FOLLOW_DIST,PET_FOLLOW_ANGLE);
}
else
m_creature->GetMotionMaster()->MoveTargetedHome(); m_creature->GetMotionMaster()->MoveTargetedHome();
}
m_creature->SetLootRecipient(NULL);
InCombat = false; InCombat = false;
Reset(); Reset();
@@ -1033,26 +1033,9 @@ struct TRINITY_DLL_DECL Mob_EventAI : public ScriptedAI
void EnterEvadeMode() void EnterEvadeMode()
{ {
m_creature->RemoveAllAuras(); ScriptedAI::EnterEvadeMode();
m_creature->DeleteThreatList();
m_creature->CombatStop();
m_creature->LoadCreaturesAddon();
if( m_creature->isAlive() )
{
if (Unit* owner = m_creature->GetOwner())
{
if (owner->isAlive())
m_creature->GetMotionMaster()->MoveFollow(owner,PET_FOLLOW_DIST,PET_FOLLOW_ANGLE);
}
else
m_creature->GetMotionMaster()->MoveTargetedHome();
}
m_creature->SetLootRecipient(NULL);
InCombat = false;
IsFleeing = false; IsFleeing = false;
Reset();
//Handle Evade events //Handle Evade events
for (std::list<EventHolder>::iterator i = EventList.begin(); i != EventList.end(); ++i) for (std::list<EventHolder>::iterator i = EventList.begin(); i != EventList.end(); ++i)
+36 -4
View File
@@ -1016,12 +1016,12 @@ void Player::Update( uint32 p_time )
CheckExploreSystem(); CheckExploreSystem();
/*if(isCharmed()) if(isCharmed())
{ {
if(Unit *charmer = GetCharmer()) if(Unit *charmer = GetCharmer())
if(charmer->GetTypeId() == TYPEID_UNIT && ((Creature*)charmer)->AI()) if(charmer->GetTypeId() == TYPEID_UNIT && charmer->isAlive())
((Creature*)charmer)->AI()->UpdateCharmedAI(this, p_time); UpdateCharmedAI();
}*/ }
// Update items that have just a limited lifetime // Update items that have just a limited lifetime
if (now>m_Last_tick) if (now>m_Last_tick)
@@ -19051,3 +19051,35 @@ bool Player::isTotalImmunity()
} }
return false; 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);
}
}
+2
View File
@@ -2308,6 +2308,8 @@ class TRINITY_DLL_SPEC Player : public Unit
GridReference<Player> m_gridRef; GridReference<Player> m_gridRef;
MapReference m_mapRef; MapReference m_mapRef;
void UpdateCharmedAI();
}; };
void AddItemsSetItem(Player*player,Item *item); void AddItemsSetItem(Player*player,Item *item);