All pastes #912383 Raw Edit

Something

public text v1 · immutable
·published 2008-02-21 10:34 UTC
rendered paste body
bool Unit::SelectHostilTarget()
{
    //function provides main threat functionality
    //next-victim-selection algorithm and evade mode are called
    //threat list sorting etc.

    assert(GetTypeId()== TYPEID_UNIT);
    Unit* target = NULL;

    //This function only useful once AI has been initilazied
    if (!((Creature*)this)->AI())
        return false;

    if(!m_ThreatManager.isThreatListEmpty())
    {
        if(!HasAuraType(SPELL_AURA_MOD_TAUNT))
        {
            target = m_ThreatManager.getHostilTarget();
        }
    }

    if(target)
    {
        if(!hasUnitState(UNIT_STAT_STUNDED))
            SetInFront(target);
        ((Creature*)this)->AI()->AttackStart(target);
        return true;
    }
	// no target but something prevent go to evade mode
	// Check for Hunter Freezing Traps & Rouge Blind Spell
	// These auras need removing if creature has no valid target.
	if( ((Creature*)this)->hasUnitState(UNIT_STAT_STUNDED) || ((Creature*)this)->hasUnitState(UNIT_STAT_CONFUSED))
	{
	 if( ((Creature*)this)->HasAura(3355, 0 ) || ((Creature*)this)->HasAura(14308, 0 ) || ((Creature*)this)->HasAura(14309, 0 ) || ((Creature*)this)->HasAura(2094, 0 ) )
		{
		((Creature*)this)->RemoveAurasDueToSpell(2094);// Blind
		((Creature*)this)->RemoveAurasDueToSpell(3355);// Freezing Trap Effect 1
		((Creature*)this)->RemoveAurasDueToSpell(14308);// Freezing Trap Effect 2
		((Creature*)this)->RemoveAurasDueToSpell(14309);// Freezing Trap Effect 3
		}
	}
 
    if( !isInCombat() || HasAuraType(SPELL_AURA_MOD_TAUNT) || !CanFreeMove() )
        return false;
	

    // last case when creature don't must go to evade mode:
    // it in combat but attacker not make any damage and not enter to aggro radius to have record in threat list
    // for example at owner command to pet attack some far away creature
    // Note: creature not have targeted movement generator but have attacker in this case
    if( GetMotionMaster()->empty() || GetMotionMaster()->top()->GetMovementGeneratorType() != TARGETED_MOTION_TYPE )
    {
        for(AttackerSet::const_iterator itr = m_attackers.begin(); itr != m_attackers.end(); ++itr)
        {
            if( (*itr)->IsInMap(this) && (*itr)->isTargetableForAttack() && (*itr)->isInAccessablePlaceFor((Creature*)this) )
                return false;
        }
    }

    // enter in evade mode in other case
    ((Creature*)this)->AI()->EnterEvadeMode();

    return false;
}