From 88ed2be5b40070d56e30f3393e8f86fda358b505 Mon Sep 17 00:00:00 2001 From: vaperion Date: Fri, 29 Mar 2024 21:22:49 +0100 Subject: [PATCH] Fix brigadier parameter mapping for annotated arguments (Text, Range) --- build.gradle | 2 +- .../brigadier/BladeBrigadierSupport.java | 55 ++++++++++++++----- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/build.gradle b/build.gradle index 59f5bb9..c9f90a9 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ allprojects { } group = 'me.vaperion.blade' - version = '3.0.12' + version = '3.0.13' // workaround for gradle issue: https://github.com/gradle/gradle/issues/17236#issuecomment-894385386 tasks.withType(Copy).configureEach { diff --git a/paper/src/main/java/me/vaperion/blade/paper/brigadier/BladeBrigadierSupport.java b/paper/src/main/java/me/vaperion/blade/paper/brigadier/BladeBrigadierSupport.java index 7c59e49..a69e7a8 100644 --- a/paper/src/main/java/me/vaperion/blade/paper/brigadier/BladeBrigadierSupport.java +++ b/paper/src/main/java/me/vaperion/blade/paper/brigadier/BladeBrigadierSupport.java @@ -10,6 +10,7 @@ import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.LiteralCommandNode; import me.vaperion.blade.Blade; +import me.vaperion.blade.annotation.argument.Range; import me.vaperion.blade.command.Parameter; import me.vaperion.blade.context.Context; import me.vaperion.blade.context.WrappedSender; @@ -128,7 +129,7 @@ private void registerParams(@NotNull SimpleBladeNode node, for (Parameter.CommandParameter parameter : node.getCommand().getCommandParameters()) { RequiredArgumentBuilder builder = RequiredArgumentBuilder - .argument(parameter.getName(), mapBrigadierType(parameter.getType())) + .argument(parameter.getName(), mapBrigadierArgument(parameter)) .suggests(suggestionProvider) .requires(createPermissionPredicate(node)) .executes(brigadierCommand); @@ -165,19 +166,47 @@ private Predicate createPermissionPredicate(@NotNu } @NotNull - private ArgumentType mapBrigadierType(@NotNull Class clazz) { - if (clazz == String.class) return objectifyArgument(StringArgumentType.string()); - if (clazz == int.class || clazz == Integer.class) return objectifyArgument(IntegerArgumentType.integer()); - if (clazz == float.class || clazz == Float.class) return objectifyArgument(FloatArgumentType.floatArg()); - if (clazz == double.class || clazz == Double.class) return objectifyArgument(DoubleArgumentType.doubleArg()); - if (clazz == boolean.class || clazz == Boolean.class) return objectifyArgument(BoolArgumentType.bool()); - if (clazz == long.class || clazz == Long.class) return objectifyArgument(LongArgumentType.longArg()); - return objectifyArgument(StringArgumentType.string()); // Everything else becomes a string - } + private ArgumentType mapBrigadierArgument(@NotNull Parameter parameter) { + Class clazz = parameter.getType(); + ArgumentType type = StringArgumentType.string(); - @SuppressWarnings("unchecked") - @NotNull - private ArgumentType objectifyArgument(@NotNull ArgumentType type) { + if (clazz == String.class) { + if (parameter.isText()) type = StringArgumentType.greedyString(); + else type = StringArgumentType.string(); + } + + if (clazz == int.class || clazz == Integer.class) { + if (parameter.hasRange()) { + Range range = parameter.getRange(); + type = IntegerArgumentType.integer((int) Math.floor(range.min()), (int) Math.ceil(range.max())); + } else type = IntegerArgumentType.integer(); + } + + if (clazz == float.class || clazz == Float.class) { + if (parameter.hasRange()) { + Range range = parameter.getRange(); + type = FloatArgumentType.floatArg((float) range.min(), (float) range.max()); + } else type = FloatArgumentType.floatArg(); + } + + if (clazz == double.class || clazz == Double.class) { + if (parameter.hasRange()) { + Range range = parameter.getRange(); + type = DoubleArgumentType.doubleArg(range.min(), range.max()); + } else type = DoubleArgumentType.doubleArg(); + } + + if (clazz == long.class || clazz == Long.class) { + if (parameter.hasRange()) { + Range range = parameter.getRange(); + type = LongArgumentType.longArg((long) Math.floor(range.min()), (long) Math.ceil(range.max())); + } else type = LongArgumentType.longArg(); + } + + if (clazz == boolean.class || clazz == Boolean.class) + type = BoolArgumentType.bool(); + + //noinspection unchecked return (ArgumentType) type; } }