2006-06-15 04:14:30 +00:00
using System ;
using System.Collections ;
using Server ;
namespace Server.Commands.Generic
{
public class AreaCommandImplementor : BaseCommandImplementor
{
2012-02-19 03:04:32 +00:00
private static AreaCommandImplementor m_Instance ;
public static AreaCommandImplementor Instance
{
get { return m_Instance ; }
}
2006-06-15 04:14:30 +00:00
public AreaCommandImplementor ( )
{
Accessors = new string [ ] { "Area" , "Group" } ;
SupportRequirement = CommandSupport . Area ;
SupportsConditionals = true ;
AccessLevel = AccessLevel . GameMaster ;
Usage = "Area <command> [condition]" ;
Description = "Invokes the command on all appropriate objects in a targeted area. Optional condition arguments can further restrict the set of objects." ;
2012-02-19 03:04:32 +00:00
m_Instance = this ;
2006-06-15 04:14:30 +00:00
}
public override void Process ( Mobile from , BaseCommand command , string [ ] args )
{
BoundingBoxPicker . Begin ( from , new BoundingBoxCallback ( OnTarget ) , new object [ ] { command , args } ) ;
}
public void OnTarget ( Mobile from , Map map , Point3D start , Point3D end , object state )
{
try
{
object [ ] states = ( object [ ] ) state ;
BaseCommand command = ( BaseCommand ) states [ 0 ] ;
string [ ] args = ( string [ ] ) states [ 1 ] ;
Rectangle2D rect = new Rectangle2D ( start . X , start . Y , end . X - start . X + 1 , end . Y - start . Y + 1 ) ;
Extensions ext = Extensions . Parse ( from , ref args ) ;
bool items , mobiles ;
2012-05-20 02:35:53 +00:00
if ( ! CheckObjectTypes ( from , command , ext , out items , out mobiles ) )
2006-06-15 04:14:30 +00:00
return ;
IPooledEnumerable eable ;
if ( items & & mobiles )
eable = map . GetObjectsInBounds ( rect ) ;
else if ( items )
eable = map . GetItemsInBounds ( rect ) ;
else if ( mobiles )
eable = map . GetMobilesInBounds ( rect ) ;
else
return ;
ArrayList objs = new ArrayList ( ) ;
foreach ( object obj in eable )
{
if ( mobiles & & obj is Mobile & & ! BaseCommand . IsAccessible ( from , obj ) )
continue ;
if ( ext . IsValid ( obj ) )
objs . Add ( obj ) ;
}
eable . Free ( ) ;
ext . Filter ( objs ) ;
RunCommand ( from , objs , command , args ) ;
}
catch ( Exception ex )
{
from . SendMessage ( ex . Message ) ;
}
}
}
}