public static string IncreaseValue( Mobile from, object o, string[] args )
{
Type type = o.GetType();
object[] realObjs = new object[args.Length/2];
PropertyInfo[] realProps = new PropertyInfo[args.Length/2];
int[] realValues = new int[args.Length/2];
bool positive = false, negative = false;
for ( int i = 0; i < realProps.Length; ++i )
{
string name = args[i*2];
try
{
string valueString = args[1 + (i*2)];
if ( valueString.StartsWith( "0x" ) )
{
realValues[i] = Convert.ToInt32( valueString.Substring( 2 ), 16 );
}
else
{
realValues[i] = Convert.ToInt32( valueString );
}
}
catch
{
return "Offset value could not be parsed.";
}
if ( realValues[i] > 0 )
positive = true;
else if ( realValues[i] < 0 )
negative = true;
else
return "Zero is not a valid value to offset.";
string failReason = null;
realObjs[i] = o;
realProps[i] = GetPropertyInfo( from, ref realObjs[i], name, PropertyAccess.ReadWrite, ref failReason );
if ( failReason != null )
return failReason;
if ( realProps[i] == null )
return "Property not found.";
}
for ( int i = 0; i < realProps.Length; ++i )
{
object obj = realProps[i].GetValue( realObjs[i], null );
if( !( obj is IConvertible ) )
return "Property is not IConvertable.";
try
{
long v = (long)Convert.ChangeType( obj, TypeCode.Int64 );
v += realValues[i];
realProps[i].SetValue( realObjs[i], Convert.ChangeType( v, realProps[i].PropertyType ), null );
}
catch
{
return "Value could not be converted";
}
}
if ( realProps.Length == 1 )
{
if ( positive )
return "The property has been increased.";
return "The property has been decreased.";
}
if ( positive && negative )
return "The properties have been changed.";
if ( positive )
return "The properties have been increased.";
return "The properties have been decreased.";
}