From d30f93c454e3360a3ac9402d35193760dd895e28 Mon Sep 17 00:00:00 2001 From: Kamron Batman Date: Fri, 15 Mar 2019 16:40:23 -0700 Subject: [PATCH] Fixes a few bugs with optional params. (#37) --- Scripts/Commands/Add.cs | 31 ++++++++++++------------------- Scripts/Commands/Handlers.cs | 2 +- Server/Mobile.cs | 2 +- 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/Scripts/Commands/Add.cs b/Scripts/Commands/Add.cs index f46d47e4b..55bc82d0f 100644 --- a/Scripts/Commands/Add.cs +++ b/Scripts/Commands/Add.cs @@ -194,15 +194,13 @@ namespace Server.Commands int totalParams = 0; // Handle optional constructors - ParameterInfo[] paramList = ctor.GetParameters().Select(param => - { - if (param.DefaultValue is DBNull) + ParameterInfo[] paramList = ctor.GetParameters(); + for (int j = 0; j < paramList.Length; j++) + if (!paramList[j].HasDefaultValue) totalParams += 1; - return param; - }).ToArray(); - if (args.Length == totalParams) + if (args.Length >= totalParams && args.Length <= paramList.Length) { object[] paramValues = ParseValues(paramList, args); @@ -223,25 +221,23 @@ namespace Server.Commands { object[] values = new object[paramList.Length]; - for (int i = 0, a = 0; i < paramList.Length; ++i) + for (int i = 0, a = 0; i < paramList.Length; i++) { ParameterInfo param = paramList[i]; - if (param.DefaultValue is DBNull) - { - object value = ParseValue(param.ParameterType, args[a++], param.DefaultValue); - if (value == null) - return null; + object value = ParseValue(param.ParameterType, a < args.Length ? args[a++] : null); + if (value != null) values[i] = value; - } - else + else if (param.HasDefaultValue) values[i] = Type.Missing; + else + return null; } return values; } - public static object ParseValue(Type type, string value, object defaultValue) + public static object ParseValue(Type type, string value) { try { @@ -630,10 +626,7 @@ namespace Server.Commands { object[] attrs = ctor.GetCustomAttributes(m_ConstructibleType, false); - if (attrs.Length == 0) - return false; - - return accessLevel >= ((ConstructibleAttribute)attrs[0]).AccessLevel; + return attrs.Length != 0 && accessLevel >= ((ConstructibleAttribute)attrs[0]).AccessLevel; } public static bool IsEnum(Type type) diff --git a/Scripts/Commands/Handlers.cs b/Scripts/Commands/Handlers.cs index 72305b902..f7825df2a 100644 --- a/Scripts/Commands/Handlers.cs +++ b/Scripts/Commands/Handlers.cs @@ -79,7 +79,7 @@ namespace Server.Commands } [Usage("SpeedBoost [true|false]")] - [Description("Enables a speed boost for the invoker. Disable with paramaters.")] + [Description("Enables a speed boost for the invoker. Disable with parameters.")] private static void SpeedBoost_OnCommand(CommandEventArgs e) { Mobile from = e.Mobile; diff --git a/Server/Mobile.cs b/Server/Mobile.cs index e7c03be10..87aae8bc3 100644 --- a/Server/Mobile.cs +++ b/Server/Mobile.cs @@ -4845,7 +4845,7 @@ namespace Server catch { Console.WriteLine( - "Warning: 0x{0:X}: Item must have a zero paramater constructor to be separated from a stack. '{1}'.", + "Warning: 0x{0:X}: Item must have a zero parameter constructor to be separated from a stack. '{1}'.", oldItem.Serial.Value, oldItem.GetType().Name); return null; }