private bool ProcessTarget()
{
Target targ = m_Mobile.Target;
if( targ == null )
return false;
bool isReveal = ( targ is RevealSpell.InternalTarget );
bool isDispel = ( targ is DispelSpell.InternalTarget );
bool isParalyze = ( targ is ParalyzeSpell.InternalTarget );
bool isTeleport = ( targ is TeleportSpell.InternalTarget );
bool isInvisible = ( targ is InvisibilitySpell.InternalTarget );
bool teleportAway = false;
Mobile toTarget;
if( isInvisible )
{
toTarget = m_Mobile;
}
else if( isDispel )
{
toTarget = FindDispelTarget( false );
if( !SmartAI && toTarget != null )
RunTo( toTarget );
else if( toTarget != null && m_Mobile.InRange( toTarget, 10 ) )
RunFrom( toTarget );
}
else if( SmartAI && ( isParalyze || isTeleport ) )
{
toTarget = FindDispelTarget( true );
if( toTarget == null )
{
toTarget = m_Mobile.Combatant;
if( toTarget != null )
RunTo( toTarget );
}
else if( m_Mobile.InRange( toTarget, 10 ) )
{
RunFrom( toTarget );
teleportAway = true;
}
else
{
teleportAway = true;
}
}
else
{
toTarget = m_Mobile.Combatant;
if( toTarget != null )
RunTo( toTarget );
}
if( ( targ.Flags & TargetFlags.Harmful ) != 0 && toTarget != null )
{
if( ( targ.Range == -1 || m_Mobile.InRange( toTarget, targ.Range ) ) && m_Mobile.CanSee( toTarget ) && m_Mobile.InLOS( toTarget ) )
{
targ.Invoke( m_Mobile, toTarget );
}
else if( isDispel )
{
targ.Cancel( m_Mobile, TargetCancelType.Canceled );
}
}
else if( ( targ.Flags & TargetFlags.Beneficial ) != 0 )
{
targ.Invoke( m_Mobile, m_Mobile );
}
else if( isReveal && m_RevealTarget != null )
{
targ.Invoke( m_Mobile, m_RevealTarget );
}
else if( isTeleport && toTarget != null )
{
Map map = m_Mobile.Map;
if( map == null )
{
targ.Cancel( m_Mobile, TargetCancelType.Canceled );
return true;
}
int px, py;
if( teleportAway )
{
int rx = m_Mobile.X - toTarget.X;
int ry = m_Mobile.Y - toTarget.Y;
double d = m_Mobile.GetDistanceToSqrt( toTarget );
px = toTarget.X + (int)( rx * ( 10 / d ) );
py = toTarget.Y + (int)( ry * ( 10 / d ) );
}
else
{
px = toTarget.X;
py = toTarget.Y;
}
for( int i = 0; i < m_Offsets.Length; i += 2 )
{
int x = m_Offsets[ i ], y = m_Offsets[ i + 1 ];
Point3D p = new Point3D( px + x, py + y, 0 );
LandTarget lt = new LandTarget( p, map );
if( ( targ.Range == -1 || m_Mobile.InRange( p, targ.Range ) ) && m_Mobile.InLOS( lt ) && map.CanSpawnMobile( px + x, py + y, lt.Z ) && !SpellHelper.CheckMulti( p, map ) )
{
targ.Invoke( m_Mobile, lt );
return true;
}
}
int teleRange = targ.Range;
if( teleRange < 0 )
teleRange = 12;
for( int i = 0; i < 10; ++i )
{
Point3D randomPoint = new Point3D( m_Mobile.X - teleRange + Utility.Random( teleRange * 2 + 1 ), m_Mobile.Y - teleRange + Utility.Random( teleRange * 2 + 1 ), 0 );
LandTarget lt = new LandTarget( randomPoint, map );
if( m_Mobile.InLOS( lt ) && map.CanSpawnMobile( lt.X, lt.Y, lt.Z ) && !SpellHelper.CheckMulti( randomPoint, map ) )
{
targ.Invoke( m_Mobile, new LandTarget( randomPoint, map ) );
return true;
}
}
targ.Cancel( m_Mobile, TargetCancelType.Canceled );
}
else
{
targ.Cancel( m_Mobile, TargetCancelType.Canceled );
}
return true;
}
}