diff --git a/src/main/java/pw/yumc/YumCore/commands/CommandParse.java b/src/main/java/pw/yumc/YumCore/commands/CommandParse.java index 0f19f67..dba89bf 100644 --- a/src/main/java/pw/yumc/YumCore/commands/CommandParse.java +++ b/src/main/java/pw/yumc/YumCore/commands/CommandParse.java @@ -35,9 +35,7 @@ public class CommandParse { new PlayerParse(); new StringParse(); } - private List parse = new LinkedList<>(); - private boolean isMain; public CommandParse(Class[] classes, Annotation[][] annons, boolean isMain) { @@ -47,12 +45,10 @@ public class CommandParse { Class clazz = classes[i]; Annotation[] annotations = annons[i]; Parse parse = allparses.get(clazz); - if (parse == null) { - if (!clazz.isEnum()) { - throw new CommandParseException(String.format("存在无法解析的参数类型 %s", clazz.getName())); - } + if (clazz.isEnum()) { parse = new EnumParse(clazz); } + if (parse == null) { throw new CommandParseException(String.format("存在无法解析的参数类型 %s", clazz.getName())); } this.parse.add(parse.clone().parseAnnotation(annotations)); } } @@ -61,6 +57,24 @@ public class CommandParse { return new CommandParse(method.getParameterTypes(), method.getParameterAnnotations(), method.getReturnType().equals(boolean.class)); } + /** + * 转化数组为字符串 + * + * @param arr + * 数组 + * @param split + * 分割符 + * @return 字符串 + */ + public static String join(Object[] arr, String split) { + StringBuffer str = new StringBuffer(); + for (Object s : arr) { + str.append(s.toString()); + str.append(split); + } + return str.length() > split.length() ? str.toString().substring(0, str.length() - split.length()) : str.toString(); + } + public static void register(Class clazz, Parse parse) { allparses.put(clazz, parse); } @@ -73,6 +87,10 @@ public class CommandParse { try { Parse p = parse.get(i); String param = i < args.length ? args[i] : p.def; + // 参数大于解析器 并且为最后一个参数 + if (i + 1 == parse.size() && args.length >= parse.size()) { + param = join(Arrays.copyOfRange(args, i, args.length), " "); + } pobjs.add(param == null ? null : p.parse(cmdArgs.getSender(), param)); } catch (Exception e) { throw new CommandParseException(String.format("第 %s 个参数 ", isMain ? 1 : 2 + i) + e.getMessage()); @@ -229,9 +247,7 @@ public class CommandParse { @Override public Player parse(CommandSender sender, String arg) { Player p = Bukkit.getPlayerExact(arg); - if (attrs.containsKey("check") && p == null) { - throw new CommandParseException("玩家 " + arg + "不存在或不在线!"); - } + if (attrs.containsKey("check") && p == null) { throw new CommandParseException("玩家 " + arg + "不存在或不在线!"); } return p; } }