private object ExecuteCommand(MethodInfo method, Player player, string[] args) { Log.Info($"Execute command {method}"); var parameters = method.GetParameters(); int addLenght = 0; if (parameters.Length > 0 && parameters[0].ParameterType == typeof(Player)) { addLenght = 1; } object[] objectArgs = new object[parameters.Length]; for (int k = 0; k < parameters.Length; k++) { var parameter = parameters[k]; int i = k - addLenght; if (k == 0 && addLenght == 1) { if (parameter.ParameterType == typeof(Player)) { objectArgs[k] = player; continue; } Log.WarnFormat("Command method {0} missing Player as first argument.", method.Name); return(null); } if (parameter.IsOptional && args.Length <= i) { Log.Warn($"Break on optional where args.Len={args.Length} and i={i}"); break; } if (parameter.ParameterType.BaseType == typeof(EnumBase)) { var ctor = parameter.ParameterType.GetConstructor(Type.EmptyTypes); EnumBase instance = (EnumBase)ctor.Invoke(null); instance.Value = args[i]; objectArgs[k] = instance; continue; } if (parameter.ParameterType == typeof(Target)) { var target = JsonConvert.DeserializeObject <Target>(args[i]); target = FillTargets(player, player.Level, target); objectArgs[k] = target; continue; } if (parameter.ParameterType == typeof(BlockPos)) { var blockpos = JsonConvert.DeserializeObject <BlockPos>(args[i]); objectArgs[k] = blockpos; continue; } if (parameter.ParameterType == typeof(string)) { objectArgs[k] = args[i]; continue; } if (parameter.ParameterType == typeof(byte)) { byte value; if (!byte.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (parameter.ParameterType == typeof(short)) { short value; if (!short.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (parameter.ParameterType == typeof(int)) { int value; if (!int.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (parameter.ParameterType == typeof(bool)) { bool value; if (!bool.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (parameter.ParameterType == typeof(float)) { float value; if (!float.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (parameter.ParameterType == typeof(double)) { double value; if (!double.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (IsParams(parameter) && parameter.ParameterType == typeof(string[])) { List <string> strings = new List <string>(); for (int j = i; j < args.Length; j++) { strings.Add(args[j]); } objectArgs[k] = strings.ToArray(); continue; } return(null); } object result = null; object pluginInstance = _plugins.FirstOrDefault(plugin => plugin.GetType() == method.DeclaringType); if (pluginInstance == null) { return(null); } if (method.IsStatic) { result = method.Invoke(null, objectArgs); } else { if (method.DeclaringType == null) { return(false); } result = method.Invoke(pluginInstance, objectArgs); } return(result); }
private object ExecuteCommand(MethodInfo method, Player player, string[] args) { Log.Info($"Execute command {method}"); var parameters = method.GetParameters(); int addLenght = 0; if (parameters.Length > 0 && typeof(Player).IsAssignableFrom(parameters[0].ParameterType)) { addLenght = 1; } object[] objectArgs = new object[parameters.Length]; for (int k = 0; k < parameters.Length; k++) { var parameter = parameters[k]; int i = k - addLenght; if (k == 0 && addLenght == 1) { if (typeof(Player).IsAssignableFrom(parameter.ParameterType)) { objectArgs[k] = player; continue; } Log.WarnFormat("Command method {0} missing Player as first argument.", method.Name); return(null); } if (parameter.IsOptional && args.Length <= i) { objectArgs[k] = parameter.DefaultValue; continue; } if (typeof(IParameterSerializer).IsAssignableFrom(parameter.ParameterType)) { var ctor = parameter.ParameterType.GetConstructor(Type.EmptyTypes); IParameterSerializer defaultValue = ctor.Invoke(null) as IParameterSerializer; defaultValue?.Deserialize(player, args[i]); objectArgs[k] = defaultValue; continue; } if (parameter.ParameterType.BaseType == typeof(EnumBase)) { var ctor = parameter.ParameterType.GetConstructor(Type.EmptyTypes); EnumBase instance = (EnumBase)ctor.Invoke(null); instance.Value = args[i]; objectArgs[k] = instance; continue; } if (parameter.ParameterType == typeof(Target)) { var target = JsonConvert.DeserializeObject <Target>(args[i]); target = FillTargets(player, player.Level, target); objectArgs[k] = target; continue; } if (parameter.ParameterType == typeof(BlockPos)) { var blockpos = JsonConvert.DeserializeObject <BlockPos>(args[i]); objectArgs[k] = blockpos; continue; } if (parameter.ParameterType == typeof(string)) { objectArgs[k] = args[i]; continue; } if (parameter.ParameterType == typeof(byte)) { byte value; if (!byte.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (parameter.ParameterType == typeof(short)) { short value; if (!short.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (parameter.ParameterType == typeof(int)) { int value; if (!int.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (parameter.ParameterType == typeof(bool)) { bool value; if (!bool.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (parameter.ParameterType == typeof(float)) { float value; if (!float.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (parameter.ParameterType == typeof(double)) { double value; if (!double.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (parameter.ParameterType.IsEnum) { Enum value = Enum.Parse(parameter.ParameterType, args[i], true) as Enum; if (value == null) { Log.Error($"Could not convert to valid enum value: {args[i]}"); continue; } objectArgs[k] = value; continue; } if (IsParams(parameter) && parameter.ParameterType == typeof(string[])) { List <string> strings = new List <string>(); for (int j = i; j < args.Length; j++) { strings.Add(args[j]); } objectArgs[k] = strings.ToArray(); continue; } return(null); } object result = null; try { object pluginInstance = _plugins.FirstOrDefault(plugin => plugin.GetType() == method.DeclaringType); if (pluginInstance == null) { return(null); } ICommandFilter filter = pluginInstance as ICommandFilter; if (filter != null) { filter.OnCommandExecuting(player); } if (method.IsStatic) { result = method.Invoke(null, objectArgs); } else { if (method.DeclaringType == null) { return(false); } Plugin.CurrentPlayer = player; // Setting thread local for call result = method.Invoke(pluginInstance, objectArgs); Plugin.CurrentPlayer = null; // Done with thread local, we using pool to make sure it's reset. } if (filter != null) { filter.OnCommandExecuted(); } } catch (Exception e) { Log.Error($"Error while executing command {method}", e); } return(result); }
private object ExecuteCommand(object objInstance, MethodInfo method, Player player, string[] args) { var parameters = method.GetParameters(); int addLenght = 0; if (parameters.Length > 0 && typeof(Player).IsAssignableFrom(parameters[0].ParameterType)) { addLenght = 1; } object[] objectArgs = new object[parameters.Length]; for (int k = 0; k < parameters.Length; k++) { var parameter = parameters[k]; int i = k - addLenght; if (k == 0 && addLenght == 1) { if (typeof(Player).IsAssignableFrom(parameter.ParameterType)) { objectArgs[k] = player; continue; } return(null); } if (parameter.IsOptional && args.Length <= i) { objectArgs[k] = parameter.DefaultValue; continue; } if (typeof(IParameterSerializer).IsAssignableFrom(parameter.ParameterType)) { var ctor = parameter.ParameterType.GetConstructor(Type.EmptyTypes); IParameterSerializer defaultValue = ctor.Invoke(null) as IParameterSerializer; defaultValue?.Deserialize(player, args[i]); objectArgs[k] = defaultValue; continue; } if (parameter.ParameterType.BaseType == typeof(EnumBase)) { var ctor = parameter.ParameterType.GetConstructor(Type.EmptyTypes); EnumBase instance = (EnumBase)ctor.Invoke(null); instance.Value = args[i]; objectArgs[k] = instance; continue; } if (parameter.ParameterType == typeof(Target)) { Target target; try { target = JsonConvert.DeserializeObject <Target>(args[i]); } catch { target = new Target { Selector = args[i] }; } target = FillTargets(player, player.Level, target); objectArgs[k] = target; continue; } if (parameter.ParameterType == typeof(BlockPos)) { var blockpos = JsonConvert.DeserializeObject <BlockPos>(args[i]); objectArgs[k] = blockpos; continue; } if (parameter.ParameterType == typeof(string)) { objectArgs[k] = args[i]; continue; } if (parameter.ParameterType == typeof(byte)) { byte value; if (!byte.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (parameter.ParameterType == typeof(short)) { short value; if (!short.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (parameter.ParameterType == typeof(int)) { int value; if (!int.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (parameter.ParameterType == typeof(bool)) { bool value; if (!bool.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (parameter.ParameterType == typeof(float)) { float value; if (!float.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (parameter.ParameterType == typeof(double)) { double value; if (!double.TryParse(args[i], out value)) { return(null); } objectArgs[k] = value; continue; } if (parameter.ParameterType.IsEnum) { if (parameter.ParameterType == typeof(GameMode)) { GameMode result; if (!Enum.TryParse(args[i], true, out result)) { switch (args[i]) { case "s": result = GameMode.Survival; break; case "c": result = GameMode.Creative; break; case "a": result = GameMode.Adventure; break; } } objectArgs[k] = result; continue; } Enum value = Enum.Parse(parameter.ParameterType, args[i], true) as Enum; if (value == null) { continue; } objectArgs[k] = value; continue; } if (IsParams(parameter) && parameter.ParameterType == typeof(string[])) { List <string> strings = new List <string>(); for (int j = i; j < args.Length; j++) { strings.Add(args[j]); } objectArgs[k] = strings.ToArray(); continue; } Log.Warn("Unsupported parameter type: " + parameter.ParameterType); return(null); } /*if (parameters.Length != objectArgs.Length) * { * Log.Warn("Param count does not match!"); * } * * for (int i = 0; i < Math.Min(parameters.Length, objectArgs.Length); i++) * { * var param = parameters[i]; * var objectArg = objectArgs[i]; * * Log.Warn($"{i} = Suspected {param.ParameterType} got {objectArg.GetType()}"); * }*/ return(method.Invoke(objInstance, objectArgs)); //return null; }