SPELL_EFFECT_OVERRIDE_RETURNS HandleMoltenFury(Spell *sp,Unit *caster,Unit *target, int32 &value, int32 i, SpellEffectOverrideScript *so)
{
	if( target == NULL || target->GetHealthPct() > 35 )
		return SPELL_EFFECT_OVERRIDE_CONTINUE_EXECUTION;
	if( IsDamagingSpell(sp->GetProto(),i) == false )
		return SPELL_EFFECT_OVERRIDE_CONTINUE_EXECUTION;
	value = value * so->mod_amount_pct[ i ] / 100;
	return SPELL_EFFECT_OVERRIDE_CONTINUE_EXECUTION;
}
SPELL_EFFECT_OVERRIDE_RETURNS HandleTundraStalker(Spell *sp,Unit *caster,Unit *target, int32 &value, int32 i, SpellEffectOverrideScript *so)
{
	if( target == NULL || target->HasAurasWithNameHash( SPELL_HASH_FROST_FEVER ) == 0 )
		return SPELL_EFFECT_OVERRIDE_CONTINUE_EXECUTION;
	if( IsDamagingSpell(sp->GetProto(),i) == false )
		return SPELL_EFFECT_OVERRIDE_CONTINUE_EXECUTION;
	value = value * so->mod_amount_pct[ i ] / 100;
	return SPELL_EFFECT_OVERRIDE_CONTINUE_EXECUTION;
}
Пример #3
0
		bool DoEffect(Unit* victim, SpellEntry* CastingSpell, uint32 flag, uint32 dmg, uint32 abs, int* dmg_overwrite, uint32 weapon_damage_type)
		{
			// Only proc for damaging shadow spells
			if(CastingSpell->School != SCHOOL_SHADOW || ! IsDamagingSpell(CastingSpell))
				return true;

			// Only proc for single target spells
			if(!(HasTargetType(CastingSpell, EFF_TARGET_SINGLE_ENEMY) || HasTargetType(CastingSpell, EFF_TARGET_SELECTED_ENEMY_CHANNELED)))
				return true;

			dmg_overwrite[0] = dmg;
			dmg_overwrite[1] = dmg;

			return false;
		}
bool AIInterface::IsValidUnitTarget( Object *pObject, SpellEntry *info, uint32 pFilter, float pMinRange, float pMaxRange )
{
    // Make sure its a valid unit
    if (!pObject->IsUnit() )
        return false;

    Unit *UnitTarget = TO_UNIT( pObject );
    if ( UnitTarget->GetInstanceID() != m_Unit->GetInstanceID() )
        return false;

    float dist = 0.0f;
    if(UnitTarget != m_Unit)
    {
        dist = m_Unit->CalcDistance( UnitTarget );
        if ( m_outOfCombatRange && UnitTarget->GetDistanceSq( GetReturnPos() ) > m_outOfCombatRange )
            return false;
    }

    if ( pFilter & TargetFilter_Corpse )
    {   //Skip dead ( if required ), feign death or invisible targets
        if ( UnitTarget->isAlive() || !UnitTarget->IsCreature() || TO_CREATURE( UnitTarget )->creature_info->Rank == ELITE_WORLDBOSS )
            return false;
    }
    else if ( !UnitTarget->isAlive() )
        return false;

    if ( UnitTarget->IsPlayer() && TO_PLAYER( UnitTarget )->m_isGmInvisible )
        return false;
    if ( UnitTarget->HasFlag( UNIT_FIELD_FLAGS, UNIT_FLAG_FEIGN_DEATH ) )
        return false;
    // If it's a damaging spell, we can cast again, otherwise, do not double cast
    if(info != NULL && !IsDamagingSpell(info) && UnitTarget->HasAura(info->Id))
        return false;

    //Check if we apply target filtering
    if ( pFilter != TargetFilter_None )
    {
        //Skip units not on threat list
        if ( ( pFilter & TargetFilter_Aggroed ) && getThreatByPtr( UnitTarget ) == 0 )
            return false;

        //Skip current attacking target if requested
        if ( ( pFilter & TargetFilter_NotCurrent ) && UnitTarget == GetNextTarget() )
            return false;

        //Keep only wounded targets if requested
        if ( ( pFilter & TargetFilter_Wounded ) && UnitTarget->GetHealthPct() >= 99 )
            return false;

        //Skip targets not in melee range if requested
        if ( ( pFilter & TargetFilter_InMeleeRange ) && dist > _CalcCombatRange( UnitTarget, false ) )
            return false;

        //Skip targets not in strict range if requested
        if ( ( pFilter & TargetFilter_InRangeOnly ) && ( pMinRange > 0 || pMaxRange > 0 ) )
        {
            if ( pMinRange > 0 && dist < pMinRange )
                return false;
            if ( pMaxRange > 0 && dist > pMaxRange )
                return false;
        }

        //Skip targets not in Line Of Sight if requested
        if ( ( ~pFilter & TargetFilter_IgnoreLineOfSight ) && !m_Unit->IsInLineOfSight( UnitTarget ) )
            return false;

        //Handle hostile/friendly
        if ( ( ~pFilter & TargetFilter_Corpse ) && ( pFilter & TargetFilter_Friendly ) ) 
        {
            if ( !UnitTarget->CombatStatus.IsInCombat() )
                return false; //Skip not-in-combat targets if friendly
            if ( sFactionSystem.isHostile( m_Unit, UnitTarget ) || getThreatByPtr( UnitTarget ) > 0 )
                return false;
        }
    }

    return true; //This is a valid unit target
}