376 lines
No EOL
8.4 KiB
C#
376 lines
No EOL
8.4 KiB
C#
/***************************************************************************
|
|
* Target.cs
|
|
* -------------------
|
|
* begin : May 1, 2002
|
|
* copyright : (C) The RunUO Software Team
|
|
* email : info@runuo.com
|
|
*
|
|
* $Id$
|
|
*
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
***************************************************************************/
|
|
|
|
using System;
|
|
using Server.Network;
|
|
|
|
namespace Server.Targeting
|
|
{
|
|
public abstract class Target
|
|
{
|
|
private static int m_NextTargetID;
|
|
|
|
private int m_TargetID;
|
|
private int m_Range;
|
|
private bool m_AllowGround;
|
|
private bool m_CheckLOS;
|
|
private bool m_AllowNonlocal;
|
|
private bool m_DisallowMultis;
|
|
private TargetFlags m_Flags;
|
|
private DateTime m_TimeoutTime;
|
|
|
|
public DateTime TimeoutTime{ get{ return m_TimeoutTime; } }
|
|
|
|
protected Target( int range, bool allowGround, TargetFlags flags )
|
|
{
|
|
m_TargetID = ++m_NextTargetID;
|
|
m_Range = range;
|
|
m_AllowGround = allowGround;
|
|
m_Flags = flags;
|
|
|
|
m_CheckLOS = true;
|
|
}
|
|
|
|
public static void Cancel( Mobile m )
|
|
{
|
|
NetState ns = m.NetState;
|
|
|
|
if ( ns != null )
|
|
ns.Send( CancelTarget.Instance );
|
|
|
|
Target targ = m.Target;
|
|
|
|
if ( targ != null )
|
|
targ.OnTargetCancel( m, TargetCancelType.Canceled );
|
|
}
|
|
|
|
private Timer m_TimeoutTimer;
|
|
|
|
public void BeginTimeout( Mobile from, TimeSpan delay )
|
|
{
|
|
m_TimeoutTime = DateTime.Now + delay;
|
|
|
|
if ( m_TimeoutTimer != null )
|
|
m_TimeoutTimer.Stop();
|
|
|
|
m_TimeoutTimer = new TimeoutTimer( this, from, delay );
|
|
m_TimeoutTimer.Start();
|
|
}
|
|
|
|
public void CancelTimeout()
|
|
{
|
|
if ( m_TimeoutTimer != null )
|
|
m_TimeoutTimer.Stop();
|
|
|
|
m_TimeoutTimer = null;
|
|
}
|
|
|
|
public void Timeout( Mobile from )
|
|
{
|
|
CancelTimeout();
|
|
from.ClearTarget();
|
|
|
|
Cancel( from );
|
|
|
|
OnTargetCancel( from, TargetCancelType.Timeout );
|
|
OnTargetFinish( from );
|
|
}
|
|
|
|
private class TimeoutTimer : Timer
|
|
{
|
|
private Target m_Target;
|
|
private Mobile m_Mobile;
|
|
|
|
private static TimeSpan ThirtySeconds = TimeSpan.FromSeconds( 30.0 );
|
|
private static TimeSpan TenSeconds = TimeSpan.FromSeconds( 10.0 );
|
|
private static TimeSpan OneSecond = TimeSpan.FromSeconds( 1.0 );
|
|
|
|
public TimeoutTimer( Target target, Mobile m, TimeSpan delay ) : base( delay )
|
|
{
|
|
m_Target = target;
|
|
m_Mobile = m;
|
|
|
|
if ( delay >= ThirtySeconds )
|
|
Priority = TimerPriority.FiveSeconds;
|
|
else if ( delay >= TenSeconds )
|
|
Priority = TimerPriority.OneSecond;
|
|
else if ( delay >= OneSecond )
|
|
Priority = TimerPriority.TwoFiftyMS;
|
|
else
|
|
Priority = TimerPriority.TwentyFiveMS;
|
|
}
|
|
|
|
protected override void OnTick()
|
|
{
|
|
if ( m_Mobile.Target == m_Target )
|
|
m_Target.Timeout( m_Mobile );
|
|
}
|
|
}
|
|
|
|
public bool CheckLOS
|
|
{
|
|
get
|
|
{
|
|
return m_CheckLOS;
|
|
}
|
|
set
|
|
{
|
|
m_CheckLOS = value;
|
|
}
|
|
}
|
|
|
|
public bool DisallowMultis
|
|
{
|
|
get
|
|
{
|
|
return m_DisallowMultis;
|
|
}
|
|
set
|
|
{
|
|
m_DisallowMultis = value;
|
|
}
|
|
}
|
|
|
|
public bool AllowNonlocal
|
|
{
|
|
get
|
|
{
|
|
return m_AllowNonlocal;
|
|
}
|
|
set
|
|
{
|
|
m_AllowNonlocal = value;
|
|
}
|
|
}
|
|
|
|
public int TargetID
|
|
{
|
|
get
|
|
{
|
|
return m_TargetID;
|
|
}
|
|
}
|
|
|
|
public virtual Packet GetPacketFor( NetState ns )
|
|
{
|
|
return new TargetReq( this );
|
|
}
|
|
|
|
public void Cancel( Mobile from, TargetCancelType type )
|
|
{
|
|
CancelTimeout();
|
|
from.ClearTarget();
|
|
|
|
OnTargetCancel( from, type );
|
|
OnTargetFinish( from );
|
|
}
|
|
|
|
public void Invoke( Mobile from, object targeted )
|
|
{
|
|
CancelTimeout();
|
|
from.ClearTarget();
|
|
|
|
if ( from.Deleted )
|
|
{
|
|
OnTargetCancel( from, TargetCancelType.Canceled );
|
|
OnTargetFinish( from );
|
|
return;
|
|
}
|
|
|
|
Point3D loc;
|
|
Map map;
|
|
|
|
if ( targeted is LandTarget )
|
|
{
|
|
loc = ((LandTarget)targeted).Location;
|
|
map = from.Map;
|
|
}
|
|
else if ( targeted is StaticTarget )
|
|
{
|
|
loc = ((StaticTarget)targeted).Location;
|
|
map = from.Map;
|
|
}
|
|
else if ( targeted is Mobile )
|
|
{
|
|
if ( ((Mobile)targeted).Deleted )
|
|
{
|
|
OnTargetDeleted( from, targeted );
|
|
OnTargetFinish( from );
|
|
return;
|
|
}
|
|
else if ( !((Mobile)targeted).CanTarget )
|
|
{
|
|
OnTargetUntargetable( from, targeted );
|
|
OnTargetFinish( from );
|
|
return;
|
|
}
|
|
|
|
loc = ((Mobile)targeted).Location;
|
|
map = ((Mobile)targeted).Map;
|
|
}
|
|
else if ( targeted is Item )
|
|
{
|
|
Item item = (Item)targeted;
|
|
|
|
if ( item.Deleted )
|
|
{
|
|
OnTargetDeleted( from, targeted );
|
|
OnTargetFinish( from );
|
|
return;
|
|
}
|
|
else if ( !item.CanTarget )
|
|
{
|
|
OnTargetUntargetable( from, targeted );
|
|
OnTargetFinish( from );
|
|
return;
|
|
}
|
|
|
|
object root = item.RootParent;
|
|
|
|
if ( !m_AllowNonlocal && root is Mobile && root != from && from.AccessLevel == AccessLevel.Player )
|
|
{
|
|
OnNonlocalTarget( from, targeted );
|
|
OnTargetFinish( from );
|
|
return;
|
|
}
|
|
|
|
loc = item.GetWorldLocation();
|
|
map = item.Map;
|
|
}
|
|
else
|
|
{
|
|
OnTargetCancel( from, TargetCancelType.Canceled );
|
|
OnTargetFinish( from );
|
|
return;
|
|
}
|
|
|
|
if ( map == null || map != from.Map || ( m_Range != -1 && !from.InRange( loc, m_Range ) ) )
|
|
{
|
|
OnTargetOutOfRange( from, targeted );
|
|
}
|
|
else
|
|
{
|
|
if ( !from.CanSee( targeted ) )
|
|
OnCantSeeTarget( from, targeted );
|
|
else if ( m_CheckLOS && !from.InLOS( targeted ) )
|
|
OnTargetOutOfLOS( from, targeted );
|
|
else if ( targeted is Item && ((Item)targeted).InSecureTrade )
|
|
OnTargetInSecureTrade( from, targeted );
|
|
else if ( targeted is Item && !((Item)targeted).IsAccessibleTo( from ) )
|
|
OnTargetNotAccessible( from, targeted );
|
|
else if ( targeted is Item && !((Item)targeted).CheckTarget( from, this, targeted ) )
|
|
OnTargetUntargetable( from, targeted );
|
|
else if ( targeted is Mobile && !((Mobile)targeted).CheckTarget( from, this, targeted ) )
|
|
OnTargetUntargetable( from, targeted );
|
|
else if ( from.Region.OnTarget( from, this, targeted ) )
|
|
OnTarget( from, targeted );
|
|
}
|
|
|
|
OnTargetFinish( from );
|
|
}
|
|
|
|
protected virtual void OnTarget( Mobile from, object targeted )
|
|
{
|
|
}
|
|
|
|
protected virtual void OnTargetNotAccessible( Mobile from, object targeted )
|
|
{
|
|
from.SendLocalizedMessage( 500447 ); // That is not accessible.
|
|
}
|
|
|
|
protected virtual void OnTargetInSecureTrade( Mobile from, object targeted )
|
|
{
|
|
from.SendLocalizedMessage( 500447 ); // That is not accessible.
|
|
}
|
|
|
|
protected virtual void OnNonlocalTarget( Mobile from, object targeted )
|
|
{
|
|
from.SendLocalizedMessage( 500447 ); // That is not accessible.
|
|
}
|
|
|
|
protected virtual void OnCantSeeTarget( Mobile from, object targeted )
|
|
{
|
|
from.SendLocalizedMessage( 500237 ); // Target can not be seen.
|
|
}
|
|
|
|
protected virtual void OnTargetOutOfLOS( Mobile from, object targeted )
|
|
{
|
|
from.SendLocalizedMessage( 500237 ); // Target can not be seen.
|
|
}
|
|
|
|
protected virtual void OnTargetOutOfRange( Mobile from, object targeted )
|
|
{
|
|
from.SendLocalizedMessage( 500446 ); // That is too far away.
|
|
}
|
|
|
|
protected virtual void OnTargetDeleted( Mobile from, object targeted )
|
|
{
|
|
}
|
|
|
|
protected virtual void OnTargetUntargetable( Mobile from, object targeted )
|
|
{
|
|
from.SendLocalizedMessage( 500447 ); // That is not accessible.
|
|
}
|
|
|
|
protected virtual void OnTargetCancel( Mobile from, TargetCancelType cancelType )
|
|
{
|
|
}
|
|
|
|
protected virtual void OnTargetFinish( Mobile from )
|
|
{
|
|
}
|
|
|
|
public int Range
|
|
{
|
|
get
|
|
{
|
|
return m_Range;
|
|
}
|
|
set
|
|
{
|
|
m_Range = value;
|
|
}
|
|
}
|
|
|
|
public bool AllowGround
|
|
{
|
|
get
|
|
{
|
|
return m_AllowGround;
|
|
}
|
|
set
|
|
{
|
|
m_AllowGround = value;
|
|
}
|
|
}
|
|
|
|
public TargetFlags Flags
|
|
{
|
|
get
|
|
{
|
|
return m_Flags;
|
|
}
|
|
set
|
|
{
|
|
m_Flags = value;
|
|
}
|
|
}
|
|
}
|
|
} |