*Implement simple charmed AI for players charmed by creatures.
--HG-- branch : trunk
This commit is contained in:
@@ -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
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user