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; }
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 }