diff --git a/cloud-bukkit/src/main/java/org/incendo/cloud/bukkit/parser/selector/SelectorUtils.java b/cloud-bukkit/src/main/java/org/incendo/cloud/bukkit/parser/selector/SelectorUtils.java index f3254252..8fe8d919 100644 --- a/cloud-bukkit/src/main/java/org/incendo/cloud/bukkit/parser/selector/SelectorUtils.java +++ b/cloud-bukkit/src/main/java/org/incendo/cloud/bukkit/parser/selector/SelectorUtils.java @@ -107,21 +107,46 @@ public Object apply( final ArgumentType type, final StringReader reader ) throws CommandSyntaxException { - final @Nullable Method specialParse = CraftBukkitReflection.findMethod( + final @Nullable Method modernParse = CraftBukkitReflection.findMethod( type.getClass(), "parse", StringReader.class, + boolean.class, boolean.class ); - if (specialParse == null) { - return type.parse(reader); + if (modernParse != null) { + return invokeParse( + modernParse, + type, + reader, + true, // CraftBukkit allowSelectors param + true // CraftBukkit overridePermissions param + ); } - try { - return specialParse.invoke( - type, - reader, - true // CraftBukkit overridePermissions param + final @Nullable Method legacyParse = CraftBukkitReflection.findMethod( + type.getClass(), + "parse", + StringReader.class, + boolean.class + ); + if (legacyParse != null) { + return invokeParse( + legacyParse, + type, + reader, + true // CraftBukkit overridePermissions param ); + } + return type.parse(reader); + } + + private static Object invokeParse( + final Method method, + final ArgumentType type, + final Object... arguments + ) throws CommandSyntaxException { + try { + return method.invoke(type, arguments); } catch (final InvocationTargetException ex) { final Throwable cause = ex.getCause(); if (cause instanceof CommandSyntaxException) {